Contract 0xFA78cBa4ebbf8fE28B4fC1468948F16Fda2752b3 1

Contract Overview

Balance:
0 FTM

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x41492ec282806bc1e8f5510f56c8d8fa899487e6a13b2955f4b6739a687af590Relay109056502022-09-29 8:58:085 days 11 hrs ago0xa500023551388763b720808c0b0cdf00a752b69f IN  0xfa78cba4ebbf8fe28b4fc1468948f16fda2752b30 FTM0.000425484733
0x2c76abcc551fe30993e7cdbc20592601709a20da67247496d27f02cc9edfaffbRelay109033912022-09-29 6:00:075 days 14 hrs ago0x69f71d5b8ea22571d4dbe2713c31a7b3dca4d234 IN  0xfa78cba4ebbf8fe28b4fc1468948f16fda2752b30 FTM0.000372098469
0x7a8d5e556513b26becfd9a41cbb1699919d24cda9405c6d9cb615ce9db5af402Relay108918882022-09-28 14:53:246 days 5 hrs ago0xa500023551388763b720808c0b0cdf00a752b69f IN  0xfa78cba4ebbf8fe28b4fc1468948f16fda2752b30 FTM0.000458536611
0xe953f8c8aaf97318ba62e52eec88fe8e622c3cf6d85e47fc1685ed8a42c8fa5bRelay108861742022-09-28 9:48:076 days 10 hrs ago0x69f71d5b8ea22571d4dbe2713c31a7b3dca4d234 IN  0xfa78cba4ebbf8fe28b4fc1468948f16fda2752b30 FTM0.000372146454
0xb42288a84f3d258c1eeecfdb4f2a1fc2b7b47946fb32dbd142ff4d3083e28724Relay108861592022-09-28 9:47:126 days 10 hrs ago0x69f71d5b8ea22571d4dbe2713c31a7b3dca4d234 IN  0xfa78cba4ebbf8fe28b4fc1468948f16fda2752b30 FTM0.000372187866
0xcc1ff369aaf68c6c95b5648f072516645d6370a52d3ea4f0b3a47767d13556a2Relay108861442022-09-28 9:46:116 days 10 hrs ago0x69f71d5b8ea22571d4dbe2713c31a7b3dca4d234 IN  0xfa78cba4ebbf8fe28b4fc1468948f16fda2752b30 FTM0.000372148545
0xa6e4b8c11a55d6c2490def8379228f36fb29bfd477bb4aedbc5c8b7fb3aacd0aRelay108860992022-09-28 9:43:106 days 10 hrs ago0x69f71d5b8ea22571d4dbe2713c31a7b3dca4d234 IN  0xfa78cba4ebbf8fe28b4fc1468948f16fda2752b30 FTM0.000372093305
0xbbf93c608a3a251773dbd791ef1bd32dedfebd546921dccddbe7c78193f44891Relay108860302022-09-28 9:37:176 days 10 hrs ago0xa500023551388763b720808c0b0cdf00a752b69f IN  0xfa78cba4ebbf8fe28b4fc1468948f16fda2752b30 FTM0.000372133296
0x2a9326cb1bcba9242c62ed3a4213dc59ffe6c1cce200834d1bec8e09ec3aecbfRelay108839732022-09-28 7:17:146 days 13 hrs ago0xa500023551388763b720808c0b0cdf00a752b69f IN  0xfa78cba4ebbf8fe28b4fc1468948f16fda2752b30 FTM0.000372125896
0xed4ef9a9c4316ebcfc7b6cf3b22971a6e3cfc60b275bf8e999d9f310dec3e893Relay108838842022-09-28 7:12:026 days 13 hrs ago0xa5333cdb62e6539f3ec1a7a417c2d55cca181e00 IN  0xfa78cba4ebbf8fe28b4fc1468948f16fda2752b30 FTM0.000372233273
0x54643a2878a9a8db745e7e3bc1fd1ea74e0bdaa849e0d41b716ddcaaf2316101Relay108838062022-09-28 7:06:576 days 13 hrs ago0xa5333cdb62e6539f3ec1a7a417c2d55cca181e00 IN  0xfa78cba4ebbf8fe28b4fc1468948f16fda2752b30 FTM0.000372123681
0xec56b7f6734deb592c62c157ea71984c9da3a6489713f8c1e023a9b233e84b08Relay108835982022-09-28 6:55:336 days 13 hrs ago0xa5222d08e6fe1976b58c3633640ff1c65f3bc5c1 IN  0xfa78cba4ebbf8fe28b4fc1468948f16fda2752b30 FTM0.000372142399
0x2e00edd4cec743f6086f37f942dfb68778f171cddae8b0a2ca211cba3af7c01cRelay108809662022-09-28 4:11:126 days 16 hrs ago0xa500023551388763b720808c0b0cdf00a752b69f IN  0xfa78cba4ebbf8fe28b4fc1468948f16fda2752b30 FTM0.000405301372
0x640e5586a003b4cb6673520b72b9cfd777f64bd0a237df7af9469247c13c8695Relay108807112022-09-28 3:54:056 days 16 hrs ago0xa5333cdb62e6539f3ec1a7a417c2d55cca181e00 IN  0xfa78cba4ebbf8fe28b4fc1468948f16fda2752b30 FTM0.000405176591
0x53be866e7e75af67a56b046f219abe36fcc7dd6a3e1008b278fba6434e05efa3Relay108806412022-09-28 3:48:556 days 16 hrs ago0xa5333cdb62e6539f3ec1a7a417c2d55cca181e00 IN  0xfa78cba4ebbf8fe28b4fc1468948f16fda2752b30 FTM0.000405203245
0xa7bf00850b1478ed907218974570f9871a8581d13a0fec1d8a091c4c5645f2daRelay108805142022-09-28 3:39:276 days 16 hrs ago0xa5222d08e6fe1976b58c3633640ff1c65f3bc5c1 IN  0xfa78cba4ebbf8fe28b4fc1468948f16fda2752b30 FTM0.000458438992
0xa0af8aec52724cc376779cc1763e1270054fa3ad3d4887705760d93fbe8df723Relay106768562022-09-19 7:27:1215 days 13 hrs ago0xa500023551388763b720808c0b0cdf00a752b69f IN  0xfa78cba4ebbf8fe28b4fc1468948f16fda2752b30 FTM0.000405166546
0x6ca21a4e03351e0100f3c8291064309855be8446d315e63f0808dff372d834d8Withdraw105254242022-09-13 6:34:3721 days 13 hrs ago0x51d36e18e3d32d121a3cfe2f3e5771a6fd53274e IN  0xfa78cba4ebbf8fe28b4fc1468948f16fda2752b30 FTM0.0002884625
0x97199b9d608de5e881a19b2db61c0bd44129f13ac1102f983c130512a5236c28Relay104143802022-09-07 9:16:3327 days 11 hrs ago0xa500023551388763b720808c0b0cdf00a752b69f IN  0xfa78cba4ebbf8fe28b4fc1468948f16fda2752b30 FTM0.000405261985
0x46daeff705c95e76ce9df65d6b093be19f6da3c2536f5096722cf4254649bd5cRelay104124662022-09-07 6:38:3727 days 13 hrs ago0xa5222d08e6fe1976b58c3633640ff1c65f3bc5c1 IN  0xfa78cba4ebbf8fe28b4fc1468948f16fda2752b30 FTM0.000405295808
0x8b50f990cd0b1733d5cf49c7659f0c0aedb0a32bb5e8597d67e86206bb7b0bb0Relay104120812022-09-07 6:04:1627 days 14 hrs ago0xa500023551388763b720808c0b0cdf00a752b69f IN  0xfa78cba4ebbf8fe28b4fc1468948f16fda2752b30 FTM0.000405286565
0x4e4387678d30f27e2471adc459b95815cc138897fdc908b310c80ae3948e9007Relay103980612022-09-06 11:08:1128 days 9 hrs ago0x69f71d5b8ea22571d4dbe2713c31a7b3dca4d234 IN  0xfa78cba4ebbf8fe28b4fc1468948f16fda2752b30 FTM0.000458483373
0xf41def7c6dbcbad8cc6bd73155807dc63f4bd26f0277e0a46c06f8f94a49d142Relay103978342022-09-06 10:49:1228 days 9 hrs ago0xa500023551388763b720808c0b0cdf00a752b69f IN  0xfa78cba4ebbf8fe28b4fc1468948f16fda2752b30 FTM0.000372094043
0x80bc52020beaf482bc8035ab0345942c39aa618db84a53e1567e383396d3dbfbRelay103956162022-09-06 7:09:2928 days 13 hrs ago0xa5222d08e6fe1976b58c3633640ff1c65f3bc5c1 IN  0xfa78cba4ebbf8fe28b4fc1468948f16fda2752b30 FTM0.000372252704
0xe8fcf74183bb657b5a130400ca3526e284dc34a952f84132e6dbc134e86b3670Relay103954592022-09-06 6:50:1828 days 13 hrs ago0x69f71d5b8ea22571d4dbe2713c31a7b3dca4d234 IN  0xfa78cba4ebbf8fe28b4fc1468948f16fda2752b30 FTM0.000372183115
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0x89b4dadc827317d75772584111d09cb3806ca87add243c7637f310fce56c0dea52717762021-11-26 6:09:50312 days 14 hrs ago 0x58b529f9084d7eaa598eb3477fe36064c5b7bbc1  Contract Creation0 FTM
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Bridge

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 800 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 17 : Bridge.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity 0.8.9;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "./libraries/PbBridge.sol";
import "./Pool.sol";

contract Bridge is Pool {
    using SafeERC20 for IERC20;

    // liquidity events
    event Send(
        bytes32 transferId,
        address sender,
        address receiver,
        address token,
        uint256 amount,
        uint64 dstChainId,
        uint64 nonce,
        uint32 maxSlippage
    );
    event Relay(
        bytes32 transferId,
        address sender,
        address receiver,
        address token,
        uint256 amount,
        uint64 srcChainId,
        bytes32 srcTransferId
    );
    // gov events
    event MinSendUpdated(address token, uint256 amount);
    event MaxSendUpdated(address token, uint256 amount);

    mapping(bytes32 => bool) public transfers;
    mapping(address => uint256) public minSend; // send _amount must > minSend
    mapping(address => uint256) public maxSend;

    // min allowed max slippage uint32 value is slippage * 1M, eg. 0.5% -> 5000
    uint32 public minimalMaxSlippage;

    function send(
        address _receiver,
        address _token,
        uint256 _amount,
        uint64 _dstChainId,
        uint64 _nonce,
        uint32 _maxSlippage // slippage * 1M, eg. 0.5% -> 5000
    ) external nonReentrant whenNotPaused {
        bytes32 transferId = _send(_receiver, _token, _amount, _dstChainId, _nonce, _maxSlippage);
        IERC20(_token).safeTransferFrom(msg.sender, address(this), _amount);
        emit Send(transferId, msg.sender, _receiver, _token, _amount, _dstChainId, _nonce, _maxSlippage);
    }

    function sendNative(
        address _receiver,
        uint256 _amount,
        uint64 _dstChainId,
        uint64 _nonce,
        uint32 _maxSlippage
    ) external payable nonReentrant whenNotPaused {
        require(msg.value == _amount, "Amount mismatch");
        require(nativeWrap != address(0), "Native wrap not set");
        bytes32 transferId = _send(_receiver, nativeWrap, _amount, _dstChainId, _nonce, _maxSlippage);
        IWETH(nativeWrap).deposit{value: _amount}();
        emit Send(transferId, msg.sender, _receiver, nativeWrap, _amount, _dstChainId, _nonce, _maxSlippage);
    }

    function _send(
        address _receiver,
        address _token,
        uint256 _amount,
        uint64 _dstChainId,
        uint64 _nonce,
        uint32 _maxSlippage
    ) private returns (bytes32) {
        require(_amount > minSend[_token], "amount too small");
        require(maxSend[_token] == 0 || _amount <= maxSend[_token], "amount too large");
        require(_maxSlippage > minimalMaxSlippage, "max slippage too small");
        bytes32 transferId = keccak256(
            // uint64(block.chainid) for consistency as entire system uses uint64 for chain id
            abi.encodePacked(msg.sender, _receiver, _token, _amount, _dstChainId, _nonce, uint64(block.chainid))
        );
        require(transfers[transferId] == false, "transfer exists");
        transfers[transferId] = true;
        return transferId;
    }

    function relay(
        bytes calldata _relayRequest,
        bytes[] calldata _sigs,
        address[] calldata _signers,
        uint256[] calldata _powers
    ) external whenNotPaused {
        bytes32 domain = keccak256(abi.encodePacked(block.chainid, address(this), "Relay"));
        verifySigs(abi.encodePacked(domain, _relayRequest), _sigs, _signers, _powers);
        PbBridge.Relay memory request = PbBridge.decRelay(_relayRequest);
        bytes32 transferId = keccak256(
            abi.encodePacked(
                request.sender,
                request.receiver,
                request.token,
                request.amount,
                request.srcChainId,
                request.dstChainId,
                request.srcTransferId
            )
        );
        require(transfers[transferId] == false, "transfer exists");
        transfers[transferId] = true;
        updateVolume(request.token, request.amount);
        uint256 delayThreshold = delayThresholds[request.token];
        if (delayThreshold > 0 && request.amount > delayThreshold) {
            addDelayedTransfer(transferId, request.receiver, request.token, request.amount);
        } else {
            sendToken(request.receiver, request.token, request.amount);
        }

        emit Relay(
            transferId,
            request.sender,
            request.receiver,
            request.token,
            request.amount,
            request.srcChainId,
            request.srcTransferId
        );
    }

    function setMinSend(address[] calldata _tokens, uint256[] calldata _amounts) external onlyGovernor {
        require(_tokens.length == _amounts.length, "length mismatch");
        for (uint256 i = 0; i < _tokens.length; i++) {
            minSend[_tokens[i]] = _amounts[i];
            emit MinSendUpdated(_tokens[i], _amounts[i]);
        }
    }

    function setMaxSend(address[] calldata _tokens, uint256[] calldata _amounts) external onlyGovernor {
        require(_tokens.length == _amounts.length, "length mismatch");
        for (uint256 i = 0; i < _tokens.length; i++) {
            maxSend[_tokens[i]] = _amounts[i];
            emit MaxSendUpdated(_tokens[i], _amounts[i]);
        }
    }

    function setMinimalMaxSlippage(uint32 _minimalMaxSlippage) external onlyGovernor {
        minimalMaxSlippage = _minimalMaxSlippage;
    }

    // This is needed to receive ETH when calling `IWETH.withdraw`
    receive() external payable {}
}

File 2 of 17 : PbBridge.sol
// SPDX-License-Identifier: GPL-3.0-only

// Code generated by protoc-gen-sol. DO NOT EDIT.
// source: bridge.proto
pragma solidity 0.8.9;
import "./Pb.sol";

library PbBridge {
    using Pb for Pb.Buffer; // so we can call Pb funcs on Buffer obj

    struct Relay {
        address sender; // tag: 1
        address receiver; // tag: 2
        address token; // tag: 3
        uint256 amount; // tag: 4
        uint64 srcChainId; // tag: 5
        uint64 dstChainId; // tag: 6
        bytes32 srcTransferId; // tag: 7
    } // end struct Relay

    function decRelay(bytes memory raw) internal pure returns (Relay memory m) {
        Pb.Buffer memory buf = Pb.fromBytes(raw);

        uint256 tag;
        Pb.WireType wire;
        while (buf.hasMore()) {
            (tag, wire) = buf.decKey();
            if (false) {}
            // solidity has no switch/case
            else if (tag == 1) {
                m.sender = Pb._address(buf.decBytes());
            } else if (tag == 2) {
                m.receiver = Pb._address(buf.decBytes());
            } else if (tag == 3) {
                m.token = Pb._address(buf.decBytes());
            } else if (tag == 4) {
                m.amount = Pb._uint256(buf.decBytes());
            } else if (tag == 5) {
                m.srcChainId = uint64(buf.decVarint());
            } else if (tag == 6) {
                m.dstChainId = uint64(buf.decVarint());
            } else if (tag == 7) {
                m.srcTransferId = Pb._bytes32(buf.decBytes());
            } else {
                buf.skipValue(wire);
            } // skip value of unknown tag
        }
    } // end decoder Relay
}

File 3 of 17 : Pb.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity 0.8.9;

// runtime proto sol library
library Pb {
    enum WireType {
        Varint,
        Fixed64,
        LengthDelim,
        StartGroup,
        EndGroup,
        Fixed32
    }

    struct Buffer {
        uint256 idx; // the start index of next read. when idx=b.length, we're done
        bytes b; // hold serialized proto msg, readonly
    }

    // create a new in-memory Buffer object from raw msg bytes
    function fromBytes(bytes memory raw) internal pure returns (Buffer memory buf) {
        buf.b = raw;
        buf.idx = 0;
    }

    // whether there are unread bytes
    function hasMore(Buffer memory buf) internal pure returns (bool) {
        return buf.idx < buf.b.length;
    }

    // decode current field number and wiretype
    function decKey(Buffer memory buf) internal pure returns (uint256 tag, WireType wiretype) {
        uint256 v = decVarint(buf);
        tag = v / 8;
        wiretype = WireType(v & 7);
    }

    // count tag occurrences, return an array due to no memory map support
    // have to create array for (maxtag+1) size. cnts[tag] = occurrences
    // should keep buf.idx unchanged because this is only a count function
    function cntTags(Buffer memory buf, uint256 maxtag) internal pure returns (uint256[] memory cnts) {
        uint256 originalIdx = buf.idx;
        cnts = new uint256[](maxtag + 1); // protobuf's tags are from 1 rather than 0
        uint256 tag;
        WireType wire;
        while (hasMore(buf)) {
            (tag, wire) = decKey(buf);
            cnts[tag] += 1;
            skipValue(buf, wire);
        }
        buf.idx = originalIdx;
    }

    // read varint from current buf idx, move buf.idx to next read, return the int value
    function decVarint(Buffer memory buf) internal pure returns (uint256 v) {
        bytes10 tmp; // proto int is at most 10 bytes (7 bits can be used per byte)
        bytes memory bb = buf.b; // get buf.b mem addr to use in assembly
        v = buf.idx; // use v to save one additional uint variable
        assembly {
            tmp := mload(add(add(bb, 32), v)) // load 10 bytes from buf.b[buf.idx] to tmp
        }
        uint256 b; // store current byte content
        v = 0; // reset to 0 for return value
        for (uint256 i = 0; i < 10; i++) {
            assembly {
                b := byte(i, tmp) // don't use tmp[i] because it does bound check and costs extra
            }
            v |= (b & 0x7F) << (i * 7);
            if (b & 0x80 == 0) {
                buf.idx += i + 1;
                return v;
            }
        }
        revert(); // i=10, invalid varint stream
    }

    // read length delimited field and return bytes
    function decBytes(Buffer memory buf) internal pure returns (bytes memory b) {
        uint256 len = decVarint(buf);
        uint256 end = buf.idx + len;
        require(end <= buf.b.length); // avoid overflow
        b = new bytes(len);
        bytes memory bufB = buf.b; // get buf.b mem addr to use in assembly
        uint256 bStart;
        uint256 bufBStart = buf.idx;
        assembly {
            bStart := add(b, 32)
            bufBStart := add(add(bufB, 32), bufBStart)
        }
        for (uint256 i = 0; i < len; i += 32) {
            assembly {
                mstore(add(bStart, i), mload(add(bufBStart, i)))
            }
        }
        buf.idx = end;
    }

    // return packed ints
    function decPacked(Buffer memory buf) internal pure returns (uint256[] memory t) {
        uint256 len = decVarint(buf);
        uint256 end = buf.idx + len;
        require(end <= buf.b.length); // avoid overflow
        // array in memory must be init w/ known length
        // so we have to create a tmp array w/ max possible len first
        uint256[] memory tmp = new uint256[](len);
        uint256 i = 0; // count how many ints are there
        while (buf.idx < end) {
            tmp[i] = decVarint(buf);
            i++;
        }
        t = new uint256[](i); // init t with correct length
        for (uint256 j = 0; j < i; j++) {
            t[j] = tmp[j];
        }
        return t;
    }

    // move idx pass current value field, to beginning of next tag or msg end
    function skipValue(Buffer memory buf, WireType wire) internal pure {
        if (wire == WireType.Varint) {
            decVarint(buf);
        } else if (wire == WireType.LengthDelim) {
            uint256 len = decVarint(buf);
            buf.idx += len; // skip len bytes value data
            require(buf.idx <= buf.b.length); // avoid overflow
        } else {
            revert();
        } // unsupported wiretype
    }

    // type conversion help utils
    function _bool(uint256 x) internal pure returns (bool v) {
        return x != 0;
    }

    function _uint256(bytes memory b) internal pure returns (uint256 v) {
        require(b.length <= 32); // b's length must be smaller than or equal to 32
        assembly {
            v := mload(add(b, 32))
        } // load all 32bytes to v
        v = v >> (8 * (32 - b.length)); // only first b.length is valid
    }

    function _address(bytes memory b) internal pure returns (address v) {
        v = _addressPayable(b);
    }

    function _addressPayable(bytes memory b) internal pure returns (address payable v) {
        require(b.length == 20);
        //load 32bytes then shift right 12 bytes
        assembly {
            v := div(mload(add(b, 32)), 0x1000000000000000000000000)
        }
    }

    function _bytes32(bytes memory b) internal pure returns (bytes32 v) {
        require(b.length == 32);
        assembly {
            v := mload(add(b, 32))
        }
    }

    // uint[] to uint8[]
    function uint8s(uint256[] memory arr) internal pure returns (uint8[] memory t) {
        t = new uint8[](arr.length);
        for (uint256 i = 0; i < t.length; i++) {
            t[i] = uint8(arr[i]);
        }
    }

    function uint32s(uint256[] memory arr) internal pure returns (uint32[] memory t) {
        t = new uint32[](arr.length);
        for (uint256 i = 0; i < t.length; i++) {
            t[i] = uint32(arr[i]);
        }
    }

    function uint64s(uint256[] memory arr) internal pure returns (uint64[] memory t) {
        t = new uint64[](arr.length);
        for (uint256 i = 0; i < t.length; i++) {
            t[i] = uint64(arr[i]);
        }
    }

    function bools(uint256[] memory arr) internal pure returns (bool[] memory t) {
        t = new bool[](arr.length);
        for (uint256 i = 0; i < t.length; i++) {
            t[i] = arr[i] != 0;
        }
    }
}

