Contract 0xf6fa9ea1f64f1bbfa8d71f7f43faf6d45520bfac 1

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xf1dd5f20f551b37ee7f353df9c8ca94414e65e2dd6d093bcf336601008b1faebSwap Exact Token...203987722021-10-20 1:34:378 days 19 hrs ago0x1eadf5cac8e5751d8420775875d30985d9390312 IN  Firebird Finance: Router0 MATIC0.00220707
0x32eee99f24c8469a0edb24251247b2b07eee6c6e58986e73c3deaaefb5321a4bSwap Exact Token...203987172021-10-20 1:32:438 days 19 hrs ago0x1eadf5cac8e5751d8420775875d30985d9390312 IN  Firebird Finance: Router0 MATIC0.00220707
0xfbd9099949344c9aa705311e11ee790b89ede7ffce065435368e2fcec50ffa1aSwap Exact Token...203986662021-10-20 1:31:018 days 19 hrs ago0x1eadf5cac8e5751d8420775875d30985d9390312 IN  Firebird Finance: Router0 MATIC0.00220671
0x0e9454703bf4acd1b52a9f58cfe94ac9a30a2192c3e80bd55bf1d1e2a7ae55fcSwap Exact Token...203986602021-10-20 1:30:498 days 19 hrs ago0x1eadf5cac8e5751d8420775875d30985d9390312 IN  Firebird Finance: Router0 MATIC0.001755
0xace779dc035fbd0028a5a71d61d881c1e6e9a8d3a461fd2f39306d7289579f97Swap Exact Token...203984702021-10-20 1:17:538 days 20 hrs ago0x1eadf5cac8e5751d8420775875d30985d9390312 IN  Firebird Finance: Router0 MATIC0.001755
0x56f791016b257b2ceb665da7722e97447b993bd74f7c150b385cc2ef99d54a0bSwap Exact Token...201935792021-10-14 2:00:3314 days 19 hrs ago0xe11cbda91f5ccfaa91b35e6bb10e1f65aee294da IN  Firebird Finance: Router0 MATIC0.004912425
0xa48fc258eb6a24699dd48a0b17839ec4a890449cf36548520844f07264c9a831Swap Exact Token...201925872021-10-14 1:20:0114 days 20 hrs ago0xe11cbda91f5ccfaa91b35e6bb10e1f65aee294da IN  Firebird Finance: Router0 MATIC0.004912425
0xccc2c74e2ba17395be001677164a3f511e0bb5b0960010647b0c7bf0773709daSwap Exact Token...201915842021-10-14 0:42:2114 days 20 hrs ago0xe11cbda91f5ccfaa91b35e6bb10e1f65aee294da IN  Firebird Finance: Router0 MATIC0.004912425
0xa36f20326cb1109dabce28ea221355eb0abb351f6d3e0ef286e15a15d918c410Swap Exact Token...201905942021-10-13 23:56:2814 days 21 hrs ago0xe11cbda91f5ccfaa91b35e6bb10e1f65aee294da IN  Firebird Finance: Router0 MATIC0.004912425
0x7e52b9f927a45deb70da3f812a25f2456bb5866419972df3623c52f538b86199Swap Exact Token...201895982021-10-13 23:15:4814 days 22 hrs ago0xe11cbda91f5ccfaa91b35e6bb10e1f65aee294da IN  Firebird Finance: Router0 MATIC0.004912425
0x1f340bdef1a001719a7ed21186d29bb55ba74af7cf180431e2e5be48b0d9f20fSwap Exact Token...201886032021-10-13 22:36:1314 days 22 hrs ago0xe11cbda91f5ccfaa91b35e6bb10e1f65aee294da IN  Firebird Finance: Router0 MATIC0.004912425
0x9be34a5c616c574a3e483673595fb8417a16c014d05b92800b062206328aa502Swap Exact Token...201876022021-10-13 21:53:1914 days 23 hrs ago0xe11cbda91f5ccfaa91b35e6bb10e1f65aee294da IN  Firebird Finance: Router0 MATIC0.004912425
0xd883ae215462b0f464439bdd1e660ac2dfb41f5bf8fdb8f01d4d5e02e71fd37aSwap Exact Token...201866102021-10-13 21:06:3415 days 22 mins ago0xe11cbda91f5ccfaa91b35e6bb10e1f65aee294da IN  Firebird Finance: Router0 MATIC0.004912425
0x0145932d575383e944abd7c57fa880a476c85bcc699188d20026ccbef25c5c65Swap Exact Token...201856152021-10-13 20:29:2415 days 59 mins ago0xe11cbda91f5ccfaa91b35e6bb10e1f65aee294da IN  Firebird Finance: Router0 MATIC0.004912425
0x4e4b96f16deb39a66bb5fea5e9c3b6266e4732da7f8ab1a2e0e93a82067972b1Swap Exact Token...201846162021-10-13 19:55:0015 days 1 hr ago0xe11cbda91f5ccfaa91b35e6bb10e1f65aee294da IN  Firebird Finance: Router0 MATIC0.004912425
0x44e92a051dc03be5f66aa7d6242071ff80b53434efc6a0455e04a2696544787cSwap Exact Token...201836182021-10-13 19:17:5215 days 2 hrs ago0xe11cbda91f5ccfaa91b35e6bb10e1f65aee294da IN  Firebird Finance: Router0 MATIC0.004912005
0x1a932b77a9275344cf162f39423ddeaecf81a7781fa09ad6e2b2984348c24909Swap Exact Token...201826212021-10-13 18:39:1815 days 2 hrs ago0xe11cbda91f5ccfaa91b35e6bb10e1f65aee294da IN  Firebird Finance: Router0 MATIC0.004912005
0xd32d15ef9bdacd6a295e59e92657f32f2da09be0a8d5dd3c0dddd500d99ac1aaSwap Exact Token...201816242021-10-13 18:00:3015 days 3 hrs ago0xe11cbda91f5ccfaa91b35e6bb10e1f65aee294da IN  Firebird Finance: Router0 MATIC0.004912425
0xfa89992ff0f609c6e2da4dad2f9b40ad9f8c20a18734de408356bf39d86d4d4fSwap Exact Token...201806272021-10-13 17:21:5215 days 4 hrs ago0xe11cbda91f5ccfaa91b35e6bb10e1f65aee294da IN  Firebird Finance: Router0 MATIC0.004912425
0xd3b83834d7c01b1303b8ad123d21b50b1a7082e983905e75517ca73343b7dc90Swap Exact Token...201796322021-10-13 16:46:5815 days 4 hrs ago0xe11cbda91f5ccfaa91b35e6bb10e1f65aee294da IN  Firebird Finance: Router0 MATIC0.004912425
0x17f28597c744e430df5458893cce09fe59075d86dd3cbcd42a00fe18492107b7Swap Exact Token...201786292021-10-13 16:08:1615 days 5 hrs ago0xe11cbda91f5ccfaa91b35e6bb10e1f65aee294da IN  Firebird Finance: Router0 MATIC0.004912425
0xe28f14fd421dab0ff198f391f7b4b2b6311490bf7806ae0c6cd6a13756799dc7Swap Exact Token...201776352021-10-13 15:25:1915 days 6 hrs ago0xe11cbda91f5ccfaa91b35e6bb10e1f65aee294da IN  Firebird Finance: Router0 MATIC0.004912425
0xa9eca7ba31ad1334d32c816f410aac1afb61bc8bdd9d61cc4e8521c43c029eeeSwap Exact Token...201766352021-10-13 14:44:3115 days 6 hrs ago0xe11cbda91f5ccfaa91b35e6bb10e1f65aee294da IN  Firebird Finance: Router0 MATIC0.004912425
0xf74a2ebf657fea66158a56754d141e2619488c99c8975119167b80169b29a34dSwap Exact Token...201756352021-10-13 14:05:5315 days 7 hrs ago0xe11cbda91f5ccfaa91b35e6bb10e1f65aee294da IN  Firebird Finance: Router0 MATIC0.004912425
0xab12b4d477ca6fd549e7435257e529406254c349dd3888c382dc63779e3efca8Swap Exact Token...201746492021-10-13 13:26:2515 days 8 hrs ago0xe11cbda91f5ccfaa91b35e6bb10e1f65aee294da IN  Firebird Finance: Router0 MATIC0.004912425
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x5cac70b6fdb81960ac6466e4dfa75102b0c90d13e06241a198a9182c1ad43020207171232021-10-28 21:26:442 mins ago Firebird Finance: Router0x277818610bea65333bab37edb75885b103fb9e4b0.000170604079785206 MATIC
0x5cac70b6fdb81960ac6466e4dfa75102b0c90d13e06241a198a9182c1ad43020207171232021-10-28 21:26:442 mins ago Polygon: WMATIC Token Firebird Finance: Router0.000170604079785206 MATIC
0x5cac70b6fdb81960ac6466e4dfa75102b0c90d13e06241a198a9182c1ad43020207171232021-10-28 21:26:442 mins ago Firebird Finance: Router0x277818610bea65333bab37edb75885b103fb9e4b0.007852607516866694 MATIC
0x5cac70b6fdb81960ac6466e4dfa75102b0c90d13e06241a198a9182c1ad43020207171232021-10-28 21:26:442 mins ago Polygon: WMATIC Token Firebird Finance: Router0.007852607516866694 MATIC
0x5cac70b6fdb81960ac6466e4dfa75102b0c90d13e06241a198a9182c1ad43020207171232021-10-28 21:26:442 mins ago Firebird Finance: Router0x277818610bea65333bab37edb75885b103fb9e4b0.005054026256767256 MATIC
0x5cac70b6fdb81960ac6466e4dfa75102b0c90d13e06241a198a9182c1ad43020207171232021-10-28 21:26:442 mins ago Polygon: WMATIC Token Firebird Finance: Router0.005054026256767256 MATIC
0x5cac70b6fdb81960ac6466e4dfa75102b0c90d13e06241a198a9182c1ad43020207171232021-10-28 21:26:442 mins ago Firebird Finance: Router0x277818610bea65333bab37edb75885b103fb9e4b0.042677183164835253 MATIC
0x5cac70b6fdb81960ac6466e4dfa75102b0c90d13e06241a198a9182c1ad43020207171232021-10-28 21:26:442 mins ago Polygon: WMATIC Token Firebird Finance: Router0.042677183164835253 MATIC
0x5cac70b6fdb81960ac6466e4dfa75102b0c90d13e06241a198a9182c1ad43020207171232021-10-28 21:26:442 mins ago Firebird Finance: Router0x277818610bea65333bab37edb75885b103fb9e4b0.032303520939424989 MATIC
0x5cac70b6fdb81960ac6466e4dfa75102b0c90d13e06241a198a9182c1ad43020207171232021-10-28 21:26:442 mins ago Polygon: WMATIC Token Firebird Finance: Router0.032303520939424989 MATIC
0x5cac70b6fdb81960ac6466e4dfa75102b0c90d13e06241a198a9182c1ad43020207171232021-10-28 21:26:442 mins ago Firebird Finance: Router0x277818610bea65333bab37edb75885b103fb9e4b0.029761393708292084 MATIC
0x5cac70b6fdb81960ac6466e4dfa75102b0c90d13e06241a198a9182c1ad43020207171232021-10-28 21:26:442 mins ago Polygon: WMATIC Token Firebird Finance: Router0.029761393708292084 MATIC
0x5cac70b6fdb81960ac6466e4dfa75102b0c90d13e06241a198a9182c1ad43020207171232021-10-28 21:26:442 mins ago Firebird Finance: Router0x277818610bea65333bab37edb75885b103fb9e4b0.003252080816784776 MATIC
0x5cac70b6fdb81960ac6466e4dfa75102b0c90d13e06241a198a9182c1ad43020207171232021-10-28 21:26:442 mins ago Polygon: WMATIC Token Firebird Finance: Router0.003252080816784776 MATIC
0xa7a123f3f08547d882b802cb12c84674adb1fc1b0aa2c8fff2e2670bd20f68c1207170712021-10-28 21:24:204 mins ago Firebird Finance: Router0x1200048dc4997141f9c61fb29dd5de7cecc0dc310.001182188492384792 MATIC
0xa7a123f3f08547d882b802cb12c84674adb1fc1b0aa2c8fff2e2670bd20f68c1207170712021-10-28 21:24:204 mins ago Polygon: WMATIC Token Firebird Finance: Router0.001182188492384792 MATIC
0x4100f7b7f9fdd82ae64bfe298f7e212f8f80cc9262fb22c57b355c2e4ccbc532207170662021-10-28 21:24:104 mins ago Firebird Finance: Router0x1200048dc4997141f9c61fb29dd5de7cecc0dc310.001361806892328213 MATIC
0x4100f7b7f9fdd82ae64bfe298f7e212f8f80cc9262fb22c57b355c2e4ccbc532207170662021-10-28 21:24:104 mins ago Polygon: WMATIC Token Firebird Finance: Router0.001361806892328213 MATIC
0xb4f7cb8922448278ec8b0e446a4edd3f94d3e8ce68ce9060bab8a310feeb271f207168432021-10-28 21:14:2014 mins ago Firebird Finance: Router0x1200048dc4997141f9c61fb29dd5de7cecc0dc310.001196595490303058 MATIC
0xb4f7cb8922448278ec8b0e446a4edd3f94d3e8ce68ce9060bab8a310feeb271f207168432021-10-28 21:14:2014 mins ago Polygon: WMATIC Token Firebird Finance: Router0.001196595490303058 MATIC
0x115e41a636176be4328a6fb5a9729e50e3269d26aa17039e070f533450ed11ff207168392021-10-28 21:14:1214 mins ago Firebird Finance: Router0x1200048dc4997141f9c61fb29dd5de7cecc0dc310.001386299136420736 MATIC
0x115e41a636176be4328a6fb5a9729e50e3269d26aa17039e070f533450ed11ff207168392021-10-28 21:14:1214 mins ago Polygon: WMATIC Token Firebird Finance: Router0.001386299136420736 MATIC
0x2db70a6a3ff1cf4725a664b47395ad6f0ba31956809073b15b0d2afa3fa5b688207166182021-10-28 21:06:3822 mins ago Firebird Finance: Router0x277818610bea65333bab37edb75885b103fb9e4b0.000172674274967622 MATIC
0x2db70a6a3ff1cf4725a664b47395ad6f0ba31956809073b15b0d2afa3fa5b688207166182021-10-28 21:06:3822 mins ago Polygon: WMATIC Token Firebird Finance: Router0.000172674274967622 MATIC
0x2db70a6a3ff1cf4725a664b47395ad6f0ba31956809073b15b0d2afa3fa5b688207166182021-10-28 21:06:3822 mins ago Firebird Finance: Router0x277818610bea65333bab37edb75885b103fb9e4b0.000047667828105731 MATIC
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FireBirdRouter

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2021-06-09
*/

pragma solidity >=0.7.6;
pragma abicoder v2;


interface IFireBirdFactory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint32 tokenWeight0, uint32 swapFee, uint);
    function feeTo() external view returns (address);
    function formula() external view returns (address);
    function protocolFee() external view returns (uint);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB, uint32 tokenWeightA, uint32 swapFee) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function isPair(address) external view returns (bool);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB, uint32 tokenWeightA, uint32 swapFee) external returns (address pair);
    function getWeightsAndSwapFee(address pair) external view returns (uint32 tokenWeight0, uint32 tokenWeight1, uint32 swapFee);

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

/*
    Bancor Formula interface
*/
interface IFireBirdFormula {

    function getReserveAndWeights(address pair, address tokenA) external view returns (
        address tokenB,
        uint reserveA,
        uint reserveB,
        uint32 tokenWeightA,
        uint32 tokenWeightB,
        uint32 swapFee
    );

    function getFactoryReserveAndWeights(address factory, address pair, address tokenA) external view returns (
        address tokenB,
        uint reserveA,
        uint reserveB,
        uint32 tokenWeightA,
        uint32 tokenWeightB,
        uint32 swapFee
    );

    function getAmountIn(
        uint amountOut,
        uint reserveIn, uint reserveOut,
        uint32 tokenWeightIn, uint32 tokenWeightOut,
        uint32 swapFee
    ) external view returns (uint amountIn);

    function getPairAmountIn(address pair, address tokenIn, uint amountOut) external view returns (uint amountIn);

    function getAmountOut(
        uint amountIn,
        uint reserveIn, uint reserveOut,
        uint32 tokenWeightIn, uint32 tokenWeightOut,
        uint32 swapFee
    ) external view returns (uint amountOut);

    function getPairAmountOut(address pair, address tokenIn, uint amountIn) external view returns (uint amountOut);

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

    function getFactoryAmountsIn(
        address factory,
        address tokenIn,
        address tokenOut,
        uint amountOut,
        address[] calldata path
    ) external view returns (uint[] memory amounts);

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

    function getFactoryAmountsOut(
        address factory,
        address tokenIn,
        address tokenOut,
        uint amountIn,
        address[] calldata path
    ) external view returns (uint[] memory amounts);

