Contract 0xeb7a2cb5b5f709423a2e5c81d57a792a04736936

Contract Overview

Balance:
0 BNB
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x782f1d005c0777141568da4054b3e6eb1beef8097c869fee3d68d70ec37d1248Include In Divid...129850912021-10-06 9:52:1955 days 12 hrs ago0x7282c267eaaa7cfe33cc5898c7e090d1e1c6913a IN  0xeb7a2cb5b5f709423a2e5c81d57a792a047369360 BNB0.00019213
0x7d984b6c26c52712bfa40149ee925c9e1a6734928f06b8f290a9d47f773db160Transfer129847782021-10-06 9:36:4055 days 12 hrs ago0x7282c267eaaa7cfe33cc5898c7e090d1e1c6913a IN  0xeb7a2cb5b5f709423a2e5c81d57a792a047369360 BNB0.00224201
0x6b5ea3026a7e74a8d0a0fcd2d4adde5143a06902418f9ac4bd35b38956d42b12Update Dividend ...129846082021-10-06 9:28:1055 days 12 hrs ago0x7282c267eaaa7cfe33cc5898c7e090d1e1c6913a IN  0xeb7a2cb5b5f709423a2e5c81d57a792a047369360 BNB0.00025265
0x6934dced54833618f01be9fb2435b2b7e0383fbce651c20e9fd6b0fdcd91a52aUpdate Dividend ...129845272021-10-06 9:24:0755 days 12 hrs ago0x7282c267eaaa7cfe33cc5898c7e090d1e1c6913a IN  0xeb7a2cb5b5f709423a2e5c81d57a792a047369360 BNB0.00025265
0xdc56c86b598a4cb1fc659f00ce57be2b6b22f020c9c0d9307d7818943185580eUpdate Claim Wai...129843892021-10-06 9:17:1355 days 12 hrs ago0x7282c267eaaa7cfe33cc5898c7e090d1e1c6913a IN  0xeb7a2cb5b5f709423a2e5c81d57a792a047369360 BNB0.00026996
0xefaa108871680951cae76df9bcee3b1b001b7e71e5454363ed19b9606c060ed0Update Fees129843772021-10-06 9:16:3755 days 12 hrs ago0x7282c267eaaa7cfe33cc5898c7e090d1e1c6913a IN  0xeb7a2cb5b5f709423a2e5c81d57a792a047369360 BNB0.00039692
0xdc0d6ae2dc3af4b832723497f062572a8781b9a27a4e31ff2036275532450985Claim129842222021-10-06 9:08:5255 days 12 hrs ago0x7282c267eaaa7cfe33cc5898c7e090d1e1c6913a IN  0xeb7a2cb5b5f709423a2e5c81d57a792a047369360 BNB0.00029721
0xc6caf38c259c856433380d597c2ae2d8f41e5e0beb7773731132a1ed4522d645Process Dividend...129841212021-10-06 9:03:4955 days 12 hrs ago0x7282c267eaaa7cfe33cc5898c7e090d1e1c6913a IN  0xeb7a2cb5b5f709423a2e5c81d57a792a047369360 BNB0.00040401
0x9e1d5de7c194ee33c8d102436459baa83fdf2c8cdb4a83597efb64e685cd49c4Enable Trading129838412021-10-06 8:49:4955 days 13 hrs ago0x7282c267eaaa7cfe33cc5898c7e090d1e1c6913a IN  0xeb7a2cb5b5f709423a2e5c81d57a792a047369360 BNB0.00042963
0x502216d988def3f7c2344e5475295f8d71c7e710b41bb11b3e4f0da82e0768cdApprove129837752021-10-06 8:46:3155 days 13 hrs ago0x7282c267eaaa7cfe33cc5898c7e090d1e1c6913a IN  0xeb7a2cb5b5f709423a2e5c81d57a792a047369360 BNB0.00025328
0xf1d0723362ea13a298047faff5a98f68e591b3fb0196ce99bf347b6f7b92c27cApprove129837662021-10-06 8:46:0455 days 13 hrs ago0x7282c267eaaa7cfe33cc5898c7e090d1e1c6913a IN  0xeb7a2cb5b5f709423a2e5c81d57a792a047369360 BNB0.00044528
0x14f191c30d9f8739fa2ac38fef318dee4e9ff6a068f8bd40fe299361391f4fe20x60c06040129836222021-10-06 8:38:5255 days 13 hrs ago0x7282c267eaaa7cfe33cc5898c7e090d1e1c6913a IN  Contract Creation0 BNB0.0734743
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xcf56747b3860ed41b419ea62e441ecc59d10bd1e55591bdcdff90fc0ac1e98ee129851042021-10-06 9:52:5855 days 12 hrs ago 0xf0e4e20a146dbf4158b76b638c05c3e2f1dbcd95 0xeb7a2cb5b5f709423a2e5c81d57a792a047369360 BNB
0xcf56747b3860ed41b419ea62e441ecc59d10bd1e55591bdcdff90fc0ac1e98ee129851042021-10-06 9:52:5855 days 12 hrs ago 0xeb7a2cb5b5f709423a2e5c81d57a792a04736936 0x051e84fb1df17a0668ad9d788790fb7d9cb3c2740 BNB
0xcf56747b3860ed41b419ea62e441ecc59d10bd1e55591bdcdff90fc0ac1e98ee129851042021-10-06 9:52:5855 days 12 hrs ago 0xeb7a2cb5b5f709423a2e5c81d57a792a04736936 0x051e84fb1df17a0668ad9d788790fb7d9cb3c2740 BNB
0xcf56747b3860ed41b419ea62e441ecc59d10bd1e55591bdcdff90fc0ac1e98ee129851042021-10-06 9:52:5855 days 12 hrs ago 0xeb7a2cb5b5f709423a2e5c81d57a792a04736936 0x051e84fb1df17a0668ad9d788790fb7d9cb3c2740 BNB
0xcf56747b3860ed41b419ea62e441ecc59d10bd1e55591bdcdff90fc0ac1e98ee129851042021-10-06 9:52:5855 days 12 hrs ago 0x9ac64cc6e4415144c455bd8e4837fea55603e5c3 0xeb7a2cb5b5f709423a2e5c81d57a792a047369360 BNB
0x782f1d005c0777141568da4054b3e6eb1beef8097c869fee3d68d70ec37d1248129850912021-10-06 9:52:1955 days 12 hrs ago 0xeb7a2cb5b5f709423a2e5c81d57a792a04736936 0x051e84fb1df17a0668ad9d788790fb7d9cb3c2740 BNB
0xeae95d90fe057a95f6f269a3be1368aa07bd021e9df8fb3d75f9ae3d98bdca61129848032021-10-06 9:37:5555 days 12 hrs ago 0xf0e4e20a146dbf4158b76b638c05c3e2f1dbcd95 0xeb7a2cb5b5f709423a2e5c81d57a792a047369360 BNB
0xeae95d90fe057a95f6f269a3be1368aa07bd021e9df8fb3d75f9ae3d98bdca61129848032021-10-06 9:37:5555 days 12 hrs ago 0xeb7a2cb5b5f709423a2e5c81d57a792a04736936 0x051e84fb1df17a0668ad9d788790fb7d9cb3c2740 BNB
0xeae95d90fe057a95f6f269a3be1368aa07bd021e9df8fb3d75f9ae3d98bdca61129848032021-10-06 9:37:5555 days 12 hrs ago 0xeb7a2cb5b5f709423a2e5c81d57a792a04736936 0x051e84fb1df17a0668ad9d788790fb7d9cb3c2740 BNB
0xeae95d90fe057a95f6f269a3be1368aa07bd021e9df8fb3d75f9ae3d98bdca61129848032021-10-06 9:37:5555 days 12 hrs ago 0xeb7a2cb5b5f709423a2e5c81d57a792a04736936 0x051e84fb1df17a0668ad9d788790fb7d9cb3c2740 BNB
0xeae95d90fe057a95f6f269a3be1368aa07bd021e9df8fb3d75f9ae3d98bdca61129848032021-10-06 9:37:5555 days 12 hrs ago 0x9ac64cc6e4415144c455bd8e4837fea55603e5c3 0xeb7a2cb5b5f709423a2e5c81d57a792a047369360 BNB
0x7d984b6c26c52712bfa40149ee925c9e1a6734928f06b8f290a9d47f773db160129847782021-10-06 9:36:4055 days 12 hrs ago 0xeb7a2cb5b5f709423a2e5c81d57a792a04736936 0x051e84fb1df17a0668ad9d788790fb7d9cb3c2740 BNB
0x7d984b6c26c52712bfa40149ee925c9e1a6734928f06b8f290a9d47f773db160129847782021-10-06 9:36:4055 days 12 hrs ago 0xeb7a2cb5b5f709423a2e5c81d57a792a04736936 0x051e84fb1df17a0668ad9d788790fb7d9cb3c2740 BNB
0x7d984b6c26c52712bfa40149ee925c9e1a6734928f06b8f290a9d47f773db160129847782021-10-06 9:36:4055 days 12 hrs ago 0xeb7a2cb5b5f709423a2e5c81d57a792a04736936 0x051e84fb1df17a0668ad9d788790fb7d9cb3c2740 BNB
0x6b5ea3026a7e74a8d0a0fcd2d4adde5143a06902418f9ac4bd35b38956d42b12129846082021-10-06 9:28:1055 days 12 hrs ago 0xeb7a2cb5b5f709423a2e5c81d57a792a04736936 0xc6d377faab883e39428aa2cdd38d8dc66e019ea00 BNB
0x6934dced54833618f01be9fb2435b2b7e0383fbce651c20e9fd6b0fdcd91a52a129845272021-10-06 9:24:0755 days 12 hrs ago 0xeb7a2cb5b5f709423a2e5c81d57a792a04736936 0xc6d377faab883e39428aa2cdd38d8dc66e019ea00 BNB
0xdc56c86b598a4cb1fc659f00ce57be2b6b22f020c9c0d9307d7818943185580e129843892021-10-06 9:17:1355 days 12 hrs ago 0xeb7a2cb5b5f709423a2e5c81d57a792a04736936 0x051e84fb1df17a0668ad9d788790fb7d9cb3c2740 BNB
0x02395d5a04da621ab594ee05c799c86fc118f59db9a1584d8448b4f7824fae17129843242021-10-06 9:13:5855 days 12 hrs ago 0xf0e4e20a146dbf4158b76b638c05c3e2f1dbcd95 0xeb7a2cb5b5f709423a2e5c81d57a792a047369360 BNB
0x02395d5a04da621ab594ee05c799c86fc118f59db9a1584d8448b4f7824fae17129843242021-10-06 9:13:5855 days 12 hrs ago 0xeb7a2cb5b5f709423a2e5c81d57a792a04736936 0x051e84fb1df17a0668ad9d788790fb7d9cb3c2740 BNB
0x02395d5a04da621ab594ee05c799c86fc118f59db9a1584d8448b4f7824fae17129843242021-10-06 9:13:5855 days 12 hrs ago 0xeb7a2cb5b5f709423a2e5c81d57a792a04736936 0x051e84fb1df17a0668ad9d788790fb7d9cb3c2740 BNB
0x02395d5a04da621ab594ee05c799c86fc118f59db9a1584d8448b4f7824fae17129843242021-10-06 9:13:5855 days 12 hrs ago 0xeb7a2cb5b5f709423a2e5c81d57a792a04736936 0x051e84fb1df17a0668ad9d788790fb7d9cb3c2740 BNB
0x02395d5a04da621ab594ee05c799c86fc118f59db9a1584d8448b4f7824fae17129843242021-10-06 9:13:5855 days 12 hrs ago 0x9ac64cc6e4415144c455bd8e4837fea55603e5c3 0xeb7a2cb5b5f709423a2e5c81d57a792a047369360 BNB
0x631a79ed67ded647fc5af622cb6e3d8eaf242810f8ce19b9d30ca918adddf96f129843202021-10-06 9:13:4655 days 12 hrs ago 0xf0e4e20a146dbf4158b76b638c05c3e2f1dbcd95 0xeb7a2cb5b5f709423a2e5c81d57a792a047369360 BNB
0x631a79ed67ded647fc5af622cb6e3d8eaf242810f8ce19b9d30ca918adddf96f129843202021-10-06 9:13:4655 days 12 hrs ago 0xeb7a2cb5b5f709423a2e5c81d57a792a04736936 0x051e84fb1df17a0668ad9d788790fb7d9cb3c2740 BNB
0x631a79ed67ded647fc5af622cb6e3d8eaf242810f8ce19b9d30ca918adddf96f129843202021-10-06 9:13:4655 days 12 hrs ago 0xeb7a2cb5b5f709423a2e5c81d57a792a04736936 0x051e84fb1df17a0668ad9d788790fb7d9cb3c2740 BNB
[ Download CSV Export 
Loading
This contract contains unverified libraries: IterableMapping

Contract Source Code Verified (Exact Match)

Contract Name:
BSIMPTEST

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-10-06
*/

/**
 *Submitted for verification at BscScan.com on 2021-10-01
*/

/*
  
  BSIMPTEST - BSIMPTEST

  12% Tax
  4% Rewards in SIMP
  4% Liquidity
  4% Marketing
*/
                                                                               
// SPDX-License-Identifier: MIT                                                                               
                                                    
pragma solidity ^0.8.6;

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

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

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

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

    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(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

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

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

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

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



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

    function set(Map storage map, address key, uint 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];

        uint index = map.indexOf[key];
        uint 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();
    }
}

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

    /**
     * @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 {}
}

interface DividendPayingTokenOptionalInterface {
  /// @notice View the amount of dividend in wei that an address can withdraw.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` can withdraw.
  function withdrawableDividendOf(address _owner) external view returns(uint256);

  /// @notice View the amount of dividend in wei that an address has withdrawn.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` has withdrawn.
  function withdrawnDividendOf(address _owner) external view returns(uint256);

  /// @notice View the amount of dividend in wei that an address has earned in total.
  /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner)
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` has earned in total.
  function accumulativeDividendOf(address _owner) external view returns(uint256);
}

interface DividendPayingTokenInterface {
  /// @notice View the amount of dividend in wei that an address can withdraw.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` can withdraw.
  function dividendOf(address _owner) external view returns(uint256);

  /// @notice Distributes ether to token holders as dividends.
  /// @dev SHOULD distribute the paid ether to token holders as dividends.
  ///  SHOULD NOT directly transfer ether to token holders in this function.
  ///  MUST emit a `DividendsDistributed` event when the amount of distributed ether is greater than 0.
  function distributeDividends() external payable;

  /// @notice Withdraws the ether distributed to the sender.
  /// @dev SHOULD transfer `dividendOf(msg.sender)` wei to `msg.sender`, and `dividendOf(msg.sender)` SHOULD be 0 after the transfer.
  ///  MUST emit a `DividendWithdrawn` event if the amount of ether transferred is greater than 0.
  function withdrawDividend() external;

  /// @dev This event MUST emit when ether is distributed to token holders.
  /// @param from The address which sends ether to this contract.
  /// @param weiAmount The amount of distributed ether in wei.
  event DividendsDistributed(
    address indexed from,
    uint256 weiAmount
  );

  /// @dev This event MUST emit when an address withdraws their dividend.
  /// @param to The address which withdraws ether from this contract.
  /// @param weiAmount The amount of withdrawn ether in wei.
  event DividendWithdrawn(
    address indexed to,
    uint256 weiAmount
  );
}

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

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 SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    /**
     * @dev Multiplies two int256 variables and fails on overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    /**
     * @dev Division of two int256 variables and fails on overflow.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    /**
     * @dev Subtracts two int256 variables and fails on overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    /**
     * @dev Adds two int256 variables and fails on overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    /**
     * @dev Converts to absolute value, and fails on overflow.
     */
    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }


    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}

library SafeMathUint {
  function toInt256Safe(uint256 a) internal pure returns (int256) {
    int256 b = int256(a);
    require(b >= 0);
    return b;
  }
}


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

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