File 4 of 17 : Pool.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity 0.8.9;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "./interfaces/IWETH.sol";
import "./libraries/PbPool.sol";
import "./Signers.sol";
import "./Pauser.sol";

// add liquidity and withdraw
// withdraw can be used by user or liquidity provider

contract Pool is Signers, ReentrancyGuard, Pauser {
    using SafeERC20 for IERC20;

    uint64 public addseq; // ensure unique LiquidityAdded event, start from 1
    mapping(address => uint256) public minAdd; // add _amount must > minAdd

    // map of successful withdraws, if true means already withdrew money or added to delayedTransfers
    mapping(bytes32 => bool) public withdraws;

    uint256 public epochLength; // seconds
    mapping(address => uint256) public epochVolumes; // key is token
    mapping(address => uint256) public epochVolumeCaps; // key is token
    mapping(address => uint256) public lastOpTimestamps; // key is token

    struct delayedTransfer {
        address receiver;
        address token;
        uint256 amount;
        uint256 timestamp;
    }
    mapping(bytes32 => delayedTransfer) public delayedTransfers;
    mapping(address => uint256) public delayThresholds;
    uint256 public delayPeriod; // in seconds

    // erc20 wrap of gas token of this chain, eg. WETH, when relay ie. pay out,
    // if request.token equals this, will withdraw and send native token to receiver
    // note we don't check whether it's zero address. when this isn't set, and request.token
    // is all 0 address, guarantee fail
    address public nativeWrap;

    mapping(address => bool) public governors;

    // liquidity events
    event LiquidityAdded(
        uint64 seqnum,
        address provider,
        address token,
        uint256 amount // how many tokens were added
    );
    event WithdrawDone(
        bytes32 withdrawId,
        uint64 seqnum,
        address receiver,
        address token,
        uint256 amount,
        bytes32 refid
    );
    event DelayedTransferAdded(bytes32 id);
    event DelayedTransferExecuted(bytes32 id, address receiver, address token, uint256 amount);
    // gov events
    event GovernorAdded(address account);
    event GovernorRemoved(address account);
    event EpochLengthUpdated(uint256 length);
    event EpochVolumeUpdated(address token, uint256 cap);
    event DelayPeriodUpdated(uint256 period);
    event DelayThresholdUpdated(address token, uint256 threshold);
    event MinAddUpdated(address token, uint256 amount);

    constructor() {
        _addGovernor(msg.sender);
    }

    function addLiquidity(address _token, uint256 _amount) external nonReentrant whenNotPaused {
        require(_amount > minAdd[_token], "amount too small");
        addseq += 1;
        IERC20(_token).safeTransferFrom(msg.sender, address(this), _amount);
        emit LiquidityAdded(addseq, msg.sender, _token, _amount);
    }

    function addNativeLiquidity(uint256 _amount) external payable nonReentrant whenNotPaused {
        require(msg.value == _amount, "Amount mismatch");
        require(nativeWrap != address(0), "Native wrap not set");
        require(_amount > minAdd[nativeWrap], "amount too small");
        addseq += 1;
        IWETH(nativeWrap).deposit{value: _amount}();
        emit LiquidityAdded(addseq, msg.sender, nativeWrap, _amount);
    }

    function withdraw(
        bytes calldata _wdmsg,
        bytes[] calldata _sigs,
        address[] calldata _signers,
        uint256[] calldata _powers
    ) external whenNotPaused {
        bytes32 domain = keccak256(abi.encodePacked(block.chainid, address(this), "WithdrawMsg"));
        verifySigs(abi.encodePacked(domain, _wdmsg), _sigs, _signers, _powers);
        // decode and check wdmsg
        PbPool.WithdrawMsg memory wdmsg = PbPool.decWithdrawMsg(_wdmsg);
        bytes32 wdId = keccak256(
            abi.encodePacked(wdmsg.chainid, wdmsg.seqnum, wdmsg.receiver, wdmsg.token, wdmsg.amount)
        );
        require(withdraws[wdId] == false, "withdraw already succeeded");
        withdraws[wdId] = true;
        updateVolume(wdmsg.token, wdmsg.amount);
        uint256 delayThreshold = delayThresholds[wdmsg.token];
        if (delayThreshold > 0 && wdmsg.amount > delayThreshold) {
            addDelayedTransfer(wdId, wdmsg.receiver, wdmsg.token, wdmsg.amount);
        } else {
            sendToken(wdmsg.receiver, wdmsg.token, wdmsg.amount);
        }
        emit WithdrawDone(wdId, wdmsg.seqnum, wdmsg.receiver, wdmsg.token, wdmsg.amount, wdmsg.refid);
    }

    function executeDelayedTransfer(bytes32 id) external whenNotPaused {
        delayedTransfer memory transfer = delayedTransfers[id];
        require(transfer.timestamp > 0, "transfer not exist");
        require(block.timestamp > transfer.timestamp + delayPeriod, "transfer still locked");
        delete delayedTransfers[id];
        sendToken(transfer.receiver, transfer.token, transfer.amount);
        emit DelayedTransferExecuted(id, transfer.receiver, transfer.token, transfer.amount);
    }

    function setEpochLength(uint256 _length) external onlyGovernor {
        epochLength = _length;
        emit EpochLengthUpdated(_length);
    }

    function setEpochVolumeCaps(address[] calldata _tokens, uint256[] calldata _caps) external onlyGovernor {
        require(_tokens.length == _caps.length, "length mismatch");
        for (uint256 i = 0; i < _tokens.length; i++) {
            epochVolumeCaps[_tokens[i]] = _caps[i];
            emit EpochVolumeUpdated(_tokens[i], _caps[i]);
        }
    }

    function setDelayThresholds(address[] calldata _tokens, uint256[] calldata _thresholds) external onlyGovernor {
        require(_tokens.length == _thresholds.length, "length mismatch");
        for (uint256 i = 0; i < _tokens.length; i++) {
            delayThresholds[_tokens[i]] = _thresholds[i];
            emit DelayThresholdUpdated(_tokens[i], _thresholds[i]);
        }
    }

    function setDelayPeriod(uint256 _period) external onlyGovernor {
        delayPeriod = _period;
        emit DelayPeriodUpdated(_period);
    }

    function setMinAdd(address[] calldata _tokens, uint256[] calldata _amounts) external onlyGovernor {
        require(_tokens.length == _amounts.length, "length mismatch");
        for (uint256 i = 0; i < _tokens.length; i++) {
            minAdd[_tokens[i]] = _amounts[i];
            emit MinAddUpdated(_tokens[i], _amounts[i]);
        }
    }

    function sendToken(
        address _receiver,
        address _token,
        uint256 _amount
    ) internal {
        if (_token == nativeWrap) {
            // withdraw then transfer native to receiver
            IWETH(nativeWrap).withdraw(_amount);
            (bool sent, ) = _receiver.call{value: _amount, gas: 50000}("");
            require(sent, "failed to send native token");
        } else {
            IERC20(_token).safeTransfer(_receiver, _amount);
        }
    }

    function updateVolume(address _token, uint256 _amount) internal {
        if (epochLength == 0) {
            return;
        }
        uint256 cap = epochVolumeCaps[_token];
        if (cap == 0) {
            return;
        }
        uint256 volume = epochVolumes[_token];
        uint256 timestamp = block.timestamp;
        uint256 epochStartTime = (timestamp / epochLength) * epochLength;
        if (lastOpTimestamps[_token] < epochStartTime) {
            volume = _amount;
        } else {
            volume += _amount;
        }
        require(volume <= cap, "volume exceeds cap");
        epochVolumes[_token] = volume;
        lastOpTimestamps[_token] = timestamp;
    }

    function addDelayedTransfer(
        bytes32 id,
        address receiver,
        address token,
        uint256 amount
    ) internal {
        // note: rely on caller for id uniquess
        // current ids are relay transfer id and withdrawal id
        delayedTransfers[id] = delayedTransfer({
            receiver: receiver,
            token: token,
            amount: amount,
            timestamp: block.timestamp
        });
        emit DelayedTransferAdded(id);
    }

    // set nativeWrap, for relay requests, if token == nativeWrap, will withdraw first then transfer native to receiver
    function setWrap(address _weth) external onlyOwner {
        nativeWrap = _weth;
    }

    modifier onlyGovernor() {
        require(isGovernor(msg.sender), "Caller is not governor");
        _;
    }

    function isGovernor(address _account) public view returns (bool) {
        return governors[_account];
    }

    function addGovener(address _account) public onlyOwner {
        _addGovernor(_account);
    }

    function removeGovener(address _account) public onlyOwner {
        _removeGovernor(_account);
    }

    function renounceGovener() public {
        _removeGovernor(msg.sender);
    }

    function _addGovernor(address _account) private {
        require(!isGovernor(_account), "Account is already governor");
        governors[_account] = true;
        emit GovernorAdded(_account);
    }

    function _removeGovernor(address _account) private {
        require(isGovernor(_account), "Account is not governor");
        governors[_account] = false;
        emit GovernorRemoved(_account);
    }
}

File 5 of 17 : IWETH.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity 0.8.9;

interface IWETH {
    function deposit() external payable;

    function withdraw(uint256) external;
}

File 6 of 17 : PbPool.sol
// SPDX-License-Identifier: GPL-3.0-only

// Code generated by protoc-gen-sol. DO NOT EDIT.
// source: contracts/libraries/proto/pool.proto
pragma solidity 0.8.9;
import "./Pb.sol";

library PbPool {
    using Pb for Pb.Buffer; // so we can call Pb funcs on Buffer obj

    struct WithdrawMsg {
        uint64 chainid; // tag: 1
        uint64 seqnum; // tag: 2
        address receiver; // tag: 3
        address token; // tag: 4
        uint256 amount; // tag: 5
        bytes32 refid; // tag: 6
    } // end struct WithdrawMsg

    function decWithdrawMsg(bytes memory raw) internal pure returns (WithdrawMsg memory m) {
        Pb.Buffer memory buf = Pb.fromBytes(raw);

        uint256 tag;
        Pb.WireType wire;
        while (buf.hasMore()) {
            (tag, wire) = buf.decKey();
            if (false) {}
            // solidity has no switch/case
            else if (tag == 1) {
                m.chainid = uint64(buf.decVarint());
            } else if (tag == 2) {
                m.seqnum = uint64(buf.decVarint());
            } else if (tag == 3) {
                m.receiver = Pb._address(buf.decBytes());
            } else if (tag == 4) {
                m.token = Pb._address(buf.decBytes());
            } else if (tag == 5) {
                m.amount = Pb._uint256(buf.decBytes());
            } else if (tag == 6) {
                m.refid = Pb._bytes32(buf.decBytes());
            } else {
                buf.skipValue(wire);
            } // skip value of unknown tag
        }
    } // end decoder WithdrawMsg
}

File 7 of 17 : Signers.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity 0.8.9;

import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "./interfaces/ISigsVerifier.sol";

contract Signers is Ownable, ISigsVerifier {
    using ECDSA for bytes32;

    bytes32 public ssHash;
    uint256 public triggerTime; // timestamp when last update was triggered

    // reset can be called by the owner address for emergency recovery
    uint256 public resetTime;
    uint256 public noticePeriod; // advance notice period as seconds for reset
    uint256 constant MAX_INT = 2**256 - 1;

    event SignersUpdated(address[] _signers, uint256[] _powers);

    event ResetNotification(uint256 resetTime);

    /**
     * @notice Verifies that a message is signed by a quorum among the signers
     * The sigs must be sorted by signer addresses in ascending order.
     * @param _msg signed message
     * @param _sigs list of signatures sorted by signer addresses
     * @param _signers sorted list of current signers
     * @param _powers powers of current signers
     */
    function verifySigs(
        bytes memory _msg,
        bytes[] calldata _sigs,
        address[] calldata _signers,
        uint256[] calldata _powers
    ) public view override {
        bytes32 h = keccak256(abi.encodePacked(_signers, _powers));
        require(ssHash == h, "Mismatch current signers");
        _verifySignedPowers(keccak256(_msg).toEthSignedMessageHash(), _sigs, _signers, _powers);
    }

    /**
     * @notice Update new signers.
     * @param _newSigners sorted list of new signers
     * @param _curPowers powers of new signers
     * @param _sigs list of signatures sorted by signer addresses
     * @param _curSigners sorted list of current signers
     * @param _curPowers powers of current signers
     */
    function updateSigners(
        uint256 _triggerTime,
        address[] calldata _newSigners,
        uint256[] calldata _newPowers,
        bytes[] calldata _sigs,
        address[] calldata _curSigners,
        uint256[] calldata _curPowers
    ) external {
        // use trigger time for nonce protection, must be ascending
        require(_triggerTime > triggerTime, "Trigger time is not increasing");
        // make sure triggerTime is not too large, as it cannot be decreased once set
        require(_triggerTime < block.timestamp + 3600, "Trigger time is too large");
        bytes32 domain = keccak256(abi.encodePacked(block.chainid, address(this), "UpdateSigners"));
        verifySigs(abi.encodePacked(domain, _triggerTime, _newSigners, _newPowers), _sigs, _curSigners, _curPowers);
        _updateSigners(_newSigners, _newPowers);
        triggerTime = _triggerTime;
    }

    /**
     * @notice reset signers, only used for init setup and emergency recovery
     */
    function resetSigners(address[] calldata _signers, uint256[] calldata _powers) external onlyOwner {
        require(block.timestamp > resetTime, "not reach reset time");
        resetTime = MAX_INT;
        _updateSigners(_signers, _powers);
    }

    function notifyResetSigners() external onlyOwner {
        resetTime = block.timestamp + noticePeriod;
        emit ResetNotification(resetTime);
    }

    function increaseNoticePeriod(uint256 period) external onlyOwner {
        require(period > noticePeriod, "notice period can only be increased");
        noticePeriod = period;
    }

    // separate from verifySigs func to avoid "stack too deep" issue
    function _verifySignedPowers(
        bytes32 _hash,
        bytes[] calldata _sigs,
        address[] calldata _signers,
        uint256[] calldata _powers
    ) private pure {
        require(_signers.length == _powers.length, "signers and powers length not match");
        uint256 totalPower; // sum of all signer.power
        for (uint256 i = 0; i < _signers.length; i++) {
            totalPower += _powers[i];
        }
        uint256 quorum = (totalPower * 2) / 3 + 1;

        uint256 signedPower; // sum of signer powers who are in sigs
        address prev = address(0);
        uint256 index = 0;
        for (uint256 i = 0; i < _sigs.length; i++) {
            address signer = _hash.recover(_sigs[i]);
            require(signer > prev, "signers not in ascending order");
            prev = signer;
            // now find match signer add its power
            while (signer > _signers[index]) {
                index += 1;
                require(index < _signers.length, "signer not found");
            }
            if (signer == _signers[index]) {
                signedPower += _powers[index];
            }
            if (signedPower >= quorum) {
                // return early to save gas
                return;
            }
        }
        revert("quorum not reached");
    }

    function _updateSigners(address[] calldata _signers, uint256[] calldata _powers) private {
        require(_signers.length == _powers.length, "signers and powers length not match");
        address prev = address(0);
        for (uint256 i = 0; i < _signers.length; i++) {
            require(_signers[i] > prev, "New signers not in ascending order");
            prev = _signers[i];
        }
        ssHash = keccak256(abi.encodePacked(_signers, _powers));
        emit SignersUpdated(_signers, _powers);
    }
}

File 8 of 17 : ISigsVerifier.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity 0.8.9;

interface ISigsVerifier {
    /**
     * @notice Verifies that a message is signed by a quorum among the signers.
     * @param _msg signed message
     * @param _sigs list of signatures sorted by signer addresses
     * @param _signers sorted list of current signers
     * @param _powers powers of current signers
     */
    function verifySigs(
        bytes memory _msg,
        bytes[] calldata _sigs,
        address[] calldata _signers,
        uint256[] calldata _powers
    ) external view;
}

File 9 of 17 : Pauser.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity 0.8.9;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/Pausable.sol";

abstract contract Pauser is Ownable, Pausable {
    mapping(address => bool) public pausers;

    event PauserAdded(address account);
    event PauserRemoved(address account);

    constructor() {
        _addPauser(msg.sender);
    }

    modifier onlyPauser() {
        require(isPauser(msg.sender), "Caller is not pauser");
        _;
    }

    function pause() public onlyPauser {
        _pause();
    }

    function unpause() public onlyPauser {
        _unpause();
    }

    function isPauser(address account) public view returns (bool) {
        return pausers[account];
    }

    function addPauser(address account) public onlyOwner {
        _addPauser(account);
    }

    function removePauser(address account) public onlyOwner {
        _removePauser(account);
    }

    function renouncePauser() public {
        _removePauser(msg.sender);
    }

    function _addPauser(address account) private {
        require(!isPauser(account), "Account is already pauser");
        pausers[account] = true;
        emit PauserAdded(account);
    }

    function _removePauser(address account) private {
        require(isPauser(account), "Account is not pauser");
        pausers[account] = false;
        emit PauserRemoved(account);
    }
}

File 10 of 17 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

File 11 of 17 : SafeERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../IERC20.sol";
import "../../../utils/Address.sol";

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

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

File 12 of 17 : Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 13 of 17 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.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 14 of 17 : ECDSA.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return recover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return recover(hash, r, vs);
        } else {
            revert("ECDSA: invalid signature length");
        }
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return recover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`, `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        require(
            uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0,
            "ECDSA: invalid signature 's' value"
        );
        require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value");

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        require(signer != address(0), "ECDSA: invalid signature");

        return signer;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

File 15 of 17 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../utils/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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 16 of 17 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^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 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) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 17 of 17 : Pausable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

