Contract 0x0cAE6c43fe2f43757a767Df90cf5054280110F3e 6

 
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x51c47cc9aad56189d4cc18d85fef5835cbcaa2d400387fb44eb8d1fab0a81ae7Approve131552462021-12-03 9:18:3616 mins ago0x2bfb4a93c94125798a5241b758b06896d85b7903 IN  SafeAffinity: AFFINITY Token0 BNB0.00022355
0xa8a18266505063e92282c2c68cbc18e110aa9ab3a176617b47805959f9613e78Approve131547512021-12-03 8:52:2542 mins ago0x2ded6a9011a6beff7836d908ea9e68d35a71694b IN  SafeAffinity: AFFINITY Token0 BNB0.00027006
0xaacf61877a01e1091b5d1105a5075b48be27cceb4a0933b6e7bb49c205c489edApprove131545292021-12-03 8:41:0953 mins ago0xaa706c5c2628fc0a09d870138c3cffbd0984c2fd IN  SafeAffinity: AFFINITY Token0 BNB0.00012749
0xfe8197a751a0a08a44ded71afb7ab0976d9c09731fce940583729101352487f1Claim Vault Divi...131544832021-12-03 8:38:3856 mins ago0xa7d67a0cbb5cade3956bc34aacc435847dc5ff6c IN  SafeAffinity: AFFINITY Token0 BNB0.00042975
0xcf3081efaaf06181f993d829ce07fdaa6760a03704d6202c23b63b43e3575722Approve131542512021-12-03 8:26:121 hr 8 mins ago0x8a2707dbc20bdea50b27d11bd954cb77aba682fe IN  SafeAffinity: AFFINITY Token0 BNB0.00014849
0xd89b54a6bbad23766aea22a99ee429421c81a6a41ca6e778af9264ea47f1ce5aApprove131541812021-12-03 8:22:421 hr 12 mins ago0xba1faa82fc3ca2cb76111513fe3d8461fde97f81 IN  SafeAffinity: AFFINITY Token0 BNB0.00022349
0x6baeabb410f927101feaef317ca2c9b9782d7688643ec2c65528938e3c82e284Approve131540862021-12-03 8:17:571 hr 17 mins ago0xaa706c5c2628fc0a09d870138c3cffbd0984c2fd IN  SafeAffinity: AFFINITY Token0 BNB0.00022349
0x16220a206bf1aa238c618a154474e094ac07ca5c4d802c3e3c38afe71e05b6e7Approve131539222021-12-03 8:09:451 hr 25 mins ago0x38b24f005d47a4eafdc429e1720d674cedd5b8e5 IN  SafeAffinity: AFFINITY Token0 BNB0.00027006
0x2ea01128088314ef984f42075389fec254a486d710f6e02c49803f7a2da8394eApprove131538382021-12-03 8:05:331 hr 29 mins ago0x1233f666975af41be88abf5e95344c884a88d618 IN  SafeAffinity: AFFINITY Token0 BNB0.00012755
0x01c6521b1513cbc574da1a2906c627943dec04e456b236bdb15b293415d7b1d5Approve131531692021-12-03 7:31:572 hrs 3 mins ago0x1233f666975af41be88abf5e95344c884a88d618 IN  SafeAffinity: AFFINITY Token0 BNB0.00022361
0x3c52b54159d5c3f51f657c646468ca1f92600d9f81df1b28f2c5fe6c163839a8Approve131528402021-12-03 7:15:102 hrs 19 mins ago0x5f0da386d8d70a30ae54b57c12fbc6b20a8318b6 IN  SafeAffinity: AFFINITY Token0 BNB0.00012761
0xb140b7ffa1dfdb8a6fd7261f1429d5f997fde8e2d2026fbe35cb5203445f005eApprove131525422021-12-03 7:00:152 hrs 34 mins ago0x9874e962c2ce5988107c093a23fb293ad75e8a0e IN  SafeAffinity: AFFINITY Token0 BNB0.00022505
0x7dbbd9dd7169ddc6289ba18c543c4a055fdba9b47ce5e0a9b79533f7249d3cfbClaim Vault Divi...131523752021-12-03 6:51:462 hrs 43 mins ago0x7b84008b1076888c55d44b2e6d885670d9c2344f IN  SafeAffinity: AFFINITY Token0 BNB0.000358125
0xc4e6d85d18c37a9a52254ddc6c7c9dbb70222c005b82c4f6cd47c020351ea455Approve131520332021-12-03 6:34:323 hrs ago0xa13bf74cd1241920536eedd5fd52cc6913ea3a5f IN  SafeAffinity: AFFINITY Token0 BNB0.00012755
0x9582b24a7bfc7b7568eba06d7ebbc31f826924f2199756c5ff2a648ed4ed2cd7Approve131519762021-12-03 6:31:393 hrs 3 mins ago0x774bce41bcc46e7b1be2ce55f8fb0576b370f775 IN  SafeAffinity: AFFINITY Token0 BNB0.000074065
0x5de086c7f0c59207696bc5edc0396ca2c0bb1d468d452cab1d9ae0581f9df7c3Approve131517882021-12-03 6:22:073 hrs 12 mins ago0x9078b77d674207eb93d97363ceaeaa96bb03b461 IN  SafeAffinity: AFFINITY Token0 BNB0.00022361
0x41e0d0bcef9b4d46ac89b6f76affa9c9b09aa319e577340ae069d02ea9e69dd3Approve131517492021-12-03 6:20:103 hrs 14 mins ago0x2d18598a5c3a2b0d1527872ea7434af9e80e75fa IN  SafeAffinity: AFFINITY Token0 BNB0.00012755
0xd1e9f0dfbc6ec79b0579c09aac24941961414f3f04373d65f293e12eeb88e722Approve131512872021-12-03 5:57:043 hrs 38 mins ago0x788555dda2a27b2e00b5a1e773c1f651690f59fa IN  SafeAffinity: AFFINITY Token0 BNB0.00022505
0x349fb64eaeb87fd64e1a9727d9bc6c6d4b85da6dc61f5bd1ffc05f28c88d7385Approve131512222021-12-03 5:53:493 hrs 41 mins ago0xbbde0cadf7372c0a29b93fd705b32d831fef7b37 IN  SafeAffinity: AFFINITY Token0 BNB0.00014855
0xa7788b33233c2321130e6b79d3af2ee65358328a3ebf2479dac79debb1ecfbe4Approve131510372021-12-03 5:44:333 hrs 50 mins ago0xff1f3aec1ee077bdc5a1c58127a4870fb344948f IN  SafeAffinity: AFFINITY Token0 BNB0.00012761
0x6dba5e09345289729161db2d72add136e963d12509058b07e6f7f7266d0583c8Approve131510242021-12-03 5:43:543 hrs 51 mins ago0x2d18598a5c3a2b0d1527872ea7434af9e80e75fa IN  SafeAffinity: AFFINITY Token0 BNB0.00022355
0xe32e8dce34eff00011b9ae75bde4183a4684eb00a1ff2c2f6744face4aeaf0b7Approve131509122021-12-03 5:38:183 hrs 56 mins ago0xa11001de3568c2ec5e398156dfd095367a0b7495 IN  SafeAffinity: AFFINITY Token0 BNB0.00022361
0x246175f8e884aa83860eb2b3a63543081defdac1e54794c41d0eedd10ba073d4Approve131508992021-12-03 5:37:393 hrs 57 mins ago0xa11001de3568c2ec5e398156dfd095367a0b7495 IN  SafeAffinity: AFFINITY Token0 BNB0.00022361
0xf0ee09262df0f5cd288a4629f06fbb57823fe95ee55a6381b5b6569b2a58403eApprove131508192021-12-03 5:33:394 hrs 1 min ago0x2d18598a5c3a2b0d1527872ea7434af9e80e75fa IN  SafeAffinity: AFFINITY Token0 BNB0.00012755
0x6f8e34e1d86dec536284f88a5e35a3ecbc2dd6d255a0fd77141890c372dac712Approve131508052021-12-03 5:32:544 hrs 2 mins ago0x779a2682c4b087914c88a3489963c21cacc6b3de IN  SafeAffinity: AFFINITY Token0 BNB0.0002950068
[ Download CSV Export 

OVERVIEW

Deflationary token on the BSC rewarding holders with both SafeEarn and SafeVault for holding, while also receiving Safemoon from those rewards tokens!

Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x4207c668482b941096188d74ba37387755362abadaaddf22d94172f27ba698ee131485952021-12-03 3:40:365 hrs 54 mins ago SafeAffinity: AFFINITY Token0x66cf1ef841908873c34e6bbf1586f4000b9fbb5d0.580892980743423203 BNB
0x4207c668482b941096188d74ba37387755362abadaaddf22d94172f27ba698ee131485952021-12-03 3:40:365 hrs 54 mins ago SafeAffinity: AFFINITY Token 0xb81b272fde39f698c69a67620aa9978724e770cd6.057883942038556267 BNB
0x4207c668482b941096188d74ba37387755362abadaaddf22d94172f27ba698ee131485952021-12-03 3:40:365 hrs 54 mins ago PancakeSwap: Router v2 SafeAffinity: AFFINITY Token6.63877692278197947 BNB
0xeac08c0850aac601b03bcd6b39a3f40d0990608ff798e7e959ade6964108bc53131445772021-12-03 0:18:239 hrs 16 mins ago SafeAffinity: AFFINITY Token0x66cf1ef841908873c34e6bbf1586f4000b9fbb5d0.583269470578159963 BNB
0xeac08c0850aac601b03bcd6b39a3f40d0990608ff798e7e959ade6964108bc53131445772021-12-03 0:18:239 hrs 16 mins ago SafeAffinity: AFFINITY Token 0xb81b272fde39f698c69a67620aa9978724e770cd6.082667336029382479 BNB
0x2c0f776d22647c6f3e5865a843fb1e4f12afe5d2e62245b5c240ac0e6eb05c70131443552021-12-03 0:07:179 hrs 27 mins ago PancakeSwap: Router v2 SafeAffinity: AFFINITY Token6.665936806607542442 BNB
0x503f605dbf219ced73caa4898316511b217171b0cdd988f1bc3631dedeb197c2131384582021-12-02 19:11:3414 hrs 23 mins ago SafeAffinity: AFFINITY Token0x66cf1ef841908873c34e6bbf1586f4000b9fbb5d0.607379079957078695 BNB
0x503f605dbf219ced73caa4898316511b217171b0cdd988f1bc3631dedeb197c2131384582021-12-02 19:11:3414 hrs 23 mins ago SafeAffinity: AFFINITY Token 0xb81b272fde39f698c69a67620aa9978724e770cd6.334096119552392106 BNB
0x503f605dbf219ced73caa4898316511b217171b0cdd988f1bc3631dedeb197c2131384582021-12-02 19:11:3414 hrs 23 mins ago PancakeSwap: Router v2 SafeAffinity: AFFINITY Token6.932475199509470801 BNB
0x5a17a7e058e1619fe36eb7d4144024bbea0728c1ad39b560efe039be7943885a131294572021-12-02 11:33:0922 hrs 1 min ago SafeAffinity: AFFINITY Token0x66cf1ef841908873c34e6bbf1586f4000b9fbb5d0.612837795124245291 BNB
0x5a17a7e058e1619fe36eb7d4144024bbea0728c1ad39b560efe039be7943885a131294572021-12-02 11:33:0922 hrs 1 min ago SafeAffinity: AFFINITY Token 0xb81b272fde39f698c69a67620aa9978724e770cd6.391022720581415183 BNB
0x057e961be6876941cd7c03155153cd7f3b2b953674b8da47ad60f321be56038b131294422021-12-02 11:32:1522 hrs 2 mins ago PancakeSwap: Router v2 SafeAffinity: AFFINITY Token7.003860515705660474 BNB
0x10dbb6dd297904bf7ed19674eb2aaa6338124852e18e4e86d320f932232be14c131244962021-12-02 7:18:381 day 2 hrs ago SafeAffinity: AFFINITY Token0x66cf1ef841908873c34e6bbf1586f4000b9fbb5d0.630315180364088671 BNB
0x10dbb6dd297904bf7ed19674eb2aaa6338124852e18e4e86d320f932232be14c131244962021-12-02 7:18:381 day 2 hrs ago SafeAffinity: AFFINITY Token 0xb81b272fde39f698c69a67620aa9978724e770cd6.573286880939781858 BNB
0xdac61d0d86c28a8793c0ca409c91c900b6d7769872a5364ec221f2e6a66dfc88131240552021-12-02 6:56:301 day 2 hrs ago PancakeSwap: Router v2 SafeAffinity: AFFINITY Token7.203602061303870529 BNB
0x39913ab62d6970fc3044496b05e00c8a0d6e7ce6eee4106684d3427d27b12933131222632021-12-02 5:22:471 day 4 hrs ago SafeAffinity: AFFINITY Token0x66cf1ef841908873c34e6bbf1586f4000b9fbb5d0.663508572550423965 BNB
0x39913ab62d6970fc3044496b05e00c8a0d6e7ce6eee4106684d3427d27b12933131222632021-12-02 5:22:471 day 4 hrs ago SafeAffinity: AFFINITY Token 0xb81b272fde39f698c69a67620aa9978724e770cd6.919446542311564217 BNB
0x39913ab62d6970fc3044496b05e00c8a0d6e7ce6eee4106684d3427d27b12933131222632021-12-02 5:22:471 day 4 hrs ago PancakeSwap: Router v2 SafeAffinity: AFFINITY Token7.582955114861988182 BNB
0x181f11e43e5d9d0795b811e33d0361b61f5b16013e7fc2089772bc96eb8bca20131172272021-12-02 0:47:041 day 8 hrs ago SafeAffinity: AFFINITY Token0x66cf1ef841908873c34e6bbf1586f4000b9fbb5d0.684273493222418219 BNB
0x181f11e43e5d9d0795b811e33d0361b61f5b16013e7fc2089772bc96eb8bca20131172272021-12-02 0:47:041 day 8 hrs ago SafeAffinity: AFFINITY Token 0xb81b272fde39f698c69a67620aa9978724e770cd7.135995000748075715 BNB
0x181f11e43e5d9d0795b811e33d0361b61f5b16013e7fc2089772bc96eb8bca20131172272021-12-02 0:47:041 day 8 hrs ago PancakeSwap: Router v2 SafeAffinity: AFFINITY Token7.820268493970493934 BNB
0xf4b09f989a4aaa8200590bb150caa1ad7ac2f8992a2e14bf7a38642c4799647b131059872021-12-01 15:04:571 day 18 hrs ago SafeAffinity: AFFINITY Token0x66cf1ef841908873c34e6bbf1586f4000b9fbb5d0.699702180831737032 BNB
0xf4b09f989a4aaa8200590bb150caa1ad7ac2f8992a2e14bf7a38642c4799647b131059872021-12-01 15:04:571 day 18 hrs ago SafeAffinity: AFFINITY Token 0xb81b272fde39f698c69a67620aa9978724e770cd7.296894171530971906 BNB
0xf4b09f989a4aaa8200590bb150caa1ad7ac2f8992a2e14bf7a38642c4799647b131059872021-12-01 15:04:571 day 18 hrs ago PancakeSwap: Router v2 SafeAffinity: AFFINITY Token7.996596352362708938 BNB
0x559cf1a93b114e4d64cc8f2f0469214c1f1246e75ac72701adb4e786c2523697130937022021-12-01 3:30:402 days 6 hrs ago SafeAffinity: AFFINITY Token0x66cf1ef841908873c34e6bbf1586f4000b9fbb5d0.702881662410672112 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SafeAffinity

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 1 of 10: SafeAffinity.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.0;

import "./AffinityDistributor.sol";
import "./SafeMath.sol";
import "./Address.sol";
import "./IERC20.sol";
import "./Context.sol";
import "./Ownable.sol";
import "./IUniswapV2Factory.sol";
import "./IUniswapRouter02.sol";

/** 
 * Contract: SafeAffinity 
 * 
 *  This Contract Awards SafeVault and SafeEarn to holders
 *  weighted by how much SafeAffinity you hold
 * 
 *  Transfer Fee:  8%
 *  Buy Fee:       8%
 *  Sell Fee:     20%
 * 
 *  Fees Go Toward:
 *  43.75% SafeVault Distribution
 *  43.75% SafeEarn Distribution
 *  8.75% Burn
 *  3.75% Marketing
 */
contract SafeAffinity is IERC20, Context, Ownable {
    
    using SafeMath for uint256;
    using SafeMath for uint8;
    using Address for address;

    // token data
    string constant _name = "SafeAffinity";
    string constant _symbol = "AFFINITY";
    uint8 constant _decimals = 9;
    // 1 Trillion Max Supply
    uint256 _totalSupply = 1 * 10**12 * (10 ** _decimals);
    uint256 public _maxTxAmount = _totalSupply.div(200); // 0.5% or 5 Billion
    // balances
    mapping (address => uint256) _balances;
    mapping (address => mapping (address => uint256)) _allowances;
    // exemptions
    mapping (address => bool) isFeeExempt;
    mapping (address => bool) isTxLimitExempt;
    mapping (address => bool) isDividendExempt;
    // fees
    uint256 public burnFee = 175;
    uint256 public reflectionFee = 1750;
    uint256 public marketingFee = 75;
    // total fees
    uint256 totalFeeSells = 2000;
    uint256 totalFeeBuys = 800;
    uint256 feeDenominator = 10000;
    // Marketing Funds Receiver
    address public marketingFeeReceiver = 0x66cF1ef841908873C34e6bbF1586F4000b9fBB5D;
    // minimum bnb needed for distribution
    uint256 public minimumToDistribute = 5 * 10**18;
    // Pancakeswap V2 Router
    IUniswapV2Router02 router;
    address public pair;
    bool public allowTransferToMarketing = true;
    // gas for distributor
    AffinityDistributor public distributor;
    uint256 distributorGas = 500000;
    // in charge of swapping
    bool public swapEnabled = true;
    uint256 public swapThreshold = _totalSupply.div(300); // 0.03% = 300 Million
    // true if our threshold decreases with circulating supply
    bool public canChangeSwapThreshold = false;
    uint256 public swapThresholdPercentOfCirculatingSupply = 300;
    bool inSwap;
    bool isDistributing;
    // false to stop the burn
    bool burnEnabled = true;
    modifier swapping() { inSwap = true; _; inSwap = false; }
    modifier distributing() { isDistributing = true; _; isDistributing = false; }
    // Uniswap Router V2
    address private _dexRouter = 0x10ED43C718714eb63d5aA57B78B54704E256024E;
    
    // initialize some stuff
    constructor (
    ) {
        // Pancakeswap V2 Router
        router = IUniswapV2Router02(_dexRouter);
        // Liquidity Pool Address for BNB -> Vault
        pair = IUniswapV2Factory(router.factory()).createPair(router.WETH(), address(this));
        _allowances[address(this)][address(router)] = _totalSupply;
        // our dividend Distributor
        distributor = new AffinityDistributor(_dexRouter);
        // exempt deployer and contract from fees
        isFeeExempt[msg.sender] = true;
        isFeeExempt[address(this)] = true;
        // exempt important addresses from TX limit
        isTxLimitExempt[msg.sender] = true;
        isTxLimitExempt[marketingFeeReceiver] = true;
        isTxLimitExempt[address(distributor)] = true;
        isTxLimitExempt[address(this)] = true;
        // exempt this important addresses  from receiving Rewards
        isDividendExempt[pair] = true;
        isDividendExempt[address(this)] = true;
        // approve router of total supply
        approve(_dexRouter, _totalSupply);
        approve(address(pair), _totalSupply);
        _balances[msg.sender] = _totalSupply;
        emit Transfer(address(0), msg.sender, _totalSupply);
    }

    receive() external payable { }

    function totalSupply() external view override returns (uint256) { return _totalSupply; }
    function balanceOf(address account) public view override returns (uint256) { return _balances[account]; }
    function allowance(address holder, address spender) external view override returns (uint256) { return _allowances[holder][spender]; }
    function name() public pure returns (string memory) {
        return _name;
    }

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

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

    function approve(address spender, uint256 amount) public override returns (bool) {
        _allowances[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        return true;
    }
    
    function internalApprove() private {
        _allowances[address(this)][address(router)] = _totalSupply;
        _allowances[address(this)][address(pair)] = _totalSupply;
    }
    
    /** Approve Total Supply */
    function approveMax(address spender) external returns (bool) {
        return approve(spender, _totalSupply);
    }
    
    /** Transfer Function */
    function transfer(address recipient, uint256 amount) external override returns (bool) {
        return _transferFrom(msg.sender, recipient, amount);
    }
    
    /** Transfer Function */
    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        if(_allowances[sender][msg.sender] != _totalSupply){
            _allowances[sender][msg.sender] = _allowances[sender][msg.sender].sub(amount, "Insufficient Allowance");
        }

        return _transferFrom(sender, recipient, amount);
    }
    
    /** Internal Transfer */
    function _transferFrom(address sender, address recipient, uint256 amount) internal returns (bool) {
        // make standard checks
        require(recipient != address(0), "BEP20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        // check if we have reached the transaction limit
        require(amount <= _maxTxAmount || isTxLimitExempt[sender], "TX Limit Exceeded");
        // whether transfer succeeded
        bool success;
        // amount of tokens received by recipient
        uint256 amountReceived;
        // if we're in swap perform a basic transfer
        if(inSwap || isDistributing){ 
            (amountReceived, success) = handleTransferBody(sender, recipient, amount); 
            emit Transfer(sender, recipient, amountReceived);
            return success;
        }
        
        // limit gas consumption by splitting up operations
        if(shouldSwapBack()) { 
            swapBack();
            (amountReceived, success) = handleTransferBody(sender, recipient, amount);
        } else if (shouldReflectAndDistribute()) {
            reflectAndDistribute();
            (amountReceived, success) = handleTransferBody(sender, recipient, amount);
        } else {
            (amountReceived, success) = handleTransferBody(sender, recipient, amount);
            try distributor.process(distributorGas) {} catch {}
        }
        
        emit Transfer(sender, recipient, amountReceived);
        return success;
    }
    
    /** Takes Associated Fees and sets holders' new Share for the Safemoon Distributor */
    function handleTransferBody(address sender, address recipient, uint256 amount) internal returns (uint256, bool) {
        // subtract balance from sender
        _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance");
        // amount receiver should receive
        uint256 amountReceived = shouldTakeFee(sender) ? takeFee(recipient, amount) : amount;
        // add amount to recipient
        _balances[recipient] = _balances[recipient].add(amountReceived);
        // set shares for distributors
        if(!isDividendExempt[sender]){ 
            distributor.setShare(sender, _balances[sender]);
        }
        if(!isDividendExempt[recipient]){ 
            distributor.setShare(recipient, _balances[recipient]);
        }
        // return the amount received by receiver
        return (amountReceived, true);
    }

    /** False if sender is Fee Exempt, True if not */
    function shouldTakeFee(address sender) internal view returns (bool) {
        return !isFeeExempt[sender];
    }
    
    /** Takes Proper Fee (8% buys / transfers, 20% on sells) and stores in contract */
    function takeFee(address receiver, uint256 amount) internal returns (uint256) {
        uint256 feeAmount = amount.mul(getTotalFee(receiver == pair)).div(feeDenominator);
        _balances[address(this)] = _balances[address(this)].add(feeAmount);
        return amount.sub(feeAmount);
    }
    
    /** True if we should swap from Vault => BNB */
    function shouldSwapBack() internal view returns (bool) {
        return msg.sender != pair
        && !inSwap
        && swapEnabled
        && _balances[address(this)] >= swapThreshold;
    }
    
    /**
     *  Swaps SafeAffinity for BNB if threshold is reached and the swap is enabled
     *  Burns 20% of SafeAffinity in Contract
     *  Swaps The Rest For BNB
     */
    function swapBack() private swapping {
        // path from token -> BNB
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();
        // tokens allocated to burning
        uint256 burnAmount = swapThreshold.mul(burnFee).div(totalFeeSells);
        // burn tokens
        burnTokens(burnAmount);
        // how many are left to swap with
        uint256 swapAmount = swapThreshold.sub(burnAmount);
        // swap tokens for BNB
        try router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            swapAmount,
            0,
            path,
            address(this),
            block.timestamp
        ) {} catch{return;}
        
        // Tell The Blockchain
        emit SwappedBack(swapAmount, burnAmount);
    }
    
    function shouldReflectAndDistribute() private view returns(bool) {
        return msg.sender != pair
        && !isDistributing
        && swapEnabled
        && address(this).balance >= minimumToDistribute;
    }
    
    function reflectAndDistribute() private distributing {
        
        bool success; bool successful;
        uint256 amountBNBMarketing; uint256 amountBNBReflection;
        // allocate bnb
        if (allowTransferToMarketing) {
            amountBNBMarketing = address(this).balance.mul(marketingFee).div(totalFeeSells);
            amountBNBReflection = address(this).balance.sub(amountBNBMarketing);
            // fund distributors
            (success,) = payable(address(distributor)).call{value: amountBNBReflection, gas: 26000}("");
            distributor.deposit();
            // transfer to marketing
            if (allowTransferToMarketing) {
                (successful,) = payable(marketingFeeReceiver).call{value: amountBNBMarketing, gas: 26000}("");
            }
        } else {
            amountBNBReflection = address(this).balance;
            // fund distributors
            (success,) = payable(address(distributor)).call{value: amountBNBReflection, gas: 26000}("");
            distributor.deposit();
        }
        emit FundDistributors(amountBNBReflection, amountBNBMarketing);
    }

    /** Removes Tokens From Circulation */
    function burnTokens(uint256 tokenAmount) private returns (bool) {
        if (!burnEnabled) {
            return false;
        }
        // update balance of contract
        _balances[address(this)] = _balances[address(this)].sub(tokenAmount, 'cannot burn this amount');
        // update Total Supply
        _totalSupply = _totalSupply.sub(tokenAmount, 'total supply cannot be negative');
        // approve Router for total supply
        internalApprove();
        // change Swap Threshold if we should
        if (canChangeSwapThreshold) {
            swapThreshold = _totalSupply.div(swapThresholdPercentOfCirculatingSupply);
        }
        // emit Transfer to Blockchain
        emit Transfer(address(this), address(0), tokenAmount);
        return true;
    }
   
    /** Claim Your Vault Rewards Early */
    function claimVaultDividend() external returns (bool) {
        distributor.claimVAULTDividend(msg.sender);
        return true;
    }
    
    /** Claim Your Earn Rewards Manually */
    function claimEarnDividend() external returns (bool) {
        distributor.claimEarnDividend(msg.sender);
        return true;
    }

    /** Manually Depsoits To The Earn or Vault Contract */
    function manuallyDeposit() external returns (bool){
        distributor.deposit();
        return true;
    }
    
    /** Is Holder Exempt From Fees */
    function getIsFeeExempt(address holder) public view returns (bool) {
        return isFeeExempt[holder];
    }
    
    /** Is Holder Exempt From Earn Dividends */
    function getIsDividendExempt(address holder) public view returns (bool) {
        return isDividendExempt[holder];
    }
    
    /** Is Holder Exempt From Transaction Limit */
    function getIsTxLimitExempt(address holder) public view returns (bool) {
        return isTxLimitExempt[holder];
    }
        
    /** Get Fees for Buying or Selling */
    function getTotalFee(bool selling) public view returns (uint256) {
        if(selling){ return totalFeeSells; }
        return totalFeeBuys;
    }
    
    /** Sets Various Fees */
    function setFees(uint256 _burnFee, uint256 _reflectionFee, uint256 _marketingFee, uint256 _buyFee) external onlyOwner {
        burnFee = _burnFee;
        reflectionFee = _reflectionFee;
        marketingFee = _marketingFee;
        totalFeeSells = _burnFee.add(_reflectionFee).add(_marketingFee);
        totalFeeBuys = _buyFee;
        require(_buyFee <= 1000);
        require(totalFeeSells < feeDenominator/2);
    }
    
    /** Set Exemption For Holder */
    function setIsFeeAndTXLimitExempt(address holder, bool feeExempt, bool txLimitExempt) external onlyOwner {
        require(holder != address(0));
        isFeeExempt[holder] = feeExempt;
        isTxLimitExempt[holder] = txLimitExempt;
    }
    
    /** Set Holder To Be Exempt From Earn Dividends */
    function setIsDividendExempt(address holder, bool exempt) external onlyOwner {
        require(holder != address(this) && holder != pair);
        isDividendExempt[holder] = exempt;
        if(exempt) {
            distributor.setShare(holder, 0);
        } else {
            distributor.setShare(holder, _balances[holder]);
        }
    }
    
    /** Set Settings related to Swaps */
    function setSwapBackSettings(bool _swapEnabled, uint256 _swapThreshold, bool _canChangeSwapThreshold, uint256 _percentOfCirculatingSupply, bool _burnEnabled, uint256 _minimumBNBToDistribute) external onlyOwner {
        swapEnabled = _swapEnabled;
        swapThreshold = _swapThreshold;
        canChangeSwapThreshold = _canChangeSwapThreshold;
        swapThresholdPercentOfCirculatingSupply = _percentOfCirculatingSupply;
        burnEnabled = _burnEnabled;
        minimumToDistribute = _minimumBNBToDistribute;
    }

    /** Set Criteria For SafeAffinity Distributor */
    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution, uint256 _bnbToTokenThreshold) external onlyOwner {
        distributor.setDistributionCriteria(_minPeriod, _minDistribution, _bnbToTokenThreshold);
    }

    /** Should We Transfer To Marketing */
    function setAllowTransferToMarketing(bool _canSendToMarketing, address _marketingFeeReceiver) external onlyOwner {
        allowTransferToMarketing = _canSendToMarketing;
        marketingFeeReceiver = _marketingFeeReceiver;
    }
    
    /** Updates The Pancakeswap Router */
    function setDexRouter(address nRouter) external onlyOwner{
        require(nRouter != _dexRouter);
        _dexRouter = nRouter;
        router = IUniswapV2Router02(nRouter);
        address _uniswapV2Pair = IUniswapV2Factory(router.factory())
            .createPair(address(this), router.WETH());
        pair = _uniswapV2Pair;
        _allowances[address(this)][address(router)] = _totalSupply;
        distributor.updatePancakeRouterAddress(nRouter);
    }

    /** Set Address For SafeAffinity Distributor */
    function setDistributor(address payable newDistributor) external onlyOwner {
        require(newDistributor != address(distributor), 'Distributor already has this address');
        distributor = AffinityDistributor(newDistributor);
        emit SwappedDistributor(newDistributor);
    }

    /** Swaps SafeAffinity and SafeVault Addresses in case of migration */
    function setTokenAddresses(address nSafeEarn, address nSafeVault) external onlyOwner {
        distributor.setSafeEarnAddress(nSafeEarn);
        distributor.setSafeVaultAddress(nSafeVault);
        emit SwappedTokenAddresses(nSafeEarn, nSafeVault);
    }
    
    /** Deletes the entire bag from sender */
    function deleteBag(uint256 nTokens) external returns(bool){
        // make sure you are burning enough tokens
        require(nTokens > 0);
        // if the balance is greater than zero
        require(_balances[msg.sender] >= nTokens, 'user does not own enough tokens');
        // remove tokens from sender
        _balances[msg.sender] = _balances[msg.sender].sub(nTokens, 'cannot have negative tokens');
        // remove tokens from total supply
        _totalSupply = _totalSupply.sub(nTokens, 'total supply cannot be negative');
        // approve Router for the new total supply
        internalApprove();
        // set share in distributor
        distributor.setShare(msg.sender, _balances[msg.sender]);
        // tell blockchain
        emit Transfer(msg.sender, address(0), nTokens);
        return true;
    }

    // Events
    event SwappedDistributor(address newDistributor);
    event SwappedBack(uint256 tokensSwapped, uint256 amountBurned);
    event SwappedTokenAddresses(address newSafeEarn, address newSafeVault);
    event FundDistributors(uint256 reflectionAmount, uint256 marketingAmount);
}

