Contract 0x12edea9cd262006cc3c4e77c90d2cd2dd4b1eb97 1

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x2b26697456d1852cbaf41498ceedf3148e3b138b1eb13016d511f168fa5200a1Approve633775332023-05-31 17:07:162 hrs 27 mins ago0xabf9027403c8dabfc612e357624fc5c015ba7133 IN  Stargate Finance: S*USDC Token0 FTM0.01074924455
0x2898b7bcb24e5553c11c66ad6355a3bfb04eca84c501f13c6f5d4934e56f4eeeApprove633740882023-05-31 15:08:304 hrs 26 mins ago0x16a368cc5685ea668fa63a935969abad473cfab6 IN  Stargate Finance: S*USDC Token0 FTM0.002905633998
0x6946c57e31139070dbf98e33cf491fe690d1d1e2900b1ce777e21184e957bdcaApprove633735292023-05-31 14:49:054 hrs 45 mins ago0x7e685924323ca13814c9d2a7c7c39f9f8e7e13d8 IN  Stargate Finance: S*USDC Token0 FTM0.003830866577
0xa4c9cd5ee1ae14ad87232f55a2b9af6b95df3bd82c02ca00f5d2a26367edb6daApprove633715662023-05-31 13:40:185 hrs 54 mins ago0x56a00daa8ec50ca867cb1c68601b96bf1a84c540 IN  Stargate Finance: S*USDC Token0 FTM0.001826247054
0x3d16a0ac1df86bf533ab27853ea197f72cd11640f9171d4ff1f9e435beace1a8Approve633715622023-05-31 13:40:105 hrs 54 mins ago0x56a00daa8ec50ca867cb1c68601b96bf1a84c540 IN  Stargate Finance: S*USDC Token0 FTM0.001826247054
0x7d46518d50696a0aab5d26cb881649bba140a1ae59d8f9be9026b75c655a9667Approve633712652023-05-31 13:29:576 hrs 4 mins ago0x56a00daa8ec50ca867cb1c68601b96bf1a84c540 IN  Stargate Finance: S*USDC Token0 FTM0.00614385615
0xa21ba265748a351c0ed628580081390837de7e159d05400b07fbbce95570eef0Approve633711722023-05-31 13:26:306 hrs 8 mins ago0x56a00daa8ec50ca867cb1c68601b96bf1a84c540 IN  Stargate Finance: S*USDC Token0 FTM0.003981511303
0x8fb4403a0c0e628e0f1aae04be780e6261aaa5d55be4ab5ada3eefdd38dee582Approve633375742023-05-30 19:07:321 day 27 mins ago0x26800ce9ca21e51d9a1fca43d83deeae1bbc4c0a IN  Stargate Finance: S*USDC Token0 FTM0.048695549443
0xc1480ff0cde13b29b277917f22efd065316d1bd624fabb27f19a3d71900c9b23Approve633367222023-05-30 18:36:391 day 58 mins ago0xd3ae5bbfa65da38052783d99e93d969950477c0f IN  Stargate Finance: S*USDC Token0 FTM0.029237973956
0x776a4b1620fc6b2d80342a47266e147cdcde4a4cfa63835b0f0ed33e85f52befApprove633364242023-05-30 18:24:501 day 1 hr ago0xcc2927f894d5257fcfb5ff8554a3930d1db26425 IN  Stargate Finance: S*USDC Token0 FTM0.046876376875
0xace261f8ac6fc637c3cf33fdb2aa005266aa19f5dac6379e7d9828ca5ce39c30Approve633364182023-05-30 18:24:341 day 1 hr ago0xdd4f19a7bdbbbb3d2dcd0bc5e61c2f67acae525c IN  Stargate Finance: S*USDC Token0 FTM0.046875878661
0x436be39c927b8a01483a03b67c468a3fff8deb575592bff40e8d8ca8c1aa18aaApprove633364172023-05-30 18:24:331 day 1 hr ago0x8d647ba6602bc2b7ab8b28e401dc86ae889f7dac IN  Stargate Finance: S*USDC Token0 FTM0.046875878661
0x524c64456e5343916c77e1d15877315d821b0b25ccfbd087a8591a64669b12f3Approve633364092023-05-30 18:24:191 day 1 hr ago0x760df50723051d301d39dfbc9113cba0654f303c IN  Stargate Finance: S*USDC Token0 FTM0.046875878661
0x2334a9ffcb52124ddbd06b313cf3c160a5ac956038ab326af99537b2913fc30dApprove633363832023-05-30 18:23:211 day 1 hr ago0x598247799b1a94520e9595f38f76bdcf48917d72 IN  Stargate Finance: S*USDC Token0 FTM0.046877197305
0xc78855232c9ce4cbfdd38e422d742d794dd07fab1c729d70b63dd207c7d6ca0bApprove633361752023-05-30 18:15:091 day 1 hr ago0xb179635c78316abdfe9486f179fd3337a3e64449 IN  Stargate Finance: S*USDC Token0 FTM0.047270742035
0xbb3cd41a692e4a7ea0086979fd475284659e06a436e85ac2f6c2ab609d89290eApprove633361222023-05-30 18:12:211 day 1 hr ago0x69c7c683cc0732b539174d292922ad76dc00658f IN  Stargate Finance: S*USDC Token0 FTM0.047244421567
0x491ab79f52da390b77798d2e5ee315381268bd31ee2b53f7395ec7093aa2a7a0Approve633340872023-05-30 16:53:541 day 2 hrs ago0xaa6c8a87d0241b2d2528e3cfee86f55e705cf176 IN  Stargate Finance: S*USDC Token0 FTM0.052228938248
0x119e4dc3c3a071b9960409c9548127e65e91e1979721ca6f21f069d610a2c4d3Approve633340102023-05-30 16:50:501 day 2 hrs ago0xd236f78a7b3b2a311248301908a2d6319199929e IN  Stargate Finance: S*USDC Token0 FTM0.052229127991
0x82e95da105a6c67cff5ea31aebf3475fba9d7947b42974ed80e44149c7717f63Approve633331152023-05-30 16:18:391 day 3 hrs ago0x932fb4fcfd19420f19aadb6d9cb869783a6e1c15 IN  Stargate Finance: S*USDC Token0 FTM0.053743072445
0x399e5774b4e3943d579e79fe811cde7dfd12bd72e0a7090a27cdd5d341b5d718Approve633331132023-05-30 16:18:351 day 3 hrs ago0xc31fa5a22682701ebb2436c75a61b66a05c0c6e3 IN  Stargate Finance: S*USDC Token0 FTM0.053743072445
0x6897a5c197b22ca35f06058bd40d21641af6170bd4c5545494d3833c53d2bc68Approve633331132023-05-30 16:18:351 day 3 hrs ago0xecafd157c985200107b31b53e940ee7de920777d IN  Stargate Finance: S*USDC Token0 FTM0.053743072445
0x43e60185b96de507b01cfd45cc42b7ec0d85c60ababf7e56531c67cccb6e4124Approve633330902023-05-30 16:17:451 day 3 hrs ago0xce8d9f7ef134fce413e9bd9ade17a2f6e826a4a9 IN  Stargate Finance: S*USDC Token0 FTM0.053694364468
0x07da8ce0d4a2a21353c0b7076805163b1ef776be295e938b4385f23fc5b72a63Approve633330902023-05-30 16:17:451 day 3 hrs ago0xf9c9fd10d8a3cd98e713ac426370f00892984bfb IN  Stargate Finance: S*USDC Token0 FTM0.053694364468
0x6274fc5915e25df10c2cef2f949217185e997cd21394cbf7bbfde648a77a89a6Approve633330852023-05-30 16:17:371 day 3 hrs ago0xcaaea031f82f6c34b93d23f32ad93d197b1913b4 IN  Stargate Finance: S*USDC Token0 FTM0.053694364468
0x615c72eb13be5a807133f62ab0a50bcb75b04146d6dac7875100dad8e08527d1Approve633328332023-05-30 16:08:101 day 3 hrs ago0xf3d4d8061b913d4282fa1015af2a1be47da64fa1 IN  Stargate Finance: S*USDC Token0 FTM0.050691294569
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0x30f9b8519a7579a329f383e44256d4d95dfa8c24a4507726f6e6e3ff7b902e4f336471952022-03-17 7:53:27440 days 11 hrs ago Stargate Finance: Factory  Contract Creation0 FTM
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Pool

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 5 of 7: Pool.sol
// SPDX-License-Identifier: BUSL-1.1

pragma solidity 0.7.6;
pragma abicoder v2;

// imports
import "./Ownable.sol";
import "./ReentrancyGuard.sol";
import "./LPTokenERC20.sol";
import "./IStargateFeeLibrary.sol";

// libraries
import "./SafeMath.sol";

