Contract 0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf6 1

 

Contract Overview

Balance:
0.000000000000001431 BNB

BNB Value:
Less Than $0.01 (@ $493.08/BNB)

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xdfd6e19c874c8511d583676f8970e22004bad9569411ccfa2b71988d5a70b2a4Swap Exact Token...61663122021-03-31 17:42:03290 days 17 hrs ago0xa490c3b07b32a64440600ea7dde5a4851f9f9cce IN  0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf60 BNB0.00160212
0x7c4a03222d91830eeafb1e46602a7ffbc59be83f648785a020f2ccdaf80c2ba5Swap Exact Token...61662952021-03-31 17:41:12290 days 17 hrs ago0xa490c3b07b32a64440600ea7dde5a4851f9f9cce IN  0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf60 BNB0.00037502
0xef638f26d9db1a68cdb8e503dd5d1ac7c767de3c8ba7fb55b8900258739caa35Swap Exact Token...61656512021-03-31 17:09:00290 days 18 hrs ago0xa490c3b07b32a64440600ea7dde5a4851f9f9cce IN  0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf60 BNB0.00160212
0xfb1feafa01a15bb95c277e6a8b7f7f36e735acecf5eee84f1e91a00602140d4dSwap Exact Token...61655812021-03-31 17:05:30290 days 18 hrs ago0xa490c3b07b32a64440600ea7dde5a4851f9f9cce IN  0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf60 BNB0.00023593
0x30ec941f314f7b1380cebaeabe6d0387e2ffab7e3486a199c8ddf5488f3a096cSwap Exact Token...61655562021-03-31 17:04:15290 days 18 hrs ago0xa490c3b07b32a64440600ea7dde5a4851f9f9cce IN  0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf60 BNB0.00172004
0x20235c4f8ab6bf721b2927ab334942d21e4f9f7edeacb357bdd42b097e949aceSwap Exact Token...61653612021-03-31 16:54:30290 days 18 hrs ago0xa490c3b07b32a64440600ea7dde5a4851f9f9cce IN  0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf60 BNB0.00037502
0x5bf966cd0e1cdc1747d771fbaf7cb8e0fa560f851878a98539aceb348933cd81Swap Exact Token...61653422021-03-31 16:53:33290 days 18 hrs ago0xa490c3b07b32a64440600ea7dde5a4851f9f9cce IN  0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf60 BNB0.00045694
0xd1900364c4550a88a141c1996f881fa340e3114209642407dbb4a10b9428001dSwap Exact Token...61653142021-03-31 16:52:09290 days 18 hrs ago0xa490c3b07b32a64440600ea7dde5a4851f9f9cce IN  0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf60 BNB0.00045694
0x72cd0d0e014d84e0ef53ab923ba19dcc01410ba52400cb669dd3ce355261eeeeSwap Exact Token...59387712021-03-23 18:26:47298 days 16 hrs ago0x09a93692dae50a04fb60a71bb8d176c09fc43c5d IN  0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf60 BNB0.00033284
0x41701247754ef72547bb269796be3b33fd7b777f43b62e14f2a1c564244b12edSwap Exact ETH F...7555122020-09-24 9:05:16479 days 2 hrs ago0xf89f5328585e49341e5861064143e98708603c00 IN  0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf64 BNB0.00111939
0x998dc23d7882be9f48ce4e331cfe172a973fb8af47f1ea9b97eeaab4dbb08825Swap Tokens For ...7024122020-09-22 12:50:16480 days 22 hrs ago0xe905df42435e5fc26e66e788cb74bce19257fe2e IN  0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf60 BNB0.00072654
0x6b1a21965143a5aca03b4163563f51c02ced259424f90abdce5f77740ab10ff8Add Liquidity ET...6755172020-09-21 14:25:31481 days 20 hrs ago0xb605d920feef5325dd92d912edf19c906d37dd4c IN  0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf60.1 BNB0.00098856
0x1b19ab2c6180180d89d8ecc41c8bef19163e86a80ac60cdaf3406cbe65e7bbfeAdd Liquidity ET...6754002020-09-21 14:19:40481 days 20 hrs ago0xb605d920feef5325dd92d912edf19c906d37dd4c IN  0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf60.1 BNB0.00080288
0x025819bb2473fe9304f6e41044f03a826bb19fffd80387325585e02bcd88683bAdd Liquidity ET...6753462020-09-21 14:16:58481 days 20 hrs ago0xb605d920feef5325dd92d912edf19c906d37dd4c IN  0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf60.1 BNB0.0008072
0x75b57414e8c1e94ae4d0ba86f4db7b96f4583d76f9a7dd044c4f50cb1e5bfeabAdd Liquidity ET...6752862020-09-21 14:13:58481 days 20 hrs ago0xb605d920feef5325dd92d912edf19c906d37dd4c IN  0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf60.1 BNB0.00080672
0x89956571fab929b25efe7bf65cad4577a9199bda466f5ef46463354dda474b81Add Liquidity ET...6752352020-09-21 14:11:25481 days 21 hrs ago0xb605d920feef5325dd92d912edf19c906d37dd4c IN  0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf60.1 BNB0.00080696
0xf6ffb065026d78306d7f0bc2a5cac99ba1c848176a34dcf8e1fa7defd7d2c842Add Liquidity ET...6752072020-09-21 14:10:01481 days 21 hrs ago0xb605d920feef5325dd92d912edf19c906d37dd4c IN  0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf60.1 BNB0.00045414
0x05a6bf6281ea8784cac270ed4ada6daa0ea0e917ee3e93329fc2644cf57f0405Add Liquidity ET...6683412020-09-21 8:26:43482 days 2 hrs ago0x2d3ca83db323146fd1175b4d826bcc57c916a9ba IN  0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf61 BNB0.0006202
0xdbfc9220da8f62c91a18e89a4f8e44c6473a8bcf1c49ab36d0940cfd1b9eda70Swap Exact ETH F...6145222020-09-19 11:35:46483 days 23 hrs ago0xc3c347ab622a1d245ded454a43ffcfc2777235dd IN  0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf60.002 BNB0.00237294
0x0c7e035fb8ac65351aee6e68fd042e3904707c124abe30930f9e13e6c786dc06Add Liquidity ET...6101582020-09-19 7:57:34484 days 3 hrs ago0x38a6f992ebd43ff49cd4a5194b366df4ff4f89ab IN  0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf60.1 BNB0.00062044
0xda0b0aa2ff631d06ce1bb2041c96276c7bb909ef2309c4f670009722847bca48Add Liquidity ET...6087392020-09-19 6:46:37484 days 4 hrs ago0x73ec6cc0f491369850c9cc101eeb4c2c5e81c3bd IN  0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf61.836617562655442 BNB0.00099996
0xc246d8345d30af37b8cb5aa8c26f974939eea4622dd7406d4dd822d6d01c6929Add Liquidity ET...6086772020-09-19 6:43:31484 days 4 hrs ago0x73ec6cc0f491369850c9cc101eeb4c2c5e81c3bd IN  0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf618.36617562655443 BNB0.00099396
0x1684889833d0d8548f53fb8f2821f35d1fd5c24be505c65fb17a64f5d8bfe684Swap Exact Token...6080642020-09-19 6:12:52484 days 5 hrs ago0x94732f350405e8e61e116abe5929b2e5540067ba IN  0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf60 BNB0.00091328
0xe921cabfc88b5adba438c945972bcc7b160e2c944b7447331498e530726a4d7aAdd Liquidity ET...6080152020-09-19 6:10:25484 days 5 hrs ago0x1831570e2145ce1048eb566edb9612ec867aa736 IN  0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf60.1 BNB0.00099936
0x01ce9cf4300f42ac7160720af5a6edccb0c3d9a72259c4991ea5ca9efbd36bbaAdd Liquidity ET...6079872020-09-19 6:09:01484 days 5 hrs ago0x1831570e2145ce1048eb566edb9612ec867aa736 IN  0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf60.1 BNB0.0099972
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xdbfc9220da8f62c91a18e89a4f8e44c6473a8bcf1c49ab36d0940cfd1b9eda706145222020-09-19 11:35:46483 days 23 hrs ago 0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf6 Binance: WBNB Token0.001994 BNB
0x295382d19cef0716350596ca683b34644d97df54e9757b320b87c4787806c1e26075762020-09-19 5:48:28484 days 5 hrs ago 0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf6 Binance: WBNB Token0.000997 BNB
0x28b3091a0924c75c6805aefb57f755b68b1d4785c92b6537de4abf45b913f9416071202020-09-19 5:25:40484 days 5 hrs ago 0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf6 Binance: WBNB Token0.04985 BNB
0x0badf54cd3c0d746408a57e9d7bd5044eb669f9e3df9f85c9fd1ba9db2c342876066562020-09-19 5:02:28484 days 6 hrs ago 0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf6 Binance: WBNB Token0.997000000000002749 BNB
0x1f55bc14ef99920fad18d4efa263704ea761c163654e0332b1b19e730df3047b6066212020-09-19 5:00:43484 days 6 hrs ago 0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf6 Binance: WBNB Token0.0997 BNB
0xbb2db00c19797d8359b2725dc5d0b1945e5921b17f87294e4fa96151bf1587536065802020-09-19 4:58:40484 days 6 hrs ago 0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf6 Binance: WBNB Token0.01994 BNB
0xfe51c577b3abb43239ec317e77fbb8a92158180b8d304837eacdf50daa56cce36028492020-09-19 1:52:07484 days 9 hrs ago 0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf6 Binance: WBNB Token19.94 BNB
0xe9183aaf64734565d59e2e04ab5083e6bb581026c716cf218a577bef6c364bc46028452020-09-19 1:51:55484 days 9 hrs ago 0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf6 Binance: WBNB Token19.94 BNB
0x9faa830f546fe1b862b55ccf472584a7bae26b22e802c86e4b21d4855e82486b6028422020-09-19 1:51:46484 days 9 hrs ago 0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf6 Binance: WBNB Token19.94 BNB
0x69021693ef200faea6189c794ce3660bac343d2f3fcb98981ce8b022c1972bad6028392020-09-19 1:51:37484 days 9 hrs ago 0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf6 Binance: WBNB Token19.94 BNB
0xa8a8184dca0712b2b9549d259b603fa737d04c08f5239705ba9a7853eb8670eb6028362020-09-19 1:51:28484 days 9 hrs ago 0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf6 Binance: WBNB Token19.94 BNB
0xf13e784c204ce8ed29ce43dbf167108e294228526b26dbebd86ba752ed35f2766028332020-09-19 1:51:19484 days 9 hrs ago 0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf6 Binance: WBNB Token19.94 BNB
0xbbbb02ea9f79e09d2c295acce6c3d419a72277ca2a2a57f3e75396cec17977f16028302020-09-19 1:51:10484 days 9 hrs ago 0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf6 Binance: WBNB Token19.94 BNB
0x72d9abe85b2b1c9c4b506a5efc6efd91585fd193e2b2210179b1389b5669c4ea6028272020-09-19 1:51:01484 days 9 hrs ago 0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf6 Binance: WBNB Token19.94 BNB
0xfa8e691043bd9b779892db005fb272e3d8de285280c3613612abcd71bd5d71a96028242020-09-19 1:50:52484 days 9 hrs ago 0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf6 Binance: WBNB Token19.94 BNB
0xddf4b97c5acf882290300ee500d0bb304159b27a54fb75e57c1b547d737fd2656028212020-09-19 1:50:43484 days 9 hrs ago 0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf6 Binance: WBNB Token19.94 BNB
0x7f20232d8e2c2063012455fee90c83ccb4016a34603a9716221671f2e020f80d6028182020-09-19 1:50:34484 days 9 hrs ago 0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf6 Binance: WBNB Token19.94 BNB
0x90ef3e361e61d89f145072f7eae6d78f51b9edd0603f5cb78b208c46533c04926028152020-09-19 1:50:25484 days 9 hrs ago 0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf6 Binance: WBNB Token19.94 BNB
0x7288ec6fe2b18593b6e97d16c8a3e3ca74afb86b1823fa13108dd0f10eb678526028122020-09-19 1:50:16484 days 9 hrs ago 0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf6 Binance: WBNB Token19.94 BNB
0xd254dbc2d8975a1f6ae3f79a2e997a20318a1ca6aed6d73ee5f2177b173ccf7c6026822020-09-19 1:43:46484 days 9 hrs ago 0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf6 Binance: WBNB Token19.94 BNB
0x07488cafcfc1d08b0de754c850e8581f964cbc08c7682fe95097f7e059affc9d6026782020-09-19 1:43:34484 days 9 hrs ago 0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf6 Binance: WBNB Token19.94 BNB
0x4a32287d8ba66eea139aad50a0918018a79b6d4e3161fce86413d99031ec07576026752020-09-19 1:43:25484 days 9 hrs ago 0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf6 Binance: WBNB Token19.94 BNB
0xf50724faa78ad62b0141b07ca6e49f1f9d9e0310d53f3bcec9bb961b986720f56026722020-09-19 1:43:16484 days 9 hrs ago 0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf6 Binance: WBNB Token19.94 BNB
0xc105ee1430d4b66e281f7ce8f281f8938e481cb9e5ffb0c9c2f2985d357278766026692020-09-19 1:43:07484 days 9 hrs ago 0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf6 Binance: WBNB Token19.94 BNB
0x4a3784f06a23b151dd20c839c16ec3507ffbcbf60bd3c91f9a640ad10ff385ac6026662020-09-19 1:42:58484 days 9 hrs ago 0x75ca8f6c82df5fdfd09049f46ad5d072b0a53bf6 Binance: WBNB Token19.94 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DemaxPlatform

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2020-09-10
*/

// Dependency file: contracts/interfaces/IDemaxTransferListener.sol

// pragma solidity >=0.6.6;

interface IDemaxTransferListener {
    function transferNotify(address from, address to, address token, uint amount)  external returns (bool);
}
// Dependency file: contracts/modules/Ownable.sol

// pragma solidity >=0.5.16;

contract Ownable {
    address public owner;

    event OwnerChanged(address indexed _oldOwner, address indexed _newOwner);

    constructor() public {
        owner = msg.sender;
    }

    modifier onlyOwner() {
        require(msg.sender == owner, 'Ownable: FORBIDDEN');
        _;
    }

    function changeOwner(address _newOwner) public onlyOwner {
        require(_newOwner != address(0), 'Ownable: INVALID_ADDRESS');
        emit OwnerChanged(owner, _newOwner);
        owner = _newOwner;
    }

}

// Dependency file: contracts/interfaces/IDemaxPair.sol

// pragma solidity >=0.5.0;

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

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

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

    function initialize(address tokenA, address tokenB, address platform, address dgas) external;
    function swapFee(uint amount, address token, address to) external ;
    function queryReward() external view returns (uint rewardAmount, uint blockNumber);
    function mintReward() external returns (uint rewardAmount);
    function getDGASReserve() external view returns (uint);
}

// Dependency file: contracts/interfaces/IDemaxFactory.sol

// pragma solidity >=0.5.0;

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

    function contractCodeHash() external view returns (bytes32);
    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function isPair(address pair) external view returns (bool);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);
    function playerPairs(address player, uint index) external view returns (address pair);
    function getPlayerPairCount(address player) external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);
    function addPlayerPair(address player, address _pair) external returns (bool);
}

// Dependency file: contracts/interfaces/IERC20.sol

// pragma solidity >=0.5.0;

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

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

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

// Dependency file: contracts/interfaces/IDemaxConfig.sol

// pragma solidity >=0.5.0;

interface IDemaxConfig {
    function governor() external view returns (address);
    function dev() external view returns (address);
    function PERCENT_DENOMINATOR() external view returns (uint);
    function getConfig(bytes32 _name) external view returns (uint minValue, uint maxValue, uint maxSpan, uint value, uint enable);
    function getConfigValue(bytes32 _name) external view returns (uint);
    function changeConfigValue(bytes32 _name, uint _value) external returns (bool);
    function checkToken(address _token) external view returns(bool);
    function checkPair(address tokenA, address tokenB) external view returns (bool);
    function listToken(address _token) external returns (bool);
    function getDefaultListTokens() external returns (address[] memory);
    function platform() external view returns  (address);
    function addToken(address _token) external returns (bool);
}
// Dependency file: contracts/interfaces/IDemaxGovernance.sol

// pragma solidity >=0.5.0;

interface IDemaxGovernance {
    function addPair(address _tokenA, address _tokenB) external returns (bool);
    function addReward(uint _value) external returns (bool);
}


// Dependency file: contracts/interfaces/IWETH.sol