File 2 of 10: Address.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;


library Address {

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

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

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

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

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

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

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

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

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

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

}

File 3 of 10: AffinityDistributor.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.0;

import "./IAffinityDistributor.sol";
import "./SafeMath.sol";
import "./Address.sol";
import "./IERC20.sol";
import "./Context.sol";
import "./Ownable.sol";
import "./IUniswapRouter02.sol";

/** Distributes SafeVault and SafeEarn To Holders Varied on Weight */
contract AffinityDistributor is IAffinityDistributor {
    
    using SafeMath for uint256;
    using Address for address;
    
    // SafeVault Contract
    address _token;
    // Share of SafeVault
    struct Share {
        uint256 amount;
        uint256 totalExcludedVault;
        uint256 totalRealisedVault;
        uint256 totalExcludedEarn;
        uint256 totalRealisedEarn;
    }
    // SafeEarn contract address
    address SafeEarn = 0x099f551eA3cb85707cAc6ac507cBc36C96eC64Ff;
    // SafeVault
    address SafeVault = 0xe2e6e66551E5062Acd56925B48bBa981696CcCC2;

    // Pancakeswap Router
    IUniswapV2Router02 router;
    // shareholder fields
    address[] shareholders;
    mapping (address => uint256) shareholderIndexes;
    mapping (address => uint256) shareholderClaims;
    mapping (address => Share) public shares;
    // shares math and fields
    uint256 public totalShares;
    uint256 public totalDividendsEARN;
    uint256 public dividendsPerShareEARN;

    uint256 public totalDividendsVAULT;
    uint256 public dividendsPerShareVAULT;

    uint256 public dividendsPerShareAccuracyFactor = 10 ** 36;
    // distributes twice per day
    uint256 public minPeriod = 4 hours;
    // auto claim
    uint256 public minAutoPeriod = 1 hours;
    // 20,000 Minimum Distribution
    uint256 public minDistribution = 2 * 10**4;
    // BNB Needed to Swap to SafeAffinity
    uint256 public swapToTokenThreshold = 5 * (10 ** 18);
    // current index in shareholder array 
    uint256 currentIndexEarn;
    // current index in shareholder array 
    uint256 currentIndexVault;
    
    bool earnsTurnPurchase = false;
    bool earnsTurnDistribute = true;
    
    modifier onlyToken() {
        require(msg.sender == _token); _;
    }

    constructor (address _router) {
        router = _router != address(0)
        ? IUniswapV2Router02(_router)
        : IUniswapV2Router02(0x10ED43C718714eb63d5aA57B78B54704E256024E);
        _token = msg.sender;
    }

    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution, uint256 _bnbToTokenThreshold) external override onlyToken {
        minPeriod = _minPeriod;
        minDistribution = _minDistribution;
        swapToTokenThreshold = _bnbToTokenThreshold;
    }

    function setShare(address shareholder, uint256 amount) external override onlyToken {
        if(shares[shareholder].amount > 0){
            distributeVaultDividend(shareholder);
            distributeEarnDividend(shareholder);
        }

        if(amount > 0 && shares[shareholder].amount == 0){
            addShareholder(shareholder);
        }else if(amount == 0 && shares[shareholder].amount > 0){
            removeShareholder(shareholder);
        }

        totalShares = totalShares.sub(shares[shareholder].amount).add(amount);
        shares[shareholder].amount = amount;
        shares[shareholder].totalExcludedVault = getCumulativeVaultDividends(shares[shareholder].amount);
        shares[shareholder].totalExcludedEarn = getCumulativeEarnDividends(shares[shareholder].amount);

    }
    
    function deposit() external override onlyToken {
        if (address(this).balance < swapToTokenThreshold) return;
        
        if (earnsTurnPurchase) {
            
            uint256 balanceBefore = IERC20(SafeEarn).balanceOf(address(this));
            
            address[] memory path = new address[](2);
            path[0] = router.WETH();
            path[1] = SafeEarn;

            try router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: swapToTokenThreshold}(
                0,
                path,
                address(this),
                block.timestamp.add(30)
            ) {} catch {return;}

            uint256 amount = IERC20(SafeEarn).balanceOf(address(this)).sub(balanceBefore);

            totalDividendsEARN = totalDividendsEARN.add(amount);
            dividendsPerShareEARN = dividendsPerShareEARN.add(dividendsPerShareAccuracyFactor.mul(amount).div(totalShares));
            earnsTurnPurchase = false;
            
        } else {
            
            uint256 balanceBefore = IERC20(SafeVault).balanceOf(address(this));
            
            address[] memory path = new address[](2);
            path[0] = router.WETH();
            path[1] = SafeVault;

            try router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: swapToTokenThreshold}(
                0,
                path,
                address(this),
                block.timestamp.add(30)
            ) {} catch {return;}

            uint256 amount = IERC20(SafeVault).balanceOf(address(this)).sub(balanceBefore);

            totalDividendsVAULT = totalDividendsVAULT.add(amount);
            dividendsPerShareVAULT = dividendsPerShareVAULT.add(dividendsPerShareAccuracyFactor.mul(amount).div(totalShares));
            earnsTurnPurchase = true;
        }
    }

    function process(uint256 gas) external override onlyToken {
        uint256 shareholderCount = shareholders.length;

        if(shareholderCount == 0) { return; }

        uint256 gasUsed = 0;
        uint256 gasLeft = gasleft();

        earnsTurnDistribute = !earnsTurnDistribute;
        uint256 iterations = 0;
        
        if (earnsTurnDistribute) {
            
            while(gasUsed < gas && iterations < shareholderCount) {
                if(currentIndexEarn >= shareholderCount){
                    currentIndexEarn = 0;
                }

                if(shouldDistributeEarn(shareholders[currentIndexEarn])){
                    distributeEarnDividend(shareholders[currentIndexEarn]);
                }
            
                gasUsed = gasUsed.add(gasLeft.sub(gasleft()));
                gasLeft = gasleft();
                currentIndexEarn++;
                iterations++;
            }
            
        } else {
            
            while(gasUsed < gas && iterations < shareholderCount) {
                if(currentIndexVault >= shareholderCount){
                    currentIndexVault = 0;
                }

                if(shouldDistributeVault(shareholders[currentIndexVault])){
                    distributeVaultDividend(shareholders[currentIndexVault]);
                }

                gasUsed = gasUsed.add(gasLeft.sub(gasleft()));
                gasLeft = gasleft();
                currentIndexVault++;
                iterations++;
            }
            
        }
        
    }
    
    function processManually() external override returns(bool) {
        uint256 shareholderCount = shareholders.length;
        
        if(shareholderCount == 0) { return false; }

        uint256 iterations = 0;
        uint256 index = 0;

        while(iterations < shareholderCount) {
            if(index >= shareholderCount){
                index = 0;
            }

            if(shouldDistributeVault(shareholders[index])){
                distributeVaultDividend(shareholders[index]);
            }
            index++;
            iterations++;
        }
        return true;
    }

    function shouldDistributeVault(address shareholder) internal view returns (bool) {
        return shareholderClaims[shareholder] + minPeriod < block.timestamp
        && getUnpaidVaultEarnings(shareholder) > minDistribution;
    }
    
    function shouldDistributeEarn(address shareholder) internal view returns (bool) {
        return shareholderClaims[shareholder] + minPeriod < block.timestamp
        && getUnpaidEarnEarnings(shareholder) > minDistribution;
    }

    function distributeVaultDividend(address shareholder) internal {
        if(shares[shareholder].amount == 0){ return; }

        uint256 amount = getUnpaidVaultEarnings(shareholder);
        if(amount > 0){
            bool success = IERC20(SafeVault).transfer(shareholder, amount);
            if (success) {
                shareholderClaims[shareholder] = block.timestamp;
                shares[shareholder].totalRealisedVault = shares[shareholder].totalRealisedVault.add(amount);
                shares[shareholder].totalExcludedVault = getCumulativeVaultDividends(shares[shareholder].amount);
            }
        }
    }
    
    function distributeEarnDividend(address shareholder) internal {
        if(shares[shareholder].amount == 0){ return; }

        uint256 amount = getUnpaidEarnEarnings(shareholder);
        if(amount > 0){
            bool success = IERC20(SafeEarn).transfer(shareholder, amount);
            if (success) {
                shareholderClaims[shareholder] = block.timestamp;
                shares[shareholder].totalRealisedEarn = shares[shareholder].totalRealisedEarn.add(amount);
                shares[shareholder].totalExcludedEarn = getCumulativeEarnDividends(shares[shareholder].amount);
            }
        }   
    }
    
    function claimEarnDividend(address claimer) external override onlyToken {
        require(shareholderClaims[claimer] + minAutoPeriod < block.timestamp, 'must wait at least the minimum auto withdraw period');
        distributeEarnDividend(claimer);
    }
    
    function claimVAULTDividend(address claimer) external override onlyToken {
        require(shareholderClaims[claimer] + minAutoPeriod < block.timestamp, 'must wait at least the minimum auto withdraw period');
        distributeVaultDividend(claimer);
    }

    function getUnpaidVaultEarnings(address shareholder) public view returns (uint256) {
        if(shares[shareholder].amount == 0){ return 0; }

        uint256 shareholderTotalDividends = getCumulativeVaultDividends(shares[shareholder].amount);
        uint256 shareholderTotalExcluded = shares[shareholder].totalExcludedVault;

        if(shareholderTotalDividends <= shareholderTotalExcluded){ return 0; }

        return shareholderTotalDividends.sub(shareholderTotalExcluded);
    }
    
    function getUnpaidEarnEarnings(address shareholder) public view returns (uint256) {
        if(shares[shareholder].amount == 0){ return 0; }

        uint256 shareholderTotalDividends = getCumulativeEarnDividends(shares[shareholder].amount);
        uint256 shareholderTotalExcluded = shares[shareholder].totalExcludedEarn;

        if(shareholderTotalDividends <= shareholderTotalExcluded){ return 0; }

        return shareholderTotalDividends.sub(shareholderTotalExcluded);
    }

    function getCumulativeVaultDividends(uint256 share) internal view returns (uint256) {
        return share.mul(dividendsPerShareVAULT).div(dividendsPerShareAccuracyFactor);
    }
    
    function getCumulativeEarnDividends(uint256 share) internal view returns (uint256) {
        return share.mul(dividendsPerShareEARN).div(dividendsPerShareAccuracyFactor);
    }

    function addShareholder(address shareholder) internal {
        shareholderIndexes[shareholder] = shareholders.length;
        shareholders.push(shareholder);
    }

    function removeShareholder(address shareholder) internal { 
        shareholders[shareholderIndexes[shareholder]] = shareholders[shareholders.length-1];
        shareholderIndexes[shareholders[shareholders.length-1]] = shareholderIndexes[shareholder]; 
        shareholders.pop();
        delete shareholderIndexes[shareholder]; 
    }

    /** Updates the Address of the PCS Router */
    function updatePancakeRouterAddress(address pcsRouter) external override onlyToken {
        router = IUniswapV2Router02(pcsRouter);
    }
    
    /** New Vault Address */
    function setSafeVaultAddress(address newSafeVault) external override onlyToken {
        SafeVault = newSafeVault;
    }
    
    /** New Earn Address */
    function setSafeEarnAddress(address newSafeEarn) external override onlyToken {
        SafeEarn = newSafeEarn;
    }

    receive() external payable { 
        
    }

}

