Contract 0x5602AFcD78fd1c15101DA60fBB22624217459aC0 3

Contract Overview

Balance:
0 MOVR

MOVR Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xca0a1e73e71cead9fb8a080f03cea4075c603a0ebcdf1767e9ddc09a7769b825Apply Withdraw22546672022-07-24 1:36:24425 days 6 hrs ago0x1787537f007f8e46d2f68f286a3e87825058e038 IN  0x5602afcd78fd1c15101da60fbb22624217459ac00 MOVR0.0004998805
0x8dd1c52dcabf5e7955348bfd2590cddd39a0286383bf736afaeb453980ef233eApply Unfrozen22546642022-07-24 1:35:42425 days 6 hrs ago0x1787537f007f8e46d2f68f286a3e87825058e038 IN  0x5602afcd78fd1c15101da60fbb22624217459ac00 MOVR0.001825866
0x711ed0f2fc721f4b37d8ff0b8e7c4f98b75d9581ad7b8d63533472625e84b6abApply Withdraw22521142022-07-23 15:10:30425 days 17 hrs ago0x9915e6e6cc47fcf56083d5205b6c6bacadb33aa6 IN  0x5602afcd78fd1c15101da60fbb22624217459ac00 MOVR0.0005695305
0xbe22d36be13a054d79290b30f1f1ef2412ee968184deffd2a96e4b65104bd71cSet Can Withdraw...22520752022-07-23 15:00:12425 days 17 hrs ago0x31347c59abab33db91a77831a1bd3f71e5d82ea8 IN  0x5602afcd78fd1c15101da60fbb22624217459ac00 MOVR0.000041388
0xcaf4dc56d6c73f1c57df3c3bcca315a638755f3a72fd8e5af141f3df39c20326Apply Unfrozen22519882022-07-23 14:38:36425 days 17 hrs ago0x9915e6e6cc47fcf56083d5205b6c6bacadb33aa6 IN  0x5602afcd78fd1c15101da60fbb22624217459ac00 MOVR0.001686566
0x6c0c1be3cfcbcb56be705aae68aae233eb1586cae05d556d73209c05eecfd55eApply Unfrozen20008872022-06-11 8:50:54467 days 23 hrs ago0x63c38c8c7362ffd27e8a99752a255105fe858ab3 IN  0x5602afcd78fd1c15101da60fbb22624217459ac00 MOVR0.0018336535
0xe60eac87b29b887d88c2796b9093715b1b68b1b1fdc3cd85a1182c800e0d64fbApply Unfrozen18993002022-05-26 5:28:36484 days 3 hrs ago0x9915e6e6cc47fcf56083d5205b6c6bacadb33aa6 IN  0x5602afcd78fd1c15101da60fbb22624217459ac00 MOVR0.0021329735
0xea4fda2cb483d4ff2b97e284af16c3ca3bd98bdbe7eaf26b2d8602f788fd7e82Set Congress Fla...18956882022-05-25 15:50:54484 days 16 hrs ago0x31347c59abab33db91a77831a1bd3f71e5d82ea8 IN  0x5602afcd78fd1c15101da60fbb22624217459ac00 MOVR0.000289186
0xd5b0704fab70aaf3a482b37dde0ceb63eafada844e4bb61e36a6e9399a25014aSet Witness Flag18956862022-05-25 15:50:24484 days 16 hrs ago0x31347c59abab33db91a77831a1bd3f71e5d82ea8 IN  0x5602afcd78fd1c15101da60fbb22624217459ac00 MOVR0.000289216
0x1792ebf6deb15467969d8c747819cab8afe65c1cfe4507f2c3523f618c07e2d2Token Escrow18953512022-05-25 14:34:24484 days 18 hrs ago0x78ea22b07ab8473a4ba3748ee706bdff44d75261 IN  0x5602afcd78fd1c15101da60fbb22624217459ac00 MOVR0.0022665685
0x1a29e80a59f7bb37730b2d56e2a6b8f6900f474ad344257c43799f17acb4dc7fToken Escrow18953122022-05-25 14:24:36484 days 18 hrs ago0x9915e6e6cc47fcf56083d5205b6c6bacadb33aa6 IN  0x5602afcd78fd1c15101da60fbb22624217459ac00 MOVR0.0023362185
0x463bba4b502375b5d5fd43a2a05485bdc087965a526cd65b01f59f740cb2f407Token Escrow18952982022-05-25 14:21:18484 days 18 hrs ago0x63c38c8c7362ffd27e8a99752a255105fe858ab3 IN  0x5602afcd78fd1c15101da60fbb22624217459ac00 MOVR0.0023362185
0xa5b648c7ed522e63809eaee3661e65acf013ffdf0a7c579e27ecb571fca803f6Token Escrow18952182022-05-25 14:01:24484 days 18 hrs ago0x1787537f007f8e46d2f68f286a3e87825058e038 IN  0x5602afcd78fd1c15101da60fbb22624217459ac00 MOVR0.0023362185
0x23c6858bca2710ba223fc295101ca505a3b268eefe22675f70c105b2bc8a2dcdTransfer Ownersh...18877802022-05-24 9:13:00485 days 23 hrs ago0x1955823bc4e46ff126228a1dbdf2dc90c2c8d801 IN  0x5602afcd78fd1c15101da60fbb22624217459ac00 MOVR0.000090538
0x278535ee35e1c5bcc3478b64147a188e4f528a48cce9585de0b08a18e1f66590Auth From Contra...18874862022-05-24 8:03:24486 days 31 mins ago0x1955823bc4e46ff126228a1dbdf2dc90c2c8d801 IN  0x5602afcd78fd1c15101da60fbb22624217459ac00 MOVR0.000553602
0x75de8f13d1c2b34d50b7d3ceb5f6245249d5a5306f969441db70be02c951bf080x6080604018874142022-05-24 7:46:00486 days 49 mins ago0x1955823bc4e46ff126228a1dbdf2dc90c2c8d801 IN  Create: RecordStorage0 MOVR0.0197394155
[ Download CSV Export 
Parent Txn Hash Block From To Value
Index Block
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RecordStorage

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

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

import "./RecordInterface.sol";
import "./UserStorage.sol";
import "./OrderStorage.sol";

abstract contract ReentrancyGuardRecord {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        _status = _ENTERED;

        _;

        _status = _NOT_ENTERED;
    }
}