Settings
{
  "metadata": {
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": true,
    "runs": 800
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"period","type":"uint256"}],"name":"DelayPeriodUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"threshold","type":"uint256"}],"name":"DelayThresholdUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"DelayedTransferAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DelayedTransferExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"length","type":"uint256"}],"name":"EpochLengthUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"cap","type":"uint256"}],"name":"EpochVolumeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"GovernorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"GovernorRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"seqnum","type":"uint64"},{"indexed":false,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LiquidityAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MaxSendUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MinAddUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MinSendUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"PauserAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"PauserRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"transferId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"srcChainId","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"srcTransferId","type":"bytes32"}],"name":"Relay","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"resetTime","type":"uint256"}],"name":"ResetNotification","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"transferId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"dstChainId","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"nonce","type":"uint64"},{"indexed":false,"internalType":"uint32","name":"maxSlippage","type":"uint32"}],"name":"Send","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"_signers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"_powers","type":"uint256[]"}],"name":"SignersUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"withdrawId","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"seqnum","type":"uint64"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"refid","type":"bytes32"}],"name":"WithdrawDone","type":"event"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"addGovener","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"addLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"addNativeLiquidity","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addPauser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"addseq","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delayPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"delayThresholds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"delayedTransfers","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epochLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"epochVolumeCaps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"epochVolumes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"executeDelayedTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"governors","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"period","type":"uint256"}],"name":"increaseNoticePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isGovernor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isPauser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastOpTimestamps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxSend","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minAdd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minSend","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimalMaxSlippage","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeWrap","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"noticePeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notifyResetSigners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pausers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_relayRequest","type":"bytes"},{"internalType":"bytes[]","name":"_sigs","type":"bytes[]"},{"internalType":"address[]","name":"_signers","type":"address[]"},{"internalType":"uint256[]","name":"_powers","type":"uint256[]"}],"name":"relay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"removeGovener","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removePauser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceGovener","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renouncePauser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_signers","type":"address[]"},{"internalType":"uint256[]","name":"_powers","type":"uint256[]"}],"name":"resetSigners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint64","name":"_dstChainId","type":"uint64"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"uint32","name":"_maxSlippage","type":"uint32"}],"name":"send","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint64","name":"_dstChainId","type":"uint64"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"uint32","name":"_maxSlippage","type":"uint32"}],"name":"sendNative","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"setDelayPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_thresholds","type":"uint256[]"}],"name":"setDelayThresholds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_length","type":"uint256"}],"name":"setEpochLength","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_caps","type":"uint256[]"}],"name":"setEpochVolumeCaps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"setMaxSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"setMinAdd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"setMinSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_minimalMaxSlippage","type":"uint32"}],"name":"setMinimalMaxSlippage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_weth","type":"address"}],"name":"setWrap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ssHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"transfers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"triggerTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_triggerTime","type":"uint256"},{"internalType":"address[]","name":"_newSigners","type":"address[]"},{"internalType":"uint256[]","name":"_newPowers","type":"uint256[]"},{"internalType":"bytes[]","name":"_sigs","type":"bytes[]"},{"internalType":"address[]","name":"_curSigners","type":"address[]"},{"internalType":"uint256[]","name":"_curPowers","type":"uint256[]"}],"name":"updateSigners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_msg","type":"bytes"},{"internalType":"bytes[]","name":"_sigs","type":"bytes[]"},{"internalType":"address[]","name":"_signers","type":"address[]"},{"internalType":"uint256[]","name":"_powers","type":"uint256[]"}],"name":"verifySigs","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_wdmsg","type":"bytes"},{"internalType":"bytes[]","name":"_sigs","type":"bytes[]"},{"internalType":"address[]","name":"_signers","type":"address[]"},{"internalType":"uint256[]","name":"_powers","type":"uint256[]"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"withdraws","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b506200001d3362000048565b60016005556006805460ff19169055620000373362000098565b620000423362000162565b62000222565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811660009081526007602052604090205460ff1615620001075760405162461bcd60e51b815260206004820152601960248201527f4163636f756e7420697320616c7265616479207061757365720000000000000060448201526064015b60405180910390fd5b6001600160a01b038116600081815260076020908152604091829020805460ff1916600117905590519182527f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f891015b60405180910390a150565b6001600160a01b03811660009081526013602052604090205460ff1615620001cd5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920676f7665726e6f7200000000006044820152606401620000fe565b6001600160a01b038116600081815260136020908152604091829020805460ff1916600117905590519182527fdc5a48d79e2e147530ff63ecdbed5a5a66adb9d5cf339384d5d076da197c40b5910162000157565b614fc880620002326000396000f3fe60806040526004361061036f5760003560e01c806382dc1ec4116101c6578063b5f2bc47116100f7578063e43581b811610095578063f20c922a1161006f578063f20c922a14610acf578063f2fde38b14610aef578063f832138314610b0f578063f8b30d7d14610b3c57600080fd5b8063e43581b814610a61578063e999e5f414610a9a578063edd75e2014610aba57600080fd5b8063cdd1b25d116100d1578063cdd1b25d146109cb578063d0790da9146109eb578063e09ab42814610a01578063e3eece2614610a3157600080fd5b8063b5f2bc4714610951578063ba2cb25c1461097e578063ccde517a1461099e57600080fd5b80639e25fc5c11610164578063a5977fbb1161013e578063a5977fbb14610881578063a7bdf45a146108a1578063adc0d57f146108c1578063b1c94d941461093b57600080fd5b80639e25fc5c146108215780639ff9001a14610841578063a21a92801461086157600080fd5b806389e39127116101a057806389e39127146107935780638d8afa17146107cd5780638da5cb5b146107ed5780639b14d4c61461080b57600080fd5b806382dc1ec41461073e5780638456cb591461075e578063878fe1ce1461077357600080fd5b806352532faa116102a057806365a114f11161023e5780636ef8d66d116102185780636ef8d66d146106d15780637044c89e146106e6578063715018a6146106f957806380f51c121461070e57600080fd5b806365a114f11461067b578063682dbc22146106915780636b2c0f55146106b157600080fd5b806357d775f81161027a57806357d775f8146105f35780635c975abb1461060957806360216b0014610621578063618ee0551461064e57600080fd5b806352532faa1461058657806354eea796146105b357806356688700146105d357600080fd5b80633f2e5fc31161030d578063457bfa2f116102e7578063457bfa2f146104d557806346fbf68e1461050d57806347b16c6c14610546578063482341261461056657600080fd5b80633f2e5fc31461048d5780633f4ba83a146104a057806344a848af146104b557600080fd5b80632fd1b0a4116103495780632fd1b0a4146103d2578063370fb47b146104095780633c64f04b1461042d5780633d5721071461046d57600080fd5b8063089927411461037b57806317bdbae51461039d57806325c38b9f146103bd57600080fd5b3661037657005b600080fd5b34801561038757600080fd5b5061039b610396366004614723565b610b69565b005b3480156103a957600080fd5b5061039b6103b8366004614723565b610d0c565b3480156103c957600080fd5b5061039b610ea3565b3480156103de57600080fd5b506017546103ef9063ffffffff1681565b60405163ffffffff90911681526020015b60405180910390f35b34801561041557600080fd5b5061041f60025481565b604051908152602001610400565b34801561043957600080fd5b5061045d61044836600461478f565b60146020526000908152604090205460ff1681565b6040519015158152602001610400565b34801561047957600080fd5b5061039b61048836600461478f565b610f33565b61039b61049b3660046147f0565b610fc7565b3480156104ac57600080fd5b5061039b61121d565b3480156104c157600080fd5b5061039b6104d036600461484e565b611286565b3480156104e157600080fd5b506012546104f5906001600160a01b031681565b6040516001600160a01b039091168152602001610400565b34801561051957600080fd5b5061045d61052836600461484e565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561055257600080fd5b5061039b610561366004614723565b6112da565b34801561057257600080fd5b5061039b610581366004614869565b611471565b34801561059257600080fd5b5061041f6105a136600461484e565b60106020526000908152604090205481565b3480156105bf57600080fd5b5061039b6105ce36600461478f565b6114e5565b3480156105df57600080fd5b5061039b6105ee366004614884565b611572565b3480156105ff57600080fd5b5061041f600b5481565b34801561061557600080fd5b5060065460ff1661045d565b34801561062d57600080fd5b5061041f61063c36600461484e565b600c6020526000908152604090205481565b34801561065a57600080fd5b5061041f61066936600461484e565b60166020526000908152604090205481565b34801561068757600080fd5b5061041f60035481565b34801561069d57600080fd5b5061039b6106ac3660046148c4565b611734565b3480156106bd57600080fd5b5061039b6106cc36600461484e565b611820565b3480156106dd57600080fd5b5061039b611871565b61039b6106f436600461478f565b61187a565b34801561070557600080fd5b5061039b611b2c565b34801561071a57600080fd5b5061045d61072936600461484e565b60076020526000908152604090205460ff1681565b34801561074a57600080fd5b5061039b61075936600461484e565b611b7e565b34801561076a57600080fd5b5061039b611bcf565b34801561077f57600080fd5b5061039b61078e366004614723565b611c36565b34801561079f57600080fd5b506008546107b49067ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610400565b3480156107d957600080fd5b5061039b6107e836600461484e565b611dcd565b3480156107f957600080fd5b506000546001600160a01b03166104f5565b34801561081757600080fd5b5061041f60045481565b34801561082d57600080fd5b5061039b61083c36600461478f565b611e1e565b34801561084d57600080fd5b5061039b61085c36600461484e565b61201a565b34801561086d57600080fd5b5061039b61087c3660046149f2565b612084565b34801561088d57600080fd5b5061039b61089c366004614ae1565b6123cb565b3480156108ad57600080fd5b5061039b6108bc366004614723565b612519565b3480156108cd57600080fd5b506109106108dc36600461478f565b600f6020526000908152604090208054600182015460028301546003909301546001600160a01b0392831693919092169184565b604080516001600160a01b039586168152949093166020850152918301526060820152608001610400565b34801561094757600080fd5b5061041f60115481565b34801561095d57600080fd5b5061041f61096c36600461484e565b600d6020526000908152604090205481565b34801561098a57600080fd5b5061039b610999366004614b4e565b6125ca565b3480156109aa57600080fd5b5061041f6109b936600461484e565b60096020526000908152604090205481565b3480156109d757600080fd5b5061039b6109e63660046149f2565b612720565b3480156109f757600080fd5b5061041f60015481565b348015610a0d57600080fd5b5061045d610a1c36600461478f565b600a6020526000908152604090205460ff1681565b348015610a3d57600080fd5b5061045d610a4c36600461484e565b60136020526000908152604090205460ff1681565b348015610a6d57600080fd5b5061045d610a7c36600461484e565b6001600160a01b031660009081526013602052604090205460ff1690565b348015610aa657600080fd5b5061039b610ab5366004614723565b612a45565b348015610ac657600080fd5b5061039b612bdc565b348015610adb57600080fd5b5061039b610aea36600461478f565b612be5565b348015610afb57600080fd5b5061039b610b0a36600461484e565b612c8f565b348015610b1b57600080fd5b5061041f610b2a36600461484e565b600e6020526000908152604090205481565b348015610b4857600080fd5b5061041f610b5736600461484e565b60156020526000908152604090205481565b3360009081526013602052604090205460ff16610bc65760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b60448201526064015b60405180910390fd5b828114610c075760405162461bcd60e51b815260206004820152600f60248201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610bbd565b60005b83811015610d0557828282818110610c2457610c24614c4e565b9050602002013560156000878785818110610c4157610c41614c4e565b9050602002016020810190610c56919061484e565b6001600160a01b031681526020810191909152604001600020557f8b59d386e660418a48d742213ad5ce7c4dd51ae81f30e4e2c387f17d907010c9858583818110610ca357610ca3614c4e565b9050602002016020810190610cb8919061484e565b848484818110610cca57610cca614c4e565b604080516001600160a01b0390951685526020918202939093013590840152500160405180910390a180610cfd81614c7a565b915050610c0a565b5050505050565b3360009081526013602052604090205460ff16610d645760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b6044820152606401610bbd565b828114610da55760405162461bcd60e51b815260206004820152600f60248201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610bbd565b60005b83811015610d0557828282818110610dc257610dc2614c4e565b9050602002013560106000878785818110610ddf57610ddf614c4e565b9050602002016020810190610df4919061484e565b6001600160a01b031681526020810191909152604001600020557fceaad6533bfb481492fb3e08ef19297f46611b8fa9de5ef4cf8dc23a56ad09ce858583818110610e4157610e41614c4e565b9050602002016020810190610e56919061484e565b848484818110610e6857610e68614c4e565b604080516001600160a01b0390951685526020918202939093013590840152500160405180910390a180610e9b81614c7a565b915050610da8565b6000546001600160a01b03163314610eeb5760405162461bcd60e51b81526020600482018190526024820152600080516020614f738339815191526044820152606401610bbd565b600454610ef89042614c95565b60038190556040519081527f68e825132f7d4bc837dea2d64ac9fc19912bf0224b67f9317d8f1a917f5304a1906020015b60405180910390a1565b3360009081526013602052604090205460ff16610f8b5760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b6044820152606401610bbd565b60118190556040518181527fc0a39f234199b125fb93713c4d067bdcebbf691087f87b79c0feb92b156ba8b6906020015b60405180910390a150565b6002600554141561101a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610bbd565b600260055560065460ff16156110655760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610bbd565b8334146110a65760405162461bcd60e51b815260206004820152600f60248201526e082dadeeadce840dad2e6dac2e8c6d608b1b6044820152606401610bbd565b6012546001600160a01b03166110fe5760405162461bcd60e51b815260206004820152601360248201527f4e61746976652077726170206e6f7420736574000000000000000000000000006044820152606401610bbd565b60125460009061111c9087906001600160a01b031687878787612d5c565b9050601260009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0866040518263ffffffff1660e01b81526004016000604051808303818588803b15801561116e57600080fd5b505af1158015611182573d6000803e3d6000fd5b5050601254604080518681523360208201526001600160a01b03808d1692820192909252911660608201526080810189905267ffffffffffffffff80891660a0830152871660c082015263ffffffff861660e08201527f89d8051e597ab4178a863a5190407b98abfeff406aa8db90c59af76612e58f0193506101000191506112089050565b60405180910390a15050600160055550505050565b3360009081526007602052604090205460ff1661127c5760405162461bcd60e51b815260206004820152601460248201527f43616c6c6572206973206e6f74207061757365720000000000000000000000006044820152606401610bbd565b611284612f8f565b565b6000546001600160a01b031633146112ce5760405162461bcd60e51b81526020600482018190526024820152600080516020614f738339815191526044820152606401610bbd565b6112d781613026565b50565b3360009081526013602052604090205460ff166113325760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b6044820152606401610bbd565b8281146113735760405162461bcd60e51b815260206004820152600f60248201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610bbd565b60005b83811015610d055782828281811061139057611390614c4e565b90506020020135600d60008787858181106113ad576113ad614c4e565b90506020020160208101906113c2919061484e565b6001600160a01b031681526020810191909152604001600020557f608e49c22994f20b5d3496dca088b88dfd81b4a3e8cc3809ea1e10a320107e8985858381811061140f5761140f614c4e565b9050602002016020810190611424919061484e565b84848481811061143657611436614c4e565b604080516001600160a01b0390951685526020918202939093013590840152500160405180910390a18061146981614c7a565b915050611376565b3360009081526013602052604090205460ff166114c95760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b6044820152606401610bbd565b6017805463ffffffff191663ffffffff92909216919091179055565b3360009081526013602052604090205460ff1661153d5760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b6044820152606401610bbd565b600b8190556040518181527f2664fec2ff76486ac58ed087310855b648b15b9d19f3de8529e95f7c46b7d6b390602001610fbc565b600260055414156115c55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610bbd565b600260055560065460ff16156116105760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610bbd565b6001600160a01b038216600090815260096020526040902054811161166a5760405162461bcd60e51b815260206004820152601060248201526f185b5bdd5b9d081d1bdbc81cdb585b1b60821b6044820152606401610bbd565b600880546001919060009061168a90849067ffffffffffffffff16614cad565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506116d0333083856001600160a01b03166130df909392919063ffffffff16565b6008546040805167ffffffffffffffff90921682523360208301526001600160a01b0384168282015260608201839052517fd5d28426c3248963b1719df49aa4c665120372e02c8249bbea03d019c39ce7649181900360800190a150506001600555565b60008484848460405160200161174d9493929190614d45565b60405160208183030381529060405280519060200120905080600154146117b65760405162461bcd60e51b815260206004820152601860248201527f4d69736d617463682063757272656e74207369676e65727300000000000000006044820152606401610bbd565b87516020808a0191909120604080517f19457468657265756d205369676e6564204d6573736167653a0a33320000000081850152603c8082019390935281518082039093018352605c019052805191012061181690888888888888613177565b5050505050505050565b6000546001600160a01b031633146118685760405162461bcd60e51b81526020600482018190526024820152600080516020614f738339815191526044820152606401610bbd565b6112d7816134ad565b611284336134ad565b600260055414156118cd5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610bbd565b600260055560065460ff16156119185760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610bbd565b8034146119595760405162461bcd60e51b815260206004820152600f60248201526e082dadeeadce840dad2e6dac2e8c6d608b1b6044820152606401610bbd565b6012546001600160a01b03166119b15760405162461bcd60e51b815260206004820152601360248201527f4e61746976652077726170206e6f7420736574000000000000000000000000006044820152606401610bbd565b6012546001600160a01b03166000908152600960205260409020548111611a0d5760405162461bcd60e51b815260206004820152601060248201526f185b5bdd5b9d081d1bdbc81cdb585b1b60821b6044820152606401610bbd565b6008805460019190600090611a2d90849067ffffffffffffffff16614cad565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550601260009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611aa357600080fd5b505af1158015611ab7573d6000803e3d6000fd5b50506008546012546040805167ffffffffffffffff90931683523360208401526001600160a01b0390911690820152606081018590527fd5d28426c3248963b1719df49aa4c665120372e02c8249bbea03d019c39ce76493506080019150611b1c9050565b60405180910390a1506001600555565b6000546001600160a01b03163314611b745760405162461bcd60e51b81526020600482018190526024820152600080516020614f738339815191526044820152606401610bbd565b6112846000613566565b6000546001600160a01b03163314611bc65760405162461bcd60e51b81526020600482018190526024820152600080516020614f738339815191526044820152606401610bbd565b6112d7816135b6565b3360009081526007602052604090205460ff16611c2e5760405162461bcd60e51b815260206004820152601460248201527f43616c6c6572206973206e6f74207061757365720000000000000000000000006044820152606401610bbd565b611284613673565b3360009081526013602052604090205460ff16611c8e5760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b6044820152606401610bbd565b828114611ccf5760405162461bcd60e51b815260206004820152600f60248201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610bbd565b60005b83811015610d0557828282818110611cec57611cec614c4e565b9050602002013560166000878785818110611d0957611d09614c4e565b9050602002016020810190611d1e919061484e565b6001600160a01b031681526020810191909152604001600020557f4f12d1a5bfb3ccd3719255d4d299d808d50cdca9a0a5c2b3a5aaa7edde73052c858583818110611d6b57611d6b614c4e565b9050602002016020810190611d80919061484e565b848484818110611d9257611d92614c4e565b604080516001600160a01b0390951685526020918202939093013590840152500160405180910390a180611dc581614c7a565b915050611cd2565b6000546001600160a01b03163314611e155760405162461bcd60e51b81526020600482018190526024820152600080516020614f738339815191526044820152606401610bbd565b6112d7816136ee565b60065460ff1615611e645760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610bbd565b6000818152600f6020908152604091829020825160808101845281546001600160a01b0390811682526001830154169281019290925260028101549282019290925260039091015460608201819052611eff5760405162461bcd60e51b815260206004820152601260248201527f7472616e73666572206e6f7420657869737400000000000000000000000000006044820152606401610bbd565b6011548160600151611f119190614c95565b4211611f5f5760405162461bcd60e51b815260206004820152601560248201527f7472616e73666572207374696c6c206c6f636b656400000000000000000000006044820152606401610bbd565b6000828152600f6020908152604080832080546001600160a01b031990811682556001820180549091169055600281018490556003019290925582519083015191830151611fad92906137ab565b7f3b40e5089937425d14cdd96947e5661868357e224af59bd8b24a4b8a330d44268282600001518360200151846040015160405161200e94939291909384526001600160a01b03928316602085015291166040830152606082015260800190565b60405180910390a15050565b6000546001600160a01b031633146120625760405162461bcd60e51b81526020600482018190526024820152600080516020614f738339815191526044820152606401610bbd565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b60065460ff16156120ca5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610bbd565b6000463060405160200161212092919091825260601b6bffffffffffffffffffffffff191660208201527f57697468647261774d73670000000000000000000000000000000000000000006034820152603f0190565b60405160208183030381529060405280519060200120905061216a818a8a60405160200161215093929190614d5c565b604051602081830303815290604052888888888888611734565b60006121ab8a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506138e092505050565b905060008160000151826020015183604001518460600151856080015160405160200161222495949392919060c095861b6001600160c01b031990811682529490951b9093166008850152606091821b6bffffffffffffffffffffffff199081166010860152911b166024830152603882015260580190565b60408051601f1981840301815291815281516020928301206000818152600a90935291205490915060ff161561229c5760405162461bcd60e51b815260206004820152601a60248201527f776974686472617720616c7265616479207375636365656465640000000000006044820152606401610bbd565b6000818152600a60205260409020805460ff19166001179055606082015160808301516122c99190613a40565b60608201516001600160a01b031660009081526010602052604090205480158015906122f85750808360800151115b1561231a5761231582846040015185606001518660800151613b58565b612331565b6123318360400151846060015185608001516137ab565b7f48a1ab26f3aa7b62bb6b6e8eed182f292b84eb7b006c0254386b268af20774be8284602001518560400151866060015187608001518860a001516040516123b59695949392919095865267ffffffffffffffff9490941660208601526001600160a01b03928316604086015291166060840152608083015260a082015260c00190565b60405180910390a1505050505050505050505050565b6002600554141561241e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610bbd565b600260055560065460ff16156124695760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610bbd565b6000612479878787878787612d5c565b90506124906001600160a01b0387163330886130df565b604080518281523360208201526001600160a01b0389811682840152881660608201526080810187905267ffffffffffffffff86811660a0830152851660c082015263ffffffff841660e082015290517f89d8051e597ab4178a863a5190407b98abfeff406aa8db90c59af76612e58f01918190036101000190a1505060016005555050505050565b6000546001600160a01b031633146125615760405162461bcd60e51b81526020600482018190526024820152600080516020614f738339815191526044820152606401610bbd565b60035442116125b25760405162461bcd60e51b815260206004820152601460248201527f6e6f742072656163682072657365742074696d650000000000000000000000006044820152606401610bbd565b6000196003556125c484848484613c0c565b50505050565b6002548b1161261b5760405162461bcd60e51b815260206004820152601e60248201527f547269676765722074696d65206973206e6f7420696e6372656173696e6700006044820152606401610bbd565b61262742610e10614c95565b8b106126755760405162461bcd60e51b815260206004820152601960248201527f547269676765722074696d6520697320746f6f206c61726765000000000000006044820152606401610bbd565b600046306040516020016126cb92919091825260601b6bffffffffffffffffffffffff191660208201527f5570646174655369676e65727300000000000000000000000000000000000000603482015260410190565b604051602081830303815290604052805190602001209050612701818d8d8d8d8d60405160200161215096959493929190614d76565b61270d8b8b8b8b613c0c565b5050506002989098555050505050505050565b60065460ff16156127665760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610bbd565b600046306040516020016127bc92919091825260601b6bffffffffffffffffffffffff191660208201527f52656c6179000000000000000000000000000000000000000000000000000000603482015260390190565b6040516020818303038152906040528051906020012090506127ec818a8a60405160200161215093929190614d5c565b600061282d8a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613db692505050565b8051602080830151604080850151606080870151608088015160a089015160c0808b015187519a861b6bffffffffffffffffffffffff199081168c8c015298861b891660348c01529590941b9096166048890152605c880191909152811b6001600160c01b0319908116607c88015293901b9092166084850152608c808501929092528051808503909201825260ac909301835280519082012060008181526014909252919020549192509060ff161561291b5760405162461bcd60e51b815260206004820152600f60248201526e7472616e736665722065786973747360881b6044820152606401610bbd565b60008181526014602052604090819020805460ff1916600117905582015160608301516129489190613a40565b6040808301516001600160a01b031660009081526010602052205480158015906129755750808360600151115b156129975761299282846020015185604001518660600151613b58565b6129ae565b6129ae8360200151846040015185606001516137ab565b7f79fa08de5149d912dce8e5e8da7a7c17ccdf23dd5d3bfe196802e6eb86347c7c82846000015185602001518660400151876060015188608001518960c001516040516123b597969594939291909687526001600160a01b0395861660208801529385166040870152919093166060850152608084019290925267ffffffffffffffff9190911660a083015260c082015260e00190565b3360009081526013602052604090205460ff16612a9d5760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b6044820152606401610bbd565b828114612ade5760405162461bcd60e51b815260206004820152600f60248201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610bbd565b60005b83811015610d0557828282818110612afb57612afb614c4e565b9050602002013560096000878785818110612b1857612b18614c4e565b9050602002016020810190612b2d919061484e565b6001600160a01b031681526020810191909152604001600020557fc56b0d14c4940515800d94ebbd0f3f5d8cc58ba1109c12536bd993b72e466e4f858583818110612b7a57612b7a614c4e565b9050602002016020810190612b8f919061484e565b848484818110612ba157612ba1614c4e565b604080516001600160a01b0390951685526020918202939093013590840152500160405180910390a180612bd481614c7a565b915050612ae1565b61128433613026565b6000546001600160a01b03163314612c2d5760405162461bcd60e51b81526020600482018190526024820152600080516020614f738339815191526044820152606401610bbd565b6004548111612c8a5760405162461bcd60e51b815260206004820152602360248201527f6e6f7469636520706572696f642063616e206f6e6c7920626520696e637265616044820152621cd95960ea1b6064820152608401610bbd565b600455565b6000546001600160a01b03163314612cd75760405162461bcd60e51b81526020600482018190526024820152600080516020614f738339815191526044820152606401610bbd565b6001600160a01b038116612d535760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610bbd565b6112d781613566565b6001600160a01b0385166000908152601560205260408120548511612db65760405162461bcd60e51b815260206004820152601060248201526f185b5bdd5b9d081d1bdbc81cdb585b1b60821b6044820152606401610bbd565b6001600160a01b0386166000908152601660205260409020541580612df357506001600160a01b0386166000908152601660205260409020548511155b612e3f5760405162461bcd60e51b815260206004820152601060248201527f616d6f756e7420746f6f206c61726765000000000000000000000000000000006044820152606401610bbd565b60175463ffffffff90811690831611612e9a5760405162461bcd60e51b815260206004820152601660248201527f6d617820736c69707061676520746f6f20736d616c6c000000000000000000006044820152606401610bbd565b6040516bffffffffffffffffffffffff1933606090811b8216602084015289811b8216603484015288901b166048820152605c81018690526001600160c01b031960c086811b8216607c84015285811b8216608484015246901b16608c82015260009060940160408051601f1981840301815291815281516020928301206000818152601490935291205490915060ff1615612f6a5760405162461bcd60e51b815260206004820152600f60248201526e7472616e736665722065786973747360881b6044820152606401610bbd565b6000818152601460205260409020805460ff1916600117905590509695505050505050565b60065460ff16612fe15760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610bbd565b6006805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b039091168152602001610f29565b6001600160a01b03811660009081526013602052604090205460ff1661308e5760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f7420676f7665726e6f720000000000000000006044820152606401610bbd565b6001600160a01b038116600081815260136020908152604091829020805460ff1916905590519182527f1ebe834e73d60a5fec822c1e1727d34bc79f2ad977ed504581cc1822fe20fb5b9101610fbc565b6040516001600160a01b03808516602483015283166044820152606481018290526125c49085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613f2e565b8281146131d25760405162461bcd60e51b815260206004820152602360248201527f7369676e65727320616e6420706f77657273206c656e677468206e6f74206d616044820152620e8c6d60eb1b6064820152608401610bbd565b6000805b84811015613216578383828181106131f0576131f0614c4e565b90506020020135826132029190614c95565b91508061320e81614c7a565b9150506131d6565b5060006003613226836002614d9e565b6132309190614dbd565b61323b906001614c95565b905060008080805b8a81101561345b5760006132c68d8d8481811061326257613262614c4e565b90506020028101906132749190614ddf565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508f61401390919063ffffffff16565b9050836001600160a01b0316816001600160a01b0316116133295760405162461bcd60e51b815260206004820152601e60248201527f7369676e657273206e6f7420696e20617363656e64696e67206f7264657200006044820152606401610bbd565b8093505b8a8a8481811061333f5761333f614c4e565b9050602002016020810190613354919061484e565b6001600160a01b0316816001600160a01b031611156133ce57613378600184614c95565b92508983106133c95760405162461bcd60e51b815260206004820152601060248201527f7369676e6572206e6f7420666f756e64000000000000000000000000000000006044820152606401610bbd565b61332d565b8a8a848181106133e0576133e0614c4e565b90506020020160208101906133f5919061484e565b6001600160a01b0316816001600160a01b031614156134355788888481811061342057613420614c4e565b90506020020135856134329190614c95565b94505b85851061344857505050505050506134a4565b508061345381614c7a565b915050613243565b5060405162461bcd60e51b815260206004820152601260248201527f71756f72756d206e6f74207265616368656400000000000000000000000000006044820152606401610bbd565b50505050505050565b6001600160a01b03811660009081526007602052604090205460ff166135155760405162461bcd60e51b815260206004820152601560248201527f4163636f756e74206973206e6f742070617573657200000000000000000000006044820152606401610bbd565b6001600160a01b038116600081815260076020908152604091829020805460ff1916905590519182527fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e9101610fbc565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811660009081526007602052604090205460ff161561361f5760405162461bcd60e51b815260206004820152601960248201527f4163636f756e7420697320616c726561647920706175736572000000000000006044820152606401610bbd565b6001600160a01b038116600081815260076020908152604091829020805460ff1916600117905590519182527f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f89101610fbc565b60065460ff16156136b95760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610bbd565b6006805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861300e3390565b6001600160a01b03811660009081526013602052604090205460ff16156137575760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920676f7665726e6f7200000000006044820152606401610bbd565b6001600160a01b038116600081815260136020908152604091829020805460ff1916600117905590519182527fdc5a48d79e2e147530ff63ecdbed5a5a66adb9d5cf339384d5d076da197c40b59101610fbc565b6012546001600160a01b03838116911614156138c757601254604051632e1a7d4d60e01b8152600481018390526001600160a01b0390911690632e1a7d4d90602401600060405180830381600087803b15801561380757600080fd5b505af115801561381b573d6000803e3d6000fd5b505050506000836001600160a01b03168261c35090604051600060405180830381858888f193505050503d8060008114613871576040519150601f19603f3d011682016040523d82523d6000602084013e613876565b606091505b50509050806125c45760405162461bcd60e51b815260206004820152601b60248201527f6661696c656420746f2073656e64206e617469766520746f6b656e00000000006044820152606401610bbd565b6138db6001600160a01b03831684836140bd565b505050565b6040805160c08101825260008082526020808301829052828401829052606083018290526080830182905260a0830182905283518085019094528184528301849052909190805b60208301515183511015613a385761393e836140ed565b909250905081600114156139665761395583614127565b67ffffffffffffffff168452613927565b816002141561398c5761397883614127565b67ffffffffffffffff166020850152613927565b81600314156139b9576139a66139a1846141a9565b614266565b6001600160a01b03166040850152613927565b81600414156139e1576139ce6139a1846141a9565b6001600160a01b03166060850152613927565b8160051415613a05576139fb6139f6846141a9565b614271565b6080850152613927565b8160061415613a2957613a1f613a1a846141a9565b6142a8565b60a0850152613927565b613a3383826142c0565b613927565b505050919050565b600b54613a4b575050565b6001600160a01b0382166000908152600d602052604090205480613a6e57505050565b6001600160a01b0383166000908152600c6020526040812054600b5490914291613a988184614dbd565b613aa29190614d9e565b6001600160a01b0387166000908152600e6020526040902054909150811115613acd57849250613ada565b613ad78584614c95565b92505b83831115613b2a5760405162461bcd60e51b815260206004820152601260248201527f766f6c756d6520657863656564732063617000000000000000000000000000006044820152606401610bbd565b506001600160a01b039094166000908152600c6020908152604080832093909355600e905220929092555050565b604080516080810182526001600160a01b0380861682528481166020808401918252838501868152426060860190815260008b8152600f90935291869020945185549085166001600160a01b031991821617865592516001860180549190951693169290921790925551600283015551600390910155517fcbcfffe5102114216a85d3aceb14ad4b81a3935b1b5c468fadf3889eb9c5dce690613bfe9086815260200190565b60405180910390a150505050565b828114613c675760405162461bcd60e51b815260206004820152602360248201527f7369676e65727320616e6420706f77657273206c656e677468206e6f74206d616044820152620e8c6d60eb1b6064820152608401610bbd565b6000805b84811015613d4057816001600160a01b0316868683818110613c8f57613c8f614c4e565b9050602002016020810190613ca4919061484e565b6001600160a01b031611613d055760405162461bcd60e51b815260206004820152602260248201527f4e6577207369676e657273206e6f7420696e20617363656e64696e67206f726460448201526132b960f11b6064820152608401610bbd565b858582818110613d1757613d17614c4e565b9050602002016020810190613d2c919061484e565b915080613d3881614c7a565b915050613c6b565b5084848484604051602001613d589493929190614d45565b60408051601f198184030181529082905280516020909101206001557ff126123539a68393c55697f617e7d1148e371988daed246c2f41da99965a23f890613da7908790879087908790614e26565b60405180910390a15050505050565b6040805160e08101825260008082526020808301829052828401829052606083018290526080830182905260a0830182905260c0830182905283518085019094528184528301849052909190805b60208301515183511015613a3857613e1b836140ed565b90925090508160011415613e4557613e356139a1846141a9565b6001600160a01b03168452613e04565b8160021415613e6d57613e5a6139a1846141a9565b6001600160a01b03166020850152613e04565b8160031415613e9557613e826139a1846141a9565b6001600160a01b03166040850152613e04565b8160041415613eb457613eaa6139f6846141a9565b6060850152613e04565b8160051415613eda57613ec683614127565b67ffffffffffffffff166080850152613e04565b8160061415613f0057613eec83614127565b67ffffffffffffffff1660a0850152613e04565b8160071415613f1f57613f15613a1a846141a9565b60c0850152613e04565b613f2983826142c0565b613e04565b6000613f83826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166143329092919063ffffffff16565b8051909150156138db5780806020019051810190613fa19190614ea8565b6138db5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610bbd565b60008151604114156140475760208201516040830151606084015160001a61403d8682858561434b565b93505050506140b7565b81516040141561406f57602082015160408301516140668583836144f4565b925050506140b7565b60405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610bbd565b92915050565b6040516001600160a01b0383166024820152604481018290526138db90849063a9059cbb60e01b90606401613113565b60008060006140fb84614127565b9050614108600882614dbd565b925080600716600581111561411f5761411f614eca565b915050915091565b602080820151825181019091015160009182805b600a8110156141a35783811a9150614154816007614d9e565b82607f16901b85179450816080166000141561419157614175816001614c95565b86518790614184908390614c95565b9052509395945050505050565b8061419b81614c7a565b91505061413b565b50600080fd5b606060006141b683614127565b905060008184600001516141ca9190614c95565b90508360200151518111156141de57600080fd5b8167ffffffffffffffff8111156141f7576141f76148ae565b6040519080825280601f01601f191660200182016040528015614221576020820181803683370190505b50602080860151865192955091818601919083010160005b8581101561425b578181015183820152614254602082614c95565b9050614239565b505050935250919050565b60006140b782614537565b600060208251111561428257600080fd5b60208201519050815160206142979190614ee0565b6142a2906008614d9e565b1c919050565b600081516020146142b857600080fd5b506020015190565b60008160058111156142d4576142d4614eca565b14156142e3576138db82614127565b60028160058111156142f7576142f7614eca565b141561037657600061430883614127565b9050808360000181815161431c9190614c95565b905250602083015151835111156138db57600080fd5b6060614341848460008561455f565b90505b9392505050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156143c85760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610bbd565b8360ff16601b14806143dd57508360ff16601c145b6144345760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610bbd565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa158015614488573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166144eb5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610bbd565b95945050505050565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821660ff83901c601b0161452d8682878561434b565b9695505050505050565b6000815160141461454757600080fd5b50602001516c01000000000000000000000000900490565b6060824710156145d75760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610bbd565b843b6146255760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610bbd565b600080866001600160a01b031685876040516146419190614f23565b60006040518083038185875af1925050503d806000811461467e576040519150601f19603f3d011682016040523d82523d6000602084013e614683565b606091505b509150915061469382828661469e565b979650505050505050565b606083156146ad575081614344565b8251156146bd5782518084602001fd5b8160405162461bcd60e51b8152600401610bbd9190614f3f565b60008083601f8401126146e957600080fd5b50813567ffffffffffffffff81111561470157600080fd5b6020830191508360208260051b850101111561471c57600080fd5b9250929050565b6000806000806040858703121561473957600080fd5b843567ffffffffffffffff8082111561475157600080fd5b61475d888389016146d7565b9096509450602087013591508082111561477657600080fd5b50614783878288016146d7565b95989497509550505050565b6000602082840312156147a157600080fd5b5035919050565b80356001600160a01b03811681146147bf57600080fd5b919050565b803567ffffffffffffffff811681146147bf57600080fd5b803563ffffffff811681146147bf57600080fd5b600080600080600060a0868803121561480857600080fd5b614811866147a8565b945060208601359350614826604087016147c4565b9250614834606087016147c4565b9150614842608087016147dc565b90509295509295909350565b60006020828403121561486057600080fd5b614344826147a8565b60006020828403121561487b57600080fd5b614344826147dc565b6000806040838503121561489757600080fd5b6148a0836147a8565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b60008060008060008060006080888a0312156148df57600080fd5b873567ffffffffffffffff808211156148f757600080fd5b818a0191508a601f83011261490b57600080fd5b81358181111561491d5761491d6148ae565b604051601f8201601f19908116603f01168101908382118183101715614945576149456148ae565b816040528281528d602084870101111561495e57600080fd5b82602086016020830137600094508460208483010152809b5050505060208a01358181111561498b578283fd5b6149978c828d016146d7565b90995097505060408a0135818111156149ae578283fd5b6149ba8c828d016146d7565b90975095505060608a0135818111156149d1578283fd5b6149dd8c828d016146d7565b9a9d999c50979a509598949794955050505050565b6000806000806000806000806080898b031215614a0e57600080fd5b883567ffffffffffffffff80821115614a2657600080fd5b818b0191508b601f830112614a3a57600080fd5b813581811115614a4957600080fd5b8c6020828501011115614a5b57600080fd5b60209283019a509850908a01359080821115614a7657600080fd5b614a828c838d016146d7565b909850965060408b0135915080821115614a9b57600080fd5b614aa78c838d016146d7565b909650945060608b0135915080821115614ac057600080fd5b50614acd8b828c016146d7565b999c989b5096995094979396929594505050565b60008060008060008060c08789031215614afa57600080fd5b614b03876147a8565b9550614b11602088016147a8565b945060408701359350614b26606088016147c4565b9250614b34608088016147c4565b9150614b4260a088016147dc565b90509295509295509295565b600080600080600080600080600080600060c08c8e031215614b6f57600080fd5b8b359a5067ffffffffffffffff8060208e01351115614b8d57600080fd5b614b9d8e60208f01358f016146d7565b909b50995060408d0135811015614bb357600080fd5b614bc38e60408f01358f016146d7565b909950975060608d0135811015614bd957600080fd5b614be98e60608f01358f016146d7565b909750955060808d0135811015614bff57600080fd5b614c0f8e60808f01358f016146d7565b909550935060a08d0135811015614c2557600080fd5b50614c368d60a08e01358e016146d7565b81935080925050509295989b509295989b9093969950565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415614c8e57614c8e614c64565b5060010190565b60008219821115614ca857614ca8614c64565b500190565b600067ffffffffffffffff808316818516808303821115614cd057614cd0614c64565b01949350505050565b60008160005b84811015614d0e576001600160a01b03614cf8836147a8565b1686526020958601959190910190600101614cdf565b5093949350505050565b60006001600160fb1b03831115614d2e57600080fd5b8260051b8083863760009401938452509192915050565b600061452d614d55838789614cd9565b8486614d18565b838152818360208301376000910160200190815292915050565b8681528560208201526000614d92614d55604084018789614cd9565b98975050505050505050565b6000816000190483118215151615614db857614db8614c64565b500290565b600082614dda57634e487b7160e01b600052601260045260246000fd5b500490565b6000808335601e19843603018112614df657600080fd5b83018035915067ffffffffffffffff821115614e1157600080fd5b60200191503681900382131561471c57600080fd5b6040808252810184905260008560608301825b87811015614e67576001600160a01b03614e52846147a8565b16825260209283019290910190600101614e39565b5083810360208501528481526001600160fb1b03851115614e8757600080fd5b8460051b915081866020830137600091016020019081529695505050505050565b600060208284031215614eba57600080fd5b8151801515811461434457600080fd5b634e487b7160e01b600052602160045260246000fd5b600082821015614ef257614ef2614c64565b500390565b60005b83811015614f12578181015183820152602001614efa565b838111156125c45750506000910152565b60008251614f35818460208701614ef7565b9190910192915050565b6020815260008251806020840152614f5e816040850160208701614ef7565b601f01601f1916919091016040019291505056fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212202fdb1d217635af2c1059d49d7bf3f9737853c60c3a103042abc1ffc62212b02364736f6c63430008090033