contract DividendPayingToken is DividendPayingTokenInterface, DividendPayingTokenOptionalInterface, Ownable {
  using SafeMath for uint256;
  using SafeMathUint for uint256;
  using SafeMathInt for int256;

  // With `magnitude`, we can properly distribute dividends even if the amount of received ether is small.
  // For more discussion about choosing the value of `magnitude`,
  //  see https://github.com/ethereum/EIPs/issues/1726#issuecomment-472352728
  uint256 constant internal magnitude = 2**128;

  uint256 internal magnifiedDividendPerShare;
 
  address public immutable token = address(0x78867BbEeF44f2326bF8DDd1941a4439382EF2A7); // BUSD - testnet
  
  // About dividendCorrection:
  // If the token balance of a `_user` is never changed, the dividend of `_user` can be computed with:
  //   `dividendOf(_user) = dividendPerShare * balanceOf(_user)`.
  // When `balanceOf(_user)` is changed (via minting/burning/transferring tokens),
  //   `dividendOf(_user)` should not be changed,
  //   but the computed value of `dividendPerShare * balanceOf(_user)` is changed.
  // To keep the `dividendOf(_user)` unchanged, we add a correction term:
  //   `dividendOf(_user) = dividendPerShare * balanceOf(_user) + dividendCorrectionOf(_user)`,
  //   where `dividendCorrectionOf(_user)` is updated whenever `balanceOf(_user)` is changed:
  //   `dividendCorrectionOf(_user) = dividendPerShare * (old balanceOf(_user)) - (new balanceOf(_user))`.
  // So now `dividendOf(_user)` returns the same value before and after `balanceOf(_user)` is changed.
  mapping(address => int256) internal magnifiedDividendCorrections;
  mapping(address => uint256) internal withdrawnDividends;
  
  mapping (address => uint256) public holderBalance;
  uint256 public totalBalance;

  uint256 public totalDividendsDistributed;

  /// @dev Distributes dividends whenever ether is paid to this contract.
  receive() external payable {
    distributeDividends();
  }

  /// @notice Distributes ether to token holders as dividends.
  /// @dev It reverts if the total supply of tokens is 0.
  /// It emits the `DividendsDistributed` event if the amount of received ether is greater than 0.
  /// About undistributed ether:
  ///   In each distribution, there is a small amount of ether not distributed,
  ///     the magnified amount of which is
  ///     `(msg.value * magnitude) % totalSupply()`.
  ///   With a well-chosen `magnitude`, the amount of undistributed ether
  ///     (de-magnified) in a distribution can be less than 1 wei.
  ///   We can actually keep track of the undistributed ether in a distribution
  ///     and try to distribute it in the next distribution,
  ///     but keeping track of such data on-chain costs much more than
  ///     the saved ether, so we don't do that.
    
  function distributeDividends() public override payable {
    require(false, "Cannot send BNB directly to tracker as it is unrecoverable"); // 
  }
  
  function distributeTokenDividends(uint256 amount) public onlyOwner {
    require(totalBalance > 0);

    if (amount > 0) {
      magnifiedDividendPerShare = magnifiedDividendPerShare.add(
        (amount).mul(magnitude) / totalBalance
      );
      emit DividendsDistributed(msg.sender, amount);

      totalDividendsDistributed = totalDividendsDistributed.add(amount);
    }
  }

  /// @notice Withdraws the ether distributed to the sender.
  /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
  function withdrawDividend() public virtual override {
    _withdrawDividendOfUser(payable(msg.sender));
  }

  /// @notice Withdraws the ether distributed to the sender.
  /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
  function _withdrawDividendOfUser(address payable user) internal returns (uint256) {
    uint256 _withdrawableDividend = withdrawableDividendOf(user);
    if (_withdrawableDividend > 0) {
      withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend);
      emit DividendWithdrawn(user, _withdrawableDividend);
      bool success = IERC20(token).transfer(user, _withdrawableDividend);

      if(!success) {
        withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend);
        return 0;
      }

      return _withdrawableDividend;
    }

    return 0;
  }


  /// @notice View the amount of dividend in wei that an address can withdraw.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` can withdraw.
  function dividendOf(address _owner) public view override returns(uint256) {
    return withdrawableDividendOf(_owner);
  }

  /// @notice View the amount of dividend in wei that an address can withdraw.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` can withdraw.
  function withdrawableDividendOf(address _owner) public view override returns(uint256) {
    return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]);
  }

  /// @notice View the amount of dividend in wei that an address has withdrawn.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` has withdrawn.
  function withdrawnDividendOf(address _owner) public view override returns(uint256) {
    return withdrawnDividends[_owner];
  }


  /// @notice View the amount of dividend in wei that an address has earned in total.
  /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner)
  /// = (magnifiedDividendPerShare * balanceOf(_owner) + magnifiedDividendCorrections[_owner]) / magnitude
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` has earned in total.
  function accumulativeDividendOf(address _owner) public view override returns(uint256) {
    return magnifiedDividendPerShare.mul(holderBalance[_owner]).toInt256Safe()
      .add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude;
  }

  /// @dev Internal function that increases tokens to an account.
  /// Update magnifiedDividendCorrections to keep dividends unchanged.
  /// @param account The account that will receive the created tokens.
  /// @param value The amount that will be created.
  function _increase(address account, uint256 value) internal {
    magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
      .sub( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
  }

  /// @dev Internal function that reduces an amount of the token of a given account.
  /// Update magnifiedDividendCorrections to keep dividends unchanged.
  /// @param account The account whose tokens will be burnt.
  /// @param value The amount that will be burnt.
  function _reduce(address account, uint256 value) internal {
    magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
      .add( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
  }

  function _setBalance(address account, uint256 newBalance) internal {
    uint256 currentBalance = holderBalance[account];
    holderBalance[account] = newBalance;
    if(newBalance > currentBalance) {
      uint256 increaseAmount = newBalance.sub(currentBalance);
      _increase(account, increaseAmount);
      totalBalance += increaseAmount;
    } else if(newBalance < currentBalance) {
      uint256 reduceAmount = currentBalance.sub(newBalance);
      _reduce(account, reduceAmount);
      totalBalance -= reduceAmount;
    }
  }
}


contract BSIMPTEST is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 public uniswapV2Router;
    address public immutable uniswapV2Pair;

    bool private swapping;

    DividendTracker public dividendTracker;

    address public marketingWallet;
    address public liquidityWallet;
    
    address public immutable token = address(0x78867BbEeF44f2326bF8DDd1941a4439382EF2A7); // BUSD - testnet
    
    uint256 public swapTokensAtAmount;
    
    // sells have a higher fee
    uint256 public  sellFeeIncreaseFactor = 100; 
    
    bool public tradingActive = false;
    bool public swapEnabled = false;
    
    uint256 public totalFees;
    uint256 public rewardsFee;
    uint256 public marketingFee;
    uint256 public liquidityFee;
    uint256 public buybackFee;
    

    // use by default 400,000 gas to process auto-claiming dividends
    uint256 public gasForProcessing = 400000;

    /******************/

    // exlcude from fees and max transaction amount
    mapping (address => bool) private _isExcludedFromFees;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping (address => bool) public automatedMarketMakerPairs;

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

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

    event ExcludeFromFees(address indexed account, bool isExcluded);

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

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

    event GasForProcessingUpdated(uint256 indexed newValue, uint256 indexed oldValue);

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

    event SendDividends(
    	uint256 tokensSwapped,
    	uint256 amount
    );

    event ProcessedDividendTracker(
    	uint256 iterations,
    	uint256 claims,
        uint256 lastProcessedIndex,
    	bool indexed automatic,
    	uint256 gas,
    	address indexed processor
    );

    constructor() ERC20("BSIMPTEST", "BSIMPTEST") {
        uint256 _rewardsFee = 5;
        uint256 _marketingFee = 2;
        uint256 _liquidityFee = 5;
        uint256 _buybackFee = 0;
        
        uint256 totalSupply = 21 * 1e6 * 1e9;
        
        swapTokensAtAmount = totalSupply * 1 / 1000; // 0.1% swap tokens amount

        rewardsFee = _rewardsFee;
        marketingFee = _marketingFee;
        liquidityFee = _liquidityFee;
        buybackFee = _buybackFee;
        totalFees = rewardsFee + marketingFee + liquidityFee + buybackFee;
        
    	dividendTracker = new DividendTracker();
    	
    	marketingWallet = address(0xAa4DC7958b8e2b4B14aF811B4e35dC9D6398bbaF); // set as marketing wallet
        liquidityWallet = address(0xdead); // liquidity will go to dead address at first, can update later if needed.

    	IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0xD99D1c33F9fC3444f8101754aBC46c52416550D1);
    	// testnet PCS router: 0xD99D1c33F9fC3444f8101754aBC46c52416550D1
    	// mainnet PCS V2 router: 0x10ED43C718714eb63d5aA57B78B54704E256024E
    	
         // Create a uniswap pair for this new token
        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;

        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);

        // exclude from receiving dividends
        dividendTracker.excludeFromDividends(address(dividendTracker));
        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(owner());
        dividendTracker.excludeFromDividends(address(_uniswapV2Router));
        dividendTracker.excludeFromDividends(address(0xdead));
        
        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        
        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(address(owner()), totalSupply);
    }

    receive() external payable {

  	}

 
    // never ever do this without professional assistance.
    function updateDividendTracker(address newAddress) external onlyOwner {
        require(newAddress != address(dividendTracker), "The dividend tracker already has that address");

        DividendTracker newDividendTracker = DividendTracker(payable(newAddress));

        require(newDividendTracker.owner() == address(this), "The new dividend tracker must be owned by the token contract");

        newDividendTracker.excludeFromDividends(address(newDividendTracker));
        newDividendTracker.excludeFromDividends(address(this));
        newDividendTracker.excludeFromDividends(owner());
        newDividendTracker.excludeFromDividends(address(uniswapV2Router));
        newDividendTracker.excludeFromDividends(address(uniswapV2Pair));
        newDividendTracker.excludeFromDividends(address(0xdead));

        emit UpdateDividendTracker(newAddress, address(dividendTracker));

        dividendTracker = newDividendTracker;
    }
    
    // excludes wallets and contracts from dividends (such as CEX hotwallets, etc.)
    function excludeFromDividends(address account) external onlyOwner {
        dividendTracker.excludeFromDividends(account);
    }

    // removes exclusion on wallets and contracts from dividends (such as CEX hotwallets, etc.)
    function includeInDividends(address account) external onlyOwner {
        dividendTracker.includeInDividends(account);
    }
    
    // once enabled, can never be turned off
    function enableTrading() external onlyOwner {
        tradingActive = true;
        swapEnabled = true;
    }
    
    // only use to disable contract sales if absolutely necessary (emergency use only)
    function updateSwapEnabled(bool enabled) external onlyOwner(){
        swapEnabled = enabled;
    }

    // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner returns (bool){
  	    require(newAmount < totalSupply(), "Swap amount cannot be higher than total supply.");
  	    require(newAmount >= totalSupply() * 1 / 100000, "Swap amount cannot be lower than 0.001% total supply.");
  	    require(newAmount <= totalSupply() * 5 / 1000, "Swap amount cannot be higher than 0.5% total supply.");
  	    swapTokensAtAmount = newAmount;
  	    return true;
  	}

    function updateFees(uint256 _marketingFee, uint256 _rewardsFee, uint256 _liquidityFee, uint256 _buybackFee) external onlyOwner {
        marketingFee = _marketingFee;
        rewardsFee = _rewardsFee;
        liquidityFee = _liquidityFee;
        buybackFee = _buybackFee;
        totalFees = marketingFee + rewardsFee + liquidityFee + buybackFee;
        require(totalFees <= 16, "Must keep fees at 16% or less");
    }

    function updateUniswapV2Router(address newAddress) external onlyOwner {
        require(newAddress != address(uniswapV2Router), "The router already has that address");
        emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router));
        uniswapV2Router = IUniswapV2Router02(newAddress);
    }
    
    function updateSellPenalty(uint256 sellFactor) external onlyOwner {
        require(sellFactor >= 100 && sellFactor <= 125, "sellFactor must be between 100 and 125");
        sellFeeIncreaseFactor = sellFactor;
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;

        emit ExcludeFromFees(account, excluded);
    }

    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        require(pair != uniswapV2Pair, "The PancakeSwap pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }

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

        if(value) {
            dividendTracker.excludeFromDividends(pair);
        }

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateMarketingWallet(address newMarketingWallet) external onlyOwner {
        excludeFromFees(newMarketingWallet, true);
        emit marketingWalletUpdated(newMarketingWallet, marketingWallet);
        marketingWallet = newMarketingWallet;
    }
    
    function updateLiquidityWallet(address newLiquidityWallet) external onlyOwner {
        excludeFromFees(newLiquidityWallet, true);
        liquidityWallet = newLiquidityWallet;
    }

    function updateGasForProcessing(uint256 newValue) external onlyOwner {
        require(newValue >= 200000 && newValue <= 500000, " gasForProcessing must be between 200,000 and 500,000");
        require(newValue != gasForProcessing, "Cannot update gasForProcessing to same value");
        emit GasForProcessingUpdated(newValue, gasForProcessing);
        gasForProcessing = newValue;
    }

    function updateClaimWait(uint256 claimWait) external onlyOwner {
        dividendTracker.updateClaimWait(claimWait);
    }

    function getClaimWait() external view returns(uint256) {
        return dividendTracker.claimWait();
    }

    function getTotalDividendsDistributed() external view returns (uint256) {
        return dividendTracker.totalDividendsDistributed();
    }

    function isExcludedFromFees(address account) public view returns(bool) {
        return _isExcludedFromFees[account];
    }

    function withdrawableDividendOf(address account) public view returns(uint256) {
    	return dividendTracker.withdrawableDividendOf(account);
  	}

	function dividendTokenBalanceOf(address account) public view returns (uint256) {
		return dividendTracker.holderBalance(account);
	}

    function getAccountDividendsInfo(address account)
        external view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
        return dividendTracker.getAccount(account);
    }

	function getAccountDividendsInfoAtIndex(uint256 index)
        external view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
    	return dividendTracker.getAccountAtIndex(index);
    }

	function processDividendTracker(uint256 gas) external {
		(uint256 iterations, uint256 claims, uint256 lastProcessedIndex) = dividendTracker.process(gas);
		emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, false, gas, tx.origin);
    }

    function claim() external {
		dividendTracker.processAccount(payable(msg.sender), false);
    }

    function getLastProcessedIndex() external view returns(uint256) {
    	return dividendTracker.getLastProcessedIndex();
    }

    function getNumberOfDividendTokenHolders() external view returns(uint256) {
        return dividendTracker.getNumberOfTokenHolders();
    }
    
    function getNumberOfDividends() external view returns(uint256) {
        return dividendTracker.totalBalance();
    }
    
    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");
        
         if(amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        if(!tradingActive){
            require(from == owner(), "Trading is not active.");
        }
        
		uint256 contractTokenBalance = balanceOf(address(this));
        
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if( 
            canSwap &&
            swapEnabled &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            swapping = true;
            
            if(totalFees > 0){
                uint256 sellTokens = contractTokenBalance >= swapTokensAtAmount * 5 ? swapTokensAtAmount * 5 : contractTokenBalance;  // only sell up to 5x the swap token amount per sell to prevent massive dumps.
                swapBack(sellTokens);
            }

            swapping = false;
        }

        bool takeFee = !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        if(takeFee) {
        	uint256 fees = amount.mul(totalFees).div(100);
            
    	    if(automatedMarketMakerPairs[to]) {
                fees = fees.mul(sellFeeIncreaseFactor).div(100); // fee can be between 100 and 125% of buy fee based on settings
            }
            super._transfer(from, address(this), fees);
        	
        	amount = amount.sub(fees);
        }

        super._transfer(from, to, amount);

        try dividendTracker.setBalance(payable(from), balanceOf(from)) {} catch {}
        try dividendTracker.setBalance(payable(to), balanceOf(to)) {} catch {}

        if(!swapping) {
	    	uint256 gas = gasForProcessing;

	    	try dividendTracker.process(gas) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) {
	    		emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, true, gas, tx.origin);
	    	}
	    	catch {}
        }
    }

    function swapBnbForRewardToken(uint256 bnbAmount) private {
        if(bnbAmount > 0){
            address[] memory path = new address[](2);
            path[0] = uniswapV2Router.WETH();
            path[1] = token;
            
            uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: bnbAmount}(
                0,
                path,
                address(this),
                block.timestamp
            );
        }
    }
    
    function swapTokensForEth(uint256 tokenAmount) private {

        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

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

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
        
    }
    
    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            address(liquidityWallet),
            block.timestamp
        );

    }
    
    function swapBack(uint256 contractTokenBalance) internal {
        uint256 amountToLiquify = contractTokenBalance.mul(liquidityFee).div(totalFees).div(2);
        uint256 amountToSwap = contractTokenBalance.sub(amountToLiquify);

        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        uint256 balanceBefore = address(this).balance;

        swapTokensForEth(amountToSwap);

        uint256 amountBNB = address(this).balance.sub(balanceBefore);

        uint256 totalBNBFee = totalFees.sub(liquidityFee.div(2));
        
        uint256 amountBNBLiquidity = amountBNB.mul(liquidityFee).div(totalBNBFee).div(2);
        uint256 amountBNBReflection = amountBNB.mul(rewardsFee).div(totalBNBFee);
        uint256 amountBNBMarketing = amountBNB.mul(marketingFee).div(totalBNBFee);
        
        swapBnbForRewardToken(amountBNBReflection);
        
        uint256 tokenBalance = IERC20(token).balanceOf(address(this));
        bool success = IERC20(token).transfer(address(dividendTracker), tokenBalance);
        
        if (success) {
            dividendTracker.distributeTokenDividends(tokenBalance);
            emit SendDividends(tokenBalance, amountBNBReflection);
        }
        
        (success,) = address(marketingWallet).call{value: amountBNBMarketing}("");

        if(amountToLiquify > 0){
            addLiquidity(amountToLiquify, amountBNBLiquidity);
        }
    }
    
    // useful for buybacks or to reclaim any BNB on the contract in a way that helps holders.
    function buyBackTokens(uint256 bnbAmountInWei) external onlyOwner {
        // generate the uniswap pair path of weth -> eth
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = address(this);

        // make the swap
        uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: bnbAmountInWei}(
            0, // accept any amount of Ethereum
            path,
            address(0xdead),
            block.timestamp
        );
    }
}

contract DividendTracker is DividendPayingToken {
    using SafeMath for uint256;
    using SafeMathInt for int256;
    using IterableMapping for IterableMapping.Map;

    IterableMapping.Map private tokenHoldersMap;
    uint256 public lastProcessedIndex;

    mapping (address => bool) public excludedFromDividends;

    mapping (address => uint256) public lastClaimTimes;

    uint256 public claimWait;
    uint256 public immutable minimumTokenBalanceForDividends;

    event ExcludeFromDividends(address indexed account);
    event IncludeInDividends(address indexed account);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);

    event Claim(address indexed account, uint256 amount, bool indexed automatic);

    constructor() {
    	claimWait = 1200;
        minimumTokenBalanceForDividends = 100 * 1e9; //must hold 100+ tokens to get dividends
    }

    function excludeFromDividends(address account) external onlyOwner {
    	excludedFromDividends[account] = true;

    	_setBalance(account, 0);
    	tokenHoldersMap.remove(account);

    	emit ExcludeFromDividends(account);
    }
    
    function includeInDividends(address account) external onlyOwner {
    	require(excludedFromDividends[account]);
    	excludedFromDividends[account] = false;

    	emit IncludeInDividends(account);
    }

    function updateClaimWait(uint256 newClaimWait) external onlyOwner {
        require(newClaimWait >= 1200 && newClaimWait <= 86400, "Dividend_Tracker: claimWait must be updated to between 1 and 24 hours");
        require(newClaimWait != claimWait, "Dividend_Tracker: Cannot update claimWait to same value");
        emit ClaimWaitUpdated(newClaimWait, claimWait);
        claimWait = newClaimWait;
    }

    function getLastProcessedIndex() external view returns(uint256) {
    	return lastProcessedIndex;
    }

    function getNumberOfTokenHolders() external view returns(uint256) {
        return tokenHoldersMap.keys.length;
    }

    // Check to see if I really made this contract or if it is a clone!
    // @Sir_Tris on TG, @SirTrisCrypto on Twitter

    function getAccount(address _account)
        public view returns (
            address account,
            int256 index,
            int256 iterationsUntilProcessed,
            uint256 withdrawableDividends,
            uint256 totalDividends,
            uint256 lastClaimTime,
            uint256 nextClaimTime,
            uint256 secondsUntilAutoClaimAvailable) {
        account = _account;

        index = tokenHoldersMap.getIndexOfKey(account);

        iterationsUntilProcessed = -1;

        if(index >= 0) {
            if(uint256(index) > lastProcessedIndex) {
                iterationsUntilProcessed = index.sub(int256(lastProcessedIndex));
            }
            else {
                uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length > lastProcessedIndex ?
                                                        tokenHoldersMap.keys.length.sub(lastProcessedIndex) :
                                                        0;


                iterationsUntilProcessed = index.add(int256(processesUntilEndOfArray));
            }
        }


        withdrawableDividends = withdrawableDividendOf(account);
        totalDividends = accumulativeDividendOf(account);

        lastClaimTime = lastClaimTimes[account];

        nextClaimTime = lastClaimTime > 0 ?
                                    lastClaimTime.add(claimWait) :
                                    0;

        secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ?
                                                    nextClaimTime.sub(block.timestamp) :
                                                    0;
    }

    function getAccountAtIndex(uint256 index)
        public view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
    	if(index >= tokenHoldersMap.size()) {
            return (0x0000000000000000000000000000000000000000, -1, -1, 0, 0, 0, 0, 0);
        }

        address account = tokenHoldersMap.getKeyAtIndex(index);

        return getAccount(account);
    }

    function canAutoClaim(uint256 lastClaimTime) private view returns (bool) {
    	if(lastClaimTime > block.timestamp)  {
    		return false;
    	}

    	return block.timestamp.sub(lastClaimTime) >= claimWait;
    }

    function setBalance(address payable account, uint256 newBalance) external onlyOwner {
    	if(excludedFromDividends[account]) {
    		return;
    	}

    	if(newBalance >= minimumTokenBalanceForDividends) {
            _setBalance(account, newBalance);
    		tokenHoldersMap.set(account, newBalance);
    	}
    	else {
            _setBalance(account, 0);
    		tokenHoldersMap.remove(account);
    	}

    	processAccount(account, true);
    }
    
    
    function process(uint256 gas) public returns (uint256, uint256, uint256) {
    	uint256 numberOfTokenHolders = tokenHoldersMap.keys.length;

    	if(numberOfTokenHolders == 0) {
    		return (0, 0, lastProcessedIndex);
    	}

    	uint256 _lastProcessedIndex = lastProcessedIndex;

    	uint256 gasUsed = 0;

    	uint256 gasLeft = gasleft();

    	uint256 iterations = 0;
    	uint256 claims = 0;

    	while(gasUsed < gas && iterations < numberOfTokenHolders) {
    		_lastProcessedIndex++;

    		if(_lastProcessedIndex >= tokenHoldersMap.keys.length) {
    			_lastProcessedIndex = 0;
    		}

    		address account = tokenHoldersMap.keys[_lastProcessedIndex];

    		if(canAutoClaim(lastClaimTimes[account])) {
    			if(processAccount(payable(account), true)) {
    				claims++;
    			}
    		}

    		iterations++;

    		uint256 newGasLeft = gasleft();

    		if(gasLeft > newGasLeft) {
    			gasUsed = gasUsed.add(gasLeft.sub(newGasLeft));
    		}
    		gasLeft = newGasLeft;
    	}

    	lastProcessedIndex = _lastProcessedIndex;

    	return (iterations, claims, lastProcessedIndex);
    }

    function processAccount(address payable account, bool automatic) public onlyOwner returns (bool) {
        uint256 amount = _withdrawDividendOfUser(account);

    	if(amount > 0) {
    		lastClaimTimes[account] = block.timestamp;
            emit Claim(account, amount, automatic);
    		return true;
    	}

    	return false;
    }
}

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendDividends","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":"UpdateDividendTracker","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLiquidityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldLiquidityWallet","type":"address"}],"name":"marketingWalletUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","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":"uint256","name":"bnbAmountInWei","type":"uint256"}],"name":"buyBackTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buybackFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","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":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract DividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellFeeIncreaseFactor","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":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","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":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"claimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_rewardsFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_buybackFee","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLiquidityWallet","type":"address"}],"name":"updateLiquidityWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sellFactor","type":"uint256"}],"name":"updateSellPenalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040527f78867bbeef44f2326bf8ddd1941a4439382ef2a700000000000000000000000060a0526064600b55600c805461ffff1916905562061a806012553480156200004c57600080fd5b506040805180820182526009808252681094d25354151154d560ba1b602080840182815285518087019096529285528401528151919291620000919160039162000924565b508051620000a790600490602084019062000924565b5050506000620000bc6200062060201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060056002816000664a9b63844880006103e86200012982600162000a41565b62000135919062000a1e565b600a55600e859055600f8490556010839055601182905581836200015a868862000a03565b62000166919062000a03565b62000172919062000a03565b600d556040516200018390620009b3565b604051809103906000f080158015620001a0573d6000803e3d6000fd5b50600780546001600160a01b03929092166001600160a01b031992831617905560088054821673aa4dc7958b8e2b4b14af811b4e35dc9d6398bbaf1790556009805490911661dead1790556040805163c45a015560e01b8152905173d99d1c33f9fc3444f8101754abc46c52416550d191600091839163c45a0155916004808301926020929190829003018186803b1580156200023c57600080fd5b505afa15801562000251573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002779190620009d8565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620002c057600080fd5b505afa158015620002d5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002fb9190620009d8565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156200034457600080fd5b505af115801562000359573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200037f9190620009d8565b600680546001600160a01b0319166001600160a01b038516179055606081901b6001600160601b0319166080529050620003bb81600162000624565b60075460405163031e79db60e41b81526001600160a01b0390911660048201819052906331e79db090602401600060405180830381600087803b1580156200040257600080fd5b505af115801562000417573d6000803e3d6000fd5b505060075460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200046157600080fd5b505af115801562000476573d6000803e3d6000fd5b50506007546001600160a01b031691506331e79db09050620004a06005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015620004e257600080fd5b505af1158015620004f7573d6000803e3d6000fd5b505060075460405163031e79db60e41b81526001600160a01b03868116600483015290911692506331e79db09150602401600060405180830381600087803b1580156200054357600080fd5b505af115801562000558573d6000803e3d6000fd5b505060075460405163031e79db60e41b815261dead60048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b158015620005a457600080fd5b505af1158015620005b9573d6000803e3d6000fd5b50505050620005d9620005d1620006f060201b60201c565b6001620006ff565b620005e6306001620006ff565b620005f561dead6001620006ff565b620006136200060c6005546001600160a01b031690565b84620007be565b5050505050505062000ab6565b3390565b6001600160a01b0382166000908152601460205260409020805460ff19168215801591909117909155620006b45760075460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156200069a57600080fd5b505af1158015620006af573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b031690565b6005546001600160a01b031633146200075f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6001600160a01b038216600081815260136020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b038216620008165760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000756565b6200083281600254620008ba60201b6200224c1790919060201c565b6002556001600160a01b03821660009081526020818152604090912054620008659183906200224c620008ba821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b600080620008c9838562000a03565b9050838110156200091d5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640162000756565b9392505050565b828054620009329062000a63565b90600052602060002090601f016020900481019282620009565760008555620009a1565b82601f106200097157805160ff1916838001178555620009a1565b82800160010185558215620009a1579182015b82811115620009a157825182559160200191906001019062000984565b50620009af929150620009c1565b5090565b611b16806200441483390190565b5b80821115620009af5760008155600101620009c2565b600060208284031215620009eb57600080fd5b81516001600160a01b03811681146200091d57600080fd5b6000821982111562000a195762000a1962000aa0565b500190565b60008262000a3c57634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161562000a5e5762000a5e62000aa0565b500290565b600181811c9082168062000a7857607f821691505b6020821081141562000a9a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60805160601c60a05160601c61390f62000b0560003960008181610b0401528181612c7e01528181612d2f01526131ff01526000818161056f015281816116970152611871015261390f6000f3fe6080604052600436106103905760003560e01c806388bdd9be116101dc578063bbc0c74211610102578063e2f45605116100a0578063f27fd2541161006f578063f27fd25414610ab2578063f2fde38b14610ad2578063fc0c546a14610af2578063fc155d1d14610b2657600080fd5b8063e2f4560514610a47578063e37ba8f914610a5d578063e7841ec014610a7d578063e98030c714610a9257600080fd5b8063c6616ba1116100dc578063c6616ba1146109a1578063d257b34f146109c1578063d4698016146109e1578063dd62ed3e14610a0157600080fd5b8063bbc0c74214610947578063c024666814610961578063c0f306ef1461098157600080fd5b80639c1b8af51161017a578063a9059cbb11610149578063a9059cbb14610872578063aacebbe314610892578063ad56c13c146108b2578063b62496f51461091757600080fd5b80639c1b8af514610807578063a26579ad1461081d578063a457c2d714610832578063a8b9d2401461085257600080fd5b8063924de9b7116101b6578063924de9b71461079c57806395d89b41146107bc57806398118cb4146107d15780639a7a23d6146107e757600080fd5b806388bdd9be146107495780638a8c523c146107695780638da5cb5b1461077e57600080fd5b806349bd5a5e116102c15780636b67c4df1161025f578063715018a61161022e578063715018a6146106df57806371778e7d146106f457806375f0a87414610709578063871c128d1461072957600080fd5b80636b67c4df146106545780636ddd17131461066a578063700bb1911461068957806370a08231146106a957600080fd5b80635dc62cc51161029b5780635dc62cc5146105df57806364b0f653146105ff57806365b8dbc0146106145780636843cd841461063457600080fd5b806349bd5a5e1461055d5780634e71d92d146105915780634fbee193146105a657600080fd5b80632bb14e1d1161032e578063313ce56711610308578063313ce567146104e957806331e79db01461050557806339509351146105275780633b2d081c1461054757600080fd5b80632bb14e1d1461049e5780632c1f5216146104b457806330bb4cff146104d457600080fd5b80631694505e1161036a5780631694505e1461041b57806318160ddd1461045357806322bd3f7f1461046857806323b872dd1461047e57600080fd5b806306fdde031461039c578063095ea7b3146103c757806313114a9d146103f757600080fd5b3661039757005b600080fd5b3480156103a857600080fd5b506103b1610b46565b6040516103be919061361e565b60405180910390f35b3480156103d357600080fd5b506103e76103e23660046134ad565b610bd8565b60405190151581526020016103be565b34801561040357600080fd5b5061040d600d5481565b6040519081526020016103be565b34801561042757600080fd5b5060065461043b906001600160a01b031681565b6040516001600160a01b0390911681526020016103be565b34801561045f57600080fd5b5060025461040d565b34801561047457600080fd5b5061040d600b5481565b34801561048a57600080fd5b506103e76104993660046133d4565b610bef565b3480156104aa57600080fd5b5061040d600e5481565b3480156104c057600080fd5b5060075461043b906001600160a01b031681565b3480156104e057600080fd5b5061040d610c58565b3480156104f557600080fd5b50604051600981526020016103be565b34801561051157600080fd5b50610525610520366004613361565b610cda565b005b34801561053357600080fd5b506103e76105423660046134ad565b610d70565b34801561055357600080fd5b5061040d60115481565b34801561056957600080fd5b5061043b7f000000000000000000000000000000000000000000000000000000000000000081565b34801561059d57600080fd5b50610525610da6565b3480156105b257600080fd5b506103e76105c1366004613361565b6001600160a01b031660009081526013602052604090205460ff1690565b3480156105eb57600080fd5b506105256105fa366004613513565b610e2d565b34801561060b57600080fd5b5061040d610ec9565b34801561062057600080fd5b5061052561062f366004613361565b610f0e565b34801561064057600080fd5b5061040d61064f366004613361565b610fff565b34801561066057600080fd5b5061040d600f5481565b34801561067657600080fd5b50600c546103e790610100900460ff1681565b34801561069557600080fd5b506105256106a4366004613513565b61107e565b3480156106b557600080fd5b5061040d6106c4366004613361565b6001600160a01b031660009081526020819052604090205490565b3480156106eb57600080fd5b5061052561115f565b34801561070057600080fd5b5061040d6111d3565b34801561071557600080fd5b5060085461043b906001600160a01b031681565b34801561073557600080fd5b50610525610744366004613513565b611218565b34801561075557600080fd5b50610525610764366004613361565b61135c565b34801561077557600080fd5b506105256117b7565b34801561078a57600080fd5b506005546001600160a01b031661043b565b3480156107a857600080fd5b506105256107b73660046134d9565b6117f2565b3480156107c857600080fd5b506103b1611836565b3480156107dd57600080fd5b5061040d60105481565b3480156107f357600080fd5b50610525610802366004613415565b611845565b34801561081357600080fd5b5061040d60125481565b34801561082957600080fd5b5061040d611933565b34801561083e57600080fd5b506103e761084d3660046134ad565b611978565b34801561085e57600080fd5b5061040d61086d366004613361565b6119c7565b34801561087e57600080fd5b506103e761088d3660046134ad565b6119fa565b34801561089e57600080fd5b506105256108ad366004613361565b611a07565b3480156108be57600080fd5b506108d26108cd366004613361565b611a99565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016103be565b34801561092357600080fd5b506103e7610932366004613361565b60146020526000908152604090205460ff1681565b34801561095357600080fd5b50600c546103e79060ff1681565b34801561096d57600080fd5b5061052561097c366004613415565b611b43565b34801561098d57600080fd5b5061052561099c366004613361565b611bcc565b3480156109ad57600080fd5b506105256109bc366004613573565b611c28565b3480156109cd57600080fd5b506103e76109dc366004613513565b611ce1565b3480156109ed57600080fd5b5060095461043b906001600160a01b031681565b348015610a0d57600080fd5b5061040d610a1c36600461339b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610a5357600080fd5b5061040d600a5481565b348015610a6957600080fd5b50610525610a78366004613361565b611e9c565b348015610a8957600080fd5b5061040d611ef3565b348015610a9e57600080fd5b50610525610aad366004613513565b611f38565b348015610abe57600080fd5b506108d2610acd366004613513565b611f93565b348015610ade57600080fd5b50610525610aed366004613361565b611fd5565b348015610afe57600080fd5b5061043b7f000000000000000000000000000000000000000000000000000000000000000081565b348015610b3257600080fd5b50610525610b41366004613513565b6120c0565b606060038054610b55906137dc565b80601f0160208091040260200160405190810160405280929190818152602001828054610b81906137dc565b8015610bce5780601f10610ba357610100808354040283529160200191610bce565b820191906000526020600020905b815481529060010190602001808311610bb157829003601f168201915b5050505050905090565b6000610be53384846122b2565b5060015b92915050565b6000610bfc8484846123d7565b610c4e8433610c498560405180606001604052806028815260200161388d602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190612896565b6122b2565b5060019392505050565b600754604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae916004808301926020929190829003018186803b158015610c9d57600080fd5b505afa158015610cb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd5919061352c565b905090565b6005546001600160a01b03163314610d0d5760405162461bcd60e51b8152600401610d04906136b6565b60405180910390fd5b60075460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b158015610d5557600080fd5b505af1158015610d69573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610be5918590610c49908661224c565b60075460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b3790604401602060405180830381600087803b158015610df257600080fd5b505af1158015610e06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2a91906134f6565b50565b6005546001600160a01b03163314610e575760405162461bcd60e51b8152600401610d04906136b6565b60648110158015610e695750607d8111155b610ec45760405162461bcd60e51b815260206004820152602660248201527f73656c6c466163746f72206d757374206265206265747765656e2031303020616044820152656e642031323560d01b6064820152608401610d04565b600b55565b600754604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde916004808301926020929190829003018186803b158015610c9d57600080fd5b6005546001600160a01b03163314610f385760405162461bcd60e51b8152600401610d04906136b6565b6006546001600160a01b0382811691161415610fa25760405162461bcd60e51b815260206004820152602360248201527f54686520726f7574657220616c7265616479206861732074686174206164647260448201526265737360e81b6064820152608401610d04565b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b60075460405163156dbbf560e31b81526001600160a01b038381166004830152600092169063ab6ddfa8906024015b60206040518083038186803b15801561104657600080fd5b505afa15801561105a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be9919061352c565b6007546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c47990602401606060405180830381600087803b1580156110cc57600080fd5b505af11580156110e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111049190613545565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6005546001600160a01b031633146111895760405162461bcd60e51b8152600401610d04906136b6565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6007546040805163ad7a672f60e01b815290516000926001600160a01b03169163ad7a672f916004808301926020929190829003018186803b158015610c9d57600080fd5b6005546001600160a01b031633146112425760405162461bcd60e51b8152600401610d04906136b6565b62030d40811015801561125857506207a1208111155b6112c25760405162461bcd60e51b815260206004820152603560248201527f20676173466f7250726f63657373696e67206d7573742062652062657477656560448201527406e203230302c30303020616e64203530302c30303605c1b6064820152608401610d04565b6012548114156113295760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460448201526b6f2073616d652076616c756560a01b6064820152608401610d04565b60125460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601255565b6005546001600160a01b031633146113865760405162461bcd60e51b8152600401610d04906136b6565b6007546001600160a01b03828116911614156113fa5760405162461bcd60e51b815260206004820152602d60248201527f546865206469766964656e6420747261636b657220616c72656164792068617360448201526c2074686174206164647265737360981b6064820152608401610d04565b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561144257600080fd5b505afa158015611456573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147a919061337e565b6001600160a01b0316146114f65760405162461bcd60e51b815260206004820152603c60248201527f546865206e6577206469766964656e6420747261636b6572206d75737420626560448201527f206f776e65642062792074686520746f6b656e20636f6e7472616374000000006064820152608401610d04565b60405163031e79db60e41b81526001600160a01b03821660048201819052906331e79db090602401600060405180830381600087803b15801561153857600080fd5b505af115801561154c573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b15801561159157600080fd5b505af11580156115a5573d6000803e3d6000fd5b50505050806001600160a01b03166331e79db06115ca6005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b15801561160b57600080fd5b505af115801561161f573d6000803e3d6000fd5b505060065460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b15801561166a57600080fd5b505af115801561167e573d6000803e3d6000fd5b505060405163031e79db60e41b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152841692506331e79db09150602401600060405180830381600087803b1580156116e557600080fd5b505af11580156116f9573d6000803e3d6000fd5b505060405163031e79db60e41b815261dead60048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b15801561174057600080fd5b505af1158015611754573d6000803e3d6000fd5b50506007546040516001600160a01b03918216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600780546001600160a01b0319166001600160a01b039290921691909117905550565b6005546001600160a01b031633146117e15760405162461bcd60e51b8152600401610d04906136b6565b600c805461ffff1916610101179055565b6005546001600160a01b0316331461181c5760405162461bcd60e51b8152600401610d04906136b6565b600c80549115156101000261ff0019909216919091179055565b606060048054610b55906137dc565b6005546001600160a01b0316331461186f5760405162461bcd60e51b8152600401610d04906136b6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156119255760405162461bcd60e51b815260206004820152604560248201527f5468652050616e63616b655377617020706169722063616e6e6f74206265207260448201527f656d6f7665642066726f6d206175746f6d617465644d61726b65744d616b6572606482015264506169727360d81b608482015260a401610d04565b61192f82826128d0565b5050565b60075460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec916004808301926020929190829003018186803b158015610c9d57600080fd5b6000610be53384610c49856040518060600160405280602581526020016138b5602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190612896565b6007546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d2409060240161102e565b6000610be53384846123d7565b6005546001600160a01b03163314611a315760405162461bcd60e51b8152600401610d04906136b6565b611a3c816001611b43565b6008546040516001600160a01b03918216918316907fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b0567490600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b60075460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b6101006040518083038186803b158015611af057600080fd5b505afa158015611b04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b289190613443565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b03163314611b6d5760405162461bcd60e51b8152600401610d04906136b6565b6001600160a01b038216600081815260136020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b03163314611bf65760405162461bcd60e51b8152600401610d04906136b6565b60075460405163c0f306ef60e01b81526001600160a01b0383811660048301529091169063c0f306ef90602401610d3b565b6005546001600160a01b03163314611c525760405162461bcd60e51b8152600401610d04906136b6565b600f849055600e839055601082905560118190558082611c72858761376c565b611c7c919061376c565b611c86919061376c565b600d81905560101015611cdb5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313625206f72206c6573730000006044820152606401610d04565b50505050565b6005546000906001600160a01b03163314611d0e5760405162461bcd60e51b8152600401610d04906136b6565b6002548210611d775760405162461bcd60e51b815260206004820152602f60248201527f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160448201526e37103a37ba30b61039bab838363c9760891b6064820152608401610d04565b620186a0611d8460025490565b611d8f9060016137a6565b611d999190613784565b821015611e065760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610d04565b6103e8611e1260025490565b611e1d9060056137a6565b611e279190613784565b821115611e935760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610d04565b50600a55600190565b6005546001600160a01b03163314611ec65760405162461bcd60e51b8152600401610d04906136b6565b611ed1816001611b43565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6007546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec0916004808301926020929190829003018186803b158015610c9d57600080fd5b6005546001600160a01b03163314611f625760405162461bcd60e51b8152600401610d04906136b6565b60075460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c790602401610d3b565b600754604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd90602401611ad7565b6005546001600160a01b03163314611fff5760405162461bcd60e51b8152600401610d04906136b6565b6001600160a01b0381166120645760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d04565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146120ea5760405162461bcd60e51b8152600401610d04906136b6565b6040805160028082526060820183526000926020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b15801561214f57600080fd5b505afa158015612163573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612187919061337e565b8160008151811061219a5761219a61382d565b60200260200101906001600160a01b031690816001600160a01b03168152505030816001815181106121ce576121ce61382d565b6001600160a01b03928316602091820292909201015260065460405163b6f9de9560e01b815291169063b6f9de9590849061221690600090869061dead9042906004016135e9565b6000604051808303818588803b15801561222f57600080fd5b505af1158015612243573d6000803e3d6000fd5b50505050505050565b600080612259838561376c565b9050838110156122ab5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610d04565b9392505050565b6001600160a01b0383166123145760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610d04565b6001600160a01b0382166123755760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610d04565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166123fd5760405162461bcd60e51b8152600401610d04906136eb565b6001600160a01b0382166124235760405162461bcd60e51b8152600401610d0490613673565b806124395761243483836000612999565b505050565b600c5460ff16612499576005546001600160a01b038481169116146124995760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610d04565b30600090815260208190526040902054600a54811080159081906124c45750600c54610100900460ff165b80156124da5750600654600160a01b900460ff16155b80156124ff57506001600160a01b03851660009081526014602052604090205460ff16155b801561252457506001600160a01b03851660009081526013602052604090205460ff16155b801561254957506001600160a01b03841660009081526013602052604090205460ff16155b156125b0576006805460ff60a01b1916600160a01b179055600d54156125a2576000600a54600561257a91906137a6565b8310156125875782612595565b600a546125959060056137a6565b90506125a081612aa2565b505b6006805460ff60a01b191690555b6006546001600160a01b03861660009081526013602052604090205460ff600160a01b9092048216159116806125fe57506001600160a01b03851660009081526013602052604090205460ff165b15612607575060005b801561268957600061262f6064612629600d5488612ec390919063ffffffff16565b90612f42565b6001600160a01b03871660009081526014602052604090205490915060ff16156126705761266d6064612629600b5484612ec390919063ffffffff16565b90505b61267b873083612999565b6126858582612f84565b9450505b612694868686612999565b6007546001600160a01b031663e30443bc876126c5816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561270b57600080fd5b505af192505050801561271c575060015b506007546001600160a01b031663e30443bc8661274e816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561279457600080fd5b505af19250505080156127a5575060015b50600654600160a01b900460ff1661288e576012546007546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c47990602401606060405180830381600087803b15801561280357600080fd5b505af1925050508015612833575060408051601f3d908101601f1916820190925261283091810190613545565b60015b61283c57612243565b60408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a3505050505b505050505050565b600081848411156128ba5760405162461bcd60e51b8152600401610d04919061361e565b5060006128c784866137c5565b95945050505050565b6001600160a01b0382166000908152601460205260409020805460ff1916821580159190911790915561295d5760075460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b15801561294457600080fd5b505af1158015612958573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b0383166129bf5760405162461bcd60e51b8152600401610d04906136eb565b6001600160a01b0382166129e55760405162461bcd60e51b8152600401610d0490613673565b612a2281604051806060016040528060268152602001613867602691396001600160a01b0386166000908152602081905260409020549190612896565b6001600160a01b038085166000908152602081905260408082209390935590841681522054612a51908261224c565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016123ca565b6000612ac46002612629600d5461262960105487612ec390919063ffffffff16565b90506000612ad28383612f84565b60408051600280825260608201835292935060009290916020830190803683370190505090503081600081518110612b0c57612b0c61382d565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612b6057600080fd5b505afa158015612b74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b98919061337e565b81600181518110612bab57612bab61382d565b6001600160a01b039092166020928302919091019091015247612bcd83612fc6565b6000612bd94783612f84565b90506000612bff612bf66002601054612f4290919063ffffffff16565b600d5490612f84565b90506000612c2160026126298461262960105488612ec390919063ffffffff16565b90506000612c3e83612629600e5487612ec390919063ffffffff16565b90506000612c5b84612629600f5488612ec390919063ffffffff16565b9050612c6682613127565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b158015612cc857600080fd5b505afa158015612cdc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d00919061352c565b60075460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529192506000917f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb90604401602060405180830381600087803b158015612d7557600080fd5b505af1158015612d89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dad91906134f6565b90508015612e4e5760075460405163b0c7ce3760e01b8152600481018490526001600160a01b039091169063b0c7ce3790602401600060405180830381600087803b158015612dfb57600080fd5b505af1158015612e0f573d6000803e3d6000fd5b505060408051858152602081018890527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3935001905060405180910390a15b6008546040516001600160a01b03909116908490600081818185875af1925050503d8060008114612e9b576040519150601f19603f3d011682016040523d82523d6000602084013e612ea0565b606091505b50909150508a15612eb557612eb58b86613277565b505050505050505050505050565b600082612ed257506000610be9565b6000612ede83856137a6565b905082612eeb8583613784565b146122ab5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610d04565b60006122ab83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613333565b60006122ab83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612896565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612ffb57612ffb61382d565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561304f57600080fd5b505afa158015613063573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613087919061337e565b8160018151811061309a5761309a61382d565b6001600160a01b0392831660209182029290920101526006546130c091309116846122b2565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906130f9908590600090869030904290600401613730565b600060405180830381600087803b15801561311357600080fd5b505af115801561288e573d6000803e3d6000fd5b8015610e2a576040805160028082526060820183526000926020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b15801561319257600080fd5b505afa1580156131a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ca919061337e565b816000815181106131dd576131dd61382d565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106132315761323161382d565b6001600160a01b03928316602091820292909201015260065460405163b6f9de9560e01b815291169063b6f9de95908490612216906000908690309042906004016135e9565b60065461328f9030906001600160a01b0316846122b2565b60065460095460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c4016060604051808303818588803b1580156132fa57600080fd5b505af115801561330e573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610d699190613545565b600081836133545760405162461bcd60e51b8152600401610d04919061361e565b5060006128c78486613784565b60006020828403121561337357600080fd5b81356122ab81613843565b60006020828403121561339057600080fd5b81516122ab81613843565b600080604083850312156133ae57600080fd5b82356133b981613843565b915060208301356133c981613843565b809150509250929050565b6000806000606084860312156133e957600080fd5b83356133f481613843565b9250602084013561340481613843565b929592945050506040919091013590565b6000806040838503121561342857600080fd5b823561343381613843565b915060208301356133c981613858565b600080600080600080600080610100898b03121561346057600080fd5b885161346b81613843565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b600080604083850312156134c057600080fd5b82356134cb81613843565b946020939093013593505050565b6000602082840312156134eb57600080fd5b81356122ab81613858565b60006020828403121561350857600080fd5b81516122ab81613858565b60006020828403121561352557600080fd5b5035919050565b60006020828403121561353e57600080fd5b5051919050565b60008060006060848603121561355a57600080fd5b8351925060208401519150604084015190509250925092565b6000806000806080858703121561358957600080fd5b5050823594602084013594506040840135936060013592509050565b600081518084526020808501945080840160005b838110156135de5781516001600160a01b0316875295820195908201906001016135b9565b509495945050505050565b84815260806020820152600061360260808301866135a5565b6001600160a01b03949094166040830152506060015292915050565b600060208083528351808285015260005b8181101561364b5785810183015185820160400152820161362f565b8181111561365d576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b85815284602082015260a06040820152600061374f60a08301866135a5565b6001600160a01b0394909416606083015250608001529392505050565b6000821982111561377f5761377f613817565b500190565b6000826137a157634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156137c0576137c0613817565b500290565b6000828210156137d7576137d7613817565b500390565b600181811c908216806137f057607f821691505b6020821081141561381157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114610e2a57600080fd5b8015158114610e2a57600080fdfe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212203a5d62dba5558b55e0d016e370bc2fe2eb5d5c6b6227bbe2125035a7ec2cffe864736f6c6343000806003360c06040527f78867bbeef44f2326bf8ddd1941a4439382ef2a700000000000000000000000060805234801561003457600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506104b0600e5564174876e80060a05260805160601c60a051611a5b6100bb600039600081816104c10152610c4a0152600081816105aa01526114a30152611a5b6000f3fe6080604052600436106101c65760003560e01c8063a8b9d240116100f7578063c0f306ef11610095578063f2fde38b11610064578063f2fde38b14610558578063fbcbc0f114610578578063fc0c546a14610598578063ffb2c479146105cc57600080fd5b8063c0f306ef146104e3578063e30443bc14610503578063e7841ec014610523578063e98030c71461053857600080fd5b8063ad7a672f116100d1578063ad7a672f14610459578063b0c7ce371461046f578063bc4c4b371461048f578063be10b614146104af57600080fd5b8063a8b9d240146103d6578063aafd847a146103f6578063ab6ddfa81461042c57600080fd5b80635183d6fd11610164578063715018a61161013e578063715018a61461035957806385a6b3ae1461036e5780638da5cb5b1461038457806391b89fba146103b657600080fd5b80635183d6fd146102c95780636a4740021461032e5780636f2789ec1461034357600080fd5b806327ce0147116101a057806327ce0147146102335780633009a6091461025357806331e79db0146102695780634e7b827f1461028957600080fd5b806303c83302146101da57806309bbedde146101e2578063226cfa3d1461020657600080fd5b366101d5576101d3610607565b005b600080fd5b6101d3610607565b3480156101ee57600080fd5b506007545b6040519081526020015b60405180910390f35b34801561021257600080fd5b506101f3610221366004611753565b600d6020526000908152604090205481565b34801561023f57600080fd5b506101f361024e366004611753565b61067a565b34801561025f57600080fd5b506101f3600b5481565b34801561027557600080fd5b506101d3610284366004611753565b6106dd565b34801561029557600080fd5b506102b96102a4366004611753565b600c6020526000908152604090205460ff1681565b60405190151581526020016101fd565b3480156102d557600080fd5b506102e96102e4366004611828565b6107de565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016101fd565b34801561033a57600080fd5b506101d3610950565b34801561034f57600080fd5b506101f3600e5481565b34801561036557600080fd5b506101d361095c565b34801561037a57600080fd5b506101f360065481565b34801561039057600080fd5b506000546001600160a01b03165b6040516001600160a01b0390911681526020016101fd565b3480156103c257600080fd5b506101f36103d1366004611753565b6109d0565b3480156103e257600080fd5b506101f36103f1366004611753565b6109d7565b34801561040257600080fd5b506101f3610411366004611753565b6001600160a01b031660009081526003602052604090205490565b34801561043857600080fd5b506101f3610447366004611753565b60046020526000908152604090205481565b34801561046557600080fd5b506101f360055481565b34801561047b57600080fd5b506101d361048a366004611828565b610a03565b34801561049b57600080fd5b506102b96104aa36600461178d565b610ab5565b3480156104bb57600080fd5b506101f37f000000000000000000000000000000000000000000000000000000000000000081565b3480156104ef57600080fd5b506101d36104fe366004611753565b610b61565b34801561050f57600080fd5b506101d361051e3660046117c6565b610bf9565b34801561052f57600080fd5b50600b546101f3565b34801561054457600080fd5b506101d3610553366004611828565b610d85565b34801561056457600080fd5b506101d3610573366004611753565b610eef565b34801561058457600080fd5b506102e9610593366004611753565b610fd9565b3480156105a457600080fd5b5061039e7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105d857600080fd5b506105ec6105e7366004611828565b611151565b604080519384526020840192909252908201526060016101fd565b60405162461bcd60e51b815260206004820152603a60248201527f43616e6e6f742073656e6420424e42206469726563746c7920746f207472616360448201527f6b657220617320697420697320756e7265636f76657261626c6500000000000060648201526084015b60405180910390fd5b6001600160a01b0381166000908152600260209081526040808320546004909252822054600154600160801b926106cd926106c8926106c2916106bd919061126c565b6112f2565b90611302565b611340565b6106d79190611924565b92915050565b6000546001600160a01b031633146107075760405162461bcd60e51b815260040161067190611896565b6001600160a01b0381166000908152600c60205260408120805460ff19166001179055610735908290611353565b60405163131836e760e21b8152600760048201526001600160a01b038216602482015273c6d377faab883e39428aa2cdd38d8dc66e019ea090634c60db9c9060440160006040518083038186803b15801561078f57600080fd5b505af41580156107a3573d6000803e3d6000fd5b50506040516001600160a01b03841692507fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b259150600090a250565b600080600080600080600080600773c6d377faab883e39428aa2cdd38d8dc66e019ea063deb3d89690916040518263ffffffff1660e01b815260040161082691815260200190565b60206040518083038186803b15801561083e57600080fd5b505af4158015610852573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610876919061180f565b891061089b575060009650600019955085945086935083925082915081905080610945565b6040516368d54f3f60e11b815260076004820152602481018a905260009073c6d377faab883e39428aa2cdd38d8dc66e019ea09063d1aa9e7e9060440160206040518083038186803b1580156108f057600080fd5b505af4158015610904573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109289190611770565b905061093381610fd9565b98509850985098509850985098509850505b919395975091939597565b610959336113ec565b50565b6000546001600160a01b031633146109865760405162461bcd60e51b815260040161067190611896565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60006106d7825b6001600160a01b0381166000908152600360205260408120546106d7906109fd8461067a565b90611580565b6000546001600160a01b03163314610a2d5760405162461bcd60e51b815260040161067190611896565b600060055411610a3c57600080fd5b801561095957600554610a6a90610a5783600160801b61126c565b610a619190611924565b600154906115c2565b60015560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600654610aaf90826115c2565b60065550565b600080546001600160a01b03163314610ae05760405162461bcd60e51b815260040161067190611896565b6000610aeb846113ec565b90508015610b57576001600160a01b0384166000818152600d6020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09290610b459085815260200190565b60405180910390a360019150506106d7565b5060009392505050565b6000546001600160a01b03163314610b8b5760405162461bcd60e51b815260040161067190611896565b6001600160a01b0381166000908152600c602052604090205460ff16610bb057600080fd5b6001600160a01b0381166000818152600c6020526040808220805460ff19169055517f40a78dcf8526b72f2eaf598af1c7e49c8d5fc577f6c8f1bed887f3e4dfa289329190a250565b6000546001600160a01b03163314610c235760405162461bcd60e51b815260040161067190611896565b6001600160a01b0382166000908152600c602052604090205460ff1615610c48575050565b7f00000000000000000000000000000000000000000000000000000000000000008110610cf757610c798282611353565b604051632f0ad01760e21b8152600760048201526001600160a01b03831660248201526044810182905273c6d377faab883e39428aa2cdd38d8dc66e019ea09063bc2b405c9060640160006040518083038186803b158015610cda57600080fd5b505af4158015610cee573d6000803e3d6000fd5b50505050610d75565b610d02826000611353565b60405163131836e760e21b8152600760048201526001600160a01b038316602482015273c6d377faab883e39428aa2cdd38d8dc66e019ea090634c60db9c9060440160006040518083038186803b158015610d5c57600080fd5b505af4158015610d70573d6000803e3d6000fd5b505050505b610d80826001610ab5565b505050565b6000546001600160a01b03163314610daf5760405162461bcd60e51b815260040161067190611896565b6104b08110158015610dc45750620151808111155b610e445760405162461bcd60e51b815260206004820152604560248201527f4469766964656e645f547261636b65723a20636c61696d57616974206d75737460448201527f206265207570646174656420746f206265747765656e203120616e6420323420606482015264686f75727360d81b608482015260a401610671565b600e54811415610ebc5760405162461bcd60e51b815260206004820152603760248201527f4469766964656e645f547261636b65723a2043616e6e6f74207570646174652060448201527f636c61696d5761697420746f2073616d652076616c75650000000000000000006064820152608401610671565b600e5460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3600e55565b6000546001600160a01b03163314610f195760405162461bcd60e51b815260040161067190611896565b6001600160a01b038116610f7e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610671565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6040516317e142d160e01b8152600760048201526001600160a01b0382166024820152819060009081908190819081908190819073c6d377faab883e39428aa2cdd38d8dc66e019ea0906317e142d19060440160206040518083038186803b15801561104457600080fd5b505af4158015611058573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107c919061180f565b96506000199550600087126110de57600b548711156110aa57600b546110a3908890611621565b95506110de565b600b54600754600091106110bf5760006110ce565b600b546007546110ce91611580565b90506110da8882611302565b9650505b6110e7886109d7565b94506110f28861067a565b6001600160a01b0389166000908152600d602052604090205490945092508261111c57600061112a565b600e5461112a9084906115c2565b915042821161113a576000611144565b6111448242611580565b9050919395975091939597565b6007546000908190819080611171575050600b5460009250829150611265565b600b546000805a90506000805b898410801561118c57508582105b15611254578461119b816119bb565b600754909650861090506111ae57600094505b6000600760000186815481106111c6576111c66119ec565b60009182526020808320909101546001600160a01b0316808352600d9091526040909120549091506111f79061165e565b1561121a57611207816001610ab5565b1561121a5781611216816119bb565b9250505b82611224816119bb565b93505060005a90508085111561124b576112486112418683611580565b87906115c2565b95505b935061117e9050565b600b85905590975095509193505050505b9193909250565b60008261127b575060006106d7565b60006112878385611946565b9050826112948583611924565b146112eb5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610671565b9392505050565b600081818112156106d757600080fd5b60008061130f83856118cb565b9050600083121580156113225750838112155b80611337575060008312801561133757508381125b6112eb57600080fd5b60008082121561134f57600080fd5b5090565b6001600160a01b0382166000908152600460205260409020805490829055808211156113af5760006113858383611580565b90506113918482611685565b80600560008282546113a3919061190c565b90915550610d80915050565b80821015610d805760006113c38284611580565b90506113cf84826116df565b80600560008282546113e191906119a4565b909155505050505050565b6000806113f8836109d7565b90508015611577576001600160a01b03831660009081526003602052604090205461142390826115c2565b6001600160a01b038416600081815260036020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d906114729084815260200190565b60405180910390a260405163a9059cbb60e01b81526001600160a01b038481166004830152602482018390526000917f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb90604401602060405180830381600087803b1580156114e957600080fd5b505af11580156114fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152191906117f2565b905080611570576001600160a01b03841660009081526003602052604090205461154b9083611580565b6001600160a01b03909416600090815260036020526040812094909455509192915050565b5092915050565b50600092915050565b60006112eb83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611719565b6000806115cf838561190c565b9050838110156112eb5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610671565b60008061162e8385611965565b9050600083121580156116415750838113155b80611337575060008312801561133757508381136112eb57600080fd5b60004282111561167057506000919050565b600e5461167d4284611580565b101592915050565b6116bf6116a06106bd8360015461126c90919063ffffffff16565b6001600160a01b03841660009081526002602052604090205490611621565b6001600160a01b0390921660009081526002602052604090209190915550565b6116bf6116fa6106bd8360015461126c90919063ffffffff16565b6001600160a01b03841660009081526002602052604090205490611302565b6000818484111561173d5760405162461bcd60e51b81526004016106719190611841565b50600061174a84866119a4565b95945050505050565b60006020828403121561176557600080fd5b81356112eb81611a02565b60006020828403121561178257600080fd5b81516112eb81611a02565b600080604083850312156117a057600080fd5b82356117ab81611a02565b915060208301356117bb81611a17565b809150509250929050565b600080604083850312156117d957600080fd5b82356117e481611a02565b946020939093013593505050565b60006020828403121561180457600080fd5b81516112eb81611a17565b60006020828403121561182157600080fd5b5051919050565b60006020828403121561183a57600080fd5b5035919050565b600060208083528351808285015260005b8181101561186e57858101830151858201604001528201611852565b81811115611880576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600080821280156001600160ff1b03849003851316156118ed576118ed6119d6565b600160ff1b8390038412811615611906576119066119d6565b50500190565b6000821982111561191f5761191f6119d6565b500190565b60008261194157634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611960576119606119d6565b500290565b60008083128015600160ff1b850184121615611983576119836119d6565b6001600160ff1b038401831381161561199e5761199e6119d6565b50500390565b6000828210156119b6576119b66119d6565b500390565b60006000198214156119cf576119cf6119d6565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038116811461095957600080fd5b801515811461095957600080fdfea264697066735822122054eae02f893c1338ba408d93f92cf6d1ceb2ab4a2baa8a6c4048082dd0f387ff64736f6c63430008060033

Library Used

IterableMapping : 0xc6d377faab883e39428aa2cdd38d8dc66e019ea0Unverified

Deployed ByteCode Sourcemap

41740:18087:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9480:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11646:169;;;;;;;;;;-1:-1:-1;11646:169:0;;;;;:::i;:::-;;:::i;:::-;;;7586:14:1;;7579:22;7561:41;;7549:2;7534:18;11646:169:0;7516:92:1;42405:24:0;;;;;;;;;;;;;;;;;;;17430:25:1;;;17418:2;17403:18;42405:24:0;17385:76:1;41819:41:0;;;;;;;;;;-1:-1:-1;41819:41:0;;;;-1:-1:-1;;;;;41819:41:0;;;;;;-1:-1:-1;;;;;5180:32:1;;;5162:51;;5150:2;5135:18;41819:41:0;5117:102:1;10599:108:0;;;;;;;;;;-1:-1:-1;10687:12:0;;10599:108;;42264:43;;;;;;;;;;;;;;;;12297:355;;;;;;;;;;-1:-1:-1;12297:355:0;;;;;:::i;:::-;;:::i;42436:25::-;;;;;;;;;;;;;;;;41944:38;;;;;;;;;;-1:-1:-1;41944:38:0;;;;-1:-1:-1;;;;;41944:38:0;;;51586:141;;;;;;;;;;;;;:::i;10442:92::-;;;;;;;;;;-1:-1:-1;10442:92:0;;10525:1;18844:36:1;;18832:2;18817:18;10442:92:0;18799:87:1;47458:130:0;;;;;;;;;;-1:-1:-1;47458:130:0;;;;;:::i;:::-;;:::i;:::-;;13061:218;;;;;;;;;;-1:-1:-1;13061:218:0;;;;;:::i;:::-;;:::i;42536:25::-;;;;;;;;;;;;;;;;41867:38;;;;;;;;;;;;;;;53082:97;;;;;;;;;;;;;:::i;51735:125::-;;;;;;;;;;-1:-1:-1;51735:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;51824:28:0;51800:4;51824:28;;;:19;:28;;;;;;;;;51735:125;49500:219;;;;;;;;;;-1:-1:-1;49500:219:0;;;;;:::i;:::-;;:::i;53321:141::-;;;;;;;;;;;;;:::i;49179:309::-;;;;;;;;;;-1:-1:-1;49179:309:0;;;;;:::i;:::-;;:::i;52020:134::-;;;;;;;;;;-1:-1:-1;52020:134:0;;;;;:::i;:::-;;:::i;42468:27::-;;;;;;;;;;;;;;;;42361:31;;;;;;;;;;-1:-1:-1;42361:31:0;;;;;;;;;;;52815:259;;;;;;;;;;-1:-1:-1;52815:259:0;;;;;:::i;:::-;;:::i;10770:127::-;;;;;;;;;;-1:-1:-1;10770:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;10871:18:0;10844:7;10871:18;;;;;;;;;;;;10770:127;26615:148;;;;;;;;;;;;;:::i;53474:119::-;;;;;;;;;;;;;:::i;41991:30::-;;;;;;;;;;-1:-1:-1;41991:30:0;;;;-1:-1:-1;;;;;41991:30:0;;;50935:395;;;;;;;;;;-1:-1:-1;50935:395:0;;;;;:::i;:::-;;:::i;46413:948::-;;;;;;;;;;-1:-1:-1;46413:948:0;;;;;:::i;:::-;;:::i;47877:112::-;;;;;;;;;;;;;:::i;25973:79::-;;;;;;;;;;-1:-1:-1;26038:6:0;;-1:-1:-1;;;;;26038:6:0;25973:79;;48089:101;;;;;;;;;;-1:-1:-1;48089:101:0;;;;;:::i;:::-;;:::i;9699:104::-;;;;;;;;;;;;;:::i;42502:27::-;;;;;;;;;;;;;;;;49919:256;;;;;;;;;;-1:-1:-1;49919:256:0;;;;;:::i;:::-;;:::i;42646:40::-;;;;;;;;;;;;;;;;51470:108;;;;;;;;;;;;;:::i;13782:269::-;;;;;;;;;;-1:-1:-1;13782:269:0;;;;;:::i;:::-;;:::i;51868:147::-;;;;;;;;;;-1:-1:-1;51868:147:0;;;;;:::i;:::-;;:::i;11110:175::-;;;;;;;;;;-1:-1:-1;11110:175:0;;;;;:::i;:::-;;:::i;50470:260::-;;;;;;;;;;-1:-1:-1;50470:260:0;;;;;:::i;:::-;;:::i;52162:318::-;;;;;;;;;;-1:-1:-1;52162:318:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;6181:32:1;;;6163:51;;6245:2;6230:18;;6223:34;;;;6273:18;;;6266:34;;;;6331:2;6316:18;;6309:34;;;;6374:3;6359:19;;6352:35;6201:3;6403:19;;6396:35;6462:3;6447:19;;6440:35;6506:3;6491:19;;6484:35;6150:3;6135:19;52162:318:0;6117:408:1;42987:58:0;;;;;;;;;;-1:-1:-1;42987:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;42321:33;;;;;;;;;;-1:-1:-1;42321:33:0;;;;;;;;49727:184;;;;;;;;;;-1:-1:-1;49727:184:0;;;;;:::i;:::-;;:::i;47693:126::-;;;;;;;;;;-1:-1:-1;47693:126:0;;;;;:::i;:::-;;:::i;48744:427::-;;;;;;;;;;-1:-1:-1;48744:427:0;;;;;:::i;:::-;;:::i;48260:476::-;;;;;;;;;;-1:-1:-1;48260:476:0;;;;;:::i;:::-;;:::i;42028:30::-;;;;;;;;;;-1:-1:-1;42028:30:0;;;;-1:-1:-1;;;;;42028:30:0;;;11348:151;;;;;;;;;;-1:-1:-1;11348:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;11464:18:0;;;11437:7;11464:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;11348:151;42186:33;;;;;;;;;;;;;;;;50742:185;;;;;;;;;;-1:-1:-1;50742:185:0;;;;;:::i;:::-;;:::i;53187:126::-;;;;;;;;;;;;;:::i;51338:124::-;;;;;;;;;;-1:-1:-1;51338:124:0;;;;;:::i;:::-;;:::i;52485:325::-;;;;;;;;;;-1:-1:-1;52485:325:0;;;;;:::i;:::-;;:::i;26918:244::-;;;;;;;;;;-1:-1:-1;26918:244:0;;;;;:::i;:::-;;:::i;42071:84::-;;;;;;;;;;;;;;;59297:527;;;;;;;;;;-1:-1:-1;59297:527:0;;;;;:::i;:::-;;:::i;9480:100::-;9534:13;9567:5;9560:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9480:100;:::o;11646:169::-;11729:4;11746:39;561:10;11769:7;11778:6;11746:8;:39::i;:::-;-1:-1:-1;11803:4:0;11646:169;;;;;:::o;12297:355::-;12437:4;12454:36;12464:6;12472:9;12483:6;12454:9;:36::i;:::-;12501:121;12510:6;561:10;12532:89;12570:6;12532:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12532:19:0;;;;;;:11;:19;;;;;;;;561:10;12532:33;;;;;;;;;;:37;:89::i;:::-;12501:8;:121::i;:::-;-1:-1:-1;12640:4:0;12297:355;;;;;:::o;51586:141::-;51676:15;;:43;;;-1:-1:-1;;;51676:43:0;;;;51649:7;;-1:-1:-1;;;;;51676:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51669:50;;51586:141;:::o;47458:130::-;26185:6;;-1:-1:-1;;;;;26185:6:0;561:10;26185:22;26177:67;;;;-1:-1:-1;;;26177:67:0;;;;;;;:::i;:::-;;;;;;;;;47535:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;47535:45:0;;-1:-1:-1;;;;;5180:32:1;;;47535:45:0::1;::::0;::::1;5162:51:1::0;47535:15:0;;::::1;::::0;:36:::1;::::0;5135:18:1;;47535:45:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;47458:130:::0;:::o;13061:218::-;561:10;13149:4;13198:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;13198:34:0;;;;;;;;;;13149:4;;13166:83;;13189:7;;13198:50;;13237:10;13198:38;:50::i;53082:97::-;53113:15;;:58;;-1:-1:-1;;;53113:58:0;;53152:10;53113:58;;;5408:51:1;53113:15:0;5475:18:1;;;5468:50;-1:-1:-1;;;;;53113:15:0;;;;:30;;5381:18:1;;53113:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;53082:97::o;49500:219::-;26185:6;;-1:-1:-1;;;;;26185:6:0;561:10;26185:22;26177:67;;;;-1:-1:-1;;;26177:67:0;;;;;;;:::i;:::-;49599:3:::1;49585:10;:17;;:38;;;;;49620:3;49606:10;:17;;49585:38;49577:89;;;::::0;-1:-1:-1;;;49577:89:0;;15016:2:1;49577:89:0::1;::::0;::::1;14998:21:1::0;15055:2;15035:18;;;15028:30;15094:34;15074:18;;;15067:62;-1:-1:-1;;;15145:18:1;;;15138:36;15191:19;;49577:89:0::1;14988:228:1::0;49577:89:0::1;49677:21;:34:::0;49500:219::o;53321:141::-;53413:15;;:41;;;-1:-1:-1;;;53413:41:0;;;;53386:7;;-1:-1:-1;;;;;53413:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;49179:309;26185:6;;-1:-1:-1;;;;;26185:6:0;561:10;26185:22;26177:67;;;;-1:-1:-1;;;26177:67:0;;;;;;;:::i;:::-;49290:15:::1;::::0;-1:-1:-1;;;;;49268:38:0;;::::1;49290:15:::0;::::1;49268:38;;49260:86;;;::::0;-1:-1:-1;;;49260:86:0;;12219:2:1;49260:86:0::1;::::0;::::1;12201:21:1::0;12258:2;12238:18;;;12231:30;12297:34;12277:18;;;12270:62;-1:-1:-1;;;12348:18:1;;;12341:33;12391:19;;49260:86:0::1;12191:225:1::0;49260:86:0::1;49404:15;::::0;49362:59:::1;::::0;-1:-1:-1;;;;;49404:15:0;;::::1;::::0;49362:59;::::1;::::0;::::1;::::0;49404:15:::1;::::0;49362:59:::1;49432:15;:48:::0;;-1:-1:-1;;;;;;49432:48:0::1;-1:-1:-1::0;;;;;49432:48:0;;;::::1;::::0;;;::::1;::::0;;49179:309::o;52020:134::-;52111:15;;:38;;-1:-1:-1;;;52111:38:0;;-1:-1:-1;;;;;5180:32:1;;;52111:38:0;;;5162:51:1;52090:7:0;;52111:15;;:29;;5135:18:1;;52111:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;52815:259::-;52941:15;;:28;;-1:-1:-1;;;;;;52941:28:0;;;;;17430:25:1;;;52875:18:0;;;;;;-1:-1:-1;;;;;52941:15:0;;:23;;17403:18:1;;52941:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52979:87;;;18537:25:1;;;18593:2;18578:18;;18571:34;;;18621:18;;;18614:34;;;18679:2;18664:18;;18657:34;;;52874:95:0;;-1:-1:-1;52874:95:0;;-1:-1:-1;52874:95:0;-1:-1:-1;53056:9:0;;53044:5;;52979:87;;18524:3:1;18509:19;52979:87:0;;;;;;;52869:205;;;52815:259;:::o;26615:148::-;26185:6;;-1:-1:-1;;;;;26185:6:0;561:10;26185:22;26177:67;;;;-1:-1:-1;;;26177:67:0;;;;;;;:::i;:::-;26706:6:::1;::::0;26685:40:::1;::::0;26722:1:::1;::::0;-1:-1:-1;;;;;26706:6:0::1;::::0;26685:40:::1;::::0;26722:1;;26685:40:::1;26736:6;:19:::0;;-1:-1:-1;;;;;;26736:19:0::1;::::0;;26615:148::o;53474:119::-;53555:15;;:30;;;-1:-1:-1;;;53555:30:0;;;;53528:7;;-1:-1:-1;;;;;53555:15:0;;:28;;:30;;;;;;;;;;;;;;:15;:30;;;;;;;;;;50935:395;26185:6;;-1:-1:-1;;;;;26185:6:0;561:10;26185:22;26177:67;;;;-1:-1:-1;;;26177:67:0;;;;;;;:::i;:::-;51035:6:::1;51023:8;:18;;:40;;;;;51057:6;51045:8;:18;;51023:40;51015:106;;;::::0;-1:-1:-1;;;51015:106:0;;16650:2:1;51015:106:0::1;::::0;::::1;16632:21:1::0;16689:2;16669:18;;;16662:30;16728:34;16708:18;;;16701:62;-1:-1:-1;;;16779:18:1;;;16772:51;16840:19;;51015:106:0::1;16622:243:1::0;51015:106:0::1;51152:16;;51140:8;:28;;51132:85;;;::::0;-1:-1:-1;;;51132:85:0;;11450:2:1;51132:85:0::1;::::0;::::1;11432:21:1::0;11489:2;11469:18;;;11462:30;11528:34;11508:18;;;11501:62;-1:-1:-1;;;11579:18:1;;;11572:42;11631:19;;51132:85:0::1;11422:234:1::0;51132:85:0::1;51267:16;::::0;51233:51:::1;::::0;51257:8;;51233:51:::1;::::0;;;::::1;51295:16;:27:::0;50935:395::o;46413:948::-;26185:6;;-1:-1:-1;;;;;26185:6:0;561:10;26185:22;26177:67;;;;-1:-1:-1;;;26177:67:0;;;;;;;:::i;:::-;46524:15:::1;::::0;-1:-1:-1;;;;;46502:38:0;;::::1;46524:15:::0;::::1;46502:38;;46494:96;;;::::0;-1:-1:-1;;;46494:96:0;;17072:2:1;46494:96:0::1;::::0;::::1;17054:21:1::0;17111:2;17091:18;;;17084:30;17150:34;17130:18;;;17123:62;-1:-1:-1;;;17201:18:1;;;17194:43;17254:19;;46494:96:0::1;17044:235:1::0;46494:96:0::1;46603:34;46664:10;46603:73;;46735:4;-1:-1:-1::0;;;;;46697:43:0::1;:18;-1:-1:-1::0;;;;;46697:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;46697:43:0::1;;46689:116;;;::::0;-1:-1:-1;;;46689:116:0;;12623:2:1;46689:116:0::1;::::0;::::1;12605:21:1::0;12662:2;12642:18;;;12635:30;12701:34;12681:18;;;12674:62;12772:30;12752:18;;;12745:58;12820:19;;46689:116:0::1;12595:250:1::0;46689:116:0::1;46818:68;::::0;-1:-1:-1;;;46818:68:0;;-1:-1:-1;;;;;46818:39:0;::::1;:68;::::0;::::1;5162:51:1::0;;;46818:39:0;::::1;::::0;5135:18:1;;46818:68:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;46897:54:0::1;::::0;-1:-1:-1;;;46897:54:0;;46945:4:::1;46897:54;::::0;::::1;5162:51:1::0;-1:-1:-1;;;;;46897:39:0;::::1;::::0;-1:-1:-1;46897:39:0::1;::::0;-1:-1:-1;5135:18:1;;46897:54:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;46962:18;-1:-1:-1::0;;;;;46962:39:0::1;;47002:7;26038:6:::0;;-1:-1:-1;;;;;26038:6:0;;25973:79;47002:7:::1;46962:48;::::0;-1:-1:-1;;;;;;46962:48:0::1;::::0;;;;;;-1:-1:-1;;;;;5180:32:1;;;46962:48:0::1;::::0;::::1;5162:51:1::0;5135:18;;46962:48:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;47069:15:0::1;::::0;47021:65:::1;::::0;-1:-1:-1;;;47021:65:0;;-1:-1:-1;;;;;47069:15:0;;::::1;47021:65;::::0;::::1;5162:51:1::0;47021:39:0;;::::1;::::0;-1:-1:-1;47021:39:0::1;::::0;-1:-1:-1;5135:18:1;;47021:65:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;47097:63:0::1;::::0;-1:-1:-1;;;47097:63:0;;-1:-1:-1;;;;;47145:13:0::1;5180:32:1::0;;47097:63:0::1;::::0;::::1;5162:51:1::0;47097:39:0;::::1;::::0;-1:-1:-1;47097:39:0::1;::::0;-1:-1:-1;5135:18:1;;47097:63:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;47171:56:0::1;::::0;-1:-1:-1;;;47171:56:0;;47219:6:::1;47171:56;::::0;::::1;5162:51:1::0;-1:-1:-1;;;;;47171:39:0;::::1;::::0;-1:-1:-1;47171:39:0::1;::::0;-1:-1:-1;5135:18:1;;47171:56:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;47287:15:0::1;::::0;47245:59:::1;::::0;-1:-1:-1;;;;;47287:15:0;;::::1;::::0;-1:-1:-1;47245:59:0;;::::1;::::0;-1:-1:-1;47245:59:0::1;::::0;47287:15:::1;::::0;47245:59:::1;47317:15;:36:::0;;-1:-1:-1;;;;;;47317:36:0::1;-1:-1:-1::0;;;;;47317:36:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;46413:948:0:o;47877:112::-;26185:6;;-1:-1:-1;;;;;26185:6:0;561:10;26185:22;26177:67;;;;-1:-1:-1;;;26177:67:0;;;;;;;:::i;:::-;47932:13:::1;:20:::0;;-1:-1:-1;;47963:18:0;;;;;47877:112::o;48089:101::-;26185:6;;-1:-1:-1;;;;;26185:6:0;561:10;26185:22;26177:67;;;;-1:-1:-1;;;26177:67:0;;;;;;;:::i;:::-;48161:11:::1;:21:::0;;;::::1;;;;-1:-1:-1::0;;48161:21:0;;::::1;::::0;;;::::1;::::0;;48089:101::o;9699:104::-;9755:13;9788:7;9781:14;;;;;:::i;49919:256::-;26185:6;;-1:-1:-1;;;;;26185:6:0;561:10;26185:22;26177:67;;;;-1:-1:-1;;;26177:67:0;;;;;;;:::i;:::-;50026:13:::1;-1:-1:-1::0;;;;;50018:21:0::1;:4;-1:-1:-1::0;;;;;50018:21:0::1;;;50010:103;;;::::0;-1:-1:-1;;;50010:103:0;;9407:2:1;50010:103:0::1;::::0;::::1;9389:21:1::0;9446:2;9426:18;;;9419:30;9485:34;9465:18;;;9458:62;9556:34;9536:18;;;9529:62;-1:-1:-1;;;9607:19:1;;;9600:36;9653:19;;50010:103:0::1;9379:299:1::0;50010:103:0::1;50126:41;50155:4;50161:5;50126:28;:41::i;:::-;49919:256:::0;;:::o;51470:108::-;51543:15;;:27;;;-1:-1:-1;;;51543:27:0;;;;51516:7;;-1:-1:-1;;;;;51543:15:0;;:25;;:27;;;;;;;;;;;;;;:15;:27;;;;;;;;;;13782:269;13875:4;13892:129;561:10;13915:7;13924:96;13963:15;13924:96;;;;;;;;;;;;;;;;;561:10;13924:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;13924:34:0;;;;;;;;;;;;:38;:96::i;51868:147::-;51961:15;;:47;;-1:-1:-1;;;51961:47:0;;-1:-1:-1;;;;;5180:32:1;;;51961:47:0;;;5162:51:1;51937:7:0;;51961:15;;:38;;5135:18:1;;51961:47:0;5117:102:1;11110:175:0;11196:4;11213:42;561:10;11237:9;11248:6;11213:9;:42::i;50470:260::-;26185:6;;-1:-1:-1;;;;;26185:6:0;561:10;26185:22;26177:67;;;;-1:-1:-1;;;26177:67:0;;;;;;;:::i;:::-;50559:41:::1;50575:18;50595:4;50559:15;:41::i;:::-;50659:15;::::0;50616:59:::1;::::0;-1:-1:-1;;;;;50659:15:0;;::::1;::::0;50616:59;::::1;::::0;::::1;::::0;50659:15:::1;::::0;50616:59:::1;50686:15;:36:::0;;-1:-1:-1;;;;;;50686:36:0::1;-1:-1:-1::0;;;;;50686:36:0;;;::::1;::::0;;;::::1;::::0;;50470:260::o;52162:318::-;52437:15;;:35;;-1:-1:-1;;;52437:35:0;;-1:-1:-1;;;;;5180:32:1;;;52437:35:0;;;5162:51:1;52258:7:0;;;;;;;;;;;;;;;;52437:15;;;:26;;5135:18:1;;52437:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52430:42;;;;;;;;;;;;;;;;52162:318;;;;;;;;;:::o;49727:184::-;26185:6;;-1:-1:-1;;;;;26185:6:0;561:10;26185:22;26177:67;;;;-1:-1:-1;;;26177:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49812:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;49812:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;49869:34;;7561:41:1;;;49869:34:0::1;::::0;7534:18:1;49869:34:0::1;;;;;;;49727:184:::0;;:::o;47693:126::-;26185:6;;-1:-1:-1;;;;;26185:6:0;561:10;26185:22;26177:67;;;;-1:-1:-1;;;26177:67:0;;;;;;;:::i;:::-;47768:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;47768:43:0;;-1:-1:-1;;;;;5180:32:1;;;47768:43:0::1;::::0;::::1;5162:51:1::0;47768:15:0;;::::1;::::0;:34:::1;::::0;5135:18:1;;47768:43:0::1;5117:102:1::0;48744:427:0;26185:6;;-1:-1:-1;;;;;26185:6:0;561:10;26185:22;26177:67;;;;-1:-1:-1;;;26177:67:0;;;;;;;:::i;:::-;48882:12:::1;:28:::0;;;48921:10:::1;:24:::0;;;48956:12:::1;:28:::0;;;48995:10:::1;:24:::0;;;49008:11;48971:13;49042:25:::1;48934:11:::0;48897:13;49042:25:::1;:::i;:::-;:40;;;;:::i;:::-;:53;;;;:::i;:::-;49030:9;:65:::0;;;49127:2:::1;-1:-1:-1::0;49114:15:0::1;49106:57;;;::::0;-1:-1:-1;;;49106:57:0;;13895:2:1;49106:57:0::1;::::0;::::1;13877:21:1::0;13934:2;13914:18;;;13907:30;13973:31;13953:18;;;13946:59;14022:18;;49106:57:0::1;13867:179:1::0;49106:57:0::1;48744:427:::0;;;;:::o;48260:476::-;26185:6;;48341:4;;-1:-1:-1;;;;;26185:6:0;561:10;26185:22;26177:67;;;;-1:-1:-1;;;26177:67:0;;;;;;;:::i;:::-;10687:12;;48364:9:::1;:25;48356:85;;;::::0;-1:-1:-1;;;48356:85:0;;15423:2:1;48356:85:0::1;::::0;::::1;15405:21:1::0;15462:2;15442:18;;;15435:30;15501:34;15481:18;;;15474:62;-1:-1:-1;;;15552:18:1;;;15545:45;15607:19;;48356:85:0::1;15395:237:1::0;48356:85:0::1;48492:6;48472:13;10687:12:::0;;;10599:108;48472:13:::1;:17;::::0;48488:1:::1;48472:17;:::i;:::-;:26;;;;:::i;:::-;48459:9;:39;;48451:105;;;::::0;-1:-1:-1;;;48451:105:0;;13052:2:1;48451:105:0::1;::::0;::::1;13034:21:1::0;13091:2;13071:18;;;13064:30;13130:34;13110:18;;;13103:62;-1:-1:-1;;;13181:18:1;;;13174:51;13242:19;;48451:105:0::1;13024:243:1::0;48451:105:0::1;48607:4;48587:13;10687:12:::0;;;10599:108;48587:13:::1;:17;::::0;48603:1:::1;48587:17;:::i;:::-;:24;;;;:::i;:::-;48574:9;:37;;48566:102;;;::::0;-1:-1:-1;;;48566:102:0;;13474:2:1;48566:102:0::1;::::0;::::1;13456:21:1::0;13513:2;13493:18;;;13486:30;13552:34;13532:18;;;13525:62;-1:-1:-1;;;13603:18:1;;;13596:50;13663:19;;48566:102:0::1;13446:242:1::0;48566:102:0::1;-1:-1:-1::0;48678:18:0::1;:30:::0;48725:4:::1;::::0;48260:476::o;50742:185::-;26185:6;;-1:-1:-1;;;;;26185:6:0;561:10;26185:22;26177:67;;;;-1:-1:-1;;;26177:67:0;;;;;;;:::i;:::-;50831:41:::1;50847:18;50867:4;50831:15;:41::i;:::-;50883:15;:36:::0;;-1:-1:-1;;;;;;50883:36:0::1;-1:-1:-1::0;;;;;50883:36:0;;;::::1;::::0;;;::::1;::::0;;50742:185::o;53187:126::-;53266:15;;:39;;;-1:-1:-1;;;53266:39:0;;;;53242:7;;-1:-1:-1;;;;;53266:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;51338:124;26185:6;;-1:-1:-1;;;;;26185:6:0;561:10;26185:22;26177:67;;;;-1:-1:-1;;;26177:67:0;;;;;;;:::i;:::-;51412:15:::1;::::0;:42:::1;::::0;-1:-1:-1;;;51412:42:0;;::::1;::::0;::::1;17430:25:1::0;;;-1:-1:-1;;;;;51412:15:0;;::::1;::::0;:31:::1;::::0;17403:18:1;;51412:42:0::1;17385:76:1::0;52485:325:0;52762:15;;:40;;-1:-1:-1;;;52762:40:0;;;;;17430:25:1;;;52586:7:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52762:15:0;;;;:33;;17403:18:1;;52762:40:0;17385:76:1;26918:244:0;26185:6;;-1:-1:-1;;;;;26185:6:0;561:10;26185:22;26177:67;;;;-1:-1:-1;;;26177:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27007:22:0;::::1;26999:73;;;::::0;-1:-1:-1;;;26999:73:0;;10640:2:1;26999:73:0::1;::::0;::::1;10622:21:1::0;10679:2;10659:18;;;10652:30;10718:34;10698:18;;;10691:62;-1:-1:-1;;;10769:18:1;;;10762:36;10815:19;;26999:73:0::1;10612:228:1::0;26999:73:0::1;27109:6;::::0;27088:38:::1;::::0;-1:-1:-1;;;;;27088:38:0;;::::1;::::0;27109:6:::1;::::0;27088:38:::1;::::0;27109:6:::1;::::0;27088:38:::1;27137:6;:17:::0;;-1:-1:-1;;;;;;27137:17:0::1;-1:-1:-1::0;;;;;27137:17:0;;;::::1;::::0;;;::::1;::::0;;26918:244::o;59297:527::-;26185:6;;-1:-1:-1;;;;;26185:6:0;561:10;26185:22;26177:67;;;;-1:-1:-1;;;26177:67:0;;;;;;;:::i;:::-;59456:16:::1;::::0;;59470:1:::1;59456:16:::0;;;;;::::1;::::0;;59432:21:::1;::::0;59456:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;59493:15:0::1;::::0;:22:::1;::::0;;-1:-1:-1;;;59493:22:0;;;;59432:40;;-1:-1:-1;;;;;;59493:15:0;;::::1;::::0;:20:::1;::::0;-1:-1:-1;59493:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:15;:22;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59483:4;59488:1;59483:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1::0;;;;;59483:32:0::1;;;-1:-1:-1::0;;;;;59483:32:0::1;;;::::0;::::1;59544:4;59526;59531:1;59526:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;59526:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;:23;59588:15:::1;::::0;:228:::1;::::0;-1:-1:-1;;;59588:228:0;;:15;::::1;::::0;:66:::1;::::0;59662:14;;59588:228:::1;::::0;:15:::1;::::0;59741:4;;59768:6:::1;::::0;59790:15:::1;::::0;59588:228:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;59363:461;59297:527:::0;:::o;21017:181::-;21075:7;;21107:5;21111:1;21107;:5;:::i;:::-;21095:17;;21136:1;21131;:6;;21123:46;;;;-1:-1:-1;;;21123:46:0;;11863:2:1;21123:46:0;;;11845:21:1;11902:2;11882:18;;;11875:30;11941:29;11921:18;;;11914:57;11988:18;;21123:46:0;11835:177:1;21123:46:0;21189:1;21017:181;-1:-1:-1;;;21017:181:0:o;16968:380::-;-1:-1:-1;;;;;17104:19:0;;17096:68;;;;-1:-1:-1;;;17096:68:0;;16245:2:1;17096:68:0;;;16227:21:1;16284:2;16264:18;;;16257:30;16323:34;16303:18;;;16296:62;-1:-1:-1;;;16374:18:1;;;16367:34;16418:19;;17096:68:0;16217:226:1;17096:68:0;-1:-1:-1;;;;;17183:21:0;;17175:68;;;;-1:-1:-1;;;17175:68:0;;11047:2:1;17175:68:0;;;11029:21:1;11086:2;11066:18;;;11059:30;11125:34;11105:18;;;11098:62;-1:-1:-1;;;11176:18:1;;;11169:32;11218:19;;17175:68:0;11019:224:1;17175:68:0;-1:-1:-1;;;;;17256:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;17308:32;;17430:25:1;;;17308:32:0;;17403:18:1;17308:32:0;;;;;;;;16968:380;;;:::o;53605:2436::-;-1:-1:-1;;;;;53737:18:0;;53729:68;;;;-1:-1:-1;;;53729:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;53816:16:0;;53808:64;;;;-1:-1:-1;;;53808:64:0;;;;;;;:::i;:::-;53897:11;53894:92;;53925:28;53941:4;53947:2;53951:1;53925:15;:28::i;:::-;53605:2436;;;:::o;53894:92::-;54002:13;;;;53998:95;;26038:6;;-1:-1:-1;;;;;54039:15:0;;;26038:6;;54039:15;54031:50;;;;-1:-1:-1;;;54031:50:0;;10289:2:1;54031:50:0;;;10271:21:1;10328:2;10308:18;;;10301:30;-1:-1:-1;;;10347:18:1;;;10340:52;10409:18;;54031:50:0;10261:172:1;54031:50:0;54156:4;54107:28;10871:18;;;;;;;;;;;54222;;54198:42;;;;;;;54271:35;;-1:-1:-1;54295:11:0;;;;;;;54271:35;:61;;;;-1:-1:-1;54324:8:0;;-1:-1:-1;;;54324:8:0;;;;54323:9;54271:61;:110;;;;-1:-1:-1;;;;;;54350:31:0;;;;;;:25;:31;;;;;;;;54349:32;54271:110;:153;;;;-1:-1:-1;;;;;;54399:25:0;;;;;;:19;:25;;;;;;;;54398:26;54271:153;:194;;;;-1:-1:-1;;;;;;54442:23:0;;;;;;:19;:23;;;;;;;;54441:24;54271:194;54253:613;;;54492:8;:15;;-1:-1:-1;;;;54492:15:0;-1:-1:-1;;;54492:15:0;;;54539:9;;:13;54536:286;;54572:18;54617;;54638:1;54617:22;;;;:::i;:::-;54593:20;:46;;:94;;54667:20;54593:94;;;54642:18;;:22;;54663:1;54642:22;:::i;:::-;54572:115;;54786:20;54795:10;54786:8;:20::i;:::-;54553:269;54536:286;54838:8;:16;;-1:-1:-1;;;;54838:16:0;;;54253:613;54894:8;;-1:-1:-1;;;;;55003:25:0;;54878:12;55003:25;;;:19;:25;;;;;;54894:8;-1:-1:-1;;;54894:8:0;;;;;54893:9;;55003:25;;:52;;-1:-1:-1;;;;;;55032:23:0;;;;;;:19;:23;;;;;;;;55003:52;55000:99;;;-1:-1:-1;55082:5:0;55000:99;55114:7;55111:391;;;55135:12;55150:30;55176:3;55150:21;55161:9;;55150:6;:10;;:21;;;;:::i;:::-;:25;;:30::i;:::-;-1:-1:-1;;;;;55209:29:0;;;;;;:25;:29;;;;;;55135:45;;-1:-1:-1;55209:29:0;;55206:180;;;55266:40;55302:3;55266:31;55275:21;;55266:4;:8;;:31;;;;:::i;:40::-;55259:47;;55206:180;55400:42;55416:4;55430;55437;55400:15;:42::i;:::-;55474:16;:6;55485:4;55474:10;:16::i;:::-;55465:25;;55123:379;55111:391;55514:33;55530:4;55536:2;55540:6;55514:15;:33::i;:::-;55564:15;;-1:-1:-1;;;;;55564:15:0;:26;55599:4;55606:15;55599:4;-1:-1:-1;;;;;10871:18:0;10844:7;10871:18;;;;;;;;;;;;10770:127;55606:15;55564:58;;-1:-1:-1;;;;;;55564:58:0;;;;;;;-1:-1:-1;;;;;5737:32:1;;;55564:58:0;;;5719:51:1;5786:18;;;5779:34;5692:18;;55564:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55560:74;55648:15;;-1:-1:-1;;;;;55648:15:0;:26;55683:2;55688:13;55683:2;-1:-1:-1;;;;;10871:18:0;10844:7;10871:18;;;;;;;;;;;;10770:127;55688:13;55648:54;;-1:-1:-1;;;;;;55648:54:0;;;;;;;-1:-1:-1;;;;;5737:32:1;;;55648:54:0;;;5719:51:1;5786:18;;;5779:34;5692:18;;55648:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55644:70;55730:8;;-1:-1:-1;;;55730:8:0;;;;55726:308;;55763:16;;55794:15;;:28;;-1:-1:-1;;;;;;55794:28:0;;;;;17430:25:1;;;-1:-1:-1;;;;;55794:15:0;;;;:23;;17403:18:1;;55794:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55794:28:0;;;;;;;;-1:-1:-1;;55794:28:0;;;;;;;;;;;;:::i;:::-;;;55790:233;;;;;55911:86;;;18537:25:1;;;18593:2;18578:18;;18571:34;;;18621:18;;;18614:34;;;18679:2;18664:18;;18657:34;;;55987:9:0;;55976:4;;55911:86;;18524:3:1;18509:19;55911:86:0;;;;;;;55823:184;;;55740:294;55726:308;53718:2323;;;53605:2436;;;:::o;21920:192::-;22006:7;22042:12;22034:6;;;;22026:29;;;;-1:-1:-1;;;22026:29:0;;;;;;;;:::i;:::-;-1:-1:-1;22066:9:0;22078:5;22082:1;22078;:5;:::i;:::-;22066:17;21920:192;-1:-1:-1;;;;;21920:192:0:o;50183:279::-;-1:-1:-1;;;;;50266:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;50266:39:0;;;;;;;;;;;;50318:79;;50343:15;;:42;;-1:-1:-1;;;50343:42:0;;-1:-1:-1;;;;;5180:32:1;;;50343:42:0;;;5162:51:1;50343:15:0;;;;:36;;5135:18:1;;50343:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50318:79;50414:40;;;;;;-1:-1:-1;;;;;50414:40:0;;;;;;;;50183:279;;:::o;14541:573::-;-1:-1:-1;;;;;14681:20:0;;14673:70;;;;-1:-1:-1;;;14673:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14762:23:0;;14754:71;;;;-1:-1:-1;;;14754:71:0;;;;;;;:::i;:::-;14918;14940:6;14918:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14918:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;14898:17:0;;;:9;:17;;;;;;;;;;;:91;;;;15023:20;;;;;;;:32;;15048:6;15023:24;:32::i;:::-;-1:-1:-1;;;;;15000:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;15071:35;17430:25:1;;;15000:20:0;;15071:35;;;;;;17403:18:1;15071:35:0;17385:76:1;57692:1498:0;57760:23;57786:60;57844:1;57786:53;57829:9;;57786:38;57811:12;;57786:20;:24;;:38;;;;:::i;:60::-;57760:86;-1:-1:-1;57857:20:0;57880:41;:20;57760:86;57880:24;:41::i;:::-;57958:16;;;57972:1;57958:16;;;;;;;;57857:64;;-1:-1:-1;57934:21:0;;57958:16;;;;;;;;;;;;-1:-1:-1;57958:16:0;57934:40;;58003:4;57985;57990:1;57985:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;57985:23:0;;;:7;;;;;;;;;;:23;;;;58029:15;;:22;;;-1:-1:-1;;;58029:22:0;;;;:15;;;;;:20;;:22;;;;;57985:7;;58029:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58019:4;58024:1;58019:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;58019:32:0;;;:7;;;;;;;;;;;:32;58088:21;58122:30;58139:12;58122:16;:30::i;:::-;58165:17;58185:40;:21;58211:13;58185:25;:40::i;:::-;58165:60;;58238:19;58260:34;58274:19;58291:1;58274:12;;:16;;:19;;;;:::i;:::-;58260:9;;;:13;:34::i;:::-;58238:56;;58315:26;58344:51;58393:1;58344:44;58376:11;58344:27;58358:12;;58344:9;:13;;:27;;;;:::i;:51::-;58315:80;;58406:27;58436:42;58466:11;58436:25;58450:10;;58436:9;:13;;:25;;;;:::i;:42::-;58406:72;;58489:26;58518:44;58550:11;58518:27;58532:12;;58518:9;:13;;:27;;;;:::i;:44::-;58489:73;;58583:42;58605:19;58583:21;:42::i;:::-;58669:38;;-1:-1:-1;;;58669:38:0;;58701:4;58669:38;;;5162:51:1;58646:20:0;;58676:5;-1:-1:-1;;;;;58669:23:0;;;;5135:18:1;;58669:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58764:15;;58733:62;;-1:-1:-1;;;58733:62:0;;-1:-1:-1;;;;;58764:15:0;;;58733:62;;;5719:51:1;5786:18;;;5779:34;;;58646:61:0;;-1:-1:-1;58718:12:0;;58740:5;58733:22;;;;;;5692:18:1;;58733:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58718:77;;58820:7;58816:162;;;58844:15;;:54;;-1:-1:-1;;;58844:54:0;;;;;17430:25:1;;;-1:-1:-1;;;;;58844:15:0;;;;:40;;17403:18:1;;58844:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;58918:48:0;;;18227:25:1;;;18283:2;18268:18;;18261:34;;;58918:48:0;;-1:-1:-1;18200:18:1;;-1:-1:-1;58918:48:0;;;;;;;58816:162;59019:15;;59011:60;;-1:-1:-1;;;;;59019:15:0;;;;59048:18;;59011:60;;;;59048:18;59019:15;59011:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58998:73:0;;-1:-1:-1;;59087:19:0;;59084:99;;59122:49;59135:15;59152:18;59122:12;:49::i;:::-;57749:1441;;;;;;;;;;;57692:1498;:::o;22371:471::-;22429:7;22674:6;22670:47;;-1:-1:-1;22704:1:0;22697:8;;22670:47;22729:9;22741:5;22745:1;22741;:5;:::i;:::-;22729:17;-1:-1:-1;22774:1:0;22765:5;22769:1;22729:17;22765:5;:::i;:::-;:10;22757:56;;;;-1:-1:-1;;;22757:56:0;;14253:2:1;22757:56:0;;;14235:21:1;14292:2;14272:18;;;14265:30;14331:34;14311:18;;;14304:62;-1:-1:-1;;;14382:18:1;;;14375:31;14423:19;;22757:56:0;14225:223:1;23318:132:0;23376:7;23403:39;23407:1;23410;23403:39;;;;;;;;;;;;;;;;;:3;:39::i;21481:136::-;21539:7;21566:43;21570:1;21573;21566:43;;;;;;;;;;;;;;;;;:3;:43::i;56535:601::-;56687:16;;;56701:1;56687:16;;;;;;;;56663:21;;56687:16;;;;;;;;;;-1:-1:-1;56687:16:0;56663:40;;56732:4;56714;56719:1;56714:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;56714:23:0;;;:7;;;;;;;;;;:23;;;;56758:15;;:22;;;-1:-1:-1;;;56758:22:0;;;;:15;;;;;:20;;:22;;;;;56714:7;;56758:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56748:4;56753:1;56748:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;56748:32:0;;;:7;;;;;;;;;:32;56825:15;;56793:62;;56810:4;;56825:15;56843:11;56793:8;:62::i;:::-;56894:15;;:224;;-1:-1:-1;;;56894:224:0;;-1:-1:-1;;;;;56894:15:0;;;;:66;;:224;;56975:11;;56894:15;;57045:4;;57072;;57092:15;;56894:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56049:474;56121:13;;56118:398;;56174:16;;;56188:1;56174:16;;;;;;;;56150:21;;56174:16;;;;;;;;-1:-1:-1;;56215:15:0;;:22;;;-1:-1:-1;;;56215:22:0;;;;56150:40;;-1:-1:-1;;;;;;56215:15:0;;;;:20;;-1:-1:-1;56215:22:0;;;;;;;;;;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56205:4;56210:1;56205:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;56205:32:0;;;-1:-1:-1;;;;;56205:32:0;;;;;56262:5;56252:4;56257:1;56252:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;56252:15:0;;;:7;;;;;;;;;:15;56296;;:208;;-1:-1:-1;;;56296:208:0;;:15;;;:66;;56370:9;;56296:208;;:15;;56419:4;;56450;;56474:15;;56296:208;;;:::i;57148:532::-;57328:15;;57296:62;;57313:4;;-1:-1:-1;;;;;57328:15:0;57346:11;57296:8;:62::i;:::-;57401:15;;57613;;57401:269;;-1:-1:-1;;;57401:269:0;;57473:4;57401:269;;;7150:34:1;7200:18;;;7193:34;;;57401:15:0;7243:18:1;;;7236:34;;;7286:18;;;7279:34;-1:-1:-1;;;;;57613:15:0;;;7329:19:1;;;7322:44;57644:15:0;7382:19:1;;;7375:35;57401:15:0;;;:31;;57440:9;;7084:19:1;;57401:269:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;23946:278::-;24032:7;24067:12;24060:5;24052:28;;;;-1:-1:-1;;;24052:28:0;;;;;;;;:::i;:::-;-1:-1:-1;24091:9:0;24103:5;24107:1;24103;:5;:::i;14:247:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:2;;;142:1;139;132:12;94:2;181:9;168:23;200:31;225:5;200:31;:::i;266:251::-;336:6;389:2;377:9;368:7;364:23;360:32;357:2;;;405:1;402;395:12;357:2;437:9;431:16;456:31;481:5;456:31;:::i;522:388::-;590:6;598;651:2;639:9;630:7;626:23;622:32;619:2;;;667:1;664;657:12;619:2;706:9;693:23;725:31;750:5;725:31;:::i;:::-;775:5;-1:-1:-1;832:2:1;817:18;;804:32;845:33;804:32;845:33;:::i;:::-;897:7;887:17;;;609:301;;;;;:::o;915:456::-;992:6;1000;1008;1061:2;1049:9;1040:7;1036:23;1032:32;1029:2;;;1077:1;1074;1067:12;1029:2;1116:9;1103:23;1135:31;1160:5;1135:31;:::i;:::-;1185:5;-1:-1:-1;1242:2:1;1227:18;;1214:32;1255:33;1214:32;1255:33;:::i;:::-;1019:352;;1307:7;;-1:-1:-1;;;1361:2:1;1346:18;;;;1333:32;;1019:352::o;1376:382::-;1441:6;1449;1502:2;1490:9;1481:7;1477:23;1473:32;1470:2;;;1518:1;1515;1508:12;1470:2;1557:9;1544:23;1576:31;1601:5;1576:31;:::i;:::-;1626:5;-1:-1:-1;1683:2:1;1668:18;;1655:32;1696:30;1655:32;1696:30;:::i;1763:681::-;1894:6;1902;1910;1918;1926;1934;1942;1950;2003:3;1991:9;1982:7;1978:23;1974:33;1971:2;;;2020:1;2017;2010:12;1971:2;2052:9;2046:16;2071:31;2096:5;2071:31;:::i;:::-;2121:5;2111:15;;;2166:2;2155:9;2151:18;2145:25;2135:35;;2210:2;2199:9;2195:18;2189:25;2179:35;;2254:2;2243:9;2239:18;2233:25;2223:35;;2298:3;2287:9;2283:19;2277:26;2267:36;;2343:3;2332:9;2328:19;2322:26;2312:36;;2388:3;2377:9;2373:19;2367:26;2357:36;;2433:3;2422:9;2418:19;2412:26;2402:36;;1961:483;;;;;;;;;;;:::o;2449:315::-;2517:6;2525;2578:2;2566:9;2557:7;2553:23;2549:32;2546:2;;;2594:1;2591;2584:12;2546:2;2633:9;2620:23;2652:31;2677:5;2652:31;:::i;:::-;2702:5;2754:2;2739:18;;;;2726:32;;-1:-1:-1;;;2536:228:1:o;2769:241::-;2825:6;2878:2;2866:9;2857:7;2853:23;2849:32;2846:2;;;2894:1;2891;2884:12;2846:2;2933:9;2920:23;2952:28;2974:5;2952:28;:::i;3015:245::-;3082:6;3135:2;3123:9;3114:7;3110:23;3106:32;3103:2;;;3151:1;3148;3141:12;3103:2;3183:9;3177:16;3202:28;3224:5;3202:28;:::i;3265:180::-;3324:6;3377:2;3365:9;3356:7;3352:23;3348:32;3345:2;;;3393:1;3390;3383:12;3345:2;-1:-1:-1;3416:23:1;;3335:110;-1:-1:-1;3335:110:1:o;3450:184::-;3520:6;3573:2;3561:9;3552:7;3548:23;3544:32;3541:2;;;3589:1;3586;3579:12;3541:2;-1:-1:-1;3612:16:1;;3531:103;-1:-1:-1;3531:103:1:o;3639:306::-;3727:6;3735;3743;3796:2;3784:9;3775:7;3771:23;3767:32;3764:2;;;3812:1;3809;3802:12;3764:2;3841:9;3835:16;3825:26;;3891:2;3880:9;3876:18;3870:25;3860:35;;3935:2;3924:9;3920:18;3914:25;3904:35;;3754:191;;;;;:::o;3950:385::-;4036:6;4044;4052;4060;4113:3;4101:9;4092:7;4088:23;4084:33;4081:2;;;4130:1;4127;4120:12;4081:2;-1:-1:-1;;4153:23:1;;;4223:2;4208:18;;4195:32;;-1:-1:-1;4274:2:1;4259:18;;4246:32;;4325:2;4310:18;4297:32;;-1:-1:-1;4071:264:1;-1:-1:-1;4071:264:1:o;4340:461::-;4393:3;4431:5;4425:12;4458:6;4453:3;4446:19;4484:4;4513:2;4508:3;4504:12;4497:19;;4550:2;4543:5;4539:14;4571:1;4581:195;4595:6;4592:1;4589:13;4581:195;;;4660:13;;-1:-1:-1;;;;;4656:39:1;4644:52;;4716:12;;;;4751:15;;;;4692:1;4610:9;4581:195;;;-1:-1:-1;4792:3:1;;4401:400;-1:-1:-1;;;;;4401:400:1:o;8088:510::-;8359:6;8348:9;8341:25;8402:3;8397:2;8386:9;8382:18;8375:31;8322:4;8423:57;8475:3;8464:9;8460:19;8452:6;8423:57;:::i;:::-;-1:-1:-1;;;;;8516:32:1;;;;8511:2;8496:18;;8489:60;-1:-1:-1;8580:2:1;8565:18;8558:34;8415:65;8331:267;-1:-1:-1;;8331:267:1:o;8603:597::-;8715:4;8744:2;8773;8762:9;8755:21;8805:6;8799:13;8848:6;8843:2;8832:9;8828:18;8821:34;8873:1;8883:140;8897:6;8894:1;8891:13;8883:140;;;8992:14;;;8988:23;;8982:30;8958:17;;;8977:2;8954:26;8947:66;8912:10;;8883:140;;;9041:6;9038:1;9035:13;9032:2;;;9111:1;9106:2;9097:6;9086:9;9082:22;9078:31;9071:42;9032:2;-1:-1:-1;9184:2:1;9163:15;-1:-1:-1;;9159:29:1;9144:45;;;;9191:2;9140:54;;8724:476;-1:-1:-1;;;8724:476:1:o;9683:399::-;9885:2;9867:21;;;9924:2;9904:18;;;9897:30;9963:34;9958:2;9943:18;;9936:62;-1:-1:-1;;;10029:2:1;10014:18;;10007:33;10072:3;10057:19;;9857:225::o;14453:356::-;14655:2;14637:21;;;14674:18;;;14667:30;14733:34;14728:2;14713:18;;14706:62;14800:2;14785:18;;14627:182::o;15637:401::-;15839:2;15821:21;;;15878:2;15858:18;;;15851:30;15917:34;15912:2;15897:18;;15890:62;-1:-1:-1;;;15983:2:1;15968:18;;15961:35;16028:3;16013:19;;15811:227::o;17466:582::-;17765:6;17754:9;17747:25;17808:6;17803:2;17792:9;17788:18;17781:34;17851:3;17846:2;17835:9;17831:18;17824:31;17728:4;17872:57;17924:3;17913:9;17909:19;17901:6;17872:57;:::i;:::-;-1:-1:-1;;;;;17965:32:1;;;;17960:2;17945:18;;17938:60;-1:-1:-1;18029:3:1;18014:19;18007:35;17864:65;17737:311;-1:-1:-1;;;17737:311:1:o;18891:128::-;18931:3;18962:1;18958:6;18955:1;18952:13;18949:2;;;18968:18;;:::i;:::-;-1:-1:-1;19004:9:1;;18939:80::o;19024:217::-;19064:1;19090;19080:2;;19134:10;19129:3;19125:20;19122:1;19115:31;19169:4;19166:1;19159:15;19197:4;19194:1;19187:15;19080:2;-1:-1:-1;19226:9:1;;19070:171::o;19246:168::-;19286:7;19352:1;19348;19344:6;19340:14;19337:1;19334:21;19329:1;19322:9;19315:17;19311:45;19308:2;;;19359:18;;:::i;:::-;-1:-1:-1;19399:9:1;;19298:116::o;19419:125::-;19459:4;19487:1;19484;19481:8;19478:2;;;19492:18;;:::i;:::-;-1:-1:-1;19529:9:1;;19468:76::o;19549:380::-;19628:1;19624:12;;;;19671;;;19692:2;;19746:4;19738:6;19734:17;19724:27;;19692:2;19799;19791:6;19788:14;19768:18;19765:38;19762:2;;;19845:10;19840:3;19836:20;19833:1;19826:31;19880:4;19877:1;19870:15;19908:4;19905:1;19898:15;19762:2;;19604:325;;;:::o;19934:127::-;19995:10;19990:3;19986:20;19983:1;19976:31;20026:4;20023:1;20016:15;20050:4;20047:1;20040:15;20066:127;20127:10;20122:3;20118:20;20115:1;20108:31;20158:4;20155:1;20148:15;20182:4;20179:1;20172:15;20330:131;-1:-1:-1;;;;;20405:31:1;;20395:42;;20385:2;;20451:1;20448;20441:12;20466:118;20552:5;20545:13;20538:21;20531:5;20528:32;20518:2;;20574:1;20571;20564:12

Swarm Source

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