/// Pool contracts on other chains and managed by the Stargate protocol.
contract Pool is LPTokenERC20, ReentrancyGuard {
    using SafeMath for uint256;

    //---------------------------------------------------------------------------
    // CONSTANTS
    bytes4 private constant SELECTOR = bytes4(keccak256(bytes("transfer(address,uint256)")));
    uint256 public constant BP_DENOMINATOR = 10000;

    //---------------------------------------------------------------------------
    // STRUCTS
    struct ChainPath {
        bool ready; // indicate if the counter chainPath has been created.
        uint16 dstChainId;
        uint256 dstPoolId;
        uint256 weight;
        uint256 balance;
        uint256 lkb;
        uint256 credits;
        uint256 idealBalance;
    }

    struct SwapObj {
        uint256 amount;
        uint256 eqFee;
        uint256 eqReward;
        uint256 lpFee;
        uint256 protocolFee;
        uint256 lkbRemove;
    }

    struct CreditObj {
        uint256 credits;
        uint256 idealBalance;
    }

    //---------------------------------------------------------------------------
    // VARIABLES

    // chainPath
    ChainPath[] public chainPaths; // list of connected chains with shared pools
    mapping(uint16 => mapping(uint256 => uint256)) public chainPathIndexLookup; // lookup for chainPath by chainId => poolId =>index

    // metadata
    uint256 public immutable poolId; // shared id between chains to represent same pool
    uint256 public sharedDecimals; // the shared decimals (lowest common decimals between chains)
    uint256 public localDecimals; // the decimals for the token
    uint256 public immutable convertRate; // the decimals for the token
    address public immutable token; // the token for the pool
    address public immutable router; // the token for the pool

    bool public stopSwap; // flag to stop swapping in extreme cases

    // Fee and Liquidity
    uint256 public totalLiquidity; // the total amount of tokens added on this side of the chain (fees + deposits - withdrawals)
    uint256 public totalWeight; // total weight for pool percentages
    uint256 public mintFeeBP; // fee basis points for the mint/deposit
    uint256 public protocolFeeBalance; // fee balance created from dao fee
    uint256 public mintFeeBalance; // fee balance created from mint fee
    uint256 public eqFeePool; // pool rewards in Shared Decimal format. indicate the total budget for reverse swap incentive
    address public feeLibrary; // address for retrieving fee params for swaps

    // Delta related
    uint256 public deltaCredit; // credits accumulated from txn
    bool public batched; // flag to indicate if we want batch processing.
    bool public defaultSwapMode; // flag for the default mode for swap
    bool public defaultLPMode; // flag for the default mode for lp
    uint256 public swapDeltaBP; // basis points of poolCredits to activate Delta in swap
    uint256 public lpDeltaBP; // basis points of poolCredits to activate Delta in liquidity events

    //---------------------------------------------------------------------------
    // EVENTS
    event Mint(address to, uint256 amountLP, uint256 amountSD, uint256 mintFeeAmountSD);
    event Burn(address from, uint256 amountLP, uint256 amountSD);
    event RedeemLocalCallback(address _to, uint256 _amountSD, uint256 _amountToMintSD);
    event Swap(
        uint16 chainId,
        uint256 dstPoolId,
        address from,
        uint256 amountSD,
        uint256 eqReward,
        uint256 eqFee,
        uint256 protocolFee,
        uint256 lpFee
    );
    event SendCredits(uint16 dstChainId, uint256 dstPoolId, uint256 credits, uint256 idealBalance);
    event RedeemRemote(uint16 chainId, uint256 dstPoolId, address from, uint256 amountLP, uint256 amountSD);
    event RedeemLocal(address from, uint256 amountLP, uint256 amountSD, uint16 chainId, uint256 dstPoolId, bytes to);
    event InstantRedeemLocal(address from, uint256 amountLP, uint256 amountSD, address to);
    event CreditChainPath(uint16 chainId, uint256 srcPoolId, uint256 amountSD, uint256 idealBalance);
    event SwapRemote(address to, uint256 amountSD, uint256 protocolFee, uint256 dstFee);
    event WithdrawRemote(uint16 srcChainId, uint256 srcPoolId, uint256 swapAmount, uint256 mintAmount);
    event ChainPathUpdate(uint16 dstChainId, uint256 dstPoolId, uint256 weight);
    event FeesUpdated(uint256 mintFeeBP);
    event FeeLibraryUpdated(address feeLibraryAddr);
    event StopSwapUpdated(bool swapStop);
    event WithdrawProtocolFeeBalance(address to, uint256 amountSD);
    event WithdrawMintFeeBalance(address to, uint256 amountSD);
    event DeltaParamUpdated(bool batched, uint256 swapDeltaBP, uint256 lpDeltaBP, bool defaultSwapMode, bool defaultLPMode);

    //---------------------------------------------------------------------------
    // MODIFIERS
    modifier onlyRouter() {
        require(msg.sender == router, "Stargate: only the router can call this method");
        _;
    }

    constructor(
        uint256 _poolId,
        address _router,
        address _token,
        uint256 _sharedDecimals,
        uint256 _localDecimals,
        address _feeLibrary,
        string memory _name,
        string memory _symbol
    ) LPTokenERC20(_name, _symbol) {
        require(_token != address(0x0), "Stargate: _token cannot be 0x0");
        require(_router != address(0x0), "Stargate: _router cannot be 0x0");
        poolId = _poolId;
        router = _router;
        token = _token;
        sharedDecimals = _sharedDecimals;
        decimals = uint8(_sharedDecimals);
        localDecimals = _localDecimals;
        convertRate = 10**(uint256(localDecimals).sub(sharedDecimals));
        totalWeight = 0;
        feeLibrary = _feeLibrary;

        //delta algo related
        batched = false;
        defaultSwapMode = true;
        defaultLPMode = true;
    }

    function getChainPathsLength() public view returns (uint256) {
        return chainPaths.length;
    }

    //---------------------------------------------------------------------------
    // LOCAL CHAIN FUNCTIONS

    function mint(address _to, uint256 _amountLD) external nonReentrant onlyRouter returns (uint256) {
        return _mintLocal(_to, _amountLD, true, true);
    }

    // Local                                    Remote
    // -------                                  ---------
    // swap             ->                      swapRemote
    function swap(
        uint16 _dstChainId,
        uint256 _dstPoolId,
        address _from,
        uint256 _amountLD,
        uint256 _minAmountLD,
        bool newLiquidity
    ) external nonReentrant onlyRouter returns (SwapObj memory) {
        require(!stopSwap, "Stargate: swap func stopped");
        ChainPath storage cp = getAndCheckCP(_dstChainId, _dstPoolId);
        require(cp.ready == true, "Stargate: counter chainPath is not ready");

        uint256 amountSD = amountLDtoSD(_amountLD);
        uint256 minAmountSD = amountLDtoSD(_minAmountLD);

        // request fee params from library
        SwapObj memory s = IStargateFeeLibrary(feeLibrary).getFees(poolId, _dstPoolId, _dstChainId, _from, amountSD);

        // equilibrium fee and reward. note eqFee/eqReward are separated from swap liquidity
        eqFeePool = eqFeePool.sub(s.eqReward);
        // update the new amount the user gets minus the fees
        s.amount = amountSD.sub(s.eqFee).sub(s.protocolFee).sub(s.lpFee);
        // users will also get the eqReward
        require(s.amount.add(s.eqReward) >= minAmountSD, "Stargate: slippage too high");

        // behaviours
        //     - protocolFee: booked, stayed and withdrawn at remote.
        //     - eqFee: booked, stayed and withdrawn at remote.
        //     - lpFee: booked and stayed at remote, can be withdrawn anywhere

        s.lkbRemove = amountSD.sub(s.lpFee).add(s.eqReward);
        // check for transfer solvency.
        require(cp.balance >= s.lkbRemove, "Stargate: dst balance too low");
        cp.balance = cp.balance.sub(s.lkbRemove);

        if (newLiquidity) {
            deltaCredit = deltaCredit.add(amountSD).add(s.eqReward);
        } else if (s.eqReward > 0) {
            deltaCredit = deltaCredit.add(s.eqReward);
        }

        // distribute credits on condition.
        if (!batched || deltaCredit >= totalLiquidity.mul(swapDeltaBP).div(BP_DENOMINATOR)) {
            _delta(defaultSwapMode);
        }

        emit Swap(_dstChainId, _dstPoolId, _from, s.amount, s.eqReward, s.eqFee, s.protocolFee, s.lpFee);
        return s;
    }

    // Local                                    Remote
    // -------                                  ---------
    // sendCredits      ->                      creditChainPath
    function sendCredits(uint16 _dstChainId, uint256 _dstPoolId) external nonReentrant onlyRouter returns (CreditObj memory c) {
        ChainPath storage cp = getAndCheckCP(_dstChainId, _dstPoolId);
        require(cp.ready == true, "Stargate: counter chainPath is not ready");
        cp.lkb = cp.lkb.add(cp.credits);
        c.idealBalance = totalLiquidity.mul(cp.weight).div(totalWeight);
        c.credits = cp.credits;
        cp.credits = 0;
        emit SendCredits(_dstChainId, _dstPoolId, c.credits, c.idealBalance);
    }

    // Local                                    Remote
    // -------                                  ---------
    // redeemRemote   ->                        swapRemote
    function redeemRemote(
        uint16 _dstChainId,
        uint256 _dstPoolId,
        address _from,
        uint256 _amountLP
    ) external nonReentrant onlyRouter {
        require(_from != address(0x0), "Stargate: _from cannot be 0x0");
        uint256 amountSD = _burnLocal(_from, _amountLP);
        //run Delta
        if (!batched || deltaCredit > totalLiquidity.mul(lpDeltaBP).div(BP_DENOMINATOR)) {
            _delta(defaultLPMode);
        }
        uint256 amountLD = amountSDtoLD(amountSD);
        emit RedeemRemote(_dstChainId, _dstPoolId, _from, _amountLP, amountLD);
    }

    function instantRedeemLocal(
        address _from,
        uint256 _amountLP,
        address _to
    ) external nonReentrant onlyRouter returns (uint256 amountSD) {
        require(_from != address(0x0), "Stargate: _from cannot be 0x0");
        uint256 _deltaCredit = deltaCredit; // sload optimization.
        uint256 _capAmountLP = _amountSDtoLP(_deltaCredit);

        if (_amountLP > _capAmountLP) _amountLP = _capAmountLP;

        amountSD = _burnLocal(_from, _amountLP);
        deltaCredit = _deltaCredit.sub(amountSD);
        uint256 amountLD = amountSDtoLD(amountSD);
        _safeTransfer(token, _to, amountLD);
        emit InstantRedeemLocal(_from, _amountLP, amountSD, _to);
    }

    // Local                                    Remote
    // -------                                  ---------
    // redeemLocal   ->                         redeemLocalCheckOnRemote
    // redeemLocalCallback             <-
    function redeemLocal(
        address _from,
        uint256 _amountLP,
        uint16 _dstChainId,
        uint256 _dstPoolId,
        bytes calldata _to
    ) external nonReentrant onlyRouter returns (uint256 amountSD) {
        require(_from != address(0x0), "Stargate: _from cannot be 0x0");

        // safeguard.
        require(chainPaths[chainPathIndexLookup[_dstChainId][_dstPoolId]].ready == true, "Stargate: counter chainPath is not ready");
        amountSD = _burnLocal(_from, _amountLP);

        // run Delta
        if (!batched || deltaCredit > totalLiquidity.mul(lpDeltaBP).div(BP_DENOMINATOR)) {
            _delta(false);
        }
        emit RedeemLocal(_from, _amountLP, amountSD, _dstChainId, _dstPoolId, _to);
    }

    //---------------------------------------------------------------------------
    // REMOTE CHAIN FUNCTIONS

    // Local                                    Remote
    // -------                                  ---------
    // sendCredits      ->                      creditChainPath
    function creditChainPath(
        uint16 _dstChainId,
        uint256 _dstPoolId,
        CreditObj memory _c
    ) external nonReentrant onlyRouter {
        ChainPath storage cp = chainPaths[chainPathIndexLookup[_dstChainId][_dstPoolId]];
        cp.balance = cp.balance.add(_c.credits);
        if (cp.idealBalance != _c.idealBalance) {
            cp.idealBalance = _c.idealBalance;
        }
        emit CreditChainPath(_dstChainId, _dstPoolId, _c.credits, _c.idealBalance);
    }

    // Local                                    Remote
    // -------                                  ---------
    // swap             ->                      swapRemote
    function swapRemote(
        uint16 _srcChainId,
        uint256 _srcPoolId,
        address _to,
        SwapObj memory _s
    ) external nonReentrant onlyRouter returns (uint256 amountLD) {
        // booking lpFee
        totalLiquidity = totalLiquidity.add(_s.lpFee);
        // booking eqFee
        eqFeePool = eqFeePool.add(_s.eqFee);
        // booking stargateFee
        protocolFeeBalance = protocolFeeBalance.add(_s.protocolFee);

        // update LKB
        uint256 chainPathIndex = chainPathIndexLookup[_srcChainId][_srcPoolId];
        chainPaths[chainPathIndex].lkb = chainPaths[chainPathIndex].lkb.sub(_s.lkbRemove);

        // user receives the amount + the srcReward
        amountLD = amountSDtoLD(_s.amount.add(_s.eqReward));
        _safeTransfer(token, _to, amountLD);
        emit SwapRemote(_to, _s.amount.add(_s.eqReward), _s.protocolFee, _s.eqFee);
    }

    // Local                                    Remote
    // -------                                  ---------
    // redeemLocal   ->                         redeemLocalCheckOnRemote
    // redeemLocalCallback             <-
    function redeemLocalCallback(
        uint16 _srcChainId,
        uint256 _srcPoolId,
        address _to,
        uint256 _amountSD,
        uint256 _amountToMintSD
    ) external nonReentrant onlyRouter {
        if (_amountToMintSD > 0) {
            _mintLocal(_to, amountSDtoLD(_amountToMintSD), false, false);
        }

        ChainPath storage cp = getAndCheckCP(_srcChainId, _srcPoolId);
        cp.lkb = cp.lkb.sub(_amountSD);

        uint256 amountLD = amountSDtoLD(_amountSD);
        _safeTransfer(token, _to, amountLD);
        emit RedeemLocalCallback(_to, _amountSD, _amountToMintSD);
    }

    // Local                                    Remote
    // -------                                  ---------
    // redeemLocal(amount)   ->               redeemLocalCheckOnRemote
    // redeemLocalCallback             <-
    function redeemLocalCheckOnRemote(
        uint16 _srcChainId,
        uint256 _srcPoolId,
        uint256 _amountSD
    ) external nonReentrant onlyRouter returns (uint256 swapAmount, uint256 mintAmount) {
        ChainPath storage cp = getAndCheckCP(_srcChainId, _srcPoolId);
        if (_amountSD > cp.balance) {
            mintAmount = _amountSD - cp.balance;
            swapAmount = cp.balance;
            cp.balance = 0;
        } else {
            cp.balance = cp.balance.sub(_amountSD);
            swapAmount = _amountSD;
            mintAmount = 0;
        }
        emit WithdrawRemote(_srcChainId, _srcPoolId, swapAmount, mintAmount);
    }

    //---------------------------------------------------------------------------
    // DAO Calls
    function createChainPath(
        uint16 _dstChainId,
        uint256 _dstPoolId,
        uint256 _weight
    ) external onlyRouter {
        for (uint256 i = 0; i < chainPaths.length; ++i) {
            ChainPath memory cp = chainPaths[i];
            bool exists = cp.dstChainId == _dstChainId && cp.dstPoolId == _dstPoolId;
            require(!exists, "Stargate: cant createChainPath of existing dstChainId and _dstPoolId");
        }
        totalWeight = totalWeight.add(_weight);
        chainPathIndexLookup[_dstChainId][_dstPoolId] = chainPaths.length;
        chainPaths.push(ChainPath(false, _dstChainId, _dstPoolId, _weight, 0, 0, 0, 0));
        emit ChainPathUpdate(_dstChainId, _dstPoolId, _weight);
    }

    function setWeightForChainPath(
        uint16 _dstChainId,
        uint256 _dstPoolId,
        uint16 _weight
    ) external onlyRouter {
        ChainPath storage cp = getAndCheckCP(_dstChainId, _dstPoolId);
        totalWeight = totalWeight.sub(cp.weight).add(_weight);
        cp.weight = _weight;
        emit ChainPathUpdate(_dstChainId, _dstPoolId, _weight);
    }

    function setFee(uint256 _mintFeeBP) external onlyRouter {
        require(_mintFeeBP <= BP_DENOMINATOR, "Bridge: cum fees > 100%");
        mintFeeBP = _mintFeeBP;
        emit FeesUpdated(mintFeeBP);
    }

    function setFeeLibrary(address _feeLibraryAddr) external onlyRouter {
        require(_feeLibraryAddr != address(0x0), "Stargate: fee library cant be 0x0");
        feeLibrary = _feeLibraryAddr;
        emit FeeLibraryUpdated(_feeLibraryAddr);
    }

    function setSwapStop(bool _swapStop) external onlyRouter {
        stopSwap = _swapStop;
        emit StopSwapUpdated(_swapStop);
    }

    function setDeltaParam(
        bool _batched,
        uint256 _swapDeltaBP,
        uint256 _lpDeltaBP,
        bool _defaultSwapMode,
        bool _defaultLPMode
    ) external onlyRouter {
        require(_swapDeltaBP <= BP_DENOMINATOR && _lpDeltaBP <= BP_DENOMINATOR, "Stargate: wrong Delta param");
        batched = _batched;
        swapDeltaBP = _swapDeltaBP;
        lpDeltaBP = _lpDeltaBP;
        defaultSwapMode = _defaultSwapMode;
        defaultLPMode = _defaultLPMode;
        emit DeltaParamUpdated(_batched, _swapDeltaBP, _lpDeltaBP, _defaultSwapMode, _defaultLPMode);
    }

    function callDelta(bool _fullMode) external onlyRouter {
        _delta(_fullMode);
    }

    function activateChainPath(uint16 _dstChainId, uint256 _dstPoolId) external onlyRouter {
        ChainPath storage cp = getAndCheckCP(_dstChainId, _dstPoolId);
        require(cp.ready == false, "Stargate: chainPath is already active");
        // this func will only be called once
        cp.ready = true;
    }

    function withdrawProtocolFeeBalance(address _to) external onlyRouter {
        if (protocolFeeBalance > 0) {
            uint256 amountOfLD = amountSDtoLD(protocolFeeBalance);
            protocolFeeBalance = 0;
            _safeTransfer(token, _to, amountOfLD);
            emit WithdrawProtocolFeeBalance(_to, amountOfLD);
        }
    }

    function withdrawMintFeeBalance(address _to) external onlyRouter {
        if (mintFeeBalance > 0) {
            uint256 amountOfLD = amountSDtoLD(mintFeeBalance);
            mintFeeBalance = 0;
            _safeTransfer(token, _to, amountOfLD);
            emit WithdrawMintFeeBalance(_to, amountOfLD);
        }
    }

    //---------------------------------------------------------------------------
    // INTERNAL
    // Conversion Helpers
    //---------------------------------------------------------------------------
    function amountLPtoLD(uint256 _amountLP) external view returns (uint256) {
        return amountSDtoLD(_amountLPtoSD(_amountLP));
    }

    function _amountLPtoSD(uint256 _amountLP) internal view returns (uint256) {
        require(totalSupply > 0, "Stargate: cant convert LPtoSD when totalSupply == 0");
        return _amountLP.mul(totalLiquidity).div(totalSupply);
    }

    function _amountSDtoLP(uint256 _amountSD) internal view returns (uint256) {
        require(totalLiquidity > 0, "Stargate: cant convert SDtoLP when totalLiq == 0");
        return _amountSD.mul(totalSupply).div(totalLiquidity);
    }

    function amountSDtoLD(uint256 _amount) internal view returns (uint256) {
        return _amount.mul(convertRate);
    }

    function amountLDtoSD(uint256 _amount) internal view returns (uint256) {
        return _amount.div(convertRate);
    }

    function getAndCheckCP(uint16 _dstChainId, uint256 _dstPoolId) internal view returns (ChainPath storage) {
        require(chainPaths.length > 0, "Stargate: no chainpaths exist");
        ChainPath storage cp = chainPaths[chainPathIndexLookup[_dstChainId][_dstPoolId]];
        require(cp.dstChainId == _dstChainId && cp.dstPoolId == _dstPoolId, "Stargate: local chainPath does not exist");
        return cp;
    }

    function getChainPath(uint16 _dstChainId, uint256 _dstPoolId) external view returns (ChainPath memory) {
        ChainPath memory cp = chainPaths[chainPathIndexLookup[_dstChainId][_dstPoolId]];
        require(cp.dstChainId == _dstChainId && cp.dstPoolId == _dstPoolId, "Stargate: local chainPath does not exist");
        return cp;
    }

    function _burnLocal(address _from, uint256 _amountLP) internal returns (uint256) {
        require(totalSupply > 0, "Stargate: cant burn when totalSupply == 0");
        uint256 amountOfLPTokens = balanceOf[_from];
        require(amountOfLPTokens >= _amountLP, "Stargate: not enough LP tokens to burn");

        uint256 amountSD = _amountLP.mul(totalLiquidity).div(totalSupply);
        //subtract totalLiquidity accordingly
        totalLiquidity = totalLiquidity.sub(amountSD);

        _burn(_from, _amountLP);
        emit Burn(_from, _amountLP, amountSD);
        return amountSD;
    }

    function _delta(bool fullMode) internal {
        if (deltaCredit > 0 && totalWeight > 0) {
            uint256 cpLength = chainPaths.length;
            uint256[] memory deficit = new uint256[](cpLength);
            uint256 totalDeficit = 0;

            // algorithm steps 6-9: calculate the total and the amounts required to get to balance state
            for (uint256 i = 0; i < cpLength; ++i) {
                ChainPath storage cp = chainPaths[i];
                // (liquidity * (weight/totalWeight)) - (lkb+credits)
                uint256 balLiq = totalLiquidity.mul(cp.weight).div(totalWeight);
                uint256 currLiq = cp.lkb.add(cp.credits);
                if (balLiq > currLiq) {
                    // save gas since we know balLiq > currLiq and we know deficit[i] > 0
                    deficit[i] = balLiq - currLiq;
                    totalDeficit = totalDeficit.add(deficit[i]);
                }
            }

            // indicates how much delta credit is distributed
            uint256 spent;

            // handle credits with 2 tranches. the [ < totalDeficit] [excessCredit]
            // run full Delta, allocate all credits
            if (totalDeficit == 0) {
                // only fullMode delta will allocate excess credits
                if (fullMode && deltaCredit > 0) {
                    // credit ChainPath by weights
                    for (uint256 i = 0; i < cpLength; ++i) {
                        ChainPath storage cp = chainPaths[i];
                        // credits = credits + toBalanceChange + remaining allocation based on weight
                        uint256 amtToCredit = deltaCredit.mul(cp.weight).div(totalWeight);
                        spent = spent.add(amtToCredit);
                        cp.credits = cp.credits.add(amtToCredit);
                    }
                } // else do nth
            } else if (totalDeficit <= deltaCredit) {
                if (fullMode) {
                    // algorithm step 13: calculate amount to disperse to bring to balance state or as close as possible
                    uint256 excessCredit = deltaCredit - totalDeficit;
                    // algorithm steps 14-16: calculate credits
                    for (uint256 i = 0; i < cpLength; ++i) {
                        if (deficit[i] > 0) {
                            ChainPath storage cp = chainPaths[i];
                            // credits = credits + deficit + remaining allocation based on weight
                            uint256 amtToCredit = deficit[i].add(excessCredit.mul(cp.weight).div(totalWeight));
                            spent = spent.add(amtToCredit);
                            cp.credits = cp.credits.add(amtToCredit);
                        }
                    }
                } else {
                    // totalDeficit <= deltaCredit but not running fullMode
                    // credit chainPaths as is if any deficit, not using all deltaCredit
                    for (uint256 i = 0; i < cpLength; ++i) {
                        if (deficit[i] > 0) {
                            ChainPath storage cp = chainPaths[i];
                            uint256 amtToCredit = deficit[i];
                            spent = spent.add(amtToCredit);
                            cp.credits = cp.credits.add(amtToCredit);
                        }
                    }
                }
            } else {
                // totalDeficit > deltaCredit, fullMode or not, normalize the deficit by deltaCredit
                for (uint256 i = 0; i < cpLength; ++i) {
                    if (deficit[i] > 0) {
                        ChainPath storage cp = chainPaths[i];
                        uint256 proportionalDeficit = deficit[i].mul(deltaCredit).div(totalDeficit);
                        spent = spent.add(proportionalDeficit);
                        cp.credits = cp.credits.add(proportionalDeficit);
                    }
                }
            }

            // deduct the amount of credit sent
            deltaCredit = deltaCredit.sub(spent);
        }
    }

    function _mintLocal(
        address _to,
        uint256 _amountLD,
        bool _feesEnabled,
        bool _creditDelta
    ) internal returns (uint256 amountSD) {
        require(totalWeight > 0, "Stargate: No ChainPaths exist");
        amountSD = amountLDtoSD(_amountLD);

        uint256 mintFeeSD = 0;
        if (_feesEnabled) {
            mintFeeSD = amountSD.mul(mintFeeBP).div(BP_DENOMINATOR);
            amountSD = amountSD.sub(mintFeeSD);
            mintFeeBalance = mintFeeBalance.add(mintFeeSD);
        }

        if (_creditDelta) {
            deltaCredit = deltaCredit.add(amountSD);
        }

        uint256 amountLPTokens = amountSD;
        if (totalSupply != 0) {
            amountLPTokens = amountSD.mul(totalSupply).div(totalLiquidity);
        }
        totalLiquidity = totalLiquidity.add(amountSD);

        _mint(_to, amountLPTokens);
        emit Mint(_to, amountLPTokens, amountSD, mintFeeSD);

        // add to credits and call delta. short circuit to save gas
        if (!batched || deltaCredit > totalLiquidity.mul(lpDeltaBP).div(BP_DENOMINATOR)) {
            _delta(defaultLPMode);
        }
    }

    function _safeTransfer(
        address _token,
        address _to,
        uint256 _value
    ) private {
        (bool success, bytes memory data) = _token.call(abi.encodeWithSelector(SELECTOR, _to, _value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "Stargate: TRANSFER_FAILED");
    }
}

File 1 of 7: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

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

File 2 of 7: IStargateFeeLibrary.sol
// SPDX-License-Identifier: BUSL-1.1

pragma solidity ^0.7.6;
pragma abicoder v2;
import "./Pool.sol";

interface IStargateFeeLibrary {
    function getFees(
        uint256 _srcPoolId,
        uint256 _dstPoolId,
        uint16 _dstChainId,
        address _from,
        uint256 _amountSD
    ) external returns (Pool.SwapObj memory s);

    function getVersion() external view returns (string memory);
}

File 3 of 7: LPTokenERC20.sol
// SPDX-License-Identifier: BUSL-1.1

pragma solidity 0.7.6;

// libraries
import "./SafeMath.sol";

contract LPTokenERC20 {
    using SafeMath for uint256;

    //---------------------------------------------------------------------------
    // CONSTANTS
    string public name;
    string public symbol;
    bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;
    // set in constructor
    bytes32 public DOMAIN_SEPARATOR;

    //---------------------------------------------------------------------------
    // VARIABLES
    uint256 public decimals;
    uint256 public totalSupply;
    mapping(address => uint256) public balanceOf;
    mapping(address => mapping(address => uint256)) public allowance;
    mapping(address => uint256) public nonces;

    //---------------------------------------------------------------------------
    // EVENTS
    event Approval(address indexed owner, address indexed spender, uint256 value);
    event Transfer(address indexed from, address indexed to, uint256 value);

    constructor(string memory _name, string memory _symbol) {
        name = _name;
        symbol = _symbol;
        uint256 chainId;
        assembly {
            chainId := chainid()
        }
        DOMAIN_SEPARATOR = keccak256(
            abi.encode(
                keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                keccak256(bytes(name)),
                keccak256(bytes("1")),
                chainId,
                address(this)
            )
        );
    }

    function _mint(address to, uint256 value) internal {
        totalSupply = totalSupply.add(value);
        balanceOf[to] = balanceOf[to].add(value);
        emit Transfer(address(0), to, value);
    }

    function _burn(address from, uint256 value) internal {
        balanceOf[from] = balanceOf[from].sub(value);
        totalSupply = totalSupply.sub(value);
        emit Transfer(from, address(0), value);
    }

    function _approve(
        address owner,
        address spender,
        uint256 value
    ) private {
        allowance[owner][spender] = value;
        emit Approval(owner, spender, value);
    }

    function _transfer(
        address from,
        address to,
        uint256 value
    ) private {
        balanceOf[from] = balanceOf[from].sub(value);
        balanceOf[to] = balanceOf[to].add(value);
        emit Transfer(from, to, value);
    }

    function approve(address spender, uint256 value) external returns (bool) {
        _approve(msg.sender, spender, value);
        return true;
    }

    function transfer(address to, uint256 value) external returns (bool) {
        _transfer(msg.sender, to, value);
        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool) {
        if (allowance[from][msg.sender] != uint256(-1)) {
            allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);
        }
        _transfer(from, to, value);
        return true;
    }

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

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, allowance[msg.sender][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external {
        require(deadline >= block.timestamp, "Bridge: EXPIRED");
        bytes32 digest = keccak256(
            abi.encodePacked(
                "\x19\x01",
                DOMAIN_SEPARATOR,
                keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))
            )
        );
        address recoveredAddress = ecrecover(digest, v, r, s);
        require(recoveredAddress != address(0) && recoveredAddress == owner, "Bridge: INVALID_SIGNATURE");
        _approve(owner, spender, value);
    }
}