Deployed ByteCode Sourcemap

246:5386:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4684:347;;;;;;;;;;-1:-1:-1;4684:347:0;;;;;:::i;:::-;;:::i;:::-;;5692:382:2;;;;;;;;;;-1:-1:-1;5692:382:2;;;;;:::i;:::-;;:::i;3093:151:3:-;;;;;;;;;;;;;:::i;1151:32:0:-;;;;;;;;;;-1:-1:-1;1151:32:0;;;;;;;;;;;1338:10:17;1326:23;;;1308:42;;1296:2;1281:18;1151:32:0;;;;;;;;330:26:3;;;;;;;;;;;;;;;;;;;1507:25:17;;;1495:2;1480:18;330:26:3;1361:177:17;896:41:0;;;;;;;;;;-1:-1:-1;896:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1893:14:17;;1886:22;1868:41;;1856:2;1841:18;896:41:0;1728:187:17;6080:143:2;;;;;;;;;;-1:-1:-1;6080:143:2;;;;;:::i;:::-;;:::i;1732:599:0:-;;;;;;:::i;:::-;;:::i;591:64:1:-;;;;;;;;;;;;;:::i;8782:100:2:-;;;;;;;;;;-1:-1:-1;8782:100:2;;;;;:::i;:::-;;:::i;1704:25::-;;;;;;;;;;-1:-1:-1;1704:25:2;;;;-1:-1:-1;;;;;1704:25:2;;;;;;-1:-1:-1;;;;;3482:55:17;;;3464:74;;3452:2;3437:18;1704:25:2;3318:226:17;661:102:1;;;;;;;;;;-1:-1:-1;661:102:1;;;;;:::i;:::-;-1:-1:-1;;;;;740:16:1;717:4;740:16;;;:7;:16;;;;;;;;;661:102;5331:355:2;;;;;;;;;;-1:-1:-1;5331:355:2;;;;;:::i;:::-;;:::i;5390:138:0:-;;;;;;;;;;-1:-1:-1;5390:138:0;;;;;:::i;:::-;;:::i;1303:50:2:-;;;;;;;;;;-1:-1:-1;1303:50:2;;;;;:::i;:::-;;;;;;;;;;;;;;5182:143;;;;;;;;;;-1:-1:-1;5182:143:2;;;;;:::i;:::-;;:::i;2722:325::-;;;;;;;;;;-1:-1:-1;2722:325:2;;;;;:::i;:::-;;:::i;845:26::-;;;;;;;;;;;;;;;;1041:84:10;;;;;;;;;;-1:-1:-1;1111:7:10;;;;1041:84;;888:47:2;;;;;;;;;;-1:-1:-1;888:47:2;;;;;:::i;:::-;;;;;;;;;;;;;;1022:42:0;;;;;;;;;;-1:-1:-1;1022:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;478:24:3;;;;;;;;;;;;;;;;1114:409;;;;;;;;;;-1:-1:-1;1114:409:3;;;;;:::i;:::-;;:::i;864:95:1:-;;;;;;;;;;-1:-1:-1;864:95:1;;;;;:::i;:::-;;:::i;965:75::-;;;;;;;;;;;;;:::i;3053:431:2:-;;;;;;:::i;:::-;;:::i;1605:92:9:-;;;;;;;;;;;;;:::i;228:39:1:-;;;;;;;;;;-1:-1:-1;228:39:1;;;;;:::i;:::-;;;;;;;;;;;;;;;;769:89;;;;;;;;;;-1:-1:-1;769:89:1;;;;;:::i;:::-;;:::i;525:60::-;;;;;;;;;;;;;:::i;5037:347:0:-;;;;;;;;;;-1:-1:-1;5037:347:0;;;;;:::i;:::-;;:::i;540:20:2:-;;;;;;;;;;-1:-1:-1;540:20:2;;;;;;;;;;;6223:18:17;6211:31;;;6193:50;;6181:2;6166:18;540:20:2;6049:200:17;8682:94:2;;;;;;;;;;-1:-1:-1;8682:94:2;;;;;:::i;:::-;;:::i;973:85:9:-;;;;;;;;;;-1:-1:-1;1019:7:9;1045:6;-1:-1:-1;;;;;1045:6:9;973:85;;508:27:3;;;;;;;;;;;;;;;;4679:497:2;;;;;;;;;;-1:-1:-1;4679:497:2;;;;;:::i;:::-;;:::i;8361:86::-;;;;;;;;;;-1:-1:-1;8361:86:2;;;;;:::i;:::-;;:::i;3490:1183::-;;;;;;;;;;-1:-1:-1;3490:1183:2;;;;;:::i;:::-;;:::i;1190:536:0:-;;;;;;;;;;-1:-1:-1;1190:536:0;;;;;:::i;:::-;;:::i;2840:247:3:-;;;;;;;;;;-1:-1:-1;2840:247:3;;;;;:::i;:::-;;:::i;1238:59:2:-;;;;;;;;;;-1:-1:-1;1238:59:2;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1238:59:2;;;;;;;;;;;;;;;-1:-1:-1;;;;;8675:15:17;;;8657:34;;8727:15;;;;8722:2;8707:18;;8700:43;8759:18;;;8752:34;8817:2;8802:18;;8795:34;8583:3;8568:19;1238:59:2;8365:470:17;1359:26:2;;;;;;;;;;;;;;;;957:50;;;;;;;;;;-1:-1:-1;957:50:2;;;;;:::i;:::-;;;;;;;;;;;;;;1854:886:3;;;;;;;;;;-1:-1:-1;1854:886:3;;;;;:::i;:::-;;:::i;618:41:2:-;;;;;;;;;;-1:-1:-1;618:41:2;;;;;:::i;:::-;;;;;;;;;;;;;;3176:1502:0;;;;;;;;;;-1:-1:-1;3176:1502:0;;;;;:::i;:::-;;:::i;303:21:3:-;;;;;;;;;;;;;;;;797:41:2;;;;;;;;;;-1:-1:-1;797:41:2;;;;;:::i;:::-;;;;;;;;;;;;;;;;1736;;;;;;;;;;-1:-1:-1;1736:41:2;;;;;:::i;:::-;;;;;;;;;;;;;;;;8568:108;;;;;;;;;;-1:-1:-1;8568:108:2;;;;;:::i;:::-;-1:-1:-1;;;;;8650:19:2;8627:4;8650:19;;;:9;:19;;;;;;;;;8568:108;6229:344;;;;;;;;;;-1:-1:-1;6229:344:2;;;;;:::i;:::-;;:::i;8888:78::-;;;;;;;;;;;;;:::i;3250:182:3:-;;;;;;;;;;-1:-1:-1;3250:182:3;;;;;:::i;:::-;;:::i;1846:189:9:-;;;;;;;;;;-1:-1:-1;1846:189:9;;;;;:::i;:::-;;:::i;1029:51:2:-;;;;;;;;;;-1:-1:-1;1029:51:2;;;;;:::i;:::-;;;;;;;;;;;;;;943:42:0;;;;;;;;;;-1:-1:-1;943:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;4684:347;8506:10:2;8627:4;8650:19;;;:9;:19;;;;;;;;8487:57;;;;-1:-1:-1;;;8487:57:2;;10996:2:17;8487:57:2;;;10978:21:17;11035:2;11015:18;;;11008:30;-1:-1:-1;;;11054:18:17;;;11047:52;11116:18;;8487:57:2;;;;;;;;;4801:33:0;;::::1;4793:61;;;::::0;-1:-1:-1;;;4793:61:0;;11347:2:17;4793:61:0::1;::::0;::::1;11329:21:17::0;11386:2;11366:18;;;11359:30;-1:-1:-1;;;11405:18:17;;;11398:45;11460:18;;4793:61:0::1;11145:339:17::0;4793:61:0::1;4869:9;4864:161;4884:18:::0;;::::1;4864:161;;;4945:8;;4954:1;4945:11;;;;;;;:::i;:::-;;;;;;;4923:7;:19;4931:7;;4939:1;4931:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;4923:19:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;4923:19:0;:33;4975:39:::1;4990:7:::0;;4998:1;4990:10;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;5002:8;;5011:1;5002:11;;;;;;;:::i;:::-;4975:39;::::0;;-1:-1:-1;;;;;11813:55:17;;;11795:74;;5002:11:0::1;::::0;;::::1;::::0;;;::::1;;11885:18:17::0;;;11878:34;-1:-1:-1;11768:18:17;4975:39:0::1;;;;;;;4904:3:::0;::::1;::::0;::::1;:::i;:::-;;;;4864:161;;;;4684:347:::0;;;;:::o;5692:382:2:-;8506:10;8627:4;8650:19;;;:9;:19;;;;;;;;8487:57;;;;-1:-1:-1;;;8487:57:2;;10996:2:17;8487:57:2;;;10978:21:17;11035:2;11015:18;;;11008:30;-1:-1:-1;;;11054:18:17;;;11047:52;11116:18;;8487:57:2;10794:346:17;8487:57:2;5820:36;;::::1;5812:64;;;::::0;-1:-1:-1;;;5812:64:2;;11347:2:17;5812:64:2::1;::::0;::::1;11329:21:17::0;11386:2;11366:18;;;11359:30;-1:-1:-1;;;11405:18:17;;;11398:45;11460:18;;5812:64:2::1;11145:339:17::0;5812:64:2::1;5891:9;5886:182;5906:18:::0;;::::1;5886:182;;;5975:11;;5987:1;5975:14;;;;;;;:::i;:::-;;;;;;;5945:15;:27;5961:7;;5969:1;5961:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;5945:27:2::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;5945:27:2;:44;6008:49:::1;6030:7:::0;;6038:1;6030:10;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;6042:11;;6054:1;6042:14;;;;;;;:::i;:::-;6008:49;::::0;;-1:-1:-1;;;;;11813:55:17;;;11795:74;;6042:14:2::1;::::0;;::::1;::::0;;;::::1;;11885:18:17::0;;;11878:34;-1:-1:-1;11768:18:17;6008:49:2::1;;;;;;;5926:3:::0;::::1;::::0;::::1;:::i;:::-;;;;5886:182;;3093:151:3::0;1019:7:9;1045:6;-1:-1:-1;;;;;1045:6:9;665:10:15;1185:23:9;1177:68;;;;-1:-1:-1;;;1177:68:9;;12397:2:17;1177:68:9;;;12379:21:17;;;12416:18;;;12409:30;-1:-1:-1;;;;;;;;;;;12455:18:17;;;12448:62;12527:18;;1177:68:9;12195:356:17;1177:68:9;3182:12:3::1;::::0;3164:30:::1;::::0;:15:::1;:30;:::i;:::-;3152:9;:42:::0;;;3209:28:::1;::::0;1507:25:17;;;3209:28:3::1;::::0;1495:2:17;1480:18;3209:28:3::1;;;;;;;;3093:151::o:0;6080:143:2:-;8506:10;8627:4;8650:19;;;:9;:19;;;;;;;;8487:57;;;;-1:-1:-1;;;8487:57:2;;10996:2:17;8487:57:2;;;10978:21:17;11035:2;11015:18;;;11008:30;-1:-1:-1;;;11054:18:17;;;11047:52;11116:18;;8487:57:2;10794:346:17;8487:57:2;6153:11:::1;:21:::0;;;6189:27:::1;::::0;1507:25:17;;;6189:27:2::1;::::0;1495:2:17;1480:18;6189:27:2::1;;;;;;;;6080:143:::0;:::o;1732:599:0:-;1680:1:11;2259:7;;:19;;2251:63;;;;-1:-1:-1;;;2251:63:11;;12891:2:17;2251:63:11;;;12873:21:17;12930:2;12910:18;;;12903:30;12969:33;12949:18;;;12942:61;13020:18;;2251:63:11;12689:355:17;2251:63:11;1680:1;2389:7;:18;1111:7:10;;;;1354:9:::1;1346:38;;;::::0;-1:-1:-1;;;1346:38:10;;13251:2:17;1346:38:10::1;::::0;::::1;13233:21:17::0;13290:2;13270:18;;;13263:30;-1:-1:-1;;;13309:18:17;;;13302:46;13365:18;;1346:38:10::1;13049:340:17::0;1346:38:10::1;1965:7:0::2;1952:9;:20;1944:48;;;::::0;-1:-1:-1;;;1944:48:0;;13596:2:17;1944:48:0::2;::::0;::::2;13578:21:17::0;13635:2;13615:18;;;13608:30;-1:-1:-1;;;13654:18:17;;;13647:45;13709:18;;1944:48:0::2;13394:339:17::0;1944:48:0::2;2010:10;::::0;-1:-1:-1;;;;;2010:10:0::2;2002:56;;;::::0;-1:-1:-1;;;2002:56:0;;13940:2:17;2002:56:0::2;::::0;::::2;13922:21:17::0;13979:2;13959:18;;;13952:30;14018:21;13998:18;;;13991:49;14057:18;;2002:56:0::2;13738:343:17::0;2002:56:0::2;2106:10;::::0;2068:18:::2;::::0;2089:72:::2;::::0;2095:9;;-1:-1:-1;;;;;2106:10:0::2;2118:7:::0;2127:11;2140:6;2148:12;2089:5:::2;:72::i;:::-;2068:93;;2177:10;;;;;;;;;-1:-1:-1::0;;;;;2177:10:0::2;-1:-1:-1::0;;;;;2171:25:0::2;;2204:7;2171:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;2269:10:0::2;::::0;2229:95:::2;::::0;;14423:25:17;;;2246:10:0::2;14540:2:17::0;14525:18;;14518:43;-1:-1:-1;;;;;14597:15:17;;;14577:18;;;14570:43;;;;2269:10:0;::::2;14644:2:17::0;14629:18;;14622:43;14696:3;14681:19;;14674:35;;;14728:18;14783:15;;;14777:3;14762:19;;14755:44;14836:15;;14830:3;14815:19;;14808:44;14901:10;14889:23;;14883:3;14868:19;;14861:52;2229:95:0::2;::::0;-1:-1:-1;14410:3:17;14395:19;;-1:-1:-1;2229:95:0::2;::::0;-1:-1:-1;14086:833:17;2229:95:0::2;;;;;;;;-1:-1:-1::0;;1637:1:11;2562:7;:22;-1:-1:-1;;;;1732:599:0:o;591:64:1:-;465:10;717:4;740:16;;;:7;:16;;;;;;;;448:53;;;;-1:-1:-1;;;448:53:1;;15126:2:17;448:53:1;;;15108:21:17;15165:2;15145:18;;;15138:30;15204:22;15184:18;;;15177:50;15244:18;;448:53:1;14924:344:17;448:53:1;638:10:::1;:8;:10::i;:::-;591:64::o:0;8782:100:2:-;1019:7:9;1045:6;-1:-1:-1;;;;;1045:6:9;665:10:15;1185:23:9;1177:68;;;;-1:-1:-1;;;1177:68:9;;12397:2:17;1177:68:9;;;12379:21:17;;;12416:18;;;12409:30;-1:-1:-1;;;;;;;;;;;12455:18:17;;;12448:62;12527:18;;1177:68:9;12195:356:17;1177:68:9;8850:25:2::1;8866:8;8850:15;:25::i;:::-;8782:100:::0;:::o;5331:355::-;8506:10;8627:4;8650:19;;;:9;:19;;;;;;;;8487:57;;;;-1:-1:-1;;;8487:57:2;;10996:2:17;8487:57:2;;;10978:21:17;11035:2;11015:18;;;11008:30;-1:-1:-1;;;11054:18:17;;;11047:52;11116:18;;8487:57:2;10794:346:17;8487:57:2;5453:30;;::::1;5445:58;;;::::0;-1:-1:-1;;;5445:58:2;;11347:2:17;5445:58:2::1;::::0;::::1;11329:21:17::0;11386:2;11366:18;;;11359:30;-1:-1:-1;;;11405:18:17;;;11398:45;11460:18;;5445:58:2::1;11145:339:17::0;5445:58:2::1;5518:9;5513:167;5533:18:::0;;::::1;5513:167;;;5602:5;;5608:1;5602:8;;;;;;;:::i;:::-;;;;;;;5572:15;:27;5588:7;;5596:1;5588:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;5572:27:2::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;5572:27:2;:38;5629:40:::1;5648:7:::0;;5656:1;5648:10;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;5660:5;;5666:1;5660:8;;;;;;;:::i;:::-;5629:40;::::0;;-1:-1:-1;;;;;11813:55:17;;;11795:74;;5660:8:2::1;::::0;;::::1;::::0;;;::::1;;11885:18:17::0;;;11878:34;-1:-1:-1;11768:18:17;5629:40:2::1;;;;;;;5553:3:::0;::::1;::::0;::::1;:::i;:::-;;;;5513:167;;5390:138:0::0;8506:10:2;8627:4;8650:19;;;:9;:19;;;;;;;;8487:57;;;;-1:-1:-1;;;8487:57:2;;10996:2:17;8487:57:2;;;10978:21:17;11035:2;11015:18;;;11008:30;-1:-1:-1;;;11054:18:17;;;11047:52;11116:18;;8487:57:2;10794:346:17;8487:57:2;5481:18:0::1;:40:::0;;-1:-1:-1;;5481:40:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;5390:138::o;5182:143:2:-;8506:10;8627:4;8650:19;;;:9;:19;;;;;;;;8487:57;;;;-1:-1:-1;;;8487:57:2;;10996:2:17;8487:57:2;;;10978:21:17;11035:2;11015:18;;;11008:30;-1:-1:-1;;;11054:18:17;;;11047:52;11116:18;;8487:57:2;10794:346:17;8487:57:2;5255:11:::1;:21:::0;;;5291:27:::1;::::0;1507:25:17;;;5291:27:2::1;::::0;1495:2:17;1480:18;5291:27:2::1;1361:177:17::0;2722:325:2;1680:1:11;2259:7;;:19;;2251:63;;;;-1:-1:-1;;;2251:63:11;;12891:2:17;2251:63:11;;;12873:21:17;12930:2;12910:18;;;12903:30;12969:33;12949:18;;;12942:61;13020:18;;2251:63:11;12689:355:17;2251:63:11;1680:1;2389:7;:18;1111:7:10;;;;1354:9:::1;1346:38;;;::::0;-1:-1:-1;;;1346:38:10;;13251:2:17;1346:38:10::1;::::0;::::1;13233:21:17::0;13290:2;13270:18;;;13263:30;-1:-1:-1;;;13309:18:17;;;13302:46;13365:18;;1346:38:10::1;13049:340:17::0;1346:38:10::1;-1:-1:-1::0;;;;;2841:14:2;::::2;;::::0;;;:6:::2;:14;::::0;;;;;2831:24;::::2;2823:53;;;::::0;-1:-1:-1;;;2823:53:2;;15475:2:17;2823:53:2::2;::::0;::::2;15457:21:17::0;15514:2;15494:18;;;15487:30;-1:-1:-1;;;15533:18:17;;;15526:46;15589:18;;2823:53:2::2;15273:340:17::0;2823:53:2::2;2886:6;:11:::0;;2896:1:::2;::::0;2886:6;::::2;::::0;:11:::2;::::0;2896:1;;2886:11:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;2907:67;2939:10;2959:4;2966:7;2914:6;-1:-1:-1::0;;;;;2907:31:2::2;;;:67;;;;;;:::i;:::-;3004:6;::::0;2989:51:::2;::::0;;3004:6:::2;::::0;;::::2;16088:50:17::0;;3012:10:2::2;16230:2:17::0;16215:18;;16208:43;-1:-1:-1;;;;;16287:15:17;;16267:18;;;16260:43;16334:2;16319:18;;16312:34;;;2989:51:2;::::2;::::0;;;;16075:3:17;2989:51:2;;::::2;-1:-1:-1::0;;1637:1:11;2562:7;:22;2722:325:2:o;1114:409:3:-;1303:9;1342:8;;1352:7;;1325:35;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1315:46;;;;;;1303:58;;1389:1;1379:6;;:11;1371:48;;;;-1:-1:-1;;;1371:48:3;;17765:2:17;1371:48:3;;;17747:21:17;17804:2;17784:18;;;17777:30;17843:26;17823:18;;;17816:54;17887:18;;1371:48:3;17563:348:17;1371:48:3;1449:15;;;;;;;;;;5240:58:16;;;29557:66:17;5240:58:16;;;29545:79:17;29640:12;;;;29633:28;;;;5240:58:16;;;;;;;;;;29677:12:17;;5240:58:16;;5230:69;;;;;1429:87:3;;1491:5;;1498:8;;1508:7;;1429:19;:87::i;:::-;1293:230;1114:409;;;;;;;:::o;864:95:1:-;1019:7:9;1045:6;-1:-1:-1;;;;;1045:6:9;665:10:15;1185:23:9;1177:68;;;;-1:-1:-1;;;1177:68:9;;12397:2:17;1177:68:9;;;12379:21:17;;;12416:18;;;12409:30;-1:-1:-1;;;;;;;;;;;12455:18:17;;;12448:62;12527:18;;1177:68:9;12195:356:17;1177:68:9;930:22:1::1;944:7;930:13;:22::i;965:75::-:0;1008:25;1022:10;1008:13;:25::i;3053:431:2:-;1680:1:11;2259:7;;:19;;2251:63;;;;-1:-1:-1;;;2251:63:11;;12891:2:17;2251:63:11;;;12873:21:17;12930:2;12910:18;;;12903:30;12969:33;12949:18;;;12942:61;13020:18;;2251:63:11;12689:355:17;2251:63:11;1680:1;2389:7;:18;1111:7:10;;;;1354:9:::1;1346:38;;;::::0;-1:-1:-1;;;1346:38:10;;13251:2:17;1346:38:10::1;::::0;::::1;13233:21:17::0;13290:2;13270:18;;;13263:30;-1:-1:-1;;;13309:18:17;;;13302:46;13365:18;;1346:38:10::1;13049:340:17::0;1346:38:10::1;3173:7:2::2;3160:9;:20;3152:48;;;::::0;-1:-1:-1;;;3152:48:2;;13596:2:17;3152:48:2::2;::::0;::::2;13578:21:17::0;13635:2;13615:18;;;13608:30;-1:-1:-1;;;13654:18:17;;;13647:45;13709:18;;3152:48:2::2;13394:339:17::0;3152:48:2::2;3218:10;::::0;-1:-1:-1;;;;;3218:10:2::2;3210:56;;;::::0;-1:-1:-1;;;3210:56:2;;13940:2:17;3210:56:2::2;::::0;::::2;13922:21:17::0;13979:2;13959:18;;;13952:30;14018:21;13998:18;;;13991:49;14057:18;;3210:56:2::2;13738:343:17::0;3210:56:2::2;3301:10;::::0;-1:-1:-1;;;;;3301:10:2::2;3294:18;::::0;;;:6:::2;:18;::::0;;;;;3284:28;::::2;3276:57;;;::::0;-1:-1:-1;;;3276:57:2;;15475:2:17;3276:57:2::2;::::0;::::2;15457:21:17::0;15514:2;15494:18;;;15487:30;-1:-1:-1;;;15533:18:17;;;15526:46;15589:18;;3276:57:2::2;15273:340:17::0;3276:57:2::2;3343:6;:11:::0;;3353:1:::2;::::0;3343:6;::::2;::::0;:11:::2;::::0;3353:1;;3343:11:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;3370:10;;;;;;;;;-1:-1:-1::0;;;;;3370:10:2::2;-1:-1:-1::0;;;;;3364:25:2::2;;3397:7;3364:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;3437:6:2::2;::::0;3457:10:::2;::::0;3422:55:::2;::::0;;3437:6:::2;::::0;;::::2;16088:50:17::0;;3445:10:2::2;16230:2:17::0;16215:18;;16208:43;-1:-1:-1;;;;;3457:10:2;;::::2;16267:18:17::0;;;16260:43;16334:2;16319:18;;16312:34;;;3422:55:2::2;::::0;-1:-1:-1;16075:3:17;16060:19;;-1:-1:-1;3422:55:2::2;::::0;-1:-1:-1;15859:493:17;3422:55:2::2;;;;;;;;-1:-1:-1::0;1637:1:11;2562:7;:22;3053:431:2:o;1605:92:9:-;1019:7;1045:6;-1:-1:-1;;;;;1045:6:9;665:10:15;1185:23:9;1177:68;;;;-1:-1:-1;;;1177:68:9;;12397:2:17;1177:68:9;;;12379:21:17;;;12416:18;;;12409:30;-1:-1:-1;;;;;;;;;;;12455:18:17;;;12448:62;12527:18;;1177:68:9;12195:356:17;1177:68:9;1669:21:::1;1687:1;1669:9;:21::i;769:89:1:-:0;1019:7:9;1045:6;-1:-1:-1;;;;;1045:6:9;665:10:15;1185:23:9;1177:68;;;;-1:-1:-1;;;1177:68:9;;12397:2:17;1177:68:9;;;12379:21:17;;;12416:18;;;12409:30;-1:-1:-1;;;;;;;;;;;12455:18:17;;;12448:62;12527:18;;1177:68:9;12195:356:17;1177:68:9;832:19:1::1;843:7;832:10;:19::i;525:60::-:0;465:10;717:4;740:16;;;:7;:16;;;;;;;;448:53;;;;-1:-1:-1;;;448:53:1;;15126:2:17;448:53:1;;;15108:21:17;15165:2;15145:18;;;15138:30;15204:22;15184:18;;;15177:50;15244:18;;448:53:1;14924:344:17;448:53:1;570:8:::1;:6;:8::i;5037:347:0:-:0;8506:10:2;8627:4;8650:19;;;:9;:19;;;;;;;;8487:57;;;;-1:-1:-1;;;8487:57:2;;10996:2:17;8487:57:2;;;10978:21:17;11035:2;11015:18;;;11008:30;-1:-1:-1;;;11054:18:17;;;11047:52;11116:18;;8487:57:2;10794:346:17;8487:57:2;5154:33:0;;::::1;5146:61;;;::::0;-1:-1:-1;;;5146:61:0;;11347:2:17;5146:61:0::1;::::0;::::1;11329:21:17::0;11386:2;11366:18;;;11359:30;-1:-1:-1;;;11405:18:17;;;11398:45;11460:18;;5146:61:0::1;11145:339:17::0;5146:61:0::1;5222:9;5217:161;5237:18:::0;;::::1;5217:161;;;5298:8;;5307:1;5298:11;;;;;;;:::i;:::-;;;;;;;5276:7;:19;5284:7;;5292:1;5284:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;5276:19:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;5276:19:0;:33;5328:39:::1;5343:7:::0;;5351:1;5343:10;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;5355:8;;5364:1;5355:11;;;;;;;:::i;:::-;5328:39;::::0;;-1:-1:-1;;;;;11813:55:17;;;11795:74;;5355:11:0::1;::::0;;::::1;::::0;;;::::1;;11885:18:17::0;;;11878:34;-1:-1:-1;11768:18:17;5328:39:0::1;;;;;;;5257:3:::0;::::1;::::0;::::1;:::i;:::-;;;;5217:161;;8682:94:2::0;1019:7:9;1045:6;-1:-1:-1;;;;;1045:6:9;665:10:15;1185:23:9;1177:68;;;;-1:-1:-1;;;1177:68:9;;12397:2:17;1177:68:9;;;12379:21:17;;;12416:18;;;12409:30;-1:-1:-1;;;;;;;;;;;12455:18:17;;;12448:62;12527:18;;1177:68:9;12195:356:17;1177:68:9;8747:22:2::1;8760:8;8747:12;:22::i;4679:497::-:0;1111:7:10;;;;1354:9;1346:38;;;;-1:-1:-1;;;1346:38:10;;13251:2:17;1346:38:10;;;13233:21:17;13290:2;13270:18;;;13263:30;-1:-1:-1;;;13309:18:17;;;13302:46;13365:18;;1346:38:10;13049:340:17;1346:38:10;4756:31:2::1;4790:20:::0;;;:16:::1;:20;::::0;;;;;;;;4756:54;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;4756:54:2;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;;::::1;::::0;;;;;;;4820:53:::1;;;::::0;-1:-1:-1;;;4820:53:2;;18118:2:17;4820:53:2::1;::::0;::::1;18100:21:17::0;18157:2;18137:18;;;18130:30;18196:20;18176:18;;;18169:48;18234:18;;4820:53:2::1;17916:342:17::0;4820:53:2::1;4930:11;;4909:8;:18;;;:32;;;;:::i;:::-;4891:15;:50;4883:84;;;::::0;-1:-1:-1;;;4883:84:2;;18465:2:17;4883:84:2::1;::::0;::::1;18447:21:17::0;18504:2;18484:18;;;18477:30;18543:23;18523:18;;;18516:51;18584:18;;4883:84:2::1;18263:345:17::0;4883:84:2::1;4984:20;::::0;;;:16:::1;:20;::::0;;;;;;;4977:27;;-1:-1:-1;;;;;;4977:27:2;;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;;;5024:17;;5043:14;;::::1;::::0;5059:15;;::::1;::::0;5014:61:::1;::::0;5043:14;5014:9:::1;:61::i;:::-;5090:79;5114:2;5118:8;:17;;;5137:8;:14;;;5153:8;:15;;;5090:79;;;;;;;;18844:25:17::0;;;-1:-1:-1;;;;;18966:15:17;;;18961:2;18946:18;;18939:43;19018:15;;19013:2;18998:18;;18991:43;19065:2;19050:18;;19043:34;18831:3;18816:19;;18613:470;5090:79:2::1;;;;;;;;4746:430;4679:497:::0;:::o;8361:86::-;1019:7:9;1045:6;-1:-1:-1;;;;;1045:6:9;665:10:15;1185:23:9;1177:68;;;;-1:-1:-1;;;1177:68:9;;12397:2:17;1177:68:9;;;12379:21:17;;;12416:18;;;12409:30;-1:-1:-1;;;;;;;;;;;12455:18:17;;;12448:62;12527:18;;1177:68:9;12195:356:17;1177:68:9;8422:10:2::1;:18:::0;;-1:-1:-1;;;;;;8422:18:2::1;-1:-1:-1::0;;;;;8422:18:2;;;::::1;::::0;;;::::1;::::0;;8361:86::o;3490:1183::-;1111:7:10;;;;1354:9;1346:38;;;;-1:-1:-1;;;1346:38:10;;13251:2:17;1346:38:10;;;13233:21:17;13290:2;13270:18;;;13263:30;-1:-1:-1;;;13309:18:17;;;13302:46;13365:18;;1346:38:10;13049:340:17;1346:38:10;3683:14:2::1;3727:13;3750:4;3710:61;;;;;;;;19346:19:17::0;;;19403:2;19399:15;-1:-1:-1;;19395:53:17;19390:2;19381:12;;19374:75;19479:13;19474:2;19465:12;;19458:35;19518:2;19509:12;;19088:439;3710:61:2::1;;;;;;;;;;;;;3700:72;;;;;;3683:89;;3782:70;3810:6;3818;;3793:32;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3827:5;;3834:8;;3844:7;;3782:10;:70::i;:::-;3896:31;3930:29;3952:6;;3930:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;3930:21:2::1;::::0;-1:-1:-1;;;3930:29:2:i:1;:::-;3896:63;;3969:12;4024:5;:13;;;4039:5;:12;;;4053:5;:14;;;4069:5;:11;;;4082:5;:12;;;4007:88;;;;;;;;;;;20224:3:17::0;20220:16;;;-1:-1:-1;;;;;;20216:25:17;;;20204:38;;20275:16;;;;20271:25;;;20267:1;20258:11;;20251:46;20385:2;20381:15;;;-1:-1:-1;;20377:24:17;;;20372:2;20363:12;;20356:46;20436:15;;20432:24;20427:2;20418:12;;20411:46;20482:2;20473:12;;20466:28;20519:2;20510:12;;19882:646;4007:88:2::1;;::::0;;-1:-1:-1;;4007:88:2;;::::1;::::0;;;;;;3984:121;;4007:88:::1;3984:121:::0;;::::1;::::0;4123:15:::1;::::0;;;:9:::1;:15:::0;;;;;;3984:121;;-1:-1:-1;4123:15:2::1;;:24;4115:63;;;::::0;-1:-1:-1;;;4115:63:2;;20735:2:17;4115:63:2::1;::::0;::::1;20717:21:17::0;20774:2;20754:18;;;20747:30;20813:28;20793:18;;;20786:56;20859:18;;4115:63:2::1;20533:350:17::0;4115:63:2::1;4188:15;::::0;;;:9:::1;:15;::::0;;;;:22;;-1:-1:-1;;4188:22:2::1;4206:4;4188:22;::::0;;4233:11:::1;::::0;::::1;::::0;4246:12:::1;::::0;::::1;::::0;4220:39:::1;::::0;4233:11;4220:12:::1;:39::i;:::-;4310:11;::::0;::::1;::::0;-1:-1:-1;;;;;4294:28:2::1;4269:22;4294:28:::0;;;:15:::1;:28;::::0;;;;;4336:18;;;;;:51:::1;;;4373:14;4358:5;:12;;;:29;4336:51;4332:232;;;4403:67;4422:4;4428:5;:14;;;4444:5;:11;;;4457:5;:12;;;4403:18;:67::i;:::-;4332:232;;;4501:52;4511:5;:14;;;4527:5;:11;;;4540:5;:12;;;4501:9;:52::i;:::-;4578:88;4591:4;4597:5;:12;;;4611:5;:14;;;4627:5;:11;;;4640:5;:12;;;4654:5;:11;;;4578:88;;;;;;;;;;21173:25:17::0;;;21246:18;21234:31;;;;21229:2;21214:18;;21207:59;-1:-1:-1;;;;;21363:15:17;;;21358:2;21343:18;;21336:43;21415:15;;21410:2;21395:18;;21388:43;21462:3;21447:19;;21440:35;21506:3;21491:19;;21484:35;21160:3;21145:19;;20888:637;4578:88:2::1;;;;;;;;3673:1000;;;;3490:1183:::0;;;;;;;;:::o;1190:536:0:-;1680:1:11;2259:7;;:19;;2251:63;;;;-1:-1:-1;;;2251:63:11;;12891:2:17;2251:63:11;;;12873:21:17;12930:2;12910:18;;;12903:30;12969:33;12949:18;;;12942:61;13020:18;;2251:63:11;12689:355:17;2251:63:11;1680:1;2389:7;:18;1111:7:10;;;;1354:9:::1;1346:38;;;::::0;-1:-1:-1;;;1346:38:10;;13251:2:17;1346:38:10::1;::::0;::::1;13233:21:17::0;13290:2;13270:18;;;13263:30;-1:-1:-1;;;13309:18:17;;;13302:46;13365:18;;1346:38:10::1;13049:340:17::0;1346:38:10::1;1447:18:0::2;1468:68;1474:9;1485:6;1493:7;1502:11;1515:6;1523:12;1468:5;:68::i;:::-;1447:89:::0;-1:-1:-1;1546:67:0::2;-1:-1:-1::0;;;;;1546:31:0;::::2;1578:10;1598:4;1605:7:::0;1546:31:::2;:67::i;:::-;1628:91;::::0;;14423:25:17;;;1645:10:0::2;14540:2:17::0;14525:18;;14518:43;-1:-1:-1;;;;;14597:15:17;;;14577:18;;;14570:43;14649:15;;14644:2;14629:18;;14622:43;14696:3;14681:19;;14674:35;;;14728:18;14783:15;;;14777:3;14762:19;;14755:44;14836:15;;14830:3;14815:19;;14808:44;14901:10;14889:23;;14883:3;14868:19;;14861:52;1628:91:0;;::::2;::::0;;;;14410:3:17;1628:91:0;;::::2;-1:-1:-1::0;;1637:1:11;2562:7;:22;-1:-1:-1;;;;;1190:536:0:o;2840:247:3:-;1019:7:9;1045:6;-1:-1:-1;;;;;1045:6:9;665:10:15;1185:23:9;1177:68;;;;-1:-1:-1;;;1177:68:9;;12397:2:17;1177:68:9;;;12379:21:17;;;12416:18;;;12409:30;-1:-1:-1;;;;;;;;;;;12455:18:17;;;12448:62;12527:18;;1177:68:9;12195:356:17;1177:68:9;2974:9:3::1;;2956:15;:27;2948:60;;;::::0;-1:-1:-1;;;2948:60:3;;21732:2:17;2948:60:3::1;::::0;::::1;21714:21:17::0;21771:2;21751:18;;;21744:30;21810:22;21790:18;;;21783:50;21850:18;;2948:60:3::1;21530:344:17::0;2948:60:3::1;-1:-1:-1::0;;3018:9:3::1;:19:::0;3047:33:::1;3062:8:::0;;3072:7;;3047:14:::1;:33::i;:::-;2840:247:::0;;;;:::o;1854:886::-;2213:11;;2198:12;:26;2190:69;;;;-1:-1:-1;;;2190:69:3;;22081:2:17;2190:69:3;;;22063:21:17;22120:2;22100:18;;;22093:30;22159:32;22139:18;;;22132:60;22209:18;;2190:69:3;21879:354:17;2190:69:3;2378:22;:15;2396:4;2378:22;:::i;:::-;2363:12;:37;2355:75;;;;-1:-1:-1;;;2355:75:3;;22440:2:17;2355:75:3;;;22422:21:17;22479:2;22459:18;;;22452:30;22518:27;22498:18;;;22491:55;22563:18;;2355:75:3;22238:349:17;2355:75:3;2440:14;2484:13;2507:4;2467:63;;;;;;;;22850:19:17;;;22907:2;22903:15;-1:-1:-1;;22899:53:17;22894:2;22885:12;;22878:75;22983:15;22978:2;22969:12;;22962:37;23024:2;23015:12;;22592:441;2467:63:3;;;;;;;;;;;;;2457:74;;;;;;2440:91;;2541:107;2569:6;2577:12;2591:11;;2604:10;;2552:63;;;;;;;;;;;;;:::i;2541:107::-;2658:39;2673:11;;2686:10;;2658:14;:39::i;:::-;-1:-1:-1;;;2707:11:3;:26;;;;-1:-1:-1;;;;;;;;1854:886:3:o;3176:1502:0:-;1111:7:10;;;;1354:9;1346:38;;;;-1:-1:-1;;;1346:38:10;;13251:2:17;1346:38:10;;;13233:21:17;13290:2;13270:18;;;13263:30;-1:-1:-1;;;13309:18:17;;;13302:46;13365:18;;1346:38:10;13049:340:17;1346:38:10;3373:14:0::1;3417:13;3440:4;3400:55;;;;;;;;23834:19:17::0;;;23891:2;23887:15;-1:-1:-1;;23883:53:17;23878:2;23869:12;;23862:75;23967:7;23962:2;23953:12;;23946:29;24000:2;23991:12;;23576:433;3400:55:0::1;;;;;;;;;;;;;3390:66;;;;;;3373:83;;3466:77;3494:6;3502:13;;3477:39;;;;;;;;;;:::i;3466:77::-;3553:29;3585:32;3603:13;;3585:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;3585:17:0::1;::::0;-1:-1:-1;;;3585:32:0:i:1;:::-;3705:14:::0;;3737:16:::1;::::0;;::::1;::::0;3771:13:::1;::::0;;::::1;::::0;3802:14:::1;::::0;;::::1;::::0;3834:18:::1;::::0;::::1;::::0;3870::::1;::::0;::::1;::::0;3906:21:::1;::::0;;::::1;::::0;3671:270;;24373:15:17;;;-1:-1:-1;;24369:24:17;;;3671:270:0;;::::1;24357:37:17::0;24428:15;;;24424:24;;24410:12;;;24403:46;24483:15;;;;24479:24;;;24465:12;;;24458:46;24520:12;;;24513:28;;;;24660:16;;-1:-1:-1;;;;;;24656:25:17;;;24642:12;;;24635:47;24717:16;;;24713:25;;;24698:13;;;24691:48;24755:13;;;;24748:29;;;;3671:270:0;;;;;;;;;;24793:13:17;;;;3671:270:0;;3648:303;;;;::::1;::::0;-1:-1:-1;3969:21:0;;;:9:::1;:21:::0;;;;;;;3705:14;;-1:-1:-1;3648:303:0;3969:21:::1;;:30;3961:58;;;::::0;-1:-1:-1;;;3961:58:0;;25019:2:17;3961:58:0::1;::::0;::::1;25001:21:17::0;25058:2;25038:18;;;25031:30;-1:-1:-1;;;25077:18:17;;;25070:45;25132:18;;3961:58:0::1;24817:339:17::0;3961:58:0::1;4029:21;::::0;;;:9:::1;:21;::::0;;;;;;:28;;-1:-1:-1;;4029:28:0::1;4053:4;4029:28;::::0;;4080:13;::::1;::::0;4095:14:::1;::::0;::::1;::::0;4067:43:::1;::::0;4080:13;4067:12:::1;:43::i;:::-;4161:13;::::0;;::::1;::::0;-1:-1:-1;;;;;4145:30:0::1;4120:22;4145:30:::0;;;:15:::1;:30;::::0;;;4189:18;;;;;:53:::1;;;4228:14;4211:7;:14;;;:31;4189:53;4185:252;;;4258:79;4277:10;4289:7;:16;;;4307:7;:13;;;4322:7;:14;;;4258:18;:79::i;:::-;4185:252;;;4368:58;4378:7;:16;;;4396:7;:13;;;4411:7;:14;;;4368:9;:58::i;:::-;4452:219;4471:10;4495:7;:14;;;4523:7;:16;;;4553:7;:13;;;4580:7;:14;;;4608:7;:18;;;4640:7;:21;;;4452:219;;;;;;;;;;;25474:25:17::0;;;-1:-1:-1;;;;;25596:15:17;;;25591:2;25576:18;;25569:43;25648:15;;;25643:2;25628:18;;25621:43;25700:15;;;;25695:2;25680:18;;25673:43;25747:3;25732:19;;25725:35;;;;25809:18;25797:31;;;;25791:3;25776:19;;25769:60;25860:3;25845:19;;25838:35;25461:3;25446:19;;25161:718;6229:344:2;8506:10;8627:4;8650:19;;;:9;:19;;;;;;;;8487:57;;;;-1:-1:-1;;;8487:57:2;;10996:2:17;8487:57:2;;;10978:21:17;11035:2;11015:18;;;11008:30;-1:-1:-1;;;11054:18:17;;;11047:52;11116:18;;8487:57:2;10794:346:17;8487:57:2;6345:33;;::::1;6337:61;;;::::0;-1:-1:-1;;;6337:61:2;;11347:2:17;6337:61:2::1;::::0;::::1;11329:21:17::0;11386:2;11366:18;;;11359:30;-1:-1:-1;;;11405:18:17;;;11398:45;11460:18;;6337:61:2::1;11145:339:17::0;6337:61:2::1;6413:9;6408:159;6428:18:::0;;::::1;6408:159;;;6488:8;;6497:1;6488:11;;;;;;;:::i;:::-;;;;;;;6467:6;:18;6474:7;;6482:1;6474:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;6467:18:2::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;6467:18:2;:32;6518:38:::1;6532:7:::0;;6540:1;6532:10;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;6544:8;;6553:1;6544:11;;;;;;;:::i;:::-;6518:38;::::0;;-1:-1:-1;;;;;11813:55:17;;;11795:74;;6544:11:2::1;::::0;;::::1;::::0;;;::::1;;11885:18:17::0;;;11878:34;-1:-1:-1;11768:18:17;6518:38:2::1;;;;;;;6448:3:::0;::::1;::::0;::::1;:::i;:::-;;;;6408:159;;8888:78:::0;8932:27;8948:10;8932:15;:27::i;3250:182:3:-;1019:7:9;1045:6;-1:-1:-1;;;;;1045:6:9;665:10:15;1185:23:9;1177:68;;;;-1:-1:-1;;;1177:68:9;;12397:2:17;1177:68:9;;;12379:21:17;;;12416:18;;;12409:30;-1:-1:-1;;;;;;;;;;;12455:18:17;;;12448:62;12527:18;;1177:68:9;12195:356:17;1177:68:9;3342:12:3::1;;3333:6;:21;3325:69;;;::::0;-1:-1:-1;;;3325:69:3;;26086:2:17;3325:69:3::1;::::0;::::1;26068:21:17::0;26125:2;26105:18;;;26098:30;26164:34;26144:18;;;26137:62;-1:-1:-1;;;26215:18:17;;;26208:33;26258:19;;3325:69:3::1;25884:399:17::0;3325:69:3::1;3404:12;:21:::0;3250:182::o;1846:189:9:-;1019:7;1045:6;-1:-1:-1;;;;;1045:6:9;665:10:15;1185:23:9;1177:68;;;;-1:-1:-1;;;1177:68:9;;12397:2:17;1177:68:9;;;12379:21:17;;;12416:18;;;12409:30;-1:-1:-1;;;;;;;;;;;12455:18:17;;;12448:62;12527:18;;1177:68:9;12195:356:17;1177:68:9;-1:-1:-1;;;;;1934:22:9;::::1;1926:73;;;::::0;-1:-1:-1;;;1926:73:9;;26490:2:17;1926:73:9::1;::::0;::::1;26472:21:17::0;26529:2;26509:18;;;26502:30;26568:34;26548:18;;;26541:62;26639:8;26619:18;;;26612:36;26665:19;;1926:73:9::1;26288:402:17::0;1926:73:9::1;2009:19;2019:8;2009:9;:19::i;2337:833:0:-:0;-1:-1:-1;;;;;2568:15:0;;2531:7;2568:15;;;:7;:15;;;;;;2558:25;;2550:54;;;;-1:-1:-1;;;2550:54:0;;15475:2:17;2550:54:0;;;15457:21:17;15514:2;15494:18;;;15487:30;-1:-1:-1;;;15533:18:17;;;15526:46;15589:18;;2550:54:0;15273:340:17;2550:54:0;-1:-1:-1;;;;;2622:15:0;;;;;;:7;:15;;;;;;:20;;:50;;-1:-1:-1;;;;;;2657:15:0;;;;;;:7;:15;;;;;;2646:26;;;2622:50;2614:79;;;;-1:-1:-1;;;2614:79:0;;26897:2:17;2614:79:0;;;26879:21:17;26936:2;26916:18;;;26909:30;26975:18;26955;;;26948:46;27011:18;;2614:79:0;26695:340:17;2614:79:0;2726:18;;;;;;2711:33;;;;2703:68;;;;-1:-1:-1;;;2703:68:0;;27242:2:17;2703:68:0;;;27224:21:17;27281:2;27261:18;;;27254:30;27320:24;27300:18;;;27293:52;27362:18;;2703:68:0;27040:346:17;2703:68:0;2920:100;;-1:-1:-1;;2937:10:0;27752:2:17;27748:15;;;27744:24;;2920:100:0;;;27732:37:17;27803:15;;;27799:24;;27785:12;;;27778:46;27858:15;;;27854:24;27840:12;;;27833:46;27895:12;;;27888:28;;;-1:-1:-1;;;;;;28039:3:17;28035:16;;;28031:25;;28017:12;;;28010:47;28092:16;;;28088:25;;28073:13;;;28066:48;3005:13:0;28149:16:17;;28145:25;28130:13;;;28123:48;2781:18:0;;28187:13:17;;2920:100:0;;;-1:-1:-1;;2920:100:0;;;;;;;;;2802:228;;2920:100;2802:228;;;;3048:21;;;;:9;:21;;;;;;2802:228;;-1:-1:-1;3048:21:0;;:30;3040:58;;;;-1:-1:-1;;;3040:58:0;;25019:2:17;3040:58:0;;;25001:21:17;25058:2;25038:18;;;25031:30;-1:-1:-1;;;25077:18:17;;;25070:45;25132:18;;3040:58:0;24817:339:17;3040:58:0;3108:21;;;;:9;:21;;;;;:28;;-1:-1:-1;;3108:28:0;3132:4;3108:28;;;3118:10;-1:-1:-1;2337:833:0;;;;;;;;:::o;2053:117:10:-;1111:7;;;;1612:41;;;;-1:-1:-1;;;1612:41:10;;28413:2:17;1612:41:10;;;28395:21:17;28452:2;28432:18;;;28425:30;28491:22;28471:18;;;28464:50;28531:18;;1612:41:10;28211:344:17;1612:41:10;2111:7:::1;:15:::0;;-1:-1:-1;;2111:15:10::1;::::0;;2141:22:::1;665:10:15::0;2150:12:10::1;2141:22;::::0;-1:-1:-1;;;;;3482:55:17;;;3464:74;;3452:2;3437:18;2141:22:10::1;3318:226:17::0;9178:201:2;-1:-1:-1;;;;;8650:19:2;;8627:4;8650:19;;;:9;:19;;;;;;;;9239:56;;;;-1:-1:-1;;;9239:56:2;;28762:2:17;9239:56:2;;;28744:21:17;28801:2;28781:18;;;28774:30;28840:25;28820:18;;;28813:53;28883:18;;9239:56:2;28560:347:17;9239:56:2;-1:-1:-1;;;;;9305:19:2;;9327:5;9305:19;;;:9;:19;;;;;;;;;:27;;-1:-1:-1;;9305:27:2;;;9347:25;;3464:74:17;;;9347:25:2;;3437:18:17;9347:25:2;3318:226:17;845:241:13;1010:68;;-1:-1:-1;;;;;29193:15:17;;;1010:68:13;;;29175:34:17;29245:15;;29225:18;;;29218:43;29277:18;;;29270:34;;;983:96:13;;1003:5;;-1:-1:-1;;;1033:27:13;29087:18:17;;1010:68:13;;;;-1:-1:-1;;1010:68:13;;;;;;;;;;;;;;;;;;;;;;;;;;;983:19;:96::i;3507:1307:3:-;3701:33;;;3693:81;;;;-1:-1:-1;;;3693:81:3;;29902:2:17;3693:81:3;;;29884:21:17;29941:2;29921:18;;;29914:30;29980:34;29960:18;;;29953:62;-1:-1:-1;;;30031:18:17;;;30024:33;30074:19;;3693:81:3;29700:399:17;3693:81:3;3784:18;;3839:95;3859:19;;;3839:95;;;3913:7;;3921:1;3913:10;;;;;;;:::i;:::-;;;;;;;3899:24;;;;;:::i;:::-;;-1:-1:-1;3880:3:3;;;;:::i;:::-;;;;3839:95;;;-1:-1:-1;3943:14:3;3979:1;3961:14;:10;3974:1;3961:14;:::i;:::-;3960:20;;;;:::i;:::-;:24;;3983:1;3960:24;:::i;:::-;3943:41;-1:-1:-1;3995:19:3;;;;4126:644;4146:16;;;4126:644;;;4183:14;4200:23;4214:5;;4220:1;4214:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;4200:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:13;;:23;;;;:::i;:::-;4183:40;;4254:4;-1:-1:-1;;;;;4245:13:3;:6;-1:-1:-1;;;;;4245:13:3;;4237:56;;;;-1:-1:-1;;;4237:56:3;;31227:2:17;4237:56:3;;;31209:21:17;31266:2;31246:18;;;31239:30;31305:32;31285:18;;;31278:60;31355:18;;4237:56:3;31025:354:17;4237:56:3;4314:6;4307:13;;4385:146;4401:8;;4410:5;4401:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;4392:24:3;:6;-1:-1:-1;;;;;4392:24:3;;4385:146;;;4436:10;4445:1;4436:10;;:::i;:::-;;-1:-1:-1;4472:23:3;;;4464:52;;;;-1:-1:-1;;;4464:52:3;;31586:2:17;4464:52:3;;;31568:21:17;31625:2;31605:18;;;31598:30;31664:18;31644;;;31637:46;31700:18;;4464:52:3;31384:340:17;4464:52:3;4385:146;;;4558:8;;4567:5;4558:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;4548:25:3;:6;-1:-1:-1;;;;;4548:25:3;;4544:93;;;4608:7;;4616:5;4608:14;;;;;;;:::i;:::-;;;;;;;4593:29;;;;;:::i;:::-;;;4544:93;4669:6;4654:11;:21;4650:110;;4739:7;;;;;;;;;4650:110;-1:-1:-1;4164:3:3;;;;:::i;:::-;;;;4126:644;;;-1:-1:-1;4779:28:3;;-1:-1:-1;;;4779:28:3;;31931:2:17;4779:28:3;;;31913:21:17;31970:2;31950:18;;;31943:30;32009:20;31989:18;;;31982:48;32047:18;;4779:28:3;31729:342:17;3507:1307:3;;;;;;;;:::o;1238:187:1:-;-1:-1:-1;;;;;740:16:1;;717:4;740:16;;;:7;:16;;;;;;;;1296:51;;;;-1:-1:-1;;;1296:51:1;;32278:2:17;1296:51:1;;;32260:21:17;32317:2;32297:18;;;32290:30;32356:23;32336:18;;;32329:51;32397:18;;1296:51:1;32076:345:17;1296:51:1;-1:-1:-1;;;;;1357:16:1;;1376:5;1357:16;;;:7;:16;;;;;;;;;:24;;-1:-1:-1;;1357:24:1;;;1396:22;;3464:74:17;;;1396:22:1;;3437:18:17;1396:22:1;3318:226:17;2041:169:9;2096:16;2115:6;;-1:-1:-1;;;;;2131:17:9;;;-1:-1:-1;;;;;;2131:17:9;;;;;;2163:40;;2115:6;;;;;;;2163:40;;2096:16;2163:40;2086:124;2041:169;:::o;1046:186:1:-;-1:-1:-1;;;;;740:16:1;;717:4;740:16;;;:7;:16;;;;;;;;1109:18;1101:56;;;;-1:-1:-1;;;1101:56:1;;32628:2:17;1101:56:1;;;32610:21:17;32667:2;32647:18;;;32640:30;32706:27;32686:18;;;32679:55;32751:18;;1101:56:1;32426:349:17;1101:56:1;-1:-1:-1;;;;;1167:16:1;;;;;;:7;:16;;;;;;;;;:23;;-1:-1:-1;;1167:23:1;1186:4;1167:23;;;1205:20;;3464:74:17;;;1205:20:1;;3437:18:17;1205:20:1;3318:226:17;1806:115:10;1111:7;;;;1354:9;1346:38;;;;-1:-1:-1;;;1346:38:10;;13251:2:17;1346:38:10;;;13233:21:17;13290:2;13270:18;;;13263:30;-1:-1:-1;;;13309:18:17;;;13302:46;13365:18;;1346:38:10;13049:340:17;1346:38:10;1865:7:::1;:14:::0;;-1:-1:-1;;1865:14:10::1;1875:4;1865:14;::::0;;1894:20:::1;1901:12;665:10:15::0;;586:96;8972:200:2;-1:-1:-1;;;;;8650:19:2;;8627:4;8650:19;;;:9;:19;;;;;;;;9038:21;9030:61;;;;-1:-1:-1;;;9030:61:2;;32982:2:17;9030:61:2;;;32964:21:17;33021:2;33001:18;;;32994:30;33060:29;33040:18;;;33033:57;33107:18;;9030:61:2;32780:351:17;9030:61:2;-1:-1:-1;;;;;9101:19:2;;;;;;:9;:19;;;;;;;;;:26;;-1:-1:-1;;9101:26:2;9123:4;9101:26;;;9142:23;;3464:74:17;;;9142:23:2;;3437:18:17;9142:23:2;3318:226:17;6579:481:2;6713:10;;-1:-1:-1;;;;;6703:20:2;;;6713:10;;6703:20;6699:355;;;6802:10;;6796:35;;-1:-1:-1;;;6796:35:2;;;;;1507:25:17;;;-1:-1:-1;;;;;6802:10:2;;;;6796:26;;1480:18:17;;6796:35:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6846:9;6861;-1:-1:-1;;;;;6861:14:2;6883:7;6897:5;6861:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6845:62;;;6929:4;6921:44;;;;-1:-1:-1;;;6921:44:2;;33548:2:17;6921:44:2;;;33530:21:17;33587:2;33567:18;;;33560:30;33626:29;33606:18;;;33599:57;33673:18;;6921:44:2;33346:351:17;6699:355:2;6996:47;-1:-1:-1;;;;;6996:27:2;;7024:9;7035:7;6996:27;:47::i;:::-;6579:481;;;:::o;535:981:8:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;566:11:6;;;-1:-1:-1;;;;730:780:8;741:5:6;;;;:12;731:7;;:22;730:780:8;;;780:12;:3;:10;:12::i;:::-;766:26;;-1:-1:-1;766:26:8;-1:-1:-1;884:3:8;891:1;884:8;880:591;;;931:15;:3;:13;:15::i;:::-;912:35;;;;730:780;;880:591;972:3;979:1;972:8;968:503;;;1018:15;:3;:13;:15::i;:::-;1000:34;;:8;;;:34;730:780;;968:503;1059:3;1066:1;1059:8;1055:416;;;1100:27;1112:14;:3;:12;:14::i;:::-;1100:11;:27::i;:::-;-1:-1:-1;;;;;1087:40:8;:10;;;:40;730:780;;1055:416;1152:3;1159:1;1152:8;1148:323;;;1190:27;1202:14;:3;:12;:14::i;1190:27::-;-1:-1:-1;;;;;1180:37:8;:7;;;:37;730:780;;1148:323;1242:3;1249:1;1242:8;1238:233;;;1281:27;1293:14;:3;:12;:14::i;:::-;1281:11;:27::i;:::-;1270:8;;;:38;730:780;;1238:233;1333:3;1340:1;1333:8;1329:142;;;1371:27;1383:14;:3;:12;:14::i;:::-;1371:11;:27::i;:::-;1361:7;;;:37;730:780;;1329:142;1437:19;:3;1451:4;1437:13;:19::i;:::-;730:780;;;622:894;;;535:981;;;:::o;7066:684:2:-;7144:11;;7140:53;;7066:684;;:::o;7140:53::-;-1:-1:-1;;;;;7216:23:2;;7202:11;7216:23;;;:15;:23;;;;;;7253:8;7249:45;;7277:7;7066:684;;:::o;7249:45::-;-1:-1:-1;;;;;7320:20:2;;7303:14;7320:20;;;:12;:20;;;;;;7448:11;;7320:20;;7370:15;;7421:23;7448:11;7370:15;7421:23;:::i;:::-;7420:39;;;;:::i;:::-;-1:-1:-1;;;;;7473:24:2;;;;;;:16;:24;;;;;;7395:64;;-1:-1:-1;7473:41:2;-1:-1:-1;7469:136:2;;;7539:7;7530:16;;7469:136;;;7577:17;7587:7;7577:17;;:::i;:::-;;;7469:136;7632:3;7622:6;:13;;7614:44;;;;-1:-1:-1;;;7614:44:2;;33904:2:17;7614:44:2;;;33886:21:17;33943:2;33923:18;;;33916:30;33982:20;33962:18;;;33955:48;34020:18;;7614:44:2;33702:342:17;7614:44:2;-1:-1:-1;;;;;;7668:20:2;;;;;;;:12;:20;;;;;;;;:29;;;;7707:16;:24;;;:36;;;;-1:-1:-1;;7066:684:2:o;7756:479::-;8036:153;;;;;;;;-1:-1:-1;;;;;8036:153:2;;;;;;;;;;;;;;;;;;;;;8163:15;8036:153;;;;;;-1:-1:-1;8013:20:2;;;:16;:20;;;;;;;:176;;;;;;;-1:-1:-1;;;;;;8013:176:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8204:24;;;;;8030:2;1507:25:17;;1495:2;1480:18;;1361:177;8204:24:2;;;;;;;;7756:479;;;;:::o;4820:512:3:-;4927:33;;;4919:81;;;;-1:-1:-1;;;4919:81:3;;29902:2:17;4919:81:3;;;29884:21:17;29941:2;29921:18;;;29914:30;29980:34;29960:18;;;29953:62;-1:-1:-1;;;30031:18:17;;;30024:33;30074:19;;4919:81:3;29700:399:17;4919:81:3;5010:12;5050:9;5045:168;5065:19;;;5045:168;;;5127:4;-1:-1:-1;;;;;5113:18:3;:8;;5122:1;5113:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;5113:18:3;;5105:65;;;;-1:-1:-1;;;5105:65:3;;34251:2:17;5105:65:3;;;34233:21:17;34290:2;34270:18;;;34263:30;34329:34;34309:18;;;34302:62;-1:-1:-1;;;34380:18:17;;;34373:32;34422:19;;5105:65:3;34049:398:17;5105:65:3;5191:8;;5200:1;5191:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;5184:18;-1:-1:-1;5086:3:3;;;;:::i;:::-;;;;5045:168;;;;5258:8;;5268:7;;5241:35;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;5241:35:3;;;;;;;;;;5231:46;;5241:35;5231:46;;;;5222:6;:55;5292:33;;;;5307:8;;;;5317:7;;;;5292:33;:::i;:::-;;;;;;;;4909:423;4820:512;;;;:::o;550:1075:7:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;566:11:6;;;-1:-1:-1;;;;733:886:7;741:5:6;;;;:12;731:7;;:22;733:886:7;;;783:12;:3;:10;:12::i;:::-;769:26;;-1:-1:-1;769:26:7;-1:-1:-1;887:3:7;894:1;887:8;883:697;;;926:27;938:14;:3;:12;:14::i;926:27::-;-1:-1:-1;;;;;915:38:7;;;733:886;;883:697;978:3;985:1;978:8;974:606;;;1019:27;1031:14;:3;:12;:14::i;1019:27::-;-1:-1:-1;;;;;1006:40:7;:10;;;:40;733:886;;974:606;1071:3;1078:1;1071:8;1067:513;;;1109:27;1121:14;:3;:12;:14::i;1109:27::-;-1:-1:-1;;;;;1099:37:7;:7;;;:37;733:886;;1067:513;1161:3;1168:1;1161:8;1157:423;;;1200:27;1212:14;:3;:12;:14::i;1200:27::-;1189:8;;;:38;733:886;;1157:423;1252:3;1259:1;1252:8;1248:332;;;1302:15;:3;:13;:15::i;:::-;1280:38;;:12;;;:38;733:886;;1248:332;1343:3;1350:1;1343:8;1339:241;;;1393:15;:3;:13;:15::i;:::-;1371:38;;:12;;;:38;733:886;;1339:241;1434:3;1441:1;1434:8;1430:150;;;1480:27;1492:14;:3;:12;:14::i;1480:27::-;1462:15;;;:45;733:886;;1430:150;1546:19;:3;1560:4;1546:13;:19::i;:::-;733:886;;3140:706:13;3559:23;3585:69;3613:4;3585:69;;;;;;;;;;;;;;;;;3593:5;-1:-1:-1;;;;;3585:27:13;;;:69;;;;;:::i;:::-;3668:17;;3559:95;;-1:-1:-1;3668:21:13;3664:176;;3763:10;3752:30;;;;;;;;;;;;:::i;:::-;3744:85;;;;-1:-1:-1;;;3744:85:13;;36044:2:17;3744:85:13;;;36026:21:17;36083:2;36063:18;;;36056:30;36122:34;36102:18;;;36095:62;36193:12;36173:18;;;36166:40;36223:19;;3744:85:13;35842:406:17;1288:1241:16;1366:7;1582:9;:16;1602:2;1582:22;1578:945;;;1871:4;1856:20;;1850:27;1920:4;1905:20;;1899:27;1977:4;1962:20;;1956:27;1620:9;1948:36;2018:22;2026:4;1948:36;1850:27;1899;2018:7;:22::i;:::-;2011:29;;;;;;;1578:945;2061:9;:16;2081:2;2061:22;2057:466;;;2330:4;2315:20;;2309:27;2380:4;2365:20;;2359:27;2420:20;2428:4;2309:27;2359;2420:7;:20::i;:::-;2413:27;;;;;;2057:466;2471:41;;-1:-1:-1;;;2471:41:16;;36455:2:17;2471:41:16;;;36437:21:17;36494:2;36474:18;;;36467:30;36533:33;36513:18;;;36506:61;36584:18;;2471:41:16;36253:355:17;2057:466:16;1288:1241;;;;:::o;634:205:13:-;773:58;;-1:-1:-1;;;;;11813:55:17;;773:58:13;;;11795:74:17;11885:18;;;11878:34;;;746:86:13;;766:5;;-1:-1:-1;;;796:23:13;11768:18:17;;773:58:13;11621:297:17;814:190:6;872:11;885:17;914:9;926:14;936:3;926:9;:14::i;:::-;914:26;-1:-1:-1;956:5:6;960:1;914:26;956:5;:::i;:::-;950:11;;991:1;995;991:5;982:15;;;;;;;;:::i;:::-;971:26;;904:100;814:190;;;:::o;1775:902::-;1959:5;;;;;2019:7;;2118:19;;;;;2112:26;1836:9;;;;2296:326;2320:2;2316:1;:6;2296:326;;;2375:12;;;;-1:-1:-1;2498:5:6;2380:1;2502;2498:5;:::i;:::-;2484:1;2488:4;2484:8;2483:21;;2478:26;;;;2522:1;2526:4;2522:8;2534:1;2522:13;2518:94;;;2566:5;:1;2570;2566:5;:::i;:::-;2555:16;;:3;;:16;;;;;:::i;:::-;;;-1:-1:-1;1775:902:6;;;-1:-1:-1;;;;;1775:902:6:o;2518:94::-;2324:3;;;;:::i;:::-;;;;2296:326;;;;2631:8;;;2735:679;2795:14;2821:11;2835:14;2845:3;2835:9;:14::i;:::-;2821:28;;2859:11;2883:3;2873;:7;;;:13;;;;:::i;:::-;2859:27;;2911:3;:5;;;:12;2904:3;:19;;2896:28;;;;;;2966:3;2956:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2956:14:6;-1:-1:-1;3000:5:6;;;;;3100:7;;2952:18;;-1:-1:-1;3000:5:6;3150:10;;;;3186:29;;;;2980:17;3234:151;3258:3;3254:1;:7;3234:151;;;3342:17;;;3336:24;3320:14;;;3313:48;3263:7;3268:2;3357:1;3263:7;:::i;:::-;;;3234:151;;;-1:-1:-1;;;3394:13:6;;-1:-1:-1;2735:679:6;;-1:-1:-1;2735:679:6:o;5121:107::-;5178:9;5203:18;5219:1;5203:15;:18::i;4796:319::-;4853:9;4894:2;4882:1;:8;:14;;4874:23;;;;;;4998:2;4995:1;4991:10;4985:17;4980:22;;5066:1;:8;5061:2;:13;;;;:::i;:::-;5056:19;;:1;:19;:::i;:::-;5050:26;;4796:319;-1:-1:-1;4796:319:6:o;5510:172::-;5567:9;5596:1;:8;5608:2;5596:14;5588:23;;;;;;-1:-1:-1;5662:2:6;5655:10;5649:17;;5510:172::o;4235:428::-;4324:15;4316:4;:23;;;;;;;;:::i;:::-;;4312:321;;;4355:14;4365:3;4355:9;:14::i;4312:321::-;4398:20;4390:4;:28;;;;;;;;:::i;:::-;;4386:247;;;4434:11;4448:14;4458:3;4448:9;:14::i;:::-;4434:28;;4487:3;4476;:7;;:14;;;;;;;:::i;:::-;;;-1:-1:-1;4552:5:6;;;;:12;4541:7;;:23;;4533:32;;;;;3461:223:14;3594:12;3625:52;3647:6;3655:4;3661:1;3664:12;3625:21;:52::i;:::-;3618:59;;3461:223;;;;;;:::o;3265:1486:16:-;3388:7;4316:66;4302:80;;;4281:161;;;;-1:-1:-1;;;4281:161:16;;37077:2:17;4281:161:16;;;37059:21:17;37116:2;37096:18;;;37089:30;37155:34;37135:18;;;37128:62;-1:-1:-1;;;37206:18:17;;;37199:32;37248:19;;4281:161:16;36875:398:17;4281:161:16;4460:1;:7;;4465:2;4460:7;:18;;;;4471:1;:7;;4476:2;4471:7;4460:18;4452:65;;;;-1:-1:-1;;;4452:65:16;;37480:2:17;4452:65:16;;;37462:21:17;37519:2;37499:18;;;37492:30;37558:34;37538:18;;;37531:62;-1:-1:-1;;;37609:18:17;;;37602:32;37651:19;;4452:65:16;37278:398:17;4452:65:16;4629:24;;;4612:14;4629:24;;;;;;;;;37908:25:17;;;37981:4;37969:17;;37949:18;;;37942:45;;;;38003:18;;;37996:34;;;38046:18;;;38039:34;;;4629:24:16;;37880:19:17;;4629:24:16;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4629:24:16;;-1:-1:-1;;4629:24:16;;;-1:-1:-1;;;;;;;4671:20:16;;4663:57;;;;-1:-1:-1;;;4663:57:16;;38286:2:17;4663:57:16;;;38268:21:17;38325:2;38305:18;;;38298:30;38364:26;38344:18;;;38337:54;38408:18;;4663:57:16;38084:348:17;4663:57:16;4738:6;3265:1486;-1:-1:-1;;;;;3265:1486:16:o;2780:359::-;2887:7;2978:66;2970:75;;3071:3;3067:12;;;3081:2;3063:21;3110:22;3118:4;3063:21;3127:1;2970:75;3110:7;:22::i;:::-;3103:29;2780:359;-1:-1:-1;;;;;;2780:359:16:o;5234:270:6:-;5298:17;5335:1;:8;5347:2;5335:14;5327:23;;;;;;-1:-1:-1;5454:2:6;5447:10;5441:17;5460:27;5437:51;;;5234:270::o;4548:500:14:-;4713:12;4770:5;4745:21;:30;;4737:81;;;;-1:-1:-1;;;4737:81:14;;38639:2:17;4737:81:14;;;38621:21:17;38678:2;38658:18;;;38651:30;38717:34;38697:18;;;38690:62;38788:8;38768:18;;;38761:36;38814:19;;4737:81:14;38437:402:17;4737:81:14;1034:20;;4828:60;;;;-1:-1:-1;;;4828:60:14;;39046:2:17;4828:60:14;;;39028:21:17;39085:2;39065:18;;;39058:30;39124:31;39104:18;;;39097:59;39173:18;;4828:60:14;38844:353:17;4828:60:14;4900:12;4914:23;4941:6;-1:-1:-1;;;;;4941:11:14;4960:5;4967:4;4941:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4899:73;;;;4989:52;5007:7;5016:10;5028:12;4989:17;:52::i;:::-;4982:59;4548:500;-1:-1:-1;;;;;;;4548:500:14:o;6950:692::-;7096:12;7124:7;7120:516;;;-1:-1:-1;7154:10:14;7147:17;;7120:516;7265:17;;:21;7261:365;;7459:10;7453:17;7519:15;7506:10;7502:2;7498:19;7491:44;7261:365;7598:12;7591:20;;-1:-1:-1;;;7591:20:14;;;;;;;;:::i;14:367:17:-;77:8;87:6;141:3;134:4;126:6;122:17;118:27;108:55;;159:1;156;149:12;108:55;-1:-1:-1;182:20:17;;225:18;214:30;;211:50;;;257:1;254;247:12;211:50;294:4;286:6;282:17;270:29;;354:3;347:4;337:6;334:1;330:14;322:6;318:27;314:38;311:47;308:67;;;371:1;368;361:12;308:67;14:367;;;;;:::o;386:773::-;508:6;516;524;532;585:2;573:9;564:7;560:23;556:32;553:52;;;601:1;598;591:12;553:52;641:9;628:23;670:18;711:2;703:6;700:14;697:34;;;727:1;724;717:12;697:34;766:70;828:7;819:6;808:9;804:22;766:70;:::i;:::-;855:8;;-1:-1:-1;740:96:17;-1:-1:-1;943:2:17;928:18;;915:32;;-1:-1:-1;959:16:17;;;956:36;;;988:1;985;978:12;956:36;;1027:72;1091:7;1080:8;1069:9;1065:24;1027:72;:::i;:::-;386:773;;;;-1:-1:-1;1118:8:17;-1:-1:-1;;;;386:773:17:o;1543:180::-;1602:6;1655:2;1643:9;1634:7;1630:23;1626:32;1623:52;;;1671:1;1668;1661:12;1623:52;-1:-1:-1;1694:23:17;;1543:180;-1:-1:-1;1543:180:17:o;2105:196::-;2173:20;;-1:-1:-1;;;;;2222:54:17;;2212:65;;2202:93;;2291:1;2288;2281:12;2202:93;2105:196;;;:::o;2306:171::-;2373:20;;2433:18;2422:30;;2412:41;;2402:69;;2467:1;2464;2457:12;2482:163;2549:20;;2609:10;2598:22;;2588:33;;2578:61;;2635:1;2632;2625:12;2650:472;2742:6;2750;2758;2766;2774;2827:3;2815:9;2806:7;2802:23;2798:33;2795:53;;;2844:1;2841;2834:12;2795:53;2867:29;2886:9;2867:29;:::i;:::-;2857:39;;2943:2;2932:9;2928:18;2915:32;2905:42;;2966:37;2999:2;2988:9;2984:18;2966:37;:::i;:::-;2956:47;;3022:37;3055:2;3044:9;3040:18;3022:37;:::i;:::-;3012:47;;3078:38;3111:3;3100:9;3096:19;3078:38;:::i;:::-;3068:48;;2650:472;;;;;;;;:::o;3127:186::-;3186:6;3239:2;3227:9;3218:7;3214:23;3210:32;3207:52;;;3255:1;3252;3245:12;3207:52;3278:29;3297:9;3278:29;:::i;3549:184::-;3607:6;3660:2;3648:9;3639:7;3635:23;3631:32;3628:52;;;3676:1;3673;3666:12;3628:52;3699:28;3717:9;3699:28;:::i;3738:254::-;3806:6;3814;3867:2;3855:9;3846:7;3842:23;3838:32;3835:52;;;3883:1;3880;3873:12;3835:52;3906:29;3925:9;3906:29;:::i;:::-;3896:39;3982:2;3967:18;;;;3954:32;;-1:-1:-1;;;3738:254:17:o;3997:127::-;4058:10;4053:3;4049:20;4046:1;4039:31;4089:4;4086:1;4079:15;4113:4;4110:1;4103:15;4129:1915;4316:6;4324;4332;4340;4348;4356;4364;4417:3;4405:9;4396:7;4392:23;4388:33;4385:53;;;4434:1;4431;4424:12;4385:53;4474:9;4461:23;4503:18;4544:2;4536:6;4533:14;4530:34;;;4560:1;4557;4550:12;4530:34;4598:6;4587:9;4583:22;4573:32;;4643:7;4636:4;4632:2;4628:13;4624:27;4614:55;;4665:1;4662;4655:12;4614:55;4701:2;4688:16;4723:2;4719;4716:10;4713:36;;;4729:18;;:::i;:::-;4804:2;4798:9;4772:2;4858:13;;-1:-1:-1;;4854:22:17;;;4878:2;4850:31;4846:40;4834:53;;;4902:18;;;4922:22;;;4899:46;4896:72;;;4948:18;;:::i;:::-;4988:10;4984:2;4977:22;5023:2;5015:6;5008:18;5065:7;5058:4;5053:2;5049;5045:11;5041:22;5038:35;5035:55;;;5086:1;5083;5076:12;5035:55;5146:2;5139:4;5135:2;5131:13;5124:4;5116:6;5112:17;5099:50;5168:1;5158:11;;5213:2;5206:4;5201:2;5193:6;5189:15;5185:26;5178:38;5235:6;5225:16;;;;;5294:4;5283:9;5279:20;5266:34;5325:2;5315:8;5312:16;5309:38;;;5342:2;5338;5331:14;5309:38;5382:72;5446:7;5435:8;5424:9;5420:24;5382:72;:::i;:::-;5473:8;;-1:-1:-1;5356:98:17;-1:-1:-1;;5561:2:17;5546:18;;5533:32;5577:16;;;5574:38;;;5607:2;5603;5596:14;5574:38;5647:72;5711:7;5700:8;5689:9;5685:24;5647:72;:::i;:::-;5738:8;;-1:-1:-1;5621:98:17;-1:-1:-1;;5826:2:17;5811:18;;5798:32;5842:16;;;5839:38;;;5872:2;5868;5861:14;5839:38;5912:72;5976:7;5965:8;5954:9;5950:24;5912:72;:::i;:::-;4129:1915;;;;-1:-1:-1;4129:1915:17;;-1:-1:-1;4129:1915:17;;;;5886:98;;-1:-1:-1;;;;;4129:1915:17:o;6254:1554::-;6443:6;6451;6459;6467;6475;6483;6491;6499;6552:3;6540:9;6531:7;6527:23;6523:33;6520:53;;;6569:1;6566;6559:12;6520:53;6609:9;6596:23;6638:18;6679:2;6671:6;6668:14;6665:34;;;6695:1;6692;6685:12;6665:34;6733:6;6722:9;6718:22;6708:32;;6778:7;6771:4;6767:2;6763:13;6759:27;6749:55;;6800:1;6797;6790:12;6749:55;6840:2;6827:16;6866:2;6858:6;6855:14;6852:34;;;6882:1;6879;6872:12;6852:34;6929:7;6922:4;6913:6;6909:2;6905:15;6901:26;6898:39;6895:59;;;6950:1;6947;6940:12;6895:59;6981:4;6973:13;;;;-1:-1:-1;7005:6:17;-1:-1:-1;7049:20:17;;;7036:34;;7082:16;;;7079:36;;;7111:1;7108;7101:12;7079:36;7150:72;7214:7;7203:8;7192:9;7188:24;7150:72;:::i;:::-;7241:8;;-1:-1:-1;7124:98:17;-1:-1:-1;7329:2:17;7314:18;;7301:32;;-1:-1:-1;7345:16:17;;;7342:36;;;7374:1;7371;7364:12;7342:36;7413:72;7477:7;7466:8;7455:9;7451:24;7413:72;:::i;:::-;7504:8;;-1:-1:-1;7387:98:17;-1:-1:-1;7592:2:17;7577:18;;7564:32;;-1:-1:-1;7608:16:17;;;7605:36;;;7637:1;7634;7627:12;7605:36;;7676:72;7740:7;7729:8;7718:9;7714:24;7676:72;:::i;:::-;6254:1554;;;;-1:-1:-1;6254:1554:17;;-1:-1:-1;6254:1554:17;;;;;;7767:8;-1:-1:-1;;;6254:1554:17:o;7813:547::-;7914:6;7922;7930;7938;7946;7954;8007:3;7995:9;7986:7;7982:23;7978:33;7975:53;;;8024:1;8021;8014:12;7975:53;8047:29;8066:9;8047:29;:::i;:::-;8037:39;;8095:38;8129:2;8118:9;8114:18;8095:38;:::i;:::-;8085:48;;8180:2;8169:9;8165:18;8152:32;8142:42;;8203:37;8236:2;8225:9;8221:18;8203:37;:::i;:::-;8193:47;;8259:38;8292:3;8281:9;8277:19;8259:38;:::i;:::-;8249:48;;8316:38;8349:3;8338:9;8334:19;8316:38;:::i;:::-;8306:48;;7813:547;;;;;;;;:::o;8840:1767::-;9090:6;9098;9106;9114;9122;9130;9138;9146;9154;9162;9170:7;9224:3;9212:9;9203:7;9199:23;9195:33;9192:53;;;9241:1;9238;9231:12;9192:53;9277:9;9264:23;9254:33;;9306:18;9373:2;9367;9356:9;9352:18;9339:32;9336:40;9333:60;;;9389:1;9386;9379:12;9333:60;9428:96;9516:7;9509:2;9498:9;9494:18;9481:32;9470:9;9466:48;9428:96;:::i;:::-;9543:8;;-1:-1:-1;9570:8:17;-1:-1:-1;9621:2:17;9606:18;;9593:32;9590:40;-1:-1:-1;9587:60:17;;;9643:1;9640;9633:12;9587:60;9682:96;9770:7;9763:2;9752:9;9748:18;9735:32;9724:9;9720:48;9682:96;:::i;:::-;9797:8;;-1:-1:-1;9824:8:17;-1:-1:-1;9875:2:17;9860:18;;9847:32;9844:40;-1:-1:-1;9841:60:17;;;9897:1;9894;9887:12;9841:60;9936:96;10024:7;10017:2;10006:9;10002:18;9989:32;9978:9;9974:48;9936:96;:::i;:::-;10051:8;;-1:-1:-1;10078:8:17;-1:-1:-1;10129:3:17;10114:19;;10101:33;10098:41;-1:-1:-1;10095:61:17;;;10152:1;10149;10142:12;10095:61;10191:97;10280:7;10272:3;10261:9;10257:19;10244:33;10233:9;10229:49;10191:97;:::i;:::-;10307:8;;-1:-1:-1;10334:8:17;-1:-1:-1;10385:3:17;10370:19;;10357:33;10354:41;-1:-1:-1;10351:61:17;;;10408:1;10405;10398:12;10351:61;;10448:97;10537:7;10529:3;10518:9;10514:19;10501:33;10490:9;10486:49;10448:97;:::i;:::-;10564:8;10554:18;;10592:9;10581:20;;;;8840:1767;;;;;;;;;;;;;;:::o;11489:127::-;11550:10;11545:3;11541:20;11538:1;11531:31;11581:4;11578:1;11571:15;11605:4;11602:1;11595:15;11923:127;11984:10;11979:3;11975:20;11972:1;11965:31;12015:4;12012:1;12005:15;12039:4;12036:1;12029:15;12055:135;12094:3;-1:-1:-1;;12115:17:17;;12112:43;;;12135:18;;:::i;:::-;-1:-1:-1;12182:1:17;12171:13;;12055:135::o;12556:128::-;12596:3;12627:1;12623:6;12620:1;12617:13;12614:39;;;12633:18;;:::i;:::-;-1:-1:-1;12669:9:17;;12556:128::o;15618:236::-;15657:3;15685:18;15730:2;15727:1;15723:10;15760:2;15757:1;15753:10;15791:3;15787:2;15783:12;15778:3;15775:21;15772:47;;;15799:18;;:::i;:::-;15835:13;;15618:236;-1:-1:-1;;;;15618:236:17:o;16357:437::-;16427:3;16478:5;16501:1;16511:258;16525:6;16522:1;16519:13;16511:258;;;-1:-1:-1;;;;;16590:26:17;16609:6;16590:26;:::i;:::-;16586:75;16574:88;;16685:4;16709:12;;;;16744:15;;;;;16547:1;16540:9;16511:258;;;-1:-1:-1;16785:3:17;;16357:437;-1:-1:-1;;;;16357:437:17:o;16799:351::-;16869:3;-1:-1:-1;;;;;16893:6:17;16890:78;16887:98;;;16981:1;16978;16971:12;16887:98;17017:6;17014:1;17010:14;17058:8;17051:5;17046:3;17033:34;17124:1;17086:18;;17113:13;;;-1:-1:-1;17086:18:17;;16799:351;-1:-1:-1;;16799:351:17:o;17155:403::-;17414:3;17439:113;17493:58;17547:3;17539:6;17531;17493:58;:::i;:::-;17485:6;17477;17439:113;:::i;19532:345::-;19729:6;19724:3;19717:19;19780:6;19772;19767:2;19762:3;19758:12;19745:42;19699:3;19810:16;;19828:2;19806:25;19840:13;;;19806:25;19532:345;-1:-1:-1;;19532:345:17:o;23038:533::-;23383:6;23378:3;23371:19;23420:6;23415:2;23410:3;23406:12;23399:28;23353:3;23443:122;23497:67;23560:2;23555:3;23551:12;23543:6;23535;23497:67;:::i;23443:122::-;23436:129;23038:533;-1:-1:-1;;;;;;;;23038:533:17:o;30104:168::-;30144:7;30210:1;30206;30202:6;30198:14;30195:1;30192:21;30187:1;30180:9;30173:17;30169:45;30166:71;;;30217:18;;:::i;:::-;-1:-1:-1;30257:9:17;;30104:168::o;30277:217::-;30317:1;30343;30333:132;;30387:10;30382:3;30378:20;30375:1;30368:31;30422:4;30419:1;30412:15;30450:4;30447:1;30440:15;30333:132;-1:-1:-1;30479:9:17;;30277:217::o;30499:521::-;30576:4;30582:6;30642:11;30629:25;30736:2;30732:7;30721:8;30705:14;30701:29;30697:43;30677:18;30673:68;30663:96;;30755:1;30752;30745:12;30663:96;30782:33;;30834:20;;;-1:-1:-1;30877:18:17;30866:30;;30863:50;;;30909:1;30906;30899:12;30863:50;30942:4;30930:17;;-1:-1:-1;30973:14:17;30969:27;;;30959:38;;30956:58;;;31010:1;31007;31000:12;34452:1103;34740:2;34752:21;;;34725:18;;34808:22;;;34692:4;34887:6;34861:2;34846:18;;34692:4;34921:258;34935:6;34932:1;34929:13;34921:258;;;-1:-1:-1;;;;;35000:26:17;35019:6;35000:26;:::i;:::-;34996:75;34984:88;;35095:4;35154:15;;;;35119:12;;;;34957:1;34950:9;34921:258;;;34925:3;35226:9;35221:3;35217:19;35210:4;35199:9;35195:20;35188:49;35258:6;35253:3;35246:19;-1:-1:-1;;;;;35280:6:17;35277:78;35274:98;;;35368:1;35365;35358:12;35274:98;35402:6;35399:1;35395:14;35381:28;;35455:6;35447;35440:4;35435:3;35431:14;35418:44;35528:1;35485:16;;35503:4;35481:27;35517:13;;;35481:27;34452:1103;-1:-1:-1;;;;;;34452:1103:17:o;35560:277::-;35627:6;35680:2;35668:9;35659:7;35655:23;35651:32;35648:52;;;35696:1;35693;35686:12;35648:52;35728:9;35722:16;35781:5;35774:13;35767:21;35760:5;35757:32;35747:60;;35803:1;35800;35793:12;36613:127;36674:10;36669:3;36665:20;36662:1;36655:31;36705:4;36702:1;36695:15;36729:4;36726:1;36719:15;36745:125;36785:4;36813:1;36810;36807:8;36804:34;;;36818:18;;:::i;:::-;-1:-1:-1;36855:9:17;;36745:125::o;39202:258::-;39274:1;39284:113;39298:6;39295:1;39292:13;39284:113;;;39374:11;;;39368:18;39355:11;;;39348:39;39320:2;39313:10;39284:113;;;39415:6;39412:1;39409:13;39406:48;;;-1:-1:-1;;39450:1:17;39432:16;;39425:27;39202:258::o;39465:274::-;39594:3;39632:6;39626:13;39648:53;39694:6;39689:3;39682:4;39674:6;39670:17;39648:53;:::i;:::-;39717:16;;;;;39465:274;-1:-1:-1;;39465:274:17:o;39744:383::-;39893:2;39882:9;39875:21;39856:4;39925:6;39919:13;39968:6;39963:2;39952:9;39948:18;39941:34;39984:66;40043:6;40038:2;40027:9;40023:18;40018:2;40010:6;40006:15;39984:66;:::i;:::-;40111:2;40090:15;-1:-1:-1;;40086:29:17;40071:45;;;;40118:2;40067:54;;39744:383;-1:-1:-1;;39744:383:17:o

Swarm Source

ipfs://2fdb1d217635af2c1059d49d7bf3f9737853c60c3a103042abc1ffc62212b023
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