library CountersRecord {
    struct Counter {
        uint256 _value;
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        {
            if (counter._value == 0) {
                counter._value = 10000;
            }
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        {
            counter._value = value - 1;
        }
    }
}

interface TokenTransfer {
    function transfer(address recipient, uint256 amount) external;

    function balanceOf(address account) external view returns (uint256);

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external;

    function allowance(address _owner, address _spender)
        external
        view
        returns (uint256 remaining);
}

contract RecordStorage is Ownable, ReentrancyGuardRecord {
    using CountersRecord for CountersRecord.Counter;

    string constant P_COIN = "WMOVR";

    mapping(string => address) coinTypeMaping;
    uint256 merchantNeedCount = 0.1 * (10**18);
    uint256 witnessNeedCount = 1 * (10**18);
    uint256 congressNeedCount = 10 * (10**18);
    uint256 appealFee = 0.01 * (10**18);
    uint256 appealFeeFinal = 0.1 * (10**18);
    uint256 canWithdrawToTime = 28;
    uint256 subWitFee = 0.01 * (10**18);
    uint256 subWitCredit = 10;
    uint256 witnessHandleReward = 0.01 * (10**18);
    uint256 observerHandleReward = 0.1 * (10**18);
    uint256 witnessHandleCredit = 1;
    uint256 observerHandleCredit = 1;
    bool openTrade = false;
    uint256 tradeCredit = 1;
    uint256 subTCredit = 10;

    mapping(address => uint256) witnessFlag;
    mapping(address => uint256) congressFlag;

    function setWitnessFlag(address _addr, uint256 _flag) external onlyOwner {
        witnessFlag[_addr] = _flag;
        if (_flag == 1) {
            uint256 _amt = availableTotal[_addr][P_COIN];
            require(_amt >= witnessNeedCount, "coin not enough");
            _userStorage.updateUserRole(_addr, 1);
        } else {
            _userStorage.updateUserRole(_addr, 0);
        }
    }

    function getWitnessFlag(address _addr) public view returns (uint256) {
        return witnessFlag[_addr];
    }

    function setCongressFlag(address _addr, uint256 _flag) external onlyOwner {
        congressFlag[_addr] = _flag;
        if (_flag == 1) {
            uint256 _amt = availableTotal[_addr][P_COIN];
            require(_amt >= congressNeedCount, "coin not enough");
            _userStorage.updateUserRole(_addr, 2);
        } else {
            _userStorage.updateUserRole(_addr, 0);
        }
    }

    function getCongressFlag(address _addr) public view returns (uint256) {
        return congressFlag[_addr];
    }

    function setCoinTypeMapping(
        string calldata _coinType,
        address _coinTypeAddr
    ) external onlyOwner {
        coinTypeMaping[_coinType] = _coinTypeAddr;
    }

    function getCoinTypeMapping(string calldata _coinType)
        public
        view
        returns (address)
    {
        return coinTypeMaping[_coinType];
    }

    function setMerchantNeedCount(uint256 _count) external onlyOwner {
        merchantNeedCount = _count;
    }

    function getMerchantNeedCount() public view returns (uint256) {
        return merchantNeedCount;
    }

    function setWitnessNeedCount(uint256 _count) external onlyOwner {
        witnessNeedCount = _count;
    }

    function getWitnessNeedCount() public view returns (uint256) {
        return witnessNeedCount;
    }

    function setCongressNeedCount(uint256 _count) external onlyOwner {
        congressNeedCount = _count;
    }

    function getCongressNeedCount() public view returns (uint256) {
        return congressNeedCount;
    }

    function setAppealFee(uint256 _count) external onlyOwner {
        appealFee = _count;
    }

    function getAppealFee() public view returns (uint256) {
        return appealFee;
    }

    function setAppealFeeFinal(uint256 _count) external onlyOwner {
        appealFeeFinal = _count;
    }

    function getAppealFeeFinal() public view returns (uint256) {
        return appealFeeFinal;
    }

    function setCanWithdrawToTime(uint256 _days) external onlyOwner {
        canWithdrawToTime = _days;
    }

    function getCanWithdrawToTime() public view returns (uint256) {
        return canWithdrawToTime;
    }

    function setSubWitFee(uint256 _c) external onlyOwner {
        subWitFee = _c;
    }

    function getSubWitFee() public view returns (uint256) {
        return subWitFee;
    }

    function setSubWitCredit(uint256 _c) external onlyOwner {
        subWitCredit = _c;
    }

    function getSubWitCredit() public view returns (uint256) {
        return subWitCredit;
    }

    function setWitnessHandleReward(uint256 _c) external onlyOwner {
        witnessHandleReward = _c;
    }

    function getWitnessHandleReward() public view returns (uint256) {
        return witnessHandleReward;
    }

    function setObserverHandleReward(uint256 _c) external onlyOwner {
        observerHandleReward = _c;
    }

    function getObserverHandleReward() public view returns (uint256) {
        return observerHandleReward;
    }

    function setWitnessHandleCredit(uint256 _c) external onlyOwner {
        witnessHandleCredit = _c;
    }

    function getWitnessHandleCredit() public view returns (uint256) {
        return witnessHandleCredit;
    }

    function setObserverHandleCredit(uint256 _c) external onlyOwner {
        observerHandleCredit = _c;
    }

    function getObserverHandleCredit() public view returns (uint256) {
        return observerHandleCredit;
    }

    function setOpenTrade(bool _c) external onlyOwner {
        openTrade = _c;
    }

    function getOpenTrade() public view returns (bool) {
        return openTrade;
    }

    function setTradeCredit(uint256 _c) external onlyOwner {
        tradeCredit = _c;
    }

    function getTradeCredit() public view returns (uint256) {
        return tradeCredit;
    }

    function setSubTCredit(uint256 _c) external onlyOwner {
        subTCredit = _c;
    }

    function getSubTCredit() public view returns (uint256) {
        return subTCredit;
    }

    function punishPerson(
        address _from,
        address _to,
        uint256 _count
    ) external onlyOwner {
        require(_from != address(0) && _to != address(0));
        UserStorage.User memory _user = _userStorage.searchUser(_from);
        require(_user.userFlag == 1 || _user.userFlag == 2, "can't punish");

        uint256 _ava = availableTotal[_from][P_COIN];
        uint256 _toavailab = availableTotal[_to][P_COIN];
        if (_ava >= _count) {
            availableTotal[_from][P_COIN] = SafeMath.sub(_ava, _count);
            availableTotal[_to][P_COIN] = SafeMath.add(_toavailab, _count);
        } else {
            availableTotal[_from][P_COIN] = 0;

            uint256 _draing = withdrawingTotal[_from][P_COIN];
            if (SafeMath.add(_ava, _draing) >= _count) {
                withdrawingTotal[_from][P_COIN] = SafeMath.sub(
                    _draing,
                    SafeMath.sub(_count, _ava)
                );
                availableTotal[_to][P_COIN] = SafeMath.add(_toavailab, _count);
            } else {
                withdrawingTotal[_from][P_COIN] = 0;
                availableTotal[_to][P_COIN] = SafeMath.add(
                    _toavailab,
                    SafeMath.add(_ava, _draing)
                );
            }
        }
        chanRole(_from);
        chanRole(_to);
    }

    UserInterface private _userStorage;
    OrderInterface private _orderStorage;
    struct Record {
        uint256 recordNo;
        address userAddr;
        string tradeHash;
        string coinType;
        uint256 hostCount;
        uint256 hostStatus;
        uint256 hostType;
        uint256 hostDirection;
        uint256 hostTime;
        uint256 updateTime;
    }

    CountersRecord.Counter private _recordNoCounter;
    mapping(uint256 => Record) public records;
    mapping(uint256 => uint256) public recordIndex;

    Record[] public recordList;

    mapping(address => mapping(string => uint256)) public availableTotal;

    mapping(address => mapping(string => uint256)) public frozenTotal;

    mapping(address => mapping(string => uint256)) public unfrozenTotal;

    mapping(address => uint256) lastWithdrawTime;

    mapping(address => mapping(uint256 => uint256)) lastWithdrawAmount;

    mapping(address => mapping(string => uint256)) public withdrawingTotal;

    mapping(address => mapping(uint256 => uint256)) orderSubFrozenList;

    constructor(
        address _usdtAddress,
        address _usdcAddress,
        address _coinAddress
    ) {
        coinTypeMaping["USDT"] = _usdtAddress;
        coinTypeMaping["USDC"] = _usdcAddress;
        coinTypeMaping[P_COIN] = _coinAddress;
        _recordNoCounter.increment();
    }

    function getERC20Address(string memory _coinType)
        public
        view
        returns (TokenTransfer)
    {
        address _remoteAddr = coinTypeMaping[_coinType];
        require(_remoteAddr != address(0));

        TokenTransfer _tokenTransfer = TokenTransfer(_remoteAddr);
        return _tokenTransfer;
    }

    event RecordAdd(
        uint256 _recordNo,
        address _addr,
        string _tradeHash,
        string _coinType,
        uint256 _hostCount,
        uint256 _hostStatus,
        uint256 _hostType,
        uint256 _hostDirection
    );
    event RecordApplyUnfrozen(address _addr, uint256 _amt);
    event UnfrozenTotalTransfer(
        address _addr,
        string _coinType,
        uint256 _lastAmount
    );
    event RecordUpdate(
        address _addr,
        uint256 _recordNo,
        string _hash,
        uint256 _hostStatus
    );

    address _userAddr;
    address _restCAddr;
    address _orderCAddr;
    address _appealCAddr;

    modifier onlyAuthFromAddr() {
        require(_userAddr != address(0), "Invalid address call user");
        require(_restCAddr != address(0), "Invalid address call rest");
        require(_orderCAddr != address(0), "Invalid address call order");
        require(_appealCAddr != address(0), "Invalid address call appeal");
        _;
    }

    function authFromContract(
        address _fromUser,
        address _fromRest,
        address _fromOrder,
        address _fromAppeal
    ) external onlyOwner {
        _userAddr = _fromUser;
        _restCAddr = _fromRest;
        _orderCAddr = _fromOrder;
        _appealCAddr = _fromAppeal;
        _userStorage = UserInterface(_userAddr);
        _orderStorage = OrderInterface(_orderCAddr);
    }

    function _insert(
        address _addr,
        string memory _tradeHash,
        string memory _coinType,
        uint256 _hostCount,
        uint256 _hostStatus,
        uint256 _hostType,
        uint256 _hostDirection
    ) internal nonReentrant returns (uint256 recordNo) {
        require(_addr != address(0), "address null");
        require(bytes(_coinType).length != 0, "coinType null");
        require(_hostCount != uint256(0), "hostCount null");
        require(_hostType != uint256(0), "hostType null");
        require(_hostDirection != uint256(0), "hostDirection null");

        uint256 _recordNo = _recordNoCounter.current();
        require(records[_recordNo].recordNo == uint256(0), "order exist");

        Record memory _record = Record({
            recordNo: _recordNo,
            userAddr: _addr,
            tradeHash: _tradeHash,
            coinType: _coinType,
            hostCount: _hostCount,
            hostStatus: _hostStatus,
            hostType: _hostType,
            hostDirection: _hostDirection,
            hostTime: block.timestamp,
            updateTime: 0
        });

        records[_recordNo] = _record;

        recordList.push(_record);
        recordIndex[_recordNo] = recordList.length - 1;

        _recordNoCounter.increment();
        emit RecordAdd(
            _recordNo,
            _addr,
            _tradeHash,
            _coinType,
            _hostCount,
            _hostStatus,
            _hostType,
            _hostDirection
        );
        return _recordNo;
    }

    function tokenEscrow(string memory _coinType, uint256 _amt) external {
        require(_amt > 0, "invalid");
        require(
            availableTotal[msg.sender][_coinType] + _amt >
                availableTotal[msg.sender][_coinType],
            "Invalid transfer amount"
        );

        availableTotal[msg.sender][_coinType] = SafeMath.add(
            availableTotal[msg.sender][_coinType],
            _amt
        );

        uint256 _hostType = 1;
        if (
            keccak256(abi.encodePacked(_coinType)) ==
            keccak256(abi.encodePacked(P_COIN))
        ) {
            _hostType = 2;
            UserStorage.User memory _user = _userStorage.searchUser(msg.sender);

            _changeUserMorgageStats(
                msg.sender,
                availableTotal[msg.sender][_coinType]
            );

            if (
                _user.userFlag == 0 &&
                availableTotal[msg.sender][_coinType] >= merchantNeedCount
            ) {
                _userStorage.updateUserRole(msg.sender, 3);
            }
        }
        _insert(msg.sender, "", _coinType, _amt, 2, _hostType, 1);

        TokenTransfer _tokenTransfer = getERC20Address(_coinType);
        _tokenTransfer.transferFrom(msg.sender, address(this), _amt);
    }

    function addRecord(
        address _addr,
        string memory _tradeHash,
        string memory _coinType,
        uint256 _hostCount,
        uint256 _hostStatus,
        uint256 _hostType,
        uint256 _hostDirection
    ) public onlyAuthFromAddr {
        require(
            msg.sender == _restCAddr || msg.sender == _orderCAddr,
            "RedocrdStorage:Invalid from contract address"
        );

        frozenTotal[_addr][_coinType] = SafeMath.add(
            frozenTotal[_addr][_coinType],
            _hostCount
        );
        _insert(
            _addr,
            _tradeHash,
            _coinType,
            _hostCount,
            _hostStatus,
            _hostType,
            _hostDirection
        );
    }

    function addAvailableTotal(
        address _addr,
        string memory _coinType,
        uint256 _amt
    ) public onlyAuthFromAddr {
        require(
            msg.sender == _restCAddr || msg.sender == _orderCAddr,
            "Invalid address"
        );
        require(_amt > 0, "invalid");
        uint256 _aBalance = getErcBalance(_coinType, address(this));
        require(_aBalance >= _amt, "not enough");
        require(frozenTotal[_addr][_coinType] >= _amt, "insufficient");
        require(
            SafeMath.sub(frozenTotal[_addr][_coinType], _amt) <=
                frozenTotal[_addr][_coinType],
            "Invalid amount"
        );
        frozenTotal[_addr][_coinType] = SafeMath.sub(
            frozenTotal[_addr][_coinType],
            _amt
        );

        TokenTransfer _tokenTransfer = getERC20Address(_coinType);
        _tokenTransfer.transfer(_addr, _amt);
    }

    function getAvailableTotal(address _addr, string memory _coinType)
        public
        view
        returns (uint256)
    {
        return availableTotal[_addr][_coinType];
    }

    function subFrozenTotal(uint256 _orderNo, address _addr)
        public
        onlyAuthFromAddr
    {
        require(
            msg.sender == _orderCAddr || msg.sender == _appealCAddr,
            "Invalid call"
        );
        OrderStorage.Order memory _order = _orderStorage.searchOrder(_orderNo);
        require(_order.orderNo != uint256(0), "not exist");
        address _seller = _order.orderDetail.sellerAddr;
        string memory _coinType = _order.orderDetail.coinType;

        uint256 _subAmount = orderSubFrozenList[_seller][_orderNo];
        require(_subAmount == 0);

        uint256 _frozen = frozenTotal[_seller][_coinType];
        uint256 _orderCount = _order.coinCount;
        require(_frozen >= _orderCount);
        require(SafeMath.sub(_frozen, _orderCount) <= _frozen);

        frozenTotal[_seller][_coinType] = SafeMath.sub(_frozen, _orderCount);
        orderSubFrozenList[_seller][_orderNo] = _orderCount;

        TokenTransfer _tokenTransfer = getERC20Address(_coinType);
        _tokenTransfer.transfer(_addr, _orderCount);
    }

    function subAvaAppeal(
        address _from,
        address _to,
        AppealStorage.Appeal memory _al,
        uint256 _amt,
        uint256 _t,
        uint256 _self
    ) public onlyAuthFromAddr {
        require(msg.sender == _appealCAddr, "Invalid call");

        uint256 _available = getAvailableTotal(_from, P_COIN);
        uint256 _need = 0;
        address _opt = _t == 1 ? _al.witness : _al.detail.observerAddr;
        if (_available >= _amt) {
            _need = _amt;
        } else {
            _need = _available;
        }

        if (
            (_t == 1 && _self == 0) ||
            (_t == 2 && _al.detail.finalAppealAddr != _from)
        ) {
            availableTotal[_from][P_COIN] = SafeMath.sub(
                availableTotal[_from][P_COIN],
                _need
            );
            availableTotal[_to][P_COIN] = SafeMath.add(
                availableTotal[_to][P_COIN],
                _need
            );
            _changeUserMorgageStats(_from, availableTotal[_from][P_COIN]);
            _changeUserMorgageStats(_to, availableTotal[_to][P_COIN]);
        }

        availableTotal[_opt][P_COIN] = SafeMath.add(
            availableTotal[_opt][P_COIN],
            _amt
        );
        _changeUserMorgageStats(_opt, availableTotal[_opt][P_COIN]);
        chanRole(_from);
        chanRole(_to);
        chanRole(_opt);

        UserStorage.User memory _user = _userStorage.searchUser(_opt);
        if (_t == 1) {
            _user.credit = _user.credit + witnessHandleCredit;
        } else if (_t == 2) {
            _user.credit = _user.credit + observerHandleCredit;
        }
        UserStorage.TradeStats memory _tradeStats = _user.tradeStats;
        _userStorage.updateTradeStats(_opt, _tradeStats, _user.credit);
    }

    function _changeUserMorgageStats(address _addr, uint256 _amt) internal {
        UserStorage.User memory _user = _userStorage.searchUser(_addr);
        UserStorage.MorgageStats memory _morgageStats = _user.morgageStats;
        _morgageStats.mortgage = _amt;
        _userStorage.updateMorgageStats(_addr, _morgageStats);
    }

    function subWitnessAvailable(address _addr) public onlyAuthFromAddr {
        require(msg.sender == _appealCAddr, "Invalid call");
        require(_addr != address(0), "address null");
        uint256 _availableTotal = availableTotal[_addr][P_COIN];
        uint256 _need = 0;
        uint256 subFromDraing = 0;
        if (_availableTotal >= subWitFee) {
            _need = subWitFee;
            availableTotal[_addr][P_COIN] = SafeMath.sub(
                _availableTotal,
                _need
            );
        } else {
            availableTotal[_addr][P_COIN] = 0;

            uint256 _draing = withdrawingTotal[_addr][P_COIN];
            if (SafeMath.add(_availableTotal, _draing) >= subWitFee) {
                _need = subWitFee;
                subFromDraing = SafeMath.sub(subWitFee, _availableTotal);
                withdrawingTotal[_addr][P_COIN] = SafeMath.sub(
                    _draing,
                    subFromDraing
                );
            } else {
                _need = SafeMath.add(_draing, _availableTotal);
                withdrawingTotal[_addr][P_COIN] = 0;
            }
        }
        chanRole(_addr);

        UserStorage.User memory _user = _userStorage.searchUser(_addr);
        _user.credit = _user.credit >= subWitCredit
            ? (_user.credit - subWitCredit)
            : 0;
        UserStorage.TradeStats memory _tradeStats = _user.tradeStats;
        _userStorage.updateTradeStats(_addr, _tradeStats, _user.credit);

        TokenTransfer _tokenTransfer = getERC20Address(P_COIN);
        _tokenTransfer.transfer(owner(), _need);
    }

    function getFrozenTotal(address _addr, string memory _coinType)
        public
        view
        returns (uint256)
    {
        return frozenTotal[_addr][_coinType];
    }

    function applyUnfrozen(uint256 _amt) external returns (uint256) {
        require(_amt > 0);
        require(availableTotal[msg.sender][P_COIN] >= _amt, "Invalid amount");
        require(
            SafeMath.sub(availableTotal[msg.sender][P_COIN], _amt) <
                availableTotal[msg.sender][P_COIN],
            "Invalid amount 2"
        );

        lastWithdrawTime[msg.sender] = block.timestamp;
        lastWithdrawAmount[msg.sender][lastWithdrawTime[msg.sender]] = _amt;
        availableTotal[msg.sender][P_COIN] = SafeMath.sub(
            availableTotal[msg.sender][P_COIN],
            _amt
        );
        withdrawingTotal[msg.sender][P_COIN] = SafeMath.add(
            withdrawingTotal[msg.sender][P_COIN],
            _amt
        );

        chanRole(msg.sender);

        _insert(msg.sender, "", P_COIN, _amt, 3, 3, 2);

        emit RecordApplyUnfrozen(msg.sender, _amt);

        return getAvailableTotal(msg.sender, P_COIN);
    }

    function chanRole(address _addr) internal {
        uint256 _avail = availableTotal[_addr][P_COIN];

        UserStorage.User memory _user = _userStorage.searchUser(_addr);

        _changeUserMorgageStats(_addr, _avail);

        if (
            _user.userFlag == 2 &&
            _avail < congressNeedCount &&
            _avail >= merchantNeedCount
        ) {
            _userStorage.updateUserRole(_addr, 3);
        }

        if (
            _user.userFlag == 1 &&
            _avail < witnessNeedCount &&
            _avail >= merchantNeedCount
        ) {
            _userStorage.updateUserRole(_addr, 3);
        }

        if (_user.userFlag == 0 && _avail >= merchantNeedCount) {
            _userStorage.updateUserRole(_addr, 3);
        }

        if (_avail < merchantNeedCount) {
            _userStorage.updateUserRole(_addr, 0);
        }
    }

    function unApplyUnfrozen(address _addr) external onlyOwner {
        uint256 _drawing = withdrawingTotal[_addr][P_COIN];
        require(_drawing > 0, "sufficient");
        withdrawingTotal[_addr][P_COIN] = 0;
        availableTotal[_addr][P_COIN] = SafeMath.add(
            availableTotal[_addr][P_COIN],
            _drawing
        );
        chanRole(_addr);
    }

    function applyWithdraw(uint256 _recordNo) public {
        Record memory _record = records[_recordNo];

        require(_record.recordNo != uint256(0), "record not exist");
        require(_record.userAddr == msg.sender, "record user not exist");

        require(_record.hostStatus == 3, "status error");

        require(
            withdrawingTotal[msg.sender][P_COIN] >= _record.hostCount,
            "sufficient"
        );

        require(
            block.timestamp >= (_record.hostTime + canWithdrawToTime * 1 days),
            "can't withdraw"
        );

        withdrawingTotal[msg.sender][P_COIN] = SafeMath.sub(
            withdrawingTotal[msg.sender][P_COIN],
            _record.hostCount
        );
        unfrozenTotal[msg.sender][P_COIN] = SafeMath.add(
            unfrozenTotal[msg.sender][P_COIN],
            _record.hostCount
        );

        _record.hostStatus = 4;
        _record.updateTime = block.timestamp;
        records[_recordNo] = _record;
        recordList[recordIndex[_recordNo]] = _record;
        emit RecordUpdate(msg.sender, _recordNo, _record.tradeHash, 4);

        TokenTransfer _tokenTransfer = getERC20Address(P_COIN);
        _tokenTransfer.transfer(msg.sender, _record.hostCount);
    }

    function unfrozenTotalSearch(address _addr, string memory _coinType)
        public
        view
        returns (uint256)
    {
        require(_addr != address(0), "user address is null");

        return unfrozenTotal[_addr][_coinType];
    }

    function getUnfrozenTotal(address _addr, string memory _coinType)
        external
        view
        returns (uint256)
    {
        return unfrozenTotal[_addr][_coinType];
    }

    function getWithdrawingTotal(address _addr, string memory _coinType)
        public
        view
        returns (uint256)
    {
        return withdrawingTotal[_addr][_coinType];
    }

    function getErcBalance(string memory _coinType, address _addr)
        public
        view
        returns (uint256)
    {
        TokenTransfer _tokenTransfer = getERC20Address(_coinType);
        return _tokenTransfer.balanceOf(_addr);
    }

    function _updateInfo(
        address _addr,
        uint256 _recordNo,
        string memory _hash,
        uint256 _hostStatus
    ) internal returns (bool) {
        Record storage _record = records[_recordNo];
        require(_record.userAddr == _addr);
        require(_hostStatus == 1 || _hostStatus == 2, "invalid status");

        if (_hostStatus != uint256(0)) {
            _record.hostStatus = _hostStatus;
        }
        if (bytes(_hash).length != 0) {
            _record.tradeHash = _hash;
        }

        _record.updateTime = block.timestamp;

        emit RecordUpdate(_addr, _recordNo, _hash, _hostStatus);
        return true;
    }

    function updateInfo(
        address _addr,
        uint256 _recordNo,
        string memory _hash,
        uint256 _hostStatus
    ) external returns (bool) {
        return _updateInfo(_addr, _recordNo, _hash, _hostStatus);
    }

    function searchRecord(uint256 _recordNo)
        external
        view
        returns (Record memory record)
    {
        return records[_recordNo];
    }

    function searchRecordList() external view returns (Record[] memory) {
        return recordList;
    }
}

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

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

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

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

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

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

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

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

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

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

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

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

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

import "./RecordInterface.sol";
import "./UserStorage.sol";

contract AppealStorage {
    OrderInterface private _oSt;
    RecordInterface private _rSt;
    UserInterface private _uSt;
    address recAddr;

    struct Appeal {
        address user;
        uint256 appealNo;
        uint256 orderNo;
        address witness;
        address buyer;
        address seller;
        uint256 mortgage;
        uint256 status;
        uint256 appealTime;
        uint256 witTakeTime;
        uint256 obTakeTime;
        AppealDetail detail;
    }

    struct AppealDetail {
        address finalAppealAddr;
        uint256 updateTime;
        string witnessReason;
        uint256 witnessAppealStatus;
        string observerReason;
        uint256 witnessHandleTime;
        uint256 observerHandleTime;
        address observerAddr;
        uint256 witnessHandleReward;
        uint256 observerHandleReward;
        uint256 witnessHandleCredit;
        uint256 observerHandleCredit;
        uint256 witReward;
        uint256 witSub;
        uint256 witCreditR;
        uint256 witCreditS;
    }

    mapping(uint256 => Appeal) public appeals;
    mapping(uint256 => uint256) public appealIndex;

    Appeal[] public appealList;

    event addAppeal(uint256 _appealNo, uint256 _orderNo);

    constructor(
        address _r,
        address _o,
        address _u
    ) {
        _rSt = RecordInterface(_r);
        _oSt = OrderInterface(_o);
        _uSt = UserInterface(_u);
        recAddr = _r;
    }

    modifier onlyWit(uint256 _o) {
        Appeal memory _al = appeals[_o];
        require(_al.witness == msg.sender);
        require(_al.buyer != msg.sender && _al.seller != msg.sender);
        _;
    }

    modifier onlyOb(uint256 _o) {
        Appeal memory _al = appeals[_o];
        require(_al.detail.observerAddr == msg.sender);
        require(_al.buyer != msg.sender && _al.seller != msg.sender);
        _;
    }

    modifier onlyBOS(uint256 _o) {
        OrderStorage.Order memory _r = _oSt.searchOrder(_o);
        require(
            _r.orderDetail.sellerAddr == msg.sender ||
                _r.orderDetail.buyerAddr == msg.sender
        );
        _;
    }

    function _insert(uint256 _o, uint256 _count) internal {
        OrderStorage.Order memory _or = _oSt.searchOrder(_o);

        require(appeals[_o].appealNo == uint256(0));

        AppealDetail memory _detail = AppealDetail({
            finalAppealAddr: address(0),
            updateTime: uint256(0),
            witnessReason: "",
            observerReason: "",
            witnessAppealStatus: 0,
            witnessHandleTime: uint256(0),
            observerHandleTime: uint256(0),
            observerAddr: address(0),
            witnessHandleReward: 0,
            observerHandleReward: 0,
            witnessHandleCredit: 0,
            observerHandleCredit: 0,
            witReward: 0,
            witSub: 0,
            witCreditR: 0,
            witCreditS: 0
        });

        uint256 _appealNo = block.timestamp;

        Appeal memory _appeal = Appeal({
            user: msg.sender,
            appealNo: _appealNo,
            orderNo: _o,
            witness: address(0),
            buyer: _or.orderDetail.buyerAddr,
            seller: _or.orderDetail.sellerAddr,
            mortgage: _count,
            status: 1,
            appealTime: block.timestamp,
            witTakeTime: 0,
            obTakeTime: 0,
            detail: _detail
        });

        appeals[_o] = _appeal;

        appealList.push(_appeal);
        appealIndex[_o] = appealList.length - 1;

        chanT(_or.orderDetail.sellerAddr, _or.orderDetail.buyerAddr, 1, 0);

        emit addAppeal(_appealNo, _o);
    }

    function chanT(
        address _seller,
        address _buyer,
        uint256 _t,
        uint256 _r
    ) internal {
        uint256 _tc = _rSt.getTradeCredit();
        uint256 _rs = _rSt.getSubTCredit();

        UserStorage.User memory _user = _uSt.searchUser(_seller);
        UserStorage.TradeStats memory _tr = _user.tradeStats;

        UserStorage.User memory _user2 = _uSt.searchUser(_buyer);
        UserStorage.TradeStats memory _tr2 = _user2.tradeStats;
        uint256 _c2 = _user2.credit;

        uint256 _c = _user.credit;
        if (_t == 1) {
            _tr.tradeTotal = _tr.tradeTotal > 0 ? (_tr.tradeTotal - 1) : 0;
            _tr2.tradeTotal = _tr2.tradeTotal > 0 ? (_tr2.tradeTotal - 1) : 0;

            _c = (_c >= _tc) ? (_c - _tc) : 0;

            _c2 = (_c2 >= _tc) ? (_c2 - _tc) : 0;
        } else if (_t == 2) {
            _tr.tradeTotal += 1;
            _tr2.tradeTotal += 1;

            if (_r == 1) {
                _c += _tc;
                _c2 = (_c2 >= _rs) ? (_c2 - _rs) : 0;
            } else if (_r == 2) {
                _c2 += _tc;
                _c = (_c >= _rs) ? (_c - _rs) : 0;
            }
        }

        _uSt.updateTradeStats(_seller, _tr, _c);
        _uSt.updateTradeStats(_buyer, _tr2, _c2);
    }

    function applyAppeal(uint256 _o) external onlyBOS(_o) {
        uint256 _fee = _rSt.getAppealFee();
        _insert(_o, _fee);

        TokenTransfer _tokenTransfer = _rSt.getERC20Address("WMOVR");
        _tokenTransfer.transferFrom(msg.sender, recAddr, _fee);
    }

    function takeWit(uint256 _o) external {
        Appeal memory _al = appeals[_o];

        require(_al.buyer != msg.sender && _al.seller != msg.sender);

        require(_al.witness == address(0));
        require(_al.status == 1);

        bool _f = witOrOb(1);
        require(_f);

        _al.witness = msg.sender;
        _al.witTakeTime = block.timestamp;

        appeals[_o] = _al;
        appealList[appealIndex[_o]] = _al;
    }

    function takeOb(uint256 _o) external {
        Appeal memory _al = appeals[_o];

        require(_al.buyer != msg.sender && _al.seller != msg.sender);

        require(_al.status == 4 || _al.status == 5);
        require(_al.detail.observerAddr == address(0));

        bool _f = witOrOb(2);
        require(_f);

        _al.detail.observerAddr = msg.sender;
        _al.obTakeTime = block.timestamp;

        appeals[_o] = _al;
        appealList[appealIndex[_o]] = _al;
    }

    function changeHandler(uint256 _o, uint256 _type) external onlyBOS(_o) {
        Appeal memory _al = appeals[_o];

        if (_type == 1) {
            require(_al.status == 1);
            require(_al.witness != address(0));
            require(block.timestamp - _al.witTakeTime > 24 hours);

            _al.witness = address(0);
            _al.witTakeTime = 0;
        } else if (_type == 2) {
            require(_al.status == 4 || _al.status == 5);
            require(_al.detail.observerAddr != address(0));
            require(block.timestamp - _al.obTakeTime > 24 hours);

            _al.detail.observerAddr = address(0);
            _al.obTakeTime = 0;
        }

        appeals[_o] = _al;
        appealList[appealIndex[_o]] = _al;
    }

    function witOrOb(uint256 _f) internal view returns (bool) {
        UserStorage.User memory _u = _uSt.searchUser(msg.sender);
        if (_u.userFlag == _f) {
            return true;
        }
        return false;
    }

    function applyFinal(uint256 _o) external onlyBOS(_o) {
        Appeal memory _al = appeals[_o];

        require(_al.status == 2 || _al.status == 3);

        require(block.timestamp - _al.detail.witnessHandleTime <= 24 hours);

        chanT(_al.seller, _al.buyer, 1, 0);

        uint256 _fee = _rSt.getAppealFeeFinal();

        TokenTransfer _tokenTransfer = _rSt.getERC20Address("WMOVR");
        _tokenTransfer.transferFrom(msg.sender, recAddr, _fee);

        if (_al.status == 2) {
            _al.status = 4;
        } else if (_al.status == 3) {
            _al.status = 5;
        }
        _al.detail.finalAppealAddr = msg.sender;
        _al.detail.updateTime = block.timestamp;
        appeals[_o] = _al;
        appealList[appealIndex[_o]] = _al;
    }

    function witnessOpt(
        uint256 _o,
        string memory _r,
        uint256 _s
    ) external onlyWit(_o) {
        require(_s == 2 || _s == 3);
        Appeal memory _al = appeals[_o];

        require(_al.status == 1);
        uint256 _fee = _rSt.getAppealFee();
        uint256 _rcedit = _rSt.getWitnessHandleCredit();

        _al.status = _s;
        _al.detail.witnessAppealStatus = _s;
        _al.detail.witnessReason = _r;
        _al.detail.witnessHandleTime = block.timestamp;
        _al.detail.witnessHandleReward = _fee;
        _al.detail.witnessHandleCredit = _rcedit;
        _al.detail.witReward = _fee;
        _al.detail.witCreditR = _rcedit;

        _al.detail.updateTime = block.timestamp;
        appeals[_o] = _al;
        appealList[appealIndex[_o]] = _al;

        if (_s == 2) {
            if (_al.user == _al.buyer) {
                _rSt.subAvaAppeal(_al.seller, _al.buyer, _al, _fee, 1, 0);
                chanT(_al.seller, _al.buyer, 2, 2);
            } else if (_al.user == _al.seller) {
                _rSt.subAvaAppeal(_al.buyer, _al.seller, _al, _fee, 1, 0);

                chanT(_al.seller, _al.buyer, 2, 1);
            }
        }

        if (_s == 3) {
            if (_al.user == _al.buyer) {
                _rSt.subAvaAppeal(_al.buyer, _al.seller, _al, _fee, 1, 1);
                chanT(_al.seller, _al.buyer, 2, 1);
            } else if (_al.user == _al.seller) {
                _rSt.subAvaAppeal(_al.seller, _al.buyer, _al, _fee, 1, 1);
                chanT(_al.seller, _al.buyer, 2, 2);
            }
        }
    }

    function observerOpt(
        uint256 _o,
        string memory _r,
        uint256 _s
    ) external onlyOb(_o) {
        require(_s == 6 || _s == 7);
        Appeal memory _appeal = appeals[_o];

        require(_appeal.status == 4 || _appeal.status == 5);
        uint256 _fee = _rSt.getAppealFeeFinal();
        uint256 _rcedit = _rSt.getObserverHandleCredit();

        _appeal.status = _s;
        _appeal.detail.observerReason = _r;
        _appeal.detail.observerHandleTime = block.timestamp;
        _appeal.detail.observerHandleReward = _fee;
        _appeal.detail.observerHandleCredit = _rcedit;

        uint256 _subWC = _rSt.getSubWitCredit();
        uint256 _subWF = _rSt.getSubWitFee();

        if (_s == 6) {
            if (_appeal.user == _appeal.buyer) {
                _rSt.subAvaAppeal(
                    _appeal.seller,
                    _appeal.buyer,
                    _appeal,
                    _fee,
                    2,
                    0
                );

                chanT(_appeal.seller, _appeal.buyer, 2, 2);
                _rSt.subFrozenTotal(_o, _appeal.buyer);
            } else if (_appeal.user == _appeal.seller) {
                _rSt.subAvaAppeal(
                    _appeal.buyer,
                    _appeal.seller,
                    _appeal,
                    _fee,
                    2,
                    0
                );

                chanT(_appeal.seller, _appeal.buyer, 2, 1);
                _rSt.subFrozenTotal(_o, _appeal.seller);
            }
            if (_appeal.detail.witnessAppealStatus == 3) {
                _appeal.detail.witSub = _subWF;
                _appeal.detail.witCreditS = _subWC;

                if (_appeal.detail.witnessHandleCredit >= _subWC) {
                    _appeal.detail.witnessHandleCredit = SafeMath.sub(
                        _appeal.detail.witnessHandleCredit,
                        _subWC
                    );
                } else {
                    _appeal.detail.witnessHandleCredit = 0;
                }
                _rSt.subWitnessAvailable(_appeal.witness);
            }
        }

        if (_s == 7) {
            if (_appeal.user == _appeal.buyer) {
                _rSt.subAvaAppeal(
                    _appeal.buyer,
                    _appeal.seller,
                    _appeal,
                    _fee,
                    2,
                    1
                );
                chanT(_appeal.seller, _appeal.buyer, 2, 1);
                _rSt.subFrozenTotal(_o, _appeal.seller);
            } else if (_appeal.user == _appeal.seller) {
                _rSt.subAvaAppeal(
                    _appeal.seller,
                    _appeal.buyer,
                    _appeal,
                    _fee,
                    2,
                    1
                );
                chanT(_appeal.seller, _appeal.buyer, 2, 2);
                _rSt.subFrozenTotal(_o, _appeal.buyer);
            }
            if (_appeal.detail.witnessAppealStatus == 2) {
                _appeal.detail.witSub = _subWF;
                _appeal.detail.witCreditS = _subWC;

                if (_appeal.detail.witnessHandleCredit >= _subWC) {
                    _appeal.detail.witnessHandleCredit = SafeMath.sub(
                        _appeal.detail.witnessHandleCredit,
                        _subWC
                    );
                } else {
                    _appeal.detail.witnessHandleCredit = 0;
                }
                _rSt.subWitnessAvailable(_appeal.witness);
            }
        }

        _appeal.detail.updateTime = block.timestamp;
        appeals[_o] = _appeal;
        appealList[appealIndex[_o]] = _appeal;
    }

    function searchAppeal(uint256 _o)
        external
        view
        returns (Appeal memory appeal)
    {
        return appeals[_o];
    }

    function searchAppealList() external view returns (Appeal[] memory) {
        return appealList;
    }
}

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

import "./RecordInterface.sol";
import "./RestStorage.sol";
import "./UserStorage.sol";
import "./RecordStorage.sol";
import "./AppealStorage.sol";
abstract contract ReentrancyGuardOrder {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;
    uint256 private _status;
    constructor() {
        _status = _NOT_ENTERED;
    }
    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
        _status = _ENTERED;
        _;
        _status = _NOT_ENTERED;
    }
}
library CountersOrder {
    struct Counter {
        uint256 _value;
    }
    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }
    function increment(Counter storage counter) internal {
        {
            if (counter._value == 0) {
                counter._value = 10000;
            }
            counter._value += 1;
        }
    }
    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        {
            counter._value = value - 1;
        }
    }
}
contract OrderStorage is Ownable, ReentrancyGuardOrder {
    using CountersOrder for CountersOrder.Counter;
    RestStorage private _restStorage;
    RecordInterface private _recordStorage;
    UserInterface private _userStorage;
    AppealInterface private _appealS;
    address recordAddress;
    struct Order {
        address userAddr;
        uint256 orderNo;
        uint256 restNo;
        uint256 coinCount;
        uint256 orderAmount;
        uint256 payType;
        string currencyType;
        uint256 orderType;
        uint256 orderStatus;
        OrderDetail orderDetail;
    }
    struct OrderDetail {
        address buyerAddr;
        address sellerAddr;
        string coinType;
        uint256 price;
        uint256 tradeTime;
        uint256 updateTime;
        string tradeHash;
        uint256 tradeFee;
    }
    CountersOrder.Counter private _orderNoCounter;
    mapping(uint256 => Order) private orders;
    mapping(uint256 => uint256) private orderIndex;
    Order[] private orderList;
    mapping(address => mapping(uint256 => uint256)) orderFrozenTotal;
    uint256 cancelOrderTime = 30;
    function setCancelOrderTime(uint256 _count) public onlyOwner {
        cancelOrderTime = _count;
    }
    function getCancelOrderTime() public view returns (uint256) {
        return cancelOrderTime;
    }
    uint256 canWithdrawHours = 24;
    function setCanWithdrawHours(uint256 _count) public onlyOwner {
        canWithdrawHours = _count;
    }
    function getCanWithdrawHours() public view returns (uint256) {
        return canWithdrawHours;
    }
    event OrderAdd(
        uint256 _orderNo,
        uint256 _restNo,
        uint256 _coinCount,
        uint256 _tradeFee,
        uint256 _orderAmount,
        uint256 _payType,
        uint256 _orderType,
        address _buyerAddr,
        address _sellerAddr
    );
    event OrderPaidMoney(uint256 _orderNo);
    event OrderConfirmCollect(uint256 _orderNo);
    event OrderCancel(uint256 _orderNo);
    event OrderUpdateStatus(uint256 _orderNo, uint256 _orderStatus);
    function authFromContract(
        address _recordAddr,
        address _restAddr,
        address _userAddr,
        address _appealAddr
    ) external onlyOwner {
        _recordStorage = RecordInterface(_recordAddr);
        _restStorage = RestStorage(_restAddr);
        _userStorage = UserInterface(_userAddr);
        recordAddress = _recordAddr;
        _appealS = AppealInterface(_appealAddr);
        _orderNoCounter.increment();
    }
    modifier onlyBuyer(uint256 _orderNo) {
        require(_orderNo != uint256(0), "orderNo null");
        require(
            orders[_orderNo].orderDetail.buyerAddr == msg.sender,
            "only buyer"
        );
        _;
    }
    modifier onlySeller(uint256 _orderNo) {
        require(_orderNo != uint256(0), "orderNo null");
        require(
            orders[_orderNo].orderDetail.sellerAddr == msg.sender,
            "only seller"
        );
        _;
    }
    modifier onlyBuyerOrSeller(uint256 _orderNo) {
        require(_orderNo != uint256(0), "orderNo null");
        require(
            orders[_orderNo].orderDetail.sellerAddr == msg.sender ||
                orders[_orderNo].orderDetail.buyerAddr == msg.sender,
            "Only buyer or seller"
        );
        _;
    }
    function _checkParam(
        uint256 _restNo,
        uint256 _coinCount,
        uint256 _orderAmount,
        uint256 _payType
    ) internal pure {
        require(_restNo != uint256(0), "restNo null");
        require(_coinCount > 0, "coinCount null");
        require(_orderAmount > 0, "orderAmount null");
        require(_payType != uint256(0), "payType null");
    }
    function _insert(
        uint256 _restNo,
        uint256 _coinCount,
        uint256 _tradeFee,
        uint256 _orderAmount,
        uint256 _payType,
        uint256 _orderType,
        address _buyerAddr,
        address _sellerAddr
    ) internal nonReentrant returns (uint256 restNo) {
        _checkParam(_restNo, _coinCount, _orderAmount, _payType);
        RestStorage.Rest memory _rest = _restStorage.searchRest(_restNo);
        require(_rest.userAddr != address(0), "rest not exist");
        OrderDetail memory _orderDetail = OrderDetail({
            buyerAddr: _buyerAddr,
            sellerAddr: _sellerAddr,
            coinType: _rest.coinType,
            price: _rest.price,
            tradeTime: block.timestamp,
            updateTime: 0,
            tradeHash: "",
            tradeFee: _tradeFee
        });
        uint256 _orderNo = _orderNoCounter.current();
        require(orders[_orderNo].orderNo == uint256(0), "order exist");
        Order memory order = Order({
            userAddr: msg.sender,
            orderNo: _orderNo,
            restNo: _restNo,
            coinCount: _coinCount,
            orderAmount: _orderAmount,
            payType: _payType,
            currencyType: _rest.currencyType,
            orderType: _orderType,
            orderStatus: 1,
            orderDetail: _orderDetail
        });
        orders[_orderNo] = order;
        orderList.push(order);
        orderIndex[_orderNo] = orderList.length - 1;
        if (_orderType == 2) {
            orderFrozenTotal[msg.sender][_orderNo] = _coinCount;
        } else if (_orderType == 1) {
            orderFrozenTotal[_rest.userAddr][_orderNo] = _coinCount;
        }
        _orderNoCounter.increment();
        emit OrderAdd(
            _orderNo,
            _restNo,
            _coinCount,
            _tradeFee,
            _orderAmount,
            _payType,
            _orderType,
            _buyerAddr,
            _sellerAddr
        );
        return _orderNo;
    }
    function addBuyOrder(
        uint256 _restNo,
        uint256 _coinCount,
        uint256 _orderAmount,
        uint256 _payType
    ) external {
        RestStorage.Rest memory _rest = _restStorage.searchRest(_restNo);
        require(_rest.userAddr != msg.sender, "rest not exist");
        require(_rest.restType == 2, "sell rest not exist");
        require(_coinCount > 0 && _orderAmount > 0, "coin count error");
        require(_rest.restStatus == 1, "rest status error");
        UserStorage.User memory _currentUser = _userStorage.searchUser(
            msg.sender
        );
        require(
            _currentUser.userFlag != 1 && _currentUser.userFlag != 2,
            "invalid user"
        );
        uint256 _restFrozen = _restStorage.getRestFrozenTotal(
            _rest.userAddr,
            _restNo
        );
        require(_restFrozen >= _coinCount, "coin not enough");
        uint256 _amo = SafeMath.mul(_rest.price, _coinCount);
        require(
            _amo >= _rest.restDetail.limitAmountFrom &&
                _amo <= _rest.restDetail.limitAmountTo,
            "amount error"
        );
        require(
            _currentUser.credit >= _rest.restDetail.limitMinCredit,
            "credit error"
        );
        require(
            _currentUser.morgageStats.mortgage >=
                _rest.restDetail.limitMinMortgage,
            "mortgage error"
        );
        _restStorage.updateRestFinishCount(_restNo, _coinCount);
        _insert(
            _restNo,
            _coinCount,
            0,
            _orderAmount,
            _payType,
            1,
            msg.sender,
            _rest.userAddr
        );
    }
    function addSellOrder(
        uint256 _restNo,
        uint256 _coinCount,
        uint256 _tradeFee,
        uint256 _orderAmount,
        uint256 _payType
    ) external {
        RestStorage.Rest memory _rest = _restStorage.searchRest(_restNo);
        require(_rest.userAddr != msg.sender, "rest not exist");
        require(_rest.restType == 1, "buy rest not exist");
        require(_coinCount > 0, "coin count error");
        require(_orderAmount > 0, "orderAmount error");
        require(_rest.restStatus == 1, "rest status error");
        uint256 _amo = SafeMath.mul(_rest.price, _coinCount);
        require(
            _amo >= _rest.restDetail.limitAmountFrom &&
                _amo <= _rest.restDetail.limitAmountTo,
            "amount error"
        );
        UserStorage.User memory _currentUser = _userStorage.searchUser(
            msg.sender
        );
        require(
            _currentUser.userFlag != 1 && _currentUser.userFlag != 2,
            "invalid user"
        );
        require(
            _currentUser.credit >= _rest.restDetail.limitMinCredit,
            "credit error"
        );
        require(
            _currentUser.morgageStats.mortgage >=
                _rest.restDetail.limitMinMortgage,
            "mortgage error"
        );
        uint256 _needSub = SafeMath.add(_coinCount, _tradeFee);
        _restStorage.updateRestFinishCount(_restNo, _coinCount);
        _insert(
            _restNo,
            _coinCount,
            _tradeFee,
            _orderAmount,
            _payType,
            2,
            _rest.userAddr,
            msg.sender
        );
        TokenTransfer _tokenTransfer = _recordStorage.getERC20Address(
            _rest.coinType
        );
        _tokenTransfer.transferFrom(msg.sender, recordAddress, _needSub);
        _recordStorage.addRecord(
            msg.sender,
            "",
            _rest.coinType,
            _coinCount,
            2,
            1,
            2
        );
    }
    function setPaidMoney(uint256 _orderNo)
        external
        onlyBuyer(_orderNo)
        returns (bool)
    {
        _updateOrderStatus(_orderNo, 2);
        emit OrderPaidMoney(_orderNo);
        return true;
    }
    function confirmCollect(uint256 _orderNo) external onlySeller(_orderNo) {
        require(_orderNo != uint256(0), "orderNo null");
        Order memory _order = orders[_orderNo];
        require(_order.orderStatus == 2, "Invalid order status");
        require(
            _order.orderDetail.buyerAddr != address(0),
            "Invalid buyer address"
        );
        require(
            orderFrozenTotal[msg.sender][_orderNo] >= _order.coinCount,
            "coin not enough"
        );
        _updateOrderStatus(_orderNo, 3);
        orderFrozenTotal[msg.sender][_orderNo] = 0;
        uint256 _rc = _recordStorage.getTradeCredit();
        UserStorage.User memory _user = _userStorage.searchUser(msg.sender);
        uint256 _credit = _user.credit + _rc;
        UserStorage.TradeStats memory _tradeStats = _user.tradeStats;
        _tradeStats.tradeTotal += 1;
        _userStorage.updateTradeStats(msg.sender, _tradeStats, _credit);
        UserStorage.User memory _user2 = _userStorage.searchUser(
            _order.orderDetail.buyerAddr
        );
        uint256 _credit2 = _user2.credit + _rc;
        UserStorage.TradeStats memory _tradeStats2 = _user2.tradeStats;
        _tradeStats2.tradeTotal += 1;
        _userStorage.updateTradeStats(
            _order.orderDetail.buyerAddr,
            _tradeStats2,
            _credit2
        );
        _recordStorage.subFrozenTotal(_orderNo, _order.orderDetail.buyerAddr);
        emit OrderConfirmCollect(_orderNo);
    }
    function cancelOrder(uint256 _orderNo)
        external
        onlyBuyerOrSeller(_orderNo)
        returns (bool)
    {
        Order memory _order = orders[_orderNo];
        require(_order.orderNo != uint256(0), "current Order not exist");
        require(_order.orderStatus == 1, "Can't cancel order");
        if (_order.orderDetail.sellerAddr == msg.sender) {
            require(
                _order.orderDetail.tradeTime + cancelOrderTime * 1 minutes <
                    block.timestamp,
                "limit"
            );
        }
        RestStorage.Rest memory _rest = _restStorage.searchRest(_order.restNo);
        if (_rest.restStatus == 4 || _rest.restStatus == 5) {
            orderFrozenTotal[_order.orderDetail.sellerAddr][_orderNo] = 0;
            _recordStorage.addAvailableTotal(
                _order.orderDetail.sellerAddr,
                _order.orderDetail.coinType,
                _order.coinCount
            );
        } else {
            if (_order.orderType == 2) {
                orderFrozenTotal[_order.orderDetail.sellerAddr][_orderNo] = 0;
                _recordStorage.addAvailableTotal(
                    _order.orderDetail.sellerAddr,
                    _order.orderDetail.coinType,
                    _order.coinCount
                );
            }
            _restStorage.addRestRemainCount(_order.restNo, _order.coinCount);
        }
        _updateOrderStatus(_orderNo, 4);
        emit OrderCancel(_orderNo);
        return true;
    }
    function takeCoin(uint256 _o) external onlyBuyerOrSeller(_o) {
        AppealStorage.Appeal memory _appeal = _appealS.searchAppeal(_o);
        require(
            block.timestamp - _appeal.detail.witnessHandleTime >
                canWithdrawHours * 1 hours,
            "time error"
        );
        address _win;
        if (_appeal.user == _appeal.buyer) {
            if (_appeal.status == 2) {
                _win = _appeal.buyer;
            } else if (_appeal.status == 3) {
                _win = _appeal.seller;
            }
        } else {
            if (_appeal.status == 2) {
                _win = _appeal.seller;
            } else if (_appeal.status == 3) {
                _win = _appeal.buyer;
            }
        }
        require(_win == msg.sender, "opt error");
        _updateOrderStatus(_o, 5);
        orderFrozenTotal[_appeal.seller][_o] = 0;
        _recordStorage.subFrozenTotal(_o, msg.sender);
    }
    function _updateOrderStatus(uint256 _orderNo, uint256 _orderStatus)
        internal
        onlyBuyerOrSeller(_orderNo)
    {
        Order memory order = orders[_orderNo];
        require(order.orderNo != uint256(0), "current Order not exist");
        require(_orderStatus >= 1 && _orderStatus <= 5, "Invalid order status");
        if (_orderStatus == 2 && order.orderStatus != 1) {
            revert("Invalid order status 2");
        }
        if (_orderStatus == 3 && order.orderStatus != 2) {
            revert("Invalid order status 3");
        }
        if (_orderStatus == 4 && order.orderStatus != 1) {
            revert("Invalid order status 4");
        }
        if (
            _orderStatus == 5 &&
            order.orderStatus != 1 &&
            order.orderStatus != 2
        ) {
            revert("Invalid order status 5");
        }
        if (_orderStatus == 2) {
            require(
                order.orderDetail.buyerAddr == msg.sender,
                "only buyer call"
            );
        }
        if (_orderStatus == 3) {
            require(
                order.orderDetail.sellerAddr == msg.sender,
                "only seller call"
            );
        }
        order.orderStatus = _orderStatus;
        order.orderDetail.updateTime = block.timestamp;
        orders[_orderNo] = order;
        orderList[orderIndex[_orderNo]] = order;
        emit OrderUpdateStatus(_orderNo, _orderStatus);
    }
    function searchOrder(uint256 _orderNo)
        external
        view
        returns (Order memory order)
    {
        require(_orderNo != uint256(0), "orderNo null");
        require(
            orders[_orderNo].orderNo != uint256(0),
            "current Order not exist"
        );
        Order memory o = orders[_orderNo];
        return o;
    }
    function searchOrderList() external view returns (Order[] memory) {
        return orderList;
    }
    function searchListByRest(uint256 _restNo)
        external
        view
        returns (Order[] memory)
    {
        Order[] memory resultList = new Order[](orderList.length);
        for (uint256 i = 0; i < orderList.length; i++) {
            Order memory _order = orderList[i];
            if (_order.restNo == _restNo) {
                resultList[i] = _order;
            }
        }
        return resultList;
    }
}