File 4 of 10: Context.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

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

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

File 5 of 10: IAffinityDistributor.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.0;

interface IAffinityDistributor {
    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution, uint256 _bnbToSafemoonThreshold) external;
    function setShare(address shareholder, uint256 amount) external;
    function deposit() external;
    function process(uint256 gas) external;
    function processManually() external returns(bool);
    function claimEarnDividend(address sender) external;
    function claimVAULTDividend(address sender) external;
    function updatePancakeRouterAddress(address pcs) external;
    function setSafeEarnAddress(address nSeth) external;
    function setSafeVaultAddress(address nSeth) external;
}

File 6 of 10: IERC20.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IERC20 {

    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);
    
    /**
     * @dev Returns the number of decimal places
     */
    function decimals() external view returns (uint8);

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

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 7 of 10: IUniswapRouter02.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;


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

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

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

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

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

File 8 of 10: IUniswapV2Factory.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

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

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

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

File 9 of 10: Ownable.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./Context.sol";

contract Ownable is Context {
    address private _owner;
    address private _previousOwner;
    uint256 private _lockTime;

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

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

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

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

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

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

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

    //Locks the contract for owner for the amount of time provided
    function lock(uint256 time) public virtual onlyOwner {
        _previousOwner = _owner;
        _owner = address(0);
        _lockTime = block.timestamp + time;
        emit OwnershipTransferred(_owner, address(0));
    }

    //Unlocks the contract for owner when _lockTime is exceeds
    function unlock() public virtual {
        require(_previousOwner == msg.sender, "You don't have permission to unlock");
        require(block.timestamp > _lockTime , "Contract is locked");
        emit OwnershipTransferred(_owner, _previousOwner);
        _owner = _previousOwner;
    }
}