    function ensureConstantValue(uint reserve0, uint reserve1, uint balance0Adjusted, uint balance1Adjusted, uint32 tokenWeight0) external view returns (bool);
    function getReserves(address pair, address tokenA, address tokenB) external view returns (uint reserveA, uint reserveB);
    function getOtherToken(address pair, address tokenA) external view returns (address tokenB);
    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function sortTokens(address tokenA, address tokenB) external pure returns (address token0, address token1);
    function mintLiquidityFee(
        uint totalLiquidity,
        uint112 reserve0,
        uint112  reserve1,
        uint32 tokenWeight0,
        uint32 tokenWeight1,
        uint112  collectedFee0,
        uint112 collectedFee1) external view returns (uint amount);
}

interface IFireBirdPair {
    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 pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

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

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

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


    event PaidProtocolFee(uint112 collectedFee0, uint112 collectedFee1);
    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 getCollectedFees() external view returns (uint112 _collectedFee0, uint112 _collectedFee1);
    function getTokenWeights() external view returns (uint32 tokenWeight0, uint32 tokenWeight1);
    function getSwapFee() external view returns (uint32);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);

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

    function initialize(address, address, uint32, uint32) external;
}

// 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');
    }
}

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

interface IFireBirdRouter {
    event Exchange(
        address pair,
        uint amountOut,
        address output
    );
    struct Swap {
        address pool;
        address tokenIn;
        address tokenOut;
        uint swapAmount; // tokenInAmount / tokenOutAmount
        uint limitReturnAmount; // minAmountOut / maxAmountIn
        uint maxPrice;
    }
    function factory() external view returns (address);
    function formula() external view returns (address);

    function WETH() external view returns (address);

    function addLiquidity(
        address pair,
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);

    function addLiquidityETH(
        address pair,
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);