File 4 of 6: RecordInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./RestStorage.sol";
import "./OrderStorage.sol";
import "./UserStorage.sol";
import "./RecordStorage.sol";
import "./AppealStorage.sol";
interface RecordInterface {
    function getErcBalance(string memory _coinType, address _addr)
        external
        returns (uint256);
    function getAvailableTotal(address _addr, string memory _coinType)
        external
        returns (uint256);
    function getFrozenTotal(address _addr, string memory _coinType)
        external
        returns (uint256);
    function addAvailableTotal(
        address _addr,
        string memory _coinType,
        uint256 remainHoldCoin
    ) external;
    function subAvaAppeal(
        address _from,
        address _to,
        AppealStorage.Appeal memory _al,
        uint256 _amt,
        uint256 _type,
        uint256 _self
    ) external;
    function subWitnessAvailable(address _addr) external;
    function getERC20Address(string memory _coinType)
        external
        returns (TokenTransfer);
    function subFrozenTotal(uint256 _orderNo, address _addr) external;
    function addRecord(
        address _addr,
        string memory _tradeHash,
        string memory _coinType,
        uint256 _hostCount,
        uint256 _hostStatus,
        uint256 _hostType,
        uint256 _hostDirection
    ) external;
    function getAppealFee() external view returns (uint256);
    function getAppealFeeFinal() external view returns (uint256);
    function getWitnessHandleReward() external view returns (uint256);
    function getObserverHandleReward() external view returns (uint256);
    function getWitnessHandleCredit() external view returns (uint256);
    function getObserverHandleCredit() external view returns (uint256);
    function getSubWitCredit() external view returns (uint256);
    function getOpenTrade() external view returns (bool);
    function getTradeCredit() external view returns (uint256);
    function getSubTCredit() external view returns (uint256);
    function getSubWitFee() external view returns (uint256);
}
interface RestInterface {
    function searchRest(uint256 _restNo)
        external
        returns (RestStorage.Rest memory rest);
    function getRestFrozenTotal(address _addr, uint256 _restNo)
        external
        returns (uint256);
    function updateRestFinishCount(uint256 _restNo, uint256 _coinCount)
        external
        returns (uint256);
    function addRestRemainCount(uint256 _restNo, uint256 _remainCount)
        external
        returns (uint256);
}
interface OrderInterface {
    function searchOrder(uint256 _orderNo)
        external
        returns (OrderStorage.Order memory order);
}
interface UserInterface {
    function searchUser(address _addr)
        external
        view
        returns (UserStorage.User memory user);
    function searchWitnessList(uint256 _userFlag)
        external
        returns (UserStorage.User[] memory userList);
    function updateTradeStats(
        address _addr,
        UserStorage.TradeStats memory _tradeStats,
        uint256 _credit
    ) external;
    function updateMorgageStats(
        address _addr,
        UserStorage.MorgageStats memory _morgageStats
    ) external;
    function updateUserRole(address _addr, uint256 _userFlag) external;
}
interface AppealInterface {
    function searchAppeal(uint256 _o)
        external
        view
        returns (AppealStorage.Appeal memory appeal);
}

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

import "./RecordInterface.sol";
import "./UserStorage.sol";
import "./RecordStorage.sol";
abstract contract ReentrancyGuardRest {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;
    uint256 private _status;
    constructor() {
        _status = _NOT_ENTERED;
    }
    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
        _status = _ENTERED;
        _;
        _status = _NOT_ENTERED;
    }
}
library CountersRest {
    struct Counter {
        uint256 _value; 
    }
    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }
    function increment(Counter storage counter) internal {
        {
            if (counter._value == 0) {
				counter._value = 10000;
			}
            counter._value += 1;
        }
    }
    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        {
            counter._value = value - 1;
        }
    }
}
contract RestStorage is Ownable,ReentrancyGuardRest {
    using CountersRest for CountersRest.Counter;
    RecordInterface private _recordStorage;
    UserInterface private _userStorage;
    address recordAddress;
    struct Rest {
        address userAddr; 
        uint restNo; 
        uint restType; 
        string coinType; 
        string currencyType; 
        uint restCount; 
        uint price; 
        uint[] payType; 
        uint restStatus; 
        RestDetail restDetail; 
    }
    struct RestDetail {
        uint finishCount; 
        uint remainderCount; 
        uint limitAmountFrom; 
        uint limitAmountTo; 
        uint limitMinCredit; 
        uint limitMinMortgage; 
        string restRemark; 
        uint restTime; 
        uint updateTime; 
        uint restFee;
        string restHash;
    }
    CountersRest.Counter private _restNoCounter;
    mapping (uint => Rest) private rests;
    mapping (uint => uint) private restIndex;
    Rest[] private restList; 
	mapping(address=>mapping(uint=>uint)) restFrozenTotal;
    event RestAdd(uint _restNo, uint _restType, string  _coinType, string  _currencyType, uint _restCount, uint _price, uint[] _payType,RestDetail _restDetail);
    event RestUpdate(uint _restNo, string _coinType, string _currencyType, uint _restCount, uint _price,uint[] _payType, RestDetail _restDetail);
	address _orderCAddr;
	modifier onlyAuthFromAddr() {
        require(_orderCAddr == msg.sender, 'Invalid contract address');
		_;
	}
	function authFromContract(address _recordAddr, address _userAddr, address _orderAddr) external onlyOwner {
		_orderCAddr = _orderAddr;
        _recordStorage = RecordInterface(_recordAddr);
        _userStorage = UserInterface(_userAddr);
        recordAddress = _recordAddr;
        _restNoCounter.increment();
	}
    modifier onlyRestOwner(uint _restNo) {
		require(rests[_restNo].userAddr == msg.sender, "rest address not exist");
        _;
    }
     function _checkParam(uint _restType, string memory _coinType, string memory _currencyType, 
                        uint _restCount, uint _price, uint[] memory _payType) pure internal {
        require(_restType != uint(0), "RestStorage: restType null is not allowed");
        require(bytes(_coinType).length != 0, "RestStorage: coinType null is not allowed");
        require(bytes(_currencyType).length != 0, "RestStorage: currencyType null is not allowed");
        require(_restCount != uint(0), "RestStorage: restCount null is not allowed");
        require(_price != uint(0), "RestStorage: price null is not allowed");
        require(_payType.length != 0, "RestStorage: payType null is not allowed");
	}
    function _insert(uint _restType, string memory _coinType, string memory _currencyType, 
    uint _restCount, uint _price, uint[] memory _payType, RestDetail memory _restDetail) internal nonReentrant returns(uint){
		_checkParam(_restType, _coinType, _currencyType, _restCount, _price, _payType);
		uint _restNo = _restNoCounter.current();
        require(rests[_restNo].restNo == uint(0), "rest exist");
		_restDetail.finishCount = 0;
		_restDetail.remainderCount = _restCount;
		_restDetail.restTime = block.timestamp;
		_restDetail.updateTime = 0;
        if(_restDetail.limitAmountTo > SafeMath.mul(_restCount, _price) || _restDetail.limitAmountTo == 0) {
            _restDetail.limitAmountTo = SafeMath.mul(_restCount, _price);
        }
 		Rest memory r = Rest({userAddr: msg.sender, restNo: _restNo, restType:_restType,
         coinType:_coinType, currencyType:_currencyType,
        restCount:_restCount, price:_price,
        payType:_payType, restStatus:1, restDetail: _restDetail});
        rests[_restNo] = r;
		restList.push(r);
		restIndex[_restNo] = restList.length-1;
        _restNoCounter.increment();
		emit RestAdd(_restNo, _restType, _coinType, _currencyType, _restCount, _price, _payType, _restDetail);
		return _restNo;
	}
    function _updateInfo(uint _restNo, string memory _coinType, string memory _currencyType, 
    uint _addCount, uint _price, uint[] memory _payType, RestDetail memory _restDetail) internal {
		require(_restNo != uint(0), 'Invalid restNo');
		Rest memory r = rests[_restNo];
		r.restStatus = 1;
		if(bytes(_coinType).length != 0){
			r.coinType = _coinType;
		}
		if(bytes(_currencyType).length != 0){
			r.currencyType = _currencyType;
		}
		if(_price != uint(0)){
			r.price = _price;
		}
        if(_addCount != uint(0)){
			r.restCount += _addCount;
            r.restDetail.remainderCount += _addCount;
            r.restDetail.limitAmountTo = SafeMath.mul(r.restDetail.remainderCount, r.price);
		}
        if(_payType.length != 0){
			r.payType = _payType;
		}
        if(_restDetail.limitAmountFrom != uint(0)){
            if(_restDetail.limitAmountFrom > r.restDetail.limitAmountTo) {
                _restDetail.limitAmountFrom = r.restDetail.limitAmountTo;
            }
            r.restDetail.limitAmountFrom = _restDetail.limitAmountFrom;
		}
        if(_restDetail.limitMinCredit != uint(0)){
			r.restDetail.limitMinCredit = _restDetail.limitMinCredit;
		}
        if(_restDetail.limitMinMortgage != uint(0)){
			r.restDetail.limitMinMortgage = _restDetail.limitMinMortgage;
		}
        if(bytes(_restDetail.restRemark).length != 0){
			r.restDetail.restRemark = _restDetail.restRemark;
		}
		if(_restDetail.restFee != uint(0)){
			r.restDetail.restFee = _restDetail.restFee;
		}
        r.restDetail.updateTime = block.timestamp;
		rests[_restNo] = r;
        restList[restIndex[_restNo]] = r;
        emit RestUpdate(_restNo, _coinType, _currencyType, r.restCount, _price, _payType, _restDetail);
	}
	function addBuyRest(uint _restType, string memory _coinType, string memory _currencyType, 
    uint _restCount, uint _price, uint[] memory _payType,RestDetail memory _restDetail) external {
        require(_restType == 1, "must buy rest" );
        UserStorage.User memory _user = _userStorage.searchUser(msg.sender);
        bool _openTrade = _recordStorage.getOpenTrade();
        require(_openTrade || _user.userFlag == 3, "invalid user" );
        _insert(_restType, _coinType, _currencyType, _restCount, _price, _payType, _restDetail);
	}
	function _addSell(uint _restType, string memory _coinType, string memory _currencyType, 
    uint _restCount, uint _restFee, uint _price, uint[] memory _payType,RestDetail memory _restDetail) internal {
	    require(_restType == 2, "must sell rest" );
        require(_restCount > 0, "restCount error");
        UserStorage.User memory _user = _userStorage.searchUser(msg.sender);
        bool _openTrade = _recordStorage.getOpenTrade();
        require(_openTrade || _user.userFlag == 3, "invalid user" );
        _recordStorage.addRecord(msg.sender, '', _coinType, _restCount, 2, 1, 2);
        uint _needSub = SafeMath.add(_restCount, _restFee);
        TokenTransfer _tokenTransfer = _recordStorage.getERC20Address(_coinType);
		_tokenTransfer.transferFrom(msg.sender, recordAddress, _needSub);
        uint _newRestNo = _insert(_restType, _coinType, _currencyType, _restCount, _price, _payType, _restDetail);
        restFrozenTotal[msg.sender][_newRestNo] = _restCount;
	}
	function addSellRest(uint _restType, string memory _coinType, string memory _currencyType, 
    uint _restCount,uint _restFee, uint _price, uint[] memory _payType,RestDetail memory _restDetail) external {
        _addSell(_restType, _coinType, _currencyType, _restCount,_restFee,_price, _payType, _restDetail);
	}
	function getRestFrozenTotal(address _addr, uint _restNo) public view returns(uint) {
	    return restFrozenTotal[_addr][_restNo];
	}
	function cancelBuyRest(uint _restNo) external onlyRestOwner(_restNo) {
        require(rests[_restNo].restStatus == 1, "can't change this rest");
        require(rests[_restNo].restType == 1, "Invalid rest type");
        require(rests[_restNo].restDetail.finishCount < rests[_restNo].restCount, "this rest has finished");
        Rest memory r = rests[_restNo];
        r.restStatus = 4;
        r.restDetail.updateTime = block.timestamp;
        rests[_restNo] = r;
        restList[restIndex[_restNo]] = r;
    }
    function _cancelSell(uint _restNo) onlyRestOwner(_restNo) internal {
        require(rests[_restNo].restStatus == 1, "can't cancel this rest");
        require(rests[_restNo].restType == 2, "Invalid rest type");
        require(rests[_restNo].restDetail.finishCount < rests[_restNo].restCount, "this rest has finished");
        require(restFrozenTotal[msg.sender][_restNo] > 0, "rest has finished");
        uint _frozenTotal = _recordStorage.getFrozenTotal(msg.sender, rests[_restNo].coinType);
        require(_frozenTotal >= restFrozenTotal[msg.sender][_restNo], "can't cancel this rest");
        uint remainHoldCoin = restFrozenTotal[msg.sender][_restNo];
        Rest memory r = rests[_restNo];
        r.restStatus = 4;
        if (remainHoldCoin < rests[_restNo].restCount) {
            r.restStatus = 5;
        }
        r.restDetail.remainderCount = 0;
        r.restDetail.updateTime = block.timestamp;
        rests[_restNo] = r;
        restList[restIndex[_restNo]] = r;
        restFrozenTotal[msg.sender][_restNo] = 0;
        _recordStorage.addAvailableTotal(msg.sender, rests[_restNo].coinType, remainHoldCoin);
    }
    function cancelSellRest(uint _restNo) external{
        _cancelSell(_restNo);
    }
    function startOrStop(uint _restNo, uint _restStatus) external onlyRestOwner(_restNo){
        require(_restStatus == 1 || _restStatus == 3, "Invalid rest status");
        Rest memory r = rests[_restNo];
        require(r.restStatus == 1 || r.restStatus == 3, "Invalid rest status,opt error");
        r.restStatus = _restStatus;
        r.restDetail.updateTime = block.timestamp;
        rests[_restNo] = r;
        restList[restIndex[_restNo]] = r;
    }
	function updateInfo(uint _restNo, string memory _coinType, string memory _currencyType, 
    uint _addCount, uint _restFee, uint _price,uint[] memory _payType, RestDetail memory _restDetail) external onlyRestOwner(_restNo){
		require(_restNo != uint(0), 'Invalid restNo');
		Rest memory _rest = rests[_restNo];
		require(_rest.restNo != uint(0), 'rest not exist');
		if (_rest.restType == 2) {
            _recordStorage.addRecord(msg.sender, '', _coinType, _addCount, 2, 1, 2);
            uint _needSub = SafeMath.add(_addCount, _restFee);
            TokenTransfer _tokenTransfer = _recordStorage.getERC20Address(_coinType);
            _tokenTransfer.transferFrom(msg.sender, recordAddress, _needSub);
            restFrozenTotal[msg.sender][_restNo] += _addCount;
		}
        _updateInfo(_restNo, _coinType, _currencyType, _addCount, _price, _payType, _restDetail);
	}
    function updateRestFinishCount(uint _restNo, uint _finishCount) onlyAuthFromAddr external {
        Rest memory _rest = rests[_restNo];
        require(_rest.restDetail.remainderCount >= _finishCount, "RestStorage:finish count error");
        if (_rest.restType == 2) {
            restFrozenTotal[_rest.userAddr][_restNo] = SafeMath.sub(restFrozenTotal[_rest.userAddr][_restNo], _finishCount);
        }
        _rest.restDetail.finishCount = SafeMath.add(_rest.restDetail.finishCount, _finishCount);
        _rest.restDetail.remainderCount = SafeMath.sub(_rest.restDetail.remainderCount, _finishCount);
        _rest.restDetail.limitAmountTo = SafeMath.mul(_rest.price, _rest.restDetail.remainderCount);
        if (_rest.restDetail.remainderCount == 0) {
            _rest.restStatus = 2;
        }
        _rest.restDetail.updateTime = block.timestamp;
		rests[_restNo] = _rest;
        restList[restIndex[_restNo]] = _rest;
    }
    function addRestRemainCount(uint _restNo, uint _remainCount) onlyAuthFromAddr public {
        Rest memory _rest = rests[_restNo];
        require(_remainCount > 0 && _rest.restDetail.finishCount >= _remainCount, "count error");
        if (_rest.restType == 2) {
            restFrozenTotal[_rest.userAddr][_restNo] = SafeMath.add(restFrozenTotal[_rest.userAddr][_restNo], _remainCount);
        }
        _rest.restDetail.finishCount = SafeMath.sub(_rest.restDetail.finishCount, _remainCount);
        _rest.restDetail.remainderCount = SafeMath.add(_rest.restDetail.remainderCount, _remainCount);
        _rest.restDetail.limitAmountTo = SafeMath.mul(_rest.price, _rest.restDetail.remainderCount);
        _rest.restDetail.limitAmountFrom = _rest.restDetail.limitAmountFrom > _rest.restDetail.limitAmountTo ? _rest.restDetail.limitAmountTo : _rest.restDetail.limitAmountFrom;
        _rest.restStatus = 1;
        _rest.restDetail.updateTime = block.timestamp;
		rests[_restNo] = _rest;
        restList[restIndex[_restNo]] = _rest;
    }
	function searchRest(uint _restNo) external view returns(Rest memory rest) {
	    require(_restNo != uint(0), "restNo null is not allowed");
		Rest memory r = rests[_restNo];
		return r;
	}
	function searchRestList() external view returns(Rest[] memory) {
        return restList;
	}
}

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

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: @openzeppelin/contracts/access/Ownable.sol

// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)

pragma solidity ^0.8.0;