File 10 of 10: SafeMath.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reflectionAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"marketingAmount","type":"uint256"}],"name":"FundDistributors","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountBurned","type":"uint256"}],"name":"SwappedBack","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newDistributor","type":"address"}],"name":"SwappedDistributor","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newSafeEarn","type":"address"},{"indexed":false,"internalType":"address","name":"newSafeVault","type":"address"}],"name":"SwappedTokenAddresses","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":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowTransferToMarketing","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","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":"spender","type":"address"}],"name":"approveMax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canChangeSwapThreshold","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimEarnDividend","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimVaultDividend","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"nTokens","type":"uint256"}],"name":"deleteBag","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributor","outputs":[{"internalType":"contract AffinityDistributor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"geUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"getIsDividendExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"getIsFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"getIsTxLimitExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"selling","type":"bool"}],"name":"getTotalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manuallyDeposit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFeeReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumToDistribute","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reflectionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_canSendToMarketing","type":"bool"},{"internalType":"address","name":"_marketingFeeReceiver","type":"address"}],"name":"setAllowTransferToMarketing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"nRouter","type":"address"}],"name":"setDexRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minPeriod","type":"uint256"},{"internalType":"uint256","name":"_minDistribution","type":"uint256"},{"internalType":"uint256","name":"_bnbToTokenThreshold","type":"uint256"}],"name":"setDistributionCriteria","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newDistributor","type":"address"}],"name":"setDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_burnFee","type":"uint256"},{"internalType":"uint256","name":"_reflectionFee","type":"uint256"},{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_buyFee","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsDividendExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"feeExempt","type":"bool"},{"internalType":"bool","name":"txLimitExempt","type":"bool"}],"name":"setIsFeeAndTXLimitExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_swapEnabled","type":"bool"},{"internalType":"uint256","name":"_swapThreshold","type":"uint256"},{"internalType":"bool","name":"_canChangeSwapThreshold","type":"bool"},{"internalType":"uint256","name":"_percentOfCirculatingSupply","type":"uint256"},{"internalType":"bool","name":"_burnEnabled","type":"bool"},{"internalType":"uint256","name":"_minimumBNBToDistribute","type":"uint256"}],"name":"setSwapBackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"nSafeEarn","type":"address"},{"internalType":"address","name":"nSafeVault","type":"address"}],"name":"setTokenAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapThresholdPercentOfCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526009600a62000014919062000e23565b64e8d4a5100062000026919062000f60565b6003556200004660c860035462000a7f60201b62002d8b1790919060201c565b60045560af600a556106d6600b55604b600c556107d0600d55610320600e55612710600f557366cf1ef841908873c34e6bbf1586f4000b9fbb5d601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550674563918244f400006011556001601360146101000a81548160ff0219169083151502179055506207a1206015556001601660006101000a81548160ff0219169083151502179055506200012761012c60035462000a7f60201b62002d8b1790919060201c565b6017556000601860006101000a81548160ff02191690831515021790555061012c6019556001601a60026101000a81548160ff0219169083151502179055507310ed43c718714eb63d5aa57b78b54704e256024e601a60036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620001c857600080fd5b506000620001db62000ad160201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350601a60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200034557600080fd5b505afa1580156200035a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000380919062000c5a565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200040457600080fd5b505afa15801562000419573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200043f919062000c5a565b306040518363ffffffff1660e01b81526004016200045f92919062000d06565b602060405180830381600087803b1580156200047a57600080fd5b505af11580156200048f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004b5919062000c5a565b601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600354600660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601a60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051620005cb9062000c35565b620005d7919062000ce9565b604051809103906000f080158015620005f4573d6000803e3d6000fd5b50601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600760003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160086000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160086000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600860003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160096000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600960003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000991601a60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660035462000ad960201b60201c565b50620009c8601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660035462000ad960201b60201c565b50600354600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60035460405162000a71919062000d57565b60405180910390a3620010d8565b600062000ac983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525062000bcd60201b60201c565b905092915050565b600033905090565b600081600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405162000bbb919062000d57565b60405180910390a36001905092915050565b6000808311829062000c17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000c0e919062000d33565b60405180910390fd5b506000838562000c28919062000d90565b9050809150509392505050565b6135a980620064fe83390190565b60008151905062000c5481620010be565b92915050565b60006020828403121562000c6d57600080fd5b600062000c7d8482850162000c43565b91505092915050565b62000c918162000fc1565b82525050565b600062000ca48262000d74565b62000cb0818562000d7f565b935062000cc28185602086016200100c565b62000ccd81620010a0565b840191505092915050565b62000ce38162000ff5565b82525050565b600060208201905062000d00600083018462000c86565b92915050565b600060408201905062000d1d600083018562000c86565b62000d2c602083018462000c86565b9392505050565b6000602082019050818103600083015262000d4f818462000c97565b905092915050565b600060208201905062000d6e600083018462000cd8565b92915050565b600081519050919050565b600082825260208201905092915050565b600062000d9d8262000ff5565b915062000daa8362000ff5565b92508262000dbd5762000dbc62001071565b5b828204905092915050565b6000808291508390505b600185111562000e1a5780860481111562000df25762000df162001042565b5b600185161562000e025780820291505b808102905062000e1285620010b1565b945062000dd2565b94509492505050565b600062000e308262000ff5565b915062000e3d8362000fff565b925062000e6c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000e74565b905092915050565b60008262000e86576001905062000f59565b8162000e96576000905062000f59565b816001811462000eaf576002811462000eba5762000ef0565b600191505062000f59565b60ff84111562000ecf5762000ece62001042565b5b8360020a91508482111562000ee95762000ee862001042565b5b5062000f59565b5060208310610133831016604e8410600b841016171562000f2a5782820a90508381111562000f245762000f2362001042565b5b62000f59565b62000f39848484600162000dc8565b9250905081840481111562000f535762000f5262001042565b5b81810290505b9392505050565b600062000f6d8262000ff5565b915062000f7a8362000ff5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000fb65762000fb562001042565b5b828202905092915050565b600062000fce8262000fd5565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b838110156200102c5780820151818401526020810190506200100f565b838111156200103c576000848401525b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b620010c98162000fc1565b8114620010d557600080fd5b50565b61541680620010e86000396000f3fe6080604052600436106102815760003560e01c80637d1db4a51161014f578063b6c52324116100c1578063f1f3bca31161007a578063f1f3bca3146109c1578063f2fde38b146109fe578063f708a64f14610a27578063f72f863b14610a50578063f8654df714610a79578063fce589d814610aa457610288565b8063b6c52324146108af578063bfe10928146108da578063caf5b50214610905578063dd46706414610930578063dd62ed3e14610959578063e96fada21461099657610288565b80639fc8903e116101135780639fc8903e1461079f578063a69df4b5146107dc578063a89c8c5e146107f3578063a8aa1b311461081c578063a9059cbb14610847578063ac1eaf751461088457610288565b80637d1db4a5146106c857806383ad7994146106f35780638da5cb5b1461071e5780638db2b1731461074957806395d89b411461077457610288565b8063571ac8b0116101f357806370a08231116101ac57806370a08231146105ba578063715018a6146105f757806371bcce021461060e578063735b8e901461063757806375619ab51461066257806375a203111461068b57610288565b8063571ac8b0146104985780635ec99e7b146104d557806361cd7689146104fe5780636b67c4df1461053b5780636ddd1713146105665780636fcba3771461059157610288565b806318160ddd1161024557806318160ddd146103745780631fb868121461039f57806323b872dd146103ca578063313ce567146104075780633b68b7651461043257806341f64b851461045b57610288565b80630445b6671461028d57806306fdde03146102b8578063095ea7b3146102e35780630bfa22d7146103205780630ca61cb11461034b57610288565b3661028857005b600080fd5b34801561029957600080fd5b506102a2610acf565b6040516102af9190614faa565b60405180910390f35b3480156102c457600080fd5b506102cd610ad5565b6040516102da9190614e28565b60405180910390f35b3480156102ef57600080fd5b5061030a60048036038101906103059190614642565b610b12565b6040516103179190614df2565b60405180910390f35b34801561032c57600080fd5b50610335610c04565b6040516103429190614df2565b60405180910390f35b34801561035757600080fd5b50610372600480360381019061036d9190614795565b610c8f565b005b34801561038057600080fd5b50610389610dba565b6040516103969190614faa565b60405180910390f35b3480156103ab57600080fd5b506103b4610dc4565b6040516103c19190614df2565b60405180910390f35b3480156103d657600080fd5b506103f160048036038101906103ec9190614568565b610dd7565b6040516103fe9190614df2565b60405180910390f35b34801561041357600080fd5b5061041c610fb9565b604051610429919061507f565b60405180910390f35b34801561043e57600080fd5b50610459600480360381019061045491906146a7565b610fc2565b005b34801561046757600080fd5b50610482600480360381019061047d919061476c565b6110b6565b60405161048f9190614df2565b60405180910390f35b3480156104a457600080fd5b506104bf60048036038101906104ba91906144b1565b6113a9565b6040516104cc9190614df2565b60405180910390f35b3480156104e157600080fd5b506104fc60048036038101906104f791906146e3565b6113be565b005b34801561050a57600080fd5b50610525600480360381019061052091906144b1565b6114be565b6040516105329190614df2565b60405180910390f35b34801561054757600080fd5b50610550611514565b60405161055d9190614faa565b60405180910390f35b34801561057257600080fd5b5061057b61151a565b6040516105889190614df2565b60405180910390f35b34801561059d57600080fd5b506105b860048036038101906105b391906147e4565b61152d565b005b3480156105c657600080fd5b506105e160048036038101906105dc91906144b1565b61163a565b6040516105ee9190614faa565b60405180910390f35b34801561060357600080fd5b5061060c611683565b005b34801561061a57600080fd5b50610635600480360381019061063091906145f3565b6117d6565b005b34801561064357600080fd5b5061064c611958565b6040516106599190614df2565b60405180910390f35b34801561066e57600080fd5b5061068960048036038101906106849190614503565b6119ee565b005b34801561069757600080fd5b506106b260048036038101906106ad91906144b1565b611b8f565b6040516106bf9190614df2565b60405180910390f35b3480156106d457600080fd5b506106dd611be5565b6040516106ea9190614faa565b60405180910390f35b3480156106ff57600080fd5b50610708611beb565b6040516107159190614faa565b60405180910390f35b34801561072a57600080fd5b50610733611bf1565b6040516107409190614d41565b60405180910390f35b34801561075557600080fd5b5061075e611c1a565b60405161076b9190614faa565b60405180910390f35b34801561078057600080fd5b50610789611c20565b6040516107969190614e28565b60405180910390f35b3480156107ab57600080fd5b506107c660048036038101906107c191906144b1565b611c5d565b6040516107d39190614df2565b60405180910390f35b3480156107e857600080fd5b506107f1611cb3565b005b3480156107ff57600080fd5b5061081a6004803603810190610815919061452c565b611e87565b005b34801561082857600080fd5b50610831612073565b60405161083e9190614d41565b60405180910390f35b34801561085357600080fd5b5061086e60048036038101906108699190614642565b612099565b60405161087b9190614df2565b60405180910390f35b34801561089057600080fd5b506108996120ae565b6040516108a69190614df2565b60405180910390f35b3480156108bb57600080fd5b506108c46120c1565b6040516108d19190614faa565b60405180910390f35b3480156108e657600080fd5b506108ef6120cb565b6040516108fc9190614e0d565b60405180910390f35b34801561091157600080fd5b5061091a6120f1565b6040516109279190614df2565b60405180910390f35b34801561093c57600080fd5b506109576004803603810190610952919061476c565b612187565b005b34801561096557600080fd5b50610980600480360381019061097b919061452c565b61234e565b60405161098d9190614faa565b60405180910390f35b3480156109a257600080fd5b506109ab6123d5565b6040516109b89190614d41565b60405180910390f35b3480156109cd57600080fd5b506109e860048036038101906109e3919061467e565b6123fb565b6040516109f59190614faa565b60405180910390f35b348015610a0a57600080fd5b50610a256004803603810190610a2091906144b1565b612418565b005b348015610a3357600080fd5b50610a4e6004803603810190610a4991906145b7565b6125da565b005b348015610a5c57600080fd5b50610a776004803603810190610a7291906144b1565b6128c7565b005b348015610a8557600080fd5b50610a8e612d7f565b604051610a9b9190614faa565b60405180910390f35b348015610ab057600080fd5b50610ab9612d85565b604051610ac69190614faa565b60405180910390f35b60175481565b60606040518060400160405280600c81526020017f53616665416666696e6974790000000000000000000000000000000000000000815250905090565b600081600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610bf29190614faa565b60405180910390a36001905092915050565b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c7057600080fd5b505af1158015610c84573d6000803e3d6000fd5b505050506001905090565b610c97612dd5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1b90614eea565b60405180910390fd5b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630ca61cb18484846040518463ffffffff1660e01b8152600401610d8393929190615048565b600060405180830381600087803b158015610d9d57600080fd5b505af1158015610db1573d6000803e3d6000fd5b50505050505050565b6000600354905090565b601860009054906101000a900460ff1681565b6000600354600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610fa557610f24826040518060400160405280601681526020017f496e73756666696369656e7420416c6c6f77616e636500000000000000000000815250600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ddd9092919063ffffffff16565b600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b610fb0848484612e41565b90509392505050565b60006009905090565b610fca612dd5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104e90614eea565b60405180910390fd5b81601360146101000a81548160ff02191690831515021790555080601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008082116110c457600080fd5b81600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611146576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113d90614f0a565b60405180910390fd5b6111cf826040518060400160405280601b81526020017f63616e6e6f742068617665206e6567617469766520746f6b656e730000000000815250600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ddd9092919063ffffffff16565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061125e826040518060400160405280601f81526020017f746f74616c20737570706c792063616e6e6f74206265206e6567617469766500815250600354612ddd9092919063ffffffff16565b60038190555061126c6131b2565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314b6ca9633600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518363ffffffff1660e01b8152600401611308929190614dc9565b600060405180830381600087803b15801561132257600080fd5b505af1158015611336573d6000803e3d6000fd5b50505050600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516113989190614faa565b60405180910390a360019050919050565b60006113b782600354610b12565b9050919050565b6113c6612dd5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144a90614eea565b60405180910390fd5b85601660006101000a81548160ff0219169083151502179055508460178190555083601860006101000a81548160ff0219169083151502179055508260198190555081601a60026101000a81548160ff02191690831515021790555080601181905550505050505050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600c5481565b601660009054906101000a900460ff1681565b611535612dd5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b990614eea565b60405180910390fd5b83600a8190555082600b8190555081600c819055506115fc826115ee85876132fe90919063ffffffff16565b6132fe90919063ffffffff16565b600d8190555080600e819055506103e881111561161857600080fd5b6002600f546116279190615150565b600d541061163457600080fd5b50505050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61168b612dd5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611718576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170f90614eea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6117de612dd5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461186b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186290614eea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156118a557600080fd5b81600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166348ef3447336040518263ffffffff1660e01b81526004016119b59190614d41565b600060405180830381600087803b1580156119cf57600080fd5b505af11580156119e3573d6000803e3d6000fd5b505050506001905090565b6119f6612dd5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7a90614eea565b60405180910390fd5b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0b90614eaa565b60405180910390fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f845946286e49c616ec7e2675072463bfbcee62422fef2a420e3bfdb5ad170e1b81604051611b849190614d5c565b60405180910390a150565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60045481565b600b5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60195481565b60606040518060400160405280600881526020017f414646494e495459000000000000000000000000000000000000000000000000815250905090565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3a90614f8a565b60405180910390fd5b6002544211611d87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7e90614f6a565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611e8f612dd5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1390614eea565b60405180910390fd5b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639a89a30f836040518263ffffffff1660e01b8152600401611f779190614d41565b600060405180830381600087803b158015611f9157600080fd5b505af1158015611fa5573d6000803e3d6000fd5b50505050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166316998179826040518263ffffffff1660e01b81526004016120049190614d41565b600060405180830381600087803b15801561201e57600080fd5b505af1158015612032573d6000803e3d6000fd5b505050507f9281a8b8751faa379cc11ff6cc4e470e9006dbc6e629305eae8fb7e6a3e3590d8282604051612067929190614d77565b60405180910390a15050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006120a6338484612e41565b905092915050565b601360149054906101000a900460ff1681565b6000600254905090565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636c0812a8336040518263ffffffff1660e01b815260040161214e9190614d41565b600060405180830381600087803b15801561216857600080fd5b505af115801561217c573d6000803e3d6000fd5b505050506001905090565b61218f612dd5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461221c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221390614eea565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080426122ca91906150fa565b600281905550600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000811561240d57600d549050612413565b600e5490505b919050565b612420612dd5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146124ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a490614eea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561251d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251490614e6a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6125e2612dd5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461266f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266690614eea565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156126f95750601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61270257600080fd5b80600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080156127f457601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314b6ca968360006040518363ffffffff1660e01b81526004016127bd929190614da0565b600060405180830381600087803b1580156127d757600080fd5b505af11580156127eb573d6000803e3d6000fd5b505050506128c3565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314b6ca9683600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518363ffffffff1660e01b8152600401612890929190614dc9565b600060405180830381600087803b1580156128aa57600080fd5b505af11580156128be573d6000803e3d6000fd5b505050505b5050565b6128cf612dd5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461295c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295390614eea565b60405180910390fd5b601a60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156129b757600080fd5b80601a60036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015612aa357600080fd5b505afa158015612ab7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612adb91906144da565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015612b5f57600080fd5b505afa158015612b73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b9791906144da565b6040518363ffffffff1660e01b8152600401612bb4929190614d77565b602060405180830381600087803b158015612bce57600080fd5b505af1158015612be2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0691906144da565b905080601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600354600660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639fe1d3bf836040518263ffffffff1660e01b8152600401612d499190614d41565b600060405180830381600087803b158015612d6357600080fd5b505af1158015612d77573d6000803e3d6000fd5b505050505050565b60115481565b600a5481565b6000612dcd83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061335c565b905092915050565b600033905090565b6000838311158290612e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1c9190614e28565b60405180910390fd5b5060008385612e3491906151db565b9050809150509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea990614f4a565b60405180910390fd5b60008211612ef5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eec90614f2a565b60405180910390fd5b60045482111580612f4f5750600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8590614e4a565b60405180910390fd5b600080601a60009054906101000a900460ff1680612fb85750601a60019054906101000a900460ff165b1561303f57612fc88686866133bf565b80935081925050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161302d9190614faa565b60405180910390a381925050506131ab565b613047613795565b1561306c5761305461386c565b61305f8686866133bf565b8093508192505050613140565b613074613bcb565b1561309957613081613c63565b61308c8686866133bf565b809350819250505061313f565b6130a48686866133bf565b8093508192505050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c4796015546040518263ffffffff1660e01b81526004016131099190614faa565b600060405180830381600087803b15801561312357600080fd5b505af1925050508015613134575060015b61313d5761313e565b5b5b5b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161319d9190614faa565b60405180910390a381925050505b9392505050565b600354600660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600354600660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550565b600080828461330d91906150fa565b905083811015613352576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161334990614e8a565b60405180910390fd5b8091505092915050565b600080831182906133a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339a9190614e28565b60405180910390fd5b50600083856133b29190615150565b9050809150509392505050565b60008061344b836040518060400160405280601481526020017f496e73756666696369656e742042616c616e6365000000000000000000000000815250600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ddd9092919063ffffffff16565b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060006134998661400f565b6134a357836134ae565b6134ad8585614066565b5b905061350281600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546132fe90919063ffffffff16565b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661366557601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314b6ca9687600560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518363ffffffff1660e01b8152600401613632929190614dc9565b600060405180830381600087803b15801561364c57600080fd5b505af1158015613660573d6000803e3d6000fd5b505050505b600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661378557601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314b6ca9686600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518363ffffffff1660e01b8152600401613752929190614dc9565b600060405180830381600087803b15801561376c57600080fd5b505af1158015613780573d6000803e3d6000fd5b505050505b8060019250925050935093915050565b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156138025750601a60009054906101000a900460ff16155b801561381a5750601660009054906101000a900460ff165b80156138675750601754600560003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b905090565b6001601a60006101000a81548160ff0219169083151502179055506000600267ffffffffffffffff8111156138ca577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156138f85781602001602082028036833780820191505090505b5090503081600081518110613936577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156139d857600080fd5b505afa1580156139ec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a1091906144da565b81600181518110613a4a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000613ab1600d54613aa3600a5460175461419b90919063ffffffff16565b612d8b90919063ffffffff16565b9050613abc81614216565b506000613ad4826017546143fe90919063ffffffff16565b9050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478260008630426040518663ffffffff1660e01b8152600401613b3a959493929190614fc5565b600060405180830381600087803b158015613b5457600080fd5b505af1925050508015613b65575060015b613b7157505050613bae565b7fcc0721505755d5580c58ceba07df49e49bf136efae62c3cde523466297d561898183604051613ba292919061501f565b60405180910390a15050505b6000601a60006101000a81548160ff021916908315150217905550565b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015613c385750601a60019054906101000a900460ff16155b8015613c505750601660009054906101000a900460ff165b8015613c5e57506011544710155b905090565b6001601a60016101000a81548160ff021916908315150217905550600080600080601360149054906101000a900460ff1615613e9c57613cc2600d54613cb4600c544761419b90919063ffffffff16565b612d8b90919063ffffffff16565b9150613cd782476143fe90919063ffffffff16565b9050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168161659090604051613d2390614d2c565b600060405180830381858888f193505050503d8060008114613d61576040519150601f19603f3d011682016040523d82523d6000602084013e613d66565b606091505b505080945050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613dd657600080fd5b505af1158015613dea573d6000803e3d6000fd5b50505050601360149054906101000a900460ff1615613e9757601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168261659090604051613e4d90614d2c565b600060405180830381858888f193505050503d8060008114613e8b576040519150601f19603f3d011682016040523d82523d6000602084013e613e90565b606091505b5050809350505b613fb5565b479050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168161659090604051613ee990614d2c565b600060405180830381858888f193505050503d8060008114613f27576040519150601f19603f3d011682016040523d82523d6000602084013e613f2c565b606091505b505080945050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613f9c57600080fd5b505af1158015613fb0573d6000803e3d6000fd5b505050505b7fd3fab875ac05b0ff251a6ca54546bd5d1d035ddc281626e2e0712a43eef95d2e8183604051613fe692919061501f565b60405180910390a1505050506000601a60016101000a81548160ff021916908315150217905550565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16159050919050565b6000806140e8600f546140da6140cb601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146123fb565b8661419b90919063ffffffff16565b612d8b90919063ffffffff16565b905061413c81600560003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546132fe90919063ffffffff16565b600560003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061419281846143fe90919063ffffffff16565b91505092915050565b6000808314156141ae5760009050614210565b600082846141bc9190615181565b90508284826141cb9190615150565b1461420b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161420290614eca565b60405180910390fd5b809150505b92915050565b6000601a60029054906101000a900460ff1661423557600090506143f9565b6142be826040518060400160405280601781526020017f63616e6e6f74206275726e207468697320616d6f756e74000000000000000000815250600560003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ddd9092919063ffffffff16565b600560003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061434d826040518060400160405280601f81526020017f746f74616c20737570706c792063616e6e6f74206265206e6567617469766500815250600354612ddd9092919063ffffffff16565b60038190555061435b6131b2565b601860009054906101000a900460ff161561438e57614387601954600354612d8b90919063ffffffff16565b6017819055505b600073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516143ec9190614faa565b60405180910390a3600190505b919050565b600061444083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612ddd565b905092915050565b60008135905061445781615384565b92915050565b60008151905061446c81615384565b92915050565b6000813590506144818161539b565b92915050565b600081359050614496816153b2565b92915050565b6000813590506144ab816153c9565b92915050565b6000602082840312156144c357600080fd5b60006144d184828501614448565b91505092915050565b6000602082840312156144ec57600080fd5b60006144fa8482850161445d565b91505092915050565b60006020828403121561451557600080fd5b600061452384828501614472565b91505092915050565b6000806040838503121561453f57600080fd5b600061454d85828601614448565b925050602061455e85828601614448565b9150509250929050565b60008060006060848603121561457d57600080fd5b600061458b86828701614448565b935050602061459c86828701614448565b92505060406145ad8682870161449c565b9150509250925092565b600080604083850312156145ca57600080fd5b60006145d885828601614448565b92505060206145e985828601614487565b9150509250929050565b60008060006060848603121561460857600080fd5b600061461686828701614448565b935050602061462786828701614487565b925050604061463886828701614487565b9150509250925092565b6000806040838503121561465557600080fd5b600061466385828601614448565b92505060206146748582860161449c565b9150509250929050565b60006020828403121561469057600080fd5b600061469e84828501614487565b91505092915050565b600080604083850312156146ba57600080fd5b60006146c885828601614487565b92505060206146d985828601614448565b9150509250929050565b60008060008060008060c087890312156146fc57600080fd5b600061470a89828a01614487565b965050602061471b89828a0161449c565b955050604061472c89828a01614487565b945050606061473d89828a0161449c565b935050608061474e89828a01614487565b92505060a061475f89828a0161449c565b9150509295509295509295565b60006020828403121561477e57600080fd5b600061478c8482850161449c565b91505092915050565b6000806000606084860312156147aa57600080fd5b60006147b88682870161449c565b93505060206147c98682870161449c565b92505060406147da8682870161449c565b9150509250925092565b600080600080608085870312156147fa57600080fd5b60006148088782880161449c565b94505060206148198782880161449c565b935050604061482a8782880161449c565b925050606061483b8782880161449c565b91505092959194509250565b6000614853838361486e565b60208301905092915050565b61486881615276565b82525050565b6148778161520f565b82525050565b6148868161520f565b82525050565b6000614897826150aa565b6148a181856150cd565b93506148ac8361509a565b8060005b838110156148dd5781516148c48882614847565b97506148cf836150c0565b9250506001810190506148b0565b5085935050505092915050565b6148f381615233565b82525050565b61490281615288565b82525050565b614911816152ac565b82525050565b6000614922826150b5565b61492c81856150e9565b935061493c8185602086016152e2565b61494581615373565b840191505092915050565b600061495d6011836150e9565b91507f5458204c696d69742045786365656465640000000000000000000000000000006000830152602082019050919050565b600061499d6026836150e9565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614a03601b836150e9565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000614a436024836150e9565b91507f4469737472696275746f7220616c72656164792068617320746869732061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614aa96021836150e9565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b0f6020836150e9565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614b4f601f836150e9565b91507f7573657220646f6573206e6f74206f776e20656e6f75676820746f6b656e73006000830152602082019050919050565b6000614b8f6029836150e9565b91507f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008301527f7468616e207a65726f00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614bf56023836150e9565b91507f42455032303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614c5b6000836150de565b9150600082019050919050565b6000614c756012836150e9565b91507f436f6e7472616374206973206c6f636b656400000000000000000000000000006000830152602082019050919050565b6000614cb56023836150e9565b91507f596f7520646f6e27742068617665207065726d697373696f6e20746f20756e6c60008301527f6f636b00000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b614d178161525f565b82525050565b614d2681615269565b82525050565b6000614d3782614c4e565b9150819050919050565b6000602082019050614d56600083018461487d565b92915050565b6000602082019050614d71600083018461485f565b92915050565b6000604082019050614d8c600083018561487d565b614d99602083018461487d565b9392505050565b6000604082019050614db5600083018561487d565b614dc26020830184614908565b9392505050565b6000604082019050614dde600083018561487d565b614deb6020830184614d0e565b9392505050565b6000602082019050614e0760008301846148ea565b92915050565b6000602082019050614e2260008301846148f9565b92915050565b60006020820190508181036000830152614e428184614917565b905092915050565b60006020820190508181036000830152614e6381614950565b9050919050565b60006020820190508181036000830152614e8381614990565b9050919050565b60006020820190508181036000830152614ea3816149f6565b9050919050565b60006020820190508181036000830152614ec381614a36565b9050919050565b60006020820190508181036000830152614ee381614a9c565b9050919050565b60006020820190508181036000830152614f0381614b02565b9050919050565b60006020820190508181036000830152614f2381614b42565b9050919050565b60006020820190508181036000830152614f4381614b82565b9050919050565b60006020820190508181036000830152614f6381614be8565b9050919050565b60006020820190508181036000830152614f8381614c68565b9050919050565b60006020820190508181036000830152614fa381614ca8565b9050919050565b6000602082019050614fbf6000830184614d0e565b92915050565b600060a082019050614fda6000830188614d0e565b614fe76020830187614908565b8181036040830152614ff9818661488c565b9050615008606083018561487d565b6150156080830184614d0e565b9695505050505050565b60006040820190506150346000830185614d0e565b6150416020830184614d0e565b9392505050565b600060608201905061505d6000830186614d0e565b61506a6020830185614d0e565b6150776040830184614d0e565b949350505050565b60006020820190506150946000830184614d1d565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b60006151058261525f565b91506151108361525f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561514557615144615315565b5b828201905092915050565b600061515b8261525f565b91506151668361525f565b92508261517657615175615344565b5b828204905092915050565b600061518c8261525f565b91506151978361525f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151d0576151cf615315565b5b828202905092915050565b60006151e68261525f565b91506151f18361525f565b92508282101561520457615203615315565b5b828203905092915050565b600061521a8261523f565b9050919050565b600061522c8261523f565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000615281826152be565b9050919050565b60006152938261529a565b9050919050565b60006152a58261523f565b9050919050565b60006152b78261525f565b9050919050565b60006152c9826152d0565b9050919050565b60006152db8261523f565b9050919050565b60005b838110156153005780820151818401526020810190506152e5565b8381111561530f576000848401525b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000601f19601f8301169050919050565b61538d8161520f565b811461539857600080fd5b50565b6153a481615221565b81146153af57600080fd5b50565b6153bb81615233565b81146153c657600080fd5b50565b6153d28161525f565b81146153dd57600080fd5b5056fea2646970667358221220afd9cf9e361599217f172e38412ad69d879a0e8d7546e2276f21cc36c9c66a0c64736f6c63430008000033608060405273099f551ea3cb85707cac6ac507cbc36c96ec64ff600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073e2e6e66551e5062acd56925b48bba981696cccc2600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506ec097ce7bc90715b34b9f1000000000600d55613840600e55610e10600f55614e20601055674563918244f400006011556000601460006101000a81548160ff0219169083151502179055506001601460016101000a81548160ff0219169083151502179055503480156200012257600080fd5b50604051620035a9380380620035a9833981810160405281019062000148919062000239565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000199577310ed43c718714eb63d5aa57b78b54704e256024e6200019b565b805b600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620002b3565b600081519050620002338162000299565b92915050565b6000602082840312156200024c57600080fd5b60006200025c8482850162000222565b91505092915050565b6000620002728262000279565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b620002a48162000265565b8114620002b057600080fd5b50565b6132e680620002c36000396000f3fe6080604052600436106101445760003560e01c80636c0812a8116100b6578063d0e30db01161006f578063d0e30db014610445578063d444ca831461045c578063e73b5ae014610487578063f46c9785146104c4578063ffb2c479146104ef578063ffd49c84146105185761014b565b80636c0812a81461033357806373f3f8291461035c5780639a89a30f146103875780639afade68146103b05780639fe1d3bf146103db578063ce7c2ac2146104045761014b565b806325e243311161010857806325e24331146102215780633203b0941461024c57806337285339146102895780633a98ef39146102b457806348ef3447146102df5780634fab0ae8146103085761014b565b80630ca61cb11461015057806311ce023d1461017957806314b6ca96146101a457806316998179146101cd578063216d6b81146101f65761014b565b3661014b57005b600080fd5b34801561015c57600080fd5b5061017760048036038101906101729190612bcc565b610543565b005b34801561018557600080fd5b5061018e6105b5565b60405161019b9190612f4e565b60405180910390f35b3480156101b057600080fd5b506101cb60048036038101906101c69190612b15565b6105bb565b005b3480156101d957600080fd5b506101f460048036038101906101ef9190612ac3565b610914565b005b34801561020257600080fd5b5061020b6109b0565b6040516102189190612f4e565b60405180910390f35b34801561022d57600080fd5b506102366109b6565b6040516102439190612f4e565b60405180910390f35b34801561025857600080fd5b50610273600480360381019061026e9190612ac3565b6109bc565b6040516102809190612f4e565b60405180910390f35b34801561029557600080fd5b5061029e610ad6565b6040516102ab9190612f4e565b60405180910390f35b3480156102c057600080fd5b506102c9610adc565b6040516102d69190612f4e565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190612ac3565b610ae2565b005b34801561031457600080fd5b5061031d610bd4565b60405161032a9190612f4e565b60405180910390f35b34801561033f57600080fd5b5061035a60048036038101906103559190612ac3565b610bda565b005b34801561036857600080fd5b50610371610ccc565b60405161037e9190612f4e565b60405180910390f35b34801561039357600080fd5b506103ae60048036038101906103a99190612ac3565b610cd2565b005b3480156103bc57600080fd5b506103c5610d6e565b6040516103d29190612f4e565b60405180910390f35b3480156103e757600080fd5b5061040260048036038101906103fd9190612ac3565b610d74565b005b34801561041057600080fd5b5061042b60048036038101906104269190612ac3565b610e10565b60405161043c959493929190612f69565b60405180910390f35b34801561045157600080fd5b5061045a610e46565b005b34801561046857600080fd5b5061047161183d565b60405161047e9190612f4e565b60405180910390f35b34801561049357600080fd5b506104ae60048036038101906104a99190612ac3565b611843565b6040516104bb9190612f4e565b60405180910390f35b3480156104d057600080fd5b506104d961195d565b6040516104e69190612e65565b60405180910390f35b3480156104fb57600080fd5b5061051660048036038101906105119190612b7a565b611a9f565b005b34801561052457600080fd5b5061052d611e23565b60405161053a9190612f4e565b60405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461059b57600080fd5b82600e819055508160108190555080601181905550505050565b600d5481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461061357600080fd5b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015411156106715761066782611e29565b610670826120c0565b5b6000811180156106c357506000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154145b156106d6576106d182612357565b610738565b60008114801561072857506000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154115b156107375761073682612406565b5b5b6107a181610793600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546008546126e890919063ffffffff16565b61273290919063ffffffff16565b60088190555080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550610839600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154612790565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506108ca600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546127c2565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301819055505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461096c57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c5481565b60095481565b600080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541415610a115760009050610ad1565b6000610a5e600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546127c2565b90506000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301549050808211610ab957600092505050610ad1565b610acc81836126e890919063ffffffff16565b925050505b919050565b600f5481565b60085481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b3a57600080fd5b42600f54600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b889190613011565b10610bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbf90612f0e565b60405180910390fd5b610bd181611e29565b50565b60105481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c3257600080fd5b42600f54600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c809190613011565b10610cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb790612f0e565b60405180910390fd5b610cc9816120c0565b50565b60115481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d2a57600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b5481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610dcc57600080fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60076020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154905085565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e9e57600080fd5b601154471015610ead5761183b565b601460009054906101000a900460ff1615611380576000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610f1f9190612e21565b60206040518083038186803b158015610f3757600080fd5b505afa158015610f4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6f9190612ba3565b90506000600267ffffffffffffffff811115610fb4577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610fe25781602001602082028036833780820191505090505b509050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561104d57600080fd5b505afa158015611061573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110859190612aec565b816000815181106110bf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110611156577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b6f9de95601154600084306111e9601e4261273290919063ffffffff16565b6040518663ffffffff1660e01b81526004016112089493929190612e80565b6000604051808303818588803b15801561122157600080fd5b505af193505050508015611233575060015b61123e57505061183b565b60006112fd83600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161129f9190612e21565b60206040518083038186803b1580156112b757600080fd5b505afa1580156112cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ef9190612ba3565b6126e890919063ffffffff16565b90506113148160095461273290919063ffffffff16565b60098190555061135761134660085461133884600d546127f490919063ffffffff16565b61286f90919063ffffffff16565b600a5461273290919063ffffffff16565b600a819055506000601460006101000a81548160ff02191690831515021790555050505061183a565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016113dd9190612e21565b60206040518083038186803b1580156113f557600080fd5b505afa158015611409573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142d9190612ba3565b90506000600267ffffffffffffffff811115611472577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156114a05781602001602082028036833780820191505090505b509050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561150b57600080fd5b505afa15801561151f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115439190612aec565b8160008151811061157d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110611614577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b6f9de95601154600084306116a7601e4261273290919063ffffffff16565b6040518663ffffffff1660e01b81526004016116c69493929190612e80565b6000604051808303818588803b1580156116df57600080fd5b505af1935050505080156116f1575060015b6116fc57505061183b565b60006117bb83600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161175d9190612e21565b60206040518083038186803b15801561177557600080fd5b505afa158015611789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ad9190612ba3565b6126e890919063ffffffff16565b90506117d281600b5461273290919063ffffffff16565b600b819055506118156118046008546117f684600d546127f490919063ffffffff16565b61286f90919063ffffffff16565b600c5461273290919063ffffffff16565b600c819055506001601460006101000a81548160ff0219169083151502179055505050505b5b565b600a5481565b600080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015414156118985760009050611958565b60006118e5600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154612790565b90506000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154905080821161194057600092505050611958565b61195381836126e890919063ffffffff16565b925050505b919050565b6000806004805490509050600081141561197b576000915050611a9c565b6000805b82821015611a945782811061199357600090505b611a00600482815481106119d0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166128b9565b15611a7357611a7260048281548110611a42577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611e29565b5b8080611a7e906131b3565b9150508180611a8c906131b3565b92505061197f565b600193505050505b90565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611af757600080fd5b600060048054905090506000811415611b105750611e20565b6000805a9050601460019054906101000a900460ff1615601460016101000a81548160ff0219169083151502179055506000601460019054906101000a900460ff1615611cbb575b8483108015611b6657508381105b15611cb6578360125410611b7d5760006012819055505b611bec600460125481548110611bbc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612926565b15611c6157611c60600460125481548110611c30577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166120c0565b5b611c86611c775a846126e890919063ffffffff16565b8461273290919063ffffffff16565b92505a915060126000815480929190611c9e906131b3565b91905055508080611cae906131b3565b915050611b58565b611e1b565b5b8483108015611cca57508381105b15611e1a578360135410611ce15760006013819055505b611d50600460135481548110611d20577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166128b9565b15611dc557611dc4600460135481548110611d94577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611e29565b5b611dea611ddb5a846126e890919063ffffffff16565b8461273290919063ffffffff16565b92505a915060136000815480929190611e02906131b3565b91905055508080611e12906131b3565b915050611cbc565b5b505050505b50565b600e5481565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541415611e79576120bd565b6000611e8482611843565b905060008111156120bb576000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401611eee929190612e3c565b602060405180830381600087803b158015611f0857600080fd5b505af1158015611f1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f409190612b51565b905080156120b95742600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611fe182600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015461273290919063ffffffff16565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550612072600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154612790565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055505b505b505b50565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154141561211057612354565b600061211b826109bc565b90506000811115612352576000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401612185929190612e3c565b602060405180830381600087803b15801561219f57600080fd5b505af11580156121b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121d79190612b51565b905080156123505742600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061227882600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206004015461273290919063ffffffff16565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040181905550612309600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546127c2565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301819055505b505b505b50565b600480549050600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506004819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6004600160048054905061241a91906130f2565b81548110612451577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166004600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054815481106124f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600560006004600160048054905061259591906130f2565b815481106125cc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600480548061266d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000905550565b600061272a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612993565b905092915050565b60008082846127419190613011565b905083811015612786576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277d90612eee565b60405180910390fd5b8091505092915050565b60006127bb600d546127ad600c54856127f490919063ffffffff16565b61286f90919063ffffffff16565b9050919050565b60006127ed600d546127df600a54856127f490919063ffffffff16565b61286f90919063ffffffff16565b9050919050565b6000808314156128075760009050612869565b600082846128159190613098565b90508284826128249190613067565b14612864576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285b90612f2e565b60405180910390fd5b809150505b92915050565b60006128b183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506129f7565b905092915050565b600042600e54600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129099190613011565b10801561291f575060105461291d83611843565b115b9050919050565b600042600e54600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129769190613011565b10801561298c575060105461298a836109bc565b115b9050919050565b60008383111582906129db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d29190612ecc565b60405180910390fd5b50600083856129ea91906130f2565b9050809150509392505050565b60008083118290612a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a359190612ecc565b60405180910390fd5b5060008385612a4d9190613067565b9050809150509392505050565b600081359050612a698161326b565b92915050565b600081519050612a7e8161326b565b92915050565b600081519050612a9381613282565b92915050565b600081359050612aa881613299565b92915050565b600081519050612abd81613299565b92915050565b600060208284031215612ad557600080fd5b6000612ae384828501612a5a565b91505092915050565b600060208284031215612afe57600080fd5b6000612b0c84828501612a6f565b91505092915050565b60008060408385031215612b2857600080fd5b6000612b3685828601612a5a565b9250506020612b4785828601612a99565b9150509250929050565b600060208284031215612b6357600080fd5b6000612b7184828501612a84565b91505092915050565b600060208284031215612b8c57600080fd5b6000612b9a84828501612a99565b91505092915050565b600060208284031215612bb557600080fd5b6000612bc384828501612aae565b91505092915050565b600080600060608486031215612be157600080fd5b6000612bef86828701612a99565b9350506020612c0086828701612a99565b9250506040612c1186828701612a99565b9150509250925092565b6000612c278383612c33565b60208301905092915050565b612c3c81613126565b82525050565b612c4b81613126565b82525050565b6000612c5c82612fcc565b612c668185612fef565b9350612c7183612fbc565b8060005b83811015612ca2578151612c898882612c1b565b9750612c9483612fe2565b925050600181019050612c75565b5085935050505092915050565b612cb881613138565b82525050565b612cc78161316e565b82525050565b6000612cd882612fd7565b612ce28185613000565b9350612cf2818560208601613180565b612cfb8161325a565b840191505092915050565b6000612d13601b83613000565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000612d53603383613000565b91507f6d7573742077616974206174206c6561737420746865206d696e696d756d206160008301527f75746f20776974686472617720706572696f64000000000000000000000000006020830152604082019050919050565b6000612db9602183613000565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b612e1b81613164565b82525050565b6000602082019050612e366000830184612c42565b92915050565b6000604082019050612e516000830185612c42565b612e5e6020830184612e12565b9392505050565b6000602082019050612e7a6000830184612caf565b92915050565b6000608082019050612e956000830187612cbe565b8181036020830152612ea78186612c51565b9050612eb66040830185612c42565b612ec36060830184612e12565b95945050505050565b60006020820190508181036000830152612ee68184612ccd565b905092915050565b60006020820190508181036000830152612f0781612d06565b9050919050565b60006020820190508181036000830152612f2781612d46565b9050919050565b60006020820190508181036000830152612f4781612dac565b9050919050565b6000602082019050612f636000830184612e12565b92915050565b600060a082019050612f7e6000830188612e12565b612f8b6020830187612e12565b612f986040830186612e12565b612fa56060830185612e12565b612fb26080830184612e12565b9695505050505050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600061301c82613164565b915061302783613164565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561305c5761305b6131fc565b5b828201905092915050565b600061307282613164565b915061307d83613164565b92508261308d5761308c61322b565b5b828204905092915050565b60006130a382613164565b91506130ae83613164565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156130e7576130e66131fc565b5b828202905092915050565b60006130fd82613164565b915061310883613164565b92508282101561311b5761311a6131fc565b5b828203905092915050565b600061313182613144565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061317982613164565b9050919050565b60005b8381101561319e578082015181840152602081019050613183565b838111156131ad576000848401525b50505050565b60006131be82613164565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156131f1576131f06131fc565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000601f19601f8301169050919050565b61327481613126565b811461327f57600080fd5b50565b61328b81613138565b811461329657600080fd5b50565b6132a281613164565b81146132ad57600080fd5b5056fea2646970667358221220c4db611f3733bde48c957a8a760531fa1c145460021dddfe370620a8cd9c85a264736f6c63430008000033