// pragma solidity >=0.5.0;

interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function withdraw(uint) external;
}

// Dependency file: contracts/libraries/DemaxSwapLibrary.sol

// pragma solidity >=0.5.0;

// import '../interfaces/IDemaxPair.sol';
// import '../interfaces/IDemaxFactory.sol';
// import "./SafeMath.sol";

library DemaxSwapLibrary {
    using SafeMath for uint;

    function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
        require(tokenA != tokenB, 'DemaxSwapLibrary: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'DemaxSwapLibrary: ZERO_ADDRESS');
    }

     function pairFor(address factory, address tokenA, address tokenB) internal view returns (address pair) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        bytes32 salt = keccak256(abi.encodePacked(token0, token1));
        bytes32 rawAddress = keccak256(
         abi.encodePacked(
            bytes1(0xff),
            factory,
            salt,
            IDemaxFactory(factory).contractCodeHash()
            )
        );
     return address(bytes20(rawAddress << 96));
    }

    function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) {
        (address token0,) = sortTokens(tokenA, tokenB);
        (uint reserve0, uint reserve1,) = IDemaxPair(pairFor(factory, tokenA, tokenB)).getReserves();
        (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
    }
    
    function quoteEnhance(address factory, address tokenA, address tokenB, uint amountA) internal view returns(uint amountB) {
        (uint reserveA, uint reserveB) = getReserves(factory, tokenA, tokenB);
        return quote(amountA, reserveA, reserveB);
    }

    function quote(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) {
        require(amountA > 0, 'DemaxSwapLibrary: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'DemaxSwapLibrary: INSUFFICIENT_LIQUIDITY');
        amountB = amountA.mul(reserveB) / reserveA;
    }

    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) internal pure returns (uint amountOut) {
        require(amountIn > 0, 'DemaxSwapLibrary: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'DemaxSwapLibrary: INSUFFICIENT_LIQUIDITY');
        uint numerator = amountIn.mul(reserveOut);
        uint denominator = reserveIn.add(amountIn);
        amountOut = numerator / denominator;
    }
    
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) internal pure returns (uint amountIn) {
        require(amountOut > 0, 'DemaxSwapLibrary: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'DemaxSwapLibrary: INSUFFICIENT_LIQUIDITY');
        uint numerator = reserveIn.mul(amountOut);
        uint denominator = reserveOut.sub(amountOut);
        amountIn = (numerator / denominator).add(1);
    }

}
// Dependency file: contracts/libraries/TransferHelper.sol

// SPDX-License-Identifier: GPL-3.0-or-later

// pragma solidity >=0.6.0;

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
    function safeApprove(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED');
    }

    function safeTransfer(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
    }

    function safeTransferFrom(address token, address from, address to, uint value) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
    }

    function safeTransferETH(address to, uint value) internal {
        (bool success,) = to.call{value:value}(new bytes(0));
        require(success, 'TransferHelper: ETH_TRANSFER_FAILED');
    }
}

// Dependency file: contracts/libraries/SafeMath.sol

// SPDX-License-Identifier: MIT

// pragma solidity ^0.6.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
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;
    }
}
// Dependency file: contracts/libraries/ConfigNames.sol

// pragma solidity >=0.5.16;

library ConfigNames {
    bytes32 public constant PRODUCE_DGAS_RATE = bytes32('PRODUCE_DGAS_RATE');
    bytes32 public constant SWAP_FEE_PERCENT = bytes32('SWAP_FEE_PERCENT');
    bytes32 public constant LIST_DGAS_AMOUNT = bytes32('LIST_DGAS_AMOUNT');
    bytes32 public constant UNSTAKE_DURATION = bytes32('UNSTAKE_DURATION');
    bytes32 public constant REMOVE_LIQUIDITY_DURATION = bytes32('REMOVE_LIQUIDITY_DURATION');
    bytes32 public constant TOKEN_TO_DGAS_PAIR_MIN_PERCENT = bytes32('TOKEN_TO_DGAS_PAIR_MIN_PERCENT');
    bytes32 public constant LIST_TOKEN_FAILURE_BURN_PRECENT = bytes32('LIST_TOKEN_FAILURE_BURN_PRECENT');
    bytes32 public constant LIST_TOKEN_SUCCESS_BURN_PRECENT = bytes32('LIST_TOKEN_SUCCESS_BURN_PRECENT');
    bytes32 public constant PROPOSAL_DGAS_AMOUNT = bytes32('PROPOSAL_DGAS_AMOUNT');
    bytes32 public constant VOTE_DURATION = bytes32('VOTE_DURATION');
    bytes32 public constant VOTE_REWARD_PERCENT = bytes32('VOTE_REWARD_PERCENT');
    bytes32 public constant TOKEN_PENGDING_SWITCH = bytes32('TOKEN_PENGDING_SWITCH');
    bytes32 public constant TOKEN_PENGDING_TIME = bytes32('TOKEN_PENGDING_TIME');
    bytes32 public constant LIST_TOKEN_SWITCH = bytes32('LIST_TOKEN_SWITCH');
    bytes32 public constant DEV_PRECENT = bytes32('DEV_PRECENT');
}
pragma solidity >=0.6.6;
// import './libraries/ConfigNames.sol';
// import './libraries/SafeMath.sol';
// import './libraries/TransferHelper.sol';
// import './libraries/DemaxSwapLibrary.sol';
// import './interfaces/IWETH.sol';
// import './interfaces/IDemaxGovernance.sol';
// import './interfaces/IDemaxConfig.sol';
// import './interfaces/IERC20.sol';
// import './interfaces/IDemaxFactory.sol';
// import './interfaces/IDemaxPair.sol';
// import './modules/Ownable.sol';
// import './interfaces/IDemaxTransferListener.sol';