    function swapExactTokensForTokens(
        address tokenIn,
        address tokenOut,
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapTokensForExactTokens(
        address tokenIn,
        address tokenOut,
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapExactETHForTokens(address tokenOut, uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    payable
    returns (uint[] memory amounts);

    function swapTokensForExactETH(address tokenIn, uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
    external
    returns (uint[] memory amounts);

    function swapExactTokensForETH(address tokenIn, uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    returns (uint[] memory amounts);

    function swapETHForExactTokens(address tokenOut, uint amountOut, address[] calldata path, address to, uint deadline)
    external
    payable
    returns (uint[] memory amounts);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        address tokenIn,
        address tokenOut,
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        address tokenOut,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        address tokenIn,
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;


    function multihopBatchSwapExactIn(
        Swap[][] memory swapSequences,
        address tokenIn,
        address tokenOut,
        uint totalAmountIn,
        uint minTotalAmountOut,
        uint deadline
    )
    external payable returns (uint totalAmountOut);
    function multihopBatchSwapExactOut(
        Swap[][] memory swapSequences,
        address tokenIn,
        address tokenOut,
        uint maxTotalAmountIn,
        uint deadline
    ) external payable returns (uint totalAmountIn);

    function createPair( address tokenA, address tokenB,uint amountA,uint amountB, uint32 tokenWeightA, uint32 swapFee, address to) external returns (uint liquidity);
    function createPairETH( address token, uint amountToken, uint32 tokenWeight, uint32 swapFee, address to) external payable returns (uint liquidity);

    function removeLiquidity(
        address pair,
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);

    function removeLiquidityETH(
        address pair,
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);

    function removeLiquidityWithPermit(
        address pair,
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);

    function removeLiquidityETHWithPermit(
        address pair,
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);


    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address pair,
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address pair,
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);
}

// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)
library SafeMath {
    function add(uint x, uint y) internal pure returns (uint z) {
        require((z = x + y) >= x, 'ds-math-add-overflow');
    }

    function sub(uint x, uint y) internal pure returns (uint z) {
        require((z = x - y) <= x, 'ds-math-sub-underflow');
    }

    function mul(uint x, uint y) internal pure returns (uint z) {
        require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');
    }
    function div(uint a, uint b) internal pure returns (uint c) {
        require(b > 0, 'ds-math-division-by-zero');
        c = a / b;
    }
}

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

contract FireBirdRouter is IFireBirdRouter {
    using SafeMath for uint;
    address public immutable override factory;
    address public immutable override formula;
    address public immutable override WETH;
    address private constant ETH_ADDRESS = address(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);

    modifier ensure(uint256 deadline) {
        require(deadline >= block.timestamp, 'Router: EXPIRED');
        _;
    }
    constructor(address _factory, address _WETH) public {
        factory = _factory;
        formula = IFireBirdFactory(_factory).formula();
        WETH = _WETH;
    }

    receive() external payable {
        assert(msg.sender == WETH);
        // only accept ETH via fallback from the WETH contract
    }

    // **** ADD LIQUIDITY ****
    function _addLiquidity(
        address pair,
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin
    ) internal virtual returns (uint amountA, uint amountB) {
        (uint reserveA, uint reserveB) = IFireBirdFormula(formula).getReserves(pair, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = IFireBirdFormula(formula).quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'Router: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = IFireBirdFormula(formula).quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'Router: INSUFFICIENT_A_AMOUNT');
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }

    function _addLiquidityToken(
        address pair,
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin
    ) internal returns (uint amountA, uint amountB) {
        (amountA, amountB) = _addLiquidity(pair, tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
    }
    function createPair( address tokenA, address tokenB,uint amountA,uint amountB, uint32 tokenWeightA, uint32 swapFee, address to) public virtual override returns (uint liquidity) {
        address pair = IFireBirdFactory(factory).createPair(tokenA, tokenB, tokenWeightA, swapFee);
        _addLiquidityToken(pair, tokenA, tokenB, amountA, amountB, 0, 0);
        liquidity = IFireBirdPair(pair).mint(to);
    }
    function addLiquidity(
        address pair,
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
        (amountA,  amountB) = _addLiquidityToken(pair, tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
        liquidity = IFireBirdPair(pair).mint(to);
    }

    function _addLiquidityETH(
        address pair,
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to
    ) internal returns (uint amountToken, uint amountETH, uint liquidity) {
        (amountToken, amountETH) = _addLiquidity(
            pair,
            token,
            WETH,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountETHMin
        );
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        transferETHTo(amountETH, pair);
        liquidity = IFireBirdPair(pair).mint(to);
        // refund dust eth, if any
        if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
    }
    function createPairETH( address token, uint amountToken, uint32 tokenWeight, uint32 swapFee, address to) public virtual override payable returns (uint liquidity) {
        address pair = IFireBirdFactory(factory).createPair(token, WETH, tokenWeight, swapFee);
        (,,liquidity) = _addLiquidityETH(pair, token, amountToken, 0, 0, to);
    }
    function addLiquidityETH(
        address pair,
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) {
        (amountToken, amountETH, liquidity) = _addLiquidityETH(pair, token, amountTokenDesired, amountTokenMin, amountETHMin, to);
    }

    // **** SWAP ****
    // requires the initial amount to have already been sent to the first pair
    function _swap(address tokenIn, uint[] memory amounts, address[] memory path, address _to) internal virtual {
        address input = tokenIn;
        for (uint i = 0; i < path.length; i++) {
            IFireBirdPair pairV2 = IFireBirdPair(path[i]);
            address token0 = pairV2.token0();
            uint amountOut = amounts[i + 1];
            (uint amount0Out, uint amount1Out, address output) = input == token0 ? (uint(0), amountOut, pairV2.token1()) : (amountOut, uint(0), token0);
            address to = i < path.length - 1 ? path[i + 1] : _to;
            pairV2.swap(
                amount0Out, amount1Out, to, new bytes(0)
            );
            emit Exchange(address(pairV2), amountOut, output);
            input = output;
        }
    }

    function swapExactTokensForTokens(
        address tokenIn,
        address tokenOut,
        uint amountIn,
        uint amountOutMin,
        address[] memory path,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint[] memory amounts) {
        amounts = _validateAmountOut(tokenIn, tokenOut, amountIn, amountOutMin, path);

        TransferHelper.safeTransferFrom(
            tokenIn, msg.sender, path[0], amounts[0]
        );
        _swap(tokenIn, amounts, path, to);
    }

    function swapTokensForExactTokens(
        address tokenIn,
        address tokenOut,
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        amounts = _validateAmountIn(tokenIn, tokenOut, amountOut, amountInMax, path);

        TransferHelper.safeTransferFrom(
            tokenIn, msg.sender, path[0], amounts[0]
        );
        _swap(tokenIn, amounts, path, to);
    }

    function swapExactETHForTokens(address tokenOut, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        amounts = _validateAmountOut(WETH, tokenOut, msg.value, amountOutMin, path);

        transferETHTo(amounts[0], path[0]);
        _swap(WETH, amounts, path, to);
    }
    function swapTokensForExactETH(address tokenIn, uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        amounts = _validateAmountIn(tokenIn, WETH, amountOut, amountInMax, path);

        TransferHelper.safeTransferFrom(
            tokenIn, msg.sender, path[0], amounts[0]
        );
        _swap(tokenIn, amounts, path, address(this));
        transferAll(ETH_ADDRESS, to, amounts[amounts.length - 1]);
    }
    function swapExactTokensForETH(address tokenIn, uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        amounts = _validateAmountOut(tokenIn, WETH, amountIn, amountOutMin, path);

        TransferHelper.safeTransferFrom(
            tokenIn, msg.sender, path[0], amounts[0]
        );
        _swap(tokenIn, amounts, path, address(this));
        transferAll(ETH_ADDRESS, to, amounts[amounts.length - 1]);
    }
    function swapETHForExactTokens(address tokenOut, uint amountOut, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        amounts = _validateAmountIn(WETH, tokenOut, amountOut, msg.value, path);

        transferETHTo(amounts[0], path[0]);
        _swap(WETH, amounts, path, to);
        // refund dust eth, if any
        if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
    }

    // **** SWAP (supporting fee-on-transfer tokens) ****
    // requires the initial amount to have already been sent to the first pair
    function _swapSupportingFeeOnTransferTokens(address tokenIn, address[] memory path, address _to) internal virtual {
        address input = tokenIn;
        for (uint i; i < path.length; i++) {
            IFireBirdPair pair = IFireBirdPair(path[i]);

            uint amountInput;
            uint amountOutput;
            address currentOutput;
            {
                (address output, uint reserveInput, uint reserveOutput, uint32 tokenWeightInput, uint32 tokenWeightOutput, uint32 swapFee) = IFireBirdFormula(formula).getFactoryReserveAndWeights(factory, address(pair), input);
                amountInput = IERC20(input).balanceOf(address(pair)).sub(reserveInput);
                amountOutput = IFireBirdFormula(formula).getAmountOut(amountInput, reserveInput, reserveOutput, tokenWeightInput, tokenWeightOutput, swapFee);
                currentOutput = output;
            }
            (uint amount0Out, uint amount1Out) = input == pair.token0() ? (uint(0), amountOutput) : (amountOutput, uint(0));
            address to = i < path.length - 1 ? path[i + 1] : _to;
            pair.swap(amount0Out, amount1Out, to, new bytes(0));
            emit Exchange(address(pair), amountOutput, currentOutput);
            input = currentOutput;
        }
    }
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        address tokenIn,
        address tokenOut,
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) {
        TransferHelper.safeTransferFrom(
            tokenIn, msg.sender, path[0], amountIn
        );
        uint balanceBefore = IERC20(tokenOut).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(tokenIn, path, to);
        require(
            IERC20(tokenOut).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'Router: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        address tokenOut,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        payable
        ensure(deadline)
    {
//            require(path[0] == WETH, 'Router: INVALID_PATH');
        uint amountIn = msg.value;
        transferETHTo(amountIn, path[0]);
        uint balanceBefore = IERC20(tokenOut).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(WETH, path, to);
        require(
            IERC20(tokenOut).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'Router: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        address tokenIn,
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        ensure(deadline)
    {
        TransferHelper.safeTransferFrom(
            tokenIn, msg.sender, path[0], amountIn
        );
        _swapSupportingFeeOnTransferTokens(tokenIn, path, address(this));
        uint amountOut = IERC20(WETH).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'Router: INSUFFICIENT_OUTPUT_AMOUNT');
        transferAll(ETH_ADDRESS, to, amountOut);
    }
    function multihopBatchSwapExactIn(
        Swap[][] memory swapSequences,
        address tokenIn,
        address tokenOut,
        uint totalAmountIn,
        uint minTotalAmountOut,
        uint deadline
    ) public payable override virtual ensure(deadline) returns (uint totalAmountOut) {
        transferFromAll(tokenIn, totalAmountIn);
        uint balanceBefore;
        if (!isETH(tokenOut)) {
            balanceBefore = IERC20(tokenOut).balanceOf(msg.sender);
        }

        for (uint i = 0; i < swapSequences.length; i++) {
            uint tokenAmountOut;
            for (uint k = 0; k < swapSequences[i].length; k++) {
                Swap memory swap = swapSequences[i][k];
                if (k > 0) {
                    // Makes sure that on the second swap the output of the first was used
                    // so there is not intermediate token leftover
                    swap.swapAmount = tokenAmountOut;
                }
                tokenAmountOut = _swapSingleSupportFeeOnTransferTokens(swap.tokenIn, swap.tokenOut, swap.pool, swap.swapAmount, swap.limitReturnAmount);
            }

            // This takes the amountOut of the last swap
            totalAmountOut = tokenAmountOut.add(totalAmountOut);
        }

        transferAll(tokenOut, msg.sender, totalAmountOut);
        transferAll(tokenIn, msg.sender, getBalance(tokenIn));

        if (isETH(tokenOut)) {
            require(totalAmountOut >= minTotalAmountOut, "ERR_LIMIT_OUT");
        } else {
            require(IERC20(tokenOut).balanceOf(msg.sender).sub(balanceBefore) >= minTotalAmountOut, '<minTotalAmountOut');
        }
    }

    function multihopBatchSwapExactOut(
        Swap[][] memory swapSequences,
        address tokenIn,
        address tokenOut,
        uint maxTotalAmountIn,
        uint deadline
    ) public payable override virtual ensure(deadline) returns (uint totalAmountIn) {
        transferFromAll(tokenIn, maxTotalAmountIn);

        for (uint i = 0; i < swapSequences.length; i++) {
            uint tokenAmountInFirstSwap;
            // Specific code for a simple swap and a multihop (2 swaps in sequence)
            if (swapSequences[i].length == 1) {
                Swap memory swap = swapSequences[i][0];
                tokenAmountInFirstSwap = _swapSingleMixOut(swap.tokenIn, swap.tokenOut, swap.pool, swap.swapAmount, swap.limitReturnAmount, swap.maxPrice);

            } else {
                // Consider we are swapping A -> B and B -> C. The goal is to buy a given amount
                // of token C. But first we need to buy B with A so we can then buy C with B
                // To get the exact amount of C we then first need to calculate how much B we'll need:
                uint intermediateTokenAmount;
                // This would be token B as described above
                Swap memory secondSwap = swapSequences[i][1];
                {
                    address[] memory paths = new address[](1);
                    paths[0] = secondSwap.pool;
                    uint[] memory amounts = IFireBirdFormula(formula).getFactoryAmountsIn(factory, secondSwap.tokenIn, secondSwap.tokenOut, secondSwap.swapAmount, paths);
                    intermediateTokenAmount = amounts[0];
                    require(intermediateTokenAmount <= secondSwap.limitReturnAmount, 'Router: EXCESSIVE_INPUT_AMOUNT');
                }

                //// Buy intermediateTokenAmount of token B with A in the first pool
                Swap memory firstSwap = swapSequences[i][0];
                tokenAmountInFirstSwap = _swapSingleMixOut(firstSwap.tokenIn, firstSwap.tokenOut, firstSwap.pool, intermediateTokenAmount, firstSwap.limitReturnAmount, firstSwap.maxPrice);

                //// Buy the final amount of token C desired
                _swapSingle(secondSwap.tokenIn, secondSwap.pool, intermediateTokenAmount, secondSwap.swapAmount);
            }

            totalAmountIn = tokenAmountInFirstSwap.add(totalAmountIn);
        }

        require(totalAmountIn <= maxTotalAmountIn, "ERR_LIMIT_IN");

        transferAll(tokenOut, msg.sender, getBalance(tokenOut));
        transferAll(tokenIn, msg.sender, getBalance(tokenIn));
    }

    function transferFromAll(address token, uint amount) internal returns (bool) {
        if (isETH(token)) {
            IWETH(WETH).deposit{value : msg.value}();
        } else {
            TransferHelper.safeTransferFrom(token, msg.sender, address(this), amount);
        }
        return true;
    }

    function getBalance(address token) internal view returns (uint) {
        if (isETH(token)) {
            return IWETH(WETH).balanceOf(address(this));
        } else {
            return IERC20(token).balanceOf(address(this));
        }
    }

    function _swapSingleMixOut(address tokenIn, address tokenOut, address pool, uint swapAmount, uint limitReturnAmount, uint maxPrice) internal returns (uint tokenAmountIn) {
        address[] memory paths = new address[](1);
        paths[0] = pool;
        uint[] memory amounts = IFireBirdFormula(formula).getFactoryAmountsIn(factory, tokenIn, tokenOut, swapAmount, paths);
        tokenAmountIn = amounts[0];
        require(tokenAmountIn <= limitReturnAmount, 'Router: EXCESSIVE_INPUT_AMOUNT');
        _swapSingle(tokenIn, pool, tokenAmountIn, amounts[1]);
    }

    function _swapSingle(address tokenIn, address pair, uint targetSwapAmount, uint targetOutAmount) internal {
        TransferHelper.safeTransfer(tokenIn, pair, targetSwapAmount);
        IFireBirdPair pairV2 = IFireBirdPair(pair);
        address token0 = pairV2.token0();

        (uint amount0Out, uint amount1Out, address output) = tokenIn == token0 ? (uint(0), targetOutAmount, pairV2.token1()) : (targetOutAmount, uint(0), token0);
        pairV2.swap(amount0Out, amount1Out, address(this), new bytes(0));

        emit Exchange(pair, targetOutAmount, output);
    }

    function _swapSingleSupportFeeOnTransferTokens(address tokenIn, address tokenOut, address pool, uint swapAmount, uint limitReturnAmount) internal returns(uint tokenAmountOut) {
        TransferHelper.safeTransfer(tokenIn, pool, swapAmount);

        uint amountOutput;
        {
            (, uint reserveInput, uint reserveOutput, uint32 tokenWeightInput, uint32 tokenWeightOutput, uint32 swapFee) = IFireBirdFormula(formula).getFactoryReserveAndWeights(factory, pool, tokenIn);
            uint amountInput = IERC20(tokenIn).balanceOf(pool).sub(reserveInput);
            amountOutput = IFireBirdFormula(formula).getAmountOut(amountInput, reserveInput, reserveOutput, tokenWeightInput, tokenWeightOutput, swapFee);
        }
        uint balanceBefore = IERC20(tokenOut).balanceOf(address(this));
        (uint amount0Out, uint amount1Out) = tokenIn == IFireBirdPair(pool).token0() ? (uint(0), amountOutput) : (amountOutput, uint(0));
        IFireBirdPair(pool).swap(amount0Out, amount1Out, address(this), new bytes(0));
        emit Exchange(pool, amountOutput, tokenOut);

        tokenAmountOut = IERC20(tokenOut).balanceOf(address(this)).sub(balanceBefore);
        require(tokenAmountOut >= limitReturnAmount,'Router: INSUFFICIENT_OUTPUT_AMOUNT');
    }

    function _validateAmountOut(
        address tokenIn,
        address tokenOut,
        uint amountIn,
        uint amountOutMin,
        address[] memory path
    ) internal view returns (uint[] memory amounts) {
        amounts = IFireBirdFormula(formula).getFactoryAmountsOut(factory, tokenIn, tokenOut, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'Router: INSUFFICIENT_OUTPUT_AMOUNT');
    }

    function _validateAmountIn(
        address tokenIn,
        address tokenOut,
        uint amountOut,
        uint amountInMax,
        address[] calldata path
    ) internal view returns (uint[] memory amounts) {
        amounts = IFireBirdFormula(formula).getFactoryAmountsIn(factory, tokenIn, tokenOut, amountOut, path);
        require(amounts[0] <= amountInMax, 'Router: EXCESSIVE_INPUT_AMOUNT');
    }

    function transferETHTo(uint amount, address to) internal {
        IWETH(WETH).deposit{value: amount}();
        assert(IWETH(WETH).transfer(to, amount));
    }

    function transferAll(address token, address to, uint amount) internal returns (bool) {
        if (amount == 0) {
            return true;
        }

        if (isETH(token)) {
            IWETH(WETH).withdraw(amount);
            TransferHelper.safeTransferETH(to, amount);
        } else {
            TransferHelper.safeTransfer(token, to, amount);
        }
        return true;
    }

    function isETH(address token) internal pure returns (bool) {
        return (token == ETH_ADDRESS);
    }
// **** REMOVE LIQUIDITY ****
    function _removeLiquidity(
        address pair,
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to
    ) internal  returns (uint amountA, uint amountB) {
        require(IFireBirdFactory(factory).isPair(pair), "Router: Invalid pair");
        IFireBirdPair(pair).transferFrom(msg.sender, pair, liquidity);
        // send liquidity to pair
        (uint amount0, uint amount1) = IFireBirdPair(pair).burn(to);
        (address token0,) = IFireBirdFormula(formula).sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'Router: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'Router: INSUFFICIENT_B_AMOUNT');
    }
    function removeLiquidity(
        address pair,
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountA, uint amountB) {
        (amountA, amountB) = _removeLiquidity(pair, tokenA, tokenB, liquidity, amountAMin, amountBMin, to);
    }

    function removeLiquidityETH(
        address pair,
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountToken, uint amountETH) {
        (amountToken, amountETH) = _removeLiquidity(
            pair,
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this)
        );
        TransferHelper.safeTransfer(token, to, amountToken);
        transferAll(ETH_ADDRESS, to, amountETH);
    }

    function removeLiquidityWithPermit(
        address pair,
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override ensure(deadline) returns (uint amountA, uint amountB) {
        {
            uint value = approveMax ? uint(- 1) : liquidity;
            IFireBirdPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        }
        (amountA, amountB) = _removeLiquidity(pair, tokenA, tokenB, liquidity, amountAMin, amountBMin, to);
    }

    function removeLiquidityETHWithPermit(
        address pair,
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountToken, uint amountETH) {
        uint value = approveMax ? uint(- 1) : liquidity;
        IFireBirdPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountETH) = removeLiquidityETH(pair, token, liquidity, amountTokenMin, amountETHMin, to, deadline);
    }

    // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address pair,
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountETH) {
        (, amountETH) = removeLiquidity(
            pair,
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, IERC20(token).balanceOf(address(this)));
        transferAll(ETH_ADDRESS, to, amountETH);
    }

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address pair,
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountETH) {
        uint value = approveMax ? uint(- 1) : liquidity;
        IFireBirdPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        amountETH = removeLiquidityETHSupportingFeeOnTransferTokens(
            pair, token, liquidity, amountTokenMin, amountETHMin, to, deadline
        );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"},{"indexed":false,"internalType":"address","name":"output","type":"address"}],"name":"Exchange","type":"event"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","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":"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":"pair","type":"address"},{"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":"address","name":"to","type":"address"},{"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":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint32","name":"tokenWeightA","type":"uint32"},{"internalType":"uint32","name":"swapFee","type":"uint32"},{"internalType":"address","name":"to","type":"address"}],"name":"createPair","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint32","name":"tokenWeight","type":"uint32"},{"internalType":"uint32","name":"swapFee","type":"uint32"},{"internalType":"address","name":"to","type":"address"}],"name":"createPairETH","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"formula","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"uint256","name":"limitReturnAmount","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"internalType":"struct IFireBirdRouter.Swap[][]","name":"swapSequences","type":"tuple[][]"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"totalAmountIn","type":"uint256"},{"internalType":"uint256","name":"minTotalAmountOut","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"multihopBatchSwapExactIn","outputs":[{"internalType":"uint256","name":"totalAmountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"uint256","name":"limitReturnAmount","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"internalType":"struct IFireBirdRouter.Swap[][]","name":"swapSequences","type":"tuple[][]"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"maxTotalAmountIn","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"multihopBatchSwapExactOut","outputs":[{"internalType":"uint256","name":"totalAmountIn","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"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":"pair","type":"address"},{"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":"address","name":"pair","type":"address"},{"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":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"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"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"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"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"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"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"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":"address","name":"tokenOut","type":"address"},{"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":"address","name":"tokenOut","type":"address"},{"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":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"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":"address","name":"tokenIn","type":"address"},{"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":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"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":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"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":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"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":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"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"},{"stateMutability":"payable","type":"receive"}]

60e06040523480156200001157600080fd5b506040516200567b3803806200567b833981016040819052620000349162000128565b816001600160a01b03166080816001600160a01b031660601b81525050816001600160a01b0316634b75f54f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200008b57600080fd5b505afa158015620000a0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000c6919062000104565b6001600160601b0319606091821b811660a05291901b1660c052506200015f565b80516001600160a01b0381168114620000ff57600080fd5b919050565b60006020828403121562000116578081fd5b6200012182620000e7565b9392505050565b600080604083850312156200013b578081fd5b6200014683620000e7565b91506200015660208401620000e7565b90509250929050565b60805160601c60a05160601c60c05160601c61542362000258600039806101ac52806108145280610a115280610b84528061104752806113fb528061145f52806114b4528061159b5280611bfb5280611d395280611ead5280611f1f5280611f8652806129a75280612a355280612aee5280612bd952806130f45250806105fb5280610dc552806122af528061258052806126d45280612cf35280613217528061362052806139705280613ac55280613e485280613f54528061406b525080610b475280610e01528061168d5280611945528061209452806125bc5280612d205280613244528061364d52806139ac52506154236000f3fe60806040526004361061018f5760003560e01c8063b05f579e116100d6578063d59e44ee1161007f578063fa3219d511610059578063fa3219d514610458578063fbf4513514610478578063fde1adda14610498576101d5565b8063d59e44ee146103f8578063e1f4a78414610418578063ebb5d2e914610438576101d5565b8063c45a0155116100b0578063c45a0155146103b0578063ce819632146103c5578063d0f2c82a146103d8576101d5565b8063b05f579e1461035d578063b56b681d14610370578063bff51d7114610390576101d5565b80636cb4942811610138578063a4aabb0811610112578063a4aabb0814610308578063a67d0e3c14610328578063ad5c464814610348576101d5565b80636cb49428146102b5578063840c34d0146102c85780639c91fcb5146102db576101d5565b80634c17fd7c116101695780634c17fd7c146102545780635cae031014610282578063674ee80b146102a2576101d5565b80630e2f024c146101da5780633990ba54146102105780634b75f54f14610232576101d5565b366101d5573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146101d357fe5b005b600080fd5b3480156101e657600080fd5b506101fa6101f536600461471f565b6104ab565b604051610207919061529a565b60405180910390f35b61022361021e3660046146ae565b61058e565b604051610207939291906152ec565b34801561023e57600080fd5b506102476105f9565b6040516102079190614c53565b34801561026057600080fd5b5061027461026f3660046143e0565b61061d565b6040516102079291906152a3565b34801561028e57600080fd5b506101d361029d3660046148c5565b61072d565b6101d36102b036600461484b565b610900565b6101fa6102c33660046149bd565b610b42565b6101fa6102d6366004614a24565b610c34565b3480156102e757600080fd5b506102fb6102f63660046148c5565b611004565b6040516102079190614ee2565b34801561031457600080fd5b5061027461032336600461471f565b611167565b34801561033457600080fd5b506101d3610343366004614529565b611250565b34801561035457600080fd5b506102476113f9565b6102fb61036b36600461484b565b61141d565b34801561037c57600080fd5b5061027461038b3660046146ae565b611556565b34801561039c57600080fd5b506102fb6103ab3660046145c0565b611600565b3480156103bc57600080fd5b5061024761168b565b6101fa6103d3366004614a96565b6116af565b3480156103e457600080fd5b506101fa6103f33660046147c8565b611940565b34801561040457600080fd5b506102fb610413366004614529565b611aac565b34801561042457600080fd5b5061027461043336600461435c565b611b58565b34801561044457600080fd5b506101fa6104533660046146ae565b611bb7565b34801561046457600080fd5b506102fb6104733660046148c5565b611cf6565b34801561048457600080fd5b5061022361049336600461449b565b611d61565b6102fb6104a636600461484b565b611e6b565b600080856104b9578a6104db565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8e169063d505accf9061053c903390309086908d908c908c908c90600401614c74565b600060405180830381600087803b15801561055657600080fd5b505af115801561056a573d6000803e3d6000fd5b5050505061057d8d8d8d8d8d8d8d611bb7565b9d9c50505050505050505050505050565b600080600083428110156105d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce90615115565b60405180910390fd5b6105e58b8b8b8b8b8b611f7a565b919d909c50909a5098505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080864281101561065b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce90615115565b600087610668578c61068a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b90508f73ffffffffffffffffffffffffffffffffffffffff1663d505accf3330848d8c8c8c6040518863ffffffff1660e01b81526004016106d19796959493929190614c74565b600060405180830381600087803b1580156106eb57600080fd5b505af11580156106ff573d6000803e3d6000fd5b50505050506107138f8f8f8f8f8f8f61208f565b8093508194505050509c509c9a5050505050505050505050565b8042811015610768576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce90615115565b61079588338787600081811061077a57fe5b905060200201602081019061078f91906142eb565b8a61241f565b6107d48886868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061254b915050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190610849903090600401614c53565b60206040518083038186803b15801561086157600080fd5b505afa158015610875573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108999190614bb2565b9050868110156108d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce9061514c565b6108f473eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee858361294d565b50505050505050505050565b804281101561093b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce90615115565b3461096581878760008161094b57fe5b905060200201602081019061096091906142eb565b612a33565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8a16906370a08231906109ba908890600401614c53565b60206040518083038186803b1580156109d257600080fd5b505afa1580156109e6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0a9190614bb2565b9050610a6b7f00000000000000000000000000000000000000000000000000000000000000008888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508a925061254b915050565b87610aff828b73ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401610aa99190614c53565b60206040518083038186803b158015610ac157600080fd5b505afa158015610ad5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af99190614bb2565b90612b84565b1015610b37576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce9061514c565b505050505050505050565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166314572adb887f000000000000000000000000000000000000000000000000000000000000000088886040518563ffffffff1660e01b8152600401610bc49493929190614e4e565b602060405180830381600087803b158015610bde57600080fd5b505af1158015610bf2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c169190614307565b9050610c2781888860008088611f7a565b9998505050505050505050565b60008142811015610c71576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce90615115565b610c7b8685612bc7565b5060005b8751811015610f9c576000888281518110610c9657fe5b60200260200101515160011415610d01576000898381518110610cb557fe5b6020026020010151600081518110610cc957fe5b60200260200101519050610cf9816020015182604001518360000151846060015185608001518660a00151612c72565b915050610f87565b6000808a8481518110610d1057fe5b6020026020010151600181518110610d2457fe5b602002602001015190506000600167ffffffffffffffff81118015610d4857600080fd5b50604051908082528060200260200182016040528015610d72578160200160208202803683370190505b509050816000015181600081518110610d8757fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166367f84adc7f0000000000000000000000000000000000000000000000000000000000000000856020015186604001518760600151876040518663ffffffff1660e01b8152600401610e50959493929190614dce565b60006040518083038186803b158015610e6857600080fd5b505afa158015610e7c573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610ec29190810190614b12565b905080600081518110610ed157fe5b602002602001015193508260800151841115610f19576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce90614fcb565b505060008b8581518110610f2957fe5b6020026020010151600081518110610f3d57fe5b60200260200101519050610f698160200151826040015183600001518685608001518660a00151612c72565b9350610f8382602001518360000151858560600151612e31565b5050505b610f91818561306a565b935050600101610c7f565b5083821115610fd7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce906150de565b610fea8533610fe5886130a7565b61294d565b50610ff98633610fe5896130a7565b505095945050505050565b60608142811015611041576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce90615115565b6110a1897f00000000000000000000000000000000000000000000000000000000000000008a8a8a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506131d792505050565b91506110e48933888860008181106110b557fe5b90506020020160208101906110ca91906142eb565b856000815181106110d757fe5b602002602001015161241f565b6111248983888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613342915050565b61115a73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee858460018651038151811061114d57fe5b602002602001015161294d565b5050979650505050505050565b600080600086611177578b611199565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8f169063d505accf906111fa903390309086908e908d908d908d90600401614c74565b600060405180830381600087803b15801561121457600080fd5b505af1158015611228573d6000803e3d6000fd5b5050505061123b8e8e8e8e8e8e8e611556565b909f909e509c50505050505050505050505050565b804281101561128b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce90615115565b61129d89338787600081811061077a57fe5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8a16906370a08231906112f2908790600401614c53565b60206040518083038186803b15801561130a57600080fd5b505afa15801561131e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113429190614bb2565b90506113838a87878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061254b915050565b866113c1828b73ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401610aa99190614c53565b10156108f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce9061514c565b7f000000000000000000000000000000000000000000000000000000000000000081565b6060814281101561145a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce90615115565b6114887f00000000000000000000000000000000000000000000000000000000000000008989348a8a6135e0565b91506114af8260008151811061149a57fe5b60200260200101518787600081811061094b57fe5b61150f7f0000000000000000000000000000000000000000000000000000000000000000838888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508a9250613342915050565b8160008151811061151c57fe5b602002602001015134111561154b5761154b338360008151811061153c57fe5b6020026020010151340361374b565b509695505050505050565b6000808242811015611594576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce90615115565b6115c38a8a7f00000000000000000000000000000000000000000000000000000000000000008b8b8b3061208f565b90935091506115d3898685613804565b6115f273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee868461294d565b505097509795505050505050565b6060814281101561163d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce90615115565b61164a89898989896131d7565b915061167389338760008151811061165e57fe5b6020026020010151856000815181106110d757fe5b61167f89838787613342565b50979650505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600081428110156116ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce90615115565b6116f68786612bc7565b50600061170287613926565b6117ab576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8816906370a0823190611758903390600401614c53565b60206040518083038186803b15801561177057600080fd5b505afa158015611784573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a89190614bb2565b90505b60005b8951811015611855576000805b8b83815181106117c757fe5b60200260200101515181101561183f5760008c84815181106117e557fe5b602002602001015182815181106117f857fe5b60200260200101519050600082111561181357606081018390525b61183481602001518260400151836000015184606001518560800151613958565b9250506001016117bb565b5061184a818661306a565b9450506001016117ae565b5061186187338561294d565b506118708833610fe58b6130a7565b5061187a87613926565b156118be57848310156118b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce906150a7565b611934565b846118fc828973ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610aa99190614c53565b1015611934576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce90614f94565b50509695505050505050565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166314572adb8a8a88886040518563ffffffff1660e01b81526004016119a29493929190614e4e565b602060405180830381600087803b1580156119bc57600080fd5b505af11580156119d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f49190614307565b9050611a06818a8a8a8a600080613e05565b50506040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690636a62784290611a5a908690600401614c53565b602060405180830381600087803b158015611a7457600080fd5b505af1158015611a88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c279190614bb2565b60608142811015611ae9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce90615115565b611af78a8a8a8a8a8a6135e0565b9150611b0b8a33888860008181106110b557fe5b611b4b8a838888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508a9250613342915050565b5098975050505050505050565b6000808242811015611b96576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce90615115565b611ba58b8b8b8b8b8b8b61208f565b909c909b509950505050505050505050565b60008142811015611bf4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce90615115565b611c2489897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a611b58565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152909350611cd791508990869073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190611c82903090600401614c53565b60206040518083038186803b158015611c9a57600080fd5b505afa158015611cae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd29190614bb2565b613804565b61115a73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee858461294d565b60608142811015611d33576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce90615115565b6110a1897f00000000000000000000000000000000000000000000000000000000000000008a8a8a8a6135e0565b60008060008342811015611da1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce90615115565b611db08d8d8d8d8d8d8d613e05565b6040517f6a627842000000000000000000000000000000000000000000000000000000008152919550935073ffffffffffffffffffffffffffffffffffffffff8e1690636a62784290611e07908990600401614c53565b602060405180830381600087803b158015611e2157600080fd5b505af1158015611e35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e599190614bb2565b91505099509950999650505050505050565b60608142811015611ea8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce90615115565b611f087f000000000000000000000000000000000000000000000000000000000000000089348a8a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506131d792505050565b9150611f1a8260008151811061149a57fe5b61154b7f0000000000000000000000000000000000000000000000000000000000000000838888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508a9250613342915050565b6000806000611fae89897f00000000000000000000000000000000000000000000000000000000000000008a348b8b613e40565b9093509150611fbf88338b8661241f565b611fc9828a612a33565b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a1690636a6278429061201b908790600401614c53565b602060405180830381600087803b15801561203557600080fd5b505af1158015612049573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061206d9190614bb2565b905081341115612083576120833383340361374b565b96509650969350505050565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e5e31b138a6040518263ffffffff1660e01b81526004016120eb9190614c53565b60206040518083038186803b15801561210357600080fd5b505afa158015612117573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213b9190614b96565b612171576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce90615263565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16906323b872dd906121c79033908d908b90600401614cc2565b602060405180830381600087803b1580156121e157600080fd5b505af11580156121f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122199190614b96565b506000808a73ffffffffffffffffffffffffffffffffffffffff166389afcb44866040518263ffffffff1660e01b81526004016122569190614c53565b6040805180830381600087803b15801561226f57600080fd5b505af1158015612283573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122a79190614bca565b9150915060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663544caa568c8c6040518363ffffffff1660e01b8152600401612308929190614cf3565b604080518083038186803b15801561231f57600080fd5b505afa158015612333573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123579190614323565b5090508073ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff1614612394578183612397565b82825b9095509350878510156123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce90615070565b86841015612410576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce90615002565b50505097509795505050505050565b6000808573ffffffffffffffffffffffffffffffffffffffff166323b872dd86868660405160240161245393929190614cc2565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516124a19190614c37565b6000604051808303816000865af19150503d80600081146124de576040519150601f19603f3d011682016040523d82523d6000602084013e6124e3565b606091505b509150915081801561250d57508051158061250d57508080602001905181019061250d9190614b96565b612543576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce90615206565b505050505050565b8260005b835181101561294657600084828151811061256657fe5b6020026020010151905060008060008060008060008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b33d96b07f00000000000000000000000000000000000000000000000000000000000000008c8f6040518463ffffffff1660e01b81526004016125fb93929190614d1a565b60c06040518083038186803b15801561261357600080fd5b505afa158015612627573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264b919061494a565b955095509550955095509550612694858d73ffffffffffffffffffffffffffffffffffffffff166370a082318d6040518263ffffffff1660e01b8152600401610aa99190614c53565b6040517f671a11b500000000000000000000000000000000000000000000000000000000815290995073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063671a11b590612713908c9089908990899089908990600401615302565b60206040518083038186803b15801561272b57600080fd5b505afa15801561273f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127639190614bb2565b97508596505050505050506000808573ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156127b757600080fd5b505afa1580156127cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ef9190614307565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146128295783600061282d565b6000845b91509150600060018b51038810612844578961285c565b8a886001018151811061285357fe5b60200260200101515b604080516000815260208101918290527f022c0d9f0000000000000000000000000000000000000000000000000000000090915290915073ffffffffffffffffffffffffffffffffffffffff88169063022c0d9f906128c490869086908690602481016152b1565b600060405180830381600087803b1580156128de57600080fd5b505af11580156128f2573d6000803e3d6000fd5b505050507fddac40937f35385a34f721af292e5a83fc5b840f722bff57c2fc71adba708c4887868660405161292993929190614eb2565b60405180910390a150919650506001909401935061254f92505050565b5050505050565b60008161295c57506001612a2c565b61296584613926565b15612a1d576040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d906129dc90859060040161529a565b600060405180830381600087803b1580156129f657600080fd5b505af1158015612a0a573d6000803e3d6000fd5b50505050612a18838361374b565b612a28565b612a28848484613804565b5060015b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015612a9b57600080fd5b505af1158015612aaf573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb9250612b28915084908690600401614e8c565b602060405180830381600087803b158015612b4257600080fd5b505af1158015612b56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b7a9190614b96565b612b8057fe5b5050565b80820382811115612bc1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce90614f26565b92915050565b6000612bd283613926565b15612c5d577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015612c3f57600080fd5b505af1158015612c53573d6000803e3d6000fd5b5050505050612c69565b612c698333308561241f565b50600192915050565b604080516001808252818301909252600091829190602080830190803683370190505090508581600081518110612ca557fe5b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526040517f67f84adc0000000000000000000000000000000000000000000000000000000081526000917f000000000000000000000000000000000000000000000000000000000000000016906367f84adc90612d50907f0000000000000000000000000000000000000000000000000000000000000000908d908d908c908990600401614dce565b60006040518083038186803b158015612d6857600080fd5b505afa158015612d7c573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612dc29190810190614b12565b905080600081518110612dd157fe5b6020026020010151925084831115612e15576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce90614fcb565b61193489888584600181518110612e2857fe5b60200260200101515b612e3c848484613804565b600083905060008173ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015612e8957600080fd5b505afa158015612e9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ec19190614307565b905060008060008373ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614612f045785600085612f85565b6000868673ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015612f4d57600080fd5b505afa158015612f61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f859190614307565b604080516000815260208101918290527f022c0d9f00000000000000000000000000000000000000000000000000000000909152929550909350915073ffffffffffffffffffffffffffffffffffffffff86169063022c0d9f90612ff290869086903090602481016152b1565b600060405180830381600087803b15801561300c57600080fd5b505af1158015613020573d6000803e3d6000fd5b505050507fddac40937f35385a34f721af292e5a83fc5b840f722bff57c2fc71adba708c4888878360405161305793929190614eb2565b60405180910390a1505050505050505050565b80820182811015612bc1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce90615039565b60006130b282613926565b15613180576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190613129903090600401614c53565b60206040518083038186803b15801561314157600080fd5b505afa158015613155573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131799190614bb2565b90506131d2565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316906370a0823190613129903090600401614c53565b919050565b6040517f119220a500000000000000000000000000000000000000000000000000000000815260609073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063119220a590613274907f0000000000000000000000000000000000000000000000000000000000000000908a908a908a908990600401614dce565b60006040518083038186803b15801561328c57600080fd5b505afa1580156132a0573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526132e69190810190614b12565b905082816001835103815181106132f957fe5b60200260200101511015613339576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce9061514c565b95945050505050565b8360005b835181101561254357600084828151811061335d57fe5b6020026020010151905060008173ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156133af57600080fd5b505afa1580156133c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133e79190614307565b905060008784600101815181106133fa57fe5b6020026020010151905060008060008473ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161461344557836000866134c6565b6000848773ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561348e57600080fd5b505afa1580156134a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134c69190614307565b925092509250600060018b510388106134df57896134f7565b8a88600101815181106134ee57fe5b60200260200101515b604080516000815260208101918290527f022c0d9f0000000000000000000000000000000000000000000000000000000090915290915073ffffffffffffffffffffffffffffffffffffffff88169063022c0d9f9061355f90879087908690602481016152b1565b600060405180830381600087803b15801561357957600080fd5b505af115801561358d573d6000803e3d6000fd5b505050507fddac40937f35385a34f721af292e5a83fc5b840f722bff57c2fc71adba708c488786846040516135c493929190614eb2565b60405180910390a1509650506001909401935061334692505050565b6040517f67f84adc00000000000000000000000000000000000000000000000000000000815260609073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906367f84adc9061367f907f0000000000000000000000000000000000000000000000000000000000000000908b908b908b908a908a90600401614d4a565b60006040518083038186803b15801561369757600080fd5b505afa1580156136ab573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526136f19190810190614b12565b9050838160008151811061370157fe5b60200260200101511115613741576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce90614fcb565b9695505050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040516137829190614c37565b60006040518083038185875af1925050503d80600081146137bf576040519150601f19603f3d011682016040523d82523d6000602084013e6137c4565b606091505b50509050806137ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce906151a9565b505050565b6000808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401613836929190614e8c565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516138849190614c37565b6000604051808303816000865af19150503d80600081146138c1576040519150601f19603f3d011682016040523d82523d6000602084013e6138c6565b606091505b50915091508180156138f05750805115806138f05750808060200190518101906138f09190614b96565b612946576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce90614f5d565b73ffffffffffffffffffffffffffffffffffffffff811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14919050565b6000613965868585613804565b6000806000806000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b33d96b07f00000000000000000000000000000000000000000000000000000000000000008c8f6040518463ffffffff1660e01b81526004016139eb93929190614d1a565b60c06040518083038186803b158015613a0357600080fd5b505afa158015613a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a3b919061494a565b95509550955095509550506000613a85868e73ffffffffffffffffffffffffffffffffffffffff166370a082318e6040518263ffffffff1660e01b8152600401610aa99190614c53565b6040517f671a11b500000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063671a11b590613b049084908a908a908a908a908a90600401615302565b60206040518083038186803b158015613b1c57600080fd5b505afa158015613b30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b549190614bb2565b965050505050505060008673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613b979190614c53565b60206040518083038186803b158015613baf57600080fd5b505afa158015613bc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613be79190614bb2565b90506000808773ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015613c3257600080fd5b505afa158015613c46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c6a9190614307565b73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff1614613ca457836000613ca8565b6000845b604080516000815260208101918290527f022c0d9f00000000000000000000000000000000000000000000000000000000909152919350915073ffffffffffffffffffffffffffffffffffffffff89169063022c0d9f90613d1290859085903090602481016152b1565b600060405180830381600087803b158015613d2c57600080fd5b505af1158015613d40573d6000803e3d6000fd5b505050507fddac40937f35385a34f721af292e5a83fc5b840f722bff57c2fc71adba708c4888858b604051613d7793929190614eb2565b60405180910390a1613dbc838a73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610aa99190614c53565b945085851015613df8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce9061514c565b5050505095945050505050565b600080613e1789898989898989613e40565b9092509050613e2888338b8561241f565b613e3487338b8461241f565b97509795505050505050565b6000806000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663327494618c8c8c6040518463ffffffff1660e01b8152600401613ea393929190614d1a565b604080518083038186803b158015613eba57600080fd5b505afa158015613ece573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ef29190614bca565b91509150816000148015613f04575080155b15613f14578793508692506115f2565b6040517fad615dec00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063ad615dec90613f8d908c90879087906004016152ec565b60206040518083038186803b158015613fa557600080fd5b505afa158015613fb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fdd9190614bb2565b905087811161402b5785811015614020576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce90615002565b889450925082612410565b6040517fad615dec00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063ad615dec906140a4908c90879089906004016152ec565b60206040518083038186803b1580156140bc57600080fd5b505afa1580156140d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140f49190614bb2565b90508981111561410057fe5b8781101561413a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce90615070565b9c979b50969950505050505050505050565b80356131d2816153a8565b60008083601f840112614168578182fd5b50813567ffffffffffffffff81111561417f578182fd5b602083019150836020808302850101111561419957600080fd5b9250929050565b600082601f8301126141b0578081fd5b813560206141c56141c08361535a565b615336565b82815281810190858301855b858110156142cd578135880189603f8201126141eb578788fd5b858101356141fb6141c08261535a565b808282528882019150604084018d604060c08602870101111561421c578b8cfd5b8b94505b838510156142b75760c0818f031215614237578b8cfd5b60405160c0810181811067ffffffffffffffff8211171561425457fe5b6040528135614262816153a8565b815261426f828c0161414c565b8b82015261427f6040830161414c565b6040820152606082810135908201526080808301359082015260a080830135908201528352600194909401939189019160c001614220565b50875250505092840192908401906001016141d1565b5090979650505050505050565b803560ff811681146131d257600080fd5b6000602082840312156142fc578081fd5b8135612a2c816153a8565b600060208284031215614318578081fd5b8151612a2c816153a8565b60008060408385031215614335578081fd5b8251614340816153a8565b6020840151909250614351816153a8565b809150509250929050565b600080600080600080600080610100898b031215614378578384fd5b8835614383816153a8565b97506020890135614393816153a8565b965060408901356143a3816153a8565b9550606089013594506080890135935060a0890135925060c08901356143c8816153a8565b8092505060e089013590509295985092959890939650565b6000806000806000806000806000806000806101808d8f031215614402578586fd5b8c3561440d816153a8565b9b5060208d013561441d816153a8565b9a5060408d013561442d816153a8565b995060608d0135985060808d0135975060a08d0135965060c08d0135614452816153a8565b955060e08d013594506101008d013561446a816153cd565b93506144796101208e016142da565b92506101408d013591506101608d013590509295989b509295989b509295989b565b60008060008060008060008060006101208a8c0312156144b9578283fd5b89356144c4816153a8565b985060208a01356144d4816153a8565b975060408a01356144e4816153a8565b965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a0135614510816153a8565b809250506101008a013590509295985092959850929598565b60008060008060008060008060e0898b031215614544578182fd5b883561454f816153a8565b9750602089013561455f816153a8565b96506040890135955060608901359450608089013567ffffffffffffffff811115614588578283fd5b6145948b828c01614157565b90955093505060a08901356145a8816153a8565b8092505060c089013590509295985092959890939650565b600080600080600080600060e0888a0312156145da578081fd5b87356145e5816153a8565b96506020888101356145f6816153a8565b96506040890135955060608901359450608089013567ffffffffffffffff81111561461f578283fd5b8901601f81018b1361462f578283fd5b803561463d6141c08261535a565b81815283810190838501858402850186018f1015614659578687fd5b8694505b83851015614684578035614670816153a8565b83526001949094019391850191850161465d565b50809750505050505061469960a0890161414c565b915060c0880135905092959891949750929550565b600080600080600080600060e0888a0312156146c8578081fd5b87356146d3816153a8565b965060208801356146e3816153a8565b955060408801359450606088013593506080880135925060a0880135614708816153a8565b8092505060c0880135905092959891949750929550565b60008060008060008060008060008060006101608c8e031215614740578485fd5b8b3561474b816153a8565b9a5060208c013561475b816153a8565b995060408c0135985060608c0135975060808c0135965060a08c0135614780816153a8565b955060c08c0135945060e08c0135614797816153cd565b93506147a66101008d016142da565b92506101208c013591506101408c013590509295989b509295989b9093969950565b600080600080600080600060e0888a0312156147e2578081fd5b87356147ed816153a8565b965060208801356147fd816153a8565b95506040880135945060608801359350608088013561481b816153db565b925060a088013561482b816153db565b915060c088013561483b816153a8565b8091505092959891949750929550565b60008060008060008060a08789031215614863578384fd5b863561486e816153a8565b955060208701359450604087013567ffffffffffffffff811115614890578485fd5b61489c89828a01614157565b90955093505060608701356148b0816153a8565b80925050608087013590509295509295509295565b600080600080600080600060c0888a0312156148df578081fd5b87356148ea816153a8565b96506020880135955060408801359450606088013567ffffffffffffffff811115614913578182fd5b61491f8a828b01614157565b9095509350506080880135614933816153a8565b8092505060a0880135905092959891949750929550565b60008060008060008060c08789031215614962578384fd5b865161496d816153a8565b809650506020870151945060408701519350606087015161498d816153db565b608088015190935061499e816153db565b60a08801519092506149af816153db565b809150509295509295509295565b600080600080600060a086880312156149d4578283fd5b85356149df816153a8565b94506020860135935060408601356149f6816153db565b92506060860135614a06816153db565b91506080860135614a16816153a8565b809150509295509295909350565b600080600080600060a08688031215614a3b578283fd5b853567ffffffffffffffff811115614a51578384fd5b614a5d888289016141a0565b9550506020860135614a6e816153a8565b93506040860135614a7e816153a8565b94979396509394606081013594506080013592915050565b60008060008060008060c08789031215614aae578384fd5b863567ffffffffffffffff811115614ac4578485fd5b614ad089828a016141a0565b9650506020870135614ae1816153a8565b94506040870135614af1816153a8565b959894975094956060810135955060808101359460a0909101359350915050565b60006020808385031215614b24578182fd5b825167ffffffffffffffff811115614b3a578283fd5b8301601f81018513614b4a578283fd5b8051614b586141c08261535a565b8181528381019083850185840285018601891015614b74578687fd5b8694505b8385101561167f578051835260019490940193918501918501614b78565b600060208284031215614ba7578081fd5b8151612a2c816153cd565b600060208284031215614bc3578081fd5b5051919050565b60008060408385031215614bdc578182fd5b505080516020909101519092909150565b60008151808452614c05816020860160208601615378565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008251614c49818460208701615378565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff97881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff93841681529183166020830152909116604082015260600190565b600060a0820173ffffffffffffffffffffffffffffffffffffffff808a1684526020818a1681860152818916604086015287606086015260a060808601528286845260c086019050879350845b87811015614dbe578435614daa816153a8565b841682529382019390820190600101614d97565b509b9a5050505050505050505050565b600060a0820173ffffffffffffffffffffffffffffffffffffffff8089168452602081891681860152818816604086015286606086015260a0608086015282865180855260c0870191508288019450855b81811015614e3d578551851683529483019491830191600101614e1f565b50909b9a5050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff948516815292909316602083015263ffffffff9081166040830152909116606082015260800190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff93841681526020810192909252909116604082015260600190565b6020808252825182820181905260009190848201906040850190845b81811015614f1a57835183529284019291840191600101614efe565b50909695505050505050565b60208082526015908201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604082015260600190565b6020808252601f908201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604082015260600190565b60208082526012908201527f3c6d696e546f74616c416d6f756e744f75740000000000000000000000000000604082015260600190565b6020808252601e908201527f526f757465723a204558434553534956455f494e5055545f414d4f554e540000604082015260600190565b6020808252601d908201527f526f757465723a20494e53554646494349454e545f425f414d4f554e54000000604082015260600190565b60208082526014908201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604082015260600190565b6020808252601d908201527f526f757465723a20494e53554646494349454e545f415f414d4f554e54000000604082015260600190565b6020808252600d908201527f4552525f4c494d49545f4f555400000000000000000000000000000000000000604082015260600190565b6020808252600c908201527f4552525f4c494d49545f494e0000000000000000000000000000000000000000604082015260600190565b6020808252600f908201527f526f757465723a20455850495245440000000000000000000000000000000000604082015260600190565b60208082526022908201527f526f757465723a20494e53554646494349454e545f4f55545055545f414d4f5560408201527f4e54000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526023908201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960408201527f4c45440000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f464160408201527f494c454400000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526014908201527f526f757465723a20496e76616c69642070616972000000000000000000000000604082015260600190565b90815260200190565b918252602082015260400190565b600085825284602083015273ffffffffffffffffffffffffffffffffffffffff84166040830152608060608301526137416080830184614bed565b9283526020830191909152604082015260600190565b9586526020860194909452604085019290925263ffffffff908116606085015290811660808401521660a082015260c00190565b60405181810167ffffffffffffffff8111828210171561535257fe5b604052919050565b600067ffffffffffffffff82111561536e57fe5b5060209081020190565b60005b8381101561539357818101518382015260200161537b565b838111156153a2576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff811681146153ca57600080fd5b50565b80151581146153ca57600080fd5b63ffffffff811681146153ca57600080fdfea2646970667358221220682ddcc249b1d59d570500c4070f4335f3e66f21cc08e2c04a152e032c26ef0a64736f6c634300070600330000000000000000000000005de74546d3b86c8df7feec30253865e1149818c80000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000005de74546d3b86c8df7feec30253865e1149818c80000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270

-----Decoded View---------------
Arg [0] : _factory (address): 0x5de74546d3b86c8df7feec30253865e1149818c8
Arg [1] : _WETH (address): 0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000005de74546d3b86c8df7feec30253865e1149818c8
Arg [1] : 0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270


Deployed ByteCode Sourcemap

16133:26576:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16801:10;:18;16815:4;16801:18;;16794:26;;;;16133:26576;;;;;42031:675;;;;;;;;;;-1:-1:-1;42031:675:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20844:464;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;16261:41::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;39947:669::-;;;;;;;;;;-1:-1:-1;39947:669:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;28409:695::-;;;;;;;;;;-1:-1:-1;28409:695:0;;;;;:::i;:::-;;:::i;27666:737::-;;;;;;:::i;:::-;;:::i;20492:346::-;;;;;;:::i;:::-;;:::i;30794:2597::-;;;;;;:::i;:::-;;:::i;24355:584::-;;;;;;;;;;-1:-1:-1;24355:584:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;40624:626::-;;;;;;;;;;-1:-1:-1;40624:626:0;;;;;:::i;:::-;;:::i;26963:697::-;;;;;;;;;;-1:-1:-1;26963:697:0;;;;;:::i;:::-;;:::i;16309:38::-;;;;;;;;;;;;;:::i;24945:578::-;;;;;;:::i;:::-;;:::i;39294:645::-;;;;;;;;;;-1:-1:-1;39294:645:0;;;;;:::i;:::-;;:::i;22205:546::-;;;;;;;;;;-1:-1:-1;22205:546:0;;;;;:::i;:::-;;:::i;16213:41::-;;;;;;;;;;;;;:::i;29110:1676::-;;;;;;:::i;:::-;;:::i;18704:412::-;;;;;;;;;;-1:-1:-1;18704:412:0;;;;;:::i;:::-;;:::i;22759:549::-;;;;;;;;;;-1:-1:-1;22759:549:0;;;;;:::i;:::-;;:::i;38864:422::-;;;;;;;;;;-1:-1:-1;38864:422:0;;;;;:::i;:::-;;:::i;41329:694::-;;;;;;;;;;-1:-1:-1;41329:694:0;;;;;:::i;:::-;;:::i;23766:583::-;;;;;;;;;;-1:-1:-1;23766:583:0;;;;;:::i;:::-;;:::i;19122:543::-;;;;;;;;;;-1:-1:-1;19122:543:0;;;;;:::i;:::-;;:::i;23316:444::-;;;;;;:::i;:::-;;:::i;42031:675::-;42372:14;42399:10;42412;:34;;42437:9;42412:34;;;42430:3;42412:34;42457:79;;;;;42399:47;;-1:-1:-1;42457:26:0;;;;;;:79;;42484:10;;42504:4;;42399:47;;42518:8;;42528:1;;42531;;42534;;42457:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42559:139;42621:4;42627:5;42634:9;42645:14;42661:12;42675:2;42679:8;42559:47;:139::i;:::-;42547:151;42031:675;-1:-1:-1;;;;;;;;;;;;;42031:675:0:o;20844:464::-;21118:16;21136:14;21152;21099:8;16518:15;16506:8;:27;;16498:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;21217:83:::1;21234:4;21240:5;21247:18;21267:14;21283:12;21297:2;21217:16;:83::i;:::-;21179:121:::0;;;;-1:-1:-1;21179:121:0;;-1:-1:-1;20844:464:0;-1:-1:-1;;;;;;;;;20844:464:0:o;16261:41::-;;;:::o;39947:669::-;40293:12;40307;40274:8;16518:15;16506:8;:27;;16498:55;;;;;;;;;;;;:::i;:::-;40347:10:::1;40360;:34;;40385:9;40360:34;;;40378:3;40360:34;40347:47;;40423:4;40409:26;;;40436:10;40456:4;40463:5;40470:8;40480:1;40483;40486;40409:79;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;16564:1;40531:77;40548:4;40554:6;40562;40570:9;40581:10;40593;40605:2;40531:16;:77::i;:::-;40510:98;;;;;;;;39947:669:::0;;;;;;;;;;;;;;;;:::o;28409:695::-;28702:8;16518:15;16506:8;:27;;16498:55;;;;;;;;;;;;:::i;:::-;28728:95:::1;28774:7;28783:10;28795:4;;28800:1;28795:7;;;;;;;;;;;;;;;;;;;;:::i;:::-;28804:8;28728:31;:95::i;:::-;28834:64;28869:7;28878:4;;28834:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;28892:4:0::1;::::0;-1:-1:-1;28834:34:0::1;::::0;-1:-1:-1;;28834:64:0:i:1;:::-;28926:37;::::0;;;;28909:14:::1;::::0;28926:22:::1;28933:4;28926:22;::::0;::::1;::::0;:37:::1;::::0;28957:4:::1;::::0;28926:37:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28909:54;;28995:12;28982:9;:25;;28974:72;;;;;;;;;;;;:::i;:::-;29057:39;16401:42;29082:2;29086:9;29057:11;:39::i;:::-;;16564:1;28409:695:::0;;;;;;;;:::o;27666:737::-;27953:8;16518:15;16506:8;:27;;16498:55;;;;;;;;;;;;:::i;:::-;28060:9:::1;28080:32;28060:9:::0;28104:4;;28044:13:::1;28104:7:::0;::::1;;;;;;;;;;;;;;;;;:::i;:::-;28080:13;:32::i;:::-;28144:30;::::0;;;;28123:18:::1;::::0;28144:26:::1;::::0;::::1;::::0;::::1;::::0;:30:::1;::::0;28171:2;;28144:30:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28123:51;;28185:50;28220:4;28226;;28185:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;28232:2:0;;-1:-1:-1;28185:34:0::1;::::0;-1:-1:-1;;28185:50:0:i:1;:::-;28321:12;28268:49;28303:13;28275:8;28268:26;;;28295:2;28268:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:34:::0;::::1;:49::i;:::-;:65;;28246:149;;;;;;;;;;;;:::i;:::-;16564:1;;27666:737:::0;;;;;;;:::o;20492:346::-;20638:14;20665:12;20697:7;20680:36;;;20717:5;20724:4;20730:11;20743:7;20680:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20665:86;;20778:52;20795:4;20801:5;20808:11;20821:1;20824;20827:2;20778:16;:52::i;:::-;20762:68;20492:346;-1:-1:-1;;;;;;;;;20492:346:0:o;30794:2597::-;31043:18;31024:8;16518:15;16506:8;:27;;16498:55;;;;;;;;;;;;:::i;:::-;31074:42:::1;31090:7;31099:16;31074:15;:42::i;:::-;;31134:6;31129:2052;31150:13;:20;31146:1;:24;31129:2052;;;31192:27;31323:13;31337:1;31323:16;;;;;;;;;;;;;;:23;31350:1;31323:28;31319:1777;;;31372:16;31391:13;31405:1;31391:16;;;;;;;;;;;;;;31408:1;31391:19;;;;;;;;;;;;;;31372:38;;31454:113;31472:4;:12;;;31486:4;:13;;;31501:4;:9;;;31512:4;:15;;;31529:4;:22;;;31553:4;:13;;;31454:17;:113::i;:::-;31429:138;;31319:1777;;;;31906:28;32014:22:::0;32039:13:::1;32053:1;32039:16;;;;;;;;;;;;;;32056:1;32039:19;;;;;;;;;;;;;;32014:44;;32100:22;32139:1;32125:16;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;32125:16:0::1;;32100:41;;32175:10;:15;;;32164:5;32170:1;32164:8;;;;;;;;;;;;;:26;;;;;;;;;::::0;::::1;32213:21;32254:7;32237:45;;;32283:7;32292:10;:18;;;32312:10;:19;;;32333:10;:21;;;32356:5;32237:125;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;::::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;32213:149;;32411:7;32419:1;32411:10;;;;;;;;;;;;;;32385:36;;32479:10;:28;;;32452:23;:55;;32444:98;;;;;;;;;;;;:::i;:::-;31319:1777;;32668:21;32692:13;32706:1;32692:16;;;;;;;;;;;;;;32709:1;32692:19;;;;;;;;;;;;;;32668:43;;32755:146;32773:9;:17;;;32792:9;:18;;;32812:9;:14;;;32828:23;32853:9;:27;;;32882:9;:18;;;32755:17;:146::i;:::-;32730:171;;32984:96;32996:10;:18;;;33016:10;:15;;;33033:23;33058:10;:21;;;32984:11;:96::i;:::-;31319:1777;;;;33128:41;:22:::0;33155:13;33128:26:::1;:41::i;:::-;33112:57:::0;-1:-1:-1;;31172:3:0::1;;31129:2052;;;;33218:16;33201:13;:33;;33193:58;;;;;;;;;;;;:::i;:::-;33264:55;33276:8;33286:10;33298:20;33309:8;33298:10;:20::i;:::-;33264:11;:55::i;:::-;;33330:53;33342:7;33351:10;33363:19;33374:7;33363:10;:19::i;33330:53::-;;30794:2597:::0;;;;;;;;:::o;24355:584::-;24586:21;24558:8;16518:15;16506:8;:27;;16498:55;;;;;;;;;;;;:::i;:::-;24635:63:::1;24654:7;24663:4;24669:8;24679:12;24693:4;;24635:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;24635:18:0::1;::::0;-1:-1:-1;;;24635:63:0:i:1;:::-;24625:73;;24711:97;24757:7;24766:10;24778:4;;24783:1;24778:7;;;;;;;;;;;;;;;;;;;;:::i;:::-;24787;24795:1;24787:10;;;;;;;;;;;;;;24711:31;:97::i;:::-;24819:44;24825:7;24834;24843:4;;24819:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;24857:4:0::1;::::0;-1:-1:-1;24819:5:0::1;::::0;-1:-1:-1;;24819:44:0:i:1;:::-;24874:57;16401:42;24899:2;24903:7;24928:1;24911:7;:14;:18;24903:27;;;;;;;;;;;;;;24874:11;:57::i;:::-;;24355:584:::0;;;;;;;;;;:::o;40624:626::-;40936:16;40954:14;40981:10;40994;:34;;41019:9;40994:34;;;41012:3;40994:34;41039:79;;;;;40981:47;;-1:-1:-1;41039:26:0;;;;;;:79;;41066:10;;41086:4;;40981:47;;41100:8;;41110:1;;41113;;41116;;41039:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41156:86;41175:4;41181:5;41188:9;41199:14;41215:12;41229:2;41233:8;41156:18;:86::i;:::-;41129:113;;;;-1:-1:-1;40624:626:0;-1:-1:-1;;;;;;;;;;;;;40624:626:0:o;26963:697::-;27250:8;16518:15;16506:8;:27;;16498:55;;;;;;;;;;;;:::i;:::-;27271:95:::1;27317:7;27326:10;27338:4;;27343:1;27338:7;;;;;;27271:95;27398:30;::::0;;;;27377:18:::1;::::0;27398:26:::1;::::0;::::1;::::0;::::1;::::0;:30:::1;::::0;27425:2;;27398:30:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27377:51;;27439:53;27474:7;27483:4;;27439:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27489:2:0;;-1:-1:-1;27439:34:0::1;::::0;-1:-1:-1;;27439:53:0:i:1;:::-;27578:12;27525:49;27560:13;27532:8;27525:26;;;27552:2;27525:30;;;;;;;;;;;;;;;:::i;:49::-;:65;;27503:149;;;;;;;;;;;;:::i;16309:38::-:0;;;:::o;24945:578::-;25176:21;25148:8;16518:15;16506:8;:27;;16498:55;;;;;;;;;;;;:::i;:::-;25225:61:::1;25243:4;25249:8;25259:9;25270;25281:4;;25225:17;:61::i;:::-;25215:71;;25299:34;25313:7;25321:1;25313:10;;;;;;;;;;;;;;25325:4;;25330:1;25325:7;;;;;;25299:34;25344:30;25350:4;25356:7;25365:4;;25344:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;25371:2:0;;-1:-1:-1;25344:5:0::1;::::0;-1:-1:-1;;25344:30:0:i:1;:::-;25437:7;25445:1;25437:10;;;;;;;;;;;;;;25425:9;:22;25421:94;;;25449:66;25480:10;25504:7;25512:1;25504:10;;;;;;;;;;;;;;25492:9;:22;25449:30;:66::i;:::-;24945:578:::0;;;;;;;;;:::o;39294:645::-;39554:16;39572:14;39535:8;16518:15;16506:8;:27;;16498:55;;;;;;;;;;;;:::i;:::-;39626:193:::1;39657:4;39676:5;39696:4;39715:9;39739:14;39768:12;39803:4;39626:16;:193::i;:::-;39599:220:::0;;-1:-1:-1;39599:220:0;-1:-1:-1;39830:51:0::1;39858:5:::0;39865:2;39599:220;39830:27:::1;:51::i;:::-;39892:39;16401:42;39917:2;39921:9;39892:11;:39::i;:::-;;39294:645:::0;;;;;;;;;;;:::o;22205:546::-;22478:21;22459:8;16518:15;16506:8;:27;;16498:55;;;;;;;;;;;;:::i;:::-;22522:67:::1;22541:7;22550:8;22560;22570:12;22584:4;22522:18;:67::i;:::-;22512:77;;22602:97;22648:7;22657:10;22669:4;22674:1;22669:7;;;;;;;;;;;;;;22678;22686:1;22678:10;;;;;;;22602:97;22710:33;22716:7;22725;22734:4;22740:2;22710:5;:33::i;:::-;22205:546:::0;;;;;;;;;;:::o;16213:41::-;;;:::o;29110:1676::-;29388:19;29369:8;16518:15;16506:8;:27;;16498:55;;;;;;;;;;;;:::i;:::-;29420:39:::1;29436:7;29445:13;29420:15;:39::i;:::-;;29470:18;29504:15;29510:8;29504:5;:15::i;:::-;29499:103;;29552:38;::::0;;;;:26:::1;::::0;::::1;::::0;::::1;::::0;:38:::1;::::0;29579:10:::1;::::0;29552:38:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29536:54;;29499:103;29619:6;29614:776;29635:13;:20;29631:1;:24;29614:776;;;29677:19;::::0;29711:542:::1;29732:13;29746:1;29732:16;;;;;;;;;;;;;;:23;29728:1;:27;29711:542;;;29781:16;29800:13;29814:1;29800:16;;;;;;;;;;;;;;29817:1;29800:19;;;;;;;;;;;;;;29781:38;;29846:1;29842;:5;29838:246;;;30032:15;::::0;::::1;:32:::0;;;29838:246:::1;30119:118;30157:4;:12;;;30171:4;:13;;;30186:4;:9;;;30197:4;:15;;;30214:4;:22;;;30119:37;:118::i;:::-;30102:135:::0;-1:-1:-1;;29757:3:0::1;;29711:542;;;-1:-1:-1::0;30344:34:0::1;:14:::0;30363;30344:18:::1;:34::i;:::-;30327:51:::0;-1:-1:-1;;29657:3:0::1;;29614:776;;;;30402:49;30414:8;30424:10;30436:14;30402:11;:49::i;:::-;;30462:53;30474:7;30483:10;30495:19;30506:7;30495:10;:19::i;30462:53::-;;30532:15;30538:8;30532:5;:15::i;:::-;30528:251;;;30590:17;30572:14;:35;;30564:61;;;;;;;;;;;;:::i;:::-;30528:251;;;30727:17;30666:57;30709:13;30673:8;30666:26;;;30693:10;30666:38;;;;;;;;;;;;;;;:::i;:57::-;:78;;30658:109;;;;;;;;;;;;:::i;:::-;16564:1;29110:1676:::0;;;;;;;;;:::o;18704:412::-;18865:14;18892:12;18924:7;18907:36;;;18944:6;18952;18960:12;18974:7;18907:75;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18892:90;;18993:64;19012:4;19018:6;19026;19034:7;19043;19052:1;19055;18993:18;:64::i;:::-;-1:-1:-1;;19080:28:0;;;;;:24;;;;;;:28;;19105:2;;19080:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;22759:549::-;23036:21;23017:8;16518:15;16506:8;:27;;16498:55;;;;;;;;;;;;:::i;:::-;23080:66:::1;23098:7;23107:8;23117:9;23128:11;23141:4;;23080:17;:66::i;:::-;23070:76;;23159:97;23205:7;23214:10;23226:4;;23231:1;23226:7;;;;;;23159:97;23267:33;23273:7;23282;23291:4;;23267:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;23297:2:0;;-1:-1:-1;23267:5:0::1;::::0;-1:-1:-1;;23267:33:0:i:1;:::-;22759:549:::0;;;;;;;;;;;:::o;38864:422::-;39141:12;39155;39122:8;16518:15;16506:8;:27;;16498:55;;;;;;;;;;;;:::i;:::-;39201:77:::1;39218:4;39224:6;39232;39240:9;39251:10;39263;39275:2;39201:16;:77::i;:::-;39180:98:::0;;;;-1:-1:-1;38864:422:0;-1:-1:-1;;;;;;;;;;38864:422:0:o;41329:694::-;41618:14;41599:8;16518:15;16506:8;:27;;16498:55;;;;;;;;;;;;:::i;:::-;41661:215:::1;41691:4;41710:5;41730:4;41749:9;41773:14;41802:12;41837:4;41857:8;41661:15;:215::i;:::-;41926:38;::::0;;;;41645:231;;-1:-1:-1;41887:78:0::1;::::0;-1:-1:-1;41915:5:0;;41922:2;;41926:23:::1;::::0;::::1;::::0;::::1;::::0;:38:::1;::::0;41958:4:::1;::::0;41926:38:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41887:27;:78::i;:::-;41976:39;16401:42;42001:2;42005:9;41976:11;:39::i;23766:583::-:0;23997:21;23969:8;16518:15;16506:8;:27;;16498:55;;;;;;;;;;;;:::i;:::-;24046:62:::1;24064:7;24073:4;24079:9;24090:11;24103:4;;24046:17;:62::i;19122:543::-:0;19433:12;19447;19461:14;19414:8;16518:15;16506:8;:27;;16498:55;;;;;;;;;;;;:::i;:::-;19510:96:::1;19529:4;19535:6;19543;19551:14;19567;19583:10;19595;19510:18;:96::i;:::-;19629:28;::::0;;;;19488:118;;-1:-1:-1;19488:118:0;-1:-1:-1;19629:24:0::1;::::0;::::1;::::0;::::1;::::0;:28:::1;::::0;19654:2;;19629:28:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19617:40;;19122:543:::0;;;;;;;;;;;;;;:::o;23316:444::-;23550:21;23522:8;16518:15;16506:8;:27;;16498:55;;;;;;;;;;;;:::i;:::-;23599:65:::1;23618:4;23624:8;23634:9;23645:12;23659:4;;23599:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;23599:18:0::1;::::0;-1:-1:-1;;;23599:65:0:i:1;:::-;23589:75;;23677:34;23691:7;23699:1;23691:10;;;;;;;23677:34;23722:30;23728:4;23734:7;23743:4;;23722:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;23749:2:0;;-1:-1:-1;23722:5:0::1;::::0;-1:-1:-1;;23722:30:0:i:1;19673:813::-:0;19884:16;19902:14;19918;19972:195;20000:4;20019:5;20039:4;20058:18;20091:9;20115:14;20144:12;19972:13;:195::i;:::-;19945:222;;-1:-1:-1;19945:222:0;-1:-1:-1;20178:69:0;20210:5;20217:10;20229:4;19945:222;20178:31;:69::i;:::-;20258:30;20272:9;20283:4;20258:13;:30::i;:::-;20311:28;;;;;:24;;;;;;:28;;20336:2;;20311:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20299:40;;20402:9;20390;:21;20386:92;;;20413:65;20444:10;20468:9;20456;:21;20413:30;:65::i;:::-;19673:813;;;;;;;;;;:::o;38019:839::-;38242:12;38256;38306:7;38289:32;;;38322:4;38289:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38281:71;;;;;;;;;;;;:::i;:::-;38363:61;;;;;:32;;;;;;:61;;38396:10;;38377:4;;38414:9;;38363:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38471:12;38485;38515:4;38501:24;;;38526:2;38501:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38470:59;;;;38541:14;38577:7;38560:36;;;38597:6;38605;38560:52;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38540:72;;;38654:6;38644:16;;:6;:16;;;:58;;38685:7;38694;38644:58;;;38664:7;38673;38644:58;38623:79;;-1:-1:-1;38623:79:0;-1:-1:-1;38721:21:0;;;;38713:63;;;;;;;;;;;;:::i;:::-;38806:10;38795:7;:21;;38787:63;;;;;;;;;;;;:::i;:::-;38019:839;;;;;;;;;;;;;:::o;7804:402::-;7983:12;7997:17;8018:5;:10;;8052;8064:4;8070:2;8074:5;8029:51;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8018:63;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7982:99;;;;8100:7;:57;;;;-1:-1:-1;8112:11:0;;:16;;:44;;;8143:4;8132:24;;;;;;;;;;;;:::i;:::-;8092:106;;;;;;;;;;;;:::i;:::-;7804:402;;;;;;:::o;25670:1287::-;25811:7;25795:13;25829:1121;25846:4;:11;25842:1;:15;25829:1121;;;25879:18;25914:4;25919:1;25914:7;;;;;;;;;;;;;;25879:43;;25939:16;25970:17;26002:21;26058:14;26074:17;26093:18;26113:23;26138:24;26164:14;26199:7;26182:53;;;26236:7;26253:4;26260:5;26182:84;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26057:209;;;;;;;;;;;;26299:56;26342:12;26306:5;26299:23;;;26331:4;26299:38;;;;;;;;;;;;;;;:::i;:56::-;26389:126;;;;;26285:70;;-1:-1:-1;26389:38:0;26406:7;26389:38;;;;:126;;26285:70;;26441:12;;26455:13;;26470:16;;26488:17;;26507:7;;26389:126;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26374:141;;26550:6;26534:22;;25829:1121;;;;;;26587:15;26604;26632:4;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26623:22;;:5;:22;;;:74;;26675:12;26694:1;26623:74;;;26654:1;26658:12;26623:74;26586:111;;;;26712:10;26743:1;26729:4;:11;:15;26725:1;:19;:39;;26761:3;26725:39;;;26747:4;26752:1;26756;26752:5;26747:11;;;;;;;;;;;;;;26725:39;26817:12;;;26827:1;26817:12;;;;;;;;;26779:51;;;;26712:52;;-1:-1:-1;26779:9:0;;;;;;:51;;26789:10;;26801;;26712:52;;26779:51;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26850:52;26867:4;26874:12;26888:13;26850:52;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;26925:13:0;;-1:-1:-1;;25859:3:0;;;;;-1:-1:-1;25829:1121:0;;-1:-1:-1;;;25829:1121:0;;;25670:1287;;;;:::o;37466:401::-;37545:4;37566:11;37562:55;;-1:-1:-1;37601:4:0;37594:11;;37562:55;37633:12;37639:5;37633;:12::i;:::-;37629:209;;;37662:28;;;;;:20;37668:4;37662:20;;;;:28;;37683:6;;37662:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37705:42;37736:2;37740:6;37705:30;:42::i;:::-;37629:209;;;37780:46;37808:5;37815:2;37819:6;37780:27;:46::i;:::-;-1:-1:-1;37855:4:0;37466:401;;;;;;:::o;37295:163::-;37369:4;37363:19;;;37390:6;37363:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;37417:32:0;;;;;:20;37423:4;37417:20;;-1:-1:-1;37417:20:0;;-1:-1:-1;37417:32:0;;-1:-1:-1;37438:2:0;;37442:6;;37417:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37410:40;;;;37295:163;;:::o;15449:129::-;15533:5;;;15528:16;;;;15520:50;;;;;;;;;;;;:::i;:::-;15449:129;;;;:::o;33399:308::-;33470:4;33491:12;33497:5;33491;:12::i;:::-;33487:191;;;33526:4;33520:19;;;33548:9;33520:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33487:191;;;33593:73;33625:5;33632:10;33652:4;33659:6;33593:31;:73::i;:::-;-1:-1:-1;33695:4:0;33399:308;;;;:::o;33971:572::-;34177:16;;;34191:1;34177:16;;;;;;;;;34121:18;;;;34177:16;;;;;;;;;;;;-1:-1:-1;34177:16:0;34152:41;;34215:4;34204:5;34210:1;34204:8;;;;;;;;:15;;;;:8;;;;;;;;;:15;34254:92;;;;;34230:21;;34271:7;34254:45;;;;:92;;34300:7;;34309;;34318:8;;34328:10;;34340:5;;34254:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34230:116;;34373:7;34381:1;34373:10;;;;;;;;;;;;;;34357:26;;34419:17;34402:13;:34;;34394:77;;;;;;;;;;;;:::i;:::-;34482:53;34494:7;34503:4;34509:13;34524:7;34532:1;34524:10;;;;;;;;;;;;;;34551:579;34668:60;34696:7;34705:4;34711:16;34668:27;:60::i;:::-;34739:20;34776:4;34739:42;;34792:14;34809:6;:13;;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34792:32;;34838:15;34855;34872:14;34901:6;34890:17;;:7;:17;;;:100;;34957:15;34979:1;34983:6;34890:100;;;34916:1;34920:15;34937:6;:13;;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35052:12;;;35062:1;35052:12;;;;;;;;;35001:64;;;;34837:153;;-1:-1:-1;34837:153:0;;-1:-1:-1;34837:153:0;-1:-1:-1;35001:11:0;;;;;;:64;;34837:153;;;;35045:4;;35001:64;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35083:39;35092:4;35098:15;35115:6;35083:39;;;;;;;;:::i;:::-;;;;;;;;34551:579;;;;;;;;;:::o;15313:128::-;15397:5;;;15392:16;;;;15384:49;;;;;;;;;;;;:::i;33715:248::-;33773:4;33794:12;33800:5;33794;:12::i;:::-;33790:166;;;33830:36;;;;;:21;33836:4;33830:21;;;;:36;;33860:4;;33830:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33823:43;;;;33790:166;33906:38;;;;;:23;;;;;;:38;;33938:4;;33906:38;;;:::i;33790:166::-;33715:248;;;:::o;36424:438::-;36663:90;;;;;36619:21;;36663:46;36680:7;36663:46;;;;:90;;36710:7;;36719;;36728:8;;36738;;36748:4;;36663:90;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36653:100;;36803:12;36772:7;36797:1;36780:7;:14;:18;36772:27;;;;;;;;;;;;;;:43;;36764:90;;;;;;;;;;;;:::i;:::-;36424:438;;;;;;;:::o;21419:778::-;21554:7;21538:13;21572:618;21593:4;:11;21589:1;:15;21572:618;;;21626:20;21663:4;21668:1;21663:7;;;;;;;;;;;;;;21626:45;;21686:14;21703:6;:13;;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21686:32;;21733:14;21750:7;21758:1;21762;21758:5;21750:14;;;;;;;;;;;;;;21733:31;;21780:15;21797;21814:14;21841:6;21832:15;;:5;:15;;;:86;;21891:9;21907:1;21911:6;21832:86;;;21856:1;21860:9;21871:6;:13;;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21779:139;;;;;;21933:10;21964:1;21950:4;:11;:15;21946:1;:19;:39;;21982:3;21946:39;;;21968:4;21973:1;21977;21973:5;21968:11;;;;;;;;;;;;;;21946:39;22058:12;;;22068:1;22058:12;;;;;;;;;22000:85;;;;21933:52;;-1:-1:-1;22000:11:0;;;;;;:85;;22030:10;;22042;;21933:52;;22000:85;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22105:44;22122:6;22131:9;22142:6;22105:44;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;22172:6:0;-1:-1:-1;;21606:3:0;;;;;-1:-1:-1;21572:618:0;;-1:-1:-1;;;21572:618:0;36870:417;37110:90;;;;;37066:21;;37110:45;37127:7;37110:45;;;;:90;;37156:7;;37165;;37174:8;;37184:9;;37195:4;;;;37110:90;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37100:100;;37233:11;37219:7;37227:1;37219:10;;;;;;;;;;;;;;:25;;37211:68;;;;;;;;;;;;:::i;:::-;36870:417;;;;;;;;:::o;8214:195::-;8322:12;;;8284;8322;;;;;;;;;8301:7;;;;8315:5;;8301:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8283:52;;;8354:7;8346:55;;;;;;;;;;;;:::i;:::-;8214:195;;;:::o;7435:361::-;7584:12;7598:17;7619:5;:10;;7653;7665:2;7669:5;7630:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7619:57;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7583:93;;;;7695:7;:57;;;;-1:-1:-1;7707:11:0;;:16;;:44;;;7738:4;7727:24;;;;;;;;;;;;:::i;:::-;7687:101;;;;;;;;;;;;:::i;37875:107::-;37953:20;;;16401:42;37953:20;37875:107;;;:::o;35138:1278::-;35292:19;35324:54;35352:7;35361:4;35367:10;35324:27;:54::i;:::-;35391:17;35437;35456:18;35476:23;35501:24;35527:14;35562:7;35545:53;;;35599:7;35608:4;35614:7;35545:77;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35434:188;;;;;;;;;;;35637:16;35656:49;35692:12;35663:7;35656:25;;;35682:4;35656:31;;;;;;;;;;;;;;;:::i;:49::-;35735:126;;;;;35637:68;;-1:-1:-1;35735:38:0;35752:7;35735:38;;;;:126;;35637:68;;35787:12;;35801:13;;35816:16;;35834:17;;35853:7;;35735:126;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35720:141;;35138:1278;;;;;;35883:18;35911:8;35904:26;;;35939:4;35904:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35883:62;;35957:15;35974;36018:4;36004:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35993:39;;:7;:39;;;:91;;36062:12;36081:1;35993:91;;;36041:1;36045:12;35993:91;36159:12;;;36169:1;36159:12;;;;;;;;;36095:77;;;;35956:128;;-1:-1:-1;35956:128:0;-1:-1:-1;36095:24:0;;;;;;:77;;35956:128;;;;36152:4;;36095:77;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36188:38;36197:4;36203:12;36217:8;36188:38;;;;;;;;:::i;:::-;;;;;;;;36256:60;36302:13;36263:8;36256:26;;;36291:4;36256:41;;;;;;;;;;;;;;;:::i;:60::-;36239:77;;36353:17;36335:14;:35;;36327:81;;;;;;;;;;;;:::i;:::-;35138:1278;;;;;;;;;;;:::o;18147:551::-;18385:12;18399;18445:91;18459:4;18465:6;18473;18481:14;18497;18513:10;18525;18445:13;:91::i;:::-;18424:112;;-1:-1:-1;18424:112:0;-1:-1:-1;18547:66:0;18579:6;18587:10;18599:4;18424:112;18547:31;:66::i;:::-;18624;18656:6;18664:10;18676:4;18682:7;18624:31;:66::i;:::-;18147:551;;;;;;;;;;:::o;16932:1207::-;17173:12;17187;17213:13;17228;17262:7;17245:37;;;17283:4;17289:6;17297;17245:59;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17212:92;;;;17319:8;17331:1;17319:13;:30;;;;-1:-1:-1;17336:13:0;;17319:30;17315:817;;;17388:14;;-1:-1:-1;17404:14:0;;-1:-1:-1;17315:817:0;;;17474:67;;;;;17452:19;;17474:31;17491:7;17474:31;;;;:67;;17506:14;;17522:8;;17532;;17474:67;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17452:89;;17578:14;17560;:32;17556:565;;17639:10;17621:14;:28;;17613:70;;;;;;;;;;;;:::i;:::-;17724:14;;-1:-1:-1;17740:14:0;-1:-1:-1;17740:14:0;17556:565;;;17818:67;;;;;17796:19;;17818:31;17835:7;17818:31;;;;:67;;17850:14;;17866:8;;17876;;17818:67;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17796:89;;17929:14;17911;:32;;17904:40;;;;17989:10;17971:14;:28;;17963:70;;;;;;;;;;;;:::i;:::-;18074:14;18090;;-1:-1:-1;16932:1207:0;;-1:-1:-1;;;;;;;;;;16932:1207:0:o;14:138:1:-;84:20;;113:33;84:20;113:33;:::i;157:404::-;;;290:3;283:4;275:6;271:17;267:27;257:2;;315:8;305;298:26;257:2;-1:-1:-1;345:20:1;;388:18;377:30;;374:2;;;427:8;417;410:26;374:2;471:4;463:6;459:17;447:29;;534:3;527:4;519;511:6;507:17;499:6;495:30;491:41;488:50;485:2;;;551:1;548;541:12;485:2;247:314;;;;;:::o;566:2147::-;;698:3;691:4;683:6;679:17;675:27;665:2;;720:5;713;706:20;665:2;760:6;747:20;786:4;810:65;825:49;871:2;825:49;:::i;:::-;810:65;:::i;:::-;909:15;;;940:12;;;;972:15;;;1005:5;1019:1665;1033:2;1030:1;1027:9;1019:1665;;;1113:3;1100:17;1092:6;1088:30;1158:3;1153:2;1149;1145:11;1141:21;1131:2;;1180:5;1173;1166:20;1131:2;1232;1228;1224:11;1211:25;1262:65;1277:49;1323:2;1277:49;:::i;1262:65::-;1353:5;1385:2;1378:5;1371:17;1421:2;1414:5;1410:14;1401:23;;1458:2;1454;1450:11;1513:3;1508:2;1500:4;1496:2;1492:13;1488:2;1484:22;1480:31;1477:40;1474:2;;;1534:5;1527;1520:20;1474:2;1566:5;1555:16;;1584:995;1600:2;1595:3;1592:11;1584:995;;;1681:4;1673:5;1668:3;1664:15;1660:26;1657:2;;;1703:5;1696;1689:20;1657:2;1748;1742:9;1798:4;1790:6;1786:17;1877:6;1865:10;1862:22;1841:18;1829:10;1826:34;1823:62;1820:2;;;1888:9;1820:2;1923;1916:22;1968:19;;2004:33;1968:19;2004:33;:::i;:::-;2054:21;;2116:36;2137:14;;;2116:36;:::i;:::-;2111:2;2103:6;2099:15;2092:61;2194:36;2226:2;2219:5;2215:14;2194:36;:::i;:::-;2189:2;2177:15;;2170:61;2296:2;2285:14;;;2272:28;2255:15;;;2248:53;2367:3;2356:15;;;2343:29;2325:16;;;2318:55;2439:3;2428:15;;;2415:29;2397:16;;;2390:55;2462:21;;1622:1;1613:11;;;;;2509:14;;;;2560:4;2549:16;1584:995;;;-1:-1:-1;2592:18:1;;-1:-1:-1;;;2630:12:1;;;;2662;;;;1051:1;1044:9;1019:1665;;;-1:-1:-1;2702:5:1;;655:2058;-1:-1:-1;;;;;;;655:2058:1:o;2718:158::-;2786:20;;2846:4;2835:16;;2825:27;;2815:2;;2866:1;2863;2856:12;2881:259;;2993:2;2981:9;2972:7;2968:23;2964:32;2961:2;;;3014:6;3006;2999:22;2961:2;3058:9;3045:23;3077:33;3104:5;3077:33;:::i;3145:263::-;;3268:2;3256:9;3247:7;3243:23;3239:32;3236:2;;;3289:6;3281;3274:22;3236:2;3326:9;3320:16;3345:33;3372:5;3345:33;:::i;3413:399::-;;;3553:2;3541:9;3532:7;3528:23;3524:32;3521:2;;;3574:6;3566;3559:22;3521:2;3611:9;3605:16;3630:33;3657:5;3630:33;:::i;:::-;3732:2;3717:18;;3711:25;3682:5;;-1:-1:-1;3745:35:1;3711:25;3745:35;:::i;:::-;3799:7;3789:17;;;3511:301;;;;;:::o;3817:965::-;;;;;;;;;4048:3;4036:9;4027:7;4023:23;4019:33;4016:2;;;4070:6;4062;4055:22;4016:2;4114:9;4101:23;4133:33;4160:5;4133:33;:::i;:::-;4185:5;-1:-1:-1;4242:2:1;4227:18;;4214:32;4255:35;4214:32;4255:35;:::i;:::-;4309:7;-1:-1:-1;4368:2:1;4353:18;;4340:32;4381:35;4340:32;4381:35;:::i;:::-;4435:7;-1:-1:-1;4489:2:1;4474:18;;4461:32;;-1:-1:-1;4540:3:1;4525:19;;4512:33;;-1:-1:-1;4592:3:1;4577:19;;4564:33;;-1:-1:-1;4649:3:1;4634:19;;4621:33;4663:35;4621:33;4663:35;:::i;:::-;4717:7;4707:17;;;4771:3;4760:9;4756:19;4743:33;4733:43;;4006:776;;;;;;;;;;;:::o;4787:1318::-;;;;;;;;;;;;;5083:3;5071:9;5062:7;5058:23;5054:33;5051:2;;;5105:6;5097;5090:22;5051:2;5149:9;5136:23;5168:33;5195:5;5168:33;:::i;:::-;5220:5;-1:-1:-1;5277:2:1;5262:18;;5249:32;5290:35;5249:32;5290:35;:::i;:::-;5344:7;-1:-1:-1;5403:2:1;5388:18;;5375:32;5416:35;5375:32;5416:35;:::i;:::-;5470:7;-1:-1:-1;5524:2:1;5509:18;;5496:32;;-1:-1:-1;5575:3:1;5560:19;;5547:33;;-1:-1:-1;5627:3:1;5612:19;;5599:33;;-1:-1:-1;5684:3:1;5669:19;;5656:33;5698:35;5656:33;5698:35;:::i;:::-;5752:7;-1:-1:-1;5806:3:1;5791:19;;5778:33;;-1:-1:-1;5863:3:1;5848:19;;5835:33;5877:32;5835:33;5877:32;:::i;:::-;5928:7;-1:-1:-1;5954:39:1;5988:3;5973:19;;5954:39;:::i;:::-;5944:49;;6041:3;6030:9;6026:19;6013:33;6002:44;;6094:3;6083:9;6079:19;6066:33;6055:44;;5041:1064;;;;;;;;;;;;;;:::o;6110:1034::-;;;;;;;;;;6358:3;6346:9;6337:7;6333:23;6329:33;6326:2;;;6380:6;6372;6365:22;6326:2;6424:9;6411:23;6443:33;6470:5;6443:33;:::i;:::-;6495:5;-1:-1:-1;6552:2:1;6537:18;;6524:32;6565:35;6524:32;6565:35;:::i;:::-;6619:7;-1:-1:-1;6678:2:1;6663:18;;6650:32;6691:35;6650:32;6691:35;:::i;:::-;6745:7;-1:-1:-1;6799:2:1;6784:18;;6771:32;;-1:-1:-1;6850:3:1;6835:19;;6822:33;;-1:-1:-1;6902:3:1;6887:19;;6874:33;;-1:-1:-1;6954:3:1;6939:19;;6926:33;;-1:-1:-1;7011:3:1;6996:19;;6983:33;7025:35;6983:33;7025:35;:::i;:::-;7079:7;7069:17;;;7133:3;7122:9;7118:19;7105:33;7095:43;;6316:828;;;;;;;;;;;:::o;7149:1094::-;;;;;;;;;7398:3;7386:9;7377:7;7373:23;7369:33;7366:2;;;7420:6;7412;7405:22;7366:2;7464:9;7451:23;7483:33;7510:5;7483:33;:::i;:::-;7535:5;-1:-1:-1;7592:2:1;7577:18;;7564:32;7605:35;7564:32;7605:35;:::i;:::-;7659:7;-1:-1:-1;7713:2:1;7698:18;;7685:32;;-1:-1:-1;7764:2:1;7749:18;;7736:32;;-1:-1:-1;7819:3:1;7804:19;;7791:33;7847:18;7836:30;;7833:2;;;7884:6;7876;7869:22;7833:2;7928:76;7996:7;7987:6;7976:9;7972:22;7928:76;:::i;:::-;8023:8;;-1:-1:-1;7902:102:1;-1:-1:-1;;8110:3:1;8095:19;;8082:33;8124:35;8082:33;8124:35;:::i;:::-;8178:7;8168:17;;;8232:3;8221:9;8217:19;8204:33;8194:43;;7356:887;;;;;;;;;;;:::o;8248:1600::-;;;;;;;;8487:3;8475:9;8466:7;8462:23;8458:33;8455:2;;;8509:6;8501;8494:22;8455:2;8553:9;8540:23;8572:33;8599:5;8572:33;:::i;:::-;8624:5;-1:-1:-1;8648:2:1;8687:18;;;8674:32;8715:35;8674:32;8715:35;:::i;:::-;8769:7;-1:-1:-1;8823:2:1;8808:18;;8795:32;;-1:-1:-1;8874:2:1;8859:18;;8846:32;;-1:-1:-1;8929:3:1;8914:19;;8901:33;8957:18;8946:30;;8943:2;;;8994:6;8986;8979:22;8943:2;9022:22;;9075:4;9067:13;;9063:27;-1:-1:-1;9053:2:1;;9109:6;9101;9094:22;9053:2;9150;9137:16;9173:65;9188:49;9234:2;9188:49;:::i;9173:65::-;9272:15;;;9303:12;;;;9335:11;;;9373;;;9365:20;;9361:29;;9358:42;-1:-1:-1;9355:2:1;;;9418:6;9410;9403:22;9355:2;9445:6;9436:15;;9460:246;9474:2;9471:1;9468:9;9460:246;;;9547:3;9534:17;9564:35;9591:7;9564:35;:::i;:::-;9612:20;;9492:1;9485:9;;;;;9652:12;;;;9684;;9460:246;;;9464:3;9725:5;9715:15;;;;;;;9749:41;9785:3;9774:9;9770:19;9749:41;:::i;:::-;9739:51;;9837:3;9826:9;9822:19;9809:33;9799:43;;8445:1403;;;;;;;;;;:::o;9853:821::-;;;;;;;;10067:3;10055:9;10046:7;10042:23;10038:33;10035:2;;;10089:6;10081;10074:22;10035:2;10133:9;10120:23;10152:33;10179:5;10152:33;:::i;:::-;10204:5;-1:-1:-1;10261:2:1;10246:18;;10233:32;10274:35;10233:32;10274:35;:::i;:::-;10328:7;-1:-1:-1;10382:2:1;10367:18;;10354:32;;-1:-1:-1;10433:2:1;10418:18;;10405:32;;-1:-1:-1;10484:3:1;10469:19;;10456:33;;-1:-1:-1;10541:3:1;10526:19;;10513:33;10555:35;10513:33;10555:35;:::i;:::-;10609:7;10599:17;;;10663:3;10652:9;10648:19;10635:33;10625:43;;10025:649;;;;;;;;;;:::o;10679:1172::-;;;;;;;;;;;;10957:3;10945:9;10936:7;10932:23;10928:33;10925:2;;;10979:6;10971;10964:22;10925:2;11023:9;11010:23;11042:33;11069:5;11042:33;:::i;:::-;11094:5;-1:-1:-1;11151:2:1;11136:18;;11123:32;11164:35;11123:32;11164:35;:::i;:::-;11218:7;-1:-1:-1;11272:2:1;11257:18;;11244:32;;-1:-1:-1;11323:2:1;11308:18;;11295:32;;-1:-1:-1;11374:3:1;11359:19;;11346:33;;-1:-1:-1;11431:3:1;11416:19;;11403:33;11445:35;11403:33;11445:35;:::i;:::-;11499:7;-1:-1:-1;11553:3:1;11538:19;;11525:33;;-1:-1:-1;11610:3:1;11595:19;;11582:33;11624:32;11582:33;11624:32;:::i;:::-;11675:7;-1:-1:-1;11701:39:1;11735:3;11720:19;;11701:39;:::i;:::-;11691:49;;11787:3;11776:9;11772:19;11759:33;11749:43;;11840:3;11829:9;11825:19;11812:33;11801:44;;10915:936;;;;;;;;;;;;;;:::o;11856:967::-;;;;;;;;12068:3;12056:9;12047:7;12043:23;12039:33;12036:2;;;12090:6;12082;12075:22;12036:2;12134:9;12121:23;12153:33;12180:5;12153:33;:::i;:::-;12205:5;-1:-1:-1;12262:2:1;12247:18;;12234:32;12275:35;12234:32;12275:35;:::i;:::-;12329:7;-1:-1:-1;12383:2:1;12368:18;;12355:32;;-1:-1:-1;12434:2:1;12419:18;;12406:32;;-1:-1:-1;12490:3:1;12475:19;;12462:33;12504:34;12462:33;12504:34;:::i;:::-;12557:7;-1:-1:-1;12616:3:1;12601:19;;12588:33;12630:34;12588:33;12630:34;:::i;:::-;12683:7;-1:-1:-1;12742:3:1;12727:19;;12714:33;12756:35;12714:33;12756:35;:::i;:::-;12810:7;12800:17;;;12026:797;;;;;;;;;;:::o;12828:881::-;;;;;;;13043:3;13031:9;13022:7;13018:23;13014:33;13011:2;;;13065:6;13057;13050:22;13011:2;13109:9;13096:23;13128:33;13155:5;13128:33;:::i;:::-;13180:5;-1:-1:-1;13232:2:1;13217:18;;13204:32;;-1:-1:-1;13287:2:1;13272:18;;13259:32;13314:18;13303:30;;13300:2;;;13351:6;13343;13336:22;13300:2;13395:76;13463:7;13454:6;13443:9;13439:22;13395:76;:::i;:::-;13490:8;;-1:-1:-1;13369:102:1;-1:-1:-1;;13577:2:1;13562:18;;13549:32;13590:35;13549:32;13590:35;:::i;:::-;13644:7;13634:17;;;13698:3;13687:9;13683:19;13670:33;13660:43;;13001:708;;;;;;;;:::o;13714:950::-;;;;;;;;13946:3;13934:9;13925:7;13921:23;13917:33;13914:2;;;13968:6;13960;13953:22;13914:2;14012:9;13999:23;14031:33;14058:5;14031:33;:::i;:::-;14083:5;-1:-1:-1;14135:2:1;14120:18;;14107:32;;-1:-1:-1;14186:2:1;14171:18;;14158:32;;-1:-1:-1;14241:2:1;14226:18;;14213:32;14268:18;14257:30;;14254:2;;;14305:6;14297;14290:22;14254:2;14349:76;14417:7;14408:6;14397:9;14393:22;14349:76;:::i;:::-;14444:8;;-1:-1:-1;14323:102:1;-1:-1:-1;;14531:3:1;14516:19;;14503:33;14545:35;14503:33;14545:35;:::i;:::-;14599:7;14589:17;;;14653:3;14642:9;14638:19;14625:33;14615:43;;13904:760;;;;;;;;;;:::o;14669:790::-;;;;;;;14874:3;14862:9;14853:7;14849:23;14845:33;14842:2;;;14896:6;14888;14881:22;14842:2;14933:9;14927:16;14952:33;14979:5;14952:33;:::i;:::-;15004:5;14994:15;;;15049:2;15038:9;15034:18;15028:25;15018:35;;15093:2;15082:9;15078:18;15072:25;15062:35;;15142:2;15131:9;15127:18;15121:25;15155:34;15181:7;15155:34;:::i;:::-;15260:3;15245:19;;15239:26;15208:7;;-1:-1:-1;15274:34:1;15239:26;15274:34;:::i;:::-;15379:3;15364:19;;15358:26;15327:7;;-1:-1:-1;15393:34:1;15358:26;15393:34;:::i;:::-;15446:7;15436:17;;;14832:627;;;;;;;;:::o;15464:754::-;;;;;;15642:3;15630:9;15621:7;15617:23;15613:33;15610:2;;;15664:6;15656;15649:22;15610:2;15708:9;15695:23;15727:33;15754:5;15727:33;:::i;:::-;15779:5;-1:-1:-1;15831:2:1;15816:18;;15803:32;;-1:-1:-1;15887:2:1;15872:18;;15859:32;15900:34;15859:32;15900:34;:::i;:::-;15953:7;-1:-1:-1;16012:2:1;15997:18;;15984:32;16025:34;15984:32;16025:34;:::i;:::-;16078:7;-1:-1:-1;16137:3:1;16122:19;;16109:33;16151:35;16109:33;16151:35;:::i;:::-;16205:7;16195:17;;;15600:618;;;;;;;;:::o;16223:857::-;;;;;;16474:3;16462:9;16453:7;16449:23;16445:33;16442:2;;;16496:6;16488;16481:22;16442:2;16541:9;16528:23;16574:18;16566:6;16563:30;16560:2;;;16611:6;16603;16596:22;16560:2;16639:86;16717:7;16708:6;16697:9;16693:22;16639:86;:::i;:::-;16629:96;;;16775:2;16764:9;16760:18;16747:32;16788:33;16815:5;16788:33;:::i;:::-;16840:5;-1:-1:-1;16897:2:1;16882:18;;16869:32;16910:35;16869:32;16910:35;:::i;:::-;16432:648;;;;-1:-1:-1;16964:7:1;;17018:2;17003:18;;16990:32;;-1:-1:-1;17069:3:1;17054:19;17041:33;;16432:648;-1:-1:-1;;16432:648:1:o;17085:926::-;;;;;;;17353:3;17341:9;17332:7;17328:23;17324:33;17321:2;;;17375:6;17367;17360:22;17321:2;17420:9;17407:23;17453:18;17445:6;17442:30;17439:2;;;17490:6;17482;17475:22;17439:2;17518:86;17596:7;17587:6;17576:9;17572:22;17518:86;:::i;:::-;17508:96;;;17654:2;17643:9;17639:18;17626:32;17667:33;17694:5;17667:33;:::i;:::-;17719:5;-1:-1:-1;17776:2:1;17761:18;;17748:32;17789:35;17748:32;17789:35;:::i;:::-;17311:700;;;;-1:-1:-1;17843:7:1;;17897:2;17882:18;;17869:32;;-1:-1:-1;17948:3:1;17933:19;;17920:33;;18000:3;17985:19;;;17972:33;;-1:-1:-1;17311:700:1;-1:-1:-1;;17311:700:1:o;18016:943::-;;18142:2;18185;18173:9;18164:7;18160:23;18156:32;18153:2;;;18206:6;18198;18191:22;18153:2;18244:9;18238:16;18277:18;18269:6;18266:30;18263:2;;;18314:6;18306;18299:22;18263:2;18342:22;;18395:4;18387:13;;18383:27;-1:-1:-1;18373:2:1;;18429:6;18421;18414:22;18373:2;18463;18457:9;18486:65;18501:49;18547:2;18501:49;:::i;18486:65::-;18585:15;;;18616:12;;;;18648:11;;;18686;;;18678:20;;18674:29;;18671:42;-1:-1:-1;18668:2:1;;;18731:6;18723;18716:22;18668:2;18758:6;18749:15;;18773:156;18787:2;18784:1;18781:9;18773:156;;;18844:10;;18832:23;;18805:1;18798:9;;;;;18875:12;;;;18907;;18773:156;;18964:257;;19084:2;19072:9;19063:7;19059:23;19055:32;19052:2;;;19105:6;19097;19090:22;19052:2;19142:9;19136:16;19161:30;19185:5;19161:30;:::i;19226:194::-;;19349:2;19337:9;19328:7;19324:23;19320:32;19317:2;;;19370:6;19362;19355:22;19317:2;-1:-1:-1;19398:16:1;;19307:113;-1:-1:-1;19307:113:1:o;19425:255::-;;;19565:2;19553:9;19544:7;19540:23;19536:32;19533:2;;;19586:6;19578;19571:22;19533:2;-1:-1:-1;;19614:16:1;;19670:2;19655:18;;;19649:25;19614:16;;19649:25;;-1:-1:-1;19523:157:1:o;19685:318::-;;19766:5;19760:12;19793:6;19788:3;19781:19;19809:63;19865:6;19858:4;19853:3;19849:14;19842:4;19835:5;19831:16;19809:63;:::i;:::-;19917:2;19905:15;19922:66;19901:88;19892:98;;;;19992:4;19888:109;;19736:267;-1:-1:-1;;19736:267:1:o;20008:274::-;;20175:6;20169:13;20191:53;20237:6;20232:3;20225:4;20217:6;20213:17;20191:53;:::i;:::-;20260:16;;;;;20145:137;-1:-1:-1;;20145:137:1:o;20287:226::-;20463:42;20451:55;;;;20433:74;;20421:2;20406:18;;20388:125::o;20757:709::-;21094:42;21163:15;;;21145:34;;21215:15;;;;21210:2;21195:18;;21188:43;21262:2;21247:18;;21240:34;;;;21305:2;21290:18;;21283:34;;;;21366:4;21354:17;21348:3;21333:19;;21326:46;21403:3;21388:19;;21381:35;21447:3;21432:19;;21425:35;;;;21071:3;21056:19;;21038:428::o;21471:406::-;21691:42;21760:15;;;21742:34;;21812:15;;;;21807:2;21792:18;;21785:43;21859:2;21844:18;;21837:34;;;;21669:2;21654:18;;21636:241::o;21882:327::-;22066:42;22135:15;;;22117:34;;22187:15;;22182:2;22167:18;;22160:43;22044:2;22029:18;;22011:198::o;22214:407::-;22426:42;22495:15;;;22477:34;;22547:15;;;22542:2;22527:18;;22520:43;22599:15;;;22594:2;22579:18;;22572:43;22404:2;22389:18;;22371:250::o;22626:1069::-;;22938:3;22927:9;22923:19;22961:42;23042:2;23034:6;23030:15;23019:9;23012:34;23065:2;23115;23107:6;23103:15;23098:2;23087:9;23083:18;23076:43;23167:2;23159:6;23155:15;23150:2;23139:9;23135:18;23128:43;23207:6;23202:2;23191:9;23187:18;23180:34;23251:3;23245;23234:9;23230:19;23223:32;23275:6;23305;23297;23290:22;23343:3;23332:9;23328:19;23321:26;;23370:6;23356:20;;23394:4;23407:262;23421:6;23418:1;23415:13;23407:262;;;23496:6;23483:20;23516:33;23543:5;23516:33;:::i;:::-;23574:14;;23562:27;;23644:15;;;;23609:12;;;;23443:1;23436:9;23407:262;;;-1:-1:-1;23686:3:1;22899:796;-1:-1:-1;;;;;;;;;;;22899:796:1:o;23700:1020::-;;24002:3;23991:9;23987:19;24025:42;24106:2;24098:6;24094:15;24083:9;24076:34;24129:2;24179;24171:6;24167:15;24162:2;24151:9;24147:18;24140:43;24231:2;24223:6;24219:15;24214:2;24203:9;24199:18;24192:43;24271:6;24266:2;24255:9;24251:18;24244:34;24315:3;24309;24298:9;24294:19;24287:32;24339:6;24374;24368:13;24405:6;24397;24390:22;24443:3;24432:9;24428:19;24421:26;;24482:2;24474:6;24470:15;24456:29;;24503:4;24516:178;24530:6;24527:1;24524:13;24516:178;;;24595:13;;24591:22;;24579:35;;24669:15;;;;24634:12;;;;24552:1;24545:9;24516:178;;;-1:-1:-1;24711:3:1;;23963:757;-1:-1:-1;;;;;;;;;;;23963:757:1:o;25128:513::-;25365:42;25434:15;;;25416:34;;25486:15;;;;25481:2;25466:18;;25459:43;25521:10;25567:15;;;25562:2;25547:18;;25540:43;25619:15;;;25614:2;25599:18;;25592:43;25342:3;25327:19;;25309:332::o;25646:297::-;25850:42;25838:55;;;;25820:74;;25925:2;25910:18;;25903:34;25808:2;25793:18;;25775:168::o;25948:398::-;26160:42;26229:15;;;26211:34;;26276:2;26261:18;;26254:34;;;;26324:15;;;26319:2;26304:18;;26297:43;26138:2;26123:18;;26105:241::o;26351:635::-;26522:2;26574:21;;;26644:13;;26547:18;;;26666:22;;;26351:635;;26522:2;26745:15;;;;26719:2;26704:18;;;26351:635;26791:169;26805:6;26802:1;26799:13;26791:169;;;26866:13;;26854:26;;26935:15;;;;26900:12;;;;26827:1;26820:9;26791:169;;;-1:-1:-1;26977:3:1;;26502:484;-1:-1:-1;;;;;;26502:484:1:o;26991:345::-;27193:2;27175:21;;;27232:2;27212:18;;;27205:30;27271:23;27266:2;27251:18;;27244:51;27327:2;27312:18;;27165:171::o;27341:355::-;27543:2;27525:21;;;27582:2;27562:18;;;27555:30;27621:33;27616:2;27601:18;;27594:61;27687:2;27672:18;;27515:181::o;27701:342::-;27903:2;27885:21;;;27942:2;27922:18;;;27915:30;27981:20;27976:2;27961:18;;27954:48;28034:2;28019:18;;27875:168::o;28048:354::-;28250:2;28232:21;;;28289:2;28269:18;;;28262:30;28328:32;28323:2;28308:18;;28301:60;28393:2;28378:18;;28222:180::o;28407:353::-;28609:2;28591:21;;;28648:2;28628:18;;;28621:30;28687:31;28682:2;28667:18;;28660:59;28751:2;28736:18;;28581:179::o;28765:344::-;28967:2;28949:21;;;29006:2;28986:18;;;28979:30;29045:22;29040:2;29025:18;;29018:50;29100:2;29085:18;;28939:170::o;29114:353::-;29316:2;29298:21;;;29355:2;29335:18;;;29328:30;29394:31;29389:2;29374:18;;29367:59;29458:2;29443:18;;29288:179::o;29472:337::-;29674:2;29656:21;;;29713:2;29693:18;;;29686:30;29752:15;29747:2;29732:18;;29725:43;29800:2;29785:18;;29646:163::o;29814:336::-;30016:2;29998:21;;;30055:2;30035:18;;;30028:30;30094:14;30089:2;30074:18;;30067:42;30141:2;30126:18;;29988:162::o;30155:339::-;30357:2;30339:21;;;30396:2;30376:18;;;30369:30;30435:17;30430:2;30415:18;;30408:45;30485:2;30470:18;;30329:165::o;30499:398::-;30701:2;30683:21;;;30740:2;30720:18;;;30713:30;30779:34;30774:2;30759:18;;30752:62;30850:4;30845:2;30830:18;;30823:32;30887:3;30872:19;;30673:224::o;30902:399::-;31104:2;31086:21;;;31143:2;31123:18;;;31116:30;31182:34;31177:2;31162:18;;31155:62;31253:5;31248:2;31233:18;;31226:33;31291:3;31276:19;;31076:225::o;31306:400::-;31508:2;31490:21;;;31547:2;31527:18;;;31520:30;31586:34;31581:2;31566:18;;31559:62;31657:6;31652:2;31637:18;;31630:34;31696:3;31681:19;;31480:226::o;31711:344::-;31913:2;31895:21;;;31952:2;31932:18;;;31925:30;31991:22;31986:2;31971:18;;31964:50;32046:2;32031:18;;31885:170::o;32060:177::-;32206:25;;;32194:2;32179:18;;32161:76::o;32242:248::-;32416:25;;;32472:2;32457:18;;32450:34;32404:2;32389:18;;32371:119::o;32495:491::-;;32734:6;32723:9;32716:25;32777:6;32772:2;32761:9;32757:18;32750:34;32832:42;32824:6;32820:55;32815:2;32804:9;32800:18;32793:83;32912:3;32907:2;32896:9;32892:18;32885:31;32933:47;32975:3;32964:9;32960:19;32952:6;32933:47;:::i;33479:319::-;33681:25;;;33737:2;33722:18;;33715:34;;;;33780:2;33765:18;;33758:34;33669:2;33654:18;;33636:162::o;33803:585::-;34084:25;;;34140:2;34125:18;;34118:34;;;;34183:2;34168:18;;34161:34;;;;34214:10;34260:15;;;34255:2;34240:18;;34233:43;34313:15;;;34307:3;34292:19;;34285:44;34366:15;34360:3;34345:19;;34338:44;34071:3;34056:19;;34038:350::o;34393:242::-;34463:2;34457:9;34493:17;;;34540:18;34525:34;;34561:22;;;34522:62;34519:2;;;34587:9;34519:2;34614;34607:22;34437:198;;-1:-1:-1;34437:198:1:o;34640:183::-;;34739:18;34731:6;34728:30;34725:2;;;34761:9;34725:2;-1:-1:-1;34812:4:1;34793:17;;;34789:28;;34715:108::o;34828:258::-;34900:1;34910:113;34924:6;34921:1;34918:13;34910:113;;;35000:11;;;34994:18;34981:11;;;34974:39;34946:2;34939:10;34910:113;;;35041:6;35038:1;35035:13;35032:2;;;35076:1;35067:6;35062:3;35058:16;35051:27;35032:2;;34881:205;;;:::o;35091:156::-;35179:42;35172:5;35168:54;35161:5;35158:65;35148:2;;35237:1;35234;35227:12;35148:2;35138:109;:::o;35252:120::-;35340:5;35333:13;35326:21;35319:5;35316:32;35306:2;;35362:1;35359;35352:12;35377:123;35464:10;35457:5;35453:22;35446:5;35443:33;35433:2;;35490:1;35487;35480:12

Swarm Source

ipfs://682ddcc249b1d59d570500c4070f4335f3e66f21cc08e2c04a152e032c26ef0a
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.