Deployed ByteCode Sourcemap

621:17538:8:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2129:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4343:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4617:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12669:109;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15279:232;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4002:88;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2273:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5404:359;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4521:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15560:230;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17039:826;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5057:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14699:521;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12994:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1450:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2093:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13534:421;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4095:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1245:145:7;;;;;;;;;;;;;:::i;:::-;;14001:241:8;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12284:134;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16360:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12826:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1002:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1409:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;622:77:7;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2321:60:8;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4430:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13175:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2235:287:7;;;;;;;;;;;;;:::i;:::-;;16728:255:8;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1882:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5211:154;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1907:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1785:87:7;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1983:38:8;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12472:132;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1945:221:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4205:133:8;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1640:80;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13349:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1539:240:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14307:341:8;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15842:460;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1769:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1375:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2129:52;;;;:::o;4343:81::-;4380:13;4412:5;;;;;;;;;;;;;;;;;4405:12;;4343:81;:::o;4617:212::-;4692:4;4743:6;4708:11;:23;4720:10;4708:23;;;;;;;;;;;;;;;:32;4732:7;4708:32;;;;;;;;;;;;;;;:41;;;;4785:7;4764:37;;4773:10;4764:37;;;4794:6;4764:37;;;;;;:::i;:::-;;;;;;;;4818:4;4811:11;;4617:212;;;;:::o;12669:109::-;12714:4;12729:11;;;;;;;;;;;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12767:4;12760:11;;12669:109;:::o;15279:232::-;836:12:7;:10;:12::i;:::-;826:22;;:6;;;;;;;;;;:22;;;818:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;15417:11:8::1;;;;;;;;;;;:35;;;15453:10;15465:16;15483:20;15417:87;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;15279:232:::0;;;:::o;4002:88::-;4057:7;4075:12;;4068:19;;4002:88;:::o;2273:42::-;;;;;;;;;;;;;:::o;5404:359::-;5504:4;5558:12;;5523:11;:19;5535:6;5523:19;;;;;;;;;;;;;;;:31;5543:10;5523:31;;;;;;;;;;;;;;;;:47;5520:179;;5619:69;5655:6;5619:69;;;;;;;;;;;;;;;;;:11;:19;5631:6;5619:19;;;;;;;;;;;;;;;:31;5639:10;5619:31;;;;;;;;;;;;;;;;:35;;:69;;;;;:::i;:::-;5585:11;:19;5597:6;5585:19;;;;;;;;;;;;;;;:31;5605:10;5585:31;;;;;;;;;;;;;;;:103;;;;5520:179;5716:40;5730:6;5738:9;5749:6;5716:13;:40::i;:::-;5709:47;;5404:359;;;;;:::o;4521:90::-;4571:5;907:1;4588:16;;4521:90;:::o;15560:230::-;836:12:7;:10;:12::i;:::-;826:22;;:6;;;;;;;;;;:22;;;818:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;15710:19:8::1;15683:24;;:46;;;;;;;;;;;;;;;;;;15762:21;15739:20;;:44;;;;;;;;;;;;;;;;;;15560:230:::0;;:::o;17039:826::-;17092:4;17176:1;17166:7;:11;17158:20;;;;;;17268:7;17243:9;:21;17253:10;17243:21;;;;;;;;;;;;;;;;:32;;17235:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;17382:65;17408:7;17382:65;;;;;;;;;;;;;;;;;:9;:21;17392:10;17382:21;;;;;;;;;;;;;;;;:25;;:65;;;;;:::i;:::-;17358:9;:21;17368:10;17358:21;;;;;;;;;;;;;;;:89;;;;17515:60;17532:7;17515:60;;;;;;;;;;;;;;;;;:12;;:16;;:60;;;;;:::i;:::-;17500:12;:75;;;;17636:17;:15;:17::i;:::-;17699:11;;;;;;;;;;;:20;;;17720:10;17732:9;:21;17742:10;17732:21;;;;;;;;;;;;;;;;17699:55;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17825:1;17796:41;;17805:10;17796:41;;;17829:7;17796:41;;;;;;:::i;:::-;;;;;;;;17854:4;17847:11;;17039:826;;;:::o;5057:115::-;5112:4;5135:30;5143:7;5152:12;;5135:7;:30::i;:::-;5128:37;;5057:115;;;:::o;14699:521::-;836:12:7;:10;:12::i;:::-;826:22;;:6;;;;;;;;;;:22;;;818:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;14933:12:8::1;14919:11;;:26;;;;;;;;;;;;;;;;;;14971:14;14955:13;:30;;;;15020:23;14995:22;;:48;;;;;;;;;;;;;;;;;;15095:27;15053:39;:69;;;;15146:12;15132:11;;:26;;;;;;;;;;;;;;;;;;15190:23;15168:19;:45;;;;14699:521:::0;;;;;;:::o;12994:120::-;13060:4;13083:16;:24;13100:6;13083:24;;;;;;;;;;;;;;;;;;;;;;;;;13076:31;;12994:120;;;:::o;1450:32::-;;;;:::o;2093:30::-;;;;;;;;;;;;;:::o;13534:421::-;836:12:7;:10;:12::i;:::-;826:22;;:6;;;;;;;;;;:22;;;818:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;13672:8:8::1;13662:7;:18;;;;13706:14;13690:13;:30;;;;13745:13;13730:12;:28;;;;13784:47;13817:13;13784:28;13797:14;13784:8;:12;;:28;;;;:::i;:::-;:32;;:47;;;;:::i;:::-;13768:13;:63;;;;13856:7;13841:12;:22;;;;13892:4;13881:7;:15;;13873:24;;;::::0;::::1;;13946:1;13931:14;;:16;;;;:::i;:::-;13915:13;;:32;13907:41;;;::::0;::::1;;13534:421:::0;;;;:::o;4095:105::-;4161:7;4179:9;:18;4189:7;4179:18;;;;;;;;;;;;;;;;4172:25;;4095:105;;;:::o;1245:145:7:-;836:12;:10;:12::i;:::-;826:22;;:6;;;;;;;;;;:22;;;818:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;1351:1:::1;1314:40;;1335:6;::::0;::::1;;;;;;;;1314:40;;;;;;;;;;;;1381:1;1364:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;1245:145::o:0;14001:241:8:-;836:12:7;:10;:12::i;:::-;826:22;;:6;;;;;;;;;;:22;;;818:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;14142:1:8::1;14124:20;;:6;:20;;;;14116:29;;;::::0;::::1;;14177:9;14155:11;:19;14167:6;14155:19;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;14222:13;14196:15;:23;14212:6;14196:23;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;14001:241:::0;;;:::o;12284:134::-;12332:4;12348:11;;;;;;;;;;;:30;;;12379:10;12348:42;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12407:4;12400:11;;12284:134;:::o;16360:287::-;836:12:7;:10;:12::i;:::-;826:22;;:6;;;;;;;;;;:22;;;818:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;16479:11:8::1;;;;;;;;;;;16453:38;;:14;:38;;;;16445:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;16576:14;16542:11;;:49;;;;;;;;;;;;;;;;;;16606:34;16625:14;16606:34;;;;;;:::i;:::-;;;;;;;;16360:287:::0;:::o;12826:110::-;12887:4;12910:11;:19;12922:6;12910:19;;;;;;;;;;;;;;;;;;;;;;;;;12903:26;;12826:110;;;:::o;1002:51::-;;;;:::o;1409:35::-;;;;:::o;622:77:7:-;660:7;686:6;;;;;;;;;;;679:13;;622:77;:::o;2321:60:8:-;;;;:::o;4430:85::-;4469:13;4501:7;;;;;;;;;;;;;;;;;4494:14;;4430:85;:::o;13175:118::-;13240:4;13263:15;:23;13279:6;13263:23;;;;;;;;;;;;;;;;;;;;;;;;;13256:30;;13175:118;;;:::o;2235:287:7:-;2304:10;2286:28;;:14;;;;;;;;;;;:28;;;2278:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2390:9;;2372:15;:27;2364:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;2467:14;;;;;;;;;;;2438:44;;2459:6;;;;;;;;;;2438:44;;;;;;;;;;;;2501:14;;;;;;;;;;;2492:6;;:23;;;;;;;;;;;;;;;;;;2235:287::o;16728:255:8:-;836:12:7;:10;:12::i;:::-;826:22;;:6;;;;;;;;;;:22;;;818:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;16823:11:8::1;;;;;;;;;;;:30;;;16854:9;16823:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;16874:11;;;;;;;;;;;:31;;;16906:10;16874:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;16932:44;16954:9;16965:10;16932:44;;;;;;;:::i;:::-;;;;;;;;16728:255:::0;;:::o;1882:19::-;;;;;;;;;;;;;:::o;5211:154::-;5291:4;5314:44;5328:10;5340:9;5351:6;5314:13;:44::i;:::-;5307:51;;5211:154;;;;:::o;1907:43::-;;;;;;;;;;;;;:::o;1785:87:7:-;1830:7;1856:9;;1849:16;;1785:87;:::o;1983:38:8:-;;;;;;;;;;;;;:::o;12472:132::-;12519:4;12535:11;;;;;;;;;;;:29;;;12565:10;12535:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12593:4;12586:11;;12472:132;:::o;1945:221:7:-;836:12;:10;:12::i;:::-;826:22;;:6;;;;;;;;;;:22;;;818:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;2025:6:::1;::::0;::::1;;;;;;;;2008:14;;:23;;;;;;;;;;;;;;;;;;2058:1;2041:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;2100:4;2082:15;:22;;;;:::i;:::-;2070:9;:34;;;;2156:1;2119:40;;2140:6;::::0;::::1;;;;;;;;2119:40;;;;;;;;;;;;1945:221:::0;:::o;4205:133:8:-;4289:7;4307:11;:19;4319:6;4307:19;;;;;;;;;;;;;;;:28;4327:7;4307:28;;;;;;;;;;;;;;;;4300:35;;4205:133;;;;:::o;1640:80::-;;;;;;;;;;;;;:::o;13349:146::-;13405:7;13427;13424:36;;;13444:13;;13437:20;;;;13424:36;13476:12;;13469:19;;13349:146;;;;:::o;1539:240:7:-;836:12;:10;:12::i;:::-;826:22;;:6;;;;;;;;;;:22;;;818:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;1647:1:::1;1627:22;;:8;:22;;;;1619:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;1736:8;1707:38;;1728:6;::::0;::::1;;;;;;;;1707:38;;;;;;;;;;;;1764:8;1755:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;1539:240:::0;:::o;14307:341:8:-;836:12:7;:10;:12::i;:::-;826:22;;:6;;;;;;;;;;:22;;;818:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;14420:4:8::1;14402:23;;:6;:23;;;;:41;;;;;14439:4;;;;;;;;;;;14429:14;;:6;:14;;;;14402:41;14394:50;;;::::0;::::1;;14481:6;14454:16;:24;14471:6;14454:24;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;14500:6;14497:145;;;14522:11;;;;;;;;;;;:20;;;14543:6;14551:1;14522:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;14497:145;;;14584:11;;;;;;;;;;;:20;;;14605:6;14613:9;:17;14623:6;14613:17;;;;;;;;;;;;;;;;14584:47;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;14497:145;14307:341:::0;;:::o;15842:460::-;836:12:7;:10;:12::i;:::-;826:22;;:6;;;;;;;;;;:22;;;818:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;15928:10:8::1;;;;;;;;;;;15917:21;;:7;:21;;;;15909:30;;;::::0;::::1;;15962:7;15949:10;;:20;;;;;;;;;;;;;;;;;;16007:7;15979:6;;:36;;;;;;;;;;;;;;;;;;16025:22;16068:6;;;;;;;;;;;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16050:59;;;16118:4;16125:6;;;;;;;;;;;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16050:89;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16025:114;;16156:14;16149:4;;:21;;;;;;;;;;;;;;;;;;16226:12;;16180:11;:26;16200:4;16180:26;;;;;;;;;;;;;;;:43;16215:6;;;;;;;;;;;16180:43;;;;;;;;;;;;;;;:58;;;;16248:11;;;;;;;;;;;:38;;;16287:7;16248:47;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;895:1:7;15842:460:8::0;:::o;1769:47::-;;;;:::o;1375:28::-;;;;:::o;2535:130:9:-;2593:7;2619:39;2623:1;2626;2619:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;2612:46;;2535:130;;;;:::o;88:113:2:-;141:15;183:10;168:26;;88:113;:::o;1180:187:9:-;1266:7;1298:1;1293;:6;;1301:12;1285:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;1324:9;1340:1;1336;:5;;;;:::i;:::-;1324:17;;1359:1;1352:8;;;1180:187;;;;;:::o;5802:1516:8:-;5894:4;5971:1;5950:23;;:9;:23;;;;5942:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;6040:1;6031:6;:10;6023:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;6173:12;;6163:6;:22;;:49;;;;6189:15;:23;6205:6;6189:23;;;;;;;;;;;;;;;;;;;;;;;;;6163:49;6155:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;6282:12;6354:22;6442:6;;;;;;;;;;;:24;;;;6452:14;;;;;;;;;;;6442:24;6439:218;;;6510:45;6529:6;6537:9;6548:6;6510:18;:45::i;:::-;6482:73;;;;;;;;6592:9;6575:43;;6584:6;6575:43;;;6603:14;6575:43;;;;;;:::i;:::-;;;;;;;;6639:7;6632:14;;;;;;6439:218;6738:16;:14;:16::i;:::-;6735:486;;;6771:10;:8;:10::i;:::-;6823:45;6842:6;6850:9;6861:6;6823:18;:45::i;:::-;6795:73;;;;;;;;6735:486;;;6889:28;:26;:28::i;:::-;6885:336;;;6933:22;:20;:22::i;:::-;6997:45;7016:6;7024:9;7035:6;6997:18;:45::i;:::-;6969:73;;;;;;;;6885:336;;;7101:45;7120:6;7128:9;7139:6;7101:18;:45::i;:::-;7073:73;;;;;;;;7164:11;;;;;;;;;;;:19;;;7184:14;;7164:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7160:51;;;;;;6885:336;6735:486;7261:9;7244:43;;7253:6;7244:43;;;7272:14;7244:43;;;;;;:::i;:::-;;;;;;;;7304:7;7297:14;;;;5802:1516;;;;;;:::o;4839:176::-;4930:12;;4884:11;:26;4904:4;4884:26;;;;;;;;;;;;;;;:43;4919:6;;;;;;;;;;;4884:43;;;;;;;;;;;;;;;:58;;;;4996:12;;4952:11;:26;4972:4;4952:26;;;;;;;;;;;;;;;:41;4987:4;;;;;;;;;;;4952:41;;;;;;;;;;;;;;;:56;;;;4839:176::o;308::9:-;366:7;385:9;401:1;397;:5;;;;:::i;:::-;385:17;;425:1;420;:6;;412:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;476:1;469:8;;;308:176;;;;:::o;3147:272::-;3233:7;3264:1;3260;:5;3267:12;3252:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;3290:9;3306:1;3302;:5;;;;:::i;:::-;3290:17;;3411:1;3404:8;;;3147:272;;;;;:::o;7418:845:8:-;7515:7;7524:4;7600:53;7622:6;7600:53;;;;;;;;;;;;;;;;;:9;:17;7610:6;7600:17;;;;;;;;;;;;;;;;:21;;:53;;;;;:::i;:::-;7580:9;:17;7590:6;7580:17;;;;;;;;;;;;;;;:73;;;;7705:22;7730:21;7744:6;7730:13;:21::i;:::-;:59;;7783:6;7730:59;;;7754:26;7762:9;7773:6;7754:7;:26::i;:::-;7730:59;7705:84;;7857:40;7882:14;7857:9;:20;7867:9;7857:20;;;;;;;;;;;;;;;;:24;;:40;;;;:::i;:::-;7834:9;:20;7844:9;7834:20;;;;;;;;;;;;;;;:63;;;;7950:16;:24;7967:6;7950:24;;;;;;;;;;;;;;;;;;;;;;;;;7946:102;;7990:11;;;;;;;;;;;:20;;;8011:6;8019:9;:17;8029:6;8019:17;;;;;;;;;;;;;;;;7990:47;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7946:102;8061:16;:27;8078:9;8061:27;;;;;;;;;;;;;;;;;;;;;;;;;8057:111;;8104:11;;;;;;;;;;;:20;;;8125:9;8136;:20;8146:9;8136:20;;;;;;;;;;;;;;;;8104:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8057:111;8235:14;8251:4;8227:29;;;;;7418:845;;;;;;:::o;8884:192::-;8933:4;8970;;;;;;;;;;;8956:18;;:10;:18;;;;:37;;;;;8987:6;;;;;;;;;;;8986:7;8956:37;:60;;;;;9005:11;;;;;;;;;;;8956:60;:113;;;;;9056:13;;9028:9;:24;9046:4;9028:24;;;;;;;;;;;;;;;;:41;;8956:113;8949:120;;8884:192;:::o;9262:798::-;2519:4;2510:6;;:13;;;;;;;;;;;;;;;;;;9343:21:::1;9381:1;9367:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9343:40;;9411:4;9393;9398:1;9393:7;;;;;;;;;;;;;;;;;;;;;:23;;;;;;;;;::::0;::::1;9436:6;;;;;;;;;;;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9426:4;9431:1;9426:7;;;;;;;;;;;;;;;;;;;;;:23;;;;;;;;;::::0;::::1;9498:18;9519:45;9550:13;;9519:26;9537:7;;9519:13;;:17;;:26;;;;:::i;:::-;:30;;:45;;;;:::i;:::-;9498:66;;9597:22;9608:10;9597;:22::i;:::-;;9671:18;9692:29;9710:10;9692:13;;:17;;:29;;;;:::i;:::-;9671:50;;9766:6;;;;;;;;;;;:57;;;9837:10;9861:1;9876:4;9902;9921:15;9766:180;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;9762:202;;9956:7;;;;;9762:202;10018:35;10030:10;10042;10018:35;;;;;;;:::i;:::-;;;;;;;;2525:1;;;;2537:5:::0;2528:6;;:14;;;;;;;;;;;;;;;;;;9262:798::o;10070:213::-;10129:4;10166;;;;;;;;;;;10152:18;;:10;:18;;;;:45;;;;;10183:14;;;;;;;;;;;10182:15;10152:45;:68;;;;;10209:11;;;;;;;;;;;10152:68;:124;;;;;10257:19;;10232:21;:44;;10152:124;10145:131;;10070:213;:::o;10293:1119::-;2593:4;2576:14;;:21;;;;;;;;;;;;;;;;;;10365:12:::1;10379:15:::0;10404:26:::1;10432:27:::0;10497:24:::1;;;;;;;;;;;10493:841;;;10558:58;10602:13;;10558:39;10584:12;;10558:21;:25;;:39;;;;:::i;:::-;:43;;:58;;;;:::i;:::-;10537:79;;10652:45;10678:18;10652:21;:25;;:45;;;;:::i;:::-;10630:67;;10773:11;;;;;;;;;;;10757:34;;10799:19;10825:5;10757:78;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10744:91;;;;;10849:11;;;;;;;;;;;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;10925:24;;;;;;;;;;;10921:156;;;10993:20;;;;;;;;;;;10985:34;;11027:18;11052:5;10985:77;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10969:93;;;;;10921:156;10493:841;;;11129:21;11107:43;;11226:11;;;;;;;;;;;11210:34;;11252:19;11278:5;11210:78;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11197:91;;;;;11302:11;;;;;;;;;;;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;10493:841;11348:57;11365:19;11386:18;11348:57;;;;;;;:::i;:::-;;;;;;;;2599:1;;;;2619:5:::0;2602:14;;:22;;;;;;;;;;;;;;;;;;10293:1119::o;8323:112::-;8385:4;8409:11;:19;8421:6;8409:19;;;;;;;;;;;;;;;;;;;;;;;;;8408:20;8401:27;;8323:112;;;:::o;8532:290::-;8601:7;8620:17;8640:61;8686:14;;8640:41;8651:29;8675:4;;;;;;;;;;;8663:16;;:8;:16;;;8651:11;:29::i;:::-;8640:6;:10;;:41;;;;:::i;:::-;:45;;:61;;;;:::i;:::-;8620:81;;8738:39;8767:9;8738;:24;8756:4;8738:24;;;;;;;;;;;;;;;;:28;;:39;;;;:::i;:::-;8711:9;:24;8729:4;8711:24;;;;;;;;;;;;;;;:66;;;;8794:21;8805:9;8794:6;:10;;:21;;;;:::i;:::-;8787:28;;;8532:290;;;;:::o;1614:459:9:-;1672:7;1918:1;1913;:6;1909:45;;;1942:1;1935:8;;;;1909:45;1964:9;1980:1;1976;:5;;;;:::i;:::-;1964:17;;2008:1;2003;1999;:5;;;;:::i;:::-;:10;1991:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;2065:1;2058:8;;;1614:459;;;;;:::o;11461:772:8:-;11519:4;11540:11;;;;;;;;;;;11535:55;;11574:5;11567:12;;;;11535:55;11664:68;11693:11;11664:68;;;;;;;;;;;;;;;;;:9;:24;11682:4;11664:24;;;;;;;;;;;;;;;;:28;;:68;;;;;:::i;:::-;11637:9;:24;11655:4;11637:24;;;;;;;;;;;;;;;:95;;;;11788:64;11805:11;11788:64;;;;;;;;;;;;;;;;;:12;;:16;;:64;;;;;:::i;:::-;11773:12;:79;;;;11905:17;:15;:17::i;:::-;11982:22;;;;;;;;;;;11978:126;;;12036:57;12053:39;;12036:12;;:16;;:57;;;;:::i;:::-;12020:13;:73;;;;11978:126;12189:1;12157:48;;12174:4;12157:48;;;12193:11;12157:48;;;;;;:::i;:::-;;;;;;;;12222:4;12215:11;;11461:772;;;;:::o;755:134:9:-;813:7;839:43;843:1;846;839:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;832:50;;755:134;;;;:::o;7:139:10:-;;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:143::-;;240:6;234:13;225:22;;256:33;283:5;256:33;:::i;:::-;215:80;;;;:::o;301:155::-;;393:6;380:20;371:29;;409:41;444:5;409:41;:::i;:::-;361:95;;;;:::o;462:133::-;;543:6;530:20;521:29;;559:30;583:5;559:30;:::i;:::-;511:84;;;;:::o;601:139::-;;685:6;672:20;663:29;;701:33;728:5;701:33;:::i;:::-;653:87;;;;:::o;746:262::-;;854:2;842:9;833:7;829:23;825:32;822:2;;;870:1;867;860:12;822:2;913:1;938:53;983:7;974:6;963:9;959:22;938:53;:::i;:::-;928:63;;884:117;812:196;;;;:::o;1014:284::-;;1133:2;1121:9;1112:7;1108:23;1104:32;1101:2;;;1149:1;1146;1139:12;1101:2;1192:1;1217:64;1273:7;1264:6;1253:9;1249:22;1217:64;:::i;:::-;1207:74;;1163:128;1091:207;;;;:::o;1304:278::-;;1420:2;1408:9;1399:7;1395:23;1391:32;1388:2;;;1436:1;1433;1426:12;1388:2;1479:1;1504:61;1557:7;1548:6;1537:9;1533:22;1504:61;:::i;:::-;1494:71;;1450:125;1378:204;;;;:::o;1588:407::-;;;1713:2;1701:9;1692:7;1688:23;1684:32;1681:2;;;1729:1;1726;1719:12;1681:2;1772:1;1797:53;1842:7;1833:6;1822:9;1818:22;1797:53;:::i;:::-;1787:63;;1743:117;1899:2;1925:53;1970:7;1961:6;1950:9;1946:22;1925:53;:::i;:::-;1915:63;;1870:118;1671:324;;;;;:::o;2001:552::-;;;;2143:2;2131:9;2122:7;2118:23;2114:32;2111:2;;;2159:1;2156;2149:12;2111:2;2202:1;2227:53;2272:7;2263:6;2252:9;2248:22;2227:53;:::i;:::-;2217:63;;2173:117;2329:2;2355:53;2400:7;2391:6;2380:9;2376:22;2355:53;:::i;:::-;2345:63;;2300:118;2457:2;2483:53;2528:7;2519:6;2508:9;2504:22;2483:53;:::i;:::-;2473:63;;2428:118;2101:452;;;;;:::o;2559:401::-;;;2681:2;2669:9;2660:7;2656:23;2652:32;2649:2;;;2697:1;2694;2687:12;2649:2;2740:1;2765:53;2810:7;2801:6;2790:9;2786:22;2765:53;:::i;:::-;2755:63;;2711:117;2867:2;2893:50;2935:7;2926:6;2915:9;2911:22;2893:50;:::i;:::-;2883:60;;2838:115;2639:321;;;;;:::o;2966:540::-;;;;3102:2;3090:9;3081:7;3077:23;3073:32;3070:2;;;3118:1;3115;3108:12;3070:2;3161:1;3186:53;3231:7;3222:6;3211:9;3207:22;3186:53;:::i;:::-;3176:63;;3132:117;3288:2;3314:50;3356:7;3347:6;3336:9;3332:22;3314:50;:::i;:::-;3304:60;;3259:115;3413:2;3439:50;3481:7;3472:6;3461:9;3457:22;3439:50;:::i;:::-;3429:60;;3384:115;3060:446;;;;;:::o;3512:407::-;;;3637:2;3625:9;3616:7;3612:23;3608:32;3605:2;;;3653:1;3650;3643:12;3605:2;3696:1;3721:53;3766:7;3757:6;3746:9;3742:22;3721:53;:::i;:::-;3711:63;;3667:117;3823:2;3849:53;3894:7;3885:6;3874:9;3870:22;3849:53;:::i;:::-;3839:63;;3794:118;3595:324;;;;;:::o;3925:256::-;;4030:2;4018:9;4009:7;4005:23;4001:32;3998:2;;;4046:1;4043;4036:12;3998:2;4089:1;4114:50;4156:7;4147:6;4136:9;4132:22;4114:50;:::i;:::-;4104:60;;4060:114;3988:193;;;;:::o;4187:401::-;;;4309:2;4297:9;4288:7;4284:23;4280:32;4277:2;;;4325:1;4322;4315:12;4277:2;4368:1;4393:50;4435:7;4426:6;4415:9;4411:22;4393:50;:::i;:::-;4383:60;;4339:114;4492:2;4518:53;4563:7;4554:6;4543:9;4539:22;4518:53;:::i;:::-;4508:63;;4463:118;4267:321;;;;;:::o;4594:972::-;;;;;;;4778:3;4766:9;4757:7;4753:23;4749:33;4746:2;;;4795:1;4792;4785:12;4746:2;4838:1;4863:50;4905:7;4896:6;4885:9;4881:22;4863:50;:::i;:::-;4853:60;;4809:114;4962:2;4988:53;5033:7;5024:6;5013:9;5009:22;4988:53;:::i;:::-;4978:63;;4933:118;5090:2;5116:50;5158:7;5149:6;5138:9;5134:22;5116:50;:::i;:::-;5106:60;;5061:115;5215:2;5241:53;5286:7;5277:6;5266:9;5262:22;5241:53;:::i;:::-;5231:63;;5186:118;5343:3;5370:50;5412:7;5403:6;5392:9;5388:22;5370:50;:::i;:::-;5360:60;;5314:116;5469:3;5496:53;5541:7;5532:6;5521:9;5517:22;5496:53;:::i;:::-;5486:63;;5440:119;4736:830;;;;;;;;:::o;5572:262::-;;5680:2;5668:9;5659:7;5655:23;5651:32;5648:2;;;5696:1;5693;5686:12;5648:2;5739:1;5764:53;5809:7;5800:6;5789:9;5785:22;5764:53;:::i;:::-;5754:63;;5710:117;5638:196;;;;:::o;5840:552::-;;;;5982:2;5970:9;5961:7;5957:23;5953:32;5950:2;;;5998:1;5995;5988:12;5950:2;6041:1;6066:53;6111:7;6102:6;6091:9;6087:22;6066:53;:::i;:::-;6056:63;;6012:117;6168:2;6194:53;6239:7;6230:6;6219:9;6215:22;6194:53;:::i;:::-;6184:63;;6139:118;6296:2;6322:53;6367:7;6358:6;6347:9;6343:22;6322:53;:::i;:::-;6312:63;;6267:118;5940:452;;;;;:::o;6398:698::-;;;;;6557:3;6545:9;6536:7;6532:23;6528:33;6525:2;;;6574:1;6571;6564:12;6525:2;6617:1;6642:53;6687:7;6678:6;6667:9;6663:22;6642:53;:::i;:::-;6632:63;;6588:117;6744:2;6770:53;6815:7;6806:6;6795:9;6791:22;6770:53;:::i;:::-;6760:63;;6715:118;6872:2;6898:53;6943:7;6934:6;6923:9;6919:22;6898:53;:::i;:::-;6888:63;;6843:118;7000:2;7026:53;7071:7;7062:6;7051:9;7047:22;7026:53;:::i;:::-;7016:63;;6971:118;6515:581;;;;;;;:::o;7102:179::-;;7192:46;7234:3;7226:6;7192:46;:::i;:::-;7270:4;7265:3;7261:14;7247:28;;7182:99;;;;:::o;7287:147::-;7382:45;7421:5;7382:45;:::i;:::-;7377:3;7370:58;7360:74;;:::o;7440:108::-;7517:24;7535:5;7517:24;:::i;:::-;7512:3;7505:37;7495:53;;:::o;7554:118::-;7641:24;7659:5;7641:24;:::i;:::-;7636:3;7629:37;7619:53;;:::o;7708:732::-;;7856:54;7904:5;7856:54;:::i;:::-;7926:86;8005:6;8000:3;7926:86;:::i;:::-;7919:93;;8036:56;8086:5;8036:56;:::i;:::-;8115:7;8146:1;8131:284;8156:6;8153:1;8150:13;8131:284;;;8232:6;8226:13;8259:63;8318:3;8303:13;8259:63;:::i;:::-;8252:70;;8345:60;8398:6;8345:60;:::i;:::-;8335:70;;8191:224;8178:1;8175;8171:9;8166:14;;8131:284;;;8135:14;8431:3;8424:10;;7832:608;;;;;;;:::o;8446:109::-;8527:21;8542:5;8527:21;:::i;:::-;8522:3;8515:34;8505:50;;:::o;8561:203::-;8684:73;8751:5;8684:73;:::i;:::-;8679:3;8672:86;8662:102;;:::o;8770:147::-;8865:45;8904:5;8865:45;:::i;:::-;8860:3;8853:58;8843:74;;:::o;8923:364::-;;9039:39;9072:5;9039:39;:::i;:::-;9094:71;9158:6;9153:3;9094:71;:::i;:::-;9087:78;;9174:52;9219:6;9214:3;9207:4;9200:5;9196:16;9174:52;:::i;:::-;9251:29;9273:6;9251:29;:::i;:::-;9246:3;9242:39;9235:46;;9015:272;;;;;:::o;9293:315::-;;9456:67;9520:2;9515:3;9456:67;:::i;:::-;9449:74;;9553:19;9549:1;9544:3;9540:11;9533:40;9599:2;9594:3;9590:12;9583:19;;9439:169;;;:::o;9614:370::-;;9777:67;9841:2;9836:3;9777:67;:::i;:::-;9770:74;;9874:34;9870:1;9865:3;9861:11;9854:55;9940:8;9935:2;9930:3;9926:12;9919:30;9975:2;9970:3;9966:12;9959:19;;9760:224;;;:::o;9990:325::-;;10153:67;10217:2;10212:3;10153:67;:::i;:::-;10146:74;;10250:29;10246:1;10241:3;10237:11;10230:50;10306:2;10301:3;10297:12;10290:19;;10136:179;;;:::o;10321:368::-;;10484:67;10548:2;10543:3;10484:67;:::i;:::-;10477:74;;10581:34;10577:1;10572:3;10568:11;10561:55;10647:6;10642:2;10637:3;10633:12;10626:28;10680:2;10675:3;10671:12;10664:19;;10467:222;;;:::o;10695:365::-;;10858:67;10922:2;10917:3;10858:67;:::i;:::-;10851:74;;10955:34;10951:1;10946:3;10942:11;10935:55;11021:3;11016:2;11011:3;11007:12;11000:25;11051:2;11046:3;11042:12;11035:19;;10841:219;;;:::o;11066:330::-;;11229:67;11293:2;11288:3;11229:67;:::i;:::-;11222:74;;11326:34;11322:1;11317:3;11313:11;11306:55;11387:2;11382:3;11378:12;11371:19;;11212:184;;;:::o;11402:329::-;;11565:67;11629:2;11624:3;11565:67;:::i;:::-;11558:74;;11662:33;11658:1;11653:3;11649:11;11642:54;11722:2;11717:3;11713:12;11706:19;;11548:183;;;:::o;11737:373::-;;11900:67;11964:2;11959:3;11900:67;:::i;:::-;11893:74;;11997:34;11993:1;11988:3;11984:11;11977:55;12063:11;12058:2;12053:3;12049:12;12042:33;12101:2;12096:3;12092:12;12085:19;;11883:227;;;:::o;12116:367::-;;12279:67;12343:2;12338:3;12279:67;:::i;:::-;12272:74;;12376:34;12372:1;12367:3;12363:11;12356:55;12442:5;12437:2;12432:3;12428:12;12421:27;12474:2;12469:3;12465:12;12458:19;;12262:221;;;:::o;12489:297::-;;12669:83;12750:1;12745:3;12669:83;:::i;:::-;12662:90;;12778:1;12773:3;12769:11;12762:18;;12652:134;;;:::o;12792:316::-;;12955:67;13019:2;13014:3;12955:67;:::i;:::-;12948:74;;13052:20;13048:1;13043:3;13039:11;13032:41;13099:2;13094:3;13090:12;13083:19;;12938:170;;;:::o;13114:367::-;;13277:67;13341:2;13336:3;13277:67;:::i;:::-;13270:74;;13374:34;13370:1;13365:3;13361:11;13354:55;13440:5;13435:2;13430:3;13426:12;13419:27;13472:2;13467:3;13463:12;13456:19;;13260:221;;;:::o;13487:118::-;13574:24;13592:5;13574:24;:::i;:::-;13569:3;13562:37;13552:53;;:::o;13611:112::-;13694:22;13710:5;13694:22;:::i;:::-;13689:3;13682:35;13672:51;;:::o;13729:379::-;;13935:147;14078:3;13935:147;:::i;:::-;13928:154;;14099:3;14092:10;;13917:191;;;:::o;14114:222::-;;14245:2;14234:9;14230:18;14222:26;;14258:71;14326:1;14315:9;14311:17;14302:6;14258:71;:::i;:::-;14212:124;;;;:::o;14342:238::-;;14481:2;14470:9;14466:18;14458:26;;14494:79;14570:1;14559:9;14555:17;14546:6;14494:79;:::i;:::-;14448:132;;;;:::o;14586:332::-;;14745:2;14734:9;14730:18;14722:26;;14758:71;14826:1;14815:9;14811:17;14802:6;14758:71;:::i;:::-;14839:72;14907:2;14896:9;14892:18;14883:6;14839:72;:::i;:::-;14712:206;;;;;:::o;14924:348::-;;15091:2;15080:9;15076:18;15068:26;;15104:71;15172:1;15161:9;15157:17;15148:6;15104:71;:::i;:::-;15185:80;15261:2;15250:9;15246:18;15237:6;15185:80;:::i;:::-;15058:214;;;;;:::o;15278:332::-;;15437:2;15426:9;15422:18;15414:26;;15450:71;15518:1;15507:9;15503:17;15494:6;15450:71;:::i;:::-;15531:72;15599:2;15588:9;15584:18;15575:6;15531:72;:::i;:::-;15404:206;;;;;:::o;15616:210::-;;15741:2;15730:9;15726:18;15718:26;;15754:65;15816:1;15805:9;15801:17;15792:6;15754:65;:::i;:::-;15708:118;;;;:::o;15832:294::-;;15999:2;15988:9;15984:18;15976:26;;16012:107;16116:1;16105:9;16101:17;16092:6;16012:107;:::i;:::-;15966:160;;;;:::o;16132:313::-;;16283:2;16272:9;16268:18;16260:26;;16332:9;16326:4;16322:20;16318:1;16307:9;16303:17;16296:47;16360:78;16433:4;16424:6;16360:78;:::i;:::-;16352:86;;16250:195;;;;:::o;16451:419::-;;16655:2;16644:9;16640:18;16632:26;;16704:9;16698:4;16694:20;16690:1;16679:9;16675:17;16668:47;16732:131;16858:4;16732:131;:::i;:::-;16724:139;;16622:248;;;:::o;16876:419::-;;17080:2;17069:9;17065:18;17057:26;;17129:9;17123:4;17119:20;17115:1;17104:9;17100:17;17093:47;17157:131;17283:4;17157:131;:::i;:::-;17149:139;;17047:248;;;:::o;17301:419::-;;17505:2;17494:9;17490:18;17482:26;;17554:9;17548:4;17544:20;17540:1;17529:9;17525:17;17518:47;17582:131;17708:4;17582:131;:::i;:::-;17574:139;;17472:248;;;:::o;17726:419::-;;17930:2;17919:9;17915:18;17907:26;;17979:9;17973:4;17969:20;17965:1;17954:9;17950:17;17943:47;18007:131;18133:4;18007:131;:::i;:::-;17999:139;;17897:248;;;:::o;18151:419::-;;18355:2;18344:9;18340:18;18332:26;;18404:9;18398:4;18394:20;18390:1;18379:9;18375:17;18368:47;18432:131;18558:4;18432:131;:::i;:::-;18424:139;;18322:248;;;:::o;18576:419::-;;18780:2;18769:9;18765:18;18757:26;;18829:9;18823:4;18819:20;18815:1;18804:9;18800:17;18793:47;18857:131;18983:4;18857:131;:::i;:::-;18849:139;;18747:248;;;:::o;19001:419::-;;19205:2;19194:9;19190:18;19182:26;;19254:9;19248:4;19244:20;19240:1;19229:9;19225:17;19218:47;19282:131;19408:4;19282:131;:::i;:::-;19274:139;;19172:248;;;:::o;19426:419::-;;19630:2;19619:9;19615:18;19607:26;;19679:9;19673:4;19669:20;19665:1;19654:9;19650:17;19643:47;19707:131;19833:4;19707:131;:::i;:::-;19699:139;;19597:248;;;:::o;19851:419::-;;20055:2;20044:9;20040:18;20032:26;;20104:9;20098:4;20094:20;20090:1;20079:9;20075:17;20068:47;20132:131;20258:4;20132:131;:::i;:::-;20124:139;;20022:248;;;:::o;20276:419::-;;20480:2;20469:9;20465:18;20457:26;;20529:9;20523:4;20519:20;20515:1;20504:9;20500:17;20493:47;20557:131;20683:4;20557:131;:::i;:::-;20549:139;;20447:248;;;:::o;20701:419::-;;20905:2;20894:9;20890:18;20882:26;;20954:9;20948:4;20944:20;20940:1;20929:9;20925:17;20918:47;20982:131;21108:4;20982:131;:::i;:::-;20974:139;;20872:248;;;:::o;21126:222::-;;21257:2;21246:9;21242:18;21234:26;;21270:71;21338:1;21327:9;21323:17;21314:6;21270:71;:::i;:::-;21224:124;;;;:::o;21354:831::-;;21655:3;21644:9;21640:19;21632:27;;21669:71;21737:1;21726:9;21722:17;21713:6;21669:71;:::i;:::-;21750:80;21826:2;21815:9;21811:18;21802:6;21750:80;:::i;:::-;21877:9;21871:4;21867:20;21862:2;21851:9;21847:18;21840:48;21905:108;22008:4;21999:6;21905:108;:::i;:::-;21897:116;;22023:72;22091:2;22080:9;22076:18;22067:6;22023:72;:::i;:::-;22105:73;22173:3;22162:9;22158:19;22149:6;22105:73;:::i;:::-;21622:563;;;;;;;;:::o;22191:332::-;;22350:2;22339:9;22335:18;22327:26;;22363:71;22431:1;22420:9;22416:17;22407:6;22363:71;:::i;:::-;22444:72;22512:2;22501:9;22497:18;22488:6;22444:72;:::i;:::-;22317:206;;;;;:::o;22529:442::-;;22716:2;22705:9;22701:18;22693:26;;22729:71;22797:1;22786:9;22782:17;22773:6;22729:71;:::i;:::-;22810:72;22878:2;22867:9;22863:18;22854:6;22810:72;:::i;:::-;22892;22960:2;22949:9;22945:18;22936:6;22892:72;:::i;:::-;22683:288;;;;;;:::o;22977:214::-;;23104:2;23093:9;23089:18;23081:26;;23117:67;23181:1;23170:9;23166:17;23157:6;23117:67;:::i;:::-;23071:120;;;;:::o;23197:132::-;;23287:3;23279:11;;23317:4;23312:3;23308:14;23300:22;;23269:60;;;:::o;23335:114::-;;23436:5;23430:12;23420:22;;23409:40;;;:::o;23455:99::-;;23541:5;23535:12;23525:22;;23514:40;;;:::o;23560:113::-;;23662:4;23657:3;23653:14;23645:22;;23635:38;;;:::o;23679:184::-;;23812:6;23807:3;23800:19;23852:4;23847:3;23843:14;23828:29;;23790:73;;;;:::o;23869:147::-;;24007:3;23992:18;;23982:34;;;;:::o;24022:169::-;;24140:6;24135:3;24128:19;24180:4;24175:3;24171:14;24156:29;;24118:73;;;;:::o;24197:305::-;;24256:20;24274:1;24256:20;:::i;:::-;24251:25;;24290:20;24308:1;24290:20;:::i;:::-;24285:25;;24444:1;24376:66;24372:74;24369:1;24366:81;24363:2;;;24450:18;;:::i;:::-;24363:2;24494:1;24491;24487:9;24480:16;;24241:261;;;;:::o;24508:185::-;;24565:20;24583:1;24565:20;:::i;:::-;24560:25;;24599:20;24617:1;24599:20;:::i;:::-;24594:25;;24638:1;24628:2;;24643:18;;:::i;:::-;24628:2;24685:1;24682;24678:9;24673:14;;24550:143;;;;:::o;24699:348::-;;24762:20;24780:1;24762:20;:::i;:::-;24757:25;;24796:20;24814:1;24796:20;:::i;:::-;24791:25;;24984:1;24916:66;24912:74;24909:1;24906:81;24901:1;24894:9;24887:17;24883:105;24880:2;;;24991:18;;:::i;:::-;24880:2;25039:1;25036;25032:9;25021:20;;24747:300;;;;:::o;25053:191::-;;25113:20;25131:1;25113:20;:::i;:::-;25108:25;;25147:20;25165:1;25147:20;:::i;:::-;25142:25;;25186:1;25183;25180:8;25177:2;;;25191:18;;:::i;:::-;25177:2;25236:1;25233;25229:9;25221:17;;25098:146;;;;:::o;25250:96::-;;25316:24;25334:5;25316:24;:::i;:::-;25305:35;;25295:51;;;:::o;25352:104::-;;25426:24;25444:5;25426:24;:::i;:::-;25415:35;;25405:51;;;:::o;25462:90::-;;25539:5;25532:13;25525:21;25514:32;;25504:48;;;:::o;25558:126::-;;25635:42;25628:5;25624:54;25613:65;;25603:81;;;:::o;25690:77::-;;25756:5;25745:16;;25735:32;;;:::o;25773:86::-;;25848:4;25841:5;25837:16;25826:27;;25816:43;;;:::o;25865:134::-;;25956:37;25987:5;25956:37;:::i;:::-;25943:50;;25933:66;;;:::o;26005:190::-;;26124:65;26183:5;26124:65;:::i;:::-;26111:78;;26101:94;;;:::o;26201:141::-;;26312:24;26330:5;26312:24;:::i;:::-;26299:37;;26289:53;;;:::o;26348:121::-;;26439:24;26457:5;26439:24;:::i;:::-;26426:37;;26416:53;;;:::o;26475:126::-;;26558:37;26589:5;26558:37;:::i;:::-;26545:50;;26535:66;;;:::o;26607:113::-;;26690:24;26708:5;26690:24;:::i;:::-;26677:37;;26667:53;;;:::o;26726:307::-;26794:1;26804:113;26818:6;26815:1;26812:13;26804:113;;;26903:1;26898:3;26894:11;26888:18;26884:1;26879:3;26875:11;26868:39;26840:2;26837:1;26833:10;26828:15;;26804:113;;;26935:6;26932:1;26929:13;26926:2;;;27015:1;27006:6;27001:3;26997:16;26990:27;26926:2;26775:258;;;;:::o;27039:180::-;27087:77;27084:1;27077:88;27184:4;27181:1;27174:15;27208:4;27205:1;27198:15;27225:180;27273:77;27270:1;27263:88;27370:4;27367:1;27360:15;27394:4;27391:1;27384:15;27411:102;;27503:2;27499:7;27494:2;27487:5;27483:14;27479:28;27469:38;;27459:54;;;:::o;27519:122::-;27592:24;27610:5;27592:24;:::i;:::-;27585:5;27582:35;27572:2;;27631:1;27628;27621:12;27572:2;27562:79;:::o;27647:138::-;27728:32;27754:5;27728:32;:::i;:::-;27721:5;27718:43;27708:2;;27775:1;27772;27765:12;27708:2;27698:87;:::o;27791:116::-;27861:21;27876:5;27861:21;:::i;:::-;27854:5;27851:32;27841:2;;27897:1;27894;27887:12;27841:2;27831:76;:::o;27913:122::-;27986:24;28004:5;27986:24;:::i;:::-;27979:5;27976:35;27966:2;;28025:1;28022;28015:12;27966:2;27956:79;:::o

Swarm Source

ipfs://c4db611f3733bde48c957a8a760531fa1c145460021dddfe370620a8cd9c85a2
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.