contract DemaxPlatform is Ownable {
    uint256 public version = 1;
    address public DGAS;
    address public CONFIG;
    address public FACTORY;
    address public WETH;
    address public GOVERNANCE;
    address public TRANSFER_LISTENER;
    uint256 public constant PERCENT_DENOMINATOR = 10000;
    event AddLiquidity(
        address indexed player,
        address indexed tokenA,
        address indexed tokenB,
        uint256 amountA,
        uint256 amountB
    );
    event RemoveLiquidity(
        address indexed player,
        address indexed tokenA,
        address indexed tokenB,
        uint256 amountA,
        uint256 amountB
    );
    event SwapToken(
        address indexed receiver,
        address indexed fromToken,
        address indexed toToken,
        uint256 inAmount,
        uint256 outAmount
    );

    receive() external payable {
        assert(msg.sender == WETH);
    }

    modifier ensure(uint256 deadline) {
        require(deadline >= block.timestamp, 'DEMAX PLATFORM : EXPIRED');
        _;
    }

    function initialize(
        address _DGAS,
        address _CONFIG,
        address _FACTORY,
        address _WETH,
        address _GOVERNANCE,
        address _TRANSFER_LISTENER
    ) external onlyOwner {
        DGAS = _DGAS;
        CONFIG = _CONFIG;
        FACTORY = _FACTORY;
        WETH = _WETH;
        GOVERNANCE = _GOVERNANCE;
        TRANSFER_LISTENER = _TRANSFER_LISTENER;
    }

    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin
    ) internal returns (uint256 amountA, uint256 amountB) {
        if (IDemaxFactory(FACTORY).getPair(tokenA, tokenB) == address(0)) {
            IDemaxConfig(CONFIG).addToken(tokenA);
            IDemaxConfig(CONFIG).addToken(tokenB);
            IDemaxFactory(FACTORY).createPair(tokenA, tokenB);
        }
        require(
            IDemaxConfig(CONFIG).checkPair(tokenA, tokenB),
            'DEMAX PLATFORM : ADD LIQUIDITY PAIR CONFIG CHECK FAIL'
        );
        (uint256 reserveA, uint256 reserveB) = DemaxSwapLibrary.getReserves(FACTORY, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint256 amountBOptimal = DemaxSwapLibrary.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'DEMAX PLATFORM : INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint256 amountAOptimal = DemaxSwapLibrary.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'DEMAX PLATFORM : INSUFFICIENT_A_AMOUNT');
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
        IDemaxFactory(FACTORY).addPlayerPair(msg.sender, IDemaxFactory(FACTORY).getPair(tokenA, tokenB));
    }

    function _calcDGASRate(
        address tokenA,
        address tokenB,
        uint256 amountA,
        uint256 amountB
    ) internal view returns (uint256 value) {
        uint256 tokenAValue = 0;
        uint256 tokenBValue = 0;
        if (tokenA == WETH || tokenA == DGAS) {
            tokenAValue = tokenA == WETH ? amountA : DemaxSwapLibrary.quoteEnhance(FACTORY, DGAS, WETH, amountA);
        }
        if (tokenB == WETH || tokenB == DGAS) {
            tokenBValue = tokenB == WETH ? amountB : DemaxSwapLibrary.quoteEnhance(FACTORY, DGAS, WETH, amountB);
        }
        return tokenAValue + tokenBValue;
    }

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountA,
        uint256 amountB,
        uint256 amountAMin,
        uint256 amountBMin,
        uint256 deadline
    )
        external
        ensure(deadline)
        returns (
            uint256 _amountA,
            uint256 _amountB,
            uint256 _liquidity
        )
    {
        (_amountA, _amountB) = _addLiquidity(tokenA, tokenB, amountA, amountB, amountAMin, amountBMin);
        address pair = DemaxSwapLibrary.pairFor(FACTORY, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, _amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, _amountB);
        _liquidity = IDemaxPair(pair).mint(msg.sender);
        _transferNotify(msg.sender, pair, tokenA, _amountA);
        _transferNotify(msg.sender, pair, tokenB, _amountB);
        emit AddLiquidity(msg.sender, tokenA, tokenB, _amountA, _amountB);
    }

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        uint256 deadline
    )
        external
        payable
        ensure(deadline)
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        )
    {
        (amountToken, amountETH) = _addLiquidity(
            token,
            WETH,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountETHMin
        );
        address pair = DemaxSwapLibrary.pairFor(FACTORY, token, WETH);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WETH).deposit{value: amountETH}();
        assert(IWETH(WETH).transfer(pair, amountETH));
        liquidity = IDemaxPair(pair).mint(msg.sender);
        _transferNotify(msg.sender, pair, WETH, amountETH);
        _transferNotify(msg.sender, pair, token, amountToken);
        emit AddLiquidity(msg.sender, token, WETH, amountToken, amountETH);
        if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
    }

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) public ensure(deadline) returns (uint256 amountA, uint256 amountB) {
        address pair = DemaxSwapLibrary.pairFor(FACTORY, tokenA, tokenB);
        uint256 _liquidity = liquidity;
        address _tokenA = tokenA;
        address _tokenB = tokenB;
        (uint256 amount0, uint256 amount1) = IDemaxPair(pair).burn(msg.sender, to, _liquidity);
        (address token0, ) = DemaxSwapLibrary.sortTokens(_tokenA, _tokenB);
        (amountA, amountB) = _tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        _transferNotify(pair, to, _tokenA, amountA);
        _transferNotify(pair, to, _tokenB, amountB);
        require(amountA >= amountAMin, 'DEMAX PLATFORM : INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'DEMAX PLATFORM : INSUFFICIENT_B_AMOUNT');
        emit RemoveLiquidity(msg.sender, _tokenA, _tokenB, amountA, amountB);
    }

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) public ensure(deadline) returns (uint256 amountToken, uint256 amountETH) {
        (amountToken, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, amountToken);
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
        _transferNotify(address(this), to, token, amountToken);
        _transferNotify(address(this), to, WETH, amountETH);
        emit RemoveLiquidity(msg.sender, token, WETH, amountToken, amountETH);
    }

    function _getAmountsOut(
        uint256 amount,
        address[] memory path,
        uint256 percent
    ) internal view returns (uint256[] memory amountOuts) {
        amountOuts = new uint256[](path.length);
        amountOuts[0] = amount;
        for (uint256 i = 0; i < path.length - 1; i++) {
            address inPath = path[i];
            address outPath = path[i + 1];
            (uint256 reserveA, uint256 reserveB) = DemaxSwapLibrary.getReserves(FACTORY, inPath, outPath);
            uint256 outAmount = SafeMath.mul(amountOuts[i], SafeMath.sub(PERCENT_DENOMINATOR, percent));
            amountOuts[i + 1] = DemaxSwapLibrary.getAmountOut(outAmount / PERCENT_DENOMINATOR, reserveA, reserveB);
        }
    }

    function _getAmountsIn(
        uint256 amount,
        address[] memory path,
        uint256 percent
    ) internal view returns (uint256[] memory amountIn) {
        amountIn = new uint256[](path.length);
        amountIn[path.length - 1] = amount;
        for (uint256 i = path.length - 1; i > 0; i--) {
            address inPath = path[i - 1];
            address outPath = path[i];
            (uint256 reserveA, uint256 reserveB) = DemaxSwapLibrary.getReserves(FACTORY, inPath, outPath);
            uint256 inAmount = DemaxSwapLibrary.getAmountIn(amountIn[i], reserveA, reserveB);
            amountIn[i - 1] = SafeMath.add(
                SafeMath.mul(inAmount, PERCENT_DENOMINATOR) / SafeMath.sub(PERCENT_DENOMINATOR, percent),
                1
            );
        }
        amountIn = _getAmountsOut(amountIn[0], path, percent);
    }

    function swapPrecondition(address token) public view returns (bool) {
        if (token == DGAS || token == WETH) return true;
        uint256 percent = IDemaxConfig(CONFIG).getConfigValue(ConfigNames.TOKEN_TO_DGAS_PAIR_MIN_PERCENT);
        if (!existPair(WETH, DGAS)) return false;
        if (!existPair(DGAS, token)) return false;
        if (!(IDemaxConfig(CONFIG).checkPair(DGAS, token) && IDemaxConfig(CONFIG).checkPair(WETH, token))) return false;
        if (!existPair(WETH, token)) return true;
        if (percent == 0) return true;
        (uint256 reserveDGAS, ) = DemaxSwapLibrary.getReserves(FACTORY, DGAS, token);
        (uint256 reserveWETH, ) = DemaxSwapLibrary.getReserves(FACTORY, WETH, token);
        (uint256 reserveWETH2, uint256 reserveDGAS2) = DemaxSwapLibrary.getReserves(FACTORY, WETH, DGAS);
        uint256 dgasValue = SafeMath.mul(reserveDGAS, reserveWETH2) / reserveDGAS2;
        uint256 limitValue = SafeMath.mul(SafeMath.add(dgasValue, reserveWETH), percent) / PERCENT_DENOMINATOR;
        return dgasValue >= limitValue;
    }

    function _swap(
        uint256[] memory amounts,
        address[] memory path,
        address _to
    ) internal {
        require(swapPrecondition(path[path.length - 1]), 'DEMAX PLATFORM : CHECK DGAS/TOKEN TO VALUE FAIL');
        for (uint256 i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            require(swapPrecondition(input), 'DEMAX PLATFORM : CHECK DGAS/TOKEN VALUE FROM FAIL');
            require(IDemaxConfig(CONFIG).checkPair(input, output), 'DEMAX PLATFORM : SWAP PAIR CONFIG CHECK FAIL');
            (address token0, address token1) = DemaxSwapLibrary.sortTokens(input, output);
            uint256 amountOut = amounts[i + 1];
            (uint256 amount0Out, uint256 amount1Out) = input == token0
                ? (uint256(0), amountOut)
                : (amountOut, uint256(0));
            address to = i < path.length - 2 ? DemaxSwapLibrary.pairFor(FACTORY, output, path[i + 2]) : _to;
            IDemaxPair(DemaxSwapLibrary.pairFor(FACTORY, input, output)).swap(amount0Out, amount1Out, to, new bytes(0));
            if (amount0Out > 0)
                _transferNotify(DemaxSwapLibrary.pairFor(FACTORY, input, output), to, token0, amount0Out);
            if (amount1Out > 0)
                _transferNotify(DemaxSwapLibrary.pairFor(FACTORY, input, output), to, token1, amount1Out);
        }
        emit SwapToken(_to, path[0], path[path.length - 1], amounts[0], amounts[path.length - 1]);
    }

    function _swapFee(
        uint256[] memory amounts,
        address[] memory path,
        uint256 percent
    ) internal {
        address[] memory feepath = new address[](2);
        feepath[1] = DGAS;
        for (uint256 i = 0; i < path.length - 1; i++) {
            uint256 fee = SafeMath.mul(amounts[i], percent) / PERCENT_DENOMINATOR;
            address input = path[i];
            address output = path[i + 1];
            address currentPair = DemaxSwapLibrary.pairFor(FACTORY, input, output);
            if (input == DGAS) {
                IDemaxPair(currentPair).swapFee(fee, DGAS, GOVERNANCE);
                _transferNotify(currentPair, GOVERNANCE, DGAS, fee);
            } else {
                IDemaxPair(currentPair).swapFee(fee, input, DemaxSwapLibrary.pairFor(FACTORY, input, DGAS));
                (uint256 reserveIn, uint256 reserveDGAS) = DemaxSwapLibrary.getReserves(FACTORY, input, DGAS);
                uint256 feeOut = DemaxSwapLibrary.getAmountOut(fee, reserveIn, reserveDGAS);
                IDemaxPair(DemaxSwapLibrary.pairFor(FACTORY, input, DGAS)).swapFee(feeOut, DGAS, GOVERNANCE);
                _transferNotify(currentPair, DemaxSwapLibrary.pairFor(FACTORY, input, DGAS), input, fee);
                _transferNotify(DemaxSwapLibrary.pairFor(FACTORY, input, DGAS), GOVERNANCE, DGAS, feeOut);
                fee = feeOut;
            }
            if (fee > 0) IDemaxGovernance(GOVERNANCE).addReward(fee);
        }
    }

    function _getSwapFeePercent() internal view returns (uint256) {
        return IDemaxConfig(CONFIG).getConfigValue(ConfigNames.SWAP_FEE_PERCENT);
    }

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external ensure(deadline) returns (uint256[] memory amounts) {
        uint256 percent = _getSwapFeePercent();
        amounts = _getAmountsOut(amountIn, path, percent);
        require(amounts[amounts.length - 1] >= amountOutMin, 'DEMAX PLATFORM : INSUFFICIENT_OUTPUT_AMOUNT');
        address pair = DemaxSwapLibrary.pairFor(FACTORY, path[0], path[1]);
        _innerTransferFrom(
            path[0],
            msg.sender,
            pair,
            SafeMath.mul(amountIn, SafeMath.sub(PERCENT_DENOMINATOR, percent)) / PERCENT_DENOMINATOR
        );
        _swap(amounts, path, to);
        _innerTransferFrom(path[0], msg.sender, pair, SafeMath.mul(amounts[0], percent) / PERCENT_DENOMINATOR);
        _swapFee(amounts, path, percent);
    }

    function _innerTransferFrom(
        address token,
        address from,
        address to,
        uint256 amount
    ) internal {
        TransferHelper.safeTransferFrom(token, from, to, amount);
        _transferNotify(from, to, token, amount);
    }

    function _innerTransferWETH(address to, uint256 amount) internal {
        assert(IWETH(WETH).transfer(to, amount));
        _transferNotify(address(this), to, WETH, amount);
    }

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable ensure(deadline) returns (uint256[] memory amounts) {
        require(path[0] == WETH, 'DEMAX PLATFORM : INVALID_PATH');
        uint256 percent = _getSwapFeePercent();
        amounts = _getAmountsOut(msg.value, path, percent);
        require(amounts[amounts.length - 1] >= amountOutMin, 'DEMAX PLATFORM : INSUFFICIENT_OUTPUT_AMOUNT');
        address pair = DemaxSwapLibrary.pairFor(FACTORY, path[0], path[1]);
        IWETH(WETH).deposit{
            value: SafeMath.mul(amounts[0], SafeMath.sub(PERCENT_DENOMINATOR, percent)) / PERCENT_DENOMINATOR
        }();
        _innerTransferWETH(
            pair,
            SafeMath.mul(amounts[0], SafeMath.sub(PERCENT_DENOMINATOR, percent)) / PERCENT_DENOMINATOR
        );
        _swap(amounts, path, to);

        IWETH(WETH).deposit{value: SafeMath.mul(amounts[0], percent) / PERCENT_DENOMINATOR}();
        _innerTransferWETH(pair, SafeMath.mul(amounts[0], percent) / PERCENT_DENOMINATOR);
        _swapFee(amounts, path, percent);
    }

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external ensure(deadline) returns (uint256[] memory amounts) {
        require(path[path.length - 1] == WETH, 'DEMAX PLATFORM : INVALID_PATH');
        uint256 percent = _getSwapFeePercent();
        amounts = _getAmountsOut(amountIn, path, percent);
        require(amounts[amounts.length - 1] >= amountOutMin, 'DEMAX PLATFORM : INSUFFICIENT_OUTPUT_AMOUNT');
        address pair = DemaxSwapLibrary.pairFor(FACTORY, path[0], path[1]);
        _innerTransferFrom(
            path[0],
            msg.sender,
            pair,
            SafeMath.mul(amountIn, SafeMath.sub(PERCENT_DENOMINATOR, percent)) / PERCENT_DENOMINATOR
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);

        _innerTransferFrom(path[0], msg.sender, pair, SafeMath.mul(amounts[0], percent) / PERCENT_DENOMINATOR);
        _swapFee(amounts, path, percent);
    }

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external ensure(deadline) returns (uint256[] memory amounts) {
        uint256 percent = _getSwapFeePercent();
        amounts = _getAmountsIn(amountOut, path, percent);
        require(amounts[0] <= amountInMax, 'DEMAX PLATFORM : EXCESSIVE_INPUT_AMOUNT');
        address pair = DemaxSwapLibrary.pairFor(FACTORY, path[0], path[1]);

        _innerTransferFrom(
            path[0],
            msg.sender,
            pair,
            SafeMath.mul(amounts[0], SafeMath.sub(PERCENT_DENOMINATOR, percent)) / PERCENT_DENOMINATOR
        );
        _swap(amounts, path, to);
        _innerTransferFrom(path[0], msg.sender, pair, SafeMath.mul(amounts[0], percent) / PERCENT_DENOMINATOR);
        _swapFee(amounts, path, percent);
    }

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external ensure(deadline) returns (uint256[] memory amounts) {
        require(path[path.length - 1] == WETH, 'DEMAX PLATFORM : INVALID_PATH');
        uint256 percent = _getSwapFeePercent();
        amounts = _getAmountsIn(amountOut, path, percent);
        require(amounts[0] <= amountInMax, 'DEMAX PLATFORM : EXCESSIVE_INPUT_AMOUNT');
        address pair = DemaxSwapLibrary.pairFor(FACTORY, path[0], path[1]);
        _innerTransferFrom(
            path[0],
            msg.sender,
            pair,
            SafeMath.mul(amounts[0], SafeMath.sub(PERCENT_DENOMINATOR, percent)) / PERCENT_DENOMINATOR
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);

        _innerTransferFrom(path[0], msg.sender, pair, SafeMath.mul(amounts[0], percent) / PERCENT_DENOMINATOR);
        _swapFee(amounts, path, percent);
    }

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable ensure(deadline) returns (uint256[] memory amounts) {
        require(path[0] == WETH, 'DEMAX PLATFORM : INVALID_PATH');
        uint256 percent = _getSwapFeePercent();
        amounts = _getAmountsIn(amountOut, path, percent);
        require(amounts[0] <= msg.value, 'DEMAX PLATFORM : EXCESSIVE_INPUT_AMOUNT');

        IWETH(WETH).deposit{
            value: SafeMath.mul(amounts[0], SafeMath.sub(PERCENT_DENOMINATOR, percent)) / PERCENT_DENOMINATOR
        }();
        address pair = DemaxSwapLibrary.pairFor(FACTORY, path[0], path[1]);
        _innerTransferWETH(
            pair,
            SafeMath.mul(amounts[0], SafeMath.sub(PERCENT_DENOMINATOR, percent)) / PERCENT_DENOMINATOR
        );
        _swap(amounts, path, to);

        IWETH(WETH).deposit{value: SafeMath.mul(amounts[0], percent) / PERCENT_DENOMINATOR}();
        _innerTransferWETH(pair, SafeMath.mul(amounts[0], percent) / PERCENT_DENOMINATOR);
        _swapFee(amounts, path, percent);
        if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
    }

    function _transferNotify(
        address from,
        address to,
        address token,
        uint256 amount
    ) internal {
        IDemaxTransferListener(TRANSFER_LISTENER).transferNotify(from, to, token, amount);
    }

    function existPair(address tokenA, address tokenB) public view returns (bool) {
        return IDemaxFactory(FACTORY).getPair(tokenA, tokenB) != address(0);
    }

    function getReserves(address tokenA, address tokenB) public view returns (uint256, uint256) {
        return DemaxSwapLibrary.getReserves(FACTORY, tokenA, tokenB);
    }

    function pairFor(address tokenA, address tokenB) public view returns (address) {
        return DemaxSwapLibrary.pairFor(FACTORY, tokenA, tokenB);
    }

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) public view returns (uint256 amountOut) {
        uint256 percent = _getSwapFeePercent();
        uint256 amount = SafeMath.mul(amountIn, SafeMath.sub(PERCENT_DENOMINATOR, percent)) / PERCENT_DENOMINATOR;
        return DemaxSwapLibrary.getAmountOut(amount, reserveIn, reserveOut);
    }

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) public view returns (uint256 amountIn) {
        uint256 percent = _getSwapFeePercent();
        uint256 amount = DemaxSwapLibrary.getAmountIn(amountOut, reserveIn, reserveOut);
        return SafeMath.mul(amount, PERCENT_DENOMINATOR) / SafeMath.sub(PERCENT_DENOMINATOR, percent);
    }

    function getAmountsOut(uint256 amountIn, address[] memory path) public view returns (uint256[] memory amounts) {
        uint256 percent = _getSwapFeePercent();
        return _getAmountsOut(amountIn, path, percent);
    }

    function getAmountsIn(uint256 amountOut, address[] memory path) public view returns (uint256[] memory amounts) {
        uint256 percent = _getSwapFeePercent();
        return _getAmountsIn(amountOut, path, percent);
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":true,"internalType":"address","name":"tokenA","type":"address"},{"indexed":true,"internalType":"address","name":"tokenB","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountA","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountB","type":"uint256"}],"name":"AddLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"_newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":true,"internalType":"address","name":"tokenA","type":"address"},{"indexed":true,"internalType":"address","name":"tokenB","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountA","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountB","type":"uint256"}],"name":"RemoveLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"address","name":"fromToken","type":"address"},{"indexed":true,"internalType":"address","name":"toToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"inAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"outAmount","type":"uint256"}],"name":"SwapToken","type":"event"},{"inputs":[],"name":"CONFIG","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DGAS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FACTORY","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GOVERNANCE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERCENT_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFER_LISTENER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"_amountA","type":"uint256"},{"internalType":"uint256","name":"_amountB","type":"uint256"},{"internalType":"uint256","name":"_liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"existPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"getReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_DGAS","type":"address"},{"internalType":"address","name":"_CONFIG","type":"address"},{"internalType":"address","name":"_FACTORY","type":"address"},{"internalType":"address","name":"_WETH","type":"address"},{"internalType":"address","name":"_GOVERNANCE","type":"address"},{"internalType":"address","name":"_TRANSFER_LISTENER","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"pairFor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"swapPrecondition","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260018055600080546001600160a01b031916331790556147d1806100296000396000f3fe6080604052600436106101c65760003560e01c80638803dbee116100f7578063c2ceddfa11610095578063d92e82e411610064578063d92e82e414610a53578063ddd377ac14610a68578063f6f1e30614610a9b578063fb3bdb4114610ad9576101e1565b8063c2ceddfa146108b9578063cc2a9a5b14610908578063d06ca61f14610963578063d52bb6f414610a18576101e1565b80639e6c2959116100d15780639e6c2959146107ff578063a6f9dae114610814578063ad5c464814610847578063baa2abde1461085c576101e1565b80638803dbee146107195780638da5cb5b146107af57806396ed28f9146107c4576101e1565b80634a25d94a116101645780637ae06e581161013e5780637ae06e58146105d15780637ff36ab51461064a578063822abc7c146106ce57806385f8c259146106e3576101e1565b80634a25d94a1461051157806354fd4d50146105a7578063723c2e2d146105bc576101e1565b806318cbafe5116101a057806318cbafe5146102cb5780631f00ca74146103b15780632dd310001461046657806338ed17391461047b576101e1565b806302751cec146101e6578063054d50d414610252578063146278341461029a576101e1565b366101e1576005546001600160a01b031633146101df57fe5b005b600080fd5b3480156101f257600080fd5b50610239600480360360c081101561020957600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610b5d565b6040805192835260208301919091528051918290030190f35b34801561025e57600080fd5b506102886004803603606081101561027557600080fd5b5080359060208101359060400135610cc0565b60408051918252519081900360200190f35b3480156102a657600080fd5b506102af610d06565b604080516001600160a01b039092168252519081900360200190f35b3480156102d757600080fd5b50610361600480360360a08110156102ee57600080fd5b813591602081013591810190606081016040820135600160201b81111561031457600080fd5b82018360208201111561032657600080fd5b803590602001918460208302840111600160201b8311171561034757600080fd5b91935091506001600160a01b038135169060200135610d15565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561039d578181015183820152602001610385565b505050509050019250505060405180910390f35b3480156103bd57600080fd5b50610361600480360360408110156103d457600080fd5b81359190810190604081016020820135600160201b8111156103f557600080fd5b82018360208201111561040757600080fd5b803590602001918460208302840111600160201b8311171561042857600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611072945050505050565b34801561047257600080fd5b506102af611095565b34801561048757600080fd5b50610361600480360360a081101561049e57600080fd5b813591602081013591810190606081016040820135600160201b8111156104c457600080fd5b8201836020820111156104d657600080fd5b803590602001918460208302840111600160201b831117156104f757600080fd5b91935091506001600160a01b0381351690602001356110a4565b34801561051d57600080fd5b50610361600480360360a081101561053457600080fd5b813591602081013591810190606081016040820135600160201b81111561055a57600080fd5b82018360208201111561056c57600080fd5b803590602001918460208302840111600160201b8311171561058d57600080fd5b91935091506001600160a01b0381351690602001356111fb565b3480156105b357600080fd5b506102886113be565b3480156105c857600080fd5b506102af6113c4565b3480156105dd57600080fd5b5061062c600480360360e08110156105f457600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060c001356113d3565b60408051938452602084019290925282820152519081900360600190f35b6103616004803603608081101561066057600080fd5b81359190810190604081016020820135600160201b81111561068157600080fd5b82018360208201111561069357600080fd5b803590602001918460208302840111600160201b831117156106b457600080fd5b91935091506001600160a01b03813516906020013561155d565b3480156106da57600080fd5b506102af6118a7565b3480156106ef57600080fd5b506102886004803603606081101561070657600080fd5b50803590602081013590604001356118b6565b34801561072557600080fd5b50610361600480360360a081101561073c57600080fd5b813591602081013591810190606081016040820135600160201b81111561076257600080fd5b82018360208201111561077457600080fd5b803590602001918460208302840111600160201b8311171561079557600080fd5b91935091506001600160a01b0381351690602001356118fc565b3480156107bb57600080fd5b506102af611a11565b3480156107d057600080fd5b506102af600480360360408110156107e757600080fd5b506001600160a01b0381358116916020013516611a20565b34801561080b57600080fd5b50610288611a41565b34801561082057600080fd5b506101df6004803603602081101561083757600080fd5b50356001600160a01b0316611a47565b34801561085357600080fd5b506102af611b51565b34801561086857600080fd5b50610239600480360360e081101561087f57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135611b60565b3480156108c557600080fd5b506108f4600480360360408110156108dc57600080fd5b506001600160a01b0381358116916020013516611d98565b604080519115158252519081900360200190f35b34801561091457600080fd5b506101df600480360360c081101561092b57600080fd5b506001600160a01b038135811691602081013582169160408201358116916060810135821691608082013581169160a0013516611e30565b34801561096f57600080fd5b506103616004803603604081101561098657600080fd5b81359190810190604081016020820135600160201b8111156109a757600080fd5b8201836020820111156109b957600080fd5b803590602001918460208302840111600160201b831117156109da57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611ef3945050505050565b348015610a2457600080fd5b5061023960048036036040811015610a3b57600080fd5b506001600160a01b0381358116916020013516611f0c565b348015610a5f57600080fd5b506102af611f34565b348015610a7457600080fd5b506108f460048036036020811015610a8b57600080fd5b50356001600160a01b0316611f43565b61062c600480360360a0811015610ab157600080fd5b506001600160a01b038135169060208101359060408101359060608101359060800135612272565b61036160048036036080811015610aef57600080fd5b81359190810190604081016020820135600160201b811115610b1057600080fd5b820183602082011115610b2257600080fd5b803590602001918460208302840111600160201b83111715610b4357600080fd5b91935091506001600160a01b038135169060200135612507565b6000808242811015610ba4576040805162461bcd60e51b81526020600482015260186024820152600080516020614518833981519152604482015290519081900360640190fd5b600554610bc0908a906001600160a01b03168a8a8a308a611b60565b9093509150610bd0898685612865565b60055460408051632e1a7d4d60e01b81526004810185905290516001600160a01b0390921691632e1a7d4d9160248082019260009290919082900301818387803b158015610c1d57600080fd5b505af1158015610c31573d6000803e3d6000fd5b50505050610c3f85836129cf565b610c4b30868b86612ac7565b600554610c6590309087906001600160a01b031685612ac7565b600554604080518581526020810185905281516001600160a01b03938416938d169233927fa8dbaaebbb025c88e9e34c84635cd8238043556e9af43fb161508c898a8e1ef9929081900390910190a450965096945050505050565b600080610ccb612b5f565b90506000612710610ce787610ce261271086612bee565b612c30565b81610cee57fe5b049050610cfc818686612c89565b9695505050505050565b6006546001600160a01b031681565b60608142811015610d5b576040805162461bcd60e51b81526020600482015260186024820152600080516020614518833981519152604482015290519081900360640190fd5b6005546001600160a01b031686866000198101818110610d7757fe5b905060200201356001600160a01b03166001600160a01b031614610dd0576040805162461bcd60e51b815260206004820152601d60248201526000805160206146fe833981519152604482015290519081900360640190fd5b6000610dda612b5f565b9050610e1b89888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250869250612d45915050565b92508783600185510381518110610e2e57fe5b60200260200101511015610e735760405162461bcd60e51b815260040180806020018281038252602b815260200180614771602b913960400191505060405180910390fd5b600454600090610ec2906001600160a01b031689898481610e9057fe5b905060200201356001600160a01b03168a8a6001818110610ead57fe5b905060200201356001600160a01b0316612e77565b9050610f0688886000818110610ed457fe5b905060200201356001600160a01b03163383612710610ef98f610ce26127108a612bee565b81610f0057fe5b04612fc5565b610f4584898980806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250612fe3915050565b60055484516001600160a01b0390911690632e1a7d4d9086906000198101908110610f6c57fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610faa57600080fd5b505af1158015610fbe573d6000803e3d6000fd5b50505050610fe38685600187510381518110610fd657fe5b60200260200101516129cf565b61102688886000818110610ff357fe5b905060200201356001600160a01b03163383612710610ef98960008151811061101857fe5b602002602001015188612c30565b6110658489898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525087925061346c915050565b5050509695505050505050565b6060600061107e612b5f565b905061108b84848361386b565b9150505b92915050565b6004546001600160a01b031681565b606081428110156110ea576040805162461bcd60e51b81526020600482015260186024820152600080516020614518833981519152604482015290519081900360640190fd5b60006110f4612b5f565b905061113589888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250869250612d45915050565b9250878360018551038151811061114857fe5b6020026020010151101561118d5760405162461bcd60e51b815260040180806020018281038252602b815260200180614771602b913960400191505060405180910390fd5b6004546000906111aa906001600160a01b031689898481610e9057fe5b90506111bc88886000818110610ed457fe5b610fe3848989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b9250612fe3915050565b60608142811015611241576040805162461bcd60e51b81526020600482015260186024820152600080516020614518833981519152604482015290519081900360640190fd5b6005546001600160a01b03168686600019810181811061125d57fe5b905060200201356001600160a01b03166001600160a01b0316146112b6576040805162461bcd60e51b815260206004820152601d60248201526000805160206146fe833981519152604482015290519081900360640190fd5b60006112c0612b5f565b90506113018988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525086925061386b915050565b9250878360008151811061131157fe5b602002602001015111156113565760405162461bcd60e51b81526004018080602001828103825260278152602001806144cc6027913960400191505060405180910390fd5b600454600090611373906001600160a01b031689898481610e9057fe5b9050610f068888600081811061138557fe5b905060200201356001600160a01b03163383612710610ef9896000815181106113aa57fe5b6020026020010151610ce26127108a612bee565b60015481565b6002546001600160a01b031681565b6000806000834281101561141c576040805162461bcd60e51b81526020600482015260186024820152600080516020614518833981519152604482015290519081900360640190fd5b61142a8b8b8b8b8b8b6139d5565b6004549195509350600090611449906001600160a01b03168d8d612e77565b90506114578c338388613ec0565b6114638b338387613ec0565b604080516335313c2160e11b815233600482015290516001600160a01b03831691636a6278429160248083019260209291908290030181600087803b1580156114ab57600080fd5b505af11580156114bf573d6000803e3d6000fd5b505050506040513d60208110156114d557600080fd5b505192506114e533828e88612ac7565b6114f133828d87612ac7565b8a6001600160a01b03168c6001600160a01b0316336001600160a01b03167fc33fbc9654f9c0dcfcbd829113bdb10afe95619bc0824bc5959ad82fd6952bd98888604051808381526020018281526020019250505060405180910390a450509750975097945050505050565b606081428110156115a3576040805162461bcd60e51b81526020600482015260186024820152600080516020614518833981519152604482015290519081900360640190fd5b6005546001600160a01b031686866000816115ba57fe5b905060200201356001600160a01b03166001600160a01b031614611613576040805162461bcd60e51b815260206004820152601d60248201526000805160206146fe833981519152604482015290519081900360640190fd5b600061161d612b5f565b905061165e34888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250869250612d45915050565b9250878360018551038151811061167157fe5b602002602001015110156116b65760405162461bcd60e51b815260040180806020018281038252602b815260200180614771602b913960400191505060405180910390fd5b6004546000906116d3906001600160a01b031689898481610e9057fe5b60055485519192506001600160a01b03169063d0e30db090612710906117129088906000906116fe57fe5b6020026020010151610ce261271088612bee565b8161171957fe5b046040518263ffffffff1660e01b81526004016000604051808303818588803b15801561174557600080fd5b505af1158015611759573d6000803e3d6000fd5b505050505061178281612710611775876000815181106116fe57fe5b8161177c57fe5b04614015565b6117c1848989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b9250612fe3915050565b60055484516001600160a01b039091169063d0e30db090612710906117f99088906000906117eb57fe5b602002602001015186612c30565b8161180057fe5b046040518263ffffffff1660e01b81526004016000604051808303818588803b15801561182c57600080fd5b505af1158015611840573d6000803e3d6000fd5b505050505061185c81612710611775876000815181106117eb57fe5b61189b8489898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525087925061346c915050565b50505095945050505050565b6007546001600160a01b031681565b6000806118c1612b5f565b905060006118d08686866140bb565b90506118de61271083612bee565b6118ea82612710612c30565b816118f157fe5b049695505050505050565b60608142811015611942576040805162461bcd60e51b81526020600482015260186024820152600080516020614518833981519152604482015290519081900360640190fd5b600061194c612b5f565b905061198d8988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525086925061386b915050565b9250878360008151811061199d57fe5b602002602001015111156119e25760405162461bcd60e51b81526004018080602001828103825260278152602001806144cc6027913960400191505060405180910390fd5b6004546000906119ff906001600160a01b031689898481610e9057fe5b90506111bc8888600081811061138557fe5b6000546001600160a01b031681565b600454600090611a3a906001600160a01b03168484612e77565b9392505050565b61271081565b6000546001600160a01b03163314611a9b576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102327a92124a22222a760711b604482015290519081900360640190fd5b6001600160a01b038116611af6576040805162461bcd60e51b815260206004820152601860248201527f4f776e61626c653a20494e56414c49445f414444524553530000000000000000604482015290519081900360640190fd5b600080546040516001600160a01b03808516939216917fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c91a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031681565b6000808242811015611ba7576040805162461bcd60e51b81526020600482015260186024820152600080516020614518833981519152604482015290519081900360640190fd5b600454600090611bc1906001600160a01b03168c8c612e77565b60408051633dae446f60e21b81523360048201526001600160a01b038981166024830152604482018d905282519394508c938f938f9360009384939089169263f6b911bc926064808201939182900301818787803b158015611c2257600080fd5b505af1158015611c36573d6000803e3d6000fd5b505050506040513d6040811015611c4c57600080fd5b50805160209091015190925090506000611c668585614189565b509050806001600160a01b0316856001600160a01b031614611c89578183611c8c565b82825b909a509850611c9d878d878d612ac7565b611ca9878d868c612ac7565b8d8a1015611ce85760405162461bcd60e51b81526004018080602001828103825260268152602001806145de6026913960400191505060405180910390fd5b8c891015611d275760405162461bcd60e51b81526004018080602001828103825260268152602001806146d86026913960400191505060405180910390fd5b836001600160a01b0316856001600160a01b0316336001600160a01b03167fa8dbaaebbb025c88e9e34c84635cd8238043556e9af43fb161508c898a8e1ef98d8d604051808381526020018281526020019250505060405180910390a4505050505050505097509795505050505050565b600480546040805163e6a4390560e01b81526001600160a01b0386811694820194909452848416602482015290516000938493169163e6a43905916044808301926020929190829003018186803b158015611df257600080fd5b505afa158015611e06573d6000803e3d6000fd5b505050506040513d6020811015611e1c57600080fd5b50516001600160a01b031614159392505050565b6000546001600160a01b03163314611e84576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102327a92124a22222a760711b604482015290519081900360640190fd5b600280546001600160a01b03199081166001600160a01b0398891617909155600380548216968816969096179095556004805486169487169490941790935560058054851692861692909217909155600680548416918516919091179055600780549092169216919091179055565b60606000611eff612b5f565b905061108b848483612d45565b6004546000908190611f28906001600160a01b03168585614260565b915091505b9250929050565b6003546001600160a01b031681565b6002546000906001600160a01b0383811691161480611f6f57506005546001600160a01b038381169116145b15611f7c5750600161226d565b600354604080516360ccef1960e11b81527f544f4b454e5f544f5f444741535f504149525f4d494e5f50455243454e540000600482015290516000926001600160a01b03169163c199de32916024808301926020929190829003018186803b158015611fe757600080fd5b505afa158015611ffb573d6000803e3d6000fd5b505050506040513d602081101561201157600080fd5b5051600554600254919250612032916001600160a01b039182169116611d98565b61204057600091505061226d565b600254612056906001600160a01b031684611d98565b61206457600091505061226d565b6003546002546040805163a9ece1b760e01b81526001600160a01b03928316600482015286831660248201529051919092169163a9ece1b7916044808301926020929190829003018186803b1580156120bc57600080fd5b505afa1580156120d0573d6000803e3d6000fd5b505050506040513d60208110156120e657600080fd5b5051801561217457506003546005546040805163a9ece1b760e01b81526001600160a01b03928316600482015286831660248201529051919092169163a9ece1b7916044808301926020929190829003018186803b15801561214757600080fd5b505afa15801561215b573d6000803e3d6000fd5b505050506040513d602081101561217157600080fd5b50515b61218257600091505061226d565b600554612198906001600160a01b031684611d98565b6121a657600191505061226d565b806121b557600191505061226d565b6004546002546000916121d5916001600160a01b03918216911686614260565b506004546005549192506000916121f9916001600160a01b03908116911687614260565b506004546005546002549293506000928392612225926001600160a01b03918216929082169116614260565b915091506000816122368685612c30565b8161223d57fe5b0490506000612710612258612252848861432e565b89612c30565b8161225f57fe5b049091101596505050505050505b919050565b600080600083428110156122bb576040805162461bcd60e51b81526020600482015260186024820152600080516020614518833981519152604482015290519081900360640190fd5b6005546122d6908a906001600160a01b03168a348b8b6139d5565b6004546005549296509094506000916122fd916001600160a01b03908116918d9116612e77565b905061230b8a338388613ec0565b600560009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561235b57600080fd5b505af115801561236f573d6000803e3d6000fd5b50506005546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018b9052915191909216945063a9059cbb9350604480830193506020928290030181600087803b1580156123c857600080fd5b505af11580156123dc573d6000803e3d6000fd5b505050506040513d60208110156123f257600080fd5b50516123fa57fe5b604080516335313c2160e11b815233600482015290516001600160a01b03831691636a6278429160248083019260209291908290030181600087803b15801561244257600080fd5b505af1158015612456573d6000803e3d6000fd5b505050506040513d602081101561246c57600080fd5b505160055490935061248b90339083906001600160a01b031687612ac7565b61249733828c88612ac7565b600554604080518781526020810187905281516001600160a01b03938416938e169233927fc33fbc9654f9c0dcfcbd829113bdb10afe95619bc0824bc5959ad82fd6952bd9929081900390910190a4833411156124fa576124fa338534036129cf565b5050955095509592505050565b6060814281101561254d576040805162461bcd60e51b81526020600482015260186024820152600080516020614518833981519152604482015290519081900360640190fd5b6005546001600160a01b0316868660008161256457fe5b905060200201356001600160a01b03166001600160a01b0316146125bd576040805162461bcd60e51b815260206004820152601d60248201526000805160206146fe833981519152604482015290519081900360640190fd5b60006125c7612b5f565b90506126088888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525086925061386b915050565b9250348360008151811061261857fe5b6020026020010151111561265d5760405162461bcd60e51b81526004018080602001828103825260278152602001806144cc6027913960400191505060405180910390fd5b60055483516001600160a01b039091169063d0e30db0906127109061269b90879060009061268757fe5b6020026020010151610ce261271087612bee565b816126a257fe5b046040518263ffffffff1660e01b81526004016000604051808303818588803b1580156126ce57600080fd5b505af11580156126e2573d6000803e3d6000fd5b50506004546000935061270592506001600160a01b0316905089898481610e9057fe5b905061271e81612710611775876000815181106116fe57fe5b61275d848989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b9250612fe3915050565b60055484516001600160a01b039091169063d0e30db090612710906127879088906000906117eb57fe5b8161278e57fe5b046040518263ffffffff1660e01b81526004016000604051808303818588803b1580156127ba57600080fd5b505af11580156127ce573d6000803e3d6000fd5b50505050506127ea81612710611775876000815181106117eb57fe5b6128298489898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525087925061346c915050565b8360008151811061283657fe5b602002602001015134111561189b5761189b338560008151811061285657fe5b602002602001015134036129cf565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106128e25780518252601f1990920191602091820191016128c3565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612944576040519150601f19603f3d011682016040523d82523d6000602084013e612949565b606091505b5091509150818015612977575080511580612977575080806020019051602081101561297457600080fd5b50515b6129c8576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b60208310612a1b5780518252601f1990920191602091820191016129fc565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612a7d576040519150601f19603f3d011682016040523d82523d6000602084013e612a82565b606091505b5050905080612ac25760405162461bcd60e51b81526004018080602001828103825260238152602001806146b56023913960400191505060405180910390fd5b505050565b60075460408051632984b7a960e21b81526001600160a01b03878116600483015286811660248301528581166044830152606482018590529151919092169163a612dea49160848083019260209291908290030181600087803b158015612b2d57600080fd5b505af1158015612b41573d6000803e3d6000fd5b505050506040513d6020811015612b5757600080fd5b505050505050565b600354604080516360ccef1960e11b81526f14d5d05417d1915157d4115490d1539560821b600482015290516000926001600160a01b03169163c199de32916024808301926020929190829003018186803b158015612bbd57600080fd5b505afa158015612bd1573d6000803e3d6000fd5b505050506040513d6020811015612be757600080fd5b5051905090565b6000611a3a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614388565b600082612c3f5750600061108f565b82820282848281612c4c57fe5b0414611a3a5760405162461bcd60e51b81526004018080602001828103825260218152602001806145986021913960400191505060405180910390fd5b6000808411612cc95760405162461bcd60e51b815260040180806020018281038252602b81526020018061456d602b913960400191505060405180910390fd5b600083118015612cd95750600082115b612d145760405162461bcd60e51b81526004018080602001828103825260288152602001806146356028913960400191505060405180910390fd5b6000612d26858463ffffffff612c3016565b90506000612d3a858763ffffffff61432e16565b90508082816118f157fe5b6060825167ffffffffffffffff81118015612d5f57600080fd5b50604051908082528060200260200182016040528015612d89578160200160208202803683370190505b5090508381600081518110612d9a57fe5b602090810291909101015260005b6001845103811015612e6f576000848281518110612dc257fe5b602002602001015190506000858360010181518110612ddd57fe5b60200260200101519050600080612e0a600460009054906101000a90046001600160a01b03168585614260565b915091506000612e33878781518110612e1f57fe5b6020026020010151610ce26127108b612bee565b9050612e4461271082048484612c89565b878760010181518110612e5357fe5b6020908102919091010152505060019093019250612da8915050565b509392505050565b6000806000612e868585614189565b915091506000828260405160200180836001600160a01b03166001600160a01b031660601b8152601401826001600160a01b03166001600160a01b031660601b815260140192505050604051602081830303815290604052805190602001209050600060ff60f81b88838a6001600160a01b0316637c7f84ee6040518163ffffffff1660e01b815260040160206040518083038186803b158015612f2957600080fd5b505afa158015612f3d573d6000803e3d6000fd5b505050506040513d6020811015612f5357600080fd5b5051604080516001600160f81b03199590951660208087019190915260609490941b6bffffffffffffffffffffffff191660218601526035850192909252605580850191909152815180850390910181526075909301905281519101206001600160a01b031698975050505050505050565b612fd184848484613ec0565b612fdd83838684612ac7565b50505050565b61300382600184510381518110612ff657fe5b6020026020010151611f43565b61303e5760405162461bcd60e51b815260040180806020018281038252602f81526020018061471e602f913960400191505060405180910390fd5b60005b60018351038110156133b35760008084838151811061305c57fe5b602002602001015185846001018151811061307357fe5b60200260200101519150915061308882611f43565b6130c35760405162461bcd60e51b81526004018080602001828103825260318152602001806146046031913960400191505060405180910390fd5b6003546040805163a9ece1b760e01b81526001600160a01b03858116600483015284811660248301529151919092169163a9ece1b7916044808301926020929190829003018186803b15801561311857600080fd5b505afa15801561312c573d6000803e3d6000fd5b505050506040513d602081101561314257600080fd5b505161317f5760405162461bcd60e51b815260040180806020018281038252602c815260200180614689602c913960400191505060405180910390fd5b60008061318c8484614189565b9150915060008886600101815181106131a157fe5b60200260200101519050600080846001600160a01b0316876001600160a01b0316146131cf578260006131d3565b6000835b91509150600060028b510389106131ea578961321b565b6004548b5161321b916001600160a01b03169089908e9060028e0190811061320e57fe5b6020026020010151612e77565b600454909150613235906001600160a01b03168989612e77565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613272576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156132e35781810151838201526020016132cb565b50505050905090810190601f1680156133105780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561333257600080fd5b505af1158015613346573d6000803e3d6000fd5b505050506000831115613376576004546133769061336e906001600160a01b03168a8a612e77565b828886612ac7565b811561339f5760045461339f90613397906001600160a01b03168a8a612e77565b828785612ac7565b505060019096019550613041945050505050565b50816001835103815181106133c457fe5b60200260200101516001600160a01b0316826000815181106133e257fe5b60200260200101516001600160a01b0316826001600160a01b03167f3070708cdb5d7d3931be8443f49f7ec529e2bbe770b676e3c0cc40e158c5d0398660008151811061342b57fe5b60200260200101518760018851038151811061344357fe5b6020026020010151604051808381526020018281526020019250505060405180910390a4505050565b6040805160028082526060808301845292602083019080368337505060025482519293506001600160a01b03169183915060019081106134a857fe5b6001600160a01b039092166020928302919091019091015260005b60018451038110156129c85760006127106134e38784815181106117eb57fe5b816134ea57fe5b04905060008583815181106134fb57fe5b60200260200101519050600086846001018151811061351657fe5b602002602001015190506000613542600460009054906101000a90046001600160a01b03168484612e77565b6002549091506001600160a01b03848116911614156135f6576002546006546040805163012d9b4160e71b8152600481018890526001600160a01b039384166024820152918316604483015251918316916396cda0809160648082019260009290919082900301818387803b1580156135ba57600080fd5b505af11580156135ce573d6000803e3d6000fd5b50506006546002546135f193508492506001600160a01b03918216911687612ac7565b6137da565b6004546002546001600160a01b03808416926396cda08092889288926136229290821691849116612e77565b6040518463ffffffff1660e01b815260040180848152602001836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019350505050600060405180830381600087803b15801561368a57600080fd5b505af115801561369e573d6000803e3d6000fd5b5050600454600254600093508392506136c5916001600160a01b0390811691889116614260565b9150915060006136d6878484612c89565b6004546002549192506136f7916001600160a01b0391821691899116612e77565b6002546006546040805163012d9b4160e71b8152600481018690526001600160a01b03938416602482015291831660448301525192909116916396cda0809160648082019260009290919082900301818387803b15801561375757600080fd5b505af115801561376b573d6000803e3d6000fd5b505060045460025461379a9350879250613793916001600160a01b03908116918b9116612e77565b888a612ac7565b6004546002546137d5916137bc916001600160a01b03918216918a9116612e77565b6006546002546001600160a01b03918216911684612ac7565b955050505b831561385b5760065460408051631d3793b160e21b81526004810187905290516001600160a01b03909216916374de4ec4916024808201926020929091908290030181600087803b15801561382e57600080fd5b505af1158015613842573d6000803e3d6000fd5b505050506040513d602081101561385857600080fd5b50505b5050600190920191506134c39050565b6060825167ffffffffffffffff8111801561388557600080fd5b506040519080825280602002602001820160405280156138af578160200160208202803683370190505b50905083816001855103815181106138c357fe5b60209081029190910101528251600019015b80156139ad5760008460018303815181106138ec57fe5b60200260200101519050600085838151811061390457fe5b60200260200101519050600080613931600460009054906101000a90046001600160a01b03168585614260565b91509150600061395587878151811061394657fe5b602002602001015184846140bb565b90506139816139666127108a612bee565b61397283612710612c30565b8161397957fe5b04600161432e565b87600188038151811061399057fe5b6020908102919091010152505060001990930192506138d5915050565b506139cd816000815181106139be57fe5b60200260200101518484612d45565b949350505050565b600480546040805163e6a4390560e01b81526001600160a01b038a811694820194909452888416602482015290516000938493849391169163e6a4390591604480820192602092909190829003018186803b158015613a3357600080fd5b505afa158015613a47573d6000803e3d6000fd5b505050506040513d6020811015613a5d57600080fd5b50516001600160a01b03161415613bec576003546040805163d48bfca760e01b81526001600160a01b038b811660048301529151919092169163d48bfca79160248083019260209291908290030181600087803b158015613abd57600080fd5b505af1158015613ad1573d6000803e3d6000fd5b505050506040513d6020811015613ae757600080fd5b50506003546040805163d48bfca760e01b81526001600160a01b038a811660048301529151919092169163d48bfca79160248083019260209291908290030181600087803b158015613b3857600080fd5b505af1158015613b4c573d6000803e3d6000fd5b505050506040513d6020811015613b6257600080fd5b505060048054604080516364e329cb60e11b81526001600160a01b038c8116948201949094528a841660248201529051929091169163c9c65396916044808201926020929091908290030181600087803b158015613bbf57600080fd5b505af1158015613bd3573d6000803e3d6000fd5b505050506040513d6020811015613be957600080fd5b50505b6003546040805163a9ece1b760e01b81526001600160a01b038b811660048301528a811660248301529151919092169163a9ece1b7916044808301926020929190829003018186803b158015613c4157600080fd5b505afa158015613c55573d6000803e3d6000fd5b505050506040513d6020811015613c6b57600080fd5b5051613ca85760405162461bcd60e51b81526004018080602001828103825260358152602001806145386035913960400191505060405180910390fd5b6004546000908190613cc4906001600160a01b03168b8b614260565b91509150816000148015613cd6575080155b15613ce657879350869250613da6565b6000613cf389848461441f565b9050878111613d465785811015613d3b5760405162461bcd60e51b81526004018080602001828103825260268152602001806146d86026913960400191505060405180910390fd5b889450925082613da4565b6000613d5389848661441f565b905089811115613d5f57fe5b87811015613d9e5760405162461bcd60e51b81526004018080602001828103825260268152602001806145de6026913960400191505060405180910390fd5b94508793505b505b600480546040805163e6a4390560e01b81526001600160a01b038e8116948201949094528c841660248201529051929091169163c9ead258913391849163e6a43905916044808301926020929190829003018186803b158015613e0857600080fd5b505afa158015613e1c573d6000803e3d6000fd5b505050506040513d6020811015613e3257600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301525160448083019260209291908290030181600087803b158015613e8457600080fd5b505af1158015613e98573d6000803e3d6000fd5b505050506040513d6020811015613eae57600080fd5b50939a92995091975050505050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b60208310613f455780518252601f199092019160209182019101613f26565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613fa7576040519150601f19603f3d011682016040523d82523d6000602084013e613fac565b606091505b5091509150818015613fda575080511580613fda5750808060200190516020811015613fd757600080fd5b50515b612b575760405162461bcd60e51b815260040180806020018281038252602481526020018061474d6024913960400191505060405180910390fd5b6005546040805163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561406b57600080fd5b505af115801561407f573d6000803e3d6000fd5b505050506040513d602081101561409557600080fd5b505161409d57fe5b6005546140b790309084906001600160a01b031684612ac7565b5050565b60008084116140fb5760405162461bcd60e51b815260040180806020018281038252602c81526020018061465d602c913960400191505060405180910390fd5b60008311801561410b5750600082115b6141465760405162461bcd60e51b81526004018080602001828103825260288152602001806146356028913960400191505060405180910390fd5b6000614158848663ffffffff612c3016565b9050600061416c848763ffffffff612bee16565b9050610cfc600182848161417c57fe5b049063ffffffff61432e16565b600080826001600160a01b0316846001600160a01b031614156141dd5760405162461bcd60e51b81526004018080602001828103825260258152602001806145b96025913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b0316106141fd578284614200565b83835b90925090506001600160a01b038216611f2d576040805162461bcd60e51b815260206004820152601e60248201527f44656d6178537761704c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b600080600061426f8585614189565b509050600080614280888888612e77565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156142b857600080fd5b505afa1580156142cc573d6000803e3d6000fd5b505050506040513d60608110156142e257600080fd5b5080516020909101516dffffffffffffffffffffffffffff91821693501690506001600160a01b038781169084161461431c57808261431f565b81815b90999098509650505050505050565b600082820183811015611a3a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600081848411156144175760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156143dc5781810151838201526020016143c4565b50505050905090810190601f1680156144095780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600080841161445f5760405162461bcd60e51b81526004018080602001828103825260258152602001806144f36025913960400191505060405180910390fd5b60008311801561446f5750600082115b6144aa5760405162461bcd60e51b81526004018080602001828103825260288152602001806146356028913960400191505060405180910390fd5b826144bb858463ffffffff612c3016565b816144c257fe5b0494935050505056fe44454d415820504c4154464f524d203a204558434553534956455f494e5055545f414d4f554e5444656d6178537761704c6962726172793a20494e53554646494349454e545f414d4f554e5444454d415820504c4154464f524d203a2045585049524544000000000000000044454d415820504c4154464f524d203a20414444204c4951554944495459205041495220434f4e46494720434845434b204641494c44656d6178537761704c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7744656d6178537761704c6962726172793a204944454e544943414c5f41444452455353455344454d415820504c4154464f524d203a20494e53554646494349454e545f415f414d4f554e5444454d415820504c4154464f524d203a20434845434b20444741532f544f4b454e2056414c55452046524f4d204641494c44656d6178537761704c6962726172793a20494e53554646494349454e545f4c495155494449545944656d6178537761704c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e5444454d415820504c4154464f524d203a2053574150205041495220434f4e46494720434845434b204641494c5472616e7366657248656c7065723a204554485f5452414e534645525f4641494c454444454d415820504c4154464f524d203a20494e53554646494349454e545f425f414d4f554e5444454d415820504c4154464f524d203a20494e56414c49445f5041544800000044454d415820504c4154464f524d203a20434845434b20444741532f544f4b454e20544f2056414c5545204641494c5472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c454444454d415820504c4154464f524d203a20494e53554646494349454e545f4f55545055545f414d4f554e54a26469706673582212208be4c1e4adf8dc27ab41ccd74e3b7ead794af6205013046ff5e8e7765cba1f9964736f6c63430006060033

Deployed ByteCode Sourcemap

18201:23169:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19132:4;;-1:-1:-1;;;;;19132:4:0;19118:10;:18;19111:26;;;;18201:23169;;12:1:-1;9;2:12;25411:881:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25411:881:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;25411:881:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;40086:404;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40086:404:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;40086:404:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;18384:25;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18384:25:0;;;:::i;:::-;;;;-1:-1:-1;;;;;18384:25:0;;;;;;;;;;;;;;34788:1172;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34788:1172:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;34788:1172:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;34788:1172:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;34788:1172:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;34788:1172:0;;-1:-1:-1;34788:1172:0;-1:-1:-1;;;;;;34788:1172:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;34788:1172:0;;;;;;;;;;;;;;;;;41142:225;;5:9:-1;2:2;;;27:1;24;17:12;2:2;41142:225:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;41142:225:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;41142:225:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;41142:225:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;41142:225:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;41142:225:0;;-1:-1:-1;41142:225:0;;-1:-1:-1;;;;;41142:225:0:i;18329:22::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18329:22:0;;;:::i;32184:946::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32184:946:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;32184:946:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;32184:946:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;32184:946:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;32184:946:0;;-1:-1:-1;32184:946:0;-1:-1:-1;;;;;;32184:946:0;;;;;;;;:::i;36904:1152::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;36904:1152:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;36904:1152:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;36904:1152:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;36904:1152:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;36904:1152:0;;-1:-1:-1;36904:1152:0;-1:-1:-1;;;;;;36904:1152:0;;;;;;;;:::i;18242:26::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18242:26:0;;;:::i;18275:19::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18275:19:0;;;:::i;22084:990::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22084:990:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;22084:990:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;33600:1180;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;33600:1180:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;33600:1180:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;33600:1180:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;33600:1180:0;;-1:-1:-1;33600:1180:0;-1:-1:-1;;;;;;33600:1180:0;;;;;;;;:::i;18416:32::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18416:32:0;;;:::i;40498:403::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40498:403:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;40498:403:0;;;;;;;;;;;;:::i;35968:928::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35968:928:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;35968:928:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;35968:928:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;35968:928:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;35968:928:0;;-1:-1:-1;35968:928:0;-1:-1:-1;;;;;;35968:928:0;;;;;;;;:::i;359:20::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;359:20:0;;;:::i;39924:154::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39924:154:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;39924:154:0;;;;;;;;;;:::i;18455:51::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18455:51:0;;;:::i;645:210::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;645:210:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;645:210:0;-1:-1:-1;;;;;645:210:0;;:::i;18358:19::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18358:19:0;;;:::i;24308:1095::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24308:1095:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;24308:1095:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;39573:164::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39573:164:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;39573:164:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;19290:408;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19290:408:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;19290:408:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;40909:225::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40909:225:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;40909:225:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;40909:225:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;40909:225:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;40909:225:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;40909:225:0;;-1:-1:-1;40909:225:0;;-1:-1:-1;;;;;40909:225:0:i;39745:171::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39745:171:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;39745:171:0;;;;;;;;;;:::i;18301:21::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18301:21:0;;;:::i;27924:1078::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27924:1078:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;27924:1078:0;-1:-1:-1;;;;;27924:1078:0;;:::i;23082:1218::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;23082:1218:0;;;;;;;;;;;;;;;;;;;;;;;:::i;38064:1259::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;38064:1259:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;38064:1259:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;38064:1259:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;38064:1259:0;;-1:-1:-1;38064:1259:0;-1:-1:-1;;;;;;38064:1259:0;;;;;;;;:::i;25411:881::-;25643:19;25664:17;25624:8;19218:15;19206:8;:27;;19198:64;;;;;-1:-1:-1;;;19198:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19198:64:0;;;;;;;;;;;;;;;25771:4:::1;::::0;25721:196:::1;::::0;25751:5;;-1:-1:-1;;;;;25771:4:0::1;25790:9:::0;25814:14;25843:12;25878:4:::1;25898:8:::0;25721:15:::1;:196::i;:::-;25694:223:::0;;-1:-1:-1;25694:223:0;-1:-1:-1;25928:51:0::1;25956:5:::0;25963:2;25694:223;25928:27:::1;:51::i;:::-;25996:4;::::0;25990:31:::1;::::0;;-1:-1:-1;;;25990:31:0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;25996:4:0;;::::1;::::0;25990:20:::1;::::0;:31;;;;;25996:4:::1;::::0;25990:31;;;;;;;;25996:4;;25990:31;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;25990:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;25990:31:0;;;;26032:45;26063:2;26067:9;26032:30;:45::i;:::-;26088:54;26112:4;26119:2;26123:5;26130:11;26088:15;:54::i;:::-;26188:4;::::0;26153:51:::1;::::0;26177:4:::1;::::0;26184:2;;-1:-1:-1;;;;;26188:4:0::1;26194:9:::0;26153:15:::1;:51::i;:::-;26255:4;::::0;26220:64:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;26255:4:0;;::::1;::::0;26220:64;::::1;::::0;26236:10:::1;::::0;26220:64:::1;::::0;;;;;;;;;::::1;25411:881:::0;;;;;;;;;;:::o;40086:404::-;40220:17;40250:15;40268:20;:18;:20::i;:::-;40250:38;;40299:14;18501:5;40316:66;40329:8;40339:42;18501:5;40373:7;40339:12;:42::i;:::-;40316:12;:66::i;:::-;:88;;;;;;40299:105;;40422:60;40452:6;40460:9;40471:10;40422:29;:60::i;:::-;40415:67;40086:404;-1:-1:-1;;;;;;40086:404:0:o;18384:25::-;;;-1:-1:-1;;;;;18384:25:0;;:::o;34788:1172::-;35001:24;34982:8;19218:15;19206:8;:27;;19198:64;;;;;-1:-1:-1;;;19198:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19198:64:0;;;;;;;;;;;;;;;35071:4:::1;::::0;-1:-1:-1;;;;;35071:4:0::1;35046::::0;;-1:-1:-1;;35051:15:0;;35046:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;35046:21:0::1;-1:-1:-1::0;;;;;35046:29:0::1;;35038:71;;;::::0;;-1:-1:-1;;;35038:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;35038:71:0;;;;;;;;;;;;;::::1;;35120:15;35138:20;:18;:20::i;:::-;35120:38;;35179:39;35194:8;35204:4;;35179:39;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;35210:7:0;;-1:-1:-1;35179:14:0::1;::::0;-1:-1:-1;;35179:39:0:i:1;:::-;35169:49;;35268:12;35237:7;35262:1;35245:7;:14;:18;35237:27;;;;;;;;;;;;;;:43;;35229:99;;;;-1:-1:-1::0;;;35229:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35379:7;::::0;35339:12:::1;::::0;35354:51:::1;::::0;-1:-1:-1;;;;;35379:7:0::1;35388:4:::0;;35339:12;35388:7;::::1;;;;;;;;;;-1:-1:-1::0;;;;;35388:7:0::1;35397:4;;35402:1;35397:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;35397:7:0::1;35354:24;:51::i;:::-;35339:66;;35416:198;35449:4;;35454:1;35449:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;35449:7:0::1;35471:10;35496:4;18501:5;35515:66;35528:8;35538:42;18501:5;35572:7;35538:12;:42::i;35515:66::-;:88;;;;;;35416:18;:198::i;:::-;35625:35;35631:7;35640:4;;35625:35;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;35654:4:0::1;::::0;-1:-1:-1;35625:5:0::1;::::0;-1:-1:-1;;35625:35:0:i:1;:::-;35677:4;::::0;35700:14;;-1:-1:-1;;;;;35677:4:0;;::::1;::::0;35671:20:::1;::::0;35692:7;;-1:-1:-1;;35700:18:0;;;35692:27;::::1;;;;;;;;;;;35671:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;35671:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;35671:49:0;;;;35731:63;35762:2;35766:7;35791:1;35774:7;:14;:18;35766:27;;;;;;;;;;;;;;35731:30;:63::i;:::-;35807:102;35826:4;;35831:1;35826:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;35826:7:0::1;35835:10;35847:4;18501:5;35853:33;35866:7;35874:1;35866:10;;;;;;;;;;;;;;35878:7;35853:12;:33::i;35807:102::-;35920:32;35929:7;35938:4;;35920:32;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;35944:7:0;;-1:-1:-1;35920:8:0::1;::::0;-1:-1:-1;;35920:32:0:i:1;:::-;19273:1;;34788:1172:::0;;;;;;;;;:::o;41142:225::-;41227:24;41264:15;41282:20;:18;:20::i;:::-;41264:38;;41320:39;41334:9;41345:4;41351:7;41320:13;:39::i;:::-;41313:46;;;41142:225;;;;;:::o;18329:22::-;;;-1:-1:-1;;;;;18329:22:0;;:::o;32184:946::-;32400:24;32381:8;19218:15;19206:8;:27;;19198:64;;;;;-1:-1:-1;;;19198:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19198:64:0;;;;;;;;;;;;;;;32437:15:::1;32455:20;:18;:20::i;:::-;32437:38;;32496:39;32511:8;32521:4;;32496:39;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;32527:7:0;;-1:-1:-1;32496:14:0::1;::::0;-1:-1:-1;;32496:39:0:i:1;:::-;32486:49;;32585:12;32554:7;32579:1;32562:7;:14;:18;32554:27;;;;;;;;;;;;;;:43;;32546:99;;;;-1:-1:-1::0;;;32546:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32696:7;::::0;32656:12:::1;::::0;32671:51:::1;::::0;-1:-1:-1;;;;;32696:7:0::1;32705:4:::0;;32656:12;32705:7;::::1;;;32671:51;32656:66;;32733:198;32766:4;;32771:1;32766:7;;;;;;32733:198;32942:24;32948:7;32957:4;;32942:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;32963:2:0;;-1:-1:-1;32942:5:0::1;::::0;-1:-1:-1;;32942:24:0:i:1;36904:1152::-:0;37117:24;37098:8;19218:15;19206:8;:27;;19198:64;;;;;-1:-1:-1;;;19198:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19198:64:0;;;;;;;;;;;;;;;37187:4:::1;::::0;-1:-1:-1;;;;;37187:4:0::1;37162::::0;;-1:-1:-1;;37167:15:0;;37162:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;37162:21:0::1;-1:-1:-1::0;;;;;37162:29:0::1;;37154:71;;;::::0;;-1:-1:-1;;;37154:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;37154:71:0;;;;;;;;;;;;;::::1;;37236:15;37254:20;:18;:20::i;:::-;37236:38;;37295:39;37309:9;37320:4;;37295:39;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;37326:7:0;;-1:-1:-1;37295:13:0::1;::::0;-1:-1:-1;;37295:39:0:i:1;:::-;37285:49;;37367:11;37353:7;37361:1;37353:10;;;;;;;;;;;;;;:25;;37345:77;;;;-1:-1:-1::0;;;37345:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37473:7;::::0;37433:12:::1;::::0;37448:51:::1;::::0;-1:-1:-1;;;;;37473:7:0::1;37482:4:::0;;37433:12;37482:7;::::1;;;37448:51;37433:66;;37510:200;37543:4;;37548:1;37543:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;37543:7:0::1;37565:10;37590:4;18501:5;37609:68;37622:7;37630:1;37622:10;;;;;;;;;;;;;;37634:42;18501:5;37668:7;37634:12;:42::i;18242:26::-:0;;;;:::o;18275:19::-;;;-1:-1:-1;;;;;18275:19:0;;:::o;22084:990::-;22376:16;22407;22438:18;22334:8;19218:15;19206:8;:27;;19198:64;;;;;-1:-1:-1;;;19198:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19198:64:0;;;;;;;;;;;;;;;22507:71:::1;22521:6;22529;22537:7;22546;22555:10;22567;22507:13;:71::i;:::-;22629:7;::::0;22484:94;;-1:-1:-1;22484:94:0;-1:-1:-1;22589:12:0::1;::::0;22604:49:::1;::::0;-1:-1:-1;;;;;22629:7:0::1;22638:6:::0;22646;22604:24:::1;:49::i;:::-;22589:64;;22664:67;22696:6;22704:10;22716:4;22722:8;22664:31;:67::i;:::-;22742;22774:6;22782:10;22794:4;22800:8;22742:31;:67::i;:::-;22833:33;::::0;;-1:-1:-1;;;22833:33:0;;22855:10:::1;22833:33;::::0;::::1;::::0;;;-1:-1:-1;;;;;22833:21:0;::::1;::::0;::::1;::::0;:33;;;;;::::1;::::0;;;;;;;;-1:-1:-1;22833:21:0;:33;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;22833:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;22833:33:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;22833:33:0;;-1:-1:-1;22877:51:0::1;22893:10;22905:4:::0;22911:6;22919:8;22877:15:::1;:51::i;:::-;22939;22955:10;22967:4;22973:6;22981:8;22939:15;:51::i;:::-;23039:6;-1:-1:-1::0;;;;;23006:60:0::1;23031:6;-1:-1:-1::0;;;;;23006:60:0::1;23019:10;-1:-1:-1::0;;;;;23006:60:0::1;;23047:8;23057;23006:60;;;;;;;;;;;;;;;;;;;;;;;;19273:1;22084:990:::0;;;;;;;;;;;;:::o;33600:1180::-;33794:24;33775:8;19218:15;19206:8;:27;;19198:64;;;;;-1:-1:-1;;;19198:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19198:64:0;;;;;;;;;;;;;;;33850:4:::1;::::0;-1:-1:-1;;;;;33850:4:0::1;33839::::0;;33850::::1;33839:7:::0;::::1;;;;;;;;;;-1:-1:-1::0;;;;;33839:7:0::1;-1:-1:-1::0;;;;;33839:15:0::1;;33831:57;;;::::0;;-1:-1:-1;;;33831:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33831:57:0;;;;;;;;;;;;;::::1;;33899:15;33917:20;:18;:20::i;:::-;33899:38;;33958:40;33973:9;33984:4;;33958:40;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;33990:7:0;;-1:-1:-1;33958:14:0::1;::::0;-1:-1:-1;;33958:40:0:i:1;:::-;33948:50;;34048:12;34017:7;34042:1;34025:7;:14;:18;34017:27;;;;;;;;;;;;;;:43;;34009:99;;;;-1:-1:-1::0;;;34009:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34159:7;::::0;34119:12:::1;::::0;34134:51:::1;::::0;-1:-1:-1;;;;;34159:7:0::1;34168:4:::0;;34119:12;34168:7;::::1;;;34134:51;34202:4;::::0;34250:10;;34119:66;;-1:-1:-1;;;;;;34202:4:0::1;::::0;34196:19:::1;::::0;18501:5:::1;::::0;34237:68:::1;::::0;34250:7;;34202:4:::1;::::0;34250:10:::1;;;;;;;;;;34262:42;18501:5;34296:7;34262:12;:42::i;34237:68::-;:90;;;;;;34196:144;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;34196:144:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;34196:144:0;;;;;34351:153;34384:4;18501:5;34403:68;34416:7;34424:1;34416:10;;;;;;;34403:68;:90;;;;;;34351:18;:153::i;:::-;34515:24;34521:7;34530:4;;34515:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;34536:2:0;;-1:-1:-1;34515:5:0::1;::::0;-1:-1:-1;;34515:24:0:i:1;:::-;34558:4;::::0;34592:10;;-1:-1:-1;;;;;34558:4:0;;::::1;::::0;34552:19:::1;::::0;18501:5:::1;::::0;34579:33:::1;::::0;34592:7;;34558:4:::1;::::0;34592:10:::1;;;;;;;;;;34604:7;34579:12;:33::i;:::-;:55;;;;;;34552:85;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;34552:85:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;34552:85:0;;;;;34648:81;34667:4;18501:5;34673:33;34686:7;34694:1;34686:10;;;;;;;34648:81;34740:32;34749:7;34758:4;;34740:32;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;34764:7:0;;-1:-1:-1;34740:8:0::1;::::0;-1:-1:-1;;34740:32:0:i:1;:::-;19273:1;;33600:1180:::0;;;;;;;;:::o;18416:32::-;;;-1:-1:-1;;;;;18416:32:0;;:::o;40498:403::-;40632:16;40661:15;40679:20;:18;:20::i;:::-;40661:38;;40710:14;40727:62;40756:9;40767;40778:10;40727:28;:62::i;:::-;40710:79;;40851:42;18501:5;40885:7;40851:12;:42::i;:::-;40807:41;40820:6;18501:5;40807:12;:41::i;:::-;:86;;;;;;;40498:403;-1:-1:-1;;;;;;40498:403:0:o;35968:928::-;36184:24;36165:8;19218:15;19206:8;:27;;19198:64;;;;;-1:-1:-1;;;19198:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19198:64:0;;;;;;;;;;;;;;;36221:15:::1;36239:20;:18;:20::i;:::-;36221:38;;36280:39;36294:9;36305:4;;36280:39;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;36311:7:0;;-1:-1:-1;36280:13:0::1;::::0;-1:-1:-1;;36280:39:0:i:1;:::-;36270:49;;36352:11;36338:7;36346:1;36338:10;;;;;;;;;;;;;;:25;;36330:77;;;;-1:-1:-1::0;;;36330:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36458:7;::::0;36418:12:::1;::::0;36433:51:::1;::::0;-1:-1:-1;;;;;36458:7:0::1;36467:4:::0;;36418:12;36467:7;::::1;;;36433:51;36418:66;;36497:200;36530:4;;36535:1;36530:7;;;;;;359:20:::0;;;-1:-1:-1;;;;;359:20:0;;:::o;39924:154::-;40046:7;;39994;;40021:49;;-1:-1:-1;;;;;40046:7:0;40055:6;40063;40021:24;:49::i;:::-;40014:56;39924:154;-1:-1:-1;;;39924:154:0:o;18455:51::-;18501:5;18455:51;:::o;645:210::-;589:5;;-1:-1:-1;;;;;589:5:0;575:10;:19;567:50;;;;;-1:-1:-1;;;567:50:0;;;;;;;;;;;;-1:-1:-1;;;567:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;721:23:0;::::1;713:60;;;::::0;;-1:-1:-1;;;713:60:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;802:5;::::0;;789:30:::1;::::0;-1:-1:-1;;;;;789:30:0;;::::1;::::0;802:5;::::1;::::0;789:30:::1;::::0;::::1;830:5;:17:::0;;-1:-1:-1;;;;;;830:17:0::1;-1:-1:-1::0;;;;;830:17:0;;;::::1;::::0;;;::::1;::::0;;645:210::o;18358:19::-;;;-1:-1:-1;;;;;18358:19:0;;:::o;24308:1095::-;24557:15;24574;24538:8;19218:15;19206:8;:27;;19198:64;;;;;-1:-1:-1;;;19198:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19198:64:0;;;;;;;;;;;;;;;24642:7:::1;::::0;24602:12:::1;::::0;24617:49:::1;::::0;-1:-1:-1;;;;;24642:7:0::1;24651:6:::0;24659;24617:24:::1;:49::i;:::-;24825;::::0;;-1:-1:-1;;;24825:49:0;;24847:10:::1;24825:49;::::0;::::1;::::0;-1:-1:-1;;;;;24825:49:0;;::::1;::::0;;;;;;;;;;;;24602:64;;-1:-1:-1;24698:9:0;;24736:6;;24771;;24677:18:::1;::::0;;;24825:21;;::::1;::::0;::::1;::::0;:49;;;;;;;;;;;24677:18;24825:21;:49;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;24825:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;24825:49:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;24825:49:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;24825:49:0;-1:-1:-1;24886:14:0::1;24906:45;24934:7:::0;24943;24906:27:::1;:45::i;:::-;24885:66;;;24994:6;-1:-1:-1::0;;;;;24983:17:0::1;:7;-1:-1:-1::0;;;;;24983:17:0::1;;:59;;25025:7;25034;24983:59;;;25004:7;25013;24983:59;24962:80:::0;;-1:-1:-1;24962:80:0;-1:-1:-1;25053:43:0::1;25069:4:::0;25075:2;25079:7;24962:80;25053:15:::1;:43::i;:::-;25107;25123:4;25129:2;25133:7;25142;25107:15;:43::i;:::-;25180:10;25169:7;:21;;25161:72;;;;-1:-1:-1::0;;;25161:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25263:10;25252:7;:21;;25244:72;;;;-1:-1:-1::0;;;25244:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25369:7;-1:-1:-1::0;;;;;25332:63:0::1;25360:7;-1:-1:-1::0;;;;;25332:63:0::1;25348:10;-1:-1:-1::0;;;;;25332:63:0::1;;25378:7;25387;25332:63;;;;;;;;;;;;;;;;;;;;;;;;19273:1;;;;;;;24308:1095:::0;;;;;;;;;;;:::o;39573:164::-;39683:7;;;39669:46;;;-1:-1:-1;;;39669:46:0;;-1:-1:-1;;;;;39669:46:0;;;;;;;;;;;;;;;;;;;39645:4;;;;39683:7;;39669:30;;:46;;;;;;;;;;;;;;39683:7;39669:46;;;2:2:-1;;;;27:1;24;17:12;2:2;39669:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39669:46:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;39669:46:0;-1:-1:-1;;;;;39669:60:0;;;;39573:164;-1:-1:-1;;;39573:164:0:o;19290:408::-;589:5;;-1:-1:-1;;;;;589:5:0;575:10;:19;567:50;;;;;-1:-1:-1;;;567:50:0;;;;;;;;;;;;-1:-1:-1;;;567:50:0;;;;;;;;;;;;;;;19515:4:::1;:12:::0;;-1:-1:-1;;;;;;19515:12:0;;::::1;-1:-1:-1::0;;;;;19515:12:0;;::::1;;::::0;;;19538:6:::1;:16:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;19565:7:::1;:18:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;19594:4:::1;:12:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;19617:10:::1;:24:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;19652:17:::1;:38:::0;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;19290:408::o;40909:225::-;40994:24;41031:15;41049:20;:18;:20::i;:::-;41031:38;;41087:39;41102:8;41112:4;41118:7;41087:14;:39::i;39745:171::-;39884:7;;39819;;;;39855:53;;-1:-1:-1;;;;;39884:7:0;39893:6;39901;39855:28;:53::i;:::-;39848:60;;;;39745:171;;;;;;:::o;18301:21::-;;;-1:-1:-1;;;;;18301:21:0;;:::o;27924:1078::-;28016:4;;27986;;-1:-1:-1;;;;;28007:13:0;;;28016:4;;28007:13;;:30;;-1:-1:-1;28033:4:0;;-1:-1:-1;;;;;28024:13:0;;;28033:4;;28024:13;28007:30;28003:47;;;-1:-1:-1;28046:4:0;28039:11;;28003:47;28092:6;;28079:79;;;-1:-1:-1;;;28079:79:0;;16840:41;28079:79;;;;;;28061:15;;-1:-1:-1;;;;;28092:6:0;;28079:35;;:79;;;;;;;;;;;;;;28092:6;28079:79;;;2:2:-1;;;;27:1;24;17:12;2:2;28079:79:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28079:79:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;28079:79:0;28184:4;;28190;;28079:79;;-1:-1:-1;28174:21:0;;-1:-1:-1;;;;;28184:4:0;;;;28190;28174:9;:21::i;:::-;28169:40;;28204:5;28197:12;;;;;28169:40;28235:4;;28225:22;;-1:-1:-1;;;;;28235:4:0;28241:5;28225:9;:22::i;:::-;28220:41;;28256:5;28249:12;;;;;28220:41;28291:6;;28309:4;;28278:43;;;-1:-1:-1;;;28278:43:0;;-1:-1:-1;;;;;28309:4:0;;;28278:43;;;;;;;;;;;;;28291:6;;;;;28278:30;;:43;;;;;;;;;;;;;;28291:6;28278:43;;;2:2:-1;;;;27:1;24;17:12;2:2;28278:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28278:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;28278:43:0;:90;;;;-1:-1:-1;28338:6:0;;28356:4;;28325:43;;;-1:-1:-1;;;28325:43:0;;-1:-1:-1;;;;;28356:4:0;;;28325:43;;;;;;;;;;;;;28338:6;;;;;28325:30;;:43;;;;;;;;;;;;;;28338:6;28325:43;;;2:2:-1;;;;27:1;24;17:12;2:2;28325:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28325:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;28325:43:0;28278:90;28272:111;;28378:5;28371:12;;;;;28272:111;28409:4;;28399:22;;-1:-1:-1;;;;;28409:4:0;28415:5;28399:9;:22::i;:::-;28394:40;;28430:4;28423:11;;;;;28394:40;28449:12;28445:29;;28470:4;28463:11;;;;;28445:29;28540:7;;28549:4;;28486:19;;28511:50;;-1:-1:-1;;;;;28540:7:0;;;;28549:4;28555:5;28511:28;:50::i;:::-;-1:-1:-1;28627:7:0;;28636:4;;28485:76;;-1:-1:-1;28573:19:0;;28598:50;;-1:-1:-1;;;;;28627:7:0;;;;28636:4;28642:5;28598:28;:50::i;:::-;-1:-1:-1;28735:7:0;;28744:4;;28750;;28572:76;;-1:-1:-1;28660:20:0;;;;28706:49;;-1:-1:-1;;;;;28735:7:0;;;;28744:4;;;;28750;28706:28;:49::i;:::-;28659:96;;;;28766:17;28828:12;28786:39;28799:11;28812:12;28786;:39::i;:::-;:54;;;;;;28766:74;;28851:18;18501:5;28872:59;28885:36;28898:9;28909:11;28885:12;:36::i;:::-;28923:7;28872:12;:59::i;:::-;:81;;;;;;28971:23;;;;;-1:-1:-1;;;;;;;27924:1078:0;;;;:::o;23082:1218::-;23359:19;23393:17;23425;23317:8;19218:15;19206:8;:27;;19198:64;;;;;-1:-1:-1;;;19198:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19198:64:0;;;;;;;;;;;;;;;23545:4:::1;::::0;23497:176:::1;::::0;23525:5;;-1:-1:-1;;;;;23545:4:0::1;23564:18:::0;23597:9:::1;23621:14:::0;23650:12;23497:13:::1;:176::i;:::-;23724:7;::::0;23740:4:::1;::::0;23470:203;;-1:-1:-1;23470:203:0;;-1:-1:-1;23684:12:0::1;::::0;23699:46:::1;::::0;-1:-1:-1;;;;;23724:7:0;;::::1;::::0;23733:5;;23740:4:::1;23699:24;:46::i;:::-;23684:61;;23756:69;23788:5;23795:10;23807:4;23813:11;23756:31;:69::i;:::-;23842:4;;;;;;;;;-1:-1:-1::0;;;;;23842:4:0::1;-1:-1:-1::0;;;;;23836:19:0::1;;23863:9;23836:39;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;23836:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;23899:4:0::1;::::0;23893:37:::1;::::0;;-1:-1:-1;;;23893:37:0;;-1:-1:-1;;;;;23893:37:0;;::::1;;::::0;::::1;::::0;;;;;;;;;23899:4;;;::::1;::::0;-1:-1:-1;23893:20:0::1;::::0;-1:-1:-1;23893:37:0;;;;;-1:-1:-1;23893:37:0::1;::::0;;;;;;23899:4:::1;::::0;23893:37;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;23893:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23893:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;23893:37:0;23886:45:::1;;;;23954:33;::::0;;-1:-1:-1;;;23954:33:0;;23976:10:::1;23954:33;::::0;::::1;::::0;;;-1:-1:-1;;;;;23954:21:0;::::1;::::0;::::1;::::0;:33;;;;;::::1;::::0;;;;;;;;-1:-1:-1;23954:21:0;:33;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;23954:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23954:33:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;23954:33:0;24032:4:::1;::::0;23954:33;;-1:-1:-1;23998:50:0::1;::::0;24014:10:::1;::::0;24026:4;;-1:-1:-1;;;;;24032:4:0::1;24038:9:::0;23998:15:::1;:50::i;:::-;24059:53;24075:10;24087:4;24093:5;24100:11;24059:15;:53::i;:::-;24160:4;::::0;24128:61:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;24160:4:0;;::::1;::::0;24128:61;::::1;::::0;24141:10:::1;::::0;24128:61:::1;::::0;;;;;;;;;::::1;24216:9;24204;:21;24200:92;;;24227:65;24258:10;24282:9;24270;:21;24227:30;:65::i;:::-;19273:1;23082:1218:::0;;;;;;;;;;:::o;38064:1259::-;38255:24;38236:8;19218:15;19206:8;:27;;19198:64;;;;;-1:-1:-1;;;19198:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19198:64:0;;;;;;;;;;;;;;;38311:4:::1;::::0;-1:-1:-1;;;;;38311:4:0::1;38300::::0;;38311::::1;38300:7:::0;::::1;;;;;;;;;;-1:-1:-1::0;;;;;38300:7:0::1;-1:-1:-1::0;;;;;38300:15:0::1;;38292:57;;;::::0;;-1:-1:-1;;;38292:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;38292:57:0;;;;;;;;;;;;;::::1;;38360:15;38378:20;:18;:20::i;:::-;38360:38;;38419:39;38433:9;38444:4;;38419:39;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;38450:7:0;;-1:-1:-1;38419:13:0::1;::::0;-1:-1:-1;;38419:39:0:i:1;:::-;38409:49;;38491:9;38477:7;38485:1;38477:10;;;;;;;;;;;;;;:23;;38469:75;;;;-1:-1:-1::0;;;38469:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38563:4;::::0;38611:10;;-1:-1:-1;;;;;38563:4:0;;::::1;::::0;38557:19:::1;::::0;18501:5:::1;::::0;38598:68:::1;::::0;38611:7;;38563:4:::1;::::0;38611:10:::1;;;;;;;;;;38623:42;18501:5;38657:7;38623:12;:42::i;38598:68::-;:90;;;;;;38557:144;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;38557:144:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;38752:7:0::1;::::0;38712:12:::1;::::0;-1:-1:-1;38727:51:0::1;::::0;-1:-1:-1;;;;;;38752:7:0::1;::::0;-1:-1:-1;38761:4:0;;38712:12;38761:7;::::1;;;38727:51;38712:66;;38789:153;38822:4;18501:5;38841:68;38854:7;38862:1;38854:10;;;;;;;38789:153;38953:24;38959:7;38968:4;;38953:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;38974:2:0;;-1:-1:-1;38953:5:0::1;::::0;-1:-1:-1;;38953:24:0:i:1;:::-;38996:4;::::0;39030:10;;-1:-1:-1;;;;;38996:4:0;;::::1;::::0;38990:19:::1;::::0;18501:5:::1;::::0;39017:33:::1;::::0;39030:7;;38996:4:::1;::::0;39030:10:::1;;;39017:33;:55;;;;;;38990:85;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;38990:85:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;38990:85:0;;;;;39086:81;39105:4;18501:5;39111:33;39124:7;39132:1;39124:10;;;;;;;39086:81;39178:32;39187:7;39196:4;;39178:32;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;39202:7:0;;-1:-1:-1;39178:8:0::1;::::0;-1:-1:-1;;39178:32:0:i:1;:::-;39237:7;39245:1;39237:10;;;;;;;;;;;;;;39225:9;:22;39221:94;;;39249:66;39280:10;39304:7;39312:1;39304:10;;;;;;;;;;;;;;39292:9;:22;39249:30;:66::i;9860:361::-:0;10055:45;;;-1:-1:-1;;;;;10055:45:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;10055:45:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;10044:57:0;;;;10009:12;;10023:17;;10044:10;;;;10055:45;10044:57;;;25:18:-1;10044:57:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;10044:57:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;10008:93:0;;;;10120:7;:57;;;;-1:-1:-1;10132:11:0;;:16;;:44;;;10163:4;10152:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;10152:24:0;10132:44;10112:101;;;;;-1:-1:-1;;;10112:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9860:361;;;;;:::o;10639:195::-;10747:12;;;10709;10747;;;;;;;;;-1:-1:-1;;;;;10726:7:0;;;10740:5;;10726:34;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;10726:34:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;10708:52:0;;;10779:7;10771:55;;;;-1:-1:-1;;;10771:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10639:195;;;:::o;39331:234::-;39499:17;;39476:81;;;-1:-1:-1;;;39476:81:0;;-1:-1:-1;;;;;39476:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39499:17;;;;;39476:56;;:81;;;;;;;;;;;;;;39499:17;;39476:81;;;2:2:-1;;;;27:1;24;17:12;2:2;39476:81:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39476:81:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;39331:234:0:o;32023:153::-;32116:6;;32103:65;;;-1:-1:-1;;;32103:65:0;;-1:-1:-1;;;32103:65:0;;;;;;32076:7;;-1:-1:-1;;;;;32116:6:0;;32103:35;;:65;;;;;;;;;;;;;;32116:6;32103:65;;;2:2:-1;;;;27:1;24;17:12;2:2;32103:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32103:65:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;32103:65:0;;-1:-1:-1;32023:153:0;:::o;12266:136::-;12324:7;12351:43;12355:1;12358;12351:43;;;;;;;;;;;;;;;;;:3;:43::i;13156:471::-;13214:7;13459:6;13455:47;;-1:-1:-1;13489:1:0;13482:8;;13455:47;13526:5;;;13530:1;13526;:5;:1;13550:5;;;;;:10;13542:56;;;;-1:-1:-1;;;13542:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8297:442;8390:14;8436:1;8425:8;:12;8417:68;;;;-1:-1:-1;;;8417:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8516:1;8504:9;:13;:31;;;;;8534:1;8521:10;:14;8504:31;8496:84;;;;-1:-1:-1;;;8496:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8591:14;8608:24;:8;8621:10;8608:24;:12;:24;:::i;:::-;8591:41;-1:-1:-1;8643:16:0;8662:23;:9;8676:8;8662:23;:13;:23;:::i;:::-;8643:42;;8720:11;8708:9;:23;;;;26300:739;26437:27;26504:4;:11;26490:26;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26490:26:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;26490:26:0;;26477:39;;26543:6;26527:10;26538:1;26527:13;;;;;;;;;;;;;;;;;:22;26565:9;26560:472;26598:1;26584:4;:11;:15;26580:1;:19;26560:472;;;26621:14;26638:4;26643:1;26638:7;;;;;;;;;;;;;;26621:24;;26660:15;26678:4;26683:1;26687;26683:5;26678:11;;;;;;;;;;;;;;26660:29;;26705:16;26723;26743:54;26772:7;;;;;;;;;-1:-1:-1;;;;;26772:7:0;26781:6;26789:7;26743:28;:54::i;:::-;26704:93;;;;26812:17;26832:71;26845:10;26856:1;26845:13;;;;;;;;;;;;;;26860:42;18501:5;26894:7;26860:12;:42::i;26832:71::-;26812:91;-1:-1:-1;26938:82:0;18501:5;26812:91;26968:31;27001:8;27011;26938:29;:82::i;:::-;26918:10;26929:1;26933;26929:5;26918:17;;;;;;;;;;;;;;;;;:102;-1:-1:-1;;26601:3:0;;;;;-1:-1:-1;26560:472:0;;-1:-1:-1;;26560:472:0;;;26300:739;;;;;:::o;6772:520::-;6861:12;6887:14;6903;6921:26;6932:6;6940;6921:10;:26::i;:::-;6886:61;;;;6958:12;7000:6;7008;6983:32;;;;;;-1:-1:-1;;;;;6983:32:0;-1:-1:-1;;;;;6983:32:0;;;;;;;;-1:-1:-1;;;;;6983:32:0;-1:-1:-1;;;;;6983:32:0;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;6983:32:0;;;6973:43;;;;;;6958:58;;7027:18;7107:4;7100:12;;7127:7;7149:4;7182:7;-1:-1:-1;;;;;7168:39:0;;:41;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;7168:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7168:41:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;7168:41:0;7069:155;;;-1:-1:-1;;;;;;7069:155:0;;;;7168:41;7069:155;;;;;;;;;;;;-1:-1:-1;;7069:155:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;7069:155:0;;;;;;7048:187;;;;;-1:-1:-1;;;;;7250:34:0;;6772:520;-1:-1:-1;;;;;;;;6772:520:0:o;33138:263::-;33286:56;33318:5;33325:4;33331:2;33335:6;33286:31;:56::i;:::-;33353:40;33369:4;33375:2;33379:5;33386:6;33353:15;:40::i;:::-;33138:263;;;;:::o;29010:1504::-;29149:39;29166:4;29185:1;29171:4;:11;:15;29166:21;;;;;;;;;;;;;;29149:16;:39::i;:::-;29141:99;;;;-1:-1:-1;;;29141:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29256:9;29251:1156;29285:1;29271:4;:11;:15;29267:1;:19;29251:1156;;;29309:13;29324:14;29343:4;29348:1;29343:7;;;;;;;;;;;;;;29352:4;29357:1;29361;29357:5;29352:11;;;;;;;;;;;;;;29308:56;;;;29387:23;29404:5;29387:16;:23::i;:::-;29379:85;;;;-1:-1:-1;;;29379:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29500:6;;29487:45;;;-1:-1:-1;;;29487:45:0;;-1:-1:-1;;;;;29487:45:0;;;;;;;;;;;;;;;;29500:6;;;;;29487:30;;:45;;;;;;;;;;;;;;29500:6;29487:45;;;2:2:-1;;;;27:1;24;17:12;2:2;29487:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29487:45:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;29487:45:0;29479:102;;;;-1:-1:-1;;;29479:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29597:14;29613;29631:42;29659:5;29666:6;29631:27;:42::i;:::-;29596:77;;;;29688:17;29708:7;29716:1;29720;29716:5;29708:14;;;;;;;;;;;;;;29688:34;;29738:18;29758;29789:6;-1:-1:-1;;;;;29780:15:0;:5;-1:-1:-1;;;;;29780:15:0;;:101;;29859:9;29878:1;29780:101;;;29824:1;29828:9;29780:101;29737:144;;;;29896:10;29927:1;29913:4;:11;:15;29909:1;:19;:82;;29988:3;29909:82;;;29956:7;;29973:11;;29931:54;;-1:-1:-1;;;;;29956:7:0;;29965:6;;29973:4;;29982:1;29978:5;;;29973:11;;;;;;;;;;;;29931:24;:54::i;:::-;30042:7;;29896:95;;-1:-1:-1;30017:48:0;;-1:-1:-1;;;;;30042:7:0;30051:5;30058:6;30017:24;:48::i;:::-;-1:-1:-1;;;;;30006:65:0;;30072:10;30084;30096:2;30110:1;30100:12;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;108:14;30100:12:0;87:42:-1;143:17;;-1:-1;30100:12:0;;30006:107;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30006:107:0;-1:-1:-1;;;;;30006:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;30006:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30006:107:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30006:107:0;;;;30145:1;30132:10;:14;30128:126;;;30206:7;;30165:89;;30181:48;;-1:-1:-1;;;;;30206:7:0;30215:5;30222:6;30181:24;:48::i;:::-;30231:2;30235:6;30243:10;30165:15;:89::i;:::-;30273:14;;30269:126;;30347:7;;30306:89;;30322:48;;-1:-1:-1;;;;;30347:7:0;30356:5;30363:6;30322:24;:48::i;:::-;30372:2;30376:6;30384:10;30306:15;:89::i;:::-;-1:-1:-1;;29288:3:0;;;;;-1:-1:-1;29251:1156:0;;-1:-1:-1;;;;;29251:1156:0;;;30446:4;30465:1;30451:4;:11;:15;30446:21;;;;;;;;;;;;;;-1:-1:-1;;;;;30422:84:0;30437:4;30442:1;30437:7;;;;;;;;;;;;;;-1:-1:-1;;;;;30422:84:0;30432:3;-1:-1:-1;;;;;30422:84:0;;30469:7;30477:1;30469:10;;;;;;;;;;;;;;30481:7;30503:1;30489:4;:11;:15;30481:24;;;;;;;;;;;;;;30422:84;;;;;;;;;;;;;;;;;;;;;;;;29010:1504;;;:::o;30522:1493::-;30687:16;;;30701:1;30687:16;;;30660:24;30687:16;;;;;30660:24;30687:16;;;;;109:14:-1;30687:16:0;88:42:-1;-1:-1;;30727:4:0;;30714:10;;;;-1:-1:-1;;;;;;30727:4:0;;30714:10;;-1:-1:-1;30727:4:0;;30714:10;;;;;;-1:-1:-1;;;;;30714:17:0;;;:10;;;;;;;;;;;:17;30747:9;30742:1266;30780:1;30766:4;:11;:15;30762:1;:19;30742:1266;;;30803:11;18501:5;30817:33;30830:7;30838:1;30830:10;;;;;;;30817:33;:55;;;;;;30803:69;;30887:13;30903:4;30908:1;30903:7;;;;;;;;;;;;;;30887:23;;30925:14;30942:4;30947:1;30951;30947:5;30942:11;;;;;;;;;;;;;;30925:28;;30968:19;30990:48;31015:7;;;;;;;;;-1:-1:-1;;;;;31015:7:0;31024:5;31031:6;30990:24;:48::i;:::-;31066:4;;30968:70;;-1:-1:-1;;;;;;31057:13:0;;;31066:4;;31057:13;31053:873;;;31128:4;;31134:10;;31091:54;;;-1:-1:-1;;;31091:54:0;;;;;;;;-1:-1:-1;;;;;31128:4:0;;;31091:54;;;;31134:10;;;31091:54;;;;;:31;;;;;;:54;;;;;31128:4;;31091:54;;;;;;;;31128:4;31091:31;:54;;;2:2:-1;;;;27:1;24;17:12;2:2;31091:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;31193:10:0;;31205:4;;31164:51;;-1:-1:-1;31180:11:0;;-1:-1:-1;;;;;;31193:10:0;;;;31205:4;31211:3;31164:15;:51::i;:::-;31053:873;;;31325:7;;31341:4;;-1:-1:-1;;;;;31256:31:0;;;;;;31288:3;;31293:5;;31300:46;;31325:7;;;;31293:5;;31341:4;31300:24;:46::i;:::-;31256:91;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31256:91:0;-1:-1:-1;;;;;31256:91:0;;;;;;-1:-1:-1;;;;;31256:91:0;-1:-1:-1;;;;;31256:91:0;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31256:91:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;31438:7:0;;31454:4;;31367:17;;-1:-1:-1;31367:17:0;;-1:-1:-1;31409:50:0;;-1:-1:-1;;;;;31438:7:0;;;;31447:5;;31454:4;31409:28;:50::i;:::-;31366:93;;;;31478:14;31495:58;31525:3;31530:9;31541:11;31495:29;:58::i;:::-;31608:7;;31624:4;;31478:75;;-1:-1:-1;31583:46:0;;-1:-1:-1;;;;;31608:7:0;;;;31617:5;;31624:4;31583:24;:46::i;:::-;31647:4;;31653:10;;31572:92;;;-1:-1:-1;;;31572:92:0;;;;;;;;-1:-1:-1;;;;;31647:4:0;;;31572:92;;;;31653:10;;;31572:92;;;;;:66;;;;;;;:92;;;;;31647:4;;31572:92;;;;;;;;31647:4;31572:66;:92;;;2:2:-1;;;;27:1;24;17:12;2:2;31572:92:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;31737:7:0;;31753:4;;31683:88;;-1:-1:-1;31699:11:0;;-1:-1:-1;31712:46:0;;-1:-1:-1;;;;;31737:7:0;;;;31746:5;;31753:4;31712:24;:46::i;:::-;31760:5;31767:3;31683:15;:88::i;:::-;31831:7;;31847:4;;31790:89;;31806:46;;-1:-1:-1;;;;;31831:7:0;;;;31840:5;;31847:4;31806:24;:46::i;:::-;31854:10;;31866:4;;-1:-1:-1;;;;;31854:10:0;;;;31866:4;31872:6;31790:15;:89::i;:::-;31904:6;-1:-1:-1;;;31053:873:0;31944:7;;31940:56;;31970:10;;31953:43;;;-1:-1:-1;;;31953:43:0;;;;;;;;;;-1:-1:-1;;;;;31970:10:0;;;;31953:38;;:43;;;;;;;;;;;;;;;31970:10;;31953:43;;;2:2:-1;;;;27:1;24;17:12;2:2;31953:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31953:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;31940:56:0;-1:-1:-1;;30783:3:0;;;;;-1:-1:-1;30742:1266:0;;-1:-1:-1;30742:1266:0;27047:869;27183:25;27246:4;:11;27232:26;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27232:26:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;27232:26:0;;27221:37;;27297:6;27269:8;27292:1;27278:4;:11;:15;27269:25;;;;;;;;;;;;;;;;;:34;27331:11;;-1:-1:-1;;27331:15:0;27314:531;27348:5;;27314:531;;27375:14;27392:4;27401:1;27397;:5;27392:11;;;;;;;;;;;;;;27375:28;;27418:15;27436:4;27441:1;27436:7;;;;;;;;;;;;;;27418:25;;27459:16;27477;27497:54;27526:7;;;;;;;;;-1:-1:-1;;;;;27526:7:0;27535:6;27543:7;27497:28;:54::i;:::-;27458:93;;;;27566:16;27585:61;27614:8;27623:1;27614:11;;;;;;;;;;;;;;27627:8;27637;27585:28;:61::i;:::-;27566:80;;27679:154;27756:42;18501:5;27790:7;27756:12;:42::i;:::-;27710:43;27723:8;18501:5;27710:12;:43::i;:::-;:88;;;;;;27817:1;27679:12;:154::i;:::-;27661:8;27674:1;27670;:5;27661:15;;;;;;;;;;;;;;;;;:172;-1:-1:-1;;;;27355:3:0;;;;-1:-1:-1;27314:531:0;;-1:-1:-1;;27314:531:0;;;27866:42;27881:8;27890:1;27881:11;;;;;;;;;;;;;;27894:4;27900:7;27866:14;:42::i;:::-;27855:53;27047:869;-1:-1:-1;;;;27047:869:0:o;19706:1723::-;19991:7;;;19977:46;;;-1:-1:-1;;;19977:46:0;;-1:-1:-1;;;;;19977:46:0;;;;;;;;;;;;;;;;;;;19928:15;;;;;;19991:7;;;19977:30;;:46;;;;;;;;;;;;;;;19991:7;19977:46;;;2:2:-1;;;;27:1;24;17:12;2:2;19977:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19977:46:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;19977:46:0;-1:-1:-1;;;;;19977:60:0;;19973:246;;;20067:6;;20054:37;;;-1:-1:-1;;;20054:37:0;;-1:-1:-1;;;;;20054:37:0;;;;;;;;;20067:6;;;;;20054:29;;:37;;;;;;;;;;;;;;20067:6;;20054:37;;;2:2:-1;;;;27:1;24;17:12;2:2;20054:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20054:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;20119:6:0;;20106:37;;;-1:-1:-1;;;20106:37:0;;-1:-1:-1;;;;;20106:37:0;;;;;;;;;20119:6;;;;;20106:29;;:37;;;;;20054;;20106;;;;;;;20119:6;;20106:37;;;2:2:-1;;;;27:1;24;17:12;2:2;20106:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20106:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;20172:7:0;;;20158:49;;;-1:-1:-1;;;20158:49:0;;-1:-1:-1;;;;;20158:49:0;;;;;;;;;;;;;;;;;;;20172:7;;;;;20158:33;;:49;;;;;20106:37;;20158:49;;;;;;;;20172:7;;20158:49;;;2:2:-1;;;;27:1;24;17:12;2:2;20158:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20158:49:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;19973:246:0;20264:6;;20251:46;;;-1:-1:-1;;;20251:46:0;;-1:-1:-1;;;;;20251:46:0;;;;;;;;;;;;;;;;20264:6;;;;;20251:30;;:46;;;;;;;;;;;;;;20264:6;20251:46;;;2:2:-1;;;;27:1;24;17:12;2:2;20251:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20251:46:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;20251:46:0;20229:149;;;;-1:-1:-1;;;20229:149:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20457:7;;20390:16;;;;20428:53;;-1:-1:-1;;;;;20457:7:0;20466:6;20474;20428:28;:53::i;:::-;20389:92;;;;20496:8;20508:1;20496:13;:30;;;;-1:-1:-1;20513:13:0;;20496:30;20492:823;;;20565:14;;-1:-1:-1;20581:14:0;;-1:-1:-1;20492:823:0;;;20629:22;20654:58;20677:14;20693:8;20703;20654:22;:58::i;:::-;20629:83;;20749:14;20731;:32;20727:577;;20810:10;20792:14;:28;;20784:79;;;;-1:-1:-1;;;20784:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20904:14;;-1:-1:-1;20920:14:0;-1:-1:-1;20920:14:0;20727:577;;;20976:22;21001:58;21024:14;21040:8;21050;21001:22;:58::i;:::-;20976:83;;21103:14;21085;:32;;21078:40;;;;21163:10;21145:14;:28;;21137:79;;;;-1:-1:-1;;;21137:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21257:14;-1:-1:-1;21273:14:0;;-1:-1:-1;20727:577:0;20492:823;;21339:7;;;21374:46;;;-1:-1:-1;;;21374:46:0;;-1:-1:-1;;;;;21374:46:0;;;;;;;;;;;;;;;;;;;21339:7;;;;;21325:36;;21362:10;;21339:7;;21374:30;;:46;;;;;;;;;;;;;;21339:7;21374:46;;;2:2:-1;;;;27:1;24;17:12;2:2;21374:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21374:46:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;21374:46:0;21325:96;;;-1:-1:-1;;;;;;21325:96:0;;;;;;;-1:-1:-1;;;;;21325:96:0;;;;;;;;;;;;;;;;;;;;;21374:46;;21325:96;;;;;;;-1:-1:-1;21325:96:0;;;;2:2:-1;;;;27:1;24;17:12;2:2;21325:96:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21325:96:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;19706:1723:0;;;;-1:-1:-1;19706:1723:0;;-1:-1:-1;;;;;;;;19706:1723:0:o;10229:402::-;10454:51;;;-1:-1:-1;;;;;10454:51:0;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;10454:51:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;10443:63:0;;;;10408:12;;10422:17;;10443:10;;;;10454:51;10443:63;;;25:18:-1;10443:63:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;10443:63:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;10407:99:0;;;;10525:7;:57;;;;-1:-1:-1;10537:11:0;;:16;;:44;;;10568:4;10557:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;10557:24:0;10537:44;10517:106;;;;-1:-1:-1;;;10517:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33409:183;33498:4;;33492:32;;;-1:-1:-1;;;33492:32:0;;-1:-1:-1;;;;;33492:32:0;;;;;;;;;;;;;;;33498:4;;;;;33492:20;;:32;;;;;;;;;;;;;;33498:4;;33492:32;;;2:2:-1;;;;27:1;24;17:12;2:2;33492:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33492:32:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33492:32:0;33485:40;;;;33571:4;;33536:48;;33560:4;;33567:2;;-1:-1:-1;;;;;33571:4:0;33577:6;33536:15;:48::i;:::-;33409:183;;:::o;8751:453::-;8844:13;8890:1;8878:9;:13;8870:70;;;;-1:-1:-1;;;8870:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8971:1;8959:9;:13;:31;;;;;8989:1;8976:10;:14;8959:31;8951:84;;;;-1:-1:-1;;;8951:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9046:14;9063:24;:9;9077;9063:24;:13;:24;:::i;:::-;9046:41;-1:-1:-1;9098:16:0;9117:25;:10;9132:9;9117:25;:14;:25;:::i;:::-;9098:44;;9164:32;9194:1;9177:11;9165:9;:23;;;;;;;9164:32;:29;:32;:::i;6414:349::-;6489:14;6505;6550:6;-1:-1:-1;;;;;6540:16:0;:6;-1:-1:-1;;;;;6540:16:0;;;6532:66;;;;-1:-1:-1;;;6532:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6637:6;-1:-1:-1;;;;;6628:15:0;:6;-1:-1:-1;;;;;6628:15:0;;:53;;6666:6;6674;6628:53;;;6647:6;6655;6628:53;6609:72;;-1:-1:-1;6609:72:0;-1:-1:-1;;;;;;6700:20:0;;6692:63;;;;;-1:-1:-1;;;6692:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;7300:387;7393:13;7408;7435:14;7454:26;7465:6;7473;7454:10;:26::i;:::-;7434:46;;;7492:13;7507;7536:32;7544:7;7553:6;7561;7536:7;:32::i;:::-;-1:-1:-1;;;;;7525:56:0;;:58;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;7525:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7525:58:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;7525:58:0;;;;;;;7491:92;;;;;-1:-1:-1;7491:92:0;;-1:-1:-1;;;;;;7617:16:0;;;;;;;:62;;7660:8;7670;7617:62;;;7637:8;7647;7617:62;7594:85;;;;-1:-1:-1;7300:387:0;-1:-1:-1;;;;;;;7300:387:0:o;11802:181::-;11860:7;11892:5;;;11916:6;;;;11908:46;;;;;-1:-1:-1;;;11908:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;12705:192;12791:7;12827:12;12819:6;;;;12811:29;;;;-1:-1:-1;;;12811:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;12811:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12863:5:0;;;12705:192::o;7968:321::-;8050:12;8093:1;8083:7;:11;8075:61;;;;-1:-1:-1;;;8075:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8166:1;8155:8;:12;:28;;;;;8182:1;8171:8;:12;8155:28;8147:81;;;;-1:-1:-1;;;8147:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8273:8;8249:21;:7;8261:8;8249:21;:11;:21;:::i;:::-;:32;;;;;;;7968:321;-1:-1:-1;;;;7968:321:0:o

Swarm Source

ipfs://8be4c1e4adf8dc27ab41ccd74e3b7ead794af6205013046ff5e8e7765cba1f99
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.