File 4 of 7: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.0;

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

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

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

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

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

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

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

File 6 of 7: ReentrancyGuard.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor () {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 7 of 7: SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

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

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

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

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"},{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_sharedDecimals","type":"uint256"},{"internalType":"uint256","name":"_localDecimals","type":"uint256"},{"internalType":"address","name":"_feeLibrary","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountLP","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountSD","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"dstChainId","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"dstPoolId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"weight","type":"uint256"}],"name":"ChainPathUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"chainId","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"srcPoolId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountSD","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"idealBalance","type":"uint256"}],"name":"CreditChainPath","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"batched","type":"bool"},{"indexed":false,"internalType":"uint256","name":"swapDeltaBP","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpDeltaBP","type":"uint256"},{"indexed":false,"internalType":"bool","name":"defaultSwapMode","type":"bool"},{"indexed":false,"internalType":"bool","name":"defaultLPMode","type":"bool"}],"name":"DeltaParamUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"feeLibraryAddr","type":"address"}],"name":"FeeLibraryUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"mintFeeBP","type":"uint256"}],"name":"FeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountLP","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountSD","type":"uint256"},{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"InstantRedeemLocal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountLP","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountSD","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mintFeeAmountSD","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountLP","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountSD","type":"uint256"},{"indexed":false,"internalType":"uint16","name":"chainId","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"dstPoolId","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"to","type":"bytes"}],"name":"RedeemLocal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amountSD","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amountToMintSD","type":"uint256"}],"name":"RedeemLocalCallback","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"chainId","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"dstPoolId","type":"uint256"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountLP","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountSD","type":"uint256"}],"name":"RedeemRemote","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"dstChainId","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"dstPoolId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"credits","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"idealBalance","type":"uint256"}],"name":"SendCredits","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"swapStop","type":"bool"}],"name":"StopSwapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"chainId","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"dstPoolId","type":"uint256"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountSD","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"eqReward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"eqFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"protocolFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpFee","type":"uint256"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountSD","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"protocolFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dstFee","type":"uint256"}],"name":"SwapRemote","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountSD","type":"uint256"}],"name":"WithdrawMintFeeBalance","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountSD","type":"uint256"}],"name":"WithdrawProtocolFeeBalance","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"srcChainId","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"srcPoolId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"swapAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"WithdrawRemote","type":"event"},{"inputs":[],"name":"BP_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint256","name":"_dstPoolId","type":"uint256"}],"name":"activateChainPath","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountLP","type":"uint256"}],"name":"amountLPtoLD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"batched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_fullMode","type":"bool"}],"name":"callDelta","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"chainPathIndexLookup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"chainPaths","outputs":[{"internalType":"bool","name":"ready","type":"bool"},{"internalType":"uint16","name":"dstChainId","type":"uint16"},{"internalType":"uint256","name":"dstPoolId","type":"uint256"},{"internalType":"uint256","name":"weight","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"lkb","type":"uint256"},{"internalType":"uint256","name":"credits","type":"uint256"},{"internalType":"uint256","name":"idealBalance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"convertRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint256","name":"_dstPoolId","type":"uint256"},{"internalType":"uint256","name":"_weight","type":"uint256"}],"name":"createChainPath","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint256","name":"_dstPoolId","type":"uint256"},{"components":[{"internalType":"uint256","name":"credits","type":"uint256"},{"internalType":"uint256","name":"idealBalance","type":"uint256"}],"internalType":"struct Pool.CreditObj","name":"_c","type":"tuple"}],"name":"creditChainPath","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"defaultLPMode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultSwapMode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deltaCredit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eqFeePool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeLibrary","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint256","name":"_dstPoolId","type":"uint256"}],"name":"getChainPath","outputs":[{"components":[{"internalType":"bool","name":"ready","type":"bool"},{"internalType":"uint16","name":"dstChainId","type":"uint16"},{"internalType":"uint256","name":"dstPoolId","type":"uint256"},{"internalType":"uint256","name":"weight","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"lkb","type":"uint256"},{"internalType":"uint256","name":"credits","type":"uint256"},{"internalType":"uint256","name":"idealBalance","type":"uint256"}],"internalType":"struct Pool.ChainPath","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainPathsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_amountLP","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"instantRedeemLocal","outputs":[{"internalType":"uint256","name":"amountSD","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"localDecimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpDeltaBP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amountLD","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintFeeBP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintFeeBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"poolId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protocolFeeBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_amountLP","type":"uint256"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint256","name":"_dstPoolId","type":"uint256"},{"internalType":"bytes","name":"_to","type":"bytes"}],"name":"redeemLocal","outputs":[{"internalType":"uint256","name":"amountSD","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"uint256","name":"_srcPoolId","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amountSD","type":"uint256"},{"internalType":"uint256","name":"_amountToMintSD","type":"uint256"}],"name":"redeemLocalCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"uint256","name":"_srcPoolId","type":"uint256"},{"internalType":"uint256","name":"_amountSD","type":"uint256"}],"name":"redeemLocalCheckOnRemote","outputs":[{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint256","name":"_dstPoolId","type":"uint256"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_amountLP","type":"uint256"}],"name":"redeemRemote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint256","name":"_dstPoolId","type":"uint256"}],"name":"sendCredits","outputs":[{"components":[{"internalType":"uint256","name":"credits","type":"uint256"},{"internalType":"uint256","name":"idealBalance","type":"uint256"}],"internalType":"struct Pool.CreditObj","name":"c","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_batched","type":"bool"},{"internalType":"uint256","name":"_swapDeltaBP","type":"uint256"},{"internalType":"uint256","name":"_lpDeltaBP","type":"uint256"},{"internalType":"bool","name":"_defaultSwapMode","type":"bool"},{"internalType":"bool","name":"_defaultLPMode","type":"bool"}],"name":"setDeltaParam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintFeeBP","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeLibraryAddr","type":"address"}],"name":"setFeeLibrary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_swapStop","type":"bool"}],"name":"setSwapStop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint256","name":"_dstPoolId","type":"uint256"},{"internalType":"uint16","name":"_weight","type":"uint16"}],"name":"setWeightForChainPath","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sharedDecimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stopSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint256","name":"_dstPoolId","type":"uint256"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_amountLD","type":"uint256"},{"internalType":"uint256","name":"_minAmountLD","type":"uint256"},{"internalType":"bool","name":"newLiquidity","type":"bool"}],"name":"swap","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"eqFee","type":"uint256"},{"internalType":"uint256","name":"eqReward","type":"uint256"},{"internalType":"uint256","name":"lpFee","type":"uint256"},{"internalType":"uint256","name":"protocolFee","type":"uint256"},{"internalType":"uint256","name":"lkbRemove","type":"uint256"}],"internalType":"struct Pool.SwapObj","name":"","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapDeltaBP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"uint256","name":"_srcPoolId","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"eqFee","type":"uint256"},{"internalType":"uint256","name":"eqReward","type":"uint256"},{"internalType":"uint256","name":"lpFee","type":"uint256"},{"internalType":"uint256","name":"protocolFee","type":"uint256"},{"internalType":"uint256","name":"lkbRemove","type":"uint256"}],"internalType":"struct Pool.SwapObj","name":"_s","type":"tuple"}],"name":"swapRemote","outputs":[{"internalType":"uint256","name":"amountLD","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"withdrawMintFeeBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"withdrawProtocolFeeBalance","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101006040523480156200001257600080fd5b5060405162004b0238038062004b02833981016040819052620000359162000435565b8151829082906200004e906000906020850190620002d1565b50805162000064906001906020840190620002d1565b5060004690507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040518082805460018160011615610100020316600290048015620000ec5780601f10620000c9576101008083540402835291820191620000ec565b820191906000526020600020905b815481529060010190602001808311620000d7575b50506040805191829003822082820182526001808452603160f81b602094850152825180850197909752868301919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606087015260808601969096523060a0808701919091528151808703909101815260c090950190528351930192909220600255505060085550506001600160a01b038616620001aa5760405162461bcd60e51b8152600401620001a190620004f2565b60405180910390fd5b6001600160a01b038716620001d35760405162461bcd60e51b8152600401620001a19062000529565b6080889052606087811b6001600160601b031990811660e0529087901b1660c052600b85905560ff8516600355600c8490556200021d848662000273602090811b620027f617901c565b600a0a60a05250506000600f55601480546001600160a01b039092166001600160a01b031990921691909117905550506016805462ff00001961ffff199091166101001716620100001790555062000560915050565b600082821115620002cb576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928262000309576000855562000354565b82601f106200032457805160ff191683800117855562000354565b8280016001018555821562000354579182015b828111156200035457825182559160200191906001019062000337565b506200036292915062000366565b5090565b5b8082111562000362576000815560010162000367565b80516001600160a01b03811681146200039557600080fd5b919050565b600082601f830112620003ab578081fd5b81516001600160401b0380821115620003c057fe5b6040516020601f8401601f1916820181018381118382101715620003e057fe5b6040528382528584018101871015620003f7578485fd5b8492505b838310156200041a5785830181015182840182015291820191620003fb565b838311156200042b57848185840101525b5095945050505050565b600080600080600080600080610100898b03121562000452578384fd5b885197506200046460208a016200037d565b96506200047460408a016200037d565b955060608901519450608089015193506200049260a08a016200037d565b60c08a01519093506001600160401b0380821115620004af578384fd5b620004bd8c838d016200039a565b935060e08b0151915080821115620004d3578283fd5b50620004e28b828c016200039a565b9150509295985092959890939650565b6020808252601e908201527f53746172676174653a205f746f6b656e2063616e6e6f74206265203078300000604082015260600190565b6020808252601f908201527f53746172676174653a205f726f757465722063616e6e6f742062652030783000604082015260600190565b60805160a05160c05160601c60e05160601c6144da62000628600039806108895280610a075280610c7a5280610fd3528061146752806114c85280611595528061167c528061177852806118a9528061190052806119d55280611cab5280611d775280611e4a52806120035280612160528061226e528061255052806126975280612786525080610ab152806115265280611ae8528061209252806122cc52806127b05250806127d45280612b8b5280612cfb525080610d5152806113ed52506144da6000f3fe608060405234801561001057600080fd5b50600436106103ae5760003560e01c80637ecebe00116101f4578063b0fab0bc1161011a578063e065608b116100ad578063f887ea401161007c578063f887ea401461076e578063faa24f0714610776578063fc0c546a1461077e578063feb56b1514610786576103ae565b8063e065608b1461071f578063e46e705814610732578063ea89e2aa1461073a578063f6cd35ee1461075b576103ae565b8063be310294116100e9578063be310294146106de578063cdfed0ab146106f1578063d505accf146106f9578063dd62ed3e1461070c576103ae565b8063b0fab0bc1461069d578063b30daeac146106b0578063b633b364146106c3578063b6addec7146106cb576103ae565b806399a22d6811610192578063a9059cbb11610161578063a9059cbb1461065c578063a985565f1461066f578063abe685cd14610682578063ac2cc36b1461068a576103ae565b806399a22d68146106125780639bb811191461061a578063a138ed6b14610622578063a457c2d714610649576103ae565b80638bd86d0a116101ce5780638bd86d0a146105dc578063902b8ab7146105ef57806395d89b411461060257806396c82e571461060a576103ae565b80637ecebe00146105ae5780637fb65265146105c1578063857749b0146105d4576103ae565b806328f079c2116102d957806340c10f191161027757806365152f2b1161024657806365152f2b1461056d57806369fe0e2d1461057557806370a08231146105885780637298a5dc1461059b576103ae565b806340c10f1914610521578063476efe40146105345780634b5cacbc1461054757806364c5f02d1461055a576103ae565b806336448777116102b357806336448777146104f65780633644e515146104fe57806339509351146105065780633e0dc34e14610519576103ae565b806328f079c2146104de57806330adf81f146104e6578063313ce567146104ee576103ae565b8063159f6add116103515780631e8e51da116103205780631e8e51da146104a657806320d6bc75146104ae57806323b872dd146104c357806327f92376146104d6576103ae565b8063159f6add14610456578063163ef4901461047657806318160ddd1461047e5780631b7319b614610486576103ae565b8063095ea7b31161038d578063095ea7b3146104065780630986b61a146104265780630a22d68c1461044657806315770f921461044e576103ae565b80621edfab146103b357806306fdde03146103d157806308e9d8c2146103e6575b600080fd5b6103bb61078e565b6040516103c89190613b9e565b60405180910390f35b6103d961079d565b6040516103c89190613d14565b6103f96103f43660046138d4565b61082b565b6040516103c89190614295565b6104196104143660046136c6565b610998565b6040516103c89190613c9b565b6104396104343660046136ef565b6109af565b6040516103c89190613d0b565b610439610b23565b610439610b29565b6104696104643660046138d4565b610b2f565b6040516103c89190614236565b610439610c10565b610439610c16565b610499610494366004613a31565b610c1c565b6040516103c891906142ac565b610439610fc2565b6104c16104bc366004613b38565b610fc8565b005b6104196104d136600461361a565b6112ce565b610419611362565b61041961136b565b61043961137a565b61043961139e565b6104396113a4565b6104396113aa565b6104196105143660046136c6565b6113b0565b6104396113eb565b61043961052f3660046136c6565b61140f565b6104c16105423660046135ce565b6114bd565b6104c16105553660046135ce565b61158a565b6104396105683660046138d4565b61164e565b61043961166b565b6104c1610583366004613b6a565b611671565b6104396105963660046135ce565b611710565b6104c16105a93660046139a1565b611722565b6104396105bc3660046135ce565b61188c565b6104c16105cf3660046137cb565b61189e565b6104396118ef565b6104c16105ea3660046138d4565b6118f5565b6104396105fd3660046138ef565b61197d565b6103d9611b72565b610439611bcc565b610419611bd2565b610439611be0565b610635610630366004613b6a565b611be6565b6040516103c8989796959493929190613ca6565b6104196106573660046136c6565b611c44565b61041961066a3660046136c6565b611c93565b6104c161067d366004613b06565b611ca0565b610439611d66565b6104c16106983660046137cb565b611d6c565b6104396106ab36600461372a565b611df2565b6104c16106be3660046139e4565b611fad565b610419612101565b6104c16106d9366004613a93565b61210a565b6104c16106ec3660046135ce565b612263565b610439612323565b6104c1610707366004613655565b612329565b61043961071a3660046135e8565b612528565b6104c161072d366004613803565b612545565b610439612638565b61074d610748366004613b38565b61263e565b6040516103c89291906143c2565b610439610769366004613b6a565b61276e565b6103bb612784565b6104396127a8565b6103bb6127ae565b6104396127d2565b6014546001600160a01b031681565b6000805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108235780601f106107f857610100808354040283529160200191610823565b820191906000526020600020905b81548152906001019060200180831161080657829003601f168201915b505050505081565b61083361350a565b60026008541415610879576040805162461bcd60e51b815260206004820152601f602482015260008051602061443f833981519152604482015290519081900360640190fd5b6002600855336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108cf5760405162461bcd60e51b81526004016108c6906140c6565b60405180910390fd5b60006108db8484612853565b805490915060ff1615156001146109045760405162461bcd60e51b81526004016108c690613fc1565b60058101546004820154610917916128f0565b6004820155600f546002820154600e5461093c9291610936919061294a565b906129a3565b6020830181905260058201805480855260009091556040517f6939f93e3f21cf1362eb17155b740277de5687dae9a83a85909fd71da95944e7926109849288928892906143a1565b60405180910390a150600160085592915050565b60006109a5338484612a0a565b5060015b92915050565b6000600260085414156109f7576040805162461bcd60e51b815260206004820152601f602482015260008051602061443f833981519152604482015290519081900360640190fd5b6002600855336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a445760405162461bcd60e51b81526004016108c6906140c6565b6001600160a01b038416610a6a5760405162461bcd60e51b81526004016108c690613f8a565b6015546000610a7882612a6c565b905080851115610a86578094505b610a908686612aaa565b9250610a9c82846127f6565b6015556000610aaa84612b83565b9050610ad77f00000000000000000000000000000000000000000000000000000000000000008683612baf565b7f2125a70154569bd1686edd3cf981bb23dea7c1fa1637909dbb3c9a967cb0c2f287878688604051610b0c9493929190613bec565b60405180910390a150506001600855509392505050565b60115481565b600e5481565b610b37613524565b61ffff83166000908152600a60209081526040808320858452909152812054600980549091908110610b6557fe5b60009182526020918290206040805161010080820183526007909402909201805460ff81161515845261ffff94900484169483018590526001810154918301919091526002810154606083015260038101546080830152600481015460a0830152600581015460c08301526006015460e082015292508516148015610bed5750828160400151145b610c095760405162461bcd60e51b81526004016108c690613d97565b9392505050565b60095490565b60045481565b610c2461356f565b60026008541415610c6a576040805162461bcd60e51b815260206004820152601f602482015260008051602061443f833981519152604482015290519081900360640190fd5b6002600855336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cb75760405162461bcd60e51b81526004016108c6906140c6565b600d5460ff1615610cda5760405162461bcd60e51b81526004016108c6906141ff565b6000610ce68888612853565b805490915060ff161515600114610d0f5760405162461bcd60e51b81526004016108c690613fc1565b6000610d1a86612cf3565b90506000610d2786612cf3565b90506000601460009054906101000a90046001600160a01b03166001600160a01b0316631ab624307f00000000000000000000000000000000000000000000000000000000000000008c8e8d886040518663ffffffff1660e01b8152600401610d949594939291906143d0565b60c060405180830381600087803b158015610dae57600080fd5b505af1158015610dc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de69190613861565b9050610e0181604001516013546127f690919063ffffffff16565b601355606081015160808201516020830151610e2b9291610e2591829088906127f6565b906127f6565b80825260408201518391610e3e916128f0565b1015610e5c5760405162461bcd60e51b81526004016108c690614182565b610e818160400151610e7b8360600151866127f690919063ffffffff16565b906128f0565b60a0820181905260038501541015610eab5760405162461bcd60e51b81526004016108c69061414b565b60a08101516003850154610ebe916127f6565b60038501558515610eee57610ee68160400151610e7b856015546128f090919063ffffffff16565b601555610f0d565b604081015115610f0d576040810151601554610f09916128f0565b6015555b60165460ff161580610f3d5750610f37612710610936601754600e5461294a90919063ffffffff16565b60155410155b15610f5657601654610f5690610100900460ff16612d1f565b7f34660fc8af304464529f48a778e03d03e4d34bcd5f9b6f0cfbf3cd238c642f7f8b8b8b84600001518560400151866020015187608001518860600151604051610fa7989796959493929190614322565b60405180910390a160016008559a9950505050505050505050565b60155481565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110105760405162461bcd60e51b81526004016108c6906140c6565b60005b6009548110156110de5760006009828154811061102c57fe5b600091825260208083206040805161010080820183526007909502909201805460ff81161515845261ffff95900485169383018490526001810154918301919091526002810154606083015260038101546080830152600481015460a0830152600581015460c08301526006015460e082015293509087161480156110b45750848260400151145b905080156110d45760405162461bcd60e51b81526004016108c69061405c565b5050600101611013565b50600f546110ec90826128f0565b600f556009805461ffff8581166000818152600a602090815260408083208984528252808320869055805161010080820183528482529281019485528082018a8152606082018a81526080830186815260a0840187815260c0850188815260e0860189815260018d018e559c90985293517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af6007909b029a8b018054995160ff19909a169115159190911762ffff001916989099169095029690961790965594517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b087015592517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b1860155517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b285015591517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b384015590517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b483015591517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b590910155517f8fb3b21a941c2361df46475f9ae2f7b5dac5de7bd085fa22415ec0bb30c77e22906112c190859085908590614385565b60405180910390a1505050565b6001600160a01b03831660009081526006602090815260408083203384529091528120546000191461134d576001600160a01b038416600090815260066020908152604080832033845290915290205461132890836127f6565b6001600160a01b03851660009081526006602090815260408083203384529091529020555b611358848484613111565b5060019392505050565b60165460ff1681565b60165462010000900460ff1681565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60035481565b60185481565b60025481565b3360008181526006602090815260408083206001600160a01b038716845290915281205490916109a59185906113e690866128f0565b612a0a565b7f000000000000000000000000000000000000000000000000000000000000000081565b600060026008541415611457576040805162461bcd60e51b815260206004820152601f602482015260008051602061443f833981519152604482015290519081900360640190fd5b6002600855336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146114a45760405162461bcd60e51b81526004016108c6906140c6565b6114b183836001806131bf565b60016008559392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146115055760405162461bcd60e51b81526004016108c6906140c6565b6012541561158757600061151a601254612b83565b6000601255905061154c7f00000000000000000000000000000000000000000000000000000000000000008383612baf565b7f87b3b2749102aa96f2d08396e34cd47673e57148af9cfff965d99bc0378a87dc828260405161157d929190613bb2565b60405180910390a1505b50565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146115d25760405162461bcd60e51b81526004016108c6906140c6565b6001600160a01b0381166115f85760405162461bcd60e51b81526004016108c690613f49565b601480546001600160a01b0319166001600160a01b0383161790556040517f5138b884a20454b6db937b9e11c8534e02e708750e0c465df6cd9701622952ce90611643908390613b9e565b60405180910390a150565b600a60209081526000928352604080842090915290825290205481565b60125481565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146116b95760405162461bcd60e51b81526004016108c6906140c6565b6127108111156116db5760405162461bcd60e51b81526004016108c690613edb565b60108190556040517f9fe6eeb0f0541c644a56c67efeb872dbadd803a60b909d7dde1b35a3fe230b0e90611643908390613d0b565b60056020526000908152604090205481565b60026008541415611768576040805162461bcd60e51b815260206004820152601f602482015260008051602061443f833981519152604482015290519081900360640190fd5b6002600855336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146117b55760405162461bcd60e51b81526004016108c6906140c6565b6001600160a01b0382166117db5760405162461bcd60e51b81526004016108c690613f8a565b60006117e78383612aaa565b60165490915060ff1615806118195750611814612710610936601854600e5461294a90919063ffffffff16565b601554115b15611833576016546118339062010000900460ff16612d1f565b600061183e82612b83565b90507fa33f5c0b76f00f6737b1780a8a7f18e19c3fe8fe9ee01a6c1b8ce1eae5ed54f986868686856040516118779594939291906142f0565b60405180910390a15050600160085550505050565b60076020526000908152604090205481565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146118e65760405162461bcd60e51b81526004016108c6906140c6565b61158781612d1f565b600b5481565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461193d5760405162461bcd60e51b81526004016108c6906140c6565b60006119498383612853565b805490915060ff161561196e5760405162461bcd60e51b81526004016108c690613e28565b805460ff191660011790555050565b6000600260085414156119c5576040805162461bcd60e51b815260206004820152601f602482015260008051602061443f833981519152604482015290519081900360640190fd5b6002600855336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611a125760405162461bcd60e51b81526004016108c6906140c6565b6060820151600e54611a23916128f0565b600e556020820151601354611a37916128f0565b6013556080820151601154611a4b916128f0565b60115561ffff85166000908152600a6020908152604080832087845290915290205460a083015160098054611aa692919084908110611a8657fe5b9060005260206000209060070201600401546127f690919063ffffffff16565b60098281548110611ab357fe5b600091825260209091206004600790920201015560408301518351611ae191611adc91906128f0565b612b83565b9150611b0e7f00000000000000000000000000000000000000000000000000000000000000008584612baf565b604083015183517ffb2b592367452f1c437675bed47f5e1e6c25188c17d7ba01a12eb030bc41ccef918691611b42916128f0565b85608001518660200151604051611b5c9493929190613c75565b60405180910390a1506001600855949350505050565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108235780601f106107f857610100808354040283529160200191610823565b600f5481565b601654610100900460ff1681565b60135481565b60098181548110611bf657600080fd5b6000918252602090912060079091020180546001820154600283015460038401546004850154600586015460069096015460ff8616975061010090950461ffff169593949293919290919088565b60006109a533846113e685604051806060016040528060258152602001614480602591393360009081526006602090815260408083206001600160a01b038d1684529091529020549190613319565b60006109a5338484613111565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611ce85760405162461bcd60e51b81526004016108c6906140c6565b6000611cf48484612853565b9050611d178261ffff16610e7b8360020154600f546127f690919063ffffffff16565b600f5561ffff821660028201556040517f8fb3b21a941c2361df46475f9ae2f7b5dac5de7bd085fa22415ec0bb30c77e2290611d5890869086908690614367565b60405180910390a150505050565b61271081565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611db45760405162461bcd60e51b81526004016108c6906140c6565b600d805460ff19168215151790556040517f59a9350977452c5240699f57f18b5915cd0440a56f08820a38b9f2432a82ba3e90611643908390613c9b565b600060026008541415611e3a576040805162461bcd60e51b815260206004820152601f602482015260008051602061443f833981519152604482015290519081900360640190fd5b6002600855336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611e875760405162461bcd60e51b81526004016108c6906140c6565b6001600160a01b038716611ead5760405162461bcd60e51b81526004016108c690613f8a565b61ffff85166000908152600a60209081526040808320878452909152902054600980549091908110611edb57fe5b600091825260209091206007909102015460ff161515600114611f105760405162461bcd60e51b81526004016108c690613fc1565b611f1a8787612aaa565b60165490915060ff161580611f4c5750611f47612710610936601854600e5461294a90919063ffffffff16565b601554115b15611f5b57611f5b6000612d1f565b7f53c03ee0722b52efeb42444f48d90173854501b3de3c590fcb445743377115c287878388888888604051611f969796959493929190613c17565b60405180910390a160016008559695505050505050565b60026008541415611ff3576040805162461bcd60e51b815260206004820152601f602482015260008051602061443f833981519152604482015290519081900360640190fd5b6002600855336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146120405760405162461bcd60e51b81526004016108c6906140c6565b801561205d5761205b8361205383612b83565b6000806131bf565b505b60006120698686612853565b600481015490915061207b90846127f6565b6004820155600061208b84612b83565b90506120b87f00000000000000000000000000000000000000000000000000000000000000008683612baf565b7fa97166013ecf5305dd9a58d6d867f05e646d4275f52d2bd52a5c7f00a690ad1b8585856040516120eb93929190613bcb565b60405180910390a1505060016008555050505050565b600d5460ff1681565b60026008541415612150576040805162461bcd60e51b815260206004820152601f602482015260008051602061443f833981519152604482015290519081900360640190fd5b6002600855336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461219d5760405162461bcd60e51b81526004016108c6906140c6565b61ffff83166000908152600a602090815260408083208584529091528120546009805490919081106121cb57fe5b906000526020600020906007020190506121f6826000015182600301546128f090919063ffffffff16565b6003820155602082015160068201541461221557602082015160068201555b815160208301516040517fdbdd25248751feb2f3b66721dfdd11662a68bc155af3771e661aabec92fba81492612250928892889291906143a1565b60405180910390a1505060016008555050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146122ab5760405162461bcd60e51b81526004016108c6906140c6565b601154156115875760006122c0601154612b83565b600060115590506122f27f00000000000000000000000000000000000000000000000000000000000000008383612baf565b7f70dc5a44816033bea80f836440f4b1fe1b3bb06b568c8dc2301901f03bf237c7828260405161157d929190613bb2565b60175481565b42841015612370576040805162461bcd60e51b815260206004820152600f60248201526e109c9a5919d94e8811561412549151608a1b604482015290519081900360640190fd5b6002546001600160a01b0380891660008181526007602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958d166060860152608085018c905260a085019590955260c08085018b90528151808603909101815260e08501825280519083012061190160f01b6101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff89166101828501526101a284018890526101c28401879052519193926101e280820193601f1981019281900390910190855afa15801561248b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906124c15750886001600160a01b0316816001600160a01b0316145b612512576040805162461bcd60e51b815260206004820152601960248201527f4272696467653a20494e56414c49445f5349474e415455524500000000000000604482015290519081900360640190fd5b61251d898989612a0a565b505050505050505050565b600660209081526000928352604080842090915290825290205481565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461258d5760405162461bcd60e51b81526004016108c6906140c6565b61271084111580156125a157506127108311155b6125bd5760405162461bcd60e51b81526004016108c690613f12565b601680546017869055601885905560ff19168615151761ff001916610100841515021762ff0000191662010000831515021790556040517f7cc11124872dc29ed41dd447ee7ab07d9eee5d8ebb55f65dd92bce19bb20224a906126299087908790879087908790613ce2565b60405180910390a15050505050565b600c5481565b60008060026008541415612687576040805162461bcd60e51b815260206004820152601f602482015260008051602061443f833981519152604482015290519081900360640190fd5b6002600855336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146126d45760405162461bcd60e51b81526004016108c6906140c6565b60006126e08686612853565b9050806003015484111561270557600381018054600090915592508284039150612721565b600381015461271490856127f6565b6003820155839250600091505b7f44d3575fd94f9e0a41d7ebbc7e952f9b615c3f8d1faf924e1e9e98c0edf0d3808686858560405161275694939291906143a1565b60405180910390a15060016008559094909350915050565b600061277c611adc836133b0565b90505b919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60105481565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008282111561284d576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6009546000906128755760405162461bcd60e51b81526004016108c690613ea4565b61ffff83166000908152600a602090815260408083208584529091528120546009805490919081106128a357fe5b60009182526020909120600790910201805490915061ffff85811661010090920416148015610bed575082816001015414610c095760405162461bcd60e51b81526004016108c690613d97565b600082820183811015610c09576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082612959575060006109a9565b8282028284828161296657fe5b0414610c095760405162461bcd60e51b815260040180806020018281038252602181526020018061445f6021913960400191505060405180910390fd5b60008082116129f9576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381612a0257fe5b049392505050565b6001600160a01b03808416600081815260066020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600080600e5411612a8f5760405162461bcd60e51b81526004016108c690613d47565b61277c600e546109366004548561294a90919063ffffffff16565b60008060045411612acd5760405162461bcd60e51b81526004016108c690613ddf565b6001600160a01b03831660009081526005602052604090205482811015612b065760405162461bcd60e51b81526004016108c6906141b9565b6000612b23600454610936600e548761294a90919063ffffffff16565b600e54909150612b3390826127f6565b600e55612b4085856133ee565b7f49995e5dd6158cf69ad3e9777c46755a1a826a446c6416992167462dad033b2a858583604051612b7393929190613bcb565b60405180910390a1949350505050565b600061277c827f000000000000000000000000000000000000000000000000000000000000000061294a565b604080518082018252601981527f7472616e7366657228616464726573732c75696e7432353629000000000000006020909101525160009081906001600160a01b038616907fa9059cbb2ab09eb219583f4a59a5d0623ade346d962bcd4e46b11da047c9049b90612c269087908790602401613bb2565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612c649190613b82565b6000604051808303816000865af19150503d8060008114612ca1576040519150601f19603f3d011682016040523d82523d6000602084013e612ca6565b606091505b5091509150818015612cd0575080511580612cd0575080806020019051810190612cd091906137e7565b612cec5760405162461bcd60e51b81526004016108c690613e6d565b5050505050565b600061277c827f00000000000000000000000000000000000000000000000000000000000000006129a3565b6000601554118015612d3357506000600f54115b156115875760095460008167ffffffffffffffff81118015612d5457600080fd5b50604051908082528060200260200182016040528015612d7e578160200160208202803683370190505b5090506000805b83811015612e4857600060098281548110612d9c57fe5b906000526020600020906007020190506000612dcd600f546109368460020154600e5461294a90919063ffffffff16565b90506000612dec836005015484600401546128f090919063ffffffff16565b905080821115612e3a57808203868581518110612e0557fe5b602002602001018181525050612e37868581518110612e2057fe5b6020026020010151866128f090919063ffffffff16565b94505b505050806001019050612d85565b50600081612ee657848015612e5f57506000601554115b15612ee15760005b84811015612edf57600060098281548110612e7e57fe5b906000526020600020906007020190506000612eaf600f54610936846002015460155461294a90919063ffffffff16565b9050612ebb84826128f0565b6005830154909450612ecd90826128f0565b60059092019190915550600101612e67565b505b6130fa565b6015548211613053578415612fbd5760155482900360005b85811015612fb6576000858281518110612f1457fe5b60200260200101511115612fae57600060098281548110612f3157fe5b906000526020600020906007020190506000612f85612f63600f5461093685600201548861294a90919063ffffffff16565b888581518110612f6f57fe5b60200260200101516128f090919063ffffffff16565b9050612f9185826128f0565b6005830154909550612fa390826128f0565b826005018190555050505b600101612efe565b5050612ee1565b60005b84811015612edf576000848281518110612fd657fe5b6020026020010151111561304b57600060098281548110612ff357fe5b90600052602060002090600702019050600085838151811061301157fe5b6020026020010151905061302e81856128f090919063ffffffff16565b600583015490945061304090826128f0565b826005018190555050505b600101612fc0565b60005b848110156130f857600084828151811061306c57fe5b602002602001015111156130f05760006009828154811061308957fe5b9060005260206000209060070201905060006130c7856109366015548987815181106130b157fe5b602002602001015161294a90919063ffffffff16565b90506130d384826128f0565b60058301549094506130e590826128f0565b826005018190555050505b600101613056565b505b60155461310790826127f6565b6015555050505050565b6001600160a01b03831660009081526005602052604090205461313490826127f6565b6001600160a01b03808516600090815260056020526040808220939093559084168152205461316390826128f0565b6001600160a01b0380841660008181526005602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600080600f54116131e25760405162461bcd60e51b81526004016108c690614114565b6131eb84612cf3565b905060008315613230576132106127106109366010548561294a90919063ffffffff16565b905061321c82826127f6565b60125490925061322c90826128f0565b6012555b82156132475760155461324390836128f0565b6015555b60045482901561326f5761326c600e546109366004548661294a90919063ffffffff16565b90505b600e5461327c90846128f0565b600e55613289878261347f565b7fb4c03061fb5b7fed76389d5af8f2e0ddb09f8c70d1333abbb62582835e10accb878285856040516132be9493929190613c75565b60405180910390a160165460ff1615806132f557506132f0612710610936601854600e5461294a90919063ffffffff16565b601554115b1561330f5760165461330f9062010000900460ff16612d1f565b5050949350505050565b600081848411156133a85760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561336d578181015183820152602001613355565b50505050905090810190601f16801561339a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600080600454116133d35760405162461bcd60e51b81526004016108c690614009565b61277c600454610936600e548561294a90919063ffffffff16565b6001600160a01b03821660009081526005602052604090205461341190826127f6565b6001600160a01b03831660009081526005602052604090205560045461343790826127f6565b6004556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b60045461348c90826128f0565b6004556001600160a01b0382166000908152600560205260409020546134b290826128f0565b6001600160a01b03831660008181526005602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b604051806040016040528060008152602001600081525090565b604051806101000160405280600015158152602001600061ffff1681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b80356001600160a01b038116811461277f57600080fd5b803561ffff8116811461277f57600080fd5b6000602082840312156135df578081fd5b610c09826135a5565b600080604083850312156135fa578081fd5b613603836135a5565b9150613611602084016135a5565b90509250929050565b60008060006060848603121561362e578081fd5b613637846135a5565b9250613645602085016135a5565b9150604084013590509250925092565b600080600080600080600060e0888a03121561366f578283fd5b613678886135a5565b9650613686602089016135a5565b95506040880135945060608801359350608088013560ff811681146136a9578384fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156136d8578182fd5b6136e1836135a5565b946020939093013593505050565b600080600060608486031215613703578283fd5b61370c846135a5565b925060208401359150613721604085016135a5565b90509250925092565b60008060008060008060a08789031215613742578182fd5b61374b876135a5565b955060208701359450613760604088016135bc565b935060608701359250608087013567ffffffffffffffff80821115613783578384fd5b818901915089601f830112613796578384fd5b8135818111156137a4578485fd5b8a60208285010111156137b5578485fd5b6020830194508093505050509295509295509295565b6000602082840312156137dc578081fd5b8135610c0981614430565b6000602082840312156137f8578081fd5b8151610c0981614430565b600080600080600060a0868803121561381a578283fd5b853561382581614430565b94506020860135935060408601359250606086013561384381614430565b9150608086013561385381614430565b809150509295509295909350565b600060c08284031215613872578081fd5b60405160c0810181811067ffffffffffffffff8211171561388f57fe5b8060405250825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a08201528091505092915050565b600080604083850312156138e6578182fd5b6136e1836135bc565b600080600080848603610120811215613906578283fd5b61390f866135bc565b945060208601359350613924604087016135a5565b925060c0605f1982011215613937578182fd5b5060405160c0810181811067ffffffffffffffff8211171561395557fe5b8060405250606086013581526080860135602082015260a0860135604082015260c0860135606082015260e0860135608082015261010086013560a08201528091505092959194509250565b600080600080608085870312156139b6578182fd5b6139bf856135bc565b9350602085013592506139d4604086016135a5565b9396929550929360600135925050565b600080600080600060a086880312156139fb578283fd5b613a04866135bc565b945060208601359350613a19604087016135a5565b94979396509394606081013594506080013592915050565b60008060008060008060c08789031215613a49578384fd5b613a52876135bc565b955060208701359450613a67604088016135a5565b9350606087013592506080870135915060a0870135613a8581614430565b809150509295509295509295565b60008060008385036080811215613aa8578182fd5b613ab1856135bc565b9350602085013592506040603f1982011215613acb578182fd5b506040516040810181811067ffffffffffffffff82111715613ae957fe5b604090815285013581526060909401356020850152509093909250565b600080600060608486031215613b1a578081fd5b613b23846135bc565b925060208401359150613721604085016135bc565b600080600060608486031215613b4c578081fd5b613b55846135bc565b95602085013595506040909401359392505050565b600060208284031215613b7b578081fd5b5035919050565b60008251613b94818460208701614400565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b03948516815260208101939093526040830191909152909116606082015260800190565b600060018060a01b038916825287602083015286604083015261ffff8616606083015284608083015260c060a08301528260c0830152828460e084013781830160e090810191909152601f909201601f191601019695505050505050565b6001600160a01b0394909416845260208401929092526040830152606082015260800190565b901515815260200190565b971515885261ffff96909616602088015260408701949094526060860192909252608085015260a084015260c083015260e08201526101000190565b941515855260208501939093526040840191909152151560608301521515608082015260a00190565b90815260200190565b6000602082528251806020840152613d33816040850160208701614400565b601f01601f19169190910160400192915050565b60208082526030908201527f53746172676174653a2063616e7420636f6e76657274205344746f4c5020776860408201526f0656e20746f74616c4c6971203d3d20360841b606082015260800190565b60208082526028908201527f53746172676174653a206c6f63616c20636861696e5061746820646f6573206e6040820152671bdd08195e1a5cdd60c21b606082015260800190565b60208082526029908201527f53746172676174653a2063616e74206275726e207768656e20746f74616c5375604082015268070706c79203d3d20360bc1b606082015260800190565b60208082526025908201527f53746172676174653a20636861696e5061746820697320616c72656164792061604082015264637469766560d81b606082015260800190565b60208082526019908201527f53746172676174653a205452414e534645525f4641494c454400000000000000604082015260600190565b6020808252601d908201527f53746172676174653a206e6f20636861696e7061746873206578697374000000604082015260600190565b60208082526017908201527f4272696467653a2063756d2066656573203e2031303025000000000000000000604082015260600190565b6020808252601b908201527f53746172676174653a2077726f6e672044656c746120706172616d0000000000604082015260600190565b60208082526021908201527f53746172676174653a20666565206c6962726172792063616e742062652030786040820152600360fc1b606082015260800190565b6020808252601d908201527f53746172676174653a205f66726f6d2063616e6e6f7420626520307830000000604082015260600190565b60208082526028908201527f53746172676174653a20636f756e74657220636861696e50617468206973206e6040820152676f7420726561647960c01b606082015260800190565b60208082526033908201527f53746172676174653a2063616e7420636f6e76657274204c50746f53442077686040820152720656e20746f74616c537570706c79203d3d203606c1b606082015260800190565b60208082526044908201527f53746172676174653a2063616e7420637265617465436861696e50617468206f60408201527f66206578697374696e6720647374436861696e496420616e64205f647374506f6060820152631bdb125960e21b608082015260a00190565b6020808252602e908201527f53746172676174653a206f6e6c792074686520726f757465722063616e20636160408201526d1b1b081d1a1a5cc81b595d1a1bd960921b606082015260800190565b6020808252601d908201527f53746172676174653a204e6f20436861696e5061746873206578697374000000604082015260600190565b6020808252601d908201527f53746172676174653a206473742062616c616e636520746f6f206c6f77000000604082015260600190565b6020808252601b908201527f53746172676174653a20736c69707061676520746f6f20686967680000000000604082015260600190565b60208082526026908201527f53746172676174653a206e6f7420656e6f756768204c5020746f6b656e7320746040820152653790313ab93760d11b606082015260800190565b6020808252601b908201527f53746172676174653a20737761702066756e632073746f707065640000000000604082015260600190565b60006101008201905082511515825261ffff602084015116602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015292915050565b815181526020918201519181019190915260400190565b600060c082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015292915050565b61ffff95909516855260208501939093526001600160a01b039190911660408401526060830152608082015260a00190565b61ffff98909816885260208801969096526001600160a01b039490941660408701526060860192909252608085015260a084015260c083015260e08201526101000190565b61ffff93841681526020810192909252909116604082015260600190565b61ffff9390931683526020830191909152604082015260600190565b61ffff94909416845260208401929092526040830152606082015260800190565b918252602082015260400190565b948552602085019390935261ffff9190911660408401526001600160a01b03166060830152608082015260a00190565b60005b8381101561441b578181015183820152602001614403565b8381111561442a576000848401525b50505050565b801515811461158757600080fdfe5265656e7472616e637947756172643a207265656e7472616e742063616c6c00536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212207aaedc0ccd2d34f140152446b43279f2d93751be1b5b4321d4ba3041dfdc231164736f6c634300070600330000000000000000000000000000000000000000000000000000000000000001000000000000000000000000af5191b0de278c7286d6c7cc6ab6bb8a73ba2cd600000000000000000000000004068da6c83afcfa0e13ba15a6696662335d5b750000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000600000000000000000000000006d538690af257da524f25d0cd52fd85b1c2173e00000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000b55534420436f696e2d4c500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006532a555344430000000000000000000000000000000000000000000000000000

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

0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000af5191b0de278c7286d6c7cc6ab6bb8a73ba2cd600000000000000000000000004068da6c83afcfa0e13ba15a6696662335d5b750000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000600000000000000000000000006d538690af257da524f25d0cd52fd85b1c2173e00000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000b55534420436f696e2d4c500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006532a555344430000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _poolId (uint256): 1
Arg [1] : _router (address): 0xaf5191b0de278c7286d6c7cc6ab6bb8a73ba2cd6
Arg [2] : _token (address): 0x04068da6c83afcfa0e13ba15a6696662335d5b75
Arg [3] : _sharedDecimals (uint256): 6
Arg [4] : _localDecimals (uint256): 6
Arg [5] : _feeLibrary (address): 0x06d538690af257da524f25d0cd52fd85b1c2173e
Arg [6] : _name (string): USD Coin-LP
Arg [7] : _symbol (string): S*USDC

-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [1] : 000000000000000000000000af5191b0de278c7286d6c7cc6ab6bb8a73ba2cd6
Arg [2] : 00000000000000000000000004068da6c83afcfa0e13ba15a6696662335d5b75
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [5] : 00000000000000000000000006d538690af257da524f25d0cd52fd85b1c2173e
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [8] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [9] : 55534420436f696e2d4c50000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [11] : 532a555344430000000000000000000000000000000000000000000000000000


Deployed ByteCode Sourcemap

327:26756:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2736:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;261:18:2;;;:::i;:::-;;;;;;;:::i;9031:528:4:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2492:147:2:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;10334:699:4:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2464:33::-;;;:::i;2195:29::-;;;:::i;20577:339::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;6175:102::-;;;:::i;617:26:2:-;;;:::i;6732:2116:4:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2836:26::-;;;:::i;15687:720::-;;;;;;:::i;:::-;;:::i;:::-;;2790:331:2;;;;;;:::i;:::-;;:::i;2900:19:4:-;;;:::i;3045:25::-;;;:::i;311:108:2:-;;;:::i;588:23::-;;;:::i;3201:24:4:-;;;:::i;451:31:2:-;;;:::i;3127:209::-;;;;;;:::i;:::-;;:::i;1653:31:4:-;;;:::i;6395:159::-;;;;;;:::i;:::-;;:::i;18755:320::-;;;;;;:::i;:::-;;:::i;17002:249::-;;;;;;:::i;:::-;;:::i;1503:74::-;;;;;;:::i;:::-;;:::i;2539:29::-;;;:::i;16790:206::-;;;;;;:::i;:::-;;:::i;649:44:2:-;;;;;;:::i;:::-;;:::i;9737:591:4:-;;;;;;:::i;:::-;;:::i;769:41:2:-;;;;;;:::i;:::-;;:::i;17995:89:4:-;;;;;;:::i;:::-;;:::i;1741:29::-;;;:::i;18090:313::-;;;;;;:::i;:::-;;:::i;12968:884::-;;;;;;:::i;:::-;;:::i;285:20:2:-;;;:::i;2324:26:4:-;;;:::i;2974:27::-;;;:::i;2611:24::-;;;:::i;1422:29::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;:::i;3342:260:2:-;;;;;;:::i;:::-;;:::i;2645:139::-;;;;;;:::i;:::-;;:::i;16413:371:4:-;;;;;;:::i;:::-;;:::i;606:46::-;;;:::i;17257:135::-;;;;;;:::i;:::-;;:::i;11267:741::-;;;;;;:::i;:::-;;:::i;14086:608::-;;;;;;:::i;:::-;;:::i;2101:20::-;;;:::i;12304:486::-;;;;;;:::i;:::-;;:::i;18409:340::-;;;;;;:::i;:::-;;:::i;3112:26::-;;;:::i;3608:724:2:-;;;;;;:::i;:::-;;:::i;699:64::-;;;;;;:::i;:::-;;:::i;17398:591:4:-;;;;;;:::i;:::-;;:::i;1839:28::-;;;:::i;14926:656::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;19287:135::-;;;;;;:::i;:::-;;:::i;2037:31::-;;;:::i;2393:24::-;;;:::i;1975:30::-;;;:::i;1903:36::-;;;:::i;2736:25::-;;;-1:-1:-1;;;;;2736:25:4;;:::o;261:18:2:-;;;;;;;;;;;;;;;-1:-1:-1;;261:18:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9031:528:4:-;9134:18;;:::i;:::-;1680:1:5;2260:7;;:19;;2252:63;;;;;-1:-1:-1;;;2252:63:5;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2252:63:5;;;;;;;;;;;;;;;1680:1;2390:7;:18;5191:10:4::1;-1:-1:-1::0;;;;;5205:6:4::1;5191:20;;5183:79;;;;-1:-1:-1::0;;;5183:79:4::1;;;;;;;:::i;:::-;;;;;;;;;9164:20:::2;9187:38;9201:11;9214:10;9187:13;:38::i;:::-;9243:8:::0;;9164:61;;-1:-1:-1;9243:8:4::2;;:16;;:8:::0;:16:::2;9235:69;;;;-1:-1:-1::0;;;9235:69:4::2;;;;;;;:::i;:::-;9334:10;::::0;::::2;::::0;9323:6:::2;::::0;::::2;::::0;:22:::2;::::0;:10:::2;:22::i;:::-;9314:6;::::0;::::2;:31:::0;9406:11:::2;::::0;9391:9:::2;::::0;::::2;::::0;9372:14:::2;::::0;:46:::2;::::0;9406:11;9372:29:::2;::::0;:14;:18:::2;:29::i;:::-;:33:::0;::::2;:46::i;:::-;9355:14;::::0;::::2;:63:::0;;;9440:10:::2;::::0;::::2;::::0;;9428:22;;;:9:::2;9460:14:::0;;;9489:63:::2;::::0;::::2;::::0;::::2;::::0;9501:11;;9514:10;;9355:63;9489::::2;:::i;:::-;;;;;;;;-1:-1:-1::0;1637:1:5;2563:7;:22;9031:528:4;;-1:-1:-1;;9031:528:4:o;2492:147:2:-;2559:4;2575:36;2584:10;2596:7;2605:5;2575:8;:36::i;:::-;-1:-1:-1;2628:4:2;2492:147;;;;;:::o;10334:699:4:-;10481:16;1680:1:5;2260:7;;:19;;2252:63;;;;;-1:-1:-1;;;2252:63:5;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2252:63:5;;;;;;;;;;;;;;;1680:1;2390:7;:18;5191:10:4::1;-1:-1:-1::0;;;;;5205:6:4::1;5191:20;;5183:79;;;;-1:-1:-1::0;;;5183:79:4::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;10517:21:4;::::2;10509:63;;;;-1:-1:-1::0;;;10509:63:4::2;;;;;;;:::i;:::-;10605:11;::::0;10582:20:::2;10672:27;10605:11:::0;10672:13:::2;:27::i;:::-;10649:50;;10726:12;10714:9;:24;10710:54;;;10752:12;10740:24;;10710:54;10786:28;10797:5;10804:9;10786:10;:28::i;:::-;10775:39:::0;-1:-1:-1;10838:26:4::2;:12:::0;10775:39;10838:16:::2;:26::i;:::-;10824:11;:40:::0;10874:16:::2;10893:22;10906:8:::0;10893:12:::2;:22::i;:::-;10874:41;;10925:35;10939:5;10946:3;10951:8;10925:13;:35::i;:::-;10975:51;10994:5;11001:9;11012:8;11022:3;10975:51;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;1637:1:5;2563:7;:22;-1:-1:-1;10334:699:4;;-1:-1:-1;;;10334:699:4:o;2464:33::-;;;;:::o;2195:29::-;;;;:::o;20577:339::-;20662:16;;:::i;:::-;20723:33;;;20690:19;20723:33;;;:20;:33;;;;;;;;:45;;;;;;;;;20712:10;:57;;:10;;20723:45;20712:57;;;;;;;;;;;;;;;20690:79;;;;;;;;;20712:57;;;;;;;20690:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20787:28:4;;;:58;;;;;20835:10;20819:2;:12;;;:26;20787:58;20779:111;;;;-1:-1:-1;;;20779:111:4;;;;;;;:::i;:::-;20907:2;20577:339;-1:-1:-1;;;20577:339:4:o;6175:102::-;6253:10;:17;6175:102;:::o;617:26:2:-;;;;:::o;6732:2116:4:-;6957:14;;:::i;:::-;1680:1:5;2260:7;;:19;;2252:63;;;;;-1:-1:-1;;;2252:63:5;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2252:63:5;;;;;;;;;;;;;;;1680:1;2390:7;:18;5191:10:4::1;-1:-1:-1::0;;;;;5205:6:4::1;5191:20;;5183:79;;;;-1:-1:-1::0;;;5183:79:4::1;;;;;;;:::i;:::-;6992:8:::2;::::0;::::2;;6991:9;6983:49;;;;-1:-1:-1::0;;;6983:49:4::2;;;;;;;:::i;:::-;7042:20;7065:38;7079:11;7092:10;7065:13;:38::i;:::-;7121:8:::0;;7042:61;;-1:-1:-1;7121:8:4::2;;:16;;:8:::0;:16:::2;7113:69;;;;-1:-1:-1::0;;;7113:69:4::2;;;;;;;:::i;:::-;7193:16;7212:23;7225:9;7212:12;:23::i;:::-;7193:42;;7245:19;7267:26;7280:12;7267;:26::i;:::-;7245:48;;7347:16;7386:10;;;;;;;;;-1:-1:-1::0;;;;;7386:10:4::2;-1:-1:-1::0;;;;;7366:39:4::2;;7406:6;7414:10;7426:11;7439:5;7446:8;7366:89;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7347:108;;7571:25;7585:1;:10;;;7571:9;;:13;;:25;;;;:::i;:::-;7559:9;:37:::0;7724:7:::2;::::0;::::2;::::0;7705:13:::2;::::0;::::2;::::0;7692:7:::2;::::0;::::2;::::0;7679:53:::2;::::0;7724:7;7679:40:::2;::::0;;;:8;;:12:::2;:21::i;:::-;:25:::0;::::2;:40::i;:53::-;7668:64:::0;;;7807:10:::2;::::0;::::2;::::0;7822:11;;7794:24:::2;::::0;:12:::2;:24::i;:::-;:39;;7786:79;;;;-1:-1:-1::0;;;7786:79:4::2;;;;;;;:::i;:::-;8126:37;8152:1;:10;;;8126:21;8139:1;:7;;;8126:8;:12;;:21;;;;:::i;:::-;:25:::0;::::2;:37::i;:::-;8112:11;::::0;::::2;:51:::0;;;8221:10:::2;::::0;::::2;::::0;:25:::2;;8213:67;;;;-1:-1:-1::0;;;8213:67:4::2;;;;;;;:::i;:::-;8318:11;::::0;::::2;::::0;8303:10:::2;::::0;::::2;::::0;:27:::2;::::0;:14:::2;:27::i;:::-;8290:10;::::0;::::2;:40:::0;8341:190;::::2;;;8387:41;8417:1;:10;;;8387:25;8403:8;8387:11;;:15;;:25;;;;:::i;:41::-;8373:11;:55:::0;8341:190:::2;;;8449:10;::::0;::::2;::::0;:14;8445:86:::2;;8509:10;::::0;::::2;::::0;8493:11:::2;::::0;:27:::2;::::0;:15:::2;:27::i;:::-;8479:11;:41:::0;8445:86:::2;8590:7;::::0;::::2;;8589:8;::::0;:78:::2;;;8616:51;647:5;8616:31;8635:11;;8616:14;;:18;;:31;;;;:::i;:51::-;8601:11;;:66;;8589:78;8585:132;;;8690:15;::::0;8683:23:::2;::::0;8690:15:::2;::::0;::::2;;;8683:6;:23::i;:::-;8732:91;8737:11;8750:10;8762:5;8769:1;:8;;;8779:1;:10;;;8791:1;:7;;;8800:1;:13;;;8815:1;:7;;;8732:91;;;;;;;;;;;;;:::i;:::-;;;;;;;;1637:1:5::0;2563:7;:22;8840:1:4;6732:2116;-1:-1:-1;;;;;;;;;;6732:2116:4:o;2836:26::-;;;;:::o;15687:720::-;5191:10;-1:-1:-1;;;;;5205:6:4;5191:20;;5183:79;;;;-1:-1:-1;;;5183:79:4;;;;;;;:::i;:::-;15834:9:::1;15829:296;15853:10;:17:::0;15849:21;::::1;15829:296;;;15891:19;15913:10;15924:1;15913:13;;;;;;;;;::::0;;;::::1;::::0;;;15891:35:::1;::::0;;::::1;::::0;;::::1;::::0;;15913:13:::1;::::0;;::::1;::::0;;::::1;15891:35:::0;;::::1;::::0;::::1;;;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;;::::0;;;;;;-1:-1:-1;15954:28:4;;::::1;;:58:::0;::::1;;;;16002:10;15986:2;:12;;;:26;15954:58;15940:72;;16035:6;16034:7;16026:88;;;;-1:-1:-1::0;;;16026:88:4::1;;;;;;;:::i;:::-;-1:-1:-1::0;;15872:3:4::1;;15829:296;;;-1:-1:-1::0;16148:11:4::1;::::0;:24:::1;::::0;16164:7;16148:15:::1;:24::i;:::-;16134:11;:38:::0;16230:10:::1;:17:::0;;16182:33:::1;::::0;;::::1;;::::0;;;:20:::1;:33;::::0;;;;;;;:45;;;;;;;;:65;;;16273:62;;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16257:79;::::1;::::0;;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;16257:79:4;;::::1;::::0;::::1;;::::0;;;::::1;-1:-1:-1::0;;16257:79:4::1;::::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16351:49;::::1;::::0;::::1;::::0;16182:33;;:45;;16273:62;;16351:49:::1;:::i;:::-;;;;;;;;15687:720:::0;;;:::o;2790:331:2:-;-1:-1:-1;;;;;2921:15:2;;2901:4;2921:15;;;:9;:15;;;;;;;;2937:10;2921:27;;;;;;;;-1:-1:-1;;2921:42:2;2917:141;;-1:-1:-1;;;;;3009:15:2;;;;;;:9;:15;;;;;;;;3025:10;3009:27;;;;;;;;:38;;3041:5;3009:31;:38::i;:::-;-1:-1:-1;;;;;2979:15:2;;;;;;:9;:15;;;;;;;;2995:10;2979:27;;;;;;;:68;2917:141;3067:26;3077:4;3083:2;3087:5;3067:9;:26::i;:::-;-1:-1:-1;3110:4:2;2790:331;;;;;:::o;2900:19:4:-;;;;;;:::o;3045:25::-;;;;;;;;;:::o;311:108:2:-;353:66;311:108;:::o;588:23::-;;;;:::o;3201:24:4:-;;;;:::o;451:31:2:-;;;;:::o;3127:209::-;3240:10;3215:4;3261:21;;;:9;:21;;;;;;;;-1:-1:-1;;;;;3261:30:2;;;;;;;;;;3215:4;;3231:77;;3252:7;;3261:46;;3296:10;3261:34;:46::i;:::-;3231:8;:77::i;1653:31:4:-;;;:::o;6395:159::-;6483:7;1680:1:5;2260:7;;:19;;2252:63;;;;;-1:-1:-1;;;2252:63:5;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2252:63:5;;;;;;;;;;;;;;;1680:1;2390:7;:18;5191:10:4::1;-1:-1:-1::0;;;;;5205:6:4::1;5191:20;;5183:79;;;;-1:-1:-1::0;;;5183:79:4::1;;;;;;;:::i;:::-;6509:38:::2;6520:3;6525:9;6536:4;6542::::0;6509:10:::2;:38::i;:::-;1637:1:5::0;2563:7;:22;6502:45:4;6395:159;-1:-1:-1;;;6395:159:4:o;18755:320::-;5191:10;-1:-1:-1;;;;;5205:6:4;5191:20;;5183:79;;;;-1:-1:-1;;;5183:79:4;;;;;;;:::i;:::-;18834:14:::1;::::0;:18;18830:239:::1;;18868:18;18889:28;18902:14;;18889:12;:28::i;:::-;18948:1;18931:14;:18:::0;18868:49;-1:-1:-1;18963:37:4::1;18977:5;18984:3:::0;18868:49;18963:13:::1;:37::i;:::-;19019:39;19042:3;19047:10;19019:39;;;;;;;:::i;:::-;;;;;;;;18830:239;;18755:320:::0;:::o;17002:249::-;5191:10;-1:-1:-1;;;;;5205:6:4;5191:20;;5183:79;;;;-1:-1:-1;;;5183:79:4;;;;;;;:::i;:::-;-1:-1:-1;;;;;17088:31:4;::::1;17080:77;;;;-1:-1:-1::0;;;17080:77:4::1;;;;;;;:::i;:::-;17167:10;:28:::0;;-1:-1:-1;;;;;;17167:28:4::1;-1:-1:-1::0;;;;;17167:28:4;::::1;;::::0;;17210:34:::1;::::0;::::1;::::0;::::1;::::0;17167:28;;17210:34:::1;:::i;:::-;;;;;;;;17002:249:::0;:::o;1503:74::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;2539:29::-;;;;:::o;16790:206::-;5191:10;-1:-1:-1;;;;;5205:6:4;5191:20;;5183:79;;;;-1:-1:-1;;;5183:79:4;;;;;;;:::i;:::-;647:5:::1;16864:10;:28;;16856:64;;;;-1:-1:-1::0;;;16856:64:4::1;;;;;;;:::i;:::-;16930:9;:22:::0;;;16967::::1;::::0;::::1;::::0;::::1;::::0;16942:10;;16967:22:::1;:::i;649:44:2:-:0;;;;;;;;;;;;;:::o;9737:591:4:-;1680:1:5;2260:7;;:19;;2252:63;;;;;-1:-1:-1;;;2252:63:5;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2252:63:5;;;;;;;;;;;;;;;1680:1;2390:7;:18;5191:10:4::1;-1:-1:-1::0;;;;;5205:6:4::1;5191:20;;5183:79;;;;-1:-1:-1::0;;;5183:79:4::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;9922:21:4;::::2;9914:63;;;;-1:-1:-1::0;;;9914:63:4::2;;;;;;;:::i;:::-;9987:16;10006:28;10017:5;10024:9;10006:10;:28::i;:::-;10069:7;::::0;9987:47;;-1:-1:-1;10069:7:4::2;;10068:8;::::0;:75:::2;;;10094:49;647:5;10094:29;10113:9;;10094:14;;:18;;:29;;;;:::i;:49::-;10080:11;;:63;10068:75;10064:127;;;10166:13;::::0;10159:21:::2;::::0;10166:13;;::::2;;;10159:6;:21::i;:::-;10200:16;10219:22;10232:8;10219:12;:22::i;:::-;10200:41;;10256:65;10269:11;10282:10;10294:5;10301:9;10312:8;10256:65;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;1637:1:5;2563:7;:22;-1:-1:-1;;;;9737:591:4:o;769:41:2:-;;;;;;;;;;;;;:::o;17995:89:4:-;5191:10;-1:-1:-1;;;;;5205:6:4;5191:20;;5183:79;;;;-1:-1:-1;;;5183:79:4;;;;;;;:::i;:::-;18060:17:::1;18067:9;18060:6;:17::i;1741:29::-:0;;;;:::o;18090:313::-;5191:10;-1:-1:-1;;;;;5205:6:4;5191:20;;5183:79;;;;-1:-1:-1;;;5183:79:4;;;;;;;:::i;:::-;18187:20:::1;18210:38;18224:11;18237:10;18210:13;:38::i;:::-;18266:8:::0;;18187:61;;-1:-1:-1;18266:8:4::1;;:17;18258:67;;;;-1:-1:-1::0;;;18258:67:4::1;;;;;;;:::i;:::-;18381:15:::0;;-1:-1:-1;;18381:15:4::1;18392:4;18381:15;::::0;;-1:-1:-1;;18090:313:4:o;12968:884::-;13140:16;1680:1:5;2260:7;;:19;;2252:63;;;;;-1:-1:-1;;;2252:63:5;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2252:63:5;;;;;;;;;;;;;;;1680:1;2390:7;:18;5191:10:4::1;-1:-1:-1::0;;;;;5205:6:4::1;5191:20;;5183:79;;;;-1:-1:-1::0;;;5183:79:4::1;;;;;;;:::i;:::-;13229:8:::2;::::0;::::2;::::0;13210:14:::2;::::0;:28:::2;::::0;:18:::2;:28::i;:::-;13193:14;:45:::0;13299:8:::2;::::0;::::2;::::0;13285:9:::2;::::0;:23:::2;::::0;:13:::2;:23::i;:::-;13273:9;:35:::0;13393:14:::2;::::0;::::2;::::0;13370:18:::2;::::0;:38:::2;::::0;:22:::2;:38::i;:::-;13349:18;:59:::0;13466:33:::2;::::0;::::2;13441:22;13466:33:::0;;;:20:::2;:33;::::0;;;;;;;:45;;;;;;;;;13589:12:::2;::::0;::::2;::::0;13554:10:::2;:26:::0;;:48:::2;::::0;13589:12;13554:10;13466:45;;13554:26;::::2;;;;;;;;;;;;;;;:30;;;:34;;:48;;;;:::i;:::-;13521:10;13532:14;13521:26;;;;;;;;;::::0;;;::::2;::::0;;;:30:::2;:26;::::0;;::::2;;:30;:81:::0;13703:11:::2;::::0;::::2;::::0;13689:9;;13676:40:::2;::::0;13689:26:::2;::::0;:9;:13:::2;:26::i;:::-;13676:12;:40::i;:::-;13665:51;;13726:35;13740:5;13747:3;13752:8;13726:13;:35::i;:::-;13806:11;::::0;::::2;::::0;13792:9;;13776:69:::2;::::0;13787:3;;13792:26:::2;::::0;:13:::2;:26::i;:::-;13820:2;:14;;;13836:2;:8;;;13776:69;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;1637:1:5;2563:7;:22;12968:884:4;;-1:-1:-1;;;;12968:884:4:o;285:20:2:-;;;;;;;;;;;;;;;-1:-1:-1;;285:20:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2324:26:4;;;;:::o;2974:27::-;;;;;;;;;:::o;2611:24::-;;;;:::o;1422:29::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1422:29:4;;;;;;;;;;;;;;;;;:::o;3342:260:2:-;3435:4;3451:123;3460:10;3472:7;3481:92;3516:15;3481:92;;;;;;;;;;;;;;;;;3491:10;3481:21;;;;:9;:21;;;;;;;;-1:-1:-1;;;;;3481:30:2;;;;;;;;;;;:92;:34;:92::i;2645:139::-;2708:4;2724:32;2734:10;2746:2;2750:5;2724:9;:32::i;16413:371:4:-;5191:10;-1:-1:-1;;;;;5205:6:4;5191:20;;5183:79;;;;-1:-1:-1;;;5183:79:4;;;;;;;:::i;:::-;16560:20:::1;16583:38;16597:11;16610:10;16583:13;:38::i;:::-;16560:61;;16645:39;16676:7;16645:39;;:26;16661:2;:9;;;16645:11;;:15;;:26;;;;:::i;:39::-;16631:11;:53:::0;16694:19:::1;::::0;::::1;:9;::::0;::::1;:19:::0;16728:49:::1;::::0;::::1;::::0;::::1;::::0;16744:11;;16757:10;;16706:7;;16728:49:::1;:::i;:::-;;;;;;;;5272:1;16413:371:::0;;;:::o;606:46::-;647:5;606:46;:::o;17257:135::-;5191:10;-1:-1:-1;;;;;5205:6:4;5191:20;;5183:79;;;;-1:-1:-1;;;5183:79:4;;;;;;;:::i;:::-;17324:8:::1;:20:::0;;-1:-1:-1;;17324:20:4::1;::::0;::::1;;;::::0;;17359:26:::1;::::0;::::1;::::0;::::1;::::0;17324:20;;17359:26:::1;:::i;11267:741::-:0;11470:16;1680:1:5;2260:7;;:19;;2252:63;;;;;-1:-1:-1;;;2252:63:5;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2252:63:5;;;;;;;;;;;;;;;1680:1;2390:7;:18;5191:10:4::1;-1:-1:-1::0;;;;;5205:6:4::1;5191:20;;5183:79;;;;-1:-1:-1::0;;;5183:79:4::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;11506:21:4;::::2;11498:63;;;;-1:-1:-1::0;;;11498:63:4::2;;;;;;;:::i;:::-;11613:33;::::0;::::2;;::::0;;;:20:::2;:33;::::0;;;;;;;:45;;;;;;;;;11602:10:::2;:57:::0;;:10;;11613:45;11602:57;::::2;;;;;;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;;:63:::0;::::2;;:71;;:63:::0;:71:::2;11594:124;;;;-1:-1:-1::0;;;11594:124:4::2;;;;;;;:::i;:::-;11739:28;11750:5;11757:9;11739:10;:28::i;:::-;11804:7;::::0;11728:39;;-1:-1:-1;11804:7:4::2;;11803:8;::::0;:75:::2;;;11829:49;647:5;11829:29;11848:9;;11829:14;;:18;;:29;;;;:::i;:49::-;11815:11;;:63;11803:75;11799:119;;;11894:13;11901:5;11894:6;:13::i;:::-;11932:69;11944:5;11951:9;11962:8;11972:11;11985:10;11997:3;;11932:69;;;;;;;;;;;;:::i;:::-;;;;;;;;1637:1:5::0;2563:7;:22;11267:741:4;;-1:-1:-1;;;;;;11267:741:4:o;14086:608::-;1680:1:5;2260:7;;:19;;2252:63;;;;;-1:-1:-1;;;2252:63:5;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2252:63:5;;;;;;;;;;;;;;;1680:1;2390:7;:18;5191:10:4::1;-1:-1:-1::0;;;;;5205:6:4::1;5191:20;;5183:79;;;;-1:-1:-1::0;;;5183:79:4::1;;;;;;;:::i;:::-;14305:19:::0;;14301:110:::2;;14340:60;14351:3;14356:29;14369:15;14356:12;:29::i;:::-;14387:5;14394::::0;14340:10:::2;:60::i;:::-;;14301:110;14421:20;14444:38;14458:11;14471:10;14444:13;:38::i;:::-;14501:6;::::0;::::2;::::0;14421:61;;-1:-1:-1;14501:21:4::2;::::0;14512:9;14501:10:::2;:21::i;:::-;14492:6;::::0;::::2;:30:::0;14533:16:::2;14552:23;14565:9:::0;14552:12:::2;:23::i;:::-;14533:42;;14585:35;14599:5;14606:3;14611:8;14585:13;:35::i;:::-;14635:52;14655:3;14660:9;14671:15;14635:52;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;1637:1:5;2563:7;:22;-1:-1:-1;;;;;14086:608:4:o;2101:20::-;;;;;;:::o;12304:486::-;1680:1:5;2260:7;;:19;;2252:63;;;;;-1:-1:-1;;;2252:63:5;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2252:63:5;;;;;;;;;;;;;;;1680:1;2390:7;:18;5191:10:4::1;-1:-1:-1::0;;;;;5205:6:4::1;5191:20;;5183:79;;;;-1:-1:-1::0;;;5183:79:4::1;;;;;;;:::i;:::-;12497:33:::2;::::0;::::2;12463:20;12497:33:::0;;;:20:::2;:33;::::0;;;;;;;:45;;;;;;;;;12486:10:::2;:57:::0;;:10;;12497:45;12486:57;::::2;;;;;;;;;;;;;;;12463:80;;12566:26;12581:2;:10;;;12566:2;:10;;;:14;;:26;;;;:::i;:::-;12553:10;::::0;::::2;:39:::0;12625:15:::2;::::0;::::2;::::0;12606::::2;::::0;::::2;::::0;:34:::2;12602:98;;12674:15;::::0;::::2;::::0;12656::::2;::::0;::::2;:33:::0;12602:98:::2;12755:10:::0;;12767:15:::2;::::0;::::2;::::0;12714:69:::2;::::0;::::2;::::0;::::2;::::0;12730:11;;12743:10;;12755;12767:15;12714:69:::2;:::i;:::-;;;;;;;;-1:-1:-1::0;;1637:1:5;2563:7;:22;-1:-1:-1;;12304:486:4:o;18409:340::-;5191:10;-1:-1:-1;;;;;5205:6:4;5191:20;;5183:79;;;;-1:-1:-1;;;5183:79:4;;;;;;;:::i;:::-;18492:18:::1;::::0;:22;18488:255:::1;;18530:18;18551:32;18564:18;;18551:12;:32::i;:::-;18618:1;18597:18;:22:::0;18530:53;-1:-1:-1;18633:37:4::1;18647:5;18654:3:::0;18530:53;18633:13:::1;:37::i;:::-;18689:43;18716:3;18721:10;18689:43;;;;;;;:::i;3112:26::-:0;;;;:::o;3608:724:2:-;3821:15;3809:8;:27;;3801:55;;;;;-1:-1:-1;;;3801:55:2;;;;;;;;;;;;-1:-1:-1;;;3801:55:2;;;;;;;;;;;;;;;3968:16;;-1:-1:-1;;;;;4063:13:2;;;3866:14;4063:13;;;:6;:13;;;;;;;;:15;;;;;;;;;4012:77;;353:66;4012:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4002:88;;;;;;-1:-1:-1;;;3906:198:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3883:231;;;;;;;;;4151:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3866:14;;4063:15;4151:26;;;;;-1:-1:-1;;4151:26:2;;;;;;;;;;4063:15;4151:26;;;;;;;;;;;;;;;-1:-1:-1;;4151:26:2;;-1:-1:-1;;4151:26:2;;;-1:-1:-1;;;;;;;4195:30:2;;;;;;:59;;;4249:5;-1:-1:-1;;;;;4229:25:2;:16;-1:-1:-1;;;;;4229:25:2;;4195:59;4187:97;;;;;-1:-1:-1;;;4187:97:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;4294:31;4303:5;4310:7;4319:5;4294:8;:31::i;:::-;3608:724;;;;;;;;;:::o;699:64::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;17398:591:4:-;5191:10;-1:-1:-1;;;;;5205:6:4;5191:20;;5183:79;;;;-1:-1:-1;;;5183:79:4;;;;;;;:::i;:::-;647:5:::1;17606:12;:30;;:62;;;;;647:5;17640:10;:28;;17606:62;17598:102;;;;-1:-1:-1::0;;;17598:102:4::1;;;;;;;:::i;:::-;17710:7;:18:::0;;17738:11:::1;:26:::0;;;17774:9:::1;:22:::0;;;-1:-1:-1;;17710:18:4::1;::::0;::::1;;;-1:-1:-1::0;;17806:34:4::1;17710:18;17806:34:::0;::::1;;;;-1:-1:-1::0;;17850:30:4::1;::::0;;::::1;;;;::::0;;17895:87:::1;::::0;::::1;::::0;::::1;::::0;17710:18;;17738:26;;17774:22;;17806:34;;17850:30;;17895:87:::1;:::i;:::-;;;;;;;;17398:591:::0;;;;;:::o;1839:28::-;;;;:::o;14926:656::-;15091:18;15111;1680:1:5;2260:7;;:19;;2252:63;;;;;-1:-1:-1;;;2252:63:5;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2252:63:5;;;;;;;;;;;;;;;1680:1;2390:7;:18;5191:10:4::1;-1:-1:-1::0;;;;;5205:6:4::1;5191:20;;5183:79;;;;-1:-1:-1::0;;;5183:79:4::1;;;;;;;:::i;:::-;15141:20:::2;15164:38;15178:11;15191:10;15164:13;:38::i;:::-;15141:61;;15228:2;:10;;;15216:9;:22;15212:286;;;15279:10;::::0;::::2;::::0;;15353:1:::2;15340:14:::0;;;15279:10;-1:-1:-1;15267:22:4;;::::2;::::0;-1:-1:-1;15212:286:4::2;;;15398:10;::::0;::::2;::::0;:25:::2;::::0;15413:9;15398:14:::2;:25::i;:::-;15385:10;::::0;::::2;:38:::0;15450:9;;-1:-1:-1;15486:1:4::2;::::0;-1:-1:-1;15212:286:4::2;15512:63;15527:11;15540:10;15552;15564;15512:63;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;1637:1:5;2563:7;:22;14926:656:4;;;;-1:-1:-1;14926:656:4;-1:-1:-1;;14926:656:4:o;19287:135::-;19351:7;19377:38;19390:24;19404:9;19390:13;:24::i;19377:38::-;19370:45;;19287:135;;;;:::o;2037:31::-;;;:::o;2393:24::-;;;;:::o;1975:30::-;;;:::o;1903:36::-;;;:::o;3128:155:6:-;3186:7;3218:1;3213;:6;;3205:49;;;;;-1:-1:-1;;;3205:49:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3271:5:6;;;3128:155::o;20156:415:4:-;20279:10;:17;20242;;20271:63;;;;-1:-1:-1;;;20271:63:4;;;;;;;:::i;:::-;20378:33;;;20344:20;20378:33;;;:20;:33;;;;;;;;:45;;;;;;;;;20367:10;:57;;:10;;20378:45;20367:57;;;;;;;;;;;;;;;;;;;20442:13;;20367:57;;-1:-1:-1;20442:28:4;;;;:13;;;;;:28;:58;;;;;20490:10;20474:2;:12;;;:26;20434:111;;;;-1:-1:-1;;;20434:111:4;;;;;;;:::i;2682:175:6:-;2740:7;2771:5;;;2794:6;;;;2786:46;;;;;-1:-1:-1;;;2786:46:6;;;;;;;;;;;;;;;;;;;;;;;;;;;3530:215;3588:7;3611:6;3607:20;;-1:-1:-1;3626:1:6;3619:8;;3607:20;3649:5;;;3653:1;3649;:5;:1;3672:5;;;;;:10;3664:56;;;;-1:-1:-1;;;3664:56:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4209:150;4267:7;4298:1;4294;:5;4286:44;;;;;-1:-1:-1;;;4286:44:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;4351:1;4347;:5;;;;;;;4209:150;-1:-1:-1;;;4209:150:6:o;2032:199:2:-;-1:-1:-1;;;;;2145:16:2;;;;;;;:9;:16;;;;;;;;:25;;;;;;;;;;;;;:33;;;2193:31;;;;;;;;;;;;;;;;;2032:199;;;:::o;19667:233:4:-;19732:7;19776:1;19759:14;;:18;19751:79;;;;-1:-1:-1;;;19751:79:4;;;;;;;:::i;:::-;19847:46;19878:14;;19847:26;19861:11;;19847:9;:13;;:26;;;;:::i;20922:593::-;20994:7;21035:1;21021:11;;:15;21013:69;;;;-1:-1:-1;;;21013:69:4;;;;;;;:::i;:::-;-1:-1:-1;;;;;21119:16:4;;21092:24;21119:16;;;:9;:16;;;;;;21153:29;;;;21145:80;;;;-1:-1:-1;;;21145:80:4;;;;;;;:::i;:::-;21236:16;21255:46;21289:11;;21255:29;21269:14;;21255:9;:13;;:29;;;;:::i;:46::-;21374:14;;21236:65;;-1:-1:-1;21374:28:4;;21236:65;21374:18;:28::i;:::-;21357:14;:45;21413:23;21419:5;21426:9;21413:5;:23::i;:::-;21451:32;21456:5;21463:9;21474:8;21451:32;;;;;;;;:::i;:::-;;;;;;;;21500:8;20922:593;-1:-1:-1;;;;20922:593:4:o;19906:119::-;19968:7;19994:24;:7;20006:11;19994;:24::i;26759:322::-;564:34;;;;;;;;;;;;;;;;;26923:45;26876:12;;;;-1:-1:-1;;;;;26911:11:4;;;554:45;;26923;;26956:3;;26961:6;;26923:45;;;:::i;:::-;;;;-1:-1:-1;;26923:45:4;;;;;;;;;;;;;;-1:-1:-1;;;;;26923:45:4;-1:-1:-1;;;;;;26923:45:4;;;;;;;;;;26911:58;;;;26923:45;26911:58;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26875:94;;;;26987:7;:57;;;;-1:-1:-1;26999:11:4;;:16;;:44;;;27030:4;27019:24;;;;;;;;;;;;:::i;:::-;26979:95;;;;-1:-1:-1;;;26979:95:4;;;;;;;:::i;:::-;26759:322;;;;;:::o;20031:119::-;20093:7;20119:24;:7;20131:11;20119;:24::i;21521:4085::-;21589:1;21575:11;;:15;:34;;;;;21608:1;21594:11;;:15;21575:34;21571:4029;;;21644:10;:17;21625:16;21644:17;21702:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21702:23:4;;21675:50;;21739:20;21888:9;21883:581;21907:8;21903:1;:12;21883:581;;;21940:20;21963:10;21974:1;21963:13;;;;;;;;;;;;;;;;;;21940:36;;22064:14;22081:46;22115:11;;22081:29;22100:2;:9;;;22081:14;;:18;;:29;;;;:::i;:46::-;22064:63;;22145:15;22163:22;22174:2;:10;;;22163:2;:6;;;:10;;:22;;;;:::i;:::-;22145:40;;22216:7;22207:6;:16;22203:247;;;22359:7;22350:6;:16;22337:7;22345:1;22337:10;;;;;;;;;;;;;:29;;;;;22403:28;22420:7;22428:1;22420:10;;;;;;;;;;;;;;22403:12;:16;;:28;;;;:::i;:::-;22388:43;;22203:247;21883:581;;;21917:3;;;;;21883:581;;;-1:-1:-1;22540:13:4;22708:17;22704:2787;;22817:8;:27;;;;;22843:1;22829:11;;:15;22817:27;22813:563;;;22924:9;22919:439;22943:8;22939:1;:12;22919:439;;;22984:20;23007:10;23018:1;23007:13;;;;;;;;;;;;;;;;;;22984:36;;23148:19;23170:43;23201:11;;23170:26;23186:2;:9;;;23170:11;;:15;;:26;;;;:::i;:43::-;23148:65;-1:-1:-1;23247:22:4;:5;23148:65;23247:9;:22::i;:::-;23308:10;;;;23239:30;;-1:-1:-1;23308:27:4;;23323:11;23308:14;:27::i;:::-;23295:10;;;;:40;;;;-1:-1:-1;22953:3:4;;22919:439;;;;22813:563;22704:2787;;;23431:11;;23415:12;:27;23411:2080;;23466:8;23462:1453;;;23642:11;;:26;;;23619:20;23754:540;23778:8;23774:1;:12;23754:540;;;23836:1;23823:7;23831:1;23823:10;;;;;;;;;;;;;;:14;23819:453;;;23869:20;23892:10;23903:1;23892:13;;;;;;;;;;;;;;;;;;23869:36;;24033:19;24055:60;24070:44;24102:11;;24070:27;24087:2;:9;;;24070:12;:16;;:27;;;;:::i;:44::-;24055:7;24063:1;24055:10;;;;;;;;;;;;;;:14;;:60;;;;:::i;:::-;24033:82;-1:-1:-1;24153:22:4;:5;24033:82;24153:9;:22::i;:::-;24218:10;;;;24145:30;;-1:-1:-1;24218:27:4;;24233:11;24218:14;:27::i;:::-;24205:2;:10;;:40;;;;23819:453;;;23788:3;;23754:540;;;;23462:1453;;;;24510:9;24505:392;24529:8;24525:1;:12;24505:392;;;24587:1;24574:7;24582:1;24574:10;;;;;;;;;;;;;;:14;24570:305;;;24620:20;24643:10;24654:1;24643:13;;;;;;;;;;;;;;;;;;24620:36;;24686:19;24708:7;24716:1;24708:10;;;;;;;;;;;;;;24686:32;;24756:22;24766:11;24756:5;:9;;:22;;;;:::i;:::-;24821:10;;;;24748:30;;-1:-1:-1;24821:27:4;;24836:11;24821:14;:27::i;:::-;24808:2;:10;;:40;;;;24570:305;;;24539:3;;24505:392;;23411:2080;25059:9;25054:423;25078:8;25074:1;:12;25054:423;;;25132:1;25119:7;25127:1;25119:10;;;;;;;;;;;;;;:14;25115:344;;;25161:20;25184:10;25195:1;25184:13;;;;;;;;;;;;;;;;;;25161:36;;25223:27;25253:45;25285:12;25253:27;25268:11;;25253:7;25261:1;25253:10;;;;;;;;;;;;;;:14;;:27;;;;:::i;:45::-;25223:75;-1:-1:-1;25332:30:4;:5;25223:75;25332:9;:30::i;:::-;25401:10;;;;25324:38;;-1:-1:-1;25401:35:4;;25416:19;25401:14;:35::i;:::-;25388:2;:10;;:48;;;;25115:344;;;25088:3;;25054:423;;;;23411:2080;25567:11;;:22;;25583:5;25567:15;:22::i;:::-;25553:11;:36;-1:-1:-1;;;;21521:4085:4;:::o;2237:249:2:-;-1:-1:-1;;;;;2363:15:2;;;;;;:9;:15;;;;;;:26;;2383:5;2363:19;:26::i;:::-;-1:-1:-1;;;;;2345:15:2;;;;;;;:9;:15;;;;;;:44;;;;2415:13;;;;;;;:24;;2433:5;2415:17;:24::i;:::-;-1:-1:-1;;;;;2399:13:2;;;;;;;:9;:13;;;;;;;;;:40;;;;2454:25;;;;;;;2399:13;;2454:25;;;;;;;;;;;;;2237:249;;;:::o;25612:1141:4:-;25758:16;25808:1;25794:11;;:15;25786:57;;;;-1:-1:-1;;;25786:57:4;;;;;;;:::i;:::-;25864:23;25877:9;25864:12;:23::i;:::-;25853:34;;25898:17;25933:12;25929:206;;;25973:43;647:5;25973:23;25986:9;;25973:8;:12;;:23;;;;:::i;:43::-;25961:55;-1:-1:-1;26041:23:4;:8;25961:55;26041:12;:23::i;:::-;26095:14;;26030:34;;-1:-1:-1;26095:29:4;;26114:9;26095:18;:29::i;:::-;26078:14;:46;25929:206;26149:12;26145:82;;;26191:11;;:25;;26207:8;26191:15;:25::i;:::-;26177:11;:39;26145:82;26284:11;;26262:8;;26284:16;26280:109;;26333:45;26363:14;;26333:25;26346:11;;26333:8;:12;;:25;;;;:::i;:45::-;26316:62;;26280:109;26415:14;;:28;;26434:8;26415:18;:28::i;:::-;26398:14;:45;26454:26;26460:3;26465:14;26454:5;:26::i;:::-;26495:46;26500:3;26505:14;26521:8;26531:9;26495:46;;;;;;;;;:::i;:::-;;;;;;;;26625:7;;;;26624:8;;:75;;;26650:49;647:5;26650:29;26669:9;;26650:14;;:18;;:29;;;;:::i;:49::-;26636:11;;:63;26624:75;26620:127;;;26722:13;;26715:21;;26722:13;;;;;26715:6;:21::i;:::-;25612:1141;;;;;;;;:::o;5424:163:6:-;5510:7;5545:12;5537:6;;;;5529:29;;;;-1:-1:-1;;;5529:29:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5575:5:6;;;5424:163::o;19428:233:4:-;19493:7;19534:1;19520:11;;:15;19512:79;;;;-1:-1:-1;;;19512:79:4;;;;;;;:::i;:::-;19608:46;19642:11;;19608:29;19622:14;;19608:9;:13;;:29;;;;:::i;1818:208:2:-;-1:-1:-1;;;;;1899:15:2;;;;;;:9;:15;;;;;;:26;;1919:5;1899:19;:26::i;:::-;-1:-1:-1;;;;;1881:15:2;;;;;;:9;:15;;;;;:44;1949:11;;:22;;1965:5;1949:15;:22::i;:::-;1935:11;:36;1986:33;;;;;;;;2009:1;;-1:-1:-1;;;;;1986:33:2;;;;;;;;;;;;1818:208;;:::o;1612:200::-;1687:11;;:22;;1703:5;1687:15;:22::i;:::-;1673:11;:36;-1:-1:-1;;;;;1735:13:2;;;;;;:9;:13;;;;;;:24;;1753:5;1735:17;:24::i;:::-;-1:-1:-1;;;;;1719:13:2;;;;;;:9;:13;;;;;;;;:40;;;;1774:31;;;;;;;1719:13;;;;1774:31;;;;;;;;;;1612:200;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:175:7:-;84:20;;-1:-1:-1;;;;;133:31:7;;123:42;;113:2;;179:1;176;169:12;194:161;263:20;;323:6;312:18;;302:29;;292:2;;345:1;342;335:12;360:198;;472:2;460:9;451:7;447:23;443:32;440:2;;;493:6;485;478:22;440:2;521:31;542:9;521:31;:::i;563:274::-;;;692:2;680:9;671:7;667:23;663:32;660:2;;;713:6;705;698:22;660:2;741:31;762:9;741:31;:::i;:::-;731:41;;791:40;827:2;816:9;812:18;791:40;:::i;:::-;781:50;;650:187;;;;;:::o;842:342::-;;;;988:2;976:9;967:7;963:23;959:32;956:2;;;1009:6;1001;994:22;956:2;1037:31;1058:9;1037:31;:::i;:::-;1027:41;;1087:40;1123:2;1112:9;1108:18;1087:40;:::i;:::-;1077:50;;1174:2;1163:9;1159:18;1146:32;1136:42;;946:238;;;;;:::o;1189:717::-;;;;;;;;1401:3;1389:9;1380:7;1376:23;1372:33;1369:2;;;1423:6;1415;1408:22;1369:2;1451:31;1472:9;1451:31;:::i;:::-;1441:41;;1501:40;1537:2;1526:9;1522:18;1501:40;:::i;:::-;1491:50;;1588:2;1577:9;1573:18;1560:32;1550:42;;1639:2;1628:9;1624:18;1611:32;1601:42;;1693:3;1682:9;1678:19;1665:33;1738:4;1731:5;1727:16;1720:5;1717:27;1707:2;;1763:6;1755;1748:22;1707:2;1359:547;;;;-1:-1:-1;1359:547:7;;;;1791:5;1843:3;1828:19;;1815:33;;-1:-1:-1;1895:3:7;1880:19;;;1867:33;;1359:547;-1:-1:-1;;1359:547:7:o;1911:266::-;;;2040:2;2028:9;2019:7;2015:23;2011:32;2008:2;;;2061:6;2053;2046:22;2008:2;2089:31;2110:9;2089:31;:::i;:::-;2079:41;2167:2;2152:18;;;;2139:32;;-1:-1:-1;;;1998:179:7:o;2182:342::-;;;;2328:2;2316:9;2307:7;2303:23;2299:32;2296:2;;;2349:6;2341;2334:22;2296:2;2377:31;2398:9;2377:31;:::i;:::-;2367:41;;2455:2;2444:9;2440:18;2427:32;2417:42;;2478:40;2514:2;2503:9;2499:18;2478:40;:::i;:::-;2468:50;;2286:238;;;;;:::o;2529:929::-;;;;;;;2727:3;2715:9;2706:7;2702:23;2698:33;2695:2;;;2749:6;2741;2734:22;2695:2;2777:31;2798:9;2777:31;:::i;:::-;2767:41;;2855:2;2844:9;2840:18;2827:32;2817:42;;2878:39;2913:2;2902:9;2898:18;2878:39;:::i;:::-;2868:49;;2964:2;2953:9;2949:18;2936:32;2926:42;;3019:3;3008:9;3004:19;2991:33;3043:18;3084:2;3076:6;3073:14;3070:2;;;3105:6;3097;3090:22;3070:2;3148:6;3137:9;3133:22;3123:32;;3193:7;3186:4;3182:2;3178:13;3174:27;3164:2;;3220:6;3212;3205:22;3164:2;3265;3252:16;3291:2;3283:6;3280:14;3277:2;;;3312:6;3304;3297:22;3277:2;3362:7;3357:2;3348:6;3344:2;3340:15;3336:24;3333:37;3330:2;;;3388:6;3380;3373:22;3330:2;3424;3420;3416:11;3406:21;;3446:6;3436:16;;;;;2685:773;;;;;;;;:::o;3463:253::-;;3572:2;3560:9;3551:7;3547:23;3543:32;3540:2;;;3593:6;3585;3578:22;3540:2;3637:9;3624:23;3656:30;3680:5;3656:30;:::i;3721:257::-;;3841:2;3829:9;3820:7;3816:23;3812:32;3809:2;;;3862:6;3854;3847:22;3809:2;3899:9;3893:16;3918:30;3942:5;3918:30;:::i;3983:665::-;;;;;;4154:3;4142:9;4133:7;4129:23;4125:33;4122:2;;;4176:6;4168;4161:22;4122:2;4220:9;4207:23;4239:30;4263:5;4239:30;:::i;:::-;4288:5;-1:-1:-1;4340:2:7;4325:18;;4312:32;;-1:-1:-1;4391:2:7;4376:18;;4363:32;;-1:-1:-1;4447:2:7;4432:18;;4419:32;4460;4419;4460;:::i;:::-;4511:7;-1:-1:-1;4570:3:7;4555:19;;4542:33;4584:32;4542:33;4584:32;:::i;:::-;4635:7;4625:17;;;4112:536;;;;;;;;:::o;4653:743::-;;4800:3;4788:9;4779:7;4775:23;4771:33;4768:2;;;4822:6;4814;4807:22;4768:2;4860;4854:9;4902:3;4894:6;4890:16;4972:6;4960:10;4957:22;4936:18;4924:10;4921:34;4918:62;4915:2;;;4983:9;4915:2;5014:10;5010:2;5003:22;;5055:9;5049:16;5041:6;5034:32;5120:2;5109:9;5105:18;5099:25;5094:2;5086:6;5082:15;5075:50;5179:2;5168:9;5164:18;5158:25;5153:2;5145:6;5141:15;5134:50;5238:2;5227:9;5223:18;5217:25;5212:2;5204:6;5200:15;5193:50;5298:3;5287:9;5283:19;5277:26;5271:3;5263:6;5259:16;5252:52;5359:3;5348:9;5344:19;5338:26;5332:3;5324:6;5320:16;5313:52;5384:6;5374:16;;;4758:638;;;;:::o;5401:264::-;;;5529:2;5517:9;5508:7;5504:23;5500:32;5497:2;;;5550:6;5542;5535:22;5497:2;5578:30;5598:9;5578:30;:::i;5670:1084::-;;;;;5847:9;5838:7;5834:23;5877:3;5873:2;5869:12;5866:2;;;5899:6;5891;5884:22;5866:2;5927:30;5947:9;5927:30;:::i;:::-;5917:40;;6004:2;5993:9;5989:18;5976:32;5966:42;;6027:40;6063:2;6052:9;6048:18;6027:40;:::i;:::-;6017:50;-1:-1:-1;6101:4:7;-1:-1:-1;;6083:16:7;;6079:27;6076:2;;;6124:6;6116;6109:22;6076:2;;6162;6156:9;6204:4;6196:6;6192:17;6275:6;6263:10;6260:22;6239:18;6227:10;6224:34;6221:62;6218:2;;;6286:9;6218:2;6317:10;6313:2;6306:22;;6380:2;6369:9;6365:18;6352:32;6344:6;6337:48;6446:3;6435:9;6431:19;6418:33;6413:2;6405:6;6401:15;6394:58;6513:3;6502:9;6498:19;6485:33;6480:2;6472:6;6468:15;6461:58;6580:4;6569:9;6565:20;6552:34;6547:2;6539:6;6535:15;6528:59;6649:3;6638:9;6634:19;6621:33;6615:3;6607:6;6603:16;6596:59;6717:3;6706:9;6702:19;6689:33;6683:3;6675:6;6671:16;6664:59;6742:6;6732:16;;;5814:940;;;;;;;:::o;6759:409::-;;;;;6921:3;6909:9;6900:7;6896:23;6892:33;6889:2;;;6943:6;6935;6928:22;6889:2;6971:30;6991:9;6971:30;:::i;:::-;6961:40;;7048:2;7037:9;7033:18;7020:32;7010:42;;7071:40;7107:2;7096:9;7092:18;7071:40;:::i;:::-;6879:289;;;;-1:-1:-1;7061:50:7;;7158:2;7143:18;7130:32;;-1:-1:-1;;6879:289:7:o;7173:478::-;;;;;;7352:3;7340:9;7331:7;7327:23;7323:33;7320:2;;;7374:6;7366;7359:22;7320:2;7402:30;7422:9;7402:30;:::i;:::-;7392:40;;7479:2;7468:9;7464:18;7451:32;7441:42;;7502:40;7538:2;7527:9;7523:18;7502:40;:::i;:::-;7310:341;;;;-1:-1:-1;7492:50:7;;7589:2;7574:18;;7561:32;;-1:-1:-1;7640:3:7;7625:19;7612:33;;7310:341;-1:-1:-1;;7310:341:7:o;7656:610::-;;;;;;;7849:3;7837:9;7828:7;7824:23;7820:33;7817:2;;;7871:6;7863;7856:22;7817:2;7899:30;7919:9;7899:30;:::i;:::-;7889:40;;7976:2;7965:9;7961:18;7948:32;7938:42;;7999:40;8035:2;8024:9;8020:18;7999:40;:::i;:::-;7989:50;;8086:2;8075:9;8071:18;8058:32;8048:42;;8137:3;8126:9;8122:19;8109:33;8099:43;;8192:3;8181:9;8177:19;8164:33;8206:30;8230:5;8206:30;:::i;:::-;8255:5;8245:15;;;7807:459;;;;;;;;:::o;8271:734::-;;;;8433:9;8424:7;8420:23;8463:3;8459:2;8455:12;8452:2;;;8485:6;8477;8470:22;8452:2;8513:30;8533:9;8513:30;:::i;:::-;8503:40;-1:-1:-1;8590:2:7;8575:18;;8562:32;;-1:-1:-1;8628:2:7;-1:-1:-1;;8610:16:7;;8606:25;8603:2;;;8649:6;8641;8634:22;8603:2;;8687;8681:9;8729:2;8721:6;8717:15;8798:6;8786:10;8783:22;8762:18;8750:10;8747:34;8744:62;8741:2;;;8809:9;8741:2;8836;8829:22;;;8888:18;;8875:32;8860:48;;8969:2;8954:18;;;8941:32;8936:2;8924:15;;8917:57;-1:-1:-1;8400:605:7;;;;-1:-1:-1;8400:605:7:o;9010:338::-;;;;9154:2;9142:9;9133:7;9129:23;9125:32;9122:2;;;9175:6;9167;9160:22;9122:2;9203:30;9223:9;9203:30;:::i;:::-;9193:40;;9280:2;9269:9;9265:18;9252:32;9242:42;;9303:39;9338:2;9327:9;9323:18;9303:39;:::i;9353:332::-;;;;9498:2;9486:9;9477:7;9473:23;9469:32;9466:2;;;9519:6;9511;9504:22;9466:2;9547:30;9567:9;9547:30;:::i;:::-;9537:40;9624:2;9609:18;;9596:32;;-1:-1:-1;9675:2:7;9660:18;;;9647:32;;9456:229;-1:-1:-1;;;9456:229:7:o;9690:190::-;;9802:2;9790:9;9781:7;9777:23;9773:32;9770:2;;;9823:6;9815;9808:22;9770:2;-1:-1:-1;9851:23:7;;9760:120;-1:-1:-1;9760:120:7:o;9885:274::-;;10052:6;10046:13;10068:53;10114:6;10109:3;10102:4;10094:6;10090:17;10068:53;:::i;:::-;10137:16;;;;;10022:137;-1:-1:-1;;10022:137:7:o;10164:203::-;-1:-1:-1;;;;;10328:32:7;;;;10310:51;;10298:2;10283:18;;10265:102::o;10372:274::-;-1:-1:-1;;;;;10564:32:7;;;;10546:51;;10628:2;10613:18;;10606:34;10534:2;10519:18;;10501:145::o;10651:345::-;-1:-1:-1;;;;;10871:32:7;;;;10853:51;;10935:2;10920:18;;10913:34;;;;10978:2;10963:18;;10956:34;10841:2;10826:18;;10808:188::o;11001:447::-;-1:-1:-1;;;;;11288:15:7;;;11270:34;;11335:2;11320:18;;11313:34;;;;11378:2;11363:18;;11356:34;;;;11426:15;;;11421:2;11406:18;;11399:43;11219:3;11204:19;;11186:262::o;11453:790::-;;11777:1;11773;11768:3;11764:11;11760:19;11752:6;11748:32;11737:9;11730:51;11817:6;11812:2;11801:9;11797:18;11790:34;11860:6;11855:2;11844:9;11840:18;11833:34;11915:6;11907;11903:19;11898:2;11887:9;11883:18;11876:47;11960:6;11954:3;11943:9;11939:19;11932:35;12004:3;11998;11987:9;11983:19;11976:32;12045:6;12039:3;12028:9;12024:19;12017:35;12103:6;12095;12089:3;12078:9;12074:19;12061:49;12130:22;;;12154:3;12126:32;;;12119:46;;;;12226:2;12205:15;;;-1:-1:-1;;12201:29:7;12186:45;12182:55;;11720:523;-1:-1:-1;;;;;;11720:523:7:o;12248:417::-;-1:-1:-1;;;;;12497:32:7;;;;12479:51;;12561:2;12546:18;;12539:34;;;;12604:2;12589:18;;12582:34;12647:2;12632:18;;12625:34;12466:3;12451:19;;12433:232::o;12670:187::-;12835:14;;12828:22;12810:41;;12798:2;12783:18;;12765:92::o;12862:700::-;13222:14;;13215:22;13197:41;;13286:6;13274:19;;;;13269:2;13254:18;;13247:47;13325:2;13310:18;;13303:34;;;;13368:2;13353:18;;13346:34;;;;13411:3;13396:19;;13389:35;13455:3;13440:19;;13433:35;13499:3;13484:19;;13477:35;13543:3;13528:19;;13521:35;13184:3;13169:19;;13151:411::o;13567:493::-;13833:14;;13826:22;13808:41;;13880:2;13865:18;;13858:34;;;;13923:2;13908:18;;13901:34;;;;13978:14;13971:22;13966:2;13951:18;;13944:50;14038:14;14031:22;14025:3;14010:19;;14003:51;13795:3;13780:19;;13762:298::o;14065:177::-;14211:25;;;14199:2;14184:18;;14166:76::o;14247:383::-;;14396:2;14385:9;14378:21;14428:6;14422:13;14471:6;14466:2;14455:9;14451:18;14444:34;14487:66;14546:6;14541:2;14530:9;14526:18;14521:2;14513:6;14509:15;14487:66;:::i;:::-;14614:2;14593:15;-1:-1:-1;;14589:29:7;14574:45;;;;14621:2;14570:54;;14368:262;-1:-1:-1;;14368:262:7:o;14635:412::-;14837:2;14819:21;;;14876:2;14856:18;;;14849:30;14915:34;14910:2;14895:18;;14888:62;-1:-1:-1;;;14981:2:7;14966:18;;14959:46;15037:3;15022:19;;14809:238::o;15052:404::-;15254:2;15236:21;;;15293:2;15273:18;;;15266:30;15332:34;15327:2;15312:18;;15305:62;-1:-1:-1;;;15398:2:7;15383:18;;15376:38;15446:3;15431:19;;15226:230::o;15461:405::-;15663:2;15645:21;;;15702:2;15682:18;;;15675:30;15741:34;15736:2;15721:18;;15714:62;-1:-1:-1;;;15807:2:7;15792:18;;15785:39;15856:3;15841:19;;15635:231::o;15871:401::-;16073:2;16055:21;;;16112:2;16092:18;;;16085:30;16151:34;16146:2;16131:18;;16124:62;-1:-1:-1;;;16217:2:7;16202:18;;16195:35;16262:3;16247:19;;16045:227::o;16277:349::-;16479:2;16461:21;;;16518:2;16498:18;;;16491:30;16557:27;16552:2;16537:18;;16530:55;16617:2;16602:18;;16451:175::o;16631:353::-;16833:2;16815:21;;;16872:2;16852:18;;;16845:30;16911:31;16906:2;16891:18;;16884:59;16975:2;16960:18;;16805:179::o;16989:347::-;17191:2;17173:21;;;17230:2;17210:18;;;17203:30;17269:25;17264:2;17249:18;;17242:53;17327:2;17312:18;;17163:173::o;17341:351::-;17543:2;17525:21;;;17582:2;17562:18;;;17555:30;17621:29;17616:2;17601:18;;17594:57;17683:2;17668:18;;17515:177::o;17697:397::-;17899:2;17881:21;;;17938:2;17918:18;;;17911:30;17977:34;17972:2;17957:18;;17950:62;-1:-1:-1;;;18043:2:7;18028:18;;18021:31;18084:3;18069:19;;17871:223::o;18099:353::-;18301:2;18283:21;;;18340:2;18320:18;;;18313:30;18379:31;18374:2;18359:18;;18352:59;18443:2;18428:18;;18273:179::o;18457:404::-;18659:2;18641:21;;;18698:2;18678:18;;;18671:30;18737:34;18732:2;18717:18;;18710:62;-1:-1:-1;;;18803:2:7;18788:18;;18781:38;18851:3;18836:19;;18631:230::o;18866:415::-;19068:2;19050:21;;;19107:2;19087:18;;;19080:30;19146:34;19141:2;19126:18;;19119:62;-1:-1:-1;;;19212:2:7;19197:18;;19190:49;19271:3;19256:19;;19040:241::o;19286:472::-;19488:2;19470:21;;;19527:2;19507:18;;;19500:30;19566:34;19561:2;19546:18;;19539:62;19637:34;19632:2;19617:18;;19610:62;-1:-1:-1;;;19703:3:7;19688:19;;19681:35;19748:3;19733:19;;19460:298::o;19763:410::-;19965:2;19947:21;;;20004:2;19984:18;;;19977:30;20043:34;20038:2;20023:18;;20016:62;-1:-1:-1;;;20109:2:7;20094:18;;20087:44;20163:3;20148:19;;19937:236::o;20178:353::-;20380:2;20362:21;;;20419:2;20399:18;;;20392:30;20458:31;20453:2;20438:18;;20431:59;20522:2;20507:18;;20352:179::o;20536:353::-;20738:2;20720:21;;;20777:2;20757:18;;;20750:30;20816:31;20811:2;20796:18;;20789:59;20880:2;20865:18;;20710:179::o;20894:351::-;21096:2;21078:21;;;21135:2;21115:18;;;21108:30;21174:29;21169:2;21154:18;;21147:57;21236:2;21221:18;;21068:177::o;21250:402::-;21452:2;21434:21;;;21491:2;21471:18;;;21464:30;21530:34;21525:2;21510:18;;21503:62;-1:-1:-1;;;21596:2:7;21581:18;;21574:36;21642:3;21627:19;;21424:228::o;21657:351::-;21859:2;21841:21;;;21898:2;21878:18;;;21871:30;21937:29;21932:2;21917:18;;21910:57;21999:2;21984:18;;21831:177::o;22013:707::-;;22199:3;22188:9;22184:19;22176:27;;22250:6;22244:13;22237:21;22230:29;22219:9;22212:48;22328:6;22320:4;22312:6;22308:17;22302:24;22298:37;22291:4;22280:9;22276:20;22269:67;22392:4;22384:6;22380:17;22374:24;22367:4;22356:9;22352:20;22345:54;22455:4;22447:6;22443:17;22437:24;22430:4;22419:9;22415:20;22408:54;22518:4;22510:6;22506:17;22500:24;22493:4;22482:9;22478:20;22471:54;22581:4;22573:6;22569:17;22563:24;22556:4;22545:9;22541:20;22534:54;22644:4;22636:6;22632:17;22626:24;22619:4;22608:9;22604:20;22597:54;22707:4;22699:6;22695:17;22689:24;22682:4;22671:9;22667:20;22660:54;22166:554;;;;:::o;22725:299::-;22941:13;;22923:32;;23011:4;22999:17;;;22993:24;22971:20;;;22964:54;;;;22911:2;22896:18;;22878:146::o;23029:548::-;;23211:3;23200:9;23196:19;23188:27;;23248:6;23242:13;23231:9;23224:32;23312:4;23304:6;23300:17;23294:24;23287:4;23276:9;23272:20;23265:54;23375:4;23367:6;23363:17;23357:24;23350:4;23339:9;23335:20;23328:54;23438:4;23430:6;23426:17;23420:24;23413:4;23402:9;23398:20;23391:54;23501:4;23493:6;23489:17;23483:24;23476:4;23465:9;23461:20;23454:54;23564:4;23556:6;23552:17;23546:24;23539:4;23528:9;23524:20;23517:54;23178:399;;;;:::o;23582:500::-;23869:6;23857:19;;;;23839:38;;23908:2;23893:18;;23886:34;;;;-1:-1:-1;;;;;23956:32:7;;;;23951:2;23936:18;;23929:60;24020:2;24005:18;;23998:34;24063:3;24048:19;;24041:35;23826:3;23811:19;;23793:289::o;24087:716::-;24458:6;24446:19;;;;24428:38;;24497:2;24482:18;;24475:34;;;;-1:-1:-1;;;;;24545:32:7;;;;24540:2;24525:18;;24518:60;24609:2;24594:18;;24587:34;;;;24652:3;24637:19;;24630:35;24565:3;24681:19;;24674:35;24740:3;24725:19;;24718:35;24784:3;24769:19;;24762:35;24415:3;24400:19;;24382:421::o;24808:359::-;25017:6;25050:15;;;25032:34;;25097:2;25082:18;;25075:34;;;;25145:15;;;25140:2;25125:18;;25118:43;24995:2;24980:18;;24962:205::o;25172:330::-;25402:6;25390:19;;;;25372:38;;25441:2;25426:18;;25419:34;;;;25484:2;25469:18;;25462:34;25360:2;25345:18;;25327:175::o;25507:402::-;25766:6;25754:19;;;;25736:38;;25805:2;25790:18;;25783:34;;;;25848:2;25833:18;;25826:34;25891:2;25876:18;;25869:34;25723:3;25708:19;;25690:219::o;26096:248::-;26270:25;;;26326:2;26311:18;;26304:34;26258:2;26243:18;;26225:119::o;26349:500::-;26606:25;;;26662:2;26647:18;;26640:34;;;;26722:6;26710:19;;;;26705:2;26690:18;;26683:47;-1:-1:-1;;;;;26766:32:7;26761:2;26746:18;;26739:60;26830:3;26815:19;;26808:35;26593:3;26578:19;;26560:289::o;26854:258::-;26926:1;26936:113;26950:6;26947:1;26944:13;26936:113;;;27026:11;;;27020:18;27007:11;;;27000:39;26972:2;26965:10;26936:113;;;27067:6;27064:1;27061:13;27058:2;;;27102:1;27093:6;27088:3;27084:16;27077:27;27058:2;;26907:205;;;:::o;27117:120::-;27205:5;27198:13;27191:21;27184:5;27181:32;27171:2;;27227:1;27224;27217:12

Swarm Source

ipfs://7aaedc0ccd2d34f140152446b43279f2d93751be1b5b4321d4ba3041dfdc2311
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Validator ID :
0 FTM

Amount Staked
0

Amount Delegated
0

Staking Total
0

Staking Start Epoch
0

Staking Start Time
0

Proof of Importance
0

Origination Score
0

Validation Score
0

Active
0

Online
0

Downtime
0 s
Address Amount claimed Rewards Created On Epoch Created On
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.