/**
 * @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() {
        _transferOwnership(_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 {
        _transferOwnership(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"
        );
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

contract UserStorage is Ownable {
    struct User {
        address userAddr; 
        string avatar; 
        string email;  
        uint isOnline; 
        uint userFlag; 
        uint256 credit; 
        uint regTime; 
        TradeStats tradeStats; 
        MorgageStats morgageStats; 
    }
    struct TradeStats {
        uint256 tradeTotal;
        uint256 restTotal; 
    }
    struct MorgageStats {
        uint256 mortgage; 
        uint256 freezeMortgage; 
        uint256 relieveMortgage; 
        uint256 inviteUserCount; 
        uint256 inviteUserReward; 
        uint applyRelieveTime; 
        uint handleRelieveTime; 
    }
    mapping (address => User) public users;
    mapping (address => uint256) public userIndex;
    User[] public userList; 
    event addUser(address _userAddr);
    event updateUser(string _avatar, string _email, uint _isOnline);
	address _restCAddr;
	address _orderCAddr;
	address _recordCAddr;
	address _appealCAddr;
	modifier onlyAuthFromAddr() {
		require(_restCAddr != address(0), 'Invalid address call rest');
		require(_orderCAddr != address(0), 'Invalid address call order');
		require(_recordCAddr != address(0), 'Invalid address call record');
		require(_appealCAddr != address(0), 'Invalid address call appeal');
		_;
	}
	function authFromContract(address _fromRest, address _fromOrder, address _fromRecord, address _fromAppeal) external onlyOwner {
		_restCAddr = _fromRest;
		_orderCAddr = _fromOrder;
		_recordCAddr = _fromRecord;
		_appealCAddr = _fromAppeal;
	}
    modifier onlyMemberOf() {
        require(users[msg.sender].userAddr != address(0), 'has no permission');
        _;
    }
    function _insert(address _addr) internal {
		require(_addr != address(0), "UserStorage: addr null is not allowed");
		require(users[_addr].userAddr == address(0), "UserStorage: current User exist");
		TradeStats memory tradeStats = TradeStats({tradeTotal:0, restTotal:0});
        MorgageStats memory morgageStats = MorgageStats({mortgage:0, freezeMortgage:0, relieveMortgage: 0, inviteUserCount:0, inviteUserReward:0, applyRelieveTime:0, handleRelieveTime:0});
 		User memory u = User({userAddr:_addr, avatar: '', email:'',
        isOnline:1, userFlag:0, credit:0, regTime:block.timestamp,tradeStats:tradeStats, morgageStats:morgageStats});
        users[_addr] = u;
		userList.push(u);
		userIndex[_addr] = userList.length -1;
		emit addUser(_addr);
	}
	function _updateInfo(address _addr, string memory _avatar, string memory _email, uint _isOnline) internal {
		require(_addr != address(0), "UserStorage: _addr null is not allowed");
		require(users[_addr].userAddr != address(0), "UserStorage: current User not exist");
		User memory u = users[_addr];
		if(bytes(_avatar).length != 0){
			u.avatar = _avatar;
		}
		if(bytes(_email).length != 0){
			u.email = _email;
		}
		if(_isOnline != uint(0)){
			u.isOnline = _isOnline;
		}
		users[_addr] = u;
		userList[userIndex[_addr]] = u;
	}
	function _updateTradeStats(address _addr, TradeStats memory _tradeStats, uint _credit) internal {
		require(_addr != address(0), "UserStorage: _addr null is not allowed");
		require(users[_addr].userAddr != address(0), "UserStorage: current User not exist");
		User memory u = users[_addr];
		u.credit = _credit;
		u.tradeStats.tradeTotal = _tradeStats.tradeTotal;
		u.tradeStats.restTotal = _tradeStats.restTotal;
		users[_addr] = u;
		userList[userIndex[_addr]] = u;
	}
	function _updateMorgageStats(address _addr, MorgageStats memory _morgageStats) internal {
		require(_addr != address(0), "UserStorage: _addr null is not allowed");
		require(users[_addr].userAddr != address(0), "UserStorage: current User not exist");
		User memory u = users[_addr];
		u.morgageStats.mortgage = _morgageStats.mortgage;
		u.morgageStats.freezeMortgage = _morgageStats.freezeMortgage;
		u.morgageStats.relieveMortgage = _morgageStats.relieveMortgage;
		u.morgageStats.inviteUserCount = _morgageStats.inviteUserCount;
		u.morgageStats.inviteUserReward = _morgageStats.inviteUserReward;
		u.morgageStats.applyRelieveTime = _morgageStats.applyRelieveTime;
		u.morgageStats.handleRelieveTime = _morgageStats.handleRelieveTime;
		users[_addr] = u;
		userList[userIndex[_addr]] = u;
	}
    function _search(address _addr) internal view returns(User memory user) {
		require(_addr != address(0), "UserStorage: _addr null is not allowed");
		require(users[_addr].userAddr != address(0), "UserStorage: current User not exist");
		User memory a = users[_addr];
		return a;
	}
	function register() external {
		require(!isMemberOf(), 'has registed');
		_insert(msg.sender);
	}
    function isMemberOf() public view returns (bool) {
        return (users[msg.sender].userAddr != address(0));
    }
	function updateInfo(string memory _avatar, string memory _email, uint _isOnline) onlyMemberOf external {
		_updateInfo(msg.sender, _avatar, _email, _isOnline);
		emit updateUser(_avatar, _email, _isOnline);
	}
	function updateTradeStats(address _addr, TradeStats memory _tradeStats, uint _credit) onlyAuthFromAddr public {
	    require(msg.sender == _restCAddr || msg.sender == _orderCAddr || msg.sender == _appealCAddr || msg.sender == _recordCAddr, 'UserStorage:Invalid from contract address');
		_updateTradeStats(_addr, _tradeStats, _credit);
	}
	function updateMorgageStats(address _addr, MorgageStats memory _morgageStats) onlyAuthFromAddr public {
		require(msg.sender == _recordCAddr, 'UserStorage:Invalid from contract address');
		_updateMorgageStats(_addr, _morgageStats);
	}
	function updateUserRole(address _addr, uint _userFlag) onlyAuthFromAddr public {
	    require(msg.sender == _recordCAddr, 'UserStorage:Invalid from contract address');
	    require(_addr != address(0), "UserStorage: _addr null is not allowed");
		require(users[_addr].userAddr != address(0), "UserStorage: current User not exist");
		require(_userFlag<=3, 'UserStorage: Invalid userFlag 3');
		User memory u = users[_addr];
		u.userFlag = _userFlag;
	    users[_addr] = u;
		userList[userIndex[_addr]] = u;
	}
	function searchUser(address _addr) external view returns(User memory user) {
		return _search(_addr);
	}
	function searchUserList() external view returns(User[] memory) {
		return userList;
	}
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_usdtAddress","type":"address"},{"internalType":"address","name":"_usdcAddress","type":"address"},{"internalType":"address","name":"_coinAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_recordNo","type":"uint256"},{"indexed":false,"internalType":"address","name":"_addr","type":"address"},{"indexed":false,"internalType":"string","name":"_tradeHash","type":"string"},{"indexed":false,"internalType":"string","name":"_coinType","type":"string"},{"indexed":false,"internalType":"uint256","name":"_hostCount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_hostStatus","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_hostType","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_hostDirection","type":"uint256"}],"name":"RecordAdd","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amt","type":"uint256"}],"name":"RecordApplyUnfrozen","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"_recordNo","type":"uint256"},{"indexed":false,"internalType":"string","name":"_hash","type":"string"},{"indexed":false,"internalType":"uint256","name":"_hostStatus","type":"uint256"}],"name":"RecordUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_addr","type":"address"},{"indexed":false,"internalType":"string","name":"_coinType","type":"string"},{"indexed":false,"internalType":"uint256","name":"_lastAmount","type":"uint256"}],"name":"UnfrozenTotalTransfer","type":"event"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"string","name":"_coinType","type":"string"},{"internalType":"uint256","name":"_amt","type":"uint256"}],"name":"addAvailableTotal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"string","name":"_tradeHash","type":"string"},{"internalType":"string","name":"_coinType","type":"string"},{"internalType":"uint256","name":"_hostCount","type":"uint256"},{"internalType":"uint256","name":"_hostStatus","type":"uint256"},{"internalType":"uint256","name":"_hostType","type":"uint256"},{"internalType":"uint256","name":"_hostDirection","type":"uint256"}],"name":"addRecord","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amt","type":"uint256"}],"name":"applyUnfrozen","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_recordNo","type":"uint256"}],"name":"applyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_fromUser","type":"address"},{"internalType":"address","name":"_fromRest","type":"address"},{"internalType":"address","name":"_fromOrder","type":"address"},{"internalType":"address","name":"_fromAppeal","type":"address"}],"name":"authFromContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"string","name":"","type":"string"}],"name":"availableTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"string","name":"","type":"string"}],"name":"frozenTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAppealFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAppealFeeFinal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"string","name":"_coinType","type":"string"}],"name":"getAvailableTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCanWithdrawToTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_coinType","type":"string"}],"name":"getCoinTypeMapping","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"getCongressFlag","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCongressNeedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_coinType","type":"string"}],"name":"getERC20Address","outputs":[{"internalType":"contract TokenTransfer","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_coinType","type":"string"},{"internalType":"address","name":"_addr","type":"address"}],"name":"getErcBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"string","name":"_coinType","type":"string"}],"name":"getFrozenTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMerchantNeedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getObserverHandleCredit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getObserverHandleReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOpenTrade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSubTCredit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSubWitCredit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSubWitFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTradeCredit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"string","name":"_coinType","type":"string"}],"name":"getUnfrozenTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"string","name":"_coinType","type":"string"}],"name":"getWithdrawingTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"getWitnessFlag","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWitnessHandleCredit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWitnessHandleReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWitnessNeedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"punishPerson","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"recordIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"recordList","outputs":[{"internalType":"uint256","name":"recordNo","type":"uint256"},{"internalType":"address","name":"userAddr","type":"address"},{"internalType":"string","name":"tradeHash","type":"string"},{"internalType":"string","name":"coinType","type":"string"},{"internalType":"uint256","name":"hostCount","type":"uint256"},{"internalType":"uint256","name":"hostStatus","type":"uint256"},{"internalType":"uint256","name":"hostType","type":"uint256"},{"internalType":"uint256","name":"hostDirection","type":"uint256"},{"internalType":"uint256","name":"hostTime","type":"uint256"},{"internalType":"uint256","name":"updateTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"records","outputs":[{"internalType":"uint256","name":"recordNo","type":"uint256"},{"internalType":"address","name":"userAddr","type":"address"},{"internalType":"string","name":"tradeHash","type":"string"},{"internalType":"string","name":"coinType","type":"string"},{"internalType":"uint256","name":"hostCount","type":"uint256"},{"internalType":"uint256","name":"hostStatus","type":"uint256"},{"internalType":"uint256","name":"hostType","type":"uint256"},{"internalType":"uint256","name":"hostDirection","type":"uint256"},{"internalType":"uint256","name":"hostTime","type":"uint256"},{"internalType":"uint256","name":"updateTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_recordNo","type":"uint256"}],"name":"searchRecord","outputs":[{"components":[{"internalType":"uint256","name":"recordNo","type":"uint256"},{"internalType":"address","name":"userAddr","type":"address"},{"internalType":"string","name":"tradeHash","type":"string"},{"internalType":"string","name":"coinType","type":"string"},{"internalType":"uint256","name":"hostCount","type":"uint256"},{"internalType":"uint256","name":"hostStatus","type":"uint256"},{"internalType":"uint256","name":"hostType","type":"uint256"},{"internalType":"uint256","name":"hostDirection","type":"uint256"},{"internalType":"uint256","name":"hostTime","type":"uint256"},{"internalType":"uint256","name":"updateTime","type":"uint256"}],"internalType":"struct RecordStorage.Record","name":"record","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"searchRecordList","outputs":[{"components":[{"internalType":"uint256","name":"recordNo","type":"uint256"},{"internalType":"address","name":"userAddr","type":"address"},{"internalType":"string","name":"tradeHash","type":"string"},{"internalType":"string","name":"coinType","type":"string"},{"internalType":"uint256","name":"hostCount","type":"uint256"},{"internalType":"uint256","name":"hostStatus","type":"uint256"},{"internalType":"uint256","name":"hostType","type":"uint256"},{"internalType":"uint256","name":"hostDirection","type":"uint256"},{"internalType":"uint256","name":"hostTime","type":"uint256"},{"internalType":"uint256","name":"updateTime","type":"uint256"}],"internalType":"struct RecordStorage.Record[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"setAppealFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"setAppealFeeFinal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_days","type":"uint256"}],"name":"setCanWithdrawToTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_coinType","type":"string"},{"internalType":"address","name":"_coinTypeAddr","type":"address"}],"name":"setCoinTypeMapping","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256","name":"_flag","type":"uint256"}],"name":"setCongressFlag","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"setCongressNeedCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"setMerchantNeedCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_c","type":"uint256"}],"name":"setObserverHandleCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_c","type":"uint256"}],"name":"setObserverHandleReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_c","type":"bool"}],"name":"setOpenTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_c","type":"uint256"}],"name":"setSubTCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_c","type":"uint256"}],"name":"setSubWitCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_c","type":"uint256"}],"name":"setSubWitFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_c","type":"uint256"}],"name":"setTradeCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256","name":"_flag","type":"uint256"}],"name":"setWitnessFlag","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_c","type":"uint256"}],"name":"setWitnessHandleCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_c","type":"uint256"}],"name":"setWitnessHandleReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"setWitnessNeedCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"appealNo","type":"uint256"},{"internalType":"uint256","name":"orderNo","type":"uint256"},{"internalType":"address","name":"witness","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"mortgage","type":"uint256"},{"internalType":"uint256","name":"status","type":"uint256"},{"internalType":"uint256","name":"appealTime","type":"uint256"},{"internalType":"uint256","name":"witTakeTime","type":"uint256"},{"internalType":"uint256","name":"obTakeTime","type":"uint256"},{"components":[{"internalType":"address","name":"finalAppealAddr","type":"address"},{"internalType":"uint256","name":"updateTime","type":"uint256"},{"internalType":"string","name":"witnessReason","type":"string"},{"internalType":"uint256","name":"witnessAppealStatus","type":"uint256"},{"internalType":"string","name":"observerReason","type":"string"},{"internalType":"uint256","name":"witnessHandleTime","type":"uint256"},{"internalType":"uint256","name":"observerHandleTime","type":"uint256"},{"internalType":"address","name":"observerAddr","type":"address"},{"internalType":"uint256","name":"witnessHandleReward","type":"uint256"},{"internalType":"uint256","name":"observerHandleReward","type":"uint256"},{"internalType":"uint256","name":"witnessHandleCredit","type":"uint256"},{"internalType":"uint256","name":"observerHandleCredit","type":"uint256"},{"internalType":"uint256","name":"witReward","type":"uint256"},{"internalType":"uint256","name":"witSub","type":"uint256"},{"internalType":"uint256","name":"witCreditR","type":"uint256"},{"internalType":"uint256","name":"witCreditS","type":"uint256"}],"internalType":"struct AppealStorage.AppealDetail","name":"detail","type":"tuple"}],"internalType":"struct AppealStorage.Appeal","name":"_al","type":"tuple"},{"internalType":"uint256","name":"_amt","type":"uint256"},{"internalType":"uint256","name":"_t","type":"uint256"},{"internalType":"uint256","name":"_self","type":"uint256"}],"name":"subAvaAppeal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_orderNo","type":"uint256"},{"internalType":"address","name":"_addr","type":"address"}],"name":"subFrozenTotal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"subWitnessAvailable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_coinType","type":"string"},{"internalType":"uint256","name":"_amt","type":"uint256"}],"name":"tokenEscrow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"unApplyUnfrozen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"string","name":"","type":"string"}],"name":"unfrozenTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"string","name":"_coinType","type":"string"}],"name":"unfrozenTotalSearch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256","name":"_recordNo","type":"uint256"},{"internalType":"string","name":"_hash","type":"string"},{"internalType":"uint256","name":"_hostStatus","type":"uint256"}],"name":"updateInfo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"string","name":"","type":"string"}],"name":"withdrawingTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

608060405267016345785d8a00006003819055670de0b6b3a7640000600455678ac7230489e80000600555662386f26fc1000060068190556007829055601c6008556009819055600a808055600b91909155600c919091556001600d819055600e819055600f805460ff191690556010556011553480156200008057600080fd5b5060405162005fa638038062005fa6833981016040819052620000a3916200022c565b620000ae3362000193565b6001805560408051631554d11560e21b8152600260048083018290528351928390036024908101842080546001600160a01b038a81166001600160a01b031992831617909255635553444360e01b865292850184905285519485900390910184208054909216908716179055818301835260058252642ba6a7ab2960d91b60208301529151839291620001419162000276565b908152602001604051809103902060006101000a8154816001600160a01b0302191690836001600160a01b031602179055506200018a6016620001e360201b6200412e1760201c565b505050620002db565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8054620001f05761271081555b6001816000016000828254620002079190620002b4565b909155505050565b80516001600160a01b03811681146200022757600080fd5b919050565b6000806000606084860312156200024257600080fd5b6200024d846200020f565b92506200025d602085016200020f565b91506200026d604085016200020f565b90509250925092565b6000825160005b818110156200029957602081860181015185830152016200027d565b81811115620002a9576000828501525b509190910192915050565b60008219821115620002d657634e487b7160e01b600052601160045260246000fd5b500190565b615cbb80620002eb6000396000f3fe608060405234801561001057600080fd5b50600436106103f15760003560e01c80636951babe11610215578063c1db216411610125578063eb004fba116100b8578063f38aea0111610087578063f38aea0114610920578063f86af85f14610933578063f99cbd1c14610946578063fa47c7fa14610959578063fb9bb65f1461096c57600080fd5b8063eb004fba146108ea578063ed786add146108f2578063ed8aca8314610905578063f2fde38b1461090d57600080fd5b8063cabeaa00116100f4578063cabeaa001461089e578063cfa8363f146108b1578063e723b280146108c4578063e84cc314146108d757600080fd5b8063c1db216414610866578063c51ecdb31461087b578063c605373e14610883578063c941455c1461089657600080fd5b80638da5cb5b116101a857806396f084b81161017757806396f084b8146107db5780639e8bbbec14610804578063a29c47ad14610817578063b91b08381461082a578063c1ab245a1461083d57600080fd5b80638da5cb5b146107915780638e0a3a89146107a257806393719f21146107b55780639634ff6a146107c857600080fd5b8063724bcbb3116101e4578063724bcbb3146107275780637318be661461072f57806376ae8abb1461074257806379110a471461077e57600080fd5b80636951babe146106ef5780636a8b6b651461070f5780636dc0ee5514610717578063715018a61461071f57600080fd5b8063349f22861161031057806353fc0585116102a35780635c7cee63116102725780635c7cee63146106ae5780635ff2efad146106b65780636537598e146106c157806366cf90df146106c957806367c92589146106dc57600080fd5b806353fc05851461068357806358e5ed9b14610696578063592d86ae1461069e5780635bb76910146106a657600080fd5b806347b71fae116102df57806347b71fae1461062a5780634e23ea971461063d5780634e2489281461065057806351727c061461066357600080fd5b8063349f2286146105b5578063364ad7a4146105c8578063436b2ab4146105db5780634542567f1461061757600080fd5b806327c34aed116103885780632ecf32bc116103575780632ecf32bc146105405780632eefdb3d1461055357806332f02e1d1461058f57806334461067146105a257600080fd5b806327c34aed146104ff5780632ad8d015146105075780632d9217691461051a5780632df59adb1461052d57600080fd5b8063139cf2ff116103c4578063139cf2ff1461048d57806319da83a8146104a05780631b725770146104c9578063276cd3a5146104dc57600080fd5b806302147ac9146103f65780630989fc371461040b5780630a45ffae1461045a5780630bc67f9b14610462575b600080fd5b610409610404366004614ba2565b61097f565b005b610447610419366004614d46565b601c602090815260009283526040909220815180830184018051928152908401929093019190912091525481565b6040519081526020015b60405180910390f35b600354610447565b610475610470366004614d95565b610b42565b6040516001600160a01b039091168152602001610451565b61044761049b366004614d46565b610b80565b6104b36104ae366004614dc9565b610bbd565b6040516104519a99989796959493929190614e3e565b6104096104d7366004614eb4565b610d38565b6104ef6104ea366004614ee4565b61104d565b6040519015158152602001610451565b600e54610447565b610409610515366004615057565b611064565b610409610528366004614dc9565b611691565b61044761053b366004614d46565b6116c0565b61040961054e366004615196565b6116e6565b610447610561366004614d46565b601b602090815260009283526040909220815180830184018051928152908401929093019190912091525481565b61040961059d3660046151b8565b611723565b6104b36105b0366004614dc9565b611ab7565b6104476105c3366004614d46565b611ae9565b6104096105d6366004615210565b611b0f565b6104476105e9366004614d46565b601f602090815260009283526040909220815180830184018051928152908401929093019190912091525481565b610409610625366004614dc9565b612032565b610447610638366004615251565b612061565b61040961064b366004615297565b6120e3565b61040961065e366004614dc9565b612298565b610447610671366004614dc9565b60186020526000908152604090205481565b610409610691366004614dc9565b6122c7565b600654610447565b600754610447565b600454610447565b601054610447565b600f5460ff166104ef565b600554610447565b6104476106d7366004614dc9565b6122f6565b6104096106ea366004614dc9565b612626565b6107026106fd366004614dc9565b612655565b60405161045191906153d3565b600b54610447565b600954610447565b610409612856565b600854610447565b61040961073d3660046153e6565b61288c565b610447610750366004614d46565b601a602090815260009283526040909220815180830184018051928152908401929093019190912091525481565b61040961078c366004614dc9565b612920565b6000546001600160a01b0316610475565b6104096107b036600461548a565b61294f565b6104096107c3366004614dc9565b6129c0565b6104096107d6366004614dc9565b6129ef565b6104476107e93660046154e0565b6001600160a01b031660009081526012602052604090205490565b610409610812366004614dc9565b612a1e565b6104096108253660046154e0565b612a4d565b610409610838366004614dc9565b612c1b565b61044761084b3660046154e0565b6001600160a01b031660009081526013602052604090205490565b61086e612c4a565b60405161045191906154fd565b600c54610447565b6104096108913660046154e0565b612e2a565b601154610447565b6104096108ac366004614ba2565b613382565b6104096108bf366004614dc9565b61349b565b6104096108d2366004614dc9565b6134ca565b6104096108e5366004614dc9565b6134f9565b600a54610447565b61047561090036600461555f565b613528565b600d54610447565b61040961091b3660046154e0565b61355d565b61044761092e366004614d46565b6135f8565b610409610941366004614dc9565b61366e565b6104096109543660046155a0565b613d3e565b610447610967366004614d46565b6140d9565b61040961097a366004614dc9565b6140ff565b6000546001600160a01b031633146109b25760405162461bcd60e51b81526004016109a9906155e4565b60405180910390fd5b6001600160a01b03821660009081526012602052604090208190556001811415610ad8576001600160a01b0382166000908152601a602090815260408083208151808301835260058152642ba6a7ab2960d91b9381019390935290519091610a1991615619565b9081526020016040518091039020549050600454811015610a6e5760405162461bcd60e51b815260206004820152600f60248201526e0c6ded2dc40dcdee840cadcdeeaced608b1b60448201526064016109a9565b60145460405163d691fba560e01b81526001600160a01b039091169063d691fba590610aa1908690600190600401615635565b600060405180830381600087803b158015610abb57600080fd5b505af1158015610acf573d6000803e3d6000fd5b50505050505050565b60145460405163d691fba560e01b81526001600160a01b039091169063d691fba590610b0b908590600090600401615635565b600060405180830381600087803b158015610b2557600080fd5b505af1158015610b39573d6000803e3d6000fd5b505050505b5050565b600080600283604051610b559190615619565b908152604051908190036020019020546001600160a01b0316905080610b7a57600080fd5b92915050565b6001600160a01b0382166000908152601c60205260408082209051610ba6908490615619565b908152602001604051809103902054905092915050565b60198181548110610bcd57600080fd5b60009182526020909120600a90910201805460018201546002830180549294506001600160a01b039091169291610c039061564e565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2f9061564e565b8015610c7c5780601f10610c5157610100808354040283529160200191610c7c565b820191906000526020600020905b815481529060010190602001808311610c5f57829003601f168201915b505050505090806003018054610c919061564e565b80601f0160208091040260200160405190810160405280929190818152602001828054610cbd9061564e565b8015610d0a5780601f10610cdf57610100808354040283529160200191610d0a565b820191906000526020600020905b815481529060010190602001808311610ced57829003601f168201915b505050505090806004015490806005015490806006015490806007015490806008015490806009015490508a565b6021546001600160a01b0316610d605760405162461bcd60e51b81526004016109a990615689565b6022546001600160a01b0316610d885760405162461bcd60e51b81526004016109a9906156c0565b6023546001600160a01b0316610db05760405162461bcd60e51b81526004016109a9906156f7565b6024546001600160a01b0316610dd85760405162461bcd60e51b81526004016109a99061572e565b6023546001600160a01b0316331480610dfb57506024546001600160a01b031633145b610e175760405162461bcd60e51b81526004016109a990615765565b6015546040516362bb335f60e11b8152600481018490526000916001600160a01b03169063c57666be906024016000604051808303816000875af1158015610e63573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e8b9190810190615894565b9050600081602001511415610ece5760405162461bcd60e51b81526020600482015260096024820152681b9bdd08195e1a5cdd60ba1b60448201526064016109a9565b6101208101516020808201516040928301516001600160a01b038216600090815283805284812088825290935292909120549091908015610f0e57600080fd5b6001600160a01b0383166000908152601b60205260408082209051610f34908590615619565b90815260405190819003602001902054606086015190915080821015610f5957600080fd5b81610f648383614157565b1115610f6f57600080fd5b610f798282614157565b6001600160a01b0386166000908152601b6020526040908190209051610fa0908790615619565b9081526040805160209281900383019020929092556001600160a01b03871660009081528180528281208b8252909152908120829055610fdf85610b42565b60405163a9059cbb60e01b81529091506001600160a01b0382169063a9059cbb90611010908b908690600401615635565b600060405180830381600087803b15801561102a57600080fd5b505af115801561103e573d6000803e3d6000fd5b50505050505050505050505050565b600061105b8585858561416a565b95945050505050565b6021546001600160a01b031661108c5760405162461bcd60e51b81526004016109a990615689565b6022546001600160a01b03166110b45760405162461bcd60e51b81526004016109a9906156c0565b6023546001600160a01b03166110dc5760405162461bcd60e51b81526004016109a9906156f7565b6024546001600160a01b03166111045760405162461bcd60e51b81526004016109a99061572e565b6024546001600160a01b0316331461112e5760405162461bcd60e51b81526004016109a990615765565b600061115787604051806040016040528060058152602001642ba6a7ab2960d91b8152506140d9565b9050600080846001146111735786610160015160e00151611179565b86606001515b905085831061118a5785915061118e565b8291505b84600114801561119c575083155b806111cd57508460021480156111cd5750886001600160a01b0316876101600151600001516001600160a01b031614155b1561140f5761123a601a60008b6001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001642ba6a7ab2960d91b8152506040516112259190615619565b90815260200160405180910390205483614157565b601a60008b6001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001642ba6a7ab2960d91b81525060405161128a9190615619565b9081526040805160209281900383018120939093556001600160a01b038b166000908152601a8352819020838201825260058452642ba6a7ab2960d91b92840192909252516112f1926112dc91615619565b9081526020016040518091039020548361425c565b601a60008a6001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001642ba6a7ab2960d91b8152506040516113419190615619565b9081526020016040518091039020819055506113bb89601a60008c6001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001642ba6a7ab2960d91b8152506040516113a79190615619565b908152602001604051809103902054614268565b61140f88601a60008b6001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001642ba6a7ab2960d91b8152506040516113a79190615619565b611477601a6000836001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001642ba6a7ab2960d91b8152506040516114629190615619565b9081526020016040518091039020548761425c565b601a6000836001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001642ba6a7ab2960d91b8152506040516114c79190615619565b90815260200160405180910390208190555061152d81601a6000846001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001642ba6a7ab2960d91b8152506040516113a79190615619565b6115368961435e565b61153f8861435e565b6115488161435e565b601454604051639bd7417f60e01b81526001600160a01b0383811660048301526000921690639bd7417f90602401600060405180830381865afa158015611593573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115bb9190810190615a53565b905085600114156115e257600d548160a001516115d89190615b59565b60a0820152611603565b856002141561160357600e548160a001516115fd9190615b59565b60a08201525b60e081015160145460a08301516040516316a1e96960e31b81526001600160a01b0386811660048301528451602483015260208501516044830152606482019290925291169063b50f4b4890608401600060405180830381600087803b15801561166c57600080fd5b505af1158015611680573d6000803e3d6000fd5b505050505050505050505050505050565b6000546001600160a01b031633146116bb5760405162461bcd60e51b81526004016109a9906155e4565b600b55565b6001600160a01b0382166000908152601f60205260408082209051610ba6908490615619565b6000546001600160a01b031633146117105760405162461bcd60e51b81526004016109a9906155e4565b600f805460ff1916911515919091179055565b6021546001600160a01b031661174b5760405162461bcd60e51b81526004016109a990615689565b6022546001600160a01b03166117735760405162461bcd60e51b81526004016109a9906156c0565b6023546001600160a01b031661179b5760405162461bcd60e51b81526004016109a9906156f7565b6024546001600160a01b03166117c35760405162461bcd60e51b81526004016109a99061572e565b6022546001600160a01b03163314806117e657506023546001600160a01b031633145b6118245760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b60448201526064016109a9565b6000811161185e5760405162461bcd60e51b81526020600482015260076024820152661a5b9d985b1a5960ca1b60448201526064016109a9565b600061186a8330612061565b9050818110156118a95760405162461bcd60e51b815260206004820152600a6024820152690dcdee840cadcdeeaced60b31b60448201526064016109a9565b6001600160a01b0384166000908152601b60205260409081902090518391906118d3908690615619565b908152602001604051809103902054101561191f5760405162461bcd60e51b815260206004820152600c60248201526b1a5b9cdd59999a58da595b9d60a21b60448201526064016109a9565b6001600160a01b0384166000908152601b6020526040908190209051611946908590615619565b9081526020016040518091039020546119a0601b6000876001600160a01b03166001600160a01b031681526020019081526020016000208560405161198b9190615619565b90815260200160405180910390205484614157565b11156119df5760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b60448201526064016109a9565b6001600160a01b0384166000908152601b6020526040908190209051611a0b9190611225908690615619565b6001600160a01b0385166000908152601b6020526040908190209051611a32908690615619565b908152604051908190036020019020556000611a4d84610b42565b60405163a9059cbb60e01b81529091506001600160a01b0382169063a9059cbb90611a7e9088908790600401615635565b600060405180830381600087803b158015611a9857600080fd5b505af1158015611aac573d6000803e3d6000fd5b505050505050505050565b60176020526000908152604090208054600182015460028301805492936001600160a01b0390921692610c039061564e565b6001600160a01b0382166000908152601b60205260408082209051610ba6908490615619565b6000546001600160a01b03163314611b395760405162461bcd60e51b81526004016109a9906155e4565b6001600160a01b03831615801590611b5957506001600160a01b03821615155b611b6257600080fd5b601454604051639bd7417f60e01b81526001600160a01b0385811660048301526000921690639bd7417f90602401600060405180830381865afa158015611bad573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611bd59190810190615a53565b9050806080015160011480611bee575080608001516002145b611c295760405162461bcd60e51b815260206004820152600c60248201526b0c6c2dc4ee840e0eadcd2e6d60a31b60448201526064016109a9565b6001600160a01b0384166000908152601a602090815260408083208151808301835260058152642ba6a7ab2960d91b9381019390935290519091611c6c91615619565b90815260200160405180910390205490506000601a6000866001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001642ba6a7ab2960d91b815250604051611ccf9190615619565b9081526020016040518091039020549050838210611dc057611cf18285614157565b601a6000886001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001642ba6a7ab2960d91b815250604051611d419190615619565b90815260405190819003602001902055611d5b818561425c565b601a6000876001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001642ba6a7ab2960d91b815250604051611dab9190615619565b90815260405190819003602001902055612020565b6001600160a01b0386166000908152601a602090815260408083208151808301835260058152642ba6a7ab2960d91b9381019390935290519091611e0391615619565b9081526040805160209281900383018120939093556001600160a01b0389166000908152601f8352818120848301835260058552642ba6a7ab2960d91b9385019390935290519092611e5491615619565b908152602001604051809103902054905084611e70848361425c565b10611f5757611e8881611e838786614157565b614157565b601f6000896001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001642ba6a7ab2960d91b815250604051611ed89190615619565b90815260405190819003602001902055611ef2828661425c565b601a6000886001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001642ba6a7ab2960d91b815250604051611f429190615619565b9081526040519081900360200190205561201e565b6001600160a01b0387166000908152601f602090815260408083208151808301835260058152642ba6a7ab2960d91b9381019390935290519091611f9a91615619565b90815260405190819003602001902055611fbd82611fb8858461425c565b61425c565b601a6000886001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001642ba6a7ab2960d91b81525060405161200d9190615619565b908152604051908190036020019020555b505b6120298661435e565b610b398561435e565b6000546001600160a01b0316331461205c5760405162461bcd60e51b81526004016109a9906155e4565b601055565b60008061206d84610b42565b6040516370a0823160e01b81526001600160a01b038581166004830152919250908216906370a0823190602401602060405180830381865afa1580156120b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120db9190615b71565b949350505050565b6021546001600160a01b031661210b5760405162461bcd60e51b81526004016109a990615689565b6022546001600160a01b03166121335760405162461bcd60e51b81526004016109a9906156c0565b6023546001600160a01b031661215b5760405162461bcd60e51b81526004016109a9906156f7565b6024546001600160a01b03166121835760405162461bcd60e51b81526004016109a99061572e565b6022546001600160a01b03163314806121a657506023546001600160a01b031633145b6122075760405162461bcd60e51b815260206004820152602c60248201527f5265646f63726453746f726167653a496e76616c69642066726f6d20636f6e7460448201526b72616374206164647265737360a01b60648201526084016109a9565b6001600160a01b0387166000908152601b60205260409081902090516122489190612233908890615619565b9081526020016040518091039020548561425c565b6001600160a01b0388166000908152601b602052604090819020905161226f908890615619565b9081526040519081900360200190205561228e8787878787878761460e565b5050505050505050565b6000546001600160a01b031633146122c25760405162461bcd60e51b81526004016109a9906155e4565b600c55565b6000546001600160a01b031633146122f15760405162461bcd60e51b81526004016109a9906155e4565b600955565b600080821161230457600080fd5b336000908152601a60209081526040918290208251808401845260058152642ba6a7ab2960d91b92810192909252915184929161234091615619565b908152602001604051809103902054101561238e5760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b60448201526064016109a9565b336000908152601a60209081526040918290208251808401845260058152642ba6a7ab2960d91b9281019290925291516123c89190615619565b90815260408051918290036020908101832054336000908152601a8352839020848401845260058552642ba6a7ab2960d91b92850192909252915191926124139261198b9190615619565b106124535760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b21030b6b7bab73a101960811b60448201526064016109a9565b336000818152601d602090815260408083204290819055601e83528184209084528252808320869055928252601a8152908290208251808401845260058152642ba6a7ab2960d91b9281019290925291516124b2929161122591615619565b336000908152601a60209081526040918290208251808401845260058152642ba6a7ab2960d91b9281019290925291516124ec9190615619565b908152604080516020928190038301812093909355336000908152601f8352819020838201825260058452642ba6a7ab2960d91b9284019290925251612535926112dc91615619565b336000908152601f60209081526040918290208251808401845260058152642ba6a7ab2960d91b92810192909252915161256f9190615619565b908152604051908190036020019020556125883361435e565b6125c53360405180602001604052806000815250604051806040016040528060058152602001642ba6a7ab2960d91b81525085600380600261460e565b507f072538e3c57d574904a160b874c45b7e7fd3c8ed28ab3f872a942edfd852e6d733836040516125f7929190615635565b60405180910390a1610b7a33604051806040016040528060058152602001642ba6a7ab2960d91b8152506140d9565b6000546001600160a01b031633146126505760405162461bcd60e51b81526004016109a9906155e4565b600355565b6126b46040518061014001604052806000815260200160006001600160a01b0316815260200160608152602001606081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6000828152601760209081526040918290208251610140810184528154815260018201546001600160a01b03169281019290925260028101805492939192918401916126ff9061564e565b80601f016020809104026020016040519081016040528092919081815260200182805461272b9061564e565b80156127785780601f1061274d57610100808354040283529160200191612778565b820191906000526020600020905b81548152906001019060200180831161275b57829003601f168201915b505050505081526020016003820180546127919061564e565b80601f01602080910402602001604051908101604052809291908181526020018280546127bd9061564e565b801561280a5780601f106127df5761010080835404028352916020019161280a565b820191906000526020600020905b8154815290600101906020018083116127ed57829003601f168201915b5050505050815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820154815250509050919050565b6000546001600160a01b031633146128805760405162461bcd60e51b81526004016109a9906155e4565b61288a6000614a94565b565b6000546001600160a01b031633146128b65760405162461bcd60e51b81526004016109a9906155e4565b602180546001600160a01b03199081166001600160a01b039687169081179092556022805482169587169590951790945560238054851693861693841790556024805485169290951691909117909355601480548316909317909255601580549091169091179055565b6000546001600160a01b0316331461294a5760405162461bcd60e51b81526004016109a9906155e4565b600655565b6000546001600160a01b031633146129795760405162461bcd60e51b81526004016109a9906155e4565b806002848460405161298c929190615b8a565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b0319909216919091179055505050565b6000546001600160a01b031633146129ea5760405162461bcd60e51b81526004016109a9906155e4565b600455565b6000546001600160a01b03163314612a195760405162461bcd60e51b81526004016109a9906155e4565b600755565b6000546001600160a01b03163314612a485760405162461bcd60e51b81526004016109a9906155e4565b600555565b6000546001600160a01b03163314612a775760405162461bcd60e51b81526004016109a9906155e4565b6001600160a01b0381166000908152601f602090815260408083208151808301835260058152642ba6a7ab2960d91b9381019390935290519091612aba91615619565b908152602001604051809103902054905060008111612b085760405162461bcd60e51b815260206004820152600a6024820152691cdd59999a58da595b9d60b21b60448201526064016109a9565b6001600160a01b0382166000908152601f602090815260408083208151808301835260058152642ba6a7ab2960d91b9381019390935290519091612b4b91615619565b9081526040805160209281900383018120939093556001600160a01b0385166000908152601a8352819020838201825260058452642ba6a7ab2960d91b9284019290925251612bb292612b9d91615619565b9081526020016040518091039020548261425c565b601a6000846001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001642ba6a7ab2960d91b815250604051612c029190615619565b90815260405190819003602001902055610b3e8261435e565b6000546001600160a01b03163314612c455760405162461bcd60e51b81526004016109a9906155e4565b601155565b60606019805480602002602001604051908101604052809291908181526020016000905b82821015612e215760008481526020908190206040805161014081018252600a86029092018054835260018101546001600160a01b03169383019390935260028301805492939291840191612cc29061564e565b80601f0160208091040260200160405190810160405280929190818152602001828054612cee9061564e565b8015612d3b5780601f10612d1057610100808354040283529160200191612d3b565b820191906000526020600020905b815481529060010190602001808311612d1e57829003601f168201915b50505050508152602001600382018054612d549061564e565b80601f0160208091040260200160405190810160405280929190818152602001828054612d809061564e565b8015612dcd5780601f10612da257610100808354040283529160200191612dcd565b820191906000526020600020905b815481529060010190602001808311612db057829003601f168201915b50505050508152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152505081526020019060010190612c6e565b50505050905090565b6021546001600160a01b0316612e525760405162461bcd60e51b81526004016109a990615689565b6022546001600160a01b0316612e7a5760405162461bcd60e51b81526004016109a9906156c0565b6023546001600160a01b0316612ea25760405162461bcd60e51b81526004016109a9906156f7565b6024546001600160a01b0316612eca5760405162461bcd60e51b81526004016109a99061572e565b6024546001600160a01b03163314612ef45760405162461bcd60e51b81526004016109a990615765565b6001600160a01b038116612f395760405162461bcd60e51b815260206004820152600c60248201526b1859191c995cdcc81b9d5b1b60a21b60448201526064016109a9565b6001600160a01b0381166000908152601a602090815260408083208151808301835260058152642ba6a7ab2960d91b9381019390935290519091612f7c91615619565b9081526020016040518091039020549050600080600954831061300d576009549150612fa88383614157565b601a6000866001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001642ba6a7ab2960d91b815250604051612ff89190615619565b908152604051908190036020019020556131b5565b6001600160a01b0384166000908152601a602090815260408083208151808301835260058152642ba6a7ab2960d91b938101939093529051909161305091615619565b9081526040805160209281900383018120939093556001600160a01b0387166000908152601f8352818120848301835260058552642ba6a7ab2960d91b93850193909352905190926130a191615619565b90815260200160405180910390205490506009546130bf858361425c565b106131445760095492506130d38385614157565b91506130df8183614157565b601f6000876001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001642ba6a7ab2960d91b81525060405161312f9190615619565b908152604051908190036020019020556131b3565b61314e818561425c565b92506000601f6000876001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001642ba6a7ab2960d91b8152506040516131a29190615619565b908152604051908190036020019020555b505b6131be8461435e565b601454604051639bd7417f60e01b81526001600160a01b0386811660048301526000921690639bd7417f90602401600060405180830381865afa158015613209573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526132319190810190615a53565b9050600a548160a00151101561324857600061325a565b600a548160a0015161325a9190615b9a565b60a0820181905260e08201516014546040516316a1e96960e31b81526001600160a01b038981166004830152835160248301526020840151604483015260648201949094529192169063b50f4b4890608401600060405180830381600087803b1580156132c657600080fd5b505af11580156132da573d6000803e3d6000fd5b505050506000613306604051806040016040528060058152602001642ba6a7ab2960d91b815250610b42565b9050806001600160a01b031663a9059cbb6133296000546001600160a01b031690565b876040518363ffffffff1660e01b8152600401613347929190615635565b600060405180830381600087803b15801561336157600080fd5b505af1158015613375573d6000803e3d6000fd5b5050505050505050505050565b6000546001600160a01b031633146133ac5760405162461bcd60e51b81526004016109a9906155e4565b6001600160a01b03821660009081526013602052604090208190556001811415610ad8576001600160a01b0382166000908152601a602090815260408083208151808301835260058152642ba6a7ab2960d91b938101939093529051909161341391615619565b90815260200160405180910390205490506005548110156134685760405162461bcd60e51b815260206004820152600f60248201526e0c6ded2dc40dcdee840cadcdeeaced608b1b60448201526064016109a9565b60145460405163d691fba560e01b81526001600160a01b039091169063d691fba590610aa1908690600290600401615635565b6000546001600160a01b031633146134c55760405162461bcd60e51b81526004016109a9906155e4565b600a55565b6000546001600160a01b031633146134f45760405162461bcd60e51b81526004016109a9906155e4565b600855565b6000546001600160a01b031633146135235760405162461bcd60e51b81526004016109a9906155e4565b600e55565b60006002838360405161353c929190615b8a565b908152604051908190036020019020546001600160a01b0316905092915050565b6000546001600160a01b031633146135875760405162461bcd60e51b81526004016109a9906155e4565b6001600160a01b0381166135ec5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109a9565b6135f581614a94565b50565b60006001600160a01b0383166136475760405162461bcd60e51b81526020600482015260146024820152731d5cd95c881859191c995cdcc81a5cc81b9d5b1b60621b60448201526064016109a9565b6001600160a01b0383166000908152601c6020526040908190209051610ba6908490615619565b60008181526017602090815260408083208151610140810183528154815260018201546001600160a01b03169381019390935260028101805491928401916136b59061564e565b80601f01602080910402602001604051908101604052809291908181526020018280546136e19061564e565b801561372e5780601f106137035761010080835404028352916020019161372e565b820191906000526020600020905b81548152906001019060200180831161371157829003601f168201915b505050505081526020016003820180546137479061564e565b80601f01602080910402602001604051908101604052809291908181526020018280546137739061564e565b80156137c05780601f10613795576101008083540402835291602001916137c0565b820191906000526020600020905b8154815290600101906020018083116137a357829003601f168201915b505050918352505060048201546020820152600582015460408201526006820154606082015260078201546080820152600882015460a082015260099091015460c090910152805190915061384a5760405162461bcd60e51b815260206004820152601060248201526f1c9958dbdc99081b9bdd08195e1a5cdd60821b60448201526064016109a9565b60208101516001600160a01b0316331461389e5760405162461bcd60e51b81526020600482015260156024820152741c9958dbdc99081d5cd95c881b9bdd08195e1a5cdd605a1b60448201526064016109a9565b8060a001516003146138e15760405162461bcd60e51b815260206004820152600c60248201526b39ba30ba3ab99032b93937b960a11b60448201526064016109a9565b6080810151336000908152601f60209081526040918290208251808401845260058152642ba6a7ab2960d91b9281019290925291516139209190615619565b908152602001604051809103902054101561396a5760405162461bcd60e51b815260206004820152600a6024820152691cdd59999a58da595b9d60b21b60448201526064016109a9565b60085461397a9062015180615bb1565b81610100015161398a9190615b59565b4210156139ca5760405162461bcd60e51b815260206004820152600e60248201526d63616e277420776974686472617760901b60448201526064016109a9565b336000908152601f60209081526040918290208251808401845260058152642ba6a7ab2960d91b928101929092529151613a219291613a0891615619565b9081526020016040518091039020548260800151614157565b336000908152601f60209081526040918290208251808401845260058152642ba6a7ab2960d91b928101929092529151613a5b9190615619565b908152604080516020928190038301812093909355336000908152601c8352819020838201825260058452642ba6a7ab2960d91b9284019290925251613abd92613aa491615619565b908152602001604051809103902054826080015161425c565b336000908152601c60209081526040918290208251808401845260058152642ba6a7ab2960d91b928101929092529151613af79190615619565b908152604080516020928190038301902092909255600460a08401524261012084015260008481526017825282902083518155838201516001820180546001600160a01b0319166001600160a01b03909216919091179055918301518051849392613b69926002850192910190614ae4565b5060608201518051613b85916003840191602090910190614ae4565b506080820151600482015560a0820151600582015560c0820151600682015560e08201516007820155610100820151600882015561012090910151600990910155600082815260186020526040902054601980548392908110613bea57613bea615bd0565b60009182526020918290208351600a9290920201908155828201516001820180546001600160a01b0319166001600160a01b03909216919091179055604083015180519192613c4192600285019290910190614ae4565b5060608201518051613c5d916003840191602090910190614ae4565b506080820151816004015560a0820151816005015560c0820151816006015560e08201518160070155610100820151816008015561012082015181600901559050507f184981d19cd827a29527d9fef87fd7973eb4f43f9833af36578f456bed5fa19a338383604001516004604051613cd99493929190615be6565b60405180910390a16000613d09604051806040016040528060058152602001642ba6a7ab2960d91b815250610b42565b608083015160405163a9059cbb60e01b81529192506001600160a01b0383169163a9059cbb91610aa191339190600401615635565b60008111613d785760405162461bcd60e51b81526020600482015260076024820152661a5b9d985b1a5960ca1b60448201526064016109a9565b336000908152601a6020526040908190209051613d96908490615619565b90815260200160405180910390205481601a6000336001600160a01b03166001600160a01b0316815260200190815260200160002084604051613dd99190615619565b908152602001604051809103902054613df29190615b59565b11613e3f5760405162461bcd60e51b815260206004820152601760248201527f496e76616c6964207472616e7366657220616d6f756e7400000000000000000060448201526064016109a9565b336000908152601a6020526040908190209051613e629190612b9d908590615619565b336000908152601a6020526040908190209051613e80908590615619565b90815260408051918290036020908101832093909355818101815260058252642ba6a7ab2960d91b8284015251600192613ebb929101615619565b6040516020818303038152906040528051906020012083604051602001613ee29190615619565b6040516020818303038152906040528051906020012014156140475750601454604051639bd7417f60e01b81523360048201526002916000916001600160a01b0390911690639bd7417f90602401600060405180830381865afa158015613f4d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613f759190810190615a53565b336000818152601a6020526040908190209051929350613f9a926113a7908890615619565b6080810151158015613fda5750600354336000908152601a6020526040908190209051613fc8908790615619565b90815260200160405180910390205410155b156140455760145460405163d691fba560e01b81526001600160a01b039091169063d691fba590614012903390600390600401615635565b600060405180830381600087803b15801561402c57600080fd5b505af1158015614040573d6000803e3d6000fd5b505050505b505b61406733604051806020016040528060008152508585600286600161460e565b50600061407384610b42565b6040516323b872dd60e01b8152336004820152306024820152604481018590529091506001600160a01b038216906323b872dd906064015b600060405180830381600087803b1580156140c557600080fd5b505af115801561228e573d6000803e3d6000fd5b6001600160a01b0382166000908152601a60205260408082209051610ba6908490615619565b6000546001600160a01b031633146141295760405162461bcd60e51b81526004016109a9906155e4565b600d55565b805461413a5761271081555b600181600001600082825461414f9190615b59565b909155505050565b60006141638284615b9a565b9392505050565b600083815260176020526040812060018101546001600160a01b0387811691161461419457600080fd5b82600114806141a35750826002145b6141e05760405162461bcd60e51b815260206004820152600e60248201526d696e76616c69642073746174757360901b60448201526064016109a9565b82156141ee57600581018390555b83511561420c57835161420a9060028301906020870190614ae4565b505b4260098201556040517f184981d19cd827a29527d9fef87fd7973eb4f43f9833af36578f456bed5fa19a90614248908890889088908890615be6565b60405180910390a150600195945050505050565b60006141638284615b59565b601454604051639bd7417f60e01b81526001600160a01b0384811660048301526000921690639bd7417f90602401600060405180830381865afa1580156142b3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526142db9190810190615a53565b61010081015183815260145460408051630ee685c760e41b81526001600160a01b038881166004830152845160248301526020850151604483015291840151606482015260608401516084820152608084015160a482015260a084015160c482015260c084015160e4820152939450919291169063ee685c7090610104016140ab565b6001600160a01b0381166000908152601a602090815260408083208151808301835260058152642ba6a7ab2960d91b93810193909352905190916143a191615619565b90815260405190819003602001812054601454639bd7417f60e01b83526001600160a01b038581166004850152919350600092911690639bd7417f90602401600060405180830381865afa1580156143fd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526144259190810190615a53565b90506144318383614268565b80608001516002148015614446575060055482105b801561445457506003548210155b156144bf5760145460405163d691fba560e01b81526001600160a01b039091169063d691fba59061448c908690600390600401615635565b600060405180830381600087803b1580156144a657600080fd5b505af11580156144ba573d6000803e3d6000fd5b505050505b806080015160011480156144d4575060045482105b80156144e257506003548210155b1561454d5760145460405163d691fba560e01b81526001600160a01b039091169063d691fba59061451a908690600390600401615635565b600060405180830381600087803b15801561453457600080fd5b505af1158015614548573d6000803e3d6000fd5b505050505b608081015115801561456157506003548210155b156145cc5760145460405163d691fba560e01b81526001600160a01b039091169063d691fba590614599908690600390600401615635565b600060405180830381600087803b1580156145b357600080fd5b505af11580156145c7573d6000803e3d6000fd5b505050505b6003548210156146095760145460405163d691fba560e01b81526001600160a01b039091169063d691fba590610aa1908690600090600401615635565b505050565b6000600260015414156146635760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109a9565b60026001556001600160a01b0388166146ad5760405162461bcd60e51b815260206004820152600c60248201526b1859191c995cdcc81b9d5b1b60a21b60448201526064016109a9565b85516146eb5760405162461bcd60e51b815260206004820152600d60248201526c18dbda5b951e5c19481b9d5b1b609a1b60448201526064016109a9565b846147295760405162461bcd60e51b815260206004820152600e60248201526d1a1bdcdd10dbdd5b9d081b9d5b1b60921b60448201526064016109a9565b826147665760405162461bcd60e51b815260206004820152600d60248201526c1a1bdcdd151e5c19481b9d5b1b609a1b60448201526064016109a9565b816147a85760405162461bcd60e51b81526020600482015260126024820152711a1bdcdd111a5c9958dd1a5bdb881b9d5b1b60721b60448201526064016109a9565b60006147b360165490565b600081815260176020526040902054909150156148005760405162461bcd60e51b815260206004820152600b60248201526a1bdc99195c88195e1a5cdd60aa1b60448201526064016109a9565b60408051610140810182528281526001600160a01b038b811660208084019182528385018d8152606085018d9052608085018c905260a085018b905260c085018a905260e08501899052426101008601526000610120860181905287815260178352959095208451815591516001830180546001600160a01b03191691909416179092559251805192938493909261489f926002850192910190614ae4565b50606082015180516148bb916003840191602090910190614ae4565b506080820151600482015560a0820151600582015560c0820151600682015560e082015160078201556101008201516008820155610120909101516009909101556019805460018101825560009190915281517f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c9695600a9092029182019081556020808401517f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c9696840180546001600160a01b0319166001600160a01b039092169190911790556040840151805185946149b9937f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c9697909101920190614ae4565b50606082015180516149d5916003840191602090910190614ae4565b506080820151600482015560a0820151600582015560c0820151600682015560e08201516007820155610100820151600882015561012090910151600990910155601954614a2590600190615b9a565b600083815260186020526040902055614a3e601661412e565b7f400817122268a69f3472a92a1ec2769f27f068026b377eaeb64f6cbe0bca7a51828b8b8b8b8b8b8b604051614a7b989796959493929190615c1e565b60405180910390a1506001805598975050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054614af09061564e565b90600052602060002090601f016020900481019282614b125760008555614b58565b82601f10614b2b57805160ff1916838001178555614b58565b82800160010185558215614b58579182015b82811115614b58578251825591602001919060010190614b3d565b50614b64929150614b68565b5090565b5b80821115614b645760008155600101614b69565b6001600160a01b03811681146135f557600080fd5b8035614b9d81614b7d565b919050565b60008060408385031215614bb557600080fd5b8235614bc081614b7d565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b60405161020081016001600160401b0381118282101715614c0757614c07614bce565b60405290565b60405161018081016001600160401b0381118282101715614c0757614c07614bce565b60405161010081016001600160401b0381118282101715614c0757614c07614bce565b60405161014081016001600160401b0381118282101715614c0757614c07614bce565b60405161012081016001600160401b0381118282101715614c0757614c07614bce565b604051601f8201601f191681016001600160401b0381118282101715614cc157614cc1614bce565b604052919050565b60006001600160401b03821115614ce257614ce2614bce565b50601f01601f191660200190565b600082601f830112614d0157600080fd5b8135614d14614d0f82614cc9565b614c99565b818152846020838601011115614d2957600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215614d5957600080fd5b8235614d6481614b7d565b915060208301356001600160401b03811115614d7f57600080fd5b614d8b85828601614cf0565b9150509250929050565b600060208284031215614da757600080fd5b81356001600160401b03811115614dbd57600080fd5b6120db84828501614cf0565b600060208284031215614ddb57600080fd5b5035919050565b60005b83811015614dfd578181015183820152602001614de5565b83811115614e0c576000848401525b50505050565b60008151808452614e2a816020860160208601614de2565b601f01601f19169290920160200192915050565b8a81526001600160a01b038a16602082015261014060408201819052600090614e698382018c614e12565b90508281036060840152614e7d818b614e12565b6080840199909952505060a081019590955260c085019390935260e084019190915261010083015261012090910152949350505050565b60008060408385031215614ec757600080fd5b823591506020830135614ed981614b7d565b809150509250929050565b60008060008060808587031215614efa57600080fd5b8435614f0581614b7d565b93506020850135925060408501356001600160401b03811115614f2757600080fd5b614f3387828801614cf0565b949793965093946060013593505050565b60006102008284031215614f5757600080fd5b614f5f614be4565b9050614f6a82614b92565b81526020820135602082015260408201356001600160401b0380821115614f9057600080fd5b614f9c85838601614cf0565b6040840152606084013560608401526080840135915080821115614fbf57600080fd5b50614fcc84828501614cf0565b60808301525060a082013560a082015260c082013560c0820152614ff260e08301614b92565b60e0820152610100828101359082015261012080830135908201526101408083013590820152610160808301359082015261018080830135908201526101a080830135908201526101c080830135908201526101e09182013591810191909152919050565b60008060008060008060c0878903121561507057600080fd5b863561507b81614b7d565b9550602087013561508b81614b7d565b945060408701356001600160401b03808211156150a757600080fd5b90880190610180828b0312156150bc57600080fd5b6150c4614c0d565b6150cd83614b92565b815260208301356020820152604083013560408201526150ef60608401614b92565b606082015261510060808401614b92565b608082015261511160a08401614b92565b60a082015260c0838101359082015260e08084013590820152610100808401359082015261012080840135908201526101408084013590820152610160808401358381111561515f57600080fd5b61516b8d828701614f44565b828401525050809650505050606087013592506080870135915060a087013590509295509295509295565b6000602082840312156151a857600080fd5b8135801515811461416357600080fd5b6000806000606084860312156151cd57600080fd5b83356151d881614b7d565b925060208401356001600160401b038111156151f357600080fd5b6151ff86828701614cf0565b925050604084013590509250925092565b60008060006060848603121561522557600080fd5b833561523081614b7d565b9250602084013561524081614b7d565b929592945050506040919091013590565b6000806040838503121561526457600080fd5b82356001600160401b0381111561527a57600080fd5b61528685828601614cf0565b9250506020830135614ed981614b7d565b600080600080600080600060e0888a0312156152b257600080fd5b87356152bd81614b7d565b965060208801356001600160401b03808211156152d957600080fd5b6152e58b838c01614cf0565b975060408a01359150808211156152fb57600080fd5b506153088a828b01614cf0565b979a96995096976060810135975060808101359660a0820135965060c090910135945092505050565b600061014082518452602083015161535460208601826001600160a01b03169052565b50604083015181604086015261536c82860182614e12565b915050606083015184820360608601526153868282614e12565b9150506080830151608085015260a083015160a085015260c083015160c085015260e083015160e08501526101008084015181860152506101208084015181860152508091505092915050565b6020815260006141636020830184615331565b600080600080608085870312156153fc57600080fd5b843561540781614b7d565b9350602085013561541781614b7d565b9250604085013561542781614b7d565b9150606085013561543781614b7d565b939692955090935050565b60008083601f84011261545457600080fd5b5081356001600160401b0381111561546b57600080fd5b60208301915083602082850101111561548357600080fd5b9250929050565b60008060006040848603121561549f57600080fd5b83356001600160401b038111156154b557600080fd5b6154c186828701615442565b90945092505060208401356154d581614b7d565b809150509250925092565b6000602082840312156154f257600080fd5b813561416381614b7d565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561555257603f19888603018452615540858351615331565b94509285019290850190600101615524565b5092979650505050505050565b6000806020838503121561557257600080fd5b82356001600160401b0381111561558857600080fd5b61559485828601615442565b90969095509350505050565b600080604083850312156155b357600080fd5b82356001600160401b038111156155c957600080fd5b6155d585828601614cf0565b95602094909401359450505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000825161562b818460208701614de2565b9190910192915050565b6001600160a01b03929092168252602082015260400190565b600181811c9082168061566257607f821691505b6020821081141561568357634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526019908201527f496e76616c696420616464726573732063616c6c207573657200000000000000604082015260600190565b60208082526019908201527f496e76616c696420616464726573732063616c6c207265737400000000000000604082015260600190565b6020808252601a908201527f496e76616c696420616464726573732063616c6c206f72646572000000000000604082015260600190565b6020808252601b908201527f496e76616c696420616464726573732063616c6c2061707065616c0000000000604082015260600190565b6020808252600c908201526b125b9d985b1a590818d85b1b60a21b604082015260600190565b8051614b9d81614b7d565b600082601f8301126157a757600080fd5b81516157b5614d0f82614cc9565b8181528460208386010111156157ca57600080fd5b6120db826020830160208701614de2565b600061010082840312156157ee57600080fd5b6157f6614c30565b90506158018261578b565b815261580f6020830161578b565b602082015260408201516001600160401b038082111561582e57600080fd5b61583a85838601615796565b6040840152606084015160608401526080840151608084015260a084015160a084015260c084015191508082111561587157600080fd5b5061587e84828501615796565b60c08301525060e082015160e082015292915050565b6000602082840312156158a657600080fd5b81516001600160401b03808211156158bd57600080fd5b9083019061014082860312156158d257600080fd5b6158da614c53565b6158e38361578b565b81526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c08301518281111561592957600080fd5b61593587828601615796565b60c08301525060e083015160e0820152610100808401518183015250610120808401518381111561596557600080fd5b615971888287016157db565b918301919091525095945050505050565b60006040828403121561599457600080fd5b604051604081018181106001600160401b03821117156159b6576159b6614bce565b604052825181526020928301519281019290925250919050565b600060e082840312156159e257600080fd5b60405160e081018181106001600160401b0382111715615a0457615a04614bce565b8060405250809150825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c08201525092915050565b600060208284031215615a6557600080fd5b81516001600160401b0380821115615a7c57600080fd5b908301906102008286031215615a9157600080fd5b615a99614c76565b615aa28361578b565b8152602083015182811115615ab657600080fd5b615ac287828601615796565b602083015250604083015182811115615ada57600080fd5b615ae687828601615796565b604083015250606083015160608201526080830151608082015260a083015160a082015260c083015160c0820152615b218660e08501615982565b60e0820152615b348661012085016159d0565b61010082015295945050505050565b634e487b7160e01b600052601160045260246000fd5b60008219821115615b6c57615b6c615b43565b500190565b600060208284031215615b8357600080fd5b5051919050565b8183823760009101908152919050565b600082821015615bac57615bac615b43565b500390565b6000816000190483118215151615615bcb57615bcb615b43565b500290565b634e487b7160e01b600052603260045260246000fd5b60018060a01b0385168152836020820152608060408201526000615c0d6080830185614e12565b905082606083015295945050505050565b8881526001600160a01b038816602082015261010060408201819052600090615c498382018a614e12565b90508281036060840152615c5d8189614e12565b9150508560808301528460a08301528360c08301528260e0830152999850505050505050505056fea2646970667358221220cac9189fe83a6c568dfe6bd2aa0cc53f5a8febb768e12bf3014bd22739ae029664736f6c634300080b0033000000000000000000000000b44a9b6905af7c801311e8f4e76932ee959c663c000000000000000000000000e3f5a90f9cb311505cd691a46596599aa1a0ad7d00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a

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

000000000000000000000000b44a9b6905af7c801311e8f4e76932ee959c663c000000000000000000000000e3f5a90f9cb311505cd691a46596599aa1a0ad7d00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a

-----Decoded View---------------
Arg [0] : _usdtAddress (address): 0xb44a9b6905af7c801311e8f4e76932ee959c663c
Arg [1] : _usdcAddress (address): 0xe3f5a90f9cb311505cd691a46596599aa1a0ad7d
Arg [2] : _coinAddress (address): 0x98878b06940ae243284ca214f92bb71a2b032b8a

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000b44a9b6905af7c801311e8f4e76932ee959c663c
Arg [1] : 000000000000000000000000e3f5a90f9cb311505cd691a46596599aa1a0ad7d
Arg [2] : 00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a


Deployed ByteCode Sourcemap

1602:25026:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2495:395;;;;;;:::i;:::-;;:::i;:::-;;9075:67;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3590:25:6;;;3578:2;3563:18;9075:67:3;;;;;;;;4001:103;4080:17;;4001:103;;9723:321;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;4139:32:6;;;4121:51;;4109:2;4094:18;9723:321:3;3953:225:6;24835:181:3;;;;;;:::i;:::-;;:::i;8895:26::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;:::i;16129:1069::-;;;;;;:::i;:::-;;:::i;26125:231::-;;;;;;:::i;:::-;;:::i;:::-;;;7097:14:6;;7090:22;7072:41;;7060:2;7045:18;26125:231:3;6932:187:6;6338:109:3;6420:20;;6338:109;;17204:1783;;;;;;:::i;:::-;;:::i;5553:104::-;;;;;;:::i;:::-;;:::i;25022:185::-;;;;;;:::i;:::-;;:::i;6453:81::-;;;;;;:::i;:::-;;:::i;9003:65::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15032:904;;;;;;:::i;:::-;;:::i;8795:41::-;;;;;;:::i;:::-;;:::i;20937:175::-;;;;;;:::i;:::-;;:::i;7008:1350::-;;;;;;:::i;:::-;;:::i;9273:70::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6630:88;;;;;;:::i;:::-;;:::i;25213:243::-;;;;;;:::i;:::-;;:::i;14285:741::-;;;;;;:::i;:::-;;:::i;5776:106::-;;;;;;:::i;:::-;;:::i;8842:46::-;;;;;;:::i;:::-;;;;;;;;;;;;;;5175:84;;;;;;:::i;:::-;;:::i;4650:87::-;4721:9;;4650:87;;4851:97;4927:14;;4851:97;;4222:101;4300:16;;4222:101;;6724:91;6797:11;;6724:91;;6540:84;6608:9;;;;6540:84;;4443:103;4522:17;;4443:103;;21118:961;;;;;;:::i;:::-;;:::i;3887:108::-;;;;;;:::i;:::-;;:::i;26362:156::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;5663:107::-;5744:19;;5663:107;;5265:87;5336:9;;5265:87;;1973:101:5;;;:::i;5066:103:3:-;5145:17;;5066:103;;11049:404;;;;;;:::i;:::-;;:::i;8928:68::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4552:92;;;;;;:::i;:::-;;:::i;1341:85:5:-;1387:7;1413:6;-1:-1:-1;;;;;1413:6:5;1341:85;;3536:177:3;;;;;;:::i;:::-;;:::i;4110:106::-;;;;;;:::i;:::-;;:::i;4743:102::-;;;;;;:::i;:::-;;:::i;2896:111::-;;;;;;:::i;:::-;-1:-1:-1;;;;;2982:18:3;2956:7;2982:18;;;:11;:18;;;;;;;2896:111;4329:108;;;;;;:::i;:::-;;:::i;22957:370::-;;;;;;:::i;:::-;;:::i;6821:86::-;;;;;;:::i;:::-;;:::i;3417:113::-;;;;;;:::i;:::-;-1:-1:-1;;;;;3504:19:3;3478:7;3504:19;;;:12;:19;;;;;;;3417:113;26524:102;;;:::i;:::-;;;;;;;:::i;5888:109::-;5970:20;;5888:109;;19327:1604;;;;;;:::i;:::-;;:::i;6913:89::-;6985:10;;6913:89;;3013:398;;;;;;:::i;:::-;;:::i;5358:90::-;;;;;;:::i;:::-;;:::i;4954:106::-;;;;;;:::i;:::-;;:::i;6226:::-;;;;;;:::i;:::-;;:::i;5454:93::-;5528:12;;5454:93;;3719:162;;;;;;:::i;:::-;;:::i;6113:107::-;6194:19;;6113:107;;2223:232:5;;;;;;:::i;:::-;;:::i;24584:245:3:-;;;;;;:::i;:::-;;:::i;23333:1245::-;;;;;;:::i;:::-;;:::i;13004:1275::-;;;;;;:::i;:::-;;:::i;15942:181::-;;;;;;:::i;:::-;;:::i;6003:104::-;;;;;;:::i;:::-;;:::i;2495:395::-;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;2578:18:3;::::1;;::::0;;;:11:::1;:18;::::0;;;;:26;;;2627:1:::1;2618:10:::0;::::1;2614:270;;;-1:-1:-1::0;;;;;2659:21:3;::::1;2644:12;2659:21:::0;;;:14:::1;:21;::::0;;;;;;;2681:6;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;2681:6:3;;::::1;::::0;;;;2659:29;;:21;;:29:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;2644:44;;2718:16;;2710:4;:24;;2702:52;;;::::0;-1:-1:-1;;;2702:52:3;;19132:2:6;2702:52:3::1;::::0;::::1;19114:21:6::0;19171:2;19151:18;;;19144:30;-1:-1:-1;;;19190:18:6;;;19183:45;19245:18;;2702:52:3::1;18930:339:6::0;2702:52:3::1;2768:12;::::0;:37:::1;::::0;-1:-1:-1;;;2768:37:3;;-1:-1:-1;;;;;2768:12:3;;::::1;::::0;:27:::1;::::0;:37:::1;::::0;2796:5;;2768:12;;:37:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;2630:186;2495:395:::0;;:::o;2614:270::-:1;2836:12;::::0;:37:::1;::::0;-1:-1:-1;;;2836:37:3;;-1:-1:-1;;;;;2836:12:3;;::::1;::::0;:27:::1;::::0;:37:::1;::::0;2864:5;;2836:12:::1;::::0;:37:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;2614:270;2495:395:::0;;:::o;9723:321::-;9818:13;9847:19;9869:14;9884:9;9869:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;9869:25:3;;-1:-1:-1;9912:25:3;9904:34;;;;;;9994:11;9723:321;-1:-1:-1;;9723:321:3:o;24835:181::-;-1:-1:-1;;;;;24978:20:3;;24948:7;24978:20;;;:13;:20;;;;;;:31;;;;24999:9;;24978:31;:::i;:::-;;;;;;;;;;;;;;24971:38;;24835:181;;;;:::o;8895:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8895:26:3;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;16129:1069::-;10750:9;;-1:-1:-1;;;;;10750:9:3;10742:61;;;;-1:-1:-1;;;10742:61:3;;;;;;;:::i;:::-;10821:10;;-1:-1:-1;;;;;10821:10:3;10813:62;;;;-1:-1:-1;;;10813:62:3;;;;;;;:::i;:::-;10893:11;;-1:-1:-1;;;;;10893:11:3;10885:64;;;;-1:-1:-1;;;10885:64:3;;;;;;;:::i;:::-;10967:12;;-1:-1:-1;;;;;10967:12:3;10959:66;;;;-1:-1:-1;;;10959:66:3;;;;;;;:::i;:::-;16275:11:::1;::::0;-1:-1:-1;;;;;16275:11:3::1;16261:10;:25;::::0;:55:::1;;-1:-1:-1::0;16304:12:3::1;::::0;-1:-1:-1;;;;;16304:12:3::1;16290:10;:26;16261:55;16240:114;;;;-1:-1:-1::0;;;16240:114:3::1;;;;;;;:::i;:::-;16399:13;::::0;:35:::1;::::0;-1:-1:-1;;;16399:35:3;;::::1;::::0;::::1;3590:25:6::0;;;16364:32:3::1;::::0;-1:-1:-1;;;;;16399:13:3::1;::::0;:25:::1;::::0;3563:18:6;;16399:35:3::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;16399:35:3::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;16364:70;;16478:1;16452:6;:14;;;:28;;16444:50;;;::::0;-1:-1:-1;;;16444:50:3;;25051:2:6;16444:50:3::1;::::0;::::1;25033:21:6::0;25090:1;25070:18;;;25063:29;-1:-1:-1;;;25108:18:6;;;25101:39;25157:18;;16444:50:3::1;24849:332:6::0;16444:50:3::1;16522:18;::::0;::::1;::::0;:29:::1;::::0;;::::1;::::0;16587:27:::1;::::0;;::::1;::::0;-1:-1:-1;;;;;16646:27:3;::::1;16504:15;16646:27:::0;;;;;;;;;:37;;;;;;;;;;;16522:29;;16587:27;16701:15;;16693:24:::1;;;::::0;::::1;;-1:-1:-1::0;;;;;16746:20:3;::::1;16728:15;16746:20:::0;;;:11:::1;:20;::::0;;;;;:31;;::::1;::::0;16767:9;;16746:31:::1;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;16809:16:::1;::::0;::::1;::::0;16746:31;;-1:-1:-1;16843:22:3;;::::1;;16835:31;;;::::0;::::1;;16922:7;16884:34;16897:7;16906:11;16884:12;:34::i;:::-;:45;;16876:54;;;::::0;::::1;;16975:34;16988:7;16997:11;16975:12;:34::i;:::-;-1:-1:-1::0;;;;;16941:20:3;::::1;;::::0;;;:11:::1;:20;::::0;;;;;;:31;;::::1;::::0;16962:9;;16941:31:::1;:::i;:::-;::::0;;;::::1;::::0;;::::1;::::0;;;;;;;;:68;;;;-1:-1:-1;;;;;17019:27:3;::::1;;::::0;;;;;;;;;:37;;;;;;;;;:51;;;17112:26:::1;17128:9:::0;17112:15:::1;:26::i;:::-;17148:43;::::0;-1:-1:-1;;;17148:43:3;;17081:57;;-1:-1:-1;;;;;;17148:23:3;::::1;::::0;::::1;::::0;:43:::1;::::0;17172:5;;17179:11;;17148:43:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;16230:968;;;;;;;16129:1069:::0;;:::o;26125:231::-;26277:4;26300:49;26312:5;26319:9;26330:5;26337:11;26300;:49::i;:::-;26293:56;26125:231;-1:-1:-1;;;;;26125:231:3:o;17204:1783::-;10750:9;;-1:-1:-1;;;;;10750:9:3;10742:61;;;;-1:-1:-1;;;10742:61:3;;;;;;;:::i;:::-;10821:10;;-1:-1:-1;;;;;10821:10:3;10813:62;;;;-1:-1:-1;;;10813:62:3;;;;;;;:::i;:::-;10893:11;;-1:-1:-1;;;;;10893:11:3;10885:64;;;;-1:-1:-1;;;10885:64:3;;;;;;;:::i;:::-;10967:12;;-1:-1:-1;;;;;10967:12:3;10959:66;;;;-1:-1:-1;;;10959:66:3;;;;;;;:::i;:::-;17438:12:::1;::::0;-1:-1:-1;;;;;17438:12:3::1;17424:10;:26;17416:51;;;;-1:-1:-1::0;;;17416:51:3::1;;;;;;;:::i;:::-;17478:18;17499:32;17517:5;17524:6;;;;;;;;;;;;;-1:-1:-1::0;;;17524:6:3::1;;::::0;17499:17:::1;:32::i;:::-;17478:53;;17541:13;17568:12:::0;17583:2:::1;17589:1;17583:7;:47;;17607:3;:10;;;:23;;;17583:47;;;17593:3;:11;;;17583:47;17568:62;;17658:4;17644:10;:18;17640:110;;17686:4;17678:12;;17640:110;;;17729:10;17721:18;;17640:110;17778:2;17784:1;17778:7;:21;;;;-1:-1:-1::0;17789:10:3;;17778:21:::1;17777:87;;;;17817:2;17823:1;17817:7;:46;;;;;17858:5;-1:-1:-1::0;;;;;17828:35:3::1;:3;:10;;;:26;;;-1:-1:-1::0;;;;;17828:35:3::1;;;17817:46;17760:552;;;17921:96;17951:14;:21;17966:5;-1:-1:-1::0;;;;;17951:21:3::1;-1:-1:-1::0;;;;;17951:21:3::1;;;;;;;;;;;;17973:6;;;;;;;;;;;;;-1:-1:-1::0;;;17973:6:3::1;;::::0;17951:29:::1;;;;;;:::i;:::-;;;;;;;;;;;;;;17998:5;17921:12;:96::i;:::-;17889:14;:21;17904:5;-1:-1:-1::0;;;;;17889:21:3::1;-1:-1:-1::0;;;;;17889:21:3::1;;;;;;;;;;;;17911:6;;;;;;;;;;;;;-1:-1:-1::0;;;17911:6:3::1;;::::0;17889:29:::1;;;;;;:::i;:::-;::::0;;;::::1;::::0;;::::1;::::0;;;;;;;;:128;;;;-1:-1:-1;;;;;18091:19:3;::::1;;::::0;;;:14:::1;:19:::0;;;;;18111:6;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;18111:6:3;;::::1;::::0;;;;18091:27;18061:94:::1;::::0;18091:27:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;18136:5;18061:12;:94::i;:::-;18031:14;:19;18046:3;-1:-1:-1::0;;;;;18031:19:3::1;-1:-1:-1::0;;;;;18031:19:3::1;;;;;;;;;;;;18051:6;;;;;;;;;;;;;-1:-1:-1::0;;;18051:6:3::1;;::::0;18031:27:::1;;;;;;:::i;:::-;;;;;;;;;;;;;:124;;;;18169:61;18193:5;18200:14;:21;18215:5;-1:-1:-1::0;;;;;18200:21:3::1;-1:-1:-1::0;;;;;18200:21:3::1;;;;;;;;;;;;18222:6;;;;;;;;;;;;;-1:-1:-1::0;;;18222:6:3::1;;::::0;18200:29:::1;;;;;;:::i;:::-;;;;;;;;;;;;;;18169:23;:61::i;:::-;18244:57;18268:3;18273:14;:19;18288:3;-1:-1:-1::0;;;;;18273:19:3::1;-1:-1:-1::0;;;;;18273:19:3::1;;;;;;;;;;;;18293:6;;;;;;;;;;;;;-1:-1:-1::0;;;18293:6:3::1;;::::0;18273:27:::1;;;;;;:::i;18244:57::-;18353:82;18379:14;:20;18394:4;-1:-1:-1::0;;;;;18379:20:3::1;-1:-1:-1::0;;;;;18379:20:3::1;;;;;;;;;;;;18400:6;;;;;;;;;;;;;-1:-1:-1::0;;;18400:6:3::1;;::::0;18379:28:::1;;;;;;:::i;:::-;;;;;;;;;;;;;;18421:4;18353:12;:82::i;:::-;18322:14;:20;18337:4;-1:-1:-1::0;;;;;18322:20:3::1;-1:-1:-1::0;;;;;18322:20:3::1;;;;;;;;;;;;18343:6;;;;;;;;;;;;;-1:-1:-1::0;;;18343:6:3::1;;::::0;18322:28:::1;;;;;;:::i;:::-;;;;;;;;;;;;;:113;;;;18445:59;18469:4;18475:14;:20;18490:4;-1:-1:-1::0;;;;;18475:20:3::1;-1:-1:-1::0;;;;;18475:20:3::1;;;;;;;;;;;;18496:6;;;;;;;;;;;;;-1:-1:-1::0;;;18496:6:3::1;;::::0;18475:28:::1;;;;;;:::i;18445:59::-;18514:15;18523:5;18514:8;:15::i;:::-;18539:13;18548:3;18539:8;:13::i;:::-;18562:14;18571:4;18562:8;:14::i;:::-;18619:12;::::0;:29:::1;::::0;-1:-1:-1;;;18619:29:3;;-1:-1:-1;;;;;4139:32:6;;;18619:29:3::1;::::0;::::1;4121:51:6::0;18587:29:3::1;::::0;18619:12:::1;::::0;:23:::1;::::0;4094:18:6;;18619:29:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;18619:29:3::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;18587:61;;18662:2;18668:1;18662:7;18658:181;;;18715:19;;18700:5;:12;;;:34;;;;:::i;:::-;18685:12;::::0;::::1;:49:::0;18658:181:::1;;;18755:2;18761:1;18755:7;18751:88;;;18808:20;;18793:5;:12;;;:35;;;;:::i;:::-;18778:12;::::0;::::1;:50:::0;18751:88:::1;18892:16;::::0;::::1;::::0;18918:12:::1;::::0;18967::::1;::::0;::::1;::::0;18918:62:::1;::::0;-1:-1:-1;;;18918:62:3;;-1:-1:-1;;;;;28551:32:6;;;18918:62:3::1;::::0;::::1;28533:51:6::0;28620:13;;28600:18;;;28593:41;28615:2;28676:15;;28670:22;28650:18;;;28643:50;28709:18;;;28702:34;;;;18918:12:3;::::1;::::0;:29:::1;::::0;28505:19:6;;18918:62:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;17406:1581;;;;;17204:1783:::0;;;;;;:::o;5553:104::-;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;5626:19:3::1;:24:::0;5553:104::o;25022:185::-;-1:-1:-1;;;;;25166:23:3;;25136:7;25166:23;;;:16;:23;;;;;;:34;;;;25190:9;;25166:34;:::i;6453:81::-;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;6513:9:3::1;:14:::0;;-1:-1:-1;;6513:14:3::1;::::0;::::1;;::::0;;;::::1;::::0;;6453:81::o;15032:904::-;10750:9;;-1:-1:-1;;;;;10750:9:3;10742:61;;;;-1:-1:-1;;;10742:61:3;;;;;;;:::i;:::-;10821:10;;-1:-1:-1;;;;;10821:10:3;10813:62;;;;-1:-1:-1;;;10813:62:3;;;;;;;:::i;:::-;10893:11;;-1:-1:-1;;;;;10893:11:3;10885:64;;;;-1:-1:-1;;;10885:64:3;;;;;;;:::i;:::-;10967:12;;-1:-1:-1;;;;;10967:12:3;10959:66;;;;-1:-1:-1;;;10959:66:3;;;;;;;:::i;:::-;15212:10:::1;::::0;-1:-1:-1;;;;;15212:10:3::1;15198;:24;::::0;:53:::1;;-1:-1:-1::0;15240:11:3::1;::::0;-1:-1:-1;;;;;15240:11:3::1;15226:10;:25;15198:53;15177:115;;;::::0;-1:-1:-1;;;15177:115:3;;28949:2:6;15177:115:3::1;::::0;::::1;28931:21:6::0;28988:2;28968:18;;;28961:30;-1:-1:-1;;;29007:18:6;;;29000:45;29062:18;;15177:115:3::1;28747:339:6::0;15177:115:3::1;15317:1;15310:4;:8;15302:28;;;::::0;-1:-1:-1;;;15302:28:3;;29293:2:6;15302:28:3::1;::::0;::::1;29275:21:6::0;29332:1;29312:18;;;29305:29;-1:-1:-1;;;29350:18:6;;;29343:37;29397:18;;15302:28:3::1;29091:330:6::0;15302:28:3::1;15340:17;15360:39;15374:9;15393:4;15360:13;:39::i;:::-;15340:59;;15430:4;15417:9;:17;;15409:40;;;::::0;-1:-1:-1;;;15409:40:3;;29628:2:6;15409:40:3::1;::::0;::::1;29610:21:6::0;29667:2;29647:18;;;29640:30;-1:-1:-1;;;29686:18:6;;;29679:40;29736:18;;15409:40:3::1;29426:334:6::0;15409:40:3::1;-1:-1:-1::0;;;;;15467:18:3;::::1;;::::0;;;:11:::1;:18;::::0;;;;;;:29;;15500:4;;15467:18;:29:::1;::::0;15486:9;;15467:29:::1;:::i;:::-;;;;;;;;;;;;;;:37;;15459:62;;;::::0;-1:-1:-1;;;15459:62:3;;29967:2:6;15459:62:3::1;::::0;::::1;29949:21:6::0;30006:2;29986:18;;;29979:30;-1:-1:-1;;;30025:18:6;;;30018:42;30077:18;;15459:62:3::1;29765:336:6::0;15459:62:3::1;-1:-1:-1::0;;;;;15621:18:3;::::1;;::::0;;;:11:::1;:18;::::0;;;;;;:29;;::::1;::::0;15640:9;;15621:29:::1;:::i;:::-;;;;;;;;;;;;;;15552:49;15565:11;:18;15577:5;-1:-1:-1::0;;;;;15565:18:3::1;-1:-1:-1::0;;;;;15565:18:3::1;;;;;;;;;;;;15584:9;15565:29;;;;;;:::i;:::-;;;;;;;;;;;;;;15596:4;15552:12;:49::i;:::-;:98;;15531:159;;;::::0;-1:-1:-1;;;15531:159:3;;30308:2:6;15531:159:3::1;::::0;::::1;30290:21:6::0;30347:2;30327:18;;;30320:30;-1:-1:-1;;;30366:18:6;;;30359:44;30420:18;;15531:159:3::1;30106:338:6::0;15531:159:3::1;-1:-1:-1::0;;;;;15758:18:3;::::1;;::::0;;;:11:::1;:18;::::0;;;;;;:29;;15732:83:::1;::::0;15758:18;:29:::1;::::0;15777:9;;15758:29:::1;:::i;15732:83::-;-1:-1:-1::0;;;;;15700:18:3;::::1;;::::0;;;:11:::1;:18;::::0;;;;;;:29;;::::1;::::0;15719:9;;15700:29:::1;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:115;15826:28:::1;15857:26;15873:9:::0;15857:15:::1;:26::i;:::-;15893:36;::::0;-1:-1:-1;;;15893:36:3;;15826:57;;-1:-1:-1;;;;;;15893:23:3;::::1;::::0;::::1;::::0;:36:::1;::::0;15917:5;;15924:4;;15893:36:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;15167:769;;15032:904:::0;;;:::o;8795:41::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8795:41:3;;;;;;;:::i;20937:175::-;-1:-1:-1;;;;;21076:18:3;;21046:7;21076:18;;;:11;:18;;;;;;:29;;;;21095:9;;21076:29;:::i;7008:1350::-;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;-1:-1:-1;;;;;7141:19:3;::::1;::::0;;::::1;::::0;:40:::1;;-1:-1:-1::0;;;;;;7164:17:3;::::1;::::0;::::1;7141:40;7133:49;;;::::0;::::1;;7224:12;::::0;:30:::1;::::0;-1:-1:-1;;;7224:30:3;;-1:-1:-1;;;;;4139:32:6;;;7224:30:3::1;::::0;::::1;4121:51:6::0;7192:29:3::1;::::0;7224:12:::1;::::0;:23:::1;::::0;4094:18:6;;7224:30:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;7224:30:3::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;7192:62;;7272:5;:14;;;7290:1;7272:19;:42;;;;7295:5;:14;;;7313:1;7295:19;7272:42;7264:67;;;::::0;-1:-1:-1;;;7264:67:3;;30651:2:6;7264:67:3::1;::::0;::::1;30633:21:6::0;30690:2;30670:18;;;30663:30;-1:-1:-1;;;30709:18:6;;;30702:42;30761:18;;7264:67:3::1;30449:336:6::0;7264:67:3::1;-1:-1:-1::0;;;;;7357:21:3;::::1;7342:12;7357:21:::0;;;:14:::1;:21;::::0;;;;;;;7379:6;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;7379:6:3;;::::1;::::0;;;;7357:29;;:21;;:29:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;7342:44;;7396:18;7417:14;:19;7432:3;-1:-1:-1::0;;;;;7417:19:3::1;-1:-1:-1::0;;;;;7417:19:3::1;;;;;;;;;;;;7437:6;;;;;;;;;;;;;-1:-1:-1::0;;;7437:6:3::1;;::::0;7417:27:::1;;;;;;:::i;:::-;;;;;;;;;;;;;;7396:48;;7466:6;7458:4;:14;7454:850;;7520:26;7533:4;7539:6;7520:12;:26::i;:::-;7488:14;:21;7503:5;-1:-1:-1::0;;;;;7488:21:3::1;-1:-1:-1::0;;;;;7488:21:3::1;;;;;;;;;;;;7510:6;;;;;;;;;;;;;-1:-1:-1::0;;;7510:6:3::1;;::::0;7488:29:::1;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:58;7590:32:::1;7603:10:::0;7615:6;7590:12:::1;:32::i;:::-;7560:14;:19;7575:3;-1:-1:-1::0;;;;;7560:19:3::1;-1:-1:-1::0;;;;;7560:19:3::1;;;;;;;;;;;;7580:6;;;;;;;;;;;;;-1:-1:-1::0;;;7580:6:3::1;;::::0;7560:27:::1;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:62;7454:850:::1;;;-1:-1:-1::0;;;;;7653:21:3;::::1;7685:1;7653:21:::0;;;:14:::1;:21;::::0;;;;;;;7675:6;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;7675:6:3;;::::1;::::0;;;;7653:29;;:21;;:29:::1;::::0;::::1;:::i;:::-;::::0;;;::::1;::::0;;::::1;::::0;;;;;;;;:33;;;;-1:-1:-1;;;;;7719:23:3;::::1;7701:15;7719:23:::0;;;:16:::1;:23:::0;;;;;7743:6;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;7743:6:3;;::::1;::::0;;;;7719:31;;7701:15;;7719:31:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;7701:49;;7799:6;7768:27;7781:4;7787:7;7768:12;:27::i;:::-;:37;7764:530;;7859:107;7893:7;7922:26;7935:6;7943:4;7922:12;:26::i;:::-;7859:12;:107::i;:::-;7825:16;:23;7842:5;-1:-1:-1::0;;;;;7825:23:3::1;-1:-1:-1::0;;;;;7825:23:3::1;;;;;;;;;;;;7849:6;;;;;;;;;;;;;-1:-1:-1::0;;;7849:6:3::1;;::::0;7825:31:::1;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:141;8014:32:::1;8027:10:::0;8039:6;8014:12:::1;:32::i;:::-;7984:14;:19;7999:3;-1:-1:-1::0;;;;;7984:19:3::1;-1:-1:-1::0;;;;;7984:19:3::1;;;;;;;;;;;;8004:6;;;;;;;;;;;;;-1:-1:-1::0;;;8004:6:3::1;;::::0;7984:27:::1;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:62;7764:530:::1;;;-1:-1:-1::0;;;;;8085:23:3;::::1;8119:1;8085:23:::0;;;:16:::1;:23;::::0;;;;;;;8109:6;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;8109:6:3;;::::1;::::0;;;;8085:31;;:23;;:31:::1;::::0;::::1;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:35;8168:111:::1;8202:10:::0;8234:27:::1;8247:4:::0;8253:7;8234:12:::1;:27::i;:::-;8168:12;:111::i;:::-;8138:14;:19;8153:3;-1:-1:-1::0;;;;;8138:19:3::1;-1:-1:-1::0;;;;;8138:19:3::1;;;;;;;;;;;;8158:6;;;;;;;;;;;;;-1:-1:-1::0;;;8158:6:3::1;;::::0;8138:27:::1;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:141;7764:530:::1;7639:665;7454:850;8313:15;8322:5;8313:8;:15::i;:::-;8338:13;8347:3;8338:8;:13::i;6630:88::-:0;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;6695:11:3::1;:16:::0;6630:88::o;25213:243::-;25321:7;25344:28;25375:26;25391:9;25375:15;:26::i;:::-;25418:31;;-1:-1:-1;;;25418:31:3;;-1:-1:-1;;;;;4139:32:6;;;25418:31:3;;;4121:51:6;25344:57:3;;-1:-1:-1;25418:24:3;;;;;;4094:18:6;;25418:31:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25411:38;25213:243;-1:-1:-1;;;;25213:243:3:o;14285:741::-;10750:9;;-1:-1:-1;;;;;10750:9:3;10742:61;;;;-1:-1:-1;;;10742:61:3;;;;;;;:::i;:::-;10821:10;;-1:-1:-1;;;;;10821:10:3;10813:62;;;;-1:-1:-1;;;10813:62:3;;;;;;;:::i;:::-;10893:11;;-1:-1:-1;;;;;10893:11:3;10885:64;;;;-1:-1:-1;;;10885:64:3;;;;;;;:::i;:::-;10967:12;;-1:-1:-1;;;;;10967:12:3;10959:66;;;;-1:-1:-1;;;10959:66:3;;;;;;;:::i;:::-;14585:10:::1;::::0;-1:-1:-1;;;;;14585:10:3::1;14571;:24;::::0;:53:::1;;-1:-1:-1::0;14613:11:3::1;::::0;-1:-1:-1;;;;;14613:11:3::1;14599:10;:25;14571:53;14550:144;;;::::0;-1:-1:-1;;;14550:144:3;;31181:2:6;14550:144:3::1;::::0;::::1;31163:21:6::0;31220:2;31200:18;;;31193:30;31259:34;31239:18;;;31232:62;-1:-1:-1;;;31310:18:6;;;31303:42;31362:19;;14550:144:3::1;30979:408:6::0;14550:144:3::1;-1:-1:-1::0;;;;;14763:18:3;::::1;;::::0;;;:11:::1;:18;::::0;;;;;;:29;;14737:89:::1;::::0;14763:18;:29:::1;::::0;14782:9;;14763:29:::1;:::i;:::-;;;;;;;;;;;;;;14806:10;14737:12;:89::i;:::-;-1:-1:-1::0;;;;;14705:18:3;::::1;;::::0;;;:11:::1;:18;::::0;;;;;;:29;;::::1;::::0;14724:9;;14705:29:::1;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:121;14836:183:::1;14857:5:::0;14876:10;14900:9;14923:10;14947:11;14972:9;14995:14;14836:7:::1;:183::i;:::-;;14285:741:::0;;;;;;;:::o;5776:106::-;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;5850:20:3::1;:25:::0;5776:106::o;5175:84::-;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;5238:9:3::1;:14:::0;5175:84::o;21118:961::-;21173:7;21207:1;21200:4;:8;21192:17;;;;;;21242:10;21227:26;;;;:14;:26;;;;;;;;;21254:6;;;;;;;;;;-1:-1:-1;;;21254:6:3;;;;;;;21227:34;;21265:4;;21227:26;:34;;;:::i;:::-;;;;;;;;;;;;;;:42;;21219:69;;;;-1:-1:-1;;;21219:69:3;;30308:2:6;21219:69:3;;;30290:21:6;30347:2;30327:18;;;30320:30;-1:-1:-1;;;30366:18:6;;;30359:44;30420:18;;21219:69:3;30106:338:6;21219:69:3;21407:10;21392:26;;;;:14;:26;;;;;;;;;21419:6;;;;;;;;;;-1:-1:-1;;;21419:6:3;;;;;;;21392:34;;;;21419:6;21392:34;:::i;:::-;;;;;;;;;;;;;;;;;;21347:10;21332:26;;;;:14;:26;;;;;21359:6;;;;;;;;-1:-1:-1;;;21359:6:3;;;;;;;21332:34;;21392;;21319:54;;21332:34;;21392;21332;:::i;21319:54::-;:107;21298:170;;;;-1:-1:-1;;;21298:170:3;;31594:2:6;21298:170:3;;;31576:21:6;31633:2;31613:18;;;31606:30;-1:-1:-1;;;31652:18:6;;;31645:46;31708:18;;21298:170:3;31392:340:6;21298:170:3;21496:10;21479:28;;;;:16;:28;;;;;;;;21510:15;21479:46;;;;21535:18;:30;;;;;:60;;;;;;;;:67;;;21675:26;;;:14;:26;;;;;;21702:6;;;;;;;;;;-1:-1:-1;;;21702:6:3;;;;;;;21675:34;;21649:88;;21675:26;:34;;;:::i;21649:88::-;21627:10;21612:26;;;;:14;:26;;;;;;;;;21639:6;;;;;;;;;;-1:-1:-1;;;21639:6:3;;;;;;;21612:34;;;;21639:6;21612:34;:::i;:::-;;;;;;;;;;;;;;;;:125;;;;21829:10;21812:28;;;;:16;:28;;;;;21841:6;;;;;;;;-1:-1:-1;;;21841:6:3;;;;;;;21812:36;21786:90;;21812:36;;;:::i;21786:90::-;21764:10;21747:28;;;;:16;:28;;;;;;;;;21776:6;;;;;;;;;;-1:-1:-1;;;21776:6:3;;;;;;;21747:36;;;;21776:6;21747:36;:::i;:::-;;;;;;;;;;;;;;:129;21887:20;21896:10;21887:8;:20::i;:::-;21918:46;21926:10;21918:46;;;;;;;;;;;;21942:6;;;;;;;;;;;;;-1:-1:-1;;;21942:6:3;;;21950:4;21956:1;21959;21962;21918:7;:46::i;:::-;;21980:37;22000:10;22012:4;21980:37;;;;;;;:::i;:::-;;;;;;;;22035;22053:10;22065:6;;;;;;;;;;;;;-1:-1:-1;;;22065:6:3;;;22035:17;:37::i;3887:108::-;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;3962:17:3::1;:26:::0;3887:108::o;26362:156::-;26450:20;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26450:20:3;26493:18;;;;:7;:18;;;;;;;;;26486:25;;;;;;;;;;;;;;;-1:-1:-1;;;;;26486:25:3;;;;;;;;;;;;;;;26493:18;;26486:25;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26362:156;;;:::o;1973:101:5:-;1387:7;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;2037:30:::1;2064:1;2037:18;:30::i;:::-;1973:101::o:0;11049:404:3:-;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;11221:9:3::1;:21:::0;;-1:-1:-1;;;;;;11221:21:3;;::::1;-1:-1:-1::0;;;;;11221:21:3;;::::1;::::0;;::::1;::::0;;;11252:10:::1;:22:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;11284:11:::1;:24:::0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;11318:12:::1;:26:::0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;11354:12:::1;:39:::0;;;::::1;::::0;;::::1;::::0;;;11403:13:::1;:43:::0;;;;::::1;::::0;;::::1;::::0;;11049:404::o;4552:92::-;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;4619:9:3::1;:18:::0;4552:92::o;3536:177::-;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;3693:13:3::1;3665:14;3680:9;;3665:25;;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:41;;-1:-1:-1;;;;;3665:41:3;;;::::1;-1:-1:-1::0;;;;;;3665:41:3;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;3536:177:3:o;4110:106::-;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;4184:16:3::1;:25:::0;4110:106::o;4743:102::-;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;4815:14:3::1;:23:::0;4743:102::o;4329:108::-;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;4404:17:3::1;:26:::0;4329:108::o;22957:370::-;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;-1:-1:-1;;;;;23045:23:3;::::1;23026:16;23045:23:::0;;;:16:::1;:23;::::0;;;;;;;23069:6;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;23069:6:3;;::::1;::::0;;;;23045:31;;:23;;:31:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;23026:50;;23105:1;23094:8;:12;23086:35;;;::::0;-1:-1:-1;;;23086:35:3;;32217:2:6;23086:35:3::1;::::0;::::1;32199:21:6::0;32256:2;32236:18;;;32229:30;-1:-1:-1;;;32275:18:6;;;32268:40;32325:18;;23086:35:3::1;32015:334:6::0;23086:35:3::1;-1:-1:-1::0;;;;;23131:23:3;::::1;23165:1;23131:23:::0;;;:16:::1;:23;::::0;;;;;;;23155:6;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;23155:6:3;;::::1;::::0;;;;23131:31;;:23;;:31:::1;::::0;::::1;:::i;:::-;::::0;;;::::1;::::0;;::::1;::::0;;;;;;;;:35;;;;-1:-1:-1;;;;;23234:21:3;::::1;;::::0;;;:14:::1;:21:::0;;;;;23256:6;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;23256:6:3;;::::1;::::0;;;;23234:29;23208:87:::1;::::0;23234:29:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;23277:8;23208:12;:87::i;:::-;23176:14;:21;23191:5;-1:-1:-1::0;;;;;23176:21:3::1;-1:-1:-1::0;;;;;23176:21:3::1;;;;;;;;;;;;23198:6;;;;;;;;;;;;;-1:-1:-1::0;;;23198:6:3::1;;::::0;23176:29:::1;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:119;23305:15:::1;23314:5:::0;23305:8:::1;:15::i;6821:86::-:0;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;6885:10:3::1;:15:::0;6821:86::o;26524:102::-;26575:15;26609:10;26602:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26602:17:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26524:102;:::o;19327:1604::-;10750:9;;-1:-1:-1;;;;;10750:9:3;10742:61;;;;-1:-1:-1;;;10742:61:3;;;;;;;:::i;:::-;10821:10;;-1:-1:-1;;;;;10821:10:3;10813:62;;;;-1:-1:-1;;;10813:62:3;;;;;;;:::i;:::-;10893:11;;-1:-1:-1;;;;;10893:11:3;10885:64;;;;-1:-1:-1;;;10885:64:3;;;;;;;:::i;:::-;10967:12;;-1:-1:-1;;;;;10967:12:3;10959:66;;;;-1:-1:-1;;;10959:66:3;;;;;;;:::i;:::-;19427:12:::1;::::0;-1:-1:-1;;;;;19427:12:3::1;19413:10;:26;19405:51;;;;-1:-1:-1::0;;;19405:51:3::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;19474:19:3;::::1;19466:44;;;::::0;-1:-1:-1;;;19466:44:3;;32556:2:6;19466:44:3::1;::::0;::::1;32538:21:6::0;32595:2;32575:18;;;32568:30;-1:-1:-1;;;32614:18:6;;;32607:42;32666:18;;19466:44:3::1;32354:336:6::0;19466:44:3::1;-1:-1:-1::0;;;;;19546:21:3;::::1;19520:23;19546:21:::0;;;:14:::1;:21;::::0;;;;;;;19568:6;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;19568:6:3;;::::1;::::0;;;;19546:29;;:21;;:29:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;19520:55;;19585:13;19612:21:::0;19670:9:::1;;19651:15;:28;19647:810;;19703:9;;19695:17;;19758:82;19788:15;19821:5;19758:12;:82::i;:::-;19726:14;:21;19741:5;-1:-1:-1::0;;;;;19726:21:3::1;-1:-1:-1::0;;;;;19726:21:3::1;;;;;;;;;;;;19748:6;;;;;;;;;;;;;-1:-1:-1::0;;;19748:6:3::1;;::::0;19726:29:::1;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:114;19647:810:::1;;;-1:-1:-1::0;;;;;19871:21:3;::::1;19903:1;19871:21:::0;;;:14:::1;:21;::::0;;;;;;;19893:6;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;19893:6:3;;::::1;::::0;;;;19871:29;;:21;;:29:::1;::::0;::::1;:::i;:::-;::::0;;;::::1;::::0;;::::1;::::0;;;;;;;;:33;;;;-1:-1:-1;;;;;19937:23:3;::::1;19919:15;19937:23:::0;;;:16:::1;:23:::0;;;;;19961:6;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;19961:6:3;;::::1;::::0;;;;19937:31;;19919:15;;19937:31:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;19919:49;;20028:9;;19986:38;19999:15;20016:7;19986:12;:38::i;:::-;:51;19982:465;;20065:9;::::0;;-1:-1:-1;20108:40:3::1;20065:9:::0;20132:15;20108:12:::1;:40::i;:::-;20092:56;;20200:94;20234:7;20263:13;20200:12;:94::i;:::-;20166:16;:23;20183:5;-1:-1:-1::0;;;;;20166:23:3::1;-1:-1:-1::0;;;;;20166:23:3::1;;;;;;;;;;;;20190:6;;;;;;;;;;;;;-1:-1:-1::0;;;20190:6:3::1;;::::0;20166:31:::1;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:128;19982:465:::1;;;20341:38;20354:7;20363:15;20341:12;:38::i;:::-;20333:46;;20431:1;20397:16;:23;20414:5;-1:-1:-1::0;;;;;20397:23:3::1;-1:-1:-1::0;;;;;20397:23:3::1;;;;;;;;;;;;20421:6;;;;;;;;;;;;;-1:-1:-1::0;;;20421:6:3::1;;::::0;20397:31:::1;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:35;19982:465:::1;19857:600;19647:810;20466:15;20475:5;20466:8;:15::i;:::-;20524:12;::::0;:30:::1;::::0;-1:-1:-1;;;20524:30:3;;-1:-1:-1;;;;;4139:32:6;;;20524:30:3::1;::::0;::::1;4121:51:6::0;20492:29:3::1;::::0;20524:12:::1;::::0;:23:::1;::::0;4094:18:6;;20524:30:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;20524:30:3::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;20492:62;;20595:12;;20579:5;:12;;;:28;;:88;;20666:1;20579:88;;;20638:12;;20623:5;:12;;;:27;;;;:::i;:::-;20564:12;::::0;::::1;:103:::0;;;20721:16:::1;::::0;::::1;::::0;20747:12:::1;::::0;:63:::1;::::0;-1:-1:-1;;;20747:63:3;;-1:-1:-1;;;;;28551:32:6;;;20747:63:3::1;::::0;::::1;28533:51:6::0;28620:13;;28600:18;;;28593:41;28615:2;28676:15;;28670:22;28650:18;;;28643:50;28709:18;;;28702:34;;;;20721:16:3;;20747:12:::1;::::0;:29:::1;::::0;28505:19:6;;20747:63:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;20821:28;20852:23;20868:6;;;;;;;;;;;;;-1:-1:-1::0;;;20868:6:3::1;;::::0;20852:15:::1;:23::i;:::-;20821:54;;20885:14;-1:-1:-1::0;;;;;20885:23:3::1;;20909:7;1387::5::0;1413:6;-1:-1:-1;;;;;1413:6:5;;1341:85;20909:7:3::1;20918:5;20885:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;19395:1536;;;;;;19327:1604:::0;:::o;3013:398::-;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;-1:-1:-1;;;;;3097:19:3;::::1;;::::0;;;:12:::1;:19;::::0;;;;:27;;;3147:1:::1;3138:10:::0;::::1;3134:271;;;-1:-1:-1::0;;;;;3179:21:3;::::1;3164:12;3179:21:::0;;;:14:::1;:21;::::0;;;;;;;3201:6;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;3201:6:3;;::::1;::::0;;;;3179:29;;:21;;:29:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;3164:44;;3238:17;;3230:4;:25;;3222:53;;;::::0;-1:-1:-1;;;3222:53:3;;19132:2:6;3222:53:3::1;::::0;::::1;19114:21:6::0;19171:2;19151:18;;;19144:30;-1:-1:-1;;;19190:18:6;;;19183:45;19245:18;;3222:53:3::1;18930:339:6::0;3222:53:3::1;3289:12;::::0;:37:::1;::::0;-1:-1:-1;;;3289:37:3;;-1:-1:-1;;;;;3289:12:3;;::::1;::::0;:27:::1;::::0;:37:::1;::::0;3317:5;;3324:1:::1;::::0;3289:37:::1;;;:::i;5358:90::-:0;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;5424:12:3::1;:17:::0;5358:90::o;4954:106::-;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;5028:17:3::1;:25:::0;4954:106::o;6226:::-;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;6300:20:3::1;:25:::0;6226:106::o;3719:162::-;3819:7;3849:14;3864:9;;3849:25;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;3849:25:3;;-1:-1:-1;3719:162:3;;;;:::o;2223:232:5:-;1387:7;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;-1:-1:-1;;;;;2324:22:5;::::1;2303:107;;;::::0;-1:-1:-1;;;2303:107:5;;33314:2:6;2303:107:5::1;::::0;::::1;33296:21:6::0;33353:2;33333:18;;;33326:30;33392:34;33372:18;;;33365:62;-1:-1:-1;;;33443:18:6;;;33436:36;33489:19;;2303:107:5::1;33112:402:6::0;2303:107:5::1;2420:28;2439:8;2420:18;:28::i;:::-;2223:232:::0;:::o;24584:245:3:-;24698:7;-1:-1:-1;;;;;24729:19:3;;24721:52;;;;-1:-1:-1;;;24721:52:3;;33721:2:6;24721:52:3;;;33703:21:6;33760:2;33740:18;;;33733:30;-1:-1:-1;;;33779:18:6;;;33772:50;33839:18;;24721:52:3;33519:344:6;24721:52:3;-1:-1:-1;;;;;24791:20:3;;;;;;:13;:20;;;;;;;:31;;;;24812:9;;24791:31;:::i;23333:1245::-;23392:21;23416:18;;;:7;:18;;;;;;;;23392:42;;;;;;;;;;;;;;;-1:-1:-1;;;;;23392:42:3;;;;;;;;;;;;;23416:18;;23392:42;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;23392:42:3;;;-1:-1:-1;;23392:42:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23453:16;;23392:42;;-1:-1:-1;23445:59:3;;;;-1:-1:-1;;;23445:59:3;;34070:2:6;23445:59:3;;;34052:21:6;34109:2;34089:18;;;34082:30;-1:-1:-1;;;34128:18:6;;;34121:46;34184:18;;23445:59:3;33868:340:6;23445:59:3;23522:16;;;;-1:-1:-1;;;;;23522:30:3;23542:10;23522:30;23514:64;;;;-1:-1:-1;;;23514:64:3;;34415:2:6;23514:64:3;;;34397:21:6;34454:2;34434:18;;;34427:30;-1:-1:-1;;;34473:18:6;;;34466:51;34534:18;;23514:64:3;34213:345:6;23514:64:3;23597:7;:18;;;23619:1;23597:23;23589:48;;;;-1:-1:-1;;;23589:48:3;;34765:2:6;23589:48:3;;;34747:21:6;34804:2;34784:18;;;34777:30;-1:-1:-1;;;34823:18:6;;;34816:42;34875:18;;23589:48:3;34563:336:6;23589:48:3;23709:17;;;;23686:10;23669:28;;;;:16;:28;;;;;;;;;23698:6;;;;;;;;;;-1:-1:-1;;;23698:6:3;;;;;;;23669:36;;;;23698:6;23669:36;:::i;:::-;;;;;;;;;;;;;;:57;;23648:114;;;;-1:-1:-1;;;23648:114:3;;32217:2:6;23648:114:3;;;32199:21:6;32256:2;32236:18;;;32229:30;-1:-1:-1;;;32275:18:6;;;32268:40;32325:18;;23648:114:3;32015:334:6;23648:114:3;23833:17;;:26;;23853:6;23833:26;:::i;:::-;23814:7;:16;;;:45;;;;:::i;:::-;23794:15;:66;;23773:127;;;;-1:-1:-1;;;23773:127:3;;35279:2:6;23773:127:3;;;35261:21:6;35318:2;35298:18;;;35291:30;-1:-1:-1;;;35337:18:6;;;35330:44;35391:18;;23773:127:3;35077:338:6;23773:127:3;23993:10;23976:28;;;;:16;:28;;;;;;;;;24005:6;;;;;;;;;;-1:-1:-1;;;24005:6:3;;;;;;;23976:36;;23950:103;;23976:28;:36;;;:::i;:::-;;;;;;;;;;;;;;24026:7;:17;;;23950:12;:103::i;:::-;23928:10;23911:28;;;;:16;:28;;;;;;;;;23940:6;;;;;;;;;;-1:-1:-1;;;23940:6:3;;;;;;;23911:36;;;;23940:6;23911:36;:::i;:::-;;;;;;;;;;;;;;;;:142;;;;24139:10;24125:25;;;;:13;:25;;;;;24151:6;;;;;;;;-1:-1:-1;;;24151:6:3;;;;;;;24125:33;24099:100;;24125:33;;;:::i;:::-;;;;;;;;;;;;;;24172:7;:17;;;24099:12;:100::i;:::-;24077:10;24063:25;;;;:13;:25;;;;;;;;;24089:6;;;;;;;;;;-1:-1:-1;;;24089:6:3;;;;;;;24063:33;;;;24089:6;24063:33;:::i;:::-;;;;;;;;;;;;;;;;:136;;;;24231:1;24210:18;;;:22;24263:15;24242:18;;;:36;-1:-1:-1;24288:18:3;;;:7;:18;;;;;:28;;;;;;;;;;;;;-1:-1:-1;;;;;;24288:28:3;-1:-1:-1;;;;;24288:28:3;;;;;;;;;;;;;;;24210:18;;24288;:28;;;;;;;;;;:::i;:::-;-1:-1:-1;24288:28:3;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;24288:28:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24337:22:3;;;:11;:22;;;;;;24326:10;:34;;24363:7;;24337:22;24326:34;;;;;;:::i;:::-;;;;;;;;;;:44;;:34;;;;;;:44;;;;;;;;;;;;-1:-1:-1;;;;;;24326:44:3;-1:-1:-1;;;;;24326:44:3;;;;;;;;;;;;;;;:34;;:44;;;;;;;;;;;:::i;:::-;-1:-1:-1;24326:44:3;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24385:57;24398:10;24410:9;24421:7;:17;;;24440:1;24385:57;;;;;;;;;:::i;:::-;;;;;;;;24453:28;24484:23;24500:6;;;;;;;;;;;;;-1:-1:-1;;;24500:6:3;;;24484:15;:23::i;:::-;24553:17;;;;24517:54;;-1:-1:-1;;;24517:54:3;;24453;;-1:-1:-1;;;;;;24517:23:3;;;;;:54;;24541:10;;24553:17;24517:54;;;:::i;13004:1275::-;13098:1;13091:4;:8;13083:28;;;;-1:-1:-1;;;13083:28:3;;29293:2:6;13083:28:3;;;29275:21:6;29332:1;29312:18;;;29305:29;-1:-1:-1;;;29350:18:6;;;29343:37;29397:18;;13083:28:3;29091:330:6;13083:28:3;13220:10;13205:26;;;;:14;:26;;;;;;;:37;;;;13232:9;;13205:37;:::i;:::-;;;;;;;;;;;;;;13182:4;13142:14;:26;13157:10;-1:-1:-1;;;;;13142:26:3;-1:-1:-1;;;;;13142:26:3;;;;;;;;;;;;13169:9;13142:37;;;;;;:::i;:::-;;;;;;;;;;;;;;:44;;;;:::i;:::-;:100;13121:170;;;;-1:-1:-1;;;13121:170:3;;36228:2:6;13121:170:3;;;36210:21:6;36267:2;36247:18;;;36240:30;36306:25;36286:18;;;36279:53;36349:18;;13121:170:3;36026:347:6;13121:170:3;13383:10;13368:26;;;;:14;:26;;;;;;;:37;;13342:91;;13368:26;:37;;13395:9;;13368:37;:::i;13342:91::-;13317:10;13302:26;;;;:14;:26;;;;;;;:37;;;;13329:9;;13302:37;:::i;:::-;;;;;;;;;;;;;;;;;:131;;;;13573:6;;;;;;;;-1:-1:-1;;;13573:6:3;;;;13556:24;13464:1;;13556:24;;13302:37;13556:24;;:::i;:::-;;;;;;;;;;;;;13546:35;;;;;;13519:9;13502:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;13492:38;;;;;;:89;13475:593;;;-1:-1:-1;13665:12:3;;:35;;-1:-1:-1;;;13665:35:3;;13689:10;13665:35;;;4121:51:6;13618:1:3;;13633:29;;-1:-1:-1;;;;;13665:12:3;;;;:23;;4094:18:6;;13665:35:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13665:35:3;;;;;;;;;;;;:::i;:::-;13756:10;13784:26;;;;:14;:26;;;;;;;:37;;13633:67;;-1:-1:-1;13715:120:3;;13784:37;;13811:9;;13784:37;:::i;13715:120::-;13871:14;;;;:19;:97;;;;-1:-1:-1;13951:17:3;;13925:10;13910:26;;;;:14;:26;;;;;;;:37;;;;13937:9;;13910:37;:::i;:::-;;;;;;;;;;;;;;:58;;13871:97;13850:208;;;14001:12;;:42;;-1:-1:-1;;;14001:42:3;;-1:-1:-1;;;;;14001:12:3;;;;:27;;:42;;14029:10;;14041:1;;14001:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13850:208;13592:476;13475:593;14077:57;14085:10;14077:57;;;;;;;;;;;;14101:9;14112:4;14118:1;14121:9;14132:1;14077:7;:57::i;:::-;;14145:28;14176:26;14192:9;14176:15;:26::i;:::-;14212:60;;-1:-1:-1;;;14212:60:3;;14240:10;14212:60;;;36905:34:6;14260:4:3;36955:18:6;;;36948:43;37007:18;;;37000:34;;;14145:57:3;;-1:-1:-1;;;;;;14212:27:3;;;;;36840:18:6;;14212:60:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15942:181;-1:-1:-1;;;;;16084:21:3;;16054:7;16084:21;;;:14;:21;;;;;;:32;;;;16106:9;;16084:32;:::i;6003:104::-;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;6076:19:3::1;:24:::0;6003:104::o;754:206::-;835:14;;831:80;;891:5;874:22;;831:80;942:1;924:7;:14;;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;;;754:206:3:o;2838:96:0:-;2896:7;2922:5;2926:1;2922;:5;:::i;:::-;2915:12;2838:96;-1:-1:-1;;;2838:96:0:o;25462:657:3:-;25615:4;25656:18;;;:7;:18;;;;;25692:16;;;;-1:-1:-1;;;;;25692:25:3;;;:16;;:25;25684:34;;;;;;25736:11;25751:1;25736:16;:36;;;;25756:11;25771:1;25756:16;25736:36;25728:63;;;;-1:-1:-1;;;25728:63:3;;37247:2:6;25728:63:3;;;37229:21:6;37286:2;37266:18;;;37259:30;-1:-1:-1;;;37305:18:6;;;37298:44;37359:18;;25728:63:3;37045:338:6;25728:63:3;25806:25;;25802:88;;25847:18;;;:32;;;25802:88;25903:19;;:24;25899:80;;25943:25;;;;:17;;;;:25;;;;;:::i;:::-;;25899:80;26010:15;25989:18;;;:36;26041:50;;;;;;26054:5;;26061:9;;26072:5;;26079:11;;26041:50;:::i;:::-;;;;;;;;-1:-1:-1;26108:4:3;;25462:657;-1:-1:-1;;;;;25462:657:3:o;2471:96:0:-;2529:7;2555:5;2559:1;2555;:5;:::i;18993:328:3:-;19106:12;;:30;;-1:-1:-1;;;19106:30:3;;-1:-1:-1;;;;;4139:32:6;;;19106:30:3;;;4121:51:6;19074:29:3;;19106:12;;:23;;4094:18:6;;19106:30:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;19106:30:3;;;;;;;;;;;;:::i;:::-;19194:18;;;;19222:29;;;19261:12;;:53;;;-1:-1:-1;;;19261:53:3;;-1:-1:-1;;;;;38107:32:6;;;19261:53:3;;;38089:51:6;38176:13;;38156:18;;;38149:41;38171:2;38232:15;;38226:22;38206:18;;;38199:50;38291:15;;;38285:22;38265:18;;;38258:50;38280:2;38351:15;;38345:22;38324:19;;;38317:51;38339:3;38411:16;;38405:23;38384:19;;;38377:52;38127:3;38472:16;;38466:23;38445:19;;;38438:52;38460:3;38533:16;;38527:23;38506:19;;;38499:52;19194:18:3;;-1:-1:-1;19194:18:3;;19261:12;;;:31;;38061:19:6;;19261:53:3;37854:703:6;22085:866:3;-1:-1:-1;;;;;22154:21:3;;22137:14;22154:21;;;:14;:21;;;;;;;;22176:6;;;;;;;;;;-1:-1:-1;;;22176:6:3;;;;;;;22154:29;;:21;;:29;;;:::i;:::-;;;;;;;;;;;;;;;22226:12;;-1:-1:-1;;;22226:30:3;;-1:-1:-1;;;;;4139:32:6;;;22226:30:3;;;4121:51:6;22154:29:3;;-1:-1:-1;;;22226:12:3;;;:23;;4094:18:6;;22226:30:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;22226:30:3;;;;;;;;;;;;:::i;:::-;22194:62;;22267:38;22291:5;22298:6;22267:23;:38::i;:::-;22333:5;:14;;;22351:1;22333:19;:61;;;;;22377:17;;22368:6;:26;22333:61;:104;;;;;22420:17;;22410:6;:27;;22333:104;22316:194;;;22462:12;;:37;;-1:-1:-1;;;22462:37:3;;-1:-1:-1;;;;;22462:12:3;;;;:27;;:37;;22490:5;;22497:1;;22462:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22316:194;22537:5;:14;;;22555:1;22537:19;:60;;;;;22581:16;;22572:6;:25;22537:60;:103;;;;;22623:17;;22613:6;:27;;22537:103;22520:193;;;22665:12;;:37;;-1:-1:-1;;;22665:37:3;;-1:-1:-1;;;;;22665:12:3;;;;:27;;:37;;22693:5;;22700:1;;22665:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22520:193;22727:14;;;;:19;:50;;;;;22760:17;;22750:6;:27;;22727:50;22723:118;;;22793:12;;:37;;-1:-1:-1;;;22793:37:3;;-1:-1:-1;;;;;22793:12:3;;;;:27;;:37;;22821:5;;22828:1;;22793:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22723:118;22864:17;;22855:6;:26;22851:94;;;22897:12;;:37;;-1:-1:-1;;;22897:37:3;;-1:-1:-1;;;;;22897:12:3;;;;:27;;:37;;22925:5;;22897:12;;:37;;;:::i;22851:94::-;22127:824;;22085:866;:::o;11459:1539::-;11719:16;276:1;415:7;;:19;;407:63;;;;-1:-1:-1;;;407:63:3;;38764:2:6;407:63:3;;;38746:21:6;38803:2;38783:18;;;38776:30;38842:33;38822:18;;;38815:61;38893:18;;407:63:3;38562:355:6;407:63:3;276:1;481:7;:18;-1:-1:-1;;;;;11755:19:3;::::1;11747:44;;;::::0;-1:-1:-1;;;11747:44:3;;32556:2:6;11747:44:3::1;::::0;::::1;32538:21:6::0;32595:2;32575:18;;;32568:30;-1:-1:-1;;;32614:18:6;;;32607:42;32666:18;;11747:44:3::1;32354:336:6::0;11747:44:3::1;11809:23:::0;;11801:54:::1;;;::::0;-1:-1:-1;;;11801:54:3;;39124:2:6;11801:54:3::1;::::0;::::1;39106:21:6::0;39163:2;39143:18;;;39136:30;-1:-1:-1;;;39182:18:6;;;39175:43;39235:18;;11801:54:3::1;38922:337:6::0;11801:54:3::1;11873:24:::0;11865:51:::1;;;::::0;-1:-1:-1;;;11865:51:3;;39466:2:6;11865:51:3::1;::::0;::::1;39448:21:6::0;39505:2;39485:18;;;39478:30;-1:-1:-1;;;39524:18:6;;;39517:44;39578:18;;11865:51:3::1;39264:338:6::0;11865:51:3::1;11934:23:::0;11926:49:::1;;;::::0;-1:-1:-1;;;11926:49:3;;39809:2:6;11926:49:3::1;::::0;::::1;39791:21:6::0;39848:2;39828:18;;;39821:30;-1:-1:-1;;;39867:18:6;;;39860:43;39920:18;;11926:49:3::1;39607:337:6::0;11926:49:3::1;11993:28:::0;11985:59:::1;;;::::0;-1:-1:-1;;;11985:59:3;;40151:2:6;11985:59:3::1;::::0;::::1;40133:21:6::0;40190:2;40170:18;;;40163:30;-1:-1:-1;;;40209:18:6;;;40202:48;40267:18;;11985:59:3::1;39949:342:6::0;11985:59:3::1;12055:17;12075:26;:16;727:14:::0;;636:112;12075:26:::1;12158:1;12119:18:::0;;;:7:::1;:18;::::0;;;;:27;12055:46;;-1:-1:-1;12119:41:3;12111:65:::1;;;::::0;-1:-1:-1;;;12111:65:3;;40498:2:6;12111:65:3::1;::::0;::::1;40480:21:6::0;40537:2;40517:18;;;40510:30;-1:-1:-1;;;40556:18:6;;;40549:41;40607:18;;12111:65:3::1;40296:335:6::0;12111:65:3::1;12211:362;::::0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;12211:362:3;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12520:15:::1;12211:362:::0;;;;-1:-1:-1;12211:362:3;;;;;;12584:18;;;:7:::1;:18:::0;;;;;;:28;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;;12584:28:3::1;::::0;;;::::1;;::::0;;;;;;;12211:362;;;;12584:18;;:28:::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;12584:28:3::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;12584:28:3::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;12623:10:::1;:24:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;12623:24:3;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;;12623:24:3::1;-1:-1:-1::0;;;;;12623:24:3;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;12623:24:3::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;12623:24:3::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;12682:10:::1;:17:::0;:21:::1;::::0;12702:1:::1;::::0;12682:21:::1;:::i;:::-;12657:22;::::0;;;:11:::1;:22;::::0;;;;:46;12714:28:::1;:16;:26;:28::i;:::-;12757:208;12780:9;12803:5;12822:10;12846:9;12869:10;12893:11;12918:9;12941:14;12757:208;;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;233:1:3;522:22;;12982:9;11459:1539;-1:-1:-1;;;;;;;;11459:1539:3:o;2609:187:5:-;2682:16;2701:6;;-1:-1:-1;;;;;2717:17:5;;;-1:-1:-1;;;;;;2717:17:5;;;;;;2749:40;;2701:6;;;;;;;2749:40;;2682:16;2749:40;2672:124;2609:187;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:6;-1:-1:-1;;;;;89:31:6;;79:42;;69:70;;135:1;132;125:12;150:134;218:20;;247:31;218:20;247:31;:::i;:::-;150:134;;;:::o;289:315::-;357:6;365;418:2;406:9;397:7;393:23;389:32;386:52;;;434:1;431;424:12;386:52;473:9;460:23;492:31;517:5;492:31;:::i;:::-;542:5;594:2;579:18;;;;566:32;;-1:-1:-1;;;289:315:6:o;609:127::-;670:10;665:3;661:20;658:1;651:31;701:4;698:1;691:15;725:4;722:1;715:15;741:255;813:2;807:9;855:6;843:19;;-1:-1:-1;;;;;877:34:6;;913:22;;;874:62;871:88;;;939:18;;:::i;:::-;975:2;968:22;741:255;:::o;1001:::-;1073:2;1067:9;1115:6;1103:19;;-1:-1:-1;;;;;1137:34:6;;1173:22;;;1134:62;1131:88;;;1199:18;;:::i;1261:255::-;1333:2;1327:9;1375:6;1363:19;;-1:-1:-1;;;;;1397:34:6;;1433:22;;;1394:62;1391:88;;;1459:18;;:::i;1521:255::-;1593:2;1587:9;1635:6;1623:19;;-1:-1:-1;;;;;1657:34:6;;1693:22;;;1654:62;1651:88;;;1719:18;;:::i;1781:255::-;1853:2;1847:9;1895:6;1883:19;;-1:-1:-1;;;;;1917:34:6;;1953:22;;;1914:62;1911:88;;;1979:18;;:::i;2041:275::-;2112:2;2106:9;2177:2;2158:13;;-1:-1:-1;;2154:27:6;2142:40;;-1:-1:-1;;;;;2197:34:6;;2233:22;;;2194:62;2191:88;;;2259:18;;:::i;:::-;2295:2;2288:22;2041:275;;-1:-1:-1;2041:275:6:o;2321:187::-;2370:4;-1:-1:-1;;;;;2395:6:6;2392:30;2389:56;;;2425:18;;:::i;:::-;-1:-1:-1;2491:2:6;2470:15;-1:-1:-1;;2466:29:6;2497:4;2462:40;;2321:187::o;2513:464::-;2556:5;2609:3;2602:4;2594:6;2590:17;2586:27;2576:55;;2627:1;2624;2617:12;2576:55;2663:6;2650:20;2694:49;2710:32;2739:2;2710:32;:::i;:::-;2694:49;:::i;:::-;2768:2;2759:7;2752:19;2814:3;2807:4;2802:2;2794:6;2790:15;2786:26;2783:35;2780:55;;;2831:1;2828;2821:12;2780:55;2896:2;2889:4;2881:6;2877:17;2870:4;2861:7;2857:18;2844:55;2944:1;2919:16;;;2937:4;2915:27;2908:38;;;;2923:7;2513:464;-1:-1:-1;;;2513:464:6:o;2982:457::-;3060:6;3068;3121:2;3109:9;3100:7;3096:23;3092:32;3089:52;;;3137:1;3134;3127:12;3089:52;3176:9;3163:23;3195:31;3220:5;3195:31;:::i;:::-;3245:5;-1:-1:-1;3301:2:6;3286:18;;3273:32;-1:-1:-1;;;;;3317:30:6;;3314:50;;;3360:1;3357;3350:12;3314:50;3383;3425:7;3416:6;3405:9;3401:22;3383:50;:::i;:::-;3373:60;;;2982:457;;;;;:::o;3626:322::-;3695:6;3748:2;3736:9;3727:7;3723:23;3719:32;3716:52;;;3764:1;3761;3754:12;3716:52;3804:9;3791:23;-1:-1:-1;;;;;3829:6:6;3826:30;3823:50;;;3869:1;3866;3859:12;3823:50;3892;3934:7;3925:6;3914:9;3910:22;3892:50;:::i;4183:180::-;4242:6;4295:2;4283:9;4274:7;4270:23;4266:32;4263:52;;;4311:1;4308;4301:12;4263:52;-1:-1:-1;4334:23:6;;4183:180;-1:-1:-1;4183:180:6:o;4477:258::-;4549:1;4559:113;4573:6;4570:1;4567:13;4559:113;;;4649:11;;;4643:18;4630:11;;;4623:39;4595:2;4588:10;4559:113;;;4690:6;4687:1;4684:13;4681:48;;;4725:1;4716:6;4711:3;4707:16;4700:27;4681:48;;4477:258;;;:::o;4740:::-;4782:3;4820:5;4814:12;4847:6;4842:3;4835:19;4863:63;4919:6;4912:4;4907:3;4903:14;4896:4;4889:5;4885:16;4863:63;:::i;:::-;4980:2;4959:15;-1:-1:-1;;4955:29:6;4946:39;;;;4987:4;4942:50;;4740:258;-1:-1:-1;;4740:258:6:o;5003:1005::-;5428:25;;;-1:-1:-1;;;;;5489:32:6;;5484:2;5469:18;;5462:60;5416:3;5553:2;5538:18;;5531:30;;;5387:4;;5584:45;5610:18;;;5602:6;5584:45;:::i;:::-;5570:59;;5677:9;5669:6;5665:22;5660:2;5649:9;5645:18;5638:50;5705:33;5731:6;5723;5705:33;:::i;:::-;5769:3;5754:19;;5747:35;;;;-1:-1:-1;;5813:3:6;5798:19;;5791:35;;;;5857:3;5842:19;;5835:35;;;;5901:3;5886:19;;5879:35;;;;5945:3;5930:19;;5923:35;5989:3;5974:19;;;5967:35;5697:41;5003:1005;-1:-1:-1;;;;5003:1005:6:o;6013:315::-;6081:6;6089;6142:2;6130:9;6121:7;6117:23;6113:32;6110:52;;;6158:1;6155;6148:12;6110:52;6194:9;6181:23;6171:33;;6254:2;6243:9;6239:18;6226:32;6267:31;6292:5;6267:31;:::i;:::-;6317:5;6307:15;;;6013:315;;;;;:::o;6333:594::-;6429:6;6437;6445;6453;6506:3;6494:9;6485:7;6481:23;6477:33;6474:53;;;6523:1;6520;6513:12;6474:53;6562:9;6549:23;6581:31;6606:5;6581:31;:::i;:::-;6631:5;-1:-1:-1;6683:2:6;6668:18;;6655:32;;-1:-1:-1;6738:2:6;6723:18;;6710:32;-1:-1:-1;;;;;6754:30:6;;6751:50;;;6797:1;6794;6787:12;6751:50;6820;6862:7;6853:6;6842:9;6838:22;6820:50;:::i;:::-;6333:594;;;;-1:-1:-1;6810:60:6;;6917:2;6902:18;6889:32;;-1:-1:-1;;;6333:594:6:o;7124:1662::-;7183:5;7231:6;7219:9;7214:3;7210:19;7206:32;7203:52;;;7251:1;7248;7241:12;7203:52;7273:22;;:::i;:::-;7264:31;;7318:29;7337:9;7318:29;:::i;:::-;7311:5;7304:44;7408:2;7397:9;7393:18;7380:32;7375:2;7368:5;7364:14;7357:56;7464:2;7453:9;7449:18;7436:32;-1:-1:-1;;;;;7528:2:6;7520:6;7517:14;7514:34;;;7544:1;7541;7534:12;7514:34;7580:46;7622:3;7613:6;7602:9;7598:22;7580:46;:::i;:::-;7575:2;7568:5;7564:14;7557:70;7687:2;7676:9;7672:18;7659:32;7654:2;7647:5;7643:14;7636:56;7745:3;7734:9;7730:19;7717:33;7701:49;;7775:2;7765:8;7762:16;7759:36;;;7791:1;7788;7781:12;7759:36;;7828:48;7872:3;7861:8;7850:9;7846:24;7828:48;:::i;:::-;7822:3;7815:5;7811:15;7804:73;;7938:3;7927:9;7923:19;7910:33;7904:3;7897:5;7893:15;7886:58;8005:3;7994:9;7990:19;7977:33;7971:3;7964:5;7960:15;7953:58;8044:39;8078:3;8067:9;8063:19;8044:39;:::i;:::-;8038:3;8027:15;;8020:64;8103:3;8151:18;;;8138:32;8122:14;;;8115:56;8190:3;8238:18;;;8225:32;8209:14;;;8202:56;8277:3;8325:18;;;8312:32;8296:14;;;8289:56;8364:3;8412:18;;;8399:32;8383:14;;;8376:56;8451:3;8499:18;;;8486:32;8470:14;;;8463:56;8538:3;8586:18;;;8573:32;8557:14;;;8550:56;8625:3;8673:18;;;8660:32;8644:14;;;8637:56;8712:3;8760:18;;;8747:32;8731:14;;;8724:56;;;;8031:5;7124:1662;-1:-1:-1;7124:1662:6:o;8791:1891::-;8918:6;8926;8934;8942;8950;8958;9011:3;8999:9;8990:7;8986:23;8982:33;8979:53;;;9028:1;9025;9018:12;8979:53;9067:9;9054:23;9086:31;9111:5;9086:31;:::i;:::-;9136:5;-1:-1:-1;9193:2:6;9178:18;;9165:32;9206:33;9165:32;9206:33;:::i;:::-;9258:7;-1:-1:-1;9316:2:6;9301:18;;9288:32;-1:-1:-1;;;;;9369:14:6;;;9366:34;;;9396:1;9393;9386:12;9366:34;9419:22;;;;9475:6;9457:16;;;9453:29;9450:49;;;9495:1;9492;9485:12;9450:49;9523:22;;:::i;:::-;9570;9589:2;9570:22;:::i;:::-;9561:7;9554:39;9648:2;9644;9640:11;9627:25;9622:2;9613:7;9609:16;9602:51;9708:2;9704;9700:11;9687:25;9682:2;9673:7;9669:16;9662:51;9747:31;9774:2;9770;9766:11;9747:31;:::i;:::-;9742:2;9733:7;9729:16;9722:57;9814:32;9841:3;9837:2;9833:12;9814:32;:::i;:::-;9808:3;9799:7;9795:17;9788:59;9882:32;9909:3;9905:2;9901:12;9882:32;:::i;:::-;9876:3;9863:17;;9856:59;9971:3;9963:12;;;9950:26;9931:17;;;9924:53;10033:3;10025:12;;;10012:26;9993:17;;;9986:53;10058:3;10108:11;;;10095:25;10077:16;;;10070:51;10140:3;10190:11;;;10177:25;10159:16;;;10152:51;10222:3;10272:11;;;10259:25;10241:16;;;10234:51;10304:3;10345:11;;;10332:25;10369:16;;;10366:36;;;10398:1;10395;10388:12;10366:36;10436:58;10486:7;10475:8;10471:2;10467:17;10436:58;:::i;:::-;10431:2;10422:7;10418:16;10411:84;;;10514:7;10504:17;;;;;10568:2;10557:9;10553:18;10540:32;10530:42;;10619:3;10608:9;10604:19;10591:33;10581:43;;10671:3;10660:9;10656:19;10643:33;10633:43;;8791:1891;;;;;;;;:::o;10687:273::-;10743:6;10796:2;10784:9;10775:7;10771:23;10767:32;10764:52;;;10812:1;10809;10802:12;10764:52;10851:9;10838:23;10904:5;10897:13;10890:21;10883:5;10880:32;10870:60;;10926:1;10923;10916:12;10965:525;11052:6;11060;11068;11121:2;11109:9;11100:7;11096:23;11092:32;11089:52;;;11137:1;11134;11127:12;11089:52;11176:9;11163:23;11195:31;11220:5;11195:31;:::i;:::-;11245:5;-1:-1:-1;11301:2:6;11286:18;;11273:32;-1:-1:-1;;;;;11317:30:6;;11314:50;;;11360:1;11357;11350:12;11314:50;11383;11425:7;11416:6;11405:9;11401:22;11383:50;:::i;:::-;11373:60;;;11480:2;11469:9;11465:18;11452:32;11442:42;;10965:525;;;;;:::o;11495:456::-;11572:6;11580;11588;11641:2;11629:9;11620:7;11616:23;11612:32;11609:52;;;11657:1;11654;11647:12;11609:52;11696:9;11683:23;11715:31;11740:5;11715:31;:::i;:::-;11765:5;-1:-1:-1;11822:2:6;11807:18;;11794:32;11835:33;11794:32;11835:33;:::i;:::-;11495:456;;11887:7;;-1:-1:-1;;;11941:2:6;11926:18;;;;11913:32;;11495:456::o;11956:457::-;12034:6;12042;12095:2;12083:9;12074:7;12070:23;12066:32;12063:52;;;12111:1;12108;12101:12;12063:52;12151:9;12138:23;-1:-1:-1;;;;;12176:6:6;12173:30;12170:50;;;12216:1;12213;12206:12;12170:50;12239;12281:7;12272:6;12261:9;12257:22;12239:50;:::i;:::-;12229:60;;;12339:2;12328:9;12324:18;12311:32;12352:31;12377:5;12352:31;:::i;12418:954::-;12551:6;12559;12567;12575;12583;12591;12599;12652:3;12640:9;12631:7;12627:23;12623:33;12620:53;;;12669:1;12666;12659:12;12620:53;12708:9;12695:23;12727:31;12752:5;12727:31;:::i;:::-;12777:5;-1:-1:-1;12833:2:6;12818:18;;12805:32;-1:-1:-1;;;;;12886:14:6;;;12883:34;;;12913:1;12910;12903:12;12883:34;12936:50;12978:7;12969:6;12958:9;12954:22;12936:50;:::i;:::-;12926:60;;13039:2;13028:9;13024:18;13011:32;12995:48;;13068:2;13058:8;13055:16;13052:36;;;13084:1;13081;13074:12;13052:36;;13107:52;13151:7;13140:8;13129:9;13125:24;13107:52;:::i;:::-;12418:954;;;;-1:-1:-1;13097:62:6;;13206:2;13191:18;;13178:32;;-1:-1:-1;13257:3:6;13242:19;;13229:33;;13309:3;13294:19;;13281:33;;-1:-1:-1;13361:3:6;13346:19;;;13333:33;;-1:-1:-1;12418:954:6;-1:-1:-1;;;12418:954:6:o;13377:952::-;13426:3;13454:6;13487:5;13481:12;13476:3;13469:25;13540:4;13533:5;13529:16;13523:23;13555:48;13597:4;13592:3;13588:14;13574:12;-1:-1:-1;;;;;4434:31:6;4422:44;;4368:104;13555:48;;13651:4;13644:5;13640:16;13634:23;13689:2;13682:4;13677:3;13673:14;13666:26;13713:47;13756:2;13751:3;13747:12;13731:14;13713:47;:::i;:::-;13701:59;;;13808:4;13801:5;13797:16;13791:23;13856:3;13850:4;13846:14;13839:4;13834:3;13830:14;13823:38;13884:39;13918:4;13902:14;13884:39;:::i;:::-;13870:53;;;13972:4;13965:5;13961:16;13955:23;13948:4;13943:3;13939:14;13932:47;14028:4;14021:5;14017:16;14011:23;14004:4;13999:3;13995:14;13988:47;14084:4;14077:5;14073:16;14067:23;14060:4;14055:3;14051:14;14044:47;14140:4;14133:5;14129:16;14123:23;14116:4;14111:3;14107:14;14100:47;14166:6;14219:2;14212:5;14208:14;14202:21;14197:2;14192:3;14188:12;14181:43;;14243:6;14296:2;14289:5;14285:14;14279:21;14274:2;14269:3;14265:12;14258:43;;14317:6;14310:13;;;13377:952;;;;:::o;14334:255::-;14511:2;14500:9;14493:21;14474:4;14531:52;14579:2;14568:9;14564:18;14556:6;14531:52;:::i;14594:671::-;14680:6;14688;14696;14704;14757:3;14745:9;14736:7;14732:23;14728:33;14725:53;;;14774:1;14771;14764:12;14725:53;14813:9;14800:23;14832:31;14857:5;14832:31;:::i;:::-;14882:5;-1:-1:-1;14939:2:6;14924:18;;14911:32;14952:33;14911:32;14952:33;:::i;:::-;15004:7;-1:-1:-1;15063:2:6;15048:18;;15035:32;15076:33;15035:32;15076:33;:::i;:::-;15128:7;-1:-1:-1;15187:2:6;15172:18;;15159:32;15200:33;15159:32;15200:33;:::i;:::-;14594:671;;;;-1:-1:-1;14594:671:6;;-1:-1:-1;;14594:671:6:o;15478:348::-;15530:8;15540:6;15594:3;15587:4;15579:6;15575:17;15571:27;15561:55;;15612:1;15609;15602:12;15561:55;-1:-1:-1;15635:20:6;;-1:-1:-1;;;;;15667:30:6;;15664:50;;;15710:1;15707;15700:12;15664:50;15747:4;15739:6;15735:17;15723:29;;15799:3;15792:4;15783:6;15775;15771:19;15767:30;15764:39;15761:59;;;15816:1;15813;15806:12;15761:59;15478:348;;;;;:::o;15831:546::-;15911:6;15919;15927;15980:2;15968:9;15959:7;15955:23;15951:32;15948:52;;;15996:1;15993;15986:12;15948:52;16036:9;16023:23;-1:-1:-1;;;;;16061:6:6;16058:30;16055:50;;;16101:1;16098;16091:12;16055:50;16140:59;16191:7;16182:6;16171:9;16167:22;16140:59;:::i;:::-;16218:8;;-1:-1:-1;16114:85:6;-1:-1:-1;;16303:2:6;16288:18;;16275:32;16316:31;16275:32;16316:31;:::i;:::-;16366:5;16356:15;;;15831:546;;;;;:::o;16382:247::-;16441:6;16494:2;16482:9;16473:7;16469:23;16465:32;16462:52;;;16510:1;16507;16500:12;16462:52;16549:9;16536:23;16568:31;16593:5;16568:31;:::i;16634:838::-;16824:4;16853:2;16893;16882:9;16878:18;16923:2;16912:9;16905:21;16946:6;16981;16975:13;17012:6;17004;16997:22;17050:2;17039:9;17035:18;17028:25;;17112:2;17102:6;17099:1;17095:14;17084:9;17080:30;17076:39;17062:53;;17150:2;17142:6;17138:15;17171:1;17181:262;17195:6;17192:1;17189:13;17181:262;;;17288:2;17284:7;17272:9;17264:6;17260:22;17256:36;17251:3;17244:49;17316:47;17356:6;17347;17341:13;17316:47;:::i;:::-;17306:57;-1:-1:-1;17421:12:6;;;;17386:15;;;;17217:1;17210:9;17181:262;;;-1:-1:-1;17460:6:6;;16634:838;-1:-1:-1;;;;;;;16634:838:6:o;17477:411::-;17548:6;17556;17609:2;17597:9;17588:7;17584:23;17580:32;17577:52;;;17625:1;17622;17615:12;17577:52;17665:9;17652:23;-1:-1:-1;;;;;17690:6:6;17687:30;17684:50;;;17730:1;17727;17720:12;17684:50;17769:59;17820:7;17811:6;17800:9;17796:22;17769:59;:::i;:::-;17847:8;;17743:85;;-1:-1:-1;17477:411:6;-1:-1:-1;;;;17477:411:6:o;17893:390::-;17971:6;17979;18032:2;18020:9;18011:7;18007:23;18003:32;18000:52;;;18048:1;18045;18038:12;18000:52;18088:9;18075:23;-1:-1:-1;;;;;18113:6:6;18110:30;18107:50;;;18153:1;18150;18143:12;18107:50;18176;18218:7;18209:6;18198:9;18194:22;18176:50;:::i;:::-;18166:60;18273:2;18258:18;;;;18245:32;;-1:-1:-1;;;;17893:390:6:o;18288:356::-;18490:2;18472:21;;;18509:18;;;18502:30;18568:34;18563:2;18548:18;;18541:62;18635:2;18620:18;;18288:356::o;18649:276::-;18780:3;18818:6;18812:13;18834:53;18880:6;18875:3;18868:4;18860:6;18856:17;18834:53;:::i;:::-;18903:16;;;;;18649:276;-1:-1:-1;;18649:276:6:o;19274:282::-;-1:-1:-1;;;;;19474:32:6;;;;19456:51;;19538:2;19523:18;;19516:34;19444:2;19429:18;;19274:282::o;19848:380::-;19927:1;19923:12;;;;19970;;;19991:61;;20045:4;20037:6;20033:17;20023:27;;19991:61;20098:2;20090:6;20087:14;20067:18;20064:38;20061:161;;;20144:10;20139:3;20135:20;20132:1;20125:31;20179:4;20176:1;20169:15;20207:4;20204:1;20197:15;20061:161;;19848:380;;;:::o;20233:349::-;20435:2;20417:21;;;20474:2;20454:18;;;20447:30;20513:27;20508:2;20493:18;;20486:55;20573:2;20558:18;;20233:349::o;20587:::-;20789:2;20771:21;;;20828:2;20808:18;;;20801:30;20867:27;20862:2;20847:18;;20840:55;20927:2;20912:18;;20587:349::o;20941:350::-;21143:2;21125:21;;;21182:2;21162:18;;;21155:30;21221:28;21216:2;21201:18;;21194:56;21282:2;21267:18;;20941:350::o;21296:351::-;21498:2;21480:21;;;21537:2;21517:18;;;21510:30;21576:29;21571:2;21556:18;;21549:57;21638:2;21623:18;;21296:351::o;21652:336::-;21854:2;21836:21;;;21893:2;21873:18;;;21866:30;-1:-1:-1;;;21927:2:6;21912:18;;21905:42;21979:2;21964:18;;21652:336::o;21993:138::-;22072:13;;22094:31;22072:13;22094:31;:::i;22136:430::-;22190:5;22243:3;22236:4;22228:6;22224:17;22220:27;22210:55;;22261:1;22258;22251:12;22210:55;22290:6;22284:13;22321:49;22337:32;22366:2;22337:32;:::i;22321:49::-;22395:2;22386:7;22379:19;22441:3;22434:4;22429:2;22421:6;22417:15;22413:26;22410:35;22407:55;;;22458:1;22455;22448:12;22407:55;22471:64;22532:2;22525:4;22516:7;22512:18;22505:4;22497:6;22493:17;22471:64;:::i;22571:978::-;22640:5;22688:6;22676:9;22671:3;22667:19;22663:32;22660:52;;;22708:1;22705;22698:12;22660:52;22730:22;;:::i;:::-;22721:31;;22775:40;22805:9;22775:40;:::i;:::-;22768:5;22761:55;22848:49;22893:2;22882:9;22878:18;22848:49;:::i;:::-;22843:2;22836:5;22832:14;22825:73;22942:2;22931:9;22927:18;22921:25;-1:-1:-1;;;;;23006:2:6;22998:6;22995:14;22992:34;;;23022:1;23019;23012:12;22992:34;23058:57;23111:3;23102:6;23091:9;23087:22;23058:57;:::i;:::-;23053:2;23046:5;23042:14;23035:81;23169:2;23158:9;23154:18;23148:25;23143:2;23136:5;23132:14;23125:49;23228:3;23217:9;23213:19;23207:26;23201:3;23194:5;23190:15;23183:51;23288:3;23277:9;23273:19;23267:26;23261:3;23254:5;23250:15;23243:51;23340:3;23329:9;23325:19;23319:26;23303:42;;23370:2;23360:8;23357:16;23354:36;;;23386:1;23383;23376:12;23354:36;;23423:59;23478:3;23467:8;23456:9;23452:24;23423:59;:::i;:::-;23417:3;23410:5;23406:15;23399:84;;23537:3;23526:9;23522:19;23516:26;23510:3;23503:5;23499:15;23492:51;22571:978;;;;:::o;23554:1290::-;23647:6;23700:2;23688:9;23679:7;23675:23;23671:32;23668:52;;;23716:1;23713;23706:12;23668:52;23749:9;23743:16;-1:-1:-1;;;;;23819:2:6;23811:6;23808:14;23805:34;;;23835:1;23832;23825:12;23805:34;23858:22;;;;23914:6;23896:16;;;23892:29;23889:49;;;23934:1;23931;23924:12;23889:49;23960:22;;:::i;:::-;24005:33;24035:2;24005:33;:::i;:::-;23998:5;23991:48;24085:2;24081;24077:11;24071:18;24066:2;24059:5;24055:14;24048:42;24136:2;24132;24128:11;24122:18;24117:2;24110:5;24106:14;24099:42;24187:2;24183;24179:11;24173:18;24168:2;24161:5;24157:14;24150:42;24239:3;24235:2;24231:12;24225:19;24219:3;24212:5;24208:15;24201:44;24292:3;24288:2;24284:12;24278:19;24272:3;24265:5;24261:15;24254:44;24337:3;24333:2;24329:12;24323:19;24367:2;24357:8;24354:16;24351:36;;;24383:1;24380;24373:12;24351:36;24420:56;24468:7;24457:8;24453:2;24449:17;24420:56;:::i;:::-;24414:3;24407:5;24403:15;24396:81;;24524:3;24520:2;24516:12;24510:19;24504:3;24497:5;24493:15;24486:44;24549:3;24598:2;24594;24590:11;24584:18;24579:2;24572:5;24568:14;24561:42;;24622:3;24664:2;24660;24656:11;24650:18;24693:2;24683:8;24680:16;24677:36;;;24709:1;24706;24699:12;24677:36;24745:68;24805:7;24794:8;24790:2;24786:17;24745:68;:::i;:::-;24729:14;;;24722:92;;;;-1:-1:-1;24733:5:6;23554:1290;-1:-1:-1;;;;;23554:1290:6:o;25465:476::-;25533:5;25581:4;25569:9;25564:3;25560:19;25556:30;25553:50;;;25599:1;25596;25589:12;25553:50;25632:4;25626:11;25676:4;25668:6;25664:17;25747:6;25735:10;25732:22;-1:-1:-1;;;;;25699:10:6;25696:34;25693:62;25690:88;;;25758:18;;:::i;:::-;25794:4;25787:24;25859:16;;25844:32;;25930:2;25915:18;;;25909:25;25892:15;;;25885:50;;;;-1:-1:-1;25829:6:6;25465:476;-1:-1:-1;25465:476:6:o;25946:775::-;26016:5;26064:4;26052:9;26047:3;26043:19;26039:30;26036:50;;;26082:1;26079;26072:12;26036:50;26115:2;26109:9;26157:4;26149:6;26145:17;26228:6;26216:10;26213:22;-1:-1:-1;;;;;26180:10:6;26177:34;26174:62;26171:88;;;26239:18;;:::i;:::-;26279:10;26275:2;26268:22;;26308:6;26299:15;;26344:9;26338:16;26330:6;26323:32;26409:2;26398:9;26394:18;26388:25;26383:2;26375:6;26371:15;26364:50;26468:2;26457:9;26453:18;26447:25;26442:2;26434:6;26430:15;26423:50;26527:2;26516:9;26512:18;26506:25;26501:2;26493:6;26489:15;26482:50;26587:3;26576:9;26572:19;26566:26;26560:3;26552:6;26548:16;26541:52;26648:3;26637:9;26633:19;26627:26;26621:3;26613:6;26609:16;26602:52;26709:3;26698:9;26694:19;26688:26;26682:3;26674:6;26670:16;26663:52;;25946:775;;;;:::o;26726:1278::-;26818:6;26871:2;26859:9;26850:7;26846:23;26842:32;26839:52;;;26887:1;26884;26877:12;26839:52;26920:9;26914:16;-1:-1:-1;;;;;26990:2:6;26982:6;26979:14;26976:34;;;27006:1;27003;26996:12;26976:34;27029:22;;;;27085:6;27067:16;;;27063:29;27060:49;;;27105:1;27102;27095:12;27060:49;27131:22;;:::i;:::-;27176:33;27206:2;27176:33;:::i;:::-;27169:5;27162:48;27249:2;27245;27241:11;27235:18;27278:2;27268:8;27265:16;27262:36;;;27294:1;27291;27284:12;27262:36;27330:56;27378:7;27367:8;27363:2;27359:17;27330:56;:::i;:::-;27325:2;27318:5;27314:14;27307:80;;27426:2;27422;27418:11;27412:18;27455:2;27445:8;27442:16;27439:36;;;27471:1;27468;27461:12;27439:36;27507:56;27555:7;27544:8;27540:2;27536:17;27507:56;:::i;:::-;27502:2;27495:5;27491:14;27484:80;;27610:2;27606;27602:11;27596:18;27591:2;27584:5;27580:14;27573:42;27662:3;27658:2;27654:12;27648:19;27642:3;27635:5;27631:15;27624:44;27715:3;27711:2;27707:12;27701:19;27695:3;27688:5;27684:15;27677:44;27768:3;27764:2;27760:12;27754:19;27748:3;27741:5;27737:15;27730:44;27807:62;27861:7;27855:3;27851:2;27847:12;27807:62;:::i;:::-;27801:3;27794:5;27790:15;27783:87;27906:67;27965:7;27956:6;27952:2;27948:15;27906:67;:::i;:::-;27897:6;27886:18;;27879:95;27890:5;26726:1278;-1:-1:-1;;;;;26726:1278:6:o;28009:127::-;28070:10;28065:3;28061:20;28058:1;28051:31;28101:4;28098:1;28091:15;28125:4;28122:1;28115:15;28141:128;28181:3;28212:1;28208:6;28205:1;28202:13;28199:39;;;28218:18;;:::i;:::-;-1:-1:-1;28254:9:6;;28141:128::o;30790:184::-;30860:6;30913:2;30901:9;30892:7;30888:23;30884:32;30881:52;;;30929:1;30926;30919:12;30881:52;-1:-1:-1;30952:16:6;;30790:184;-1:-1:-1;30790:184:6:o;31737:273::-;31922:6;31914;31909:3;31896:33;31878:3;31948:16;;31973:13;;;31948:16;31737:273;-1:-1:-1;31737:273:6:o;32695:125::-;32735:4;32763:1;32760;32757:8;32754:34;;;32768:18;;:::i;:::-;-1:-1:-1;32805:9:6;;32695:125::o;34904:168::-;34944:7;35010:1;35006;35002:6;34998:14;34995:1;34992:21;34987:1;34980:9;34973:17;34969:45;34966:71;;;35017:18;;:::i;:::-;-1:-1:-1;35057:9:6;;34904:168::o;35420:127::-;35481:10;35476:3;35472:20;35469:1;35462:31;35512:4;35509:1;35502:15;35536:4;35533:1;35526:15;35552:469;35822:1;35818;35813:3;35809:11;35805:19;35797:6;35793:32;35782:9;35775:51;35862:6;35857:2;35846:9;35842:18;35835:34;35905:3;35900:2;35889:9;35885:18;35878:31;35756:4;35926:46;35967:3;35956:9;35952:19;35944:6;35926:46;:::i;:::-;35918:54;;36008:6;36003:2;35992:9;35988:18;35981:34;35552:469;;;;;;;:::o;40636:861::-;41005:25;;;-1:-1:-1;;;;;41066:32:6;;41061:2;41046:18;;41039:60;40993:3;41130:2;41115:18;;41108:30;;;40964:4;;41161:45;41187:18;;;41179:6;41161:45;:::i;:::-;41147:59;;41254:9;41246:6;41242:22;41237:2;41226:9;41222:18;41215:50;41282:33;41308:6;41300;41282:33;:::i;:::-;41274:41;;;41352:6;41346:3;41335:9;41331:19;41324:35;41396:6;41390:3;41379:9;41375:19;41368:35;41440:6;41434:3;41423:9;41419:19;41412:35;41484:6;41478:3;41467:9;41463:19;41456:35;40636:861;;;;;;;;;;;:::o

Swarm Source

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