Contract 0x0000000000000000000000000000000000001008 5

 
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x7f0bf14369ed6c32229821f6758a33dfdbbebd2b9a36550078f9688111eae12fApprove Bind111649982021-09-23 12:36:514 days 7 hrs ago0xbc88520fbe102835abcc59ed62f0e9f309eac6bf IN  BSC: Token Manager0.01 BNB0.00082733
0x3ebb5454c6bd81fd31cced28d091ed52123de0fae0f09ee335214188fa2d8d2fApprove Bind111617092021-09-23 9:50:374 days 10 hrs ago0xbc88520fbe102835abcc59ed62f0e9f309eac6bf IN  BSC: Token Manager0.01 BNB0.000144765
0x40b82405416fc763374cb00c427768031c61673fcdf46399540f309b5a5bf291Approve Bind111595642021-09-23 8:01:544 days 12 hrs ago0xbc88520fbe102835abcc59ed62f0e9f309eac6bf IN  BSC: Token Manager0.01 BNB0.0003341
0x3e8461b8be9b3b89bbed3861e6cc7788db70d617d51dd921e89b98255be4b228Approve Bind111594192021-09-23 7:54:394 days 12 hrs ago0xbc88520fbe102835abcc59ed62f0e9f309eac6bf IN  BSC: Token Manager0.01 BNB0.000190465
0x2ed65971ff695086722bc42b9326c93dbf675cdabdf3e216e078ef5bb50affa4Approve Bind109280572021-09-15 6:11:0212 days 14 hrs ago0xb3cb4dd2e46ee75f30f9921a662aa883cb04f62e IN  BSC: Token Manager0.002 BNB0.000751395
0x0bcb987c80e4fe96f4f6ceec56865390f3c8f064b5e758e9d94ded1a69af3945Approve Bind103958522021-08-27 14:17:1731 days 5 hrs ago0xefdcf1db83896d3358c2e4b8243c0e82fba5310d IN  BSC: Token Manager0.01 BNB0.000781245
0xbfc1a11e787f90a2d02d903e9f694e105064637fc605141d0c3c077a97721666Mirror98333042021-08-07 19:51:3251 days 24 mins ago0x9ed5a62535a5dd2db2d9bb21bac42035af47f630 IN  BSC: Token Manager10.01 BNB0.00071375
0xfd25441ceb9d7fcc650bb76f669c16ca0bfed4de3e057cf835ff21f46591d9b6Mirror84854682021-06-21 8:50:0398 days 11 hrs agoPax Dollar: Deployer IN  BSC: Token Manager10.002 BNB0.00130457
0xdb123fd2b7dfa01132777465affd7ae96de03b999e79b2ecdad1eef762640494Mirror84854662021-06-21 8:49:5798 days 11 hrs agoPax Dollar: Deployer IN  BSC: Token Manager10.002 BNB0.00133374
0x01d8644a066c3104ffad6ba707acada28e0cdd7c64775f7c02bca13a505272b2Mirror84854642021-06-21 8:49:5198 days 11 hrs agoPax Dollar: Deployer IN  BSC: Token Manager10.002 BNB0.00131829
0x1d7a9c7d2ad68c32ba171db847f1536536549a764ac8b87fd77b882e268ed45fMirror84854622021-06-21 8:49:4598 days 11 hrs agoPax Dollar: Deployer IN  BSC: Token Manager10.002 BNB0.00130895
0xaa67274f57cbfc3633d12a2d7dd3724322774778a3f84ddc200ceb6480a4105eMirror84854602021-06-21 8:49:3998 days 11 hrs agoPax Dollar: Deployer IN  BSC: Token Manager10.002 BNB0.00131229
0x04d825920f7ee06a1a0bf95ed0f3fbde1f0d01cf2f19c41a2374b742c6833309Mirror84854582021-06-21 8:49:3398 days 11 hrs agoPax Dollar: Deployer IN  BSC: Token Manager10.002 BNB0.00130247
0xf7af0091d5e52e25d6768496a5e83faa6a080a0043f353a89c631b130b32141fMirror84854562021-06-21 8:49:2798 days 11 hrs agoPax Dollar: Deployer IN  BSC: Token Manager10.002 BNB0.0013119
0x6f1f3d6859c1e6bb33aad214ce5cd72ad8da4cfe4b89a016b1ccc64bd18d9e95Mirror84854542021-06-21 8:49:2198 days 11 hrs agoPax Dollar: Deployer IN  BSC: Token Manager10.002 BNB0.001322
0xd5f2e9c6d0e6fde946c586977d4af6330dbbcdb95256d671382651019df5bb30Mirror83108452021-06-15 6:11:05104 days 14 hrs agoPax Dollar: Deployer IN  BSC: Token Manager10.002 BNB0.00142386
0xf2de90bac8a414223080d783410bafd2c8171b493d0d19fad397640f58b5b571Approve Bind82646882021-06-13 15:13:39106 days 5 hrs ago0x4820d226e443df5b41481edf7e515180a1e9a39c IN  BSC: Token Manager0.015 BNB0.000156095
0x71afe32273dd667b3e14aa361d76f6c467862e89664eb044aaf83ea2668ecfd4Expire Bind82645592021-06-13 15:07:12106 days 5 hrs ago0x4820d226e443df5b41481edf7e515180a1e9a39c IN  BSC: Token Manager0.01 BNB0.00026216
0xedc0fd3f8785f7734fbd794c98a8378814dbde49d26083c70dadd01092773fa3Approve Bind82640192021-06-13 14:40:11106 days 5 hrs ago0x4820d226e443df5b41481edf7e515180a1e9a39c IN  BSC: Token Manager0.01 BNB0.000156095
0x6bbb085a0fbac76dacb51ccf54d00e6548cd5866cc2ed1b29ef92df323a45808Approve Bind82633622021-06-13 14:07:01106 days 6 hrs ago0x4820d226e443df5b41481edf7e515180a1e9a39c IN  BSC: Token Manager0.01 BNB0.000156095
0x3d0763cbf80ab5a17fe342f4f095a1fecddbfe293256b4fb8ce4ea5250701210Mirror77686912021-05-27 8:25:10123 days 11 hrs agoPax Dollar: Deployer IN  BSC: Token Manager10.002 BNB0.00141715
0x486ba66685ae874f11697f3797f81a5c8378f160f13938683ad3e052ba10f6efMirror77414672021-05-26 9:28:41124 days 10 hrs agoPax Dollar: Deployer IN  BSC: Token Manager10.002 BNB0.00141715
0xc2b098114b4a5234411e6d9b9b5a5948b866c43c4dc4df53fcb5d7b6ac9bcd33Approve Bind74331812021-05-15 14:27:03135 days 5 hrs agoAeron: Deployer IN  BSC: Token Manager0.01 BNB0.00090987
0xfb26eda7f574eecf621b0361ecf4e88a43465de0dc4abed65adccdc9e9d913d2Approve Bind73863522021-05-13 22:32:50136 days 21 hrs agoAeron: Deployer IN  BSC: Token Manager0.01 BNB0.00090987
0x31ab443bc7f7e199df3b4c117f7151c21a8d35a1e2e6f031151ca78e41df34a9Approve Bind73841952021-05-13 20:44:04136 days 23 hrs agoAeron: Deployer IN  BSC: Token Manager0.01 BNB0.000168365
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x7f0bf14369ed6c32229821f6758a33dfdbbebd2b9a36550078f9688111eae12f111649982021-09-23 12:36:514 days 7 hrs ago BSC: Token Manager BSC: Token Hub0.01 BNB
0x40b82405416fc763374cb00c427768031c61673fcdf46399540f309b5a5bf291111595642021-09-23 8:01:544 days 12 hrs ago BSC: Token Manager BSC: Token Hub0.01 BNB
0x2ed65971ff695086722bc42b9326c93dbf675cdabdf3e216e078ef5bb50affa4109280572021-09-15 6:11:0212 days 14 hrs ago BSC: Token Manager BSC: Token Hub0.002 BNB
0x0bcb987c80e4fe96f4f6ceec56865390f3c8f064b5e758e9d94ded1a69af3945103958522021-08-27 14:17:1731 days 5 hrs ago BSC: Token Manager BSC: Token Hub0.01 BNB
0x1d9131a8effdcac9002e85ac28ebb938bf443828b86d194d805dbdee1421b66298333232021-08-07 19:52:3151 days 23 mins ago BSC: Token Manager BSC: Token Hub10 BNB
0xbfc1a11e787f90a2d02d903e9f694e105064637fc605141d0c3c077a9772166698333042021-08-07 19:51:3251 days 24 mins ago BSC: Token Manager BSC: Token Hub0.01 BNB
0xa852b54e7751a78e776badd605f81a043aa03be8b2859d2661798e0af8e1d82784854892021-06-21 8:51:0698 days 11 hrs ago BSC: Token Manager BSC: Token Hub10 BNB
0xf11ae54c24fbad8df3697373f16dcd870640f4d6ffae76dde6e76829b86690ee84854892021-06-21 8:51:0698 days 11 hrs ago BSC: Token Manager BSC: Token Hub10 BNB
0x57717a8b5c3e3d1a697aec4e0307bf93ab6d0077b2cdd55b9b148e11f6a4734d84854822021-06-21 8:50:4598 days 11 hrs ago BSC: Token Manager BSC: Token Hub10 BNB
0x0a6879073b83ea1d2edea1e51c10f3b2b545eab11722c4fa7dde3a8b70b3736284854822021-06-21 8:50:4598 days 11 hrs ago BSC: Token Manager BSC: Token Hub10 BNB
0xb71ff9727dfbefeb3c5f912155be30820858fb200ce1c22470e52e99271faef984854822021-06-21 8:50:4598 days 11 hrs ago BSC: Token Manager BSC: Token Hub10 BNB
0xce8d6b7789d66c6efb1e09f888983a84c0a9157acdf7bd74e21efad240f5299b84854752021-06-21 8:50:2498 days 11 hrs ago BSC: Token Manager BSC: Token Hub10 BNB
0xfc496d9f65b85dc8be015b953d2c2ee54868a608fd320e462389e85a22e8705a84854752021-06-21 8:50:2498 days 11 hrs ago BSC: Token Manager BSC: Token Hub10 BNB
0xa832e31cc0eee0a0ae582fcad1d0f1ef77eb56c15913e1150e8130554ba897bb84854752021-06-21 8:50:2498 days 11 hrs ago BSC: Token Manager BSC: Token Hub10 BNB
0xfd25441ceb9d7fcc650bb76f669c16ca0bfed4de3e057cf835ff21f46591d9b684854682021-06-21 8:50:0398 days 11 hrs ago BSC: Token Manager BSC: Token Hub0.002 BNB
0xdb123fd2b7dfa01132777465affd7ae96de03b999e79b2ecdad1eef76264049484854662021-06-21 8:49:5798 days 11 hrs ago BSC: Token Manager BSC: Token Hub0.002 BNB
0x01d8644a066c3104ffad6ba707acada28e0cdd7c64775f7c02bca13a505272b284854642021-06-21 8:49:5198 days 11 hrs ago BSC: Token Manager BSC: Token Hub0.002 BNB
0x1d7a9c7d2ad68c32ba171db847f1536536549a764ac8b87fd77b882e268ed45f84854622021-06-21 8:49:4598 days 11 hrs ago BSC: Token Manager BSC: Token Hub0.002 BNB
0xaa67274f57cbfc3633d12a2d7dd3724322774778a3f84ddc200ceb6480a4105e84854602021-06-21 8:49:3998 days 11 hrs ago BSC: Token Manager BSC: Token Hub0.002 BNB
0x04d825920f7ee06a1a0bf95ed0f3fbde1f0d01cf2f19c41a2374b742c683330984854582021-06-21 8:49:3398 days 11 hrs ago BSC: Token Manager BSC: Token Hub0.002 BNB
0xf7af0091d5e52e25d6768496a5e83faa6a080a0043f353a89c631b130b32141f84854562021-06-21 8:49:2798 days 11 hrs ago BSC: Token Manager BSC: Token Hub0.002 BNB
0x6f1f3d6859c1e6bb33aad214ce5cd72ad8da4cfe4b89a016b1ccc64bd18d9e9584854542021-06-21 8:49:2198 days 11 hrs ago BSC: Token Manager BSC: Token Hub0.002 BNB
0x076c99d96fc85249f18b48ffa2f7307094775f15355191f77723747441ca6b4c83108652021-06-15 6:12:05104 days 14 hrs ago BSC: Token Manager BSC: Token Hub10 BNB
0xd5f2e9c6d0e6fde946c586977d4af6330dbbcdb95256d671382651019df5bb3083108452021-06-15 6:11:05104 days 14 hrs ago BSC: Token Manager BSC: Token Hub0.002 BNB
0x71afe32273dd667b3e14aa361d76f6c467862e89664eb044aaf83ea2668ecfd482645592021-06-13 15:07:12106 days 5 hrs ago BSC: Token Manager BSC: Token Hub0.01 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TokenManager

Compiler Version
v0.6.4+commit.1dca32f3

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-03-01
*/

// File: contracts/interface/IBEP20.sol

pragma solidity 0.6.4;

interface IBEP20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the token decimals.
     */
    function decimals() external view returns (uint8);

    /**
     * @dev Returns the token symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the token name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the bep token owner.
     */
    function getOwner() external view returns (address);

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

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

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

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

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

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

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

// File: contracts/interface/ITokenHub.sol

pragma solidity 0.6.4;

interface ITokenHub {

  function getMiniRelayFee() external view returns(uint256);

  function getContractAddrByBEP2Symbol(bytes32 bep2Symbol) external view returns(address);

  function getBep2SymbolByContractAddr(address contractAddr) external view returns(bytes32);

  function bindToken(bytes32 bep2Symbol, address contractAddr, uint256 decimals) external;

  function unbindToken(bytes32 bep2Symbol, address contractAddr) external;

  function transferOut(address contractAddr, address recipient, uint256 amount, uint64 expireTime)
    external payable returns (bool);

  /* solium-disable-next-line */
  function batchTransferOutBNB(address[] calldata recipientAddrs, uint256[] calldata amounts, address[] calldata refundAddrs,
    uint64 expireTime) external payable returns (bool);

}

// File: contracts/interface/IApplication.sol

pragma solidity 0.6.4;

interface IApplication {
    /**
     * @dev Handle syn package
     */
    function handleSynPackage(uint8 channelId, bytes calldata msgBytes) external returns(bytes memory responsePayload);

    /**
     * @dev Handle ack package
     */
    function handleAckPackage(uint8 channelId, bytes calldata msgBytes) external;

    /**
     * @dev Handle fail ack package
     */
    function handleFailAckPackage(uint8 channelId, bytes calldata msgBytes) external;
}

// File: contracts/interface/ICrossChain.sol

pragma solidity 0.6.4;

interface ICrossChain {
    /**
     * @dev Send package to Binance Chain
     */
    function sendSynPackage(uint8 channelId, bytes calldata msgBytes, uint256 relayFee) external;
}

// File: contracts/interface/IParamSubscriber.sol

pragma solidity 0.6.4;

interface IParamSubscriber {
    function updateParam(string calldata key, bytes calldata value) external;
}

// File: contracts/lib/SafeMath.sol

pragma solidity 0.6.4;

/**
 * Copyright (c) 2016-2019 zOS Global Limited
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

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

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

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

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

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

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

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

// File: contracts/lib/RLPEncode.sol

pragma solidity 0.6.4;

library RLPEncode {

    uint8 constant STRING_OFFSET = 0x80;
    uint8 constant LIST_OFFSET = 0xc0;

    /**
     * @notice Encode string item
     * @param self The string (ie. byte array) item to encode
     * @return The RLP encoded string in bytes
     */
    function encodeBytes(bytes memory self) internal pure returns (bytes memory) {
        if (self.length == 1 && self[0] <= 0x7f) {
            return self;
        }
        return mergeBytes(encodeLength(self.length, STRING_OFFSET), self);
    }

    /**
     * @notice Encode address
     * @param self The address to encode
     * @return The RLP encoded address in bytes
     */
    function encodeAddress(address self) internal pure returns (bytes memory) {
        bytes memory b;
        assembly {
            let m := mload(0x40)
            mstore(add(m, 20), xor(0x140000000000000000000000000000000000000000, self))
            mstore(0x40, add(m, 52))
            b := m
        }
        return encodeBytes(b);
    }

    /**
     * @notice Encode uint
     * @param self The uint to encode
     * @return The RLP encoded uint in bytes
     */
    function encodeUint(uint self) internal pure returns (bytes memory) {
        return encodeBytes(toBinary(self));
    }

    /**
     * @notice Encode int
     * @param self The int to encode
     * @return The RLP encoded int in bytes
     */
    function encodeInt(int self) internal pure returns (bytes memory) {
        return encodeUint(uint(self));
    }

    /**
     * @notice Encode bool
     * @param self The bool to encode
     * @return The RLP encoded bool in bytes
     */
    function encodeBool(bool self) internal pure returns (bytes memory) {
        bytes memory rs = new bytes(1);
        if (self) {
            rs[0] = bytes1(uint8(1));
        }
        return rs;
    }

    /**
     * @notice Encode list of items
     * @param self The list of items to encode, each item in list must be already encoded
     * @return The RLP encoded list of items in bytes
     */
    function encodeList(bytes[] memory self) internal pure returns (bytes memory) {
        if (self.length == 0) {
            return new bytes(0);
        }
        bytes memory payload = self[0];
        for (uint i = 1; i < self.length; i++) {
            payload = mergeBytes(payload, self[i]);
        }
        return mergeBytes(encodeLength(payload.length, LIST_OFFSET), payload);
    }

    /**
     * @notice Concat two bytes arrays
     * @param _preBytes The first bytes array
     * @param _postBytes The second bytes array
     * @return The merged bytes array
     */
    function mergeBytes(
        bytes memory _preBytes,
        bytes memory _postBytes
    )
    internal
    pure
    returns (bytes memory)
    {
        bytes memory tempBytes;

        assembly {
        // Get a location of some free memory and store it in tempBytes as
        // Solidity does for memory variables.
            tempBytes := mload(0x40)

        // Store the length of the first bytes array at the beginning of
        // the memory for tempBytes.
            let length := mload(_preBytes)
            mstore(tempBytes, length)

        // Maintain a memory counter for the current write location in the
        // temp bytes array by adding the 32 bytes for the array length to
        // the starting location.
            let mc := add(tempBytes, 0x20)
        // Stop copying when the memory counter reaches the length of the
        // first bytes array.
            let end := add(mc, length)

            for {
            // Initialize a copy counter to the start of the _preBytes data,
            // 32 bytes into its memory.
                let cc := add(_preBytes, 0x20)
            } lt(mc, end) {
            // Increase both counters by 32 bytes each iteration.
                mc := add(mc, 0x20)
                cc := add(cc, 0x20)
            } {
            // Write the _preBytes data into the tempBytes memory 32 bytes
            // at a time.
                mstore(mc, mload(cc))
            }

        // Add the length of _postBytes to the current length of tempBytes
        // and store it as the new length in the first 32 bytes of the
        // tempBytes memory.
            length := mload(_postBytes)
            mstore(tempBytes, add(length, mload(tempBytes)))

        // Move the memory counter back from a multiple of 0x20 to the
        // actual end of the _preBytes data.
            mc := end
        // Stop copying when the memory counter reaches the new combined
        // length of the arrays.
            end := add(mc, length)

            for {
                let cc := add(_postBytes, 0x20)
            } lt(mc, end) {
                mc := add(mc, 0x20)
                cc := add(cc, 0x20)
            } {
                mstore(mc, mload(cc))
            }

        // Update the free-memory pointer by padding our last write location
        // to 32 bytes: add 31 bytes to the end of tempBytes to move to the
        // next 32 byte block, then round down to the nearest multiple of
        // 32. If the sum of the length of the two arrays is zero then add
        // one before rounding down to leave a blank 32 bytes (the length block with 0).
            mstore(0x40, and(
            add(add(end, iszero(add(length, mload(_preBytes)))), 31),
            not(31) // Round down to the nearest 32 bytes.
            ))
        }

        return tempBytes;
    }

    /**
     * @notice Encode the first byte, followed by the `length` in binary form if `length` is more than 55.
     * @param length The length of the string or the payload
     * @param offset `STRING_OFFSET` if item is string, `LIST_OFFSET` if item is list
     * @return RLP encoded bytes
     */
    function encodeLength(uint length, uint offset) internal pure returns (bytes memory) {
        require(length < 256**8, "input too long");
        bytes memory rs = new bytes(1);
        if (length <= 55) {
            rs[0] = byte(uint8(length + offset));
            return rs;
        }
        bytes memory bl = toBinary(length);
        rs[0] = byte(uint8(bl.length + offset + 55));
        return mergeBytes(rs, bl);
    }

    /**
     * @notice Encode integer in big endian binary form with no leading zeroes
     * @param x The integer to encode
     * @return RLP encoded bytes
     */
    function toBinary(uint x) internal pure returns (bytes memory) {
        bytes memory b = new bytes(32);
        assembly {
            mstore(add(b, 32), x)
        }
        uint i;
        if (x & 0xffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000 == 0) {
            i = 24;
        } else if (x & 0xffffffffffffffffffffffffffffffff00000000000000000000000000000000 == 0) {
            i = 16;
        } else {
            i = 0;
        }
        for (; i < 32; i++) {
            if (b[i] != 0) {
                break;
            }
        }
        uint length = 32 - i;
        bytes memory rs = new bytes(length);
        assembly {
            mstore(add(rs, length), x)
            mstore(rs, length)
        }
        return rs;
    }
}

// File: contracts/lib/RLPDecode.sol

pragma solidity 0.6.4;

library RLPDecode {
    uint8 constant STRING_SHORT_START = 0x80;
    uint8 constant STRING_LONG_START  = 0xb8;
    uint8 constant LIST_SHORT_START   = 0xc0;
    uint8 constant LIST_LONG_START    = 0xf8;

    uint8 constant WORD_SIZE = 32;

    struct RLPItem {
        uint len;
        uint memPtr;
    }

    struct Iterator {
        RLPItem item;   // Item that's being iterated over.
        uint nextPtr;   // Position of the next item in the list.
    }

    function next(Iterator memory self) internal pure returns (RLPItem memory) {
        require(hasNext(self));

        uint ptr = self.nextPtr;
        uint itemLength = _itemLength(ptr);
        self.nextPtr = ptr + itemLength;

        return RLPItem(itemLength, ptr);
    }

    function hasNext(Iterator memory self) internal pure returns (bool) {
        RLPItem memory item = self.item;
        return self.nextPtr < item.memPtr + item.len;
    }

    function toRLPItem(bytes memory self) internal pure returns (RLPItem memory) {
        uint memPtr;
        assembly {
            memPtr := add(self, 0x20)
        }

        return RLPItem(self.length, memPtr);
    }

    function iterator(RLPItem memory self) internal pure returns (Iterator memory) {
        require(isList(self));

        uint ptr = self.memPtr + _payloadOffset(self.memPtr);
        return Iterator(self, ptr);
    }

    function rlpLen(RLPItem memory item) internal pure returns (uint) {
        return item.len;
    }

    function payloadLen(RLPItem memory item) internal pure returns (uint) {
        return item.len - _payloadOffset(item.memPtr);
    }

    function toList(RLPItem memory item) internal pure returns (RLPItem[] memory) {
        require(isList(item));

        uint items = numItems(item);
        RLPItem[] memory result = new RLPItem[](items);

        uint memPtr = item.memPtr + _payloadOffset(item.memPtr);
        uint dataLen;
        for (uint i = 0; i < items; i++) {
            dataLen = _itemLength(memPtr);
            result[i] = RLPItem(dataLen, memPtr);
            memPtr = memPtr + dataLen;
        }

        return result;
    }

    function isList(RLPItem memory item) internal pure returns (bool) {
        if (item.len == 0) return false;

        uint8 byte0;
        uint memPtr = item.memPtr;
        assembly {
            byte0 := byte(0, mload(memPtr))
        }

        if (byte0 < LIST_SHORT_START)
            return false;
        return true;
    }

    function toRlpBytes(RLPItem memory item) internal pure returns (bytes memory) {
        bytes memory result = new bytes(item.len);
        if (result.length == 0) return result;

        uint ptr;
        assembly {
            ptr := add(0x20, result)
        }

        copy(item.memPtr, ptr, item.len);
        return result;
    }

    function toBoolean(RLPItem memory item) internal pure returns (bool) {
        require(item.len == 1);
        uint result;
        uint memPtr = item.memPtr;
        assembly {
            result := byte(0, mload(memPtr))
        }

        return result == 0 ? false : true;
    }

    function toAddress(RLPItem memory item) internal pure returns (address) {
        // 1 byte for the length prefix
        require(item.len == 21);

        return address(toUint(item));
    }

    function toUint(RLPItem memory item) internal pure returns (uint) {
        require(item.len > 0 && item.len <= 33);

        uint offset = _payloadOffset(item.memPtr);
        require(item.len >= offset, "length is less than offset");
        uint len = item.len - offset;

        uint result;
        uint memPtr = item.memPtr + offset;
        assembly {
            result := mload(memPtr)

        // shfit to the correct location if neccesary
            if lt(len, 32) {
                result := div(result, exp(256, sub(32, len)))
            }
        }

        return result;
    }

    // enforces 32 byte length
    function toUintStrict(RLPItem memory item) internal pure returns (uint) {
        // one byte prefix
        require(item.len == 33);

        uint result;
        uint memPtr = item.memPtr + 1;
        assembly {
            result := mload(memPtr)
        }

        return result;
    }

    function toBytes(RLPItem memory item) internal pure returns (bytes memory) {
        require(item.len > 0);

        uint offset = _payloadOffset(item.memPtr);
        uint len = item.len - offset; // data length
        bytes memory result = new bytes(len);

        uint destPtr;
        assembly {
            destPtr := add(0x20, result)
        }

        copy(item.memPtr + offset, destPtr, len);
        return result;
    }

    function numItems(RLPItem memory item) private pure returns (uint) {
        if (item.len == 0) return 0;

        uint count = 0;
        uint currPtr = item.memPtr + _payloadOffset(item.memPtr);
        uint endPtr = item.memPtr + item.len;
        while (currPtr < endPtr) {
            currPtr = currPtr + _itemLength(currPtr); // skip over an item
            count++;
        }

        return count;
    }

    function _itemLength(uint memPtr) private pure returns (uint) {
        uint itemLen;
        uint byte0;
        assembly {
            byte0 := byte(0, mload(memPtr))
        }

        if (byte0 < STRING_SHORT_START)
            itemLen = 1;

        else if (byte0 < STRING_LONG_START)
            itemLen = byte0 - STRING_SHORT_START + 1;

        else if (byte0 < LIST_SHORT_START) {
            uint dataLen;
            assembly {
                let byteLen := sub(byte0, 0xb7) // # of bytes the actual length is
                memPtr := add(memPtr, 1) // skip over the first byte

                /* 32 byte word size */
                dataLen := div(mload(memPtr), exp(256, sub(32, byteLen))) // right shifting to get the len
                itemLen := add(dataLen, add(byteLen, 1))
            }
            require(itemLen >= dataLen, "addition overflow");
        }

        else if (byte0 < LIST_LONG_START) {
            itemLen = byte0 - LIST_SHORT_START + 1;
        }

        else {
            uint dataLen;
            assembly {
                let byteLen := sub(byte0, 0xf7)
                memPtr := add(memPtr, 1)

                dataLen := div(mload(memPtr), exp(256, sub(32, byteLen))) // right shifting to the correct length
                itemLen := add(dataLen, add(byteLen, 1))
            }
            require(itemLen >= dataLen, "addition overflow");
        }

        return itemLen;
    }

    // @return number of bytes until the data
    function _payloadOffset(uint memPtr) private pure returns (uint) {
        uint byte0;
        assembly {
            byte0 := byte(0, mload(memPtr))
        }

        if (byte0 < STRING_SHORT_START)
            return 0;
        else if (byte0 < STRING_LONG_START || (byte0 >= LIST_SHORT_START && byte0 < LIST_LONG_START))
            return 1;
        else if (byte0 < LIST_SHORT_START)  // being explicit
            return byte0 - (STRING_LONG_START - 1) + 1;
        else
            return byte0 - (LIST_LONG_START - 1) + 1;
    }

    /*
    * @param src Pointer to source
    * @param dest Pointer to destination
    * @param len Amount of memory to copy from the source
    */
    function copy(uint src, uint dest, uint len) private pure {
        if (len == 0) return;

        // copy as many word sizes as possible
        for (; len >= WORD_SIZE; len -= WORD_SIZE) {
            assembly {
                mstore(dest, mload(src))
            }

            src += WORD_SIZE;
            dest += WORD_SIZE;
        }

        // left over bytes. Mask is used to remove unwanted bytes from the word
        uint mask = 256 ** (WORD_SIZE - len) - 1;
        assembly {
            let srcpart := and(mload(src), not(mask)) // zero out src
            let destpart := and(mload(dest), mask) // retrieve the bytes
            mstore(dest, or(destpart, srcpart))
        }
    }
}

// File: contracts/interface/ISystemReward.sol

pragma solidity 0.6.4;

interface ISystemReward {
  function claimRewards(address payable to, uint256 amount) external returns(uint256 actualAmount);
}

// File: contracts/interface/IRelayerHub.sol

pragma solidity 0.6.4;

interface IRelayerHub {
  function isRelayer(address sender) external view returns (bool);
}

// File: contracts/interface/ILightClient.sol

pragma solidity 0.6.4;

interface ILightClient {

  function isHeaderSynced(uint64 height) external view returns (bool);

  function getAppHash(uint64 height) external view returns (bytes32);

  function getSubmitter(uint64 height) external view returns (address payable);

}

// File: contracts/System.sol

pragma solidity 0.6.4;




contract System {

  bool public alreadyInit;

  uint32 public constant CODE_OK = 0;
  uint32 public constant ERROR_FAIL_DECODE = 100;

  uint8 constant public BIND_CHANNELID = 0x01;
  uint8 constant public TRANSFER_IN_CHANNELID = 0x02;
  uint8 constant public TRANSFER_OUT_CHANNELID = 0x03;
  uint8 constant public STAKING_CHANNELID = 0x08;
  uint8 constant public GOV_CHANNELID = 0x09;
  uint8 constant public SLASH_CHANNELID = 0x0b;
  uint16 constant public bscChainID = 0x0038;

  address public constant VALIDATOR_CONTRACT_ADDR = 0x0000000000000000000000000000000000001000;
  address public constant SLASH_CONTRACT_ADDR = 0x0000000000000000000000000000000000001001;
  address public constant SYSTEM_REWARD_ADDR = 0x0000000000000000000000000000000000001002;
  address public constant LIGHT_CLIENT_ADDR = 0x0000000000000000000000000000000000001003;
  address public constant TOKEN_HUB_ADDR = 0x0000000000000000000000000000000000001004;
  address public constant INCENTIVIZE_ADDR=0x0000000000000000000000000000000000001005;
  address public constant RELAYERHUB_CONTRACT_ADDR = 0x0000000000000000000000000000000000001006;
  address public constant GOV_HUB_ADDR = 0x0000000000000000000000000000000000001007;
  address public constant TOKEN_MANAGER_ADDR = 0x0000000000000000000000000000000000001008;
  address public constant CROSS_CHAIN_CONTRACT_ADDR = 0x0000000000000000000000000000000000002000;


  modifier onlyCoinbase() {
    require(msg.sender == block.coinbase, "the message sender must be the block producer");
    _;
  }

  modifier onlyNotInit() {
    require(!alreadyInit, "the contract already init");
    _;
  }

  modifier onlyInit() {
    require(alreadyInit, "the contract not init yet");
    _;
  }

  modifier onlySlash() {
    require(msg.sender == SLASH_CONTRACT_ADDR, "the message sender must be slash contract");
    _;
  }

  modifier onlyTokenHub() {
    require(msg.sender == TOKEN_HUB_ADDR, "the message sender must be token hub contract");
    _;
  }

  modifier onlyGov() {
    require(msg.sender == GOV_HUB_ADDR, "the message sender must be governance contract");
    _;
  }

  modifier onlyValidatorContract() {
    require(msg.sender == VALIDATOR_CONTRACT_ADDR, "the message sender must be validatorSet contract");
    _;
  }

  modifier onlyCrossChainContract() {
    require(msg.sender == CROSS_CHAIN_CONTRACT_ADDR, "the message sender must be cross chain contract");
    _;
  }

  modifier onlyRelayerIncentivize() {
    require(msg.sender == INCENTIVIZE_ADDR, "the message sender must be incentivize contract");
    _;
  }

  modifier onlyRelayer() {
    require(IRelayerHub(RELAYERHUB_CONTRACT_ADDR).isRelayer(msg.sender), "the msg sender is not a relayer");
    _;
  }

  modifier onlyTokenManager() {
    require(msg.sender == TOKEN_MANAGER_ADDR, "the msg sender must be tokenManager");
    _;
  }

  // Not reliable, do not use when need strong verify
  function isContract(address addr) internal view returns (bool) {
    uint size;
    assembly { size := extcodesize(addr) }
    return size > 0;
  }
}

// File: contracts/TokenManager.sol

pragma solidity 0.6.4;










contract TokenManager is System, IApplication, IParamSubscriber {

  using SafeMath for uint256;

  using RLPEncode for *;
  using RLPDecode for *;

  using RLPDecode for RLPDecode.RLPItem;
  using RLPDecode for RLPDecode.Iterator;

  // BC to BSC
  struct BindSynPackage {
    uint8   packageType;
    bytes32 bep2TokenSymbol;
    address contractAddr;
    uint256 totalSupply;
    uint256 peggyAmount;
    uint8   bep20Decimals;
    uint64  expireTime;
  }

  // BSC to BC
  struct ReactBindSynPackage {
    uint32 status;
    bytes32 bep2TokenSymbol;
  }

  // BSC to BC
  struct MirrorSynPackage {
    address mirrorSender;
    address bep20Addr;
    bytes32 bep20Name;
    bytes32 bep20Symbol;
    uint256 bep20Supply;
    uint8   bep20Decimals;
    uint256 mirrorFee;
    uint64  expireTime;
  }

  // BC to BSC
  struct MirrorAckPackage {
    address mirrorSender;
    address bep20Addr;
    uint8  bep20Decimals;
    bytes32 bep2Symbol;
    uint256 mirrorFee;
    uint8   errorCode;
  }

  // BSC to BC
  struct SyncSynPackage {
    address syncSender;
    address bep20Addr;
    bytes32 bep2Symbol;
    uint256 bep20Supply;
    uint256 syncFee;
    uint64  expireTime;
  }

  // BC to BSC
  struct SyncAckPackage {
    address syncSender;
    address bep20Addr;
    uint256 syncFee;
    uint8   errorCode;
  }

  uint8 constant public   BIND_PACKAGE = 0;
  uint8 constant public   UNBIND_PACKAGE = 1;

  // bind status
  uint8 constant public   BIND_STATUS_TIMEOUT = 1;
  uint8 constant public   BIND_STATUS_SYMBOL_MISMATCH = 2;
  uint8 constant public   BIND_STATUS_TOO_MUCH_TOKENHUB_BALANCE = 3;
  uint8 constant public   BIND_STATUS_TOTAL_SUPPLY_MISMATCH = 4;
  uint8 constant public   BIND_STATUS_DECIMALS_MISMATCH = 5;
  uint8 constant public   BIND_STATUS_ALREADY_BOUND_TOKEN = 6;
  uint8 constant public   BIND_STATUS_REJECTED = 7;

  uint8 constant public MIRROR_CHANNELID = 0x04;
  uint8 constant public SYNC_CHANNELID = 0x05;
  uint8 constant public BEP2_TOKEN_DECIMALS = 8;
  uint256 constant public MAX_GAS_FOR_TRANSFER_BNB=10000;
  uint256 constant public MAX_BEP2_TOTAL_SUPPLY = 9000000000000000000;
  uint256 constant public LOG_MAX_UINT256 = 77;
  // mirror status
  uint8 constant public   MIRROR_STATUS_TIMEOUT = 1;
  uint8 constant public   MIRROR_STATUS_DUPLICATED_BEP2_SYMBOL = 2;
  uint8 constant public   MIRROR_STATUS_ALREADY_BOUND = 3;
  // sync status
  uint8 constant public   SYNC_STATUS_TIMEOUT = 1;
  uint8 constant public   SYNC_STATUS_NOT_BOUND_MIRROR = 2;

  uint8 constant public   MINIMUM_BEP20_SYMBOL_LEN = 2;
  uint8 constant public   MAXIMUM_BEP20_SYMBOL_LEN = 8;

  uint256 constant public  TEN_DECIMALS = 1e10;

  mapping(bytes32 => BindSynPackage) public bindPackageRecord;

  mapping(address => bool) public mirrorPendingRecord;
  mapping(address => bool) public boundByMirror;
  uint256 public mirrorFee;
  uint256 public syncFee;

  event bindSuccess(address indexed contractAddr, string bep2Symbol, uint256 totalSupply, uint256 peggyAmount);
  event bindFailure(address indexed contractAddr, string bep2Symbol, uint32 failedReason);
  event unexpectedPackage(uint8 channelId, bytes msgBytes);
  event paramChange(string key, bytes value);
  event mirrorSuccess(address indexed bep20Addr, bytes32 bep2Symbol);
  event mirrorFailure(address indexed bep20Addr, uint8 errCode);
  event syncSuccess(address indexed bep20Addr);
  event syncFailure(address indexed bep20Addr, uint8 errCode);

  constructor() public {}

  function handleSynPackage(uint8 channelId, bytes calldata msgBytes) onlyCrossChainContract external override returns(bytes memory) {
    if (channelId == BIND_CHANNELID) {
      return handleBindSynPackage(msgBytes);
    } else {
      emit unexpectedPackage(channelId, msgBytes);
      return new bytes(0);
    }
  }

  function handleAckPackage(uint8 channelId, bytes calldata msgBytes) onlyCrossChainContract external override {
    if (channelId == MIRROR_CHANNELID) {
      handleMirrorAckPackage(msgBytes);
    } else if (channelId == SYNC_CHANNELID) {
      handleSyncAckPackage(msgBytes);
    } else {
      emit unexpectedPackage(channelId, msgBytes);
    }
  }

  function handleFailAckPackage(uint8 channelId, bytes calldata msgBytes) onlyCrossChainContract external override {
    if (channelId == MIRROR_CHANNELID) {
      handleMirrorFailAckPackage(msgBytes);
    } else if (channelId == SYNC_CHANNELID) {
      handleSyncFailAckPackage(msgBytes);
    } else {
      emit unexpectedPackage(channelId, msgBytes);
    }
  }

  function decodeBindSynPackage(bytes memory msgBytes) internal pure returns(BindSynPackage memory, bool) {
    BindSynPackage memory bindSynPkg;
    RLPDecode.Iterator memory iter = msgBytes.toRLPItem().iterator();
    bool success = false;
    uint256 idx=0;
    while (iter.hasNext()) {
        if (idx == 0)      bindSynPkg.packageType      = uint8(iter.next().toUint());
        else if (idx == 1) bindSynPkg.bep2TokenSymbol  = bytes32(iter.next().toUint());
        else if (idx == 2) bindSynPkg.contractAddr     = iter.next().toAddress();
        else if (idx == 3) bindSynPkg.totalSupply      = iter.next().toUint();
        else if (idx == 4) bindSynPkg.peggyAmount      = iter.next().toUint();
        else if (idx == 5) bindSynPkg.bep20Decimals    = uint8(iter.next().toUint());
        else if (idx == 6) {
          bindSynPkg.expireTime       = uint64(iter.next().toUint());
          success = true;
        }
        else break;
        idx++;
    }
    return (bindSynPkg, success);
  }

  function handleBindSynPackage(bytes memory msgBytes) internal returns(bytes memory) {
    (BindSynPackage memory bindSynPkg, bool success) = decodeBindSynPackage(msgBytes);
    require(success, "unrecognized transferIn package");
    if (bindSynPkg.packageType == BIND_PACKAGE) {
      bindPackageRecord[bindSynPkg.bep2TokenSymbol]=bindSynPkg;
    } else if (bindSynPkg.packageType == UNBIND_PACKAGE) {
      address contractAddr = ITokenHub(TOKEN_HUB_ADDR).getContractAddrByBEP2Symbol(bindSynPkg.bep2TokenSymbol);
      if (contractAddr!=address(0x00)) {
        ITokenHub(TOKEN_HUB_ADDR).unbindToken(bindSynPkg.bep2TokenSymbol, contractAddr);
      }
    } else {
      require(false, "unrecognized bind package");
    }
    return new bytes(0);
  }

  function encodeReactBindSynPackage(ReactBindSynPackage memory reactBindSynPackage) internal pure returns (bytes memory) {
    bytes[] memory elements = new bytes[](2);
    elements[0] = reactBindSynPackage.status.encodeUint();
    elements[1] = uint256(reactBindSynPackage.bep2TokenSymbol).encodeUint();
    return elements.encodeList();
  }

  function approveBind(address contractAddr, string memory bep2Symbol) payable public returns (bool) {
    require(!mirrorPendingRecord[contractAddr], "the bep20 token is in mirror pending status");
    bytes32 bep2TokenSymbol = bep2TokenSymbolConvert(bep2Symbol);
    BindSynPackage memory bindSynPkg = bindPackageRecord[bep2TokenSymbol];
    require(bindSynPkg.bep2TokenSymbol!=bytes32(0x00), "bind request doesn't exist");
    uint256 lockedAmount = bindSynPkg.totalSupply.sub(bindSynPkg.peggyAmount);
    require(contractAddr==bindSynPkg.contractAddr, "contact address doesn't equal to the contract address in bind request");
    require(IBEP20(contractAddr).getOwner()==msg.sender, "only bep20 owner can approve this bind request");
    uint256 tokenHubBalance = IBEP20(contractAddr).balanceOf(TOKEN_HUB_ADDR);
    require(IBEP20(contractAddr).allowance(msg.sender, address(this)).add(tokenHubBalance)>=lockedAmount, "allowance is not enough");
    uint256 relayFee = msg.value;
    uint256 miniRelayFee = ITokenHub(TOKEN_HUB_ADDR).getMiniRelayFee();
    require(relayFee >= miniRelayFee && relayFee%TEN_DECIMALS == 0, "relayFee must be N * 1e10 and greater than miniRelayFee");

    uint32 verifyCode = verifyBindParameters(bindSynPkg, contractAddr);
    if (verifyCode == CODE_OK) {
      IBEP20(contractAddr).transferFrom(msg.sender, TOKEN_HUB_ADDR, lockedAmount.sub(tokenHubBalance));
      ITokenHub(TOKEN_HUB_ADDR).bindToken(bindSynPkg.bep2TokenSymbol, bindSynPkg.contractAddr, bindSynPkg.bep20Decimals);
      emit bindSuccess(contractAddr, bep2Symbol, bindSynPkg.totalSupply, lockedAmount);
    } else {
      emit bindFailure(contractAddr, bep2Symbol, verifyCode);
    }
    delete bindPackageRecord[bep2TokenSymbol];
    ReactBindSynPackage memory reactBindSynPackage = ReactBindSynPackage({
      status: verifyCode,
      bep2TokenSymbol: bep2TokenSymbol
    });
    address(uint160(TOKEN_HUB_ADDR)).transfer(relayFee);
    ICrossChain(CROSS_CHAIN_CONTRACT_ADDR).sendSynPackage(BIND_CHANNELID, encodeReactBindSynPackage(reactBindSynPackage), relayFee.div(TEN_DECIMALS));
    return true;
  }

  function rejectBind(address contractAddr, string memory bep2Symbol) payable public returns (bool) {
    bytes32 bep2TokenSymbol = bep2TokenSymbolConvert(bep2Symbol);
    BindSynPackage memory bindSynPkg = bindPackageRecord[bep2TokenSymbol];
    require(bindSynPkg.bep2TokenSymbol!=bytes32(0x00), "bind request doesn't exist");
    require(contractAddr==bindSynPkg.contractAddr, "contact address doesn't equal to the contract address in bind request");
    require(IBEP20(contractAddr).getOwner()==msg.sender, "only bep20 owner can reject");
    uint256 relayFee = msg.value;
    uint256 miniRelayFee = ITokenHub(TOKEN_HUB_ADDR).getMiniRelayFee();
    require(relayFee >= miniRelayFee && relayFee%TEN_DECIMALS == 0, "relayFee must be N * 1e10 and greater than miniRelayFee");
    delete bindPackageRecord[bep2TokenSymbol];
    ReactBindSynPackage memory reactBindSynPackage = ReactBindSynPackage({
      status: BIND_STATUS_REJECTED,
      bep2TokenSymbol: bep2TokenSymbol
    });
    address(uint160(TOKEN_HUB_ADDR)).transfer(relayFee);
    ICrossChain(CROSS_CHAIN_CONTRACT_ADDR).sendSynPackage(BIND_CHANNELID, encodeReactBindSynPackage(reactBindSynPackage), relayFee.div(TEN_DECIMALS));
    emit bindFailure(contractAddr, bep2Symbol, BIND_STATUS_REJECTED);
    return true;
  }

  function expireBind(string memory bep2Symbol) payable public returns (bool) {
    bytes32 bep2TokenSymbol = bep2TokenSymbolConvert(bep2Symbol);
    BindSynPackage memory bindSynPkg = bindPackageRecord[bep2TokenSymbol];
    require(bindSynPkg.bep2TokenSymbol!=bytes32(0x00), "bind request doesn't exist");
    require(bindSynPkg.expireTime<block.timestamp, "bind request is not expired");
    uint256 relayFee = msg.value;
    uint256 miniRelayFee = ITokenHub(TOKEN_HUB_ADDR).getMiniRelayFee();
    require(relayFee >= miniRelayFee &&relayFee%TEN_DECIMALS == 0, "relayFee must be N * 1e10 and greater than miniRelayFee");
    delete bindPackageRecord[bep2TokenSymbol];
    ReactBindSynPackage memory reactBindSynPackage = ReactBindSynPackage({
      status: BIND_STATUS_TIMEOUT,
      bep2TokenSymbol: bep2TokenSymbol
    });
    address(uint160(TOKEN_HUB_ADDR)).transfer(relayFee);
    ICrossChain(CROSS_CHAIN_CONTRACT_ADDR).sendSynPackage(BIND_CHANNELID, encodeReactBindSynPackage(reactBindSynPackage), relayFee.div(TEN_DECIMALS));
    emit bindFailure(bindSynPkg.contractAddr, bep2Symbol, BIND_STATUS_TIMEOUT);
    return true;
  }

  function encodeMirrorSynPackage(MirrorSynPackage memory mirrorSynPackage) internal pure returns (bytes memory) {
    bytes[] memory elements = new bytes[](8);
    elements[0] = mirrorSynPackage.mirrorSender.encodeAddress();
    elements[1] = mirrorSynPackage.bep20Addr.encodeAddress();
    elements[2] = uint256(mirrorSynPackage.bep20Name).encodeUint();
    elements[3] = uint256(mirrorSynPackage.bep20Symbol).encodeUint();
    elements[4] = mirrorSynPackage.bep20Supply.encodeUint();
    elements[5] = uint256(mirrorSynPackage.bep20Decimals).encodeUint();
    elements[6] = mirrorSynPackage.mirrorFee.encodeUint();
    elements[7] = uint256(mirrorSynPackage.expireTime).encodeUint();
    return elements.encodeList();
  }

  function decodeMirrorSynPackage(bytes memory msgBytes) internal pure returns(MirrorSynPackage memory, bool) {
    MirrorSynPackage memory mirrorSynPackage;
    RLPDecode.Iterator memory iter = msgBytes.toRLPItem().iterator();
    bool success = false;
    uint256 idx=0;
    while (iter.hasNext()) {
      if (idx == 0)      mirrorSynPackage.mirrorSender  = iter.next().toAddress();
      else if (idx == 1) mirrorSynPackage.bep20Addr     = iter.next().toAddress();
      else if (idx == 2) mirrorSynPackage.bep20Name     = bytes32(iter.next().toUint());
      else if (idx == 3) mirrorSynPackage.bep20Symbol   = bytes32(iter.next().toUint());
      else if (idx == 4) mirrorSynPackage.bep20Supply   = iter.next().toUint();
      else if (idx == 5) mirrorSynPackage.bep20Decimals = uint8(iter.next().toUint());
      else if (idx == 6) mirrorSynPackage.mirrorFee     = iter.next().toUint();
      else if (idx == 7) {
        mirrorSynPackage.expireTime = uint64(iter.next().toUint());
        success = true;
      }
      else break;
      idx++;
    }
    return (mirrorSynPackage, success);
  }

  function decodeMirrorAckPackage(bytes memory msgBytes) internal pure returns(MirrorAckPackage memory, bool) {
    MirrorAckPackage memory mirrorAckPackage;
    RLPDecode.Iterator memory iter = msgBytes.toRLPItem().iterator();
    bool success = false;
    uint256 idx=0;
    while (iter.hasNext()) {
      if (idx == 0)      mirrorAckPackage.mirrorSender   = iter.next().toAddress();
      else if (idx == 1) mirrorAckPackage.bep20Addr      = iter.next().toAddress();
      else if (idx == 2) mirrorAckPackage.bep20Decimals  = uint8(iter.next().toUint());
      else if (idx == 3) mirrorAckPackage.bep2Symbol     = bytes32(iter.next().toUint());
      else if (idx == 4) mirrorAckPackage.mirrorFee      = iter.next().toUint();
      else if (idx == 5) {
        mirrorAckPackage.errorCode  = uint8(iter.next().toUint());
        success = true;
      }
      else break;
      idx++;
    }
    return (mirrorAckPackage, success);
  }

  function mirror(address bep20Addr, uint64 expireTime) payable public returns (bool) {
    require(ITokenHub(TOKEN_HUB_ADDR).getBep2SymbolByContractAddr(bep20Addr) == bytes32(0x00), "already bound");
    require(!mirrorPendingRecord[bep20Addr], "mirror pending");
    uint256 miniRelayFee = ITokenHub(TOKEN_HUB_ADDR).getMiniRelayFee();
    require(msg.value%TEN_DECIMALS == 0 && msg.value>=mirrorFee.add(miniRelayFee), "msg.value must be N * 1e10 and greater than sum of miniRelayFee and mirrorFee");
    require(expireTime>=block.timestamp + 120 && expireTime <= block.timestamp + 86400, "expireTime must be two minutes later and one day earlier");
    uint8 decimals = IBEP20(bep20Addr).decimals();
    uint256 totalSupply = IBEP20(bep20Addr).totalSupply();
    require(convertToBep2Amount(totalSupply, decimals) <= MAX_BEP2_TOTAL_SUPPLY, "too large total supply");
    string memory name = IBEP20(bep20Addr).name();
    bytes memory nameBytes = bytes(name);
    require(nameBytes.length>=1 && nameBytes.length<=32, "name length must be in [1,32]");
    string memory symbol = IBEP20(bep20Addr).symbol();
    bytes memory symbolBytes = bytes(symbol);
    require(symbolBytes.length>=MINIMUM_BEP20_SYMBOL_LEN && symbolBytes.length<=MAXIMUM_BEP20_SYMBOL_LEN, "symbol length must be in [2,8]");
    for (uint8 i = 0; i < symbolBytes.length; i++) {
      require((symbolBytes[i]>='A' && symbolBytes[i]<='Z') || (symbolBytes[i]>='a' && symbolBytes[i]<='z') || (symbolBytes[i]>='0' && symbolBytes[i]<='9'), "symbol should only contain alphabet and number");
    }
    address(uint160(TOKEN_HUB_ADDR)).transfer(msg.value.sub(mirrorFee));
    mirrorPendingRecord[bep20Addr] = true;
    bytes32 bytes32Name;
    assembly {
      bytes32Name := mload(add(name, 32))
    }
    bytes32 bytes32Symbol;
    assembly {
      bytes32Symbol := mload(add(symbol, 32))
    }
    MirrorSynPackage memory mirrorSynPackage = MirrorSynPackage({
      mirrorSender:  msg.sender,
      bep20Addr:     bep20Addr,
      bep20Name:     bytes32Name,
      bep20Symbol:   bytes32Symbol,
      bep20Supply:   totalSupply,
      bep20Decimals: decimals,
      mirrorFee:     mirrorFee.div(TEN_DECIMALS),
      expireTime:    expireTime
      });
    ICrossChain(CROSS_CHAIN_CONTRACT_ADDR).sendSynPackage(MIRROR_CHANNELID, encodeMirrorSynPackage(mirrorSynPackage), msg.value.sub(mirrorFee).div(TEN_DECIMALS));
    return true;
  }

  function handleMirrorAckPackage(bytes memory msgBytes) internal {
    (MirrorAckPackage memory mirrorAckPackage, bool decodeSuccess) = decodeMirrorAckPackage(msgBytes);
    require(decodeSuccess, "unrecognized package");
    mirrorPendingRecord[mirrorAckPackage.bep20Addr] = false;
    if (mirrorAckPackage.errorCode == CODE_OK ) {
      address(uint160(TOKEN_HUB_ADDR)).transfer(mirrorAckPackage.mirrorFee);
      ITokenHub(TOKEN_HUB_ADDR).bindToken(mirrorAckPackage.bep2Symbol, mirrorAckPackage.bep20Addr, mirrorAckPackage.bep20Decimals);
      boundByMirror[mirrorAckPackage.bep20Addr] = true;
      emit mirrorSuccess(mirrorAckPackage.bep20Addr, mirrorAckPackage.bep2Symbol);
      return;
    } else {
      (bool success, ) = mirrorAckPackage.mirrorSender.call{gas: MAX_GAS_FOR_TRANSFER_BNB, value: mirrorAckPackage.mirrorFee}("");
      if (!success) {
        address(uint160(SYSTEM_REWARD_ADDR)).transfer(mirrorAckPackage.mirrorFee);
      }
      emit mirrorFailure(mirrorAckPackage.bep20Addr, mirrorAckPackage.errorCode);
    }
  }

  function handleMirrorFailAckPackage(bytes memory msgBytes) internal {
    (MirrorSynPackage memory mirrorSynPackage, bool decodeSuccess) = decodeMirrorSynPackage(msgBytes);
    require(decodeSuccess, "unrecognized package");
    mirrorPendingRecord[mirrorSynPackage.bep20Addr] = false;
    (bool success, ) = mirrorSynPackage.mirrorSender.call{gas: MAX_GAS_FOR_TRANSFER_BNB, value: mirrorSynPackage.mirrorFee.mul(TEN_DECIMALS)}("");
    if (!success) {
      address(uint160(SYSTEM_REWARD_ADDR)).transfer(mirrorSynPackage.mirrorFee.mul(TEN_DECIMALS));
    }
  }

  function encodeSyncSynPackage(SyncSynPackage memory syncSynPackage) internal pure returns (bytes memory) {
    bytes[] memory elements = new bytes[](6);
    elements[0] = syncSynPackage.syncSender.encodeAddress();
    elements[1] = syncSynPackage.bep20Addr.encodeAddress();
    elements[2] = uint256(syncSynPackage.bep2Symbol).encodeUint();
    elements[3] = syncSynPackage.bep20Supply.encodeUint();
    elements[4] = syncSynPackage.syncFee.encodeUint();
    elements[5] = uint256(syncSynPackage.expireTime).encodeUint();
    return elements.encodeList();
  }

  function decodeSyncSynPackage(bytes memory msgBytes) internal pure returns(SyncSynPackage memory, bool) {
    SyncSynPackage memory syncSynPackage;
    RLPDecode.Iterator memory iter = msgBytes.toRLPItem().iterator();
    bool success = false;
    uint256 idx=0;
    while (iter.hasNext()) {
      if (idx == 0)      syncSynPackage.syncSender  = iter.next().toAddress();
      else if (idx == 1) syncSynPackage.bep20Addr   = iter.next().toAddress();
      else if (idx == 2) syncSynPackage.bep2Symbol  = bytes32(iter.next().toUint());
      else if (idx == 3) syncSynPackage.bep20Supply = iter.next().toUint();
      else if (idx == 4) syncSynPackage.syncFee     = iter.next().toUint();
      else if (idx == 5) {
        syncSynPackage.expireTime = uint64(iter.next().toUint());
        success = true;
      }
      else break;
      idx++;
    }
    return (syncSynPackage, success);
  }

  function decodeSyncAckPackage(bytes memory msgBytes) internal pure returns(SyncAckPackage memory, bool) {
    SyncAckPackage memory syncAckPackage;
    RLPDecode.Iterator memory iter = msgBytes.toRLPItem().iterator();
    bool success = false;
    uint256 idx=0;
    while (iter.hasNext()) {
      if (idx == 0)      syncAckPackage.syncSender   = iter.next().toAddress();
      else if (idx == 1) syncAckPackage.bep20Addr    = iter.next().toAddress();
      else if (idx == 2) syncAckPackage.syncFee      = iter.next().toUint();
      else if (idx == 3) {
        syncAckPackage.errorCode  = uint8(iter.next().toUint());
        success = true;
      }
      else break;
      idx++;
    }
    return (syncAckPackage, success);
  }

  function sync(address bep20Addr, uint64 expireTime) payable public returns (bool) {
    bytes32 bep2Symbol = ITokenHub(TOKEN_HUB_ADDR).getBep2SymbolByContractAddr(bep20Addr);
    require(bep2Symbol != bytes32(0x00), "not bound");
    require(boundByMirror[bep20Addr], "not bound by mirror");
    uint256 miniRelayFee = ITokenHub(TOKEN_HUB_ADDR).getMiniRelayFee();
    require(msg.value%TEN_DECIMALS == 0 && msg.value>=syncFee.add(miniRelayFee), "msg.value must be N * 1e10 and no less sum of miniRelayFee and syncFee");
    require(expireTime>=block.timestamp + 120 && expireTime <= block.timestamp + 86400, "expireTime must be two minutes later and one day earlier");
    uint256 totalSupply = IBEP20(bep20Addr).totalSupply();
    uint8 decimals = IBEP20(bep20Addr).decimals();
    require(convertToBep2Amount(totalSupply, decimals) <= MAX_BEP2_TOTAL_SUPPLY, "too large total supply");

    address(uint160(TOKEN_HUB_ADDR)).transfer(msg.value.sub(syncFee));
    SyncSynPackage memory syncSynPackage = SyncSynPackage({
      syncSender:    msg.sender,
      bep20Addr:     bep20Addr,
      bep2Symbol:    bep2Symbol,
      bep20Supply:   totalSupply,
      syncFee:       syncFee.div(TEN_DECIMALS),
      expireTime:    expireTime
      });
    ICrossChain(CROSS_CHAIN_CONTRACT_ADDR).sendSynPackage(SYNC_CHANNELID, encodeSyncSynPackage(syncSynPackage), msg.value.sub(syncFee).div(TEN_DECIMALS));
    return true;
  }

  function handleSyncAckPackage(bytes memory msgBytes) internal {
    (SyncAckPackage memory syncAckPackage, bool decodeSuccess) = decodeSyncAckPackage(msgBytes);
    require(decodeSuccess, "unrecognized package");
    if (syncAckPackage.errorCode == CODE_OK ) {
      address(uint160(TOKEN_HUB_ADDR)).transfer(syncAckPackage.syncFee);
      emit syncSuccess(syncAckPackage.bep20Addr);
      return;
    } else  {
      emit syncFailure(syncAckPackage.bep20Addr, syncAckPackage.errorCode);
    }
    (bool success, ) = syncAckPackage.syncSender.call{gas: MAX_GAS_FOR_TRANSFER_BNB, value: syncAckPackage.syncFee}("");
    if (!success) {
      address(uint160(SYSTEM_REWARD_ADDR)).transfer(syncAckPackage.syncFee);
    }
  }

  function handleSyncFailAckPackage(bytes memory msgBytes) internal {
    (SyncSynPackage memory syncSynPackage, bool decodeSuccess) = decodeSyncSynPackage(msgBytes);
    require(decodeSuccess, "unrecognized package");
    (bool success, ) = syncSynPackage.syncSender.call{gas: MAX_GAS_FOR_TRANSFER_BNB, value: syncSynPackage.syncFee.mul(TEN_DECIMALS)}("");
    if (!success) {
      address(uint160(SYSTEM_REWARD_ADDR)).transfer(syncSynPackage.syncFee.mul(TEN_DECIMALS));
    }
  }

  function updateParam(string calldata key, bytes calldata value) override external onlyGov {
    require(value.length == 32, "expected value length 32");
    string memory localKey = key;
    bytes memory localValue = value;
    bytes32 bytes32Key;
    assembly {
      bytes32Key := mload(add(localKey, 32))
    }
    if (bytes32Key == bytes32(0x6d6972726f724665650000000000000000000000000000000000000000000000)) { // mirrorFee
      uint256 newMirrorFee;
      assembly {
        newMirrorFee := mload(add(localValue, 32))
      }
      require(newMirrorFee%(TEN_DECIMALS)==0, "mirrorFee must be N * 1e10");
      mirrorFee = newMirrorFee;
    } else if (bytes32Key == bytes32(0x73796e6346656500000000000000000000000000000000000000000000000000)) { // syncFee
      uint256 newSyncFee;
      assembly {
        newSyncFee := mload(add(localValue, 32))
      }
      require(newSyncFee%(TEN_DECIMALS)==0, "syncFee must be N * 1e10");
      syncFee = newSyncFee;
    } else {
      require(false, "unknown param");
    }
    emit paramChange(key, value);
  }

  function bep2TokenSymbolConvert(string memory symbol) internal pure returns(bytes32) {
    bytes32 result;
    assembly {
      result := mload(add(symbol, 32))
    }
    return result;
  }

  function queryRequiredLockAmountForBind(string memory symbol) public view returns(uint256) {
    bytes32 bep2Symbol;
    assembly {
      bep2Symbol := mload(add(symbol, 32))
    }
    BindSynPackage memory bindRequest = bindPackageRecord[bep2Symbol];
    if (bindRequest.contractAddr==address(0x00)) {
      return 0;
    }
    uint256 tokenHubBalance = IBEP20(bindRequest.contractAddr).balanceOf(TOKEN_HUB_ADDR);
    uint256 requiredBalance = bindRequest.totalSupply.sub(bindRequest.peggyAmount);
    return requiredBalance.sub(tokenHubBalance);
  }

  function verifyBindParameters(BindSynPackage memory bindSynPkg, address contractAddr) internal view returns(uint32) {
    uint256 decimals = IBEP20(contractAddr).decimals();
    string memory bep20Symbol = IBEP20(contractAddr).symbol();
    uint256 tokenHubBalance = IBEP20(contractAddr).balanceOf(TOKEN_HUB_ADDR);
    uint256 lockedAmount = bindSynPkg.totalSupply.sub(bindSynPkg.peggyAmount);
    if (bindSynPkg.expireTime<block.timestamp) {
      return BIND_STATUS_TIMEOUT;
    }
    if (!checkSymbol(bep20Symbol, bindSynPkg.bep2TokenSymbol)) {
      return BIND_STATUS_SYMBOL_MISMATCH;
    }
    if (tokenHubBalance > lockedAmount) {
      return BIND_STATUS_TOO_MUCH_TOKENHUB_BALANCE;
    }
    if (IBEP20(bindSynPkg.contractAddr).totalSupply() != bindSynPkg.totalSupply) {
      return BIND_STATUS_TOTAL_SUPPLY_MISMATCH;
    }
    if (decimals!=bindSynPkg.bep20Decimals) {
      return BIND_STATUS_DECIMALS_MISMATCH;
    }
    if (ITokenHub(TOKEN_HUB_ADDR).getContractAddrByBEP2Symbol(bindSynPkg.bep2TokenSymbol)!=address(0x00)||
    ITokenHub(TOKEN_HUB_ADDR).getBep2SymbolByContractAddr(bindSynPkg.contractAddr)!=bytes32(0x00)) {
      return BIND_STATUS_ALREADY_BOUND_TOKEN;
    }
    return CODE_OK;
  }

  function checkSymbol(string memory bep20Symbol, bytes32 bep2TokenSymbol) internal pure returns(bool) {
    bytes memory bep20SymbolBytes = bytes(bep20Symbol);
    if (bep20SymbolBytes.length > MAXIMUM_BEP20_SYMBOL_LEN || bep20SymbolBytes.length < MINIMUM_BEP20_SYMBOL_LEN) {
      return false;
    }

    bytes memory bep2TokenSymbolBytes = new bytes(32);
    assembly {
      mstore(add(bep2TokenSymbolBytes, 32), bep2TokenSymbol)
    }
    if (bep2TokenSymbolBytes[bep20SymbolBytes.length] != 0x2d) { // '-'
      return false;
    }
    bool symbolMatch = true;
    for (uint256 index=0; index < bep20SymbolBytes.length; index++) {
      if (bep20SymbolBytes[index] != bep2TokenSymbolBytes[index]) {
        symbolMatch = false;
        break;
      }
    }
    return symbolMatch;
  }

  function convertToBep2Amount(uint256 amount, uint256 bep20TokenDecimals) internal pure returns (uint256) {
    if (bep20TokenDecimals > BEP2_TOKEN_DECIMALS) {
      require(bep20TokenDecimals-BEP2_TOKEN_DECIMALS <= LOG_MAX_UINT256, "too large decimals");
      return amount.div(10**(bep20TokenDecimals-BEP2_TOKEN_DECIMALS));
    }
    return amount.mul(10**(BEP2_TOKEN_DECIMALS-bep20TokenDecimals));
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddr","type":"address"},{"indexed":false,"internalType":"string","name":"bep2Symbol","type":"string"},{"indexed":false,"internalType":"uint32","name":"failedReason","type":"uint32"}],"name":"bindFailure","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddr","type":"address"},{"indexed":false,"internalType":"string","name":"bep2Symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"totalSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"peggyAmount","type":"uint256"}],"name":"bindSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"bep20Addr","type":"address"},{"indexed":false,"internalType":"uint8","name":"errCode","type":"uint8"}],"name":"mirrorFailure","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"bep20Addr","type":"address"},{"indexed":false,"internalType":"bytes32","name":"bep2Symbol","type":"bytes32"}],"name":"mirrorSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"key","type":"string"},{"indexed":false,"internalType":"bytes","name":"value","type":"bytes"}],"name":"paramChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"bep20Addr","type":"address"},{"indexed":false,"internalType":"uint8","name":"errCode","type":"uint8"}],"name":"syncFailure","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"bep20Addr","type":"address"}],"name":"syncSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"channelId","type":"uint8"},{"indexed":false,"internalType":"bytes","name":"msgBytes","type":"bytes"}],"name":"unexpectedPackage","type":"event"},{"inputs":[],"name":"BEP2_TOKEN_DECIMALS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BIND_CHANNELID","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BIND_PACKAGE","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BIND_STATUS_ALREADY_BOUND_TOKEN","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BIND_STATUS_DECIMALS_MISMATCH","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BIND_STATUS_REJECTED","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BIND_STATUS_SYMBOL_MISMATCH","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BIND_STATUS_TIMEOUT","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BIND_STATUS_TOO_MUCH_TOKENHUB_BALANCE","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BIND_STATUS_TOTAL_SUPPLY_MISMATCH","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CODE_OK","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CROSS_CHAIN_CONTRACT_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ERROR_FAIL_DECODE","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GOV_CHANNELID","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GOV_HUB_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INCENTIVIZE_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIGHT_CLIENT_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LOG_MAX_UINT256","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_BEP20_SYMBOL_LEN","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BEP2_TOTAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_GAS_FOR_TRANSFER_BNB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM_BEP20_SYMBOL_LEN","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIRROR_CHANNELID","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIRROR_STATUS_ALREADY_BOUND","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIRROR_STATUS_DUPLICATED_BEP2_SYMBOL","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIRROR_STATUS_TIMEOUT","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RELAYERHUB_CONTRACT_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SLASH_CHANNELID","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SLASH_CONTRACT_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKING_CHANNELID","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYNC_CHANNELID","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYNC_STATUS_NOT_BOUND_MIRROR","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYNC_STATUS_TIMEOUT","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM_REWARD_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TEN_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_HUB_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_MANAGER_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFER_IN_CHANNELID","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFER_OUT_CHANNELID","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNBIND_PACKAGE","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_CONTRACT_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"alreadyInit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddr","type":"address"},{"internalType":"string","name":"bep2Symbol","type":"string"}],"name":"approveBind","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"bindPackageRecord","outputs":[{"internalType":"uint8","name":"packageType","type":"uint8"},{"internalType":"bytes32","name":"bep2TokenSymbol","type":"bytes32"},{"internalType":"address","name":"contractAddr","type":"address"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"peggyAmount","type":"uint256"},{"internalType":"uint8","name":"bep20Decimals","type":"uint8"},{"internalType":"uint64","name":"expireTime","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"boundByMirror","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bscChainID","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"bep2Symbol","type":"string"}],"name":"expireBind","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"channelId","type":"uint8"},{"internalType":"bytes","name":"msgBytes","type":"bytes"}],"name":"handleAckPackage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"channelId","type":"uint8"},{"internalType":"bytes","name":"msgBytes","type":"bytes"}],"name":"handleFailAckPackage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"channelId","type":"uint8"},{"internalType":"bytes","name":"msgBytes","type":"bytes"}],"name":"handleSynPackage","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"bep20Addr","type":"address"},{"internalType":"uint64","name":"expireTime","type":"uint64"}],"name":"mirror","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mirrorFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mirrorPendingRecord","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"queryRequiredLockAmountForBind","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddr","type":"address"},{"internalType":"string","name":"bep2Symbol","type":"string"}],"name":"rejectBind","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"bep20Addr","type":"address"},{"internalType":"uint64","name":"expireTime","type":"uint64"}],"name":"sync","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"syncFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bytes","name":"value","type":"bytes"}],"name":"updateParam","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50615c1880620000216000396000f3fe6080604052600436106103815760003560e01c80637d078e13116101d1578063b795031711610102578063d9e6dae9116100a0578063fa9e91591161006f578063fa9e915914610d38578063fc3e5908146105b2578063fd6a687914610d4d578063fe3a2af514610d6257610381565b8063d9e6dae9146106fc578063dc927faf14610cf9578063e605bca014610d0e578063f9a2bbc714610d2357610381565b8063c8509d81116100dc578063c8509d8114610bdf578063c8e704a4146105b2578063d117a11014610c64578063d7109ce614610ce457610381565b8063b79503171461073b578063bd32d3f9146104d9578063c81b166214610bca57610381565b80639a854bbd1161016f578063a78abc1611610149578063a78abc1614610ad5578063ab51bb9614610aea578063ab67a4851461073b578063ac43175114610aff57610381565b80639a854bbd14610a965780639dc0926214610aab578063a1a11bf514610ac057610381565b8063859180fb116101ab578063859180fb146106e757806394553a4e14610a3757806395b9ad2614610a6c57806396713da914610a8157610381565b80637d078e13146104ee5780637ec816dd1461099b578063831d65d1146109b057610381565b8063493279b1116102b657806366dea52a1161025457806372c4e0861161022357806372c4e0861461081957806375d47a0a146108bd57806377d9dae8146108d25780637942fd051461098657610381565b806366dea52a1461073b5780636b3f1307146107505780636e47b4821461080457806370fd5bad1461073b57610381565b806351e806721161029057806351e80672146107115780635d499b1b146107265780635f558f861461073b57806361368475146106fc57610381565b8063493279b1146106bb5780634bc81c00146106e75780634bf6c882146106fc57610381565b80632e02d77611610323578063401809f9116102fd578063401809f9146105b257806343756e5c146105c7578063445fcefe146105f8578063487c88ac146104ee57610381565b80632e02d7761461054c57806337e6ecda1461057f5780633dffc387146104ee57610381565b80631f91600b1161035f5780631f91600b146104d957806323996b53146104ee57806325c751b7146105035780632d89ac32146104ee57610381565b80630bee7a67146103865780630f212b1b146103b45780631182b875146103df575b600080fd5b34801561039257600080fd5b5061039b610d77565b6040805163ffffffff9092168252519081900360200190f35b3480156103c057600080fd5b506103c9610d7c565b6040805160ff9092168252519081900360200190f35b3480156103eb57600080fd5b506104646004803603604081101561040257600080fd5b60ff8235169190810190604081016020820135600160201b81111561042657600080fd5b82018360208201111561043857600080fd5b803590602001918460018302840111600160201b8311171561045957600080fd5b509092509050610d81565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561049e578181015183820152602001610486565b50505050905090810190601f1680156104cb5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104e557600080fd5b506103c9610e9b565b3480156104fa57600080fd5b506103c9610ea0565b6105386004803603604081101561051957600080fd5b5080356001600160a01b031690602001356001600160401b0316610ea5565b604080519115158252519081900360200190f35b34801561055857600080fd5b506105386004803603602081101561056f57600080fd5b50356001600160a01b03166113f1565b34801561058b57600080fd5b50610538600480360360208110156105a257600080fd5b50356001600160a01b0316611406565b3480156105be57600080fd5b506103c961141b565b3480156105d357600080fd5b506105dc611420565b604080516001600160a01b039092168252519081900360200190f35b34801561060457600080fd5b506106a96004803603602081101561061b57600080fd5b810190602081018135600160201b81111561063557600080fd5b82018360208201111561064757600080fd5b803590602001918460018302840111600160201b8311171561066857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611426945050505050565b60408051918252519081900360200190f35b3480156106c757600080fd5b506106d0611584565b6040805161ffff9092168252519081900360200190f35b3480156106f357600080fd5b506103c9611589565b34801561070857600080fd5b506103c961158e565b34801561071d57600080fd5b506105dc611593565b34801561073257600080fd5b506106a9611599565b34801561074757600080fd5b506103c96115a2565b6105386004803603604081101561076657600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561079057600080fd5b8201836020820111156107a257600080fd5b803590602001918460018302840111600160201b831117156107c357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506115a7945050505050565b34801561081057600080fd5b506105dc611e7d565b6105386004803603602081101561082f57600080fd5b810190602081018135600160201b81111561084957600080fd5b82018360208201111561085b57600080fd5b803590602001918460018302840111600160201b8311171561087c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611e83945050505050565b3480156108c957600080fd5b506105dc6122cf565b610538600480360360408110156108e857600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561091257600080fd5b82018360208201111561092457600080fd5b803590602001918460018302840111600160201b8311171561094557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506122d5945050505050565b34801561099257600080fd5b506103c96127db565b3480156109a757600080fd5b506106a96127e0565b3480156109bc57600080fd5b50610a35600480360360408110156109d357600080fd5b60ff8235169190810190604081016020820135600160201b8111156109f757600080fd5b820183602082011115610a0957600080fd5b803590602001918460018302840111600160201b83111715610a2a57600080fd5b5090925090506127e6565b005b61053860048036036040811015610a4d57600080fd5b5080356001600160a01b031690602001356001600160401b0316612935565b348015610a7857600080fd5b506103c961332c565b348015610a8d57600080fd5b506103c9613331565b348015610aa257600080fd5b506106a9613336565b348015610ab757600080fd5b506105dc613342565b348015610acc57600080fd5b506105dc613348565b348015610ae157600080fd5b5061053861334e565b348015610af657600080fd5b5061039b613357565b348015610b0b57600080fd5b50610a3560048036036040811015610b2257600080fd5b810190602081018135600160201b811115610b3c57600080fd5b820183602082011115610b4e57600080fd5b803590602001918460018302840111600160201b83111715610b6f57600080fd5b919390929091602081019035600160201b811115610b8c57600080fd5b820183602082011115610b9e57600080fd5b803590602001918460018302840111600160201b83111715610bbf57600080fd5b50909250905061335c565b348015610bd657600080fd5b506105dc613631565b348015610beb57600080fd5b50610a3560048036036040811015610c0257600080fd5b60ff8235169190810190604081016020820135600160201b811115610c2657600080fd5b820183602082011115610c3857600080fd5b803590602001918460018302840111600160201b83111715610c5957600080fd5b509092509050613637565b348015610c7057600080fd5b50610c8e60048036036020811015610c8757600080fd5b503561370d565b6040805160ff988916815260208101979097526001600160a01b03909516868601526060860193909352608085019190915290931660a08301526001600160401b0390921660c082015290519081900360e00190f35b348015610cf057600080fd5b506106a9613764565b348015610d0557600080fd5b506105dc613769565b348015610d1a57600080fd5b506106a961376f565b348015610d2f57600080fd5b506105dc613775565b348015610d4457600080fd5b506106a961377b565b348015610d5957600080fd5b506105dc613781565b348015610d6e57600080fd5b506103c9613357565b606481565b600681565b60603361200014610dc35760405162461bcd60e51b815260040180806020018281038252602f815260200180615b89602f913960400191505060405180910390fd5b60ff841660011415610e1557610e0e83838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061378792505050565b9050610e94565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605848484604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a1506040805160008152602081019091525b9392505050565b600481565b600181565b6040805163bd46646160e01b81526001600160a01b0384166004820152905160009182916110049163bd466461916024808301926020929190829003018186803b158015610ef257600080fd5b505afa158015610f06573d6000803e3d6000fd5b505050506040513d6020811015610f1c57600080fd5b5051905080610f5e576040805162461bcd60e51b81526020600482015260096024820152681b9bdd08189bdd5b9960ba1b604482015290519081900360640190fd5b6001600160a01b03841660009081526003602052604090205460ff16610fc1576040805162461bcd60e51b81526020600482015260136024820152723737ba103137bab73210313c9036b4b93937b960691b604482015290519081900360640190fd5b60006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b158015610ffe57600080fd5b505afa158015611012573d6000803e3d6000fd5b505050506040513d602081101561102857600080fd5b505190506402540be4003406158015611053575060055461104f908263ffffffff613a1716565b3410155b61108e5760405162461bcd60e51b8152600401808060200182810382526046815260200180615b156046913960600191505060405180910390fd5b42607801846001600160401b0316101580156110b85750426201518001846001600160401b031611155b6110f35760405162461bcd60e51b8152600401808060200182810382526038815260200180615a126038913960400191505060405180910390fd5b6000856001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561112e57600080fd5b505afa158015611142573d6000803e3d6000fd5b505050506040513d602081101561115857600080fd5b50516040805163313ce56760e01b815290519192506000916001600160a01b0389169163313ce567916004808301926020929190829003018186803b1580156111a057600080fd5b505afa1580156111b4573d6000803e3d6000fd5b505050506040513d60208110156111ca57600080fd5b50519050677ce66c50e28400006111e48360ff8416613a71565b1115611230576040805162461bcd60e51b8152602060048201526016602482015275746f6f206c6172676520746f74616c20737570706c7960501b604482015290519081900360640190fd5b600554611004906108fc9061124c90349063ffffffff613b0016565b6040518115909202916000818181858888f19350505050158015611274573d6000803e3d6000fd5b5061127d615869565b6040518060c00160405280336001600160a01b03168152602001896001600160a01b031681526020018681526020018481526020016112cc6402540be400600554613b4290919063ffffffff16565b81526001600160401b038916602090910152905061200063f7a251d760056112f384613b84565b61131d6402540be40061131160055434613b0090919063ffffffff16565b9063ffffffff613b4216565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561137b578181015183820152602001611363565b50505050905090810190601f1680156113a85780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156113c957600080fd5b505af11580156113dd573d6000803e3d6000fd5b505050506001955050505050505b92915050565b60036020526000908152604090205460ff1681565b60026020526000908152604090205460ff1681565b600381565b61100181565b602081015160009061143661589e565b50600081815260016020818152604092839020835160e081018552815460ff9081168252938201549281019290925260028101546001600160a01b031693820184905260038101546060830152600481015460808301526005015491821660a08201526101009091046001600160401b031660c0820152906114bd5760009250505061157f565b600081604001516001600160a01b03166370a082316110046040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561151b57600080fd5b505afa15801561152f573d6000803e3d6000fd5b505050506040513d602081101561154557600080fd5b5051608083015160608401519192506000916115669163ffffffff613b0016565b9050611578818363ffffffff613b0016565b9450505050505b919050565b603881565b600581565b600881565b61200081565b6402540be40081565b600281565b6001600160a01b03821660009081526002602052604081205460ff16156115ff5760405162461bcd60e51b815260040180806020018281038252602b815260200180615bb8602b913960400191505060405180910390fd5b600061160a83613cb9565b905061161461589e565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a08401526101009091046001600160401b031660c08301526116d9576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b60006116f682608001518360600151613b0090919063ffffffff16565b905081604001516001600160a01b0316866001600160a01b03161461174c5760405162461bcd60e51b8152600401808060200182810382526045815260200180615a816045913960600191505060405180910390fd5b336001600160a01b0316866001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b15801561178f57600080fd5b505afa1580156117a3573d6000803e3d6000fd5b505050506040513d60208110156117b957600080fd5b50516001600160a01b0316146118005760405162461bcd60e51b815260040180806020018281038252602e8152602001806159e4602e913960400191505060405180910390fd5b604080516370a0823160e01b8152611004600482015290516000916001600160a01b038916916370a0823191602480820192602092909190829003018186803b15801561184c57600080fd5b505afa158015611860573d6000803e3d6000fd5b505050506040513d602081101561187657600080fd5b505160408051636eb1769f60e11b8152336004820152306024820152905191925083916119079184916001600160a01b038c169163dd62ed3e916044808301926020929190829003018186803b1580156118cf57600080fd5b505afa1580156118e3573d6000803e3d6000fd5b505050506040513d60208110156118f957600080fd5b50519063ffffffff613a1716565b101561195a576040805162461bcd60e51b815260206004820152601760248201527f616c6c6f77616e6365206973206e6f7420656e6f756768000000000000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561199c57600080fd5b505afa1580156119b0573d6000803e3d6000fd5b505050506040513d60208110156119c657600080fd5b505190508082108015906119df57506402540be4008206155b611a1a5760405162461bcd60e51b8152600401808060200182810382526037815260200180615a4a6037913960400191505060405180910390fd5b6000611a26868b613cc0565b905063ffffffff8116611c25576001600160a01b038a166323b872dd33611004611a56898963ffffffff613b0016565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b158015611abe57600080fd5b505af1158015611ad2573d6000803e3d6000fd5b505050506040513d6020811015611ae857600080fd5b5050602086015160408088015160a089015182516323bfccdb60e21b815260048101949094526001600160a01b03909116602484015260ff1660448301525161100491638eff336c91606480830192600092919082900301818387803b158015611b5157600080fd5b505af1158015611b65573d6000803e3d6000fd5b50505050896001600160a01b03167f78e7dd9aefcdbf795c4936a66f7dc6d41bb56637b54f561a6bf7829dca3348a88a8860600151886040518080602001848152602001838152602001828103825285818151815260200191508051906020019080838360005b83811015611be4578181015183820152602001611bcc565b50505050905090810190601f168015611c115780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a2611cdd565b896001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a1078a8360405180806020018363ffffffff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b83811015611ca1578181015183820152602001611c89565b50505050905090810190601f168015611cce5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25b60008781526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff19169055611d376158da565b5060408051808201825263ffffffff831681526020810189905290516110049085156108fc029086906000818181858888f19350505050158015611d7f573d6000803e3d6000fd5b5061200063f7a251d76001611d938461411a565b611da8886402540be40063ffffffff613b4216565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611e06578181015183820152602001611dee565b50505050905090810190601f168015611e335780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015611e5457600080fd5b505af1158015611e68573d6000803e3d6000fd5b5060019e9d5050505050505050505050505050565b61100581565b600080611e8f83613cb9565b9050611e9961589e565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a08401526101009091046001600160401b031660c0830152611f5e576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b428160c001516001600160401b031610611fbf576040805162461bcd60e51b815260206004820152601b60248201527f62696e642072657175657374206973206e6f7420657870697265640000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561200157600080fd5b505afa158015612015573d6000803e3d6000fd5b505050506040513d602081101561202b57600080fd5b5051905080821080159061204457506402540be4008206155b61207f5760405162461bcd60e51b8152600401808060200182810382526037815260200180615a4a6037913960400191505060405180910390fd5b60008481526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff191690556120d96158da565b50604080518082018252600181526020810186905290516110049084156108fc029085906000818181858888f1935050505015801561211c573d6000803e3d6000fd5b5061200063f7a251d760016121308461411a565b612145876402540be40063ffffffff613b4216565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156121a357818101518382015260200161218b565b50505050905090810190601f1680156121d05780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156121f157600080fd5b505af1158015612205573d6000803e3d6000fd5b5050505083604001516001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a10788600160405180806020018360ff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b8381101561228757818101518382015260200161226f565b50505050905090810190601f1680156122b45780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25060019695505050505050565b61100881565b6000806122e183613cb9565b90506122eb61589e565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a08401526101009091046001600160401b031660c08301526123b0576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b80604001516001600160a01b0316856001600160a01b0316146124045760405162461bcd60e51b8152600401808060200182810382526045815260200180615a816045913960600191505060405180910390fd5b336001600160a01b0316856001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b15801561244757600080fd5b505afa15801561245b573d6000803e3d6000fd5b505050506040513d602081101561247157600080fd5b50516001600160a01b0316146124ce576040805162461bcd60e51b815260206004820152601b60248201527f6f6e6c79206265703230206f776e65722063616e2072656a6563740000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561251057600080fd5b505afa158015612524573d6000803e3d6000fd5b505050506040513d602081101561253a57600080fd5b5051905080821080159061255357506402540be4008206155b61258e5760405162461bcd60e51b8152600401808060200182810382526037815260200180615a4a6037913960400191505060405180910390fd5b60008481526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff191690556125e86158da565b50604080518082018252600781526020810186905290516110049084156108fc029085906000818181858888f1935050505015801561262b573d6000803e3d6000fd5b5061200063f7a251d7600161263f8461411a565b612654876402540be40063ffffffff613b4216565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156126b257818101518382015260200161269a565b50505050905090810190601f1680156126df5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561270057600080fd5b505af1158015612714573d6000803e3d6000fd5b50505050876001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a10788600760405180806020018360ff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b8381101561279257818101518382015260200161277a565b50505050905090810190601f1680156127bf5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a2506001979650505050505050565b600b81565b60045481565b33612000146128265760405162461bcd60e51b815260040180806020018281038252602f815260200180615b89602f913960400191505060405180910390fd5b60ff8316600414156128765761287182828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061419092505050565b612930565b60ff8316600514156128c15761287182828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061443d92505050565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a15b505050565b6040805163bd46646160e01b81526001600160a01b0384166004820152905160009182916110049163bd466461916024808301926020929190829003018186803b15801561298257600080fd5b505afa158015612996573d6000803e3d6000fd5b505050506040513d60208110156129ac57600080fd5b5051146129f0576040805162461bcd60e51b815260206004820152600d60248201526c185b1c9958591e48189bdd5b99609a1b604482015290519081900360640190fd5b6001600160a01b03831660009081526002602052604090205460ff1615612a4f576040805162461bcd60e51b815260206004820152600e60248201526d6d6972726f722070656e64696e6760901b604482015290519081900360640190fd5b60006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b158015612a8c57600080fd5b505afa158015612aa0573d6000803e3d6000fd5b505050506040513d6020811015612ab657600080fd5b505190506402540be4003406158015612ae15750600454612add908263ffffffff613a1716565b3410155b612b1c5760405162461bcd60e51b815260040180806020018281038252604d815260200180615997604d913960600191505060405180910390fd5b42607801836001600160401b031610158015612b465750426201518001836001600160401b031611155b612b815760405162461bcd60e51b8152600401808060200182810382526038815260200180615a126038913960400191505060405180910390fd5b6000846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015612bbc57600080fd5b505afa158015612bd0573d6000803e3d6000fd5b505050506040513d6020811015612be657600080fd5b5051604080516318160ddd60e01b815290519192506000916001600160a01b038816916318160ddd916004808301926020929190829003018186803b158015612c2e57600080fd5b505afa158015612c42573d6000803e3d6000fd5b505050506040513d6020811015612c5857600080fd5b50519050677ce66c50e2840000612c728260ff8516613a71565b1115612cbe576040805162461bcd60e51b8152602060048201526016602482015275746f6f206c6172676520746f74616c20737570706c7960501b604482015290519081900360640190fd5b6060866001600160a01b03166306fdde036040518163ffffffff1660e01b815260040160006040518083038186803b158015612cf957600080fd5b505afa158015612d0d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612d3657600080fd5b8101908080516040519392919084600160201b821115612d5557600080fd5b908301906020820185811115612d6a57600080fd5b8251600160201b811182820188101715612d8357600080fd5b82525081516020918201929091019080838360005b83811015612db0578181015183820152602001612d98565b50505050905090810190601f168015612ddd5780820380516001836020036101000a031916815260200191505b50604052505050905060608190506001815110158015612dff57506020815111155b612e50576040805162461bcd60e51b815260206004820152601d60248201527f6e616d65206c656e677468206d75737420626520696e205b312c33325d000000604482015290519081900360640190fd5b6060886001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b158015612e8b57600080fd5b505afa158015612e9f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612ec857600080fd5b8101908080516040519392919084600160201b821115612ee757600080fd5b908301906020820185811115612efc57600080fd5b8251600160201b811182820188101715612f1557600080fd5b82525081516020918201929091019080838360005b83811015612f42578181015183820152602001612f2a565b50505050905090810190601f168015612f6f5780820380516001836020036101000a031916815260200191505b5060405250508151919250829160021180159150612f8f57508051600810155b612fe0576040805162461bcd60e51b815260206004820152601e60248201527f73796d626f6c206c656e677468206d75737420626520696e205b322c385d0000604482015290519081900360640190fd5b60005b81518160ff16101561313457604160f81b828260ff168151811061300357fe5b01602001516001600160f81b031916108015906130415750602d60f91b828260ff168151811061302f57fe5b01602001516001600160f81b03191611155b806130995750606160f81b828260ff168151811061305b57fe5b01602001516001600160f81b031916108015906130995750603d60f91b828260ff168151811061308757fe5b01602001516001600160f81b03191611155b806130f15750600360fc1b828260ff16815181106130b357fe5b01602001516001600160f81b031916108015906130f15750603960f81b828260ff16815181106130df57fe5b01602001516001600160f81b03191611155b61312c5760405162461bcd60e51b815260040180806020018281038252602e815260200180615ac6602e913960400191505060405180910390fd5b600101612fe3565b50600454611004906108fc9061315190349063ffffffff613b0016565b6040518115909202916000818181858888f19350505050158015613179573d6000803e3d6000fd5b506001600160a01b038a166000908152600260209081526040909120805460ff1916600117905584810151908301516131b06158f1565b604051806101000160405280336001600160a01b031681526020018e6001600160a01b031681526020018481526020018381526020018981526020018a60ff16815260200161320f6402540be400600454613b4290919063ffffffff16565b81526001600160401b038e16602090910152905061200063f7a251d7600461323684614608565b6132546402540be40061131160045434613b0090919063ffffffff16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156132b257818101518382015260200161329a565b50505050905090810190601f1680156132df5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561330057600080fd5b505af1158015613314573d6000803e3d6000fd5b5050505060019a505050505050505050505092915050565b600781565b600981565b677ce66c50e284000081565b61100781565b61100681565b60005460ff1681565b600081565b336110071461339c5760405162461bcd60e51b815260040180806020018281038252602e815260200180615b5b602e913960400191505060405180910390fd5b602081146133f1576040805162461bcd60e51b815260206004820152601860248201527f65787065637465642076616c7565206c656e6774682033320000000000000000604482015290519081900360640190fd5b606084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f880181900481028201810190925286815293945060609392508691508590819084018382808284376000920191909152505050506020830151909150686d6972726f7246656560b81b8114156134e65760208201516402540be4008106156134de576040805162461bcd60e51b815260206004820152601a60248201527f6d6972726f72466565206d757374206265204e202a2031653130000000000000604482015290519081900360640190fd5b60045561359c565b6673796e6346656560c81b81141561355f5760208201516402540be400810615613557576040805162461bcd60e51b815260206004820152601860248201527f73796e63466565206d757374206265204e202a20316531300000000000000000604482015290519081900360640190fd5b60055561359c565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a878787876040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050505050565b61100281565b33612000146136775760405162461bcd60e51b815260040180806020018281038252602f815260200180615b89602f913960400191505060405180910390fd5b60ff8316600414156136c25761287182828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061477a92505050565b60ff8316600514156128c15761287182828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506148b992505050565b600160208190526000918252604090912080549181015460028201546003830154600484015460059094015460ff9586169593946001600160a01b039093169391929181169061010090046001600160401b031687565b604d81565b61100381565b60055481565b61100081565b61271081565b61100481565b606061379161589e565b600061379c846149b3565b91509150806137f2576040805162461bcd60e51b815260206004820152601f60248201527f756e7265636f676e697a6564207472616e73666572496e207061636b61676500604482015290519081900360640190fd5b815160ff166138a5576020828101805160009081526001928390526040908190208551815460ff1990811660ff928316178355935194820194909455908501516002820180546001600160a01b0319166001600160a01b03909216919091179055606085015160038201556080850151600482015560a08501516005909101805460c08701519316919093161768ffffffffffffffff0019166101006001600160401b03909216919091021790556139fc565b815160ff16600114156139af5760006110046001600160a01b03166359b9278984602001516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156138fe57600080fd5b505afa158015613912573d6000803e3d6000fd5b505050506040513d602081101561392857600080fd5b505190506001600160a01b038116156139a95760208301516040805163b99328c560e01b815260048101929092526001600160a01b0383166024830152516110049163b99328c591604480830192600092919082900301818387803b15801561399057600080fd5b505af11580156139a4573d6000803e3d6000fd5b505050505b506139fc565b6040805162461bcd60e51b815260206004820152601960248201527f756e7265636f676e697a65642062696e64207061636b61676500000000000000604482015290519081900360640190fd5b60408051600080825260208201909252905b50949350505050565b600082820183811015610e94576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006008821115613ae957604d60071983011115613acb576040805162461bcd60e51b8152602060048201526012602482015271746f6f206c6172676520646563696d616c7360701b604482015290519081900360640190fd5b613ae2836007198401600a0a63ffffffff613b4216565b90506113eb565b610e94836008849003600a0a63ffffffff614b0416565b6000610e9483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614b5d565b6000610e9483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614bf4565b60408051600680825260e08201909252606091829190816020015b6060815260200190600190039081613b9f5750508351909150613bca906001600160a01b0316614c59565b81600081518110613bd757fe5b6020026020010181905250613bf883602001516001600160a01b0316614c59565b81600181518110613c0557fe5b6020026020010181905250613c20836040015160001c614c7c565b81600281518110613c2d57fe5b6020026020010181905250613c458360600151614c7c565b81600381518110613c5257fe5b6020026020010181905250613c6a8360800151614c7c565b81600481518110613c7757fe5b6020026020010181905250613c988360a001516001600160401b0316614c7c565b81600581518110613ca557fe5b6020026020010181905250610e9481614c8f565b6020015190565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015613cfc57600080fd5b505afa158015613d10573d6000803e3d6000fd5b505050506040513d6020811015613d2657600080fd5b5051604080516395d89b4160e01b8152905160ff90921692506060916001600160a01b038616916395d89b41916004808301926000929190829003018186803b158015613d7257600080fd5b505afa158015613d86573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613daf57600080fd5b8101908080516040519392919084600160201b821115613dce57600080fd5b908301906020820185811115613de357600080fd5b8251600160201b811182820188101715613dfc57600080fd5b82525081516020918201929091019080838360005b83811015613e29578181015183820152602001613e11565b50505050905090810190601f168015613e565780820380516001836020036101000a031916815260200191505b5060408181526370a0823160e01b82526110046004830152519495506000946001600160a01b038a1694506370a08231935060248083019350602092829003018186803b158015613ea657600080fd5b505afa158015613eba573d6000803e3d6000fd5b505050506040513d6020811015613ed057600080fd5b505160808701516060880151919250600091613ef19163ffffffff613b0016565b9050428760c001516001600160401b03161015613f165750600193506113eb92505050565b613f24838860200151614d19565b613f365750600293506113eb92505050565b80821115613f4c5750600393506113eb92505050565b866060015187604001516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015613f8e57600080fd5b505afa158015613fa2573d6000803e3d6000fd5b505050506040513d6020811015613fb857600080fd5b505114613fcd5750600493506113eb92505050565b8660a0015160ff168414613fe95750600593506113eb92505050565b602080880151604080516359b9278960e01b8152600481019290925251600092611004926359b927899260248083019392829003018186803b15801561402e57600080fd5b505afa158015614042573d6000803e3d6000fd5b505050506040513d602081101561405857600080fd5b50516001600160a01b03161415806140fa57506000801b6110046001600160a01b031663bd46646189604001516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156140cb57600080fd5b505afa1580156140df573d6000803e3d6000fd5b505050506040513d60208110156140f557600080fd5b505114155b1561410d5750600693506113eb92505050565b5060009695505050505050565b6040805160028082526060828101909352829190816020015b6060815260200190600190039081614133575050835190915061415b9063ffffffff16614c7c565b8160008151811061416857fe5b6020026020010181905250614183836020015160001c614c7c565b81600181518110613ca557fe5b614198615869565b60006141a383614e01565b91509150806141f0576040805162461bcd60e51b8152602060048201526014602482015273756e7265636f676e697a6564207061636b61676560601b604482015290519081900360640190fd5b6020808301516001600160a01b03166000908152600290915260409020805460ff1916905560a082015160ff166143515760808201516040516110049180156108fc02916000818181858888f19350505050158015614253573d6000803e3d6000fd5b506110046001600160a01b0316638eff336c8360600151846020015185604001516040518463ffffffff1660e01b815260040180848152602001836001600160a01b03166001600160a01b031681526020018260ff1681526020019350505050600060405180830381600087803b1580156142cd57600080fd5b505af11580156142e1573d6000803e3d6000fd5b50505050602082810180516001600160a01b03908116600090815260038452604090819020805460ff1916600117905591516060860151835190815292519116927f41787d7db08fc5907641ee8343379f28215727eb123d4b462099afab4300b036928290030190a2505061443a565b815160808301516040516000926001600160a01b0316916127109184818181858888f193505050503d80600081146143a5576040519150601f19603f3d011682016040523d82523d6000602084013e6143aa565b606091505b50509050806143e75760808301516040516110029180156108fc02916000818181858888f193505050501580156143e5573d6000803e3d6000fd5b505b82602001516001600160a01b03167fefe400ad0042ebf81a245de9ae669616105e0ca9fc946352c085da0c2bc524e58460a00151604051808260ff1660ff16815260200191505060405180910390a25050505b50565b614445615935565b600061445083614f0e565b915091508061449d576040805162461bcd60e51b8152602060048201526014602482015273756e7265636f676e697a6564207061636b61676560601b604482015290519081900360640190fd5b606082015160ff1661451d5760408083015190516110049180156108fc02916000818181858888f193505050501580156144db573d6000803e3d6000fd5b5081602001516001600160a01b03167fbb7d3a9a559080d8281b0e4fb39dacbe2fdcafd5ef765e9a6ed871c9167dc60f60405160405180910390a2505061443a565b81602001516001600160a01b03167ff1e25fa536da84053644fd788b1d6a27ea6edd1f3af80c7d36ca253c4c82c9c38360600151604051808260ff1660ff16815260200191505060405180910390a2815160408084015190516000926001600160a01b0316916127109184818181858888f193505050503d80600081146145c0576040519150601f19603f3d011682016040523d82523d6000602084013e6145c5565b606091505b50509050806146025760408084015190516110029180156108fc02916000818181858888f19350505050158015614600573d6000803e3d6000fd5b505b50505050565b6040805160088082526101208201909252606091829190816020015b6060815260200190600190039081614624575050835190915061464f906001600160a01b0316614c59565b8160008151811061465c57fe5b602002602001018190525061467d83602001516001600160a01b0316614c59565b8160018151811061468a57fe5b60200260200101819052506146a5836040015160001c614c7c565b816002815181106146b257fe5b60200260200101819052506146cd836060015160001c614c7c565b816003815181106146da57fe5b60200260200101819052506146f28360800151614c7c565b816004815181106146ff57fe5b602002602001018190525061471a8360a0015160ff16614c7c565b8160058151811061472757fe5b602002602001018190525061473f8360c00151614c7c565b8160068151811061474c57fe5b602002602001018190525061476d8360e001516001600160401b0316614c7c565b81600781518110613ca557fe5b6147826158f1565b600061478d83614fda565b91509150806147da576040805162461bcd60e51b8152602060048201526014602482015273756e7265636f676e697a6564207061636b61676560601b604482015290519081900360640190fd5b6020808301516001600160a01b039081166000908152600290925260408220805460ff19169055835160c085015191169061271090614824906402540be40063ffffffff614b0416565b6040516000818181858888f193505050503d8060008114614861576040519150601f19603f3d011682016040523d82523d6000602084013e614866565b606091505b50509050806146025760c0830151611002906108fc90614891906402540be40063ffffffff614b0416565b6040518115909202916000818181858888f19350505050158015614600573d6000803e3d6000fd5b6148c1615869565b60006148cc8361512b565b9150915080614919576040805162461bcd60e51b8152602060048201526014602482015273756e7265636f676e697a6564207061636b61676560601b604482015290519081900360640190fd5b815160808301516000916001600160a01b03169061271090614946906402540be40063ffffffff614b0416565b6040516000818181858888f193505050503d8060008114614983576040519150601f19603f3d011682016040523d82523d6000602084013e614988565b606091505b5050905080614602576080830151611002906108fc90614891906402540be40063ffffffff614b0416565b6149bb61589e565b60006149c561589e565b6149cd61595c565b6149de6149d98661523b565b615260565b90506000805b6149ed836152aa565b15614af75780614a1257614a08614a03846152cb565b615319565b60ff168452614aef565b8060011415614a3157614a27614a03846152cb565b6020850152614aef565b8060021415614a5e57614a4b614a46846152cb565b6153ce565b6001600160a01b03166040850152614aef565b8060031415614a7d57614a73614a03846152cb565b6060850152614aef565b8060041415614a9c57614a92614a03846152cb565b6080850152614aef565b8060051415614abe57614ab1614a03846152cb565b60ff1660a0850152614aef565b8060061415614aea57614ad3614a03846152cb565b6001600160401b031660c085015260019150614aef565b614af7565b6001016149e4565b5091935090915050915091565b600082614b13575060006113eb565b82820282848281614b2057fe5b0414610e945760405162461bcd60e51b8152600401808060200182810382526021815260200180615af46021913960400191505060405180910390fd5b60008184841115614bec5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614bb1578181015183820152602001614b99565b50505050905090810190601f168015614bde5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183614c435760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315614bb1578181015183820152602001614b99565b506000838581614c4f57fe5b0495945050505050565b60408051600560a21b8318601482015260348101909152606090610e94816153e8565b60606113eb614c8a8361543e565b6153e8565b6060815160001415614cb0575060408051600081526020810190915261157f565b606082600081518110614cbf57fe5b602002602001015190506000600190505b8351811015614d0057614cf682858381518110614ce957fe5b6020026020010151615524565b9150600101614cd0565b50610e94614d13825160c060ff166155a1565b82615524565b8151600090839060081080614d2f575080516002115b15614d3e5760009150506113eb565b60408051602080825281830190925260609160208201818036833701905050905083602082015280825181518110614d7257fe5b6020910101516001600160f81b031916602d60f81b14614d97576000925050506113eb565b600160005b8351811015614df757828181518110614db157fe5b602001015160f81c60f81b6001600160f81b031916848281518110614dd257fe5b01602001516001600160f81b03191614614def5760009150614df7565b600101614d9c565b5095945050505050565b614e09615869565b6000614e13615869565b614e1b61595c565b614e276149d98661523b565b90506000805b614e36836152aa565b15614af75780614e5c57614e4c614a46846152cb565b6001600160a01b03168452614f06565b8060011415614e8457614e71614a46846152cb565b6001600160a01b03166020850152614f06565b8060021415614ea657614e99614a03846152cb565b60ff166040850152614f06565b8060031415614ec557614ebb614a03846152cb565b6060850152614f06565b8060041415614ee457614eda614a03846152cb565b6080850152614f06565b8060051415614aea57614ef9614a03846152cb565b60ff1660a0850152600191505b600101614e2d565b614f16615935565b6000614f20615935565b614f2861595c565b614f346149d98661523b565b90506000805b614f43836152aa565b15614af75780614f6957614f59614a46846152cb565b6001600160a01b03168452614fd2565b8060011415614f9157614f7e614a46846152cb565b6001600160a01b03166020850152614fd2565b8060021415614fb057614fa6614a03846152cb565b6040850152614fd2565b8060031415614aea57614fc5614a03846152cb565b60ff166060850152600191505b600101614f3a565b614fe26158f1565b6000614fec6158f1565b614ff461595c565b6150006149d98661523b565b90506000805b61500f836152aa565b15614af7578061503557615025614a46846152cb565b6001600160a01b03168452615123565b806001141561505d5761504a614a46846152cb565b6001600160a01b03166020850152615123565b806002141561507c57615072614a03846152cb565b6040850152615123565b806003141561509b57615091614a03846152cb565b6060850152615123565b80600414156150ba576150b0614a03846152cb565b6080850152615123565b80600514156150dc576150cf614a03846152cb565b60ff1660a0850152615123565b80600614156150fb576150f1614a03846152cb565b60c0850152615123565b8060071415614aea57615110614a03846152cb565b6001600160401b031660e0850152600191505b600101615006565b615133615869565b600061513d615869565b61514561595c565b6151516149d98661523b565b90506000805b615160836152aa565b15614af7578061518657615176614a46846152cb565b6001600160a01b03168452615233565b80600114156151ae5761519b614a46846152cb565b6001600160a01b03166020850152615233565b80600214156151cd576151c3614a03846152cb565b6040850152615233565b80600314156151ec576151e2614a03846152cb565b6060850152615233565b806004141561520b57615201614a03846152cb565b6080850152615233565b8060051415614aea57615220614a03846152cb565b6001600160401b031660a0850152600191505b600101615157565b61524361597c565b506040805180820190915281518152602082810190820152919050565b61526861595c565b61527182615699565b61527a57600080fd5b600061528983602001516156d3565b60208085015160408051808201909152868152920190820152915050919050565b60006152b461597c565b505080518051602091820151919092015191011190565b6152d361597c565b6152dc826152aa565b6152e557600080fd5b602082015160006152f582615736565b80830160209586015260408051808201909152908152938401919091525090919050565b80516000901580159061532e57508151602110155b61533757600080fd5b600061534683602001516156d3565b905080836000015110156153a1576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015613a0e57506020919091036101000a90049392505050565b80516000906015146153df57600080fd5b6113eb82615319565b60608151600114801561541a5750607f60f81b8260008151811061540857fe5b01602001516001600160f81b03191611155b1561542657508061157f565b6113eb6154388351608060ff166155a1565b83615524565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416615482575060186154a6565b6fffffffffffffffffffffffffffffffff1984166154a2575060106154a6565b5060005b60208110156154dc578181815181106154bb57fe5b01602001516001600160f81b031916156154d4576154dc565b6001016154a6565b60008160200390506060816040519080825280601f01601f191660200182016040528015615511576020820181803683370190505b5080830196909652508452509192915050565b6060806040519050835180825260208201818101602087015b8183101561555557805183526020928301920161553d565b50855184518101855292509050808201602086015b8183101561558257805183526020928301920161556a565b508651929092011591909101601f01601f191660405250905092915050565b60606801000000000000000083106155f1576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b6040805160018082528183019092526060916020820181803683370190505090506037841161564b5782840160f81b8160008151811061562d57fe5b60200101906001600160f81b031916908160001a90535090506113eb565b60606156568561543e565b90508381510160370160f81b8260008151811061566f57fe5b60200101906001600160f81b031916908160001a9053506156908282615524565b95945050505050565b80516000906156aa5750600061157f565b6020820151805160001a9060c08210156156c95760009250505061157f565b5060019392505050565b8051600090811a60808110156156ed57600091505061157f565b60b8811080615708575060c08110801590615708575060f881105b1561571757600191505061157f565b60c081101561572b5760b51901905061157f565b60f51901905061157f565b80516000908190811a60808110156157515760019150615862565b60b881101561576657607e1981019150615862565b60c08110156157e057600060b78203600186019550806020036101000a8651049150600181018201935050808310156157da576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50615862565b60f88110156157f55760be1981019150615862565b600060f78203600186019550806020036101000a865104915060018101820193505080831015615860576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b604080518082019091526000808252602082015290565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528061596f61597c565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe6d73672e76616c7565206d757374206265204e202a203165313020616e642067726561746572207468616e2073756d206f66206d696e6952656c617946656520616e64206d6972726f724665656f6e6c79206265703230206f776e65722063616e20617070726f766520746869732062696e64207265717565737465787069726554696d65206d7573742062652074776f206d696e75746573206c6174657220616e64206f6e6520646179206561726c69657272656c6179466565206d757374206265204e202a203165313020616e642067726561746572207468616e206d696e6952656c6179466565636f6e74616374206164647265737320646f65736e277420657175616c20746f2074686520636f6e7472616374206164647265737320696e2062696e64207265717565737473796d626f6c2073686f756c64206f6e6c7920636f6e7461696e20616c70686162657420616e64206e756d626572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f776d73672e76616c7565206d757374206265204e202a203165313020616e64206e6f206c6573732073756d206f66206d696e6952656c617946656520616e642073796e63466565746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e747261637474686520626570323020746f6b656e20697320696e206d6972726f722070656e64696e6720737461747573a26469706673582212200181cc2360b762c035e0445790dcf19f8c7ed9a72fee8c6c76a706d9e554edee64736f6c63430006040033

Deployed ByteCode Sourcemap

30183:27560:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;27058:46:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27058:46:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31994:59;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31994:59:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33768:324;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33768:324:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;33768:324:0;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;33768:324:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;33768:324:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;33768:324:0;;-1:-1:-1;33768:324:0;-1:-1:-1;33768:324:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;33768:324:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31866:61;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31866:61:0;;;:::i;31617:42::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31617:42:0;;;:::i;50735:1438::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;50735:1438:0;;-1:-1:-1;;;;;50735:1438:0;;;;;-1:-1:-1;;;;;50735:1438:0;;:::i;:::-;;;;;;;;;;;;;;;;;;33066:45;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33066:45:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33066:45:0;-1:-1:-1;;;;;33066:45:0;;:::i;33010:51::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33010:51:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33010:51:0;-1:-1:-1;;;;;33010:51:0;;:::i;32584:55::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32584:55:0;;;:::i;27563:88::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27563:88:0;;;:::i;:::-;;;;-1:-1:-1;;;;;27563:88:0;;;;;;;;;;;;;;54702:563;;5:9:-1;2:2;;;27:1;24;17:12;2:2;54702:563:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;54702:563:0;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;54702:563:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;54702:563:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;54702:563:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;54702:563:0;;-1:-1:-1;54702:563:0;;-1:-1:-1;;;;;54702:563:0:i;:::-;;;;;;;;;;;;;;;;27417:42;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27417:42:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31932:57;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31932:57:0;;;:::i;27270:46::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27270:46:0;;;:::i;28291:94::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28291:94:0;;;:::i;32893:44::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32893:44:0;;;:::i;31736:55::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31736:55:0;;;:::i;36986:2136::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;36986:2136:0;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;36986:2136:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;36986:2136:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;36986:2136:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;36986:2136:0;;-1:-1:-1;36986:2136:0;;-1:-1:-1;;;;;36986:2136:0:i;27927:83::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27927:83:0;;;:::i;40430:1150::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;40430:1150:0;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;40430:1150:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;40430:1150:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;40430:1150:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;40430:1150:0;;-1:-1:-1;40430:1150:0;;-1:-1:-1;;;;;40430:1150:0:i;28199:87::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28199:87:0;;;:::i;39128:1296::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;39128:1296:0;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;39128:1296:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;39128:1296:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;39128:1296:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;39128:1296:0;;-1:-1:-1;39128:1296:0;;-1:-1:-1;;;;;39128:1296:0:i;27368:44::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27368:44:0;;;:::i;33116:24::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33116:24:0;;;:::i;34098:357::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34098:357:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;34098:357:0;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;34098:357:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;34098:357:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;34098:357:0;;-1:-1:-1;34098:357:0;-1:-1:-1;34098:357:0;:::i;:::-;;44408:2438;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;44408:2438:0;;-1:-1:-1;;;;;44408:2438:0;;;;;-1:-1:-1;;;;;44408:2438:0;;:::i;32058:48::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32058:48:0;;;:::i;27321:42::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27321:42:0;;;:::i;32320:67::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32320:67:0;;;:::i;28113:81::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28113:81:0;;;:::i;28015:93::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28015:93:0;;;:::i;26989:23::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26989:23:0;;;:::i;27019:34::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27019:34:0;;;:::i;53413:1082::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;53413:1082:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;53413:1082:0;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;53413:1082:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;53413:1082:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;53413:1082:0;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;53413:1082:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;53413:1082:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;53413:1082:0;;-1:-1:-1;53413:1082:0;-1:-1:-1;53413:1082:0;:::i;27656:87::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27656:87:0;;;:::i;34461:369::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34461:369:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;34461:369:0;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;34461:369:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;34461:369:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;34461:369:0;;-1:-1:-1;34461:369:0;-1:-1:-1;34461:369:0;:::i;32944:59::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32944:59:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;32944:59:0;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32944:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32944:59:0;;;;;;;;;;;;;;;;;32392:44;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32392:44:0;;;:::i;27748:86::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27748:86:0;;;:::i;33145:22::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33145:22:0;;;:::i;27466:92::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27466:92:0;;;:::i;32261:54::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32261:54:0;;;:::i;27839:83::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27839:83:0;;;:::i;31572:40::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31572:40:0;;;:::i;27058:46::-;27101:3;27058:46;:::o;31994:59::-;32052:1;31994:59;:::o;33768:324::-;33885:12;29337:10;28343:42;29337:39;29329:99;;;;-1:-1:-1;;;29329:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33910:27:::1;::::0;::::1;27150:4;33910:27;33906:181;;;33955:30;33976:8;;33955:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;33955:20:0::1;::::0;-1:-1:-1;;;33955:30:0:i:1;:::-;33948:37;;;;33906:181;34013:38;34031:9;34042:8;;34013:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;;::::1;74:27:::0;34013:38:0::1;::::0;137:4:-1::1;117:14:::0;;::::1;-1:-1:::0;;113:30:::1;157:16:::0;;::::1;34013:38:0::0;;::::1;::::0;-1:-1:-1;34013:38:0;;-1:-1:-1;;;;;34013:38:0::1;-1:-1:-1::0;34067:12:0::1;::::0;;34077:1:::1;34067:12:::0;;::::1;::::0;::::1;::::0;;;33906:181:::1;33768:324:::0;;;;;:::o;31866:61::-;31926:1;31866:61;:::o;31617:42::-;31658:1;31617:42;:::o;50735:1438::-;50845:64;;;-1:-1:-1;;;50845:64:0;;-1:-1:-1;;;;;50845:64:0;;;;;;;;50811:4;;;;27880:42;;50845:53;;:64;;;;;;;;;;;;;;27880:42;50845:64;;;2:2:-1;;;;27:1;24;17:12;2:2;50845:64:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50845:64:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;50845:64:0;;-1:-1:-1;50924:27:0;50916:49;;;;;-1:-1:-1;;;50916:49:0;;;;;;;;;;;;-1:-1:-1;;;50916:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;50980:24:0;;;;;;:13;:24;;;;;;;;50972:56;;;;;-1:-1:-1;;;50972:56:0;;;;;;;;;;;;-1:-1:-1;;;50972:56:0;;;;;;;;;;;;;;;51035:20;27880:42;-1:-1:-1;;;;;51058:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51058:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51058:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;51058:43:0;;-1:-1:-1;32933:4:0;51116:9;:22;:27;:67;;;;-1:-1:-1;51158:7:0;;:25;;51170:12;51158:25;:11;:25;:::i;:::-;51147:9;:36;;51116:67;51108:150;;;;-1:-1:-1;;;51108:150:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51285:15;51303:3;51285:21;51273:10;-1:-1:-1;;;;;51273:33:0;;;:74;;;;;51324:15;51342:5;51324:23;51310:10;-1:-1:-1;;;;;51310:37:0;;;51273:74;51265:143;;;;-1:-1:-1;;;51265:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51415:19;51444:9;-1:-1:-1;;;;;51437:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51437:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51437:31:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;51437:31:0;51492:28;;;-1:-1:-1;;;51492:28:0;;;;51437:31;;-1:-1:-1;51475:14:0;;-1:-1:-1;;;;;51492:26:0;;;;;:28;;;;;51437:31;;51492:28;;;;;;;:26;:28;;;2:2:-1;;;;27:1;24;17:12;2:2;51492:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51492:28:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;51492:28:0;;-1:-1:-1;32368:19:0;51535:42;51555:11;51535:42;;;:19;:42::i;:::-;:67;;51527:102;;;;;-1:-1:-1;;;51527:102:0;;;;;;;;;;;;-1:-1:-1;;;51527:102:0;;;;;;;;;;;;;;;51694:7;;27880:42;;51638:65;;51680:22;;:9;;:22;:13;:22;:::i;:::-;51638:65;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51638:65:0;51710:36;;:::i;:::-;51749:244;;;;;;;;51788:10;-1:-1:-1;;;;;51749:244:0;;;;;51822:9;-1:-1:-1;;;;;51749:244:0;;;;;51855:10;51749:244;;;;51889:11;51749:244;;;;51924:25;32933:4;51924:7;;:11;;:25;;;;:::i;:::-;51749:244;;-1:-1:-1;;;;;51749:244:0;;;;;;;51710:283;-1:-1:-1;28343:42:0;52000:53;32202:4;52070:36;51710:283;52070:20;:36::i;:::-;52108:40;32933:4;52108:22;52122:7;;52108:9;:13;;:22;;;;:::i;:::-;:26;:40;:26;:40;:::i;:::-;52000:149;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;52000:149:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;52000:149:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52000:149:0;;;;52163:4;52156:11;;;;;;;50735:1438;;;;;:::o;33066:45::-;;;;;;;;;;;;;;;:::o;33010:51::-;;;;;;;;;;;;;;;:::o;32584:55::-;32638:1;32584:55;:::o;27563:88::-;27609:42;27563:88;:::o;54702:563::-;54875:2;54863:15;;54857:22;54784:7;;54892:33;;:::i;:::-;-1:-1:-1;54928:29:0;;;;:17;:29;;;;;;;;;54892:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54892:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54892:65:0;;;;;;54964:70;;55025:1;55018:8;;;;;;54964:70;55040:23;55073:11;:24;;;-1:-1:-1;;;;;55066:42:0;;27880;55066:58;;;;;;;;;;;;;-1:-1:-1;;;;;55066:58:0;-1:-1:-1;;;;;55066:58:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;55066:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55066:58:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;55066:58:0;55185:23;;;;55157;;;;55066:58;;-1:-1:-1;55131:23:0;;55157:52;;;:27;:52;:::i;:::-;55131:78;-1:-1:-1;55223:36:0;55131:78;55243:15;55223:36;:19;:36;:::i;:::-;55216:43;;;;;;54702:563;;;;:::o;27417:42::-;27453:6;27417:42;:::o;31932:57::-;31988:1;31932:57;:::o;27270:46::-;27312:4;27270:46;:::o;28291:94::-;28343:42;28291:94;:::o;32893:44::-;32933:4;32893:44;:::o;31736:55::-;31790:1;31736:55;:::o;36986:2136::-;-1:-1:-1;;;;;37101:33:0;;37079:4;37101:33;;;:19;:33;;;;;;;;37100:34;37092:90;;;;-1:-1:-1;;;37092:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37189:23;37215:34;37238:10;37215:22;:34::i;:::-;37189:60;;37256:32;;:::i;:::-;-1:-1:-1;37291:34:0;;;;:17;:34;;;;;;;;;37256:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37256:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37256:69:0;;;;;37332:80;;;;;-1:-1:-1;;;37332:80:0;;;;;;;;;;;;-1:-1:-1;;;37332:80:0;;;;;;;;;;;;;;;37419:20;37442:50;37469:10;:22;;;37442:10;:22;;;:26;;:50;;;;:::i;:::-;37419:73;;37521:10;:23;;;-1:-1:-1;;;;;37507:37:0;:12;-1:-1:-1;;;;;37507:37:0;;37499:119;;;;-1:-1:-1;;;37499:119:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37666:10;-1:-1:-1;;;;;37633:43:0;37640:12;-1:-1:-1;;;;;37633:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37633:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37633:31:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37633:31:0;-1:-1:-1;;;;;37633:43:0;;37625:102;;;;-1:-1:-1;;;37625:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37760:46;;;-1:-1:-1;;;37760:46:0;;27880:42;37760:46;;;;;;37734:23;;-1:-1:-1;;;;;37760:30:0;;;;;:46;;;;;;;;;;;;;;;:30;:46;;;2:2:-1;;;;27:1;24;17:12;2:2;37760:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37760:46:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37760:46:0;37821:57;;;-1:-1:-1;;;37821:57:0;;37852:10;37821:57;;;;37872:4;37821:57;;;;;;37760:46;;-1:-1:-1;37901:12:0;;37821:78;;37760:46;;-1:-1:-1;;;;;37821:30:0;;;;;:57;;;;;37760:46;;37821:57;;;;;;;:30;:57;;;2:2:-1;;;;27:1;24;17:12;2:2;37821:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37821:57:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37821:57:0;;:78;:61;:78;:::i;:::-;:92;;37813:128;;;;;-1:-1:-1;;;37813:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37948:16;37967:9;37948:28;;37983:20;27880:42;-1:-1:-1;;;;;38006:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;38006:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38006:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;38006:43:0;;-1:-1:-1;38064:24:0;;;;;;:54;;-1:-1:-1;32933:4:0;38092:8;:21;:26;38064:54;38056:122;;;;-1:-1:-1;;;38056:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38187:17;38207:46;38228:10;38240:12;38207:20;:46::i;:::-;38187:66;-1:-1:-1;38264:21:0;;;38260:429;;-1:-1:-1;;;;;38296:33:0;;;38330:10;27880:42;38358:33;:12;38375:15;38358:33;:16;:33;:::i;:::-;38296:96;;;;;;;;;;;;;-1:-1:-1;;;;;38296:96:0;-1:-1:-1;;;;;38296:96:0;;;;;;-1:-1:-1;;;;;38296:96:0;-1:-1:-1;;;;;38296:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;38296:96:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38296:96:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;38296:96:0;38437:26;;;38465:23;;;;;38490:24;;;;38401:114;;-1:-1:-1;;;38401:114:0;;;;;;;;;-1:-1:-1;;;;;38401:114:0;;;;;;;;;;;;;;27880:42;;38401:35;;:114;;;;;-1:-1:-1;;38401:114:0;;;;;;;-1:-1:-1;27880:42:0;38401:114;;;2:2:-1;;;;27:1;24;17:12;2:2;38401:114:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38401:114:0;;;;38541:12;-1:-1:-1;;;;;38529:75:0;;38555:10;38567;:22;;;38591:12;38529:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;38529:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38260:429;;;38644:12;-1:-1:-1;;;;;38632:49:0;;38658:10;38670;38632:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;38632:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38260:429;38702:34;;;;:17;:34;;;;;;;38695:41;;-1:-1:-1;;38695:41:0;;;;;;;;;;;;;;-1:-1:-1;;;;;;38695:41:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38695:41:0;;;38743:46;;:::i;:::-;-1:-1:-1;38792:96:0;;;;;;;;;;;;;;;;;;;38895:51;;27880:42;;38895:51;;;;;38937:8;;-1:-1:-1;38895:51:0;-1:-1:-1;38895:51:0;38937:8;27880:42;38895:51;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;28343:42:0;38953:53;27150:4;39023:46;39049:19;39023:25;:46::i;:::-;39071:26;:8;32933:4;39071:26;:12;:26;:::i;:::-;38953:145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;38953:145:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;38953:145:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;39112:4:0;;36986:2136;-1:-1:-1;;;;;;;;;;;;;;36986:2136:0:o;27927:83::-;27968:42;27927:83;:::o;40430:1150::-;40500:4;40513:23;40539:34;40562:10;40539:22;:34::i;:::-;40513:60;;40580:32;;:::i;:::-;-1:-1:-1;40615:34:0;;;;:17;:34;;;;;;;;;40580:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40580:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40580:69:0;;;;;40656:80;;;;;-1:-1:-1;;;40656:80:0;;;;;;;;;;;;-1:-1:-1;;;40656:80:0;;;;;;;;;;;;;;;40773:15;40751:10;:21;;;-1:-1:-1;;;;;40751:37:0;;40743:77;;;;;-1:-1:-1;;;40743:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;40827:16;40846:9;40827:28;;40862:20;27880:42;-1:-1:-1;;;;;40885:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40885:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40885:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;40885:43:0;;-1:-1:-1;40943:24:0;;;;;;:53;;-1:-1:-1;32933:4:0;40970:8;:21;:26;40943:53;40935:121;;;;-1:-1:-1;;;40935:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41070:34;;;;:17;:34;;;;;;;41063:41;;-1:-1:-1;;41063:41:0;;;;;;;;;;;;;;-1:-1:-1;;;;;;41063:41:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41063:41:0;;;41111:46;;:::i;:::-;-1:-1:-1;41160:105:0;;;;;;;;31730:1;41160:105;;;;;;;;41272:51;;27880:42;;41272:51;;;;;41314:8;;-1:-1:-1;41272:51:0;-1:-1:-1;41272:51:0;41314:8;27880:42;41272:51;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;28343:42:0;41330:53;27150:4;41400:46;41426:19;41400:25;:46::i;:::-;41448:26;:8;32933:4;41448:26;:12;:26;:::i;:::-;41330:145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;41330:145:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;41330:145:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41330:145:0;;;;41499:10;:23;;;-1:-1:-1;;;;;41487:69:0;;41524:10;31730:1;41487:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;41487:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41570:4:0;;40430:1150;-1:-1:-1;;;;;;40430:1150:0:o;28199:87::-;28244:42;28199:87;:::o;39128:1296::-;39220:4;39233:23;39259:34;39282:10;39259:22;:34::i;:::-;39233:60;;39300:32;;:::i;:::-;-1:-1:-1;39335:34:0;;;;:17;:34;;;;;;;;;39300:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39300:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39300:69:0;;;;;39376:80;;;;;-1:-1:-1;;;39376:80:0;;;;;;;;;;;;-1:-1:-1;;;39376:80:0;;;;;;;;;;;;;;;39485:10;:23;;;-1:-1:-1;;;;;39471:37:0;:12;-1:-1:-1;;;;;39471:37:0;;39463:119;;;;-1:-1:-1;;;39463:119:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39630:10;-1:-1:-1;;;;;39597:43:0;39604:12;-1:-1:-1;;;;;39597:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39597:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39597:31:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;39597:31:0;-1:-1:-1;;;;;39597:43:0;;39589:83;;;;;-1:-1:-1;;;39589:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39679:16;39698:9;39679:28;;39714:20;27880:42;-1:-1:-1;;;;;39737:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39737:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39737:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;39737:43:0;;-1:-1:-1;39795:24:0;;;;;;:54;;-1:-1:-1;32933:4:0;39823:8;:21;:26;39795:54;39787:122;;;;-1:-1:-1;;;39787:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39923:34;;;;:17;:34;;;;;;;39916:41;;-1:-1:-1;;39916:41:0;;;;;;;;;;;;;;-1:-1:-1;;;;;;39916:41:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39916:41:0;;;39964:46;;:::i;:::-;-1:-1:-1;40013:106:0;;;;;;;;32105:1;40013:106;;;;;;;;40126:51;;27880:42;;40126:51;;;;;40168:8;;-1:-1:-1;40126:51:0;-1:-1:-1;40126:51:0;40168:8;27880:42;40126:51;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;28343:42:0;40184:53;27150:4;40254:46;40280:19;40254:25;:46::i;:::-;40302:26;:8;32933:4;40302:26;:12;:26;:::i;:::-;40184:145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;40184:145:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40184:145:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40184:145:0;;;;40353:12;-1:-1:-1;;;;;40341:59:0;;40367:10;32105:1;40341:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;40341:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40414:4:0;;39128:1296;-1:-1:-1;;;;;;;39128:1296:0:o;27368:44::-;27408:4;27368:44;:::o;33116:24::-;;;;:::o;34098:357::-;29337:10;28343:42;29337:39;29329:99;;;;-1:-1:-1;;;29329:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34218:29:::1;::::0;::::1;32154:4;34218:29;34214:236;;;34258:32;34281:8;;34258:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;34258:22:0::1;::::0;-1:-1:-1;;;34258:32:0:i:1;:::-;34214:236;;;34308:27;::::0;::::1;32202:4;34308:27;34304:146;;;34346:30;34367:8;;34346:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;34346:20:0::1;::::0;-1:-1:-1;;;34346:30:0:i:1;34304:146::-;34404:38;34422:9;34433:8;;34404:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;;::::1;74:27:::0;34404:38:0::1;::::0;137:4:-1::1;117:14:::0;;::::1;-1:-1:::0;;113:30:::1;157:16:::0;;::::1;34404:38:0::0;;::::1;::::0;-1:-1:-1;34404:38:0;;-1:-1:-1;;;;;34404:38:0::1;34304:146;34098:357:::0;;;:::o;44408:2438::-;44507:64;;;-1:-1:-1;;;44507:64:0;;-1:-1:-1;;;;;44507:64:0;;;;;;;;44486:4;;;;27880:42;;44507:53;;:64;;;;;;;;;;;;;;27880:42;44507:64;;;2:2:-1;;;;27:1;24;17:12;2:2;44507:64:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44507:64:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;44507:64:0;:81;44499:107;;;;;-1:-1:-1;;;44499:107:0;;;;;;;;;;;;-1:-1:-1;;;44499:107:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;44622:30:0;;;;;;:19;:30;;;;;;;;44621:31;44613:58;;;;;-1:-1:-1;;;44613:58:0;;;;;;;;;;;;-1:-1:-1;;;44613:58:0;;;;;;;;;;;;;;;44678:20;27880:42;-1:-1:-1;;;;;44701:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44701:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44701:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;44701:43:0;;-1:-1:-1;32933:4:0;44759:9;:22;:27;:69;;;;-1:-1:-1;44801:9:0;;:27;;44815:12;44801:27;:13;:27;:::i;:::-;44790:9;:38;;44759:69;44751:159;;;;-1:-1:-1;;;44751:159:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44937:15;44955:3;44937:21;44925:10;-1:-1:-1;;;;;44925:33:0;;;:74;;;;;44976:15;44994:5;44976:23;44962:10;-1:-1:-1;;;;;44962:37:0;;;44925:74;44917:143;;;;-1:-1:-1;;;44917:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45067:14;45091:9;-1:-1:-1;;;;;45084:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45084:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45084:28:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;45084:28:0;45141:31;;;-1:-1:-1;;;45141:31:0;;;;45084:28;;-1:-1:-1;45119:19:0;;-1:-1:-1;;;;;45141:29:0;;;;;:31;;;;;45084:28;;45141:31;;;;;;;:29;:31;;;2:2:-1;;;;27:1;24;17:12;2:2;45141:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45141:31:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;45141:31:0;;-1:-1:-1;32368:19:0;45187:42;45141:31;45187:42;;;:19;:42::i;:::-;:67;;45179:102;;;;;-1:-1:-1;;;45179:102:0;;;;;;;;;;;;-1:-1:-1;;;45179:102:0;;;;;;;;;;;;;;;45288:18;45316:9;-1:-1:-1;;;;;45309:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45309:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45309:24:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;45309:24:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;15:2;7:11;;4:2;;;31:1;28;21:12;4:2;45309:24:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;-1:-1;;;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;372:25;;-1:-1;45309:24:0;;420:4:-1;411:14;;;;45309:24:0;;;;;411:14:-1;45309:24:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;45309:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45288:45;;45340:22;45371:4;45340:36;;45409:1;45391:9;:16;:19;;:43;;;;;45432:2;45414:9;:16;:20;;45391:43;45383:85;;;;;-1:-1:-1;;;45383:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45475:20;45505:9;-1:-1:-1;;;;;45498:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45498:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45498:26:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;45498:26:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;15:2;7:11;;4:2;;;31:1;28;21:12;4:2;45498:26:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;-1:-1;;;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;372:25;;-1:-1;45498:26:0;;420:4:-1;411:14;;;;45498:26:0;;;;;411:14:-1;45498:26:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;45498:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45498:26:0;;-1:-1:-1;;45586:18:0;;45475:49;;-1:-1:-1;45475:49:0;;32828:1;-1:-1:-1;45586:44:0;;;-1:-1:-1;45586:92:0;;-1:-1:-1;45634:18:0;;32885:1;-1:-1:-1;45634:44:0;45586:92;45578:135;;;;;-1:-1:-1;;;45578:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45725:7;45720:263;45742:11;:18;45738:1;:22;;;45720:263;;;-1:-1:-1;;;45785:11:0;45797:1;45785:14;;;;;;;;;;;;;;-1:-1:-1;;;;;;45785:14:0;:19;;;;:42;;;-1:-1:-1;;;45808:11:0;45820:1;45808:14;;;;;;;;;;;;;;-1:-1:-1;;;;;;45808:14:0;:19;;45785:42;45784:92;;;;-1:-1:-1;;;45833:11:0;45845:1;45833:14;;;;;;;;;;;;;;-1:-1:-1;;;;;;45833:14:0;:19;;;;:42;;;-1:-1:-1;;;45856:11:0;45868:1;45856:14;;;;;;;;;;;;;;-1:-1:-1;;;;;;45856:14:0;:19;;45833:42;45784:140;;;;-1:-1:-1;;;45881:11:0;45893:1;45881:14;;;;;;;;;;;;;;-1:-1:-1;;;;;;45881:14:0;:19;;;;:42;;;-1:-1:-1;;;45904:11:0;45916:1;45904:14;;;;;;;;;;;;;;-1:-1:-1;;;;;;45904:14:0;:19;;45881:42;45776:199;;;;-1:-1:-1;;;45776:199:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45762:3;;45720:263;;;-1:-1:-1;46045:9:0;;27880:42;;45989:67;;46031:24;;:9;;:24;:13;:24;:::i;:::-;45989:67;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;;;;46063:30:0;;;;;;:19;:30;;;;;;;;:37;;-1:-1:-1;;46063:37:0;46096:4;46063:37;;;46172:13;;;46166:20;46268:15;;;46262:22;46297:40;;:::i;:::-;46340:318;;;;;;;;46381:10;-1:-1:-1;;;;;46340:318:0;;;;;46415:9;-1:-1:-1;;;;;46340:318:0;;;;;46448:11;46340:318;;;;46483:13;46340:318;;;;46520:11;46340:318;;;;46555:8;46340:318;;;;;;46587:27;32933:4;46587:9;;:13;;:27;;;;:::i;:::-;46340:318;;-1:-1:-1;;;;;46340:318:0;;;;;;;46297:361;-1:-1:-1;28343:42:0;46665:53;32154:4;46737:40;46297:361;46737:22;:40::i;:::-;46779:42;32933:4;46779:24;46793:9;;46779;:13;;:24;;;;:::i;:42::-;46665:157;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;46665:157:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;46665:157:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46665:157:0;;;;46836:4;46829:11;;;;;;;;;;;;44408:2438;;;;:::o;32058:48::-;32105:1;32058:48;:::o;27321:42::-;27359:4;27321:42;:::o;32320:67::-;32368:19;32320:67;:::o;28113:81::-;28152:42;28113:81;:::o;28015:93::-;28066:42;28015:93;:::o;26989:23::-;;;;;;:::o;27019:34::-;27052:1;27019:34;:::o;53413:1082::-;29033:10;28152:42;29033:26;29025:85;;;;-1:-1:-1;;;29025:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53534:2:::1;53518:18:::0;::::1;53510:55;;;::::0;;-1:-1:-1;;;53510:55:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;53572:22;53597:3;;53572:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;;53607:31:0::1;::::0;;::::1;137:4:-1;53607:31:0::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;53572:28;;-1:-1:-1;53607:23:0::1;::::0;:31;-1:-1:-1;53633:5:0;;-1:-1:-1;53633:5:0;;;;53607:31;::::1;53633:5:::0;;;;53607:31;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;;;;53722:2:0::1;53708:17:::0;::::1;53702:24:::0;53607:31;;-1:-1:-1;;;;53743:89:0;::::1;53739:716;;;53943:2;53927:19:::0;::::1;53921:26:::0;32933:4:::1;53921:26:::0;53972:27:::1;:30:::0;53964:69:::1;;;::::0;;-1:-1:-1;;;53964:69:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;54042:9;:24:::0;53739:716:::1;;;-1:-1:-1::0;;;54084:89:0;::::1;54080:375;;;54278:2;54262:19:::0;::::1;54256:26:::0;32933:4:::1;54256:26:::0;54307:25:::1;:28:::0;54299:65:::1;;;::::0;;-1:-1:-1;;;54299:65:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;54373:7;:20:::0;54080:375:::1;;;54416:31;::::0;;-1:-1:-1;;;54416:31:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;54416:31:0;;;;;;;;;;;;;::::1;;54466:23;54478:3;;54483:5;;54466:23;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;;::::1;74:27:::0;137:4:::1;117:14;-1:-1:::0;;113:30:::1;157:16:::0;;::::1;54466:23:0::0;;::::1;::::0;;;;;::::1;;::::0;-1:-1:-1;54466:23:0;;;;;1:33:-1::1;99:1;81:16:::0;;::::1;74:27:::0;54466:23:0::1;::::0;137:4:-1::1;117:14:::0;;::::1;-1:-1:::0;;113:30:::1;157:16:::0;;::::1;54466:23:0::0;;::::1;::::0;-1:-1:-1;54466:23:0;;-1:-1:-1;;;;;;;54466:23:0::1;29117:1;;;53413:1082:::0;;;;:::o;27656:87::-;27701:42;27656:87;:::o;34461:369::-;29337:10;28343:42;29337:39;29329:99;;;;-1:-1:-1;;;29329:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34585:29:::1;::::0;::::1;32154:4;34585:29;34581:244;;;34625:36;34652:8;;34625:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;34625:26:0::1;::::0;-1:-1:-1;;;34625:36:0:i:1;34581:244::-;34679:27;::::0;::::1;32202:4;34679:27;34675:150;;;34717:34;34742:8;;34717:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;34717:24:0::1;::::0;-1:-1:-1;;;34717:34:0:i:1;32944:59::-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32944:59:0;;;;;;;;;;;;;-1:-1:-1;;;;;32944:59:0;;:::o;32392:44::-;32434:2;32392:44;:::o;27748:86::-;27792:42;27748:86;:::o;33145:22::-;;;;:::o;27466:92::-;27516:42;27466:92;:::o;32261:54::-;32310:5;32261:54;:::o;27839:83::-;27880:42;27839:83;:::o;35863:765::-;35933:12;35955:32;;:::i;:::-;35989:12;36005:30;36026:8;36005:20;:30::i;:::-;35954:81;;;;36050:7;36042:51;;;;;-1:-1:-1;;;36042:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;36104:22;;:38;;36100:497;;36171:26;;;;;;36153:45;;;;:17;:45;;;;;;;;;:56;;;;-1:-1:-1;;36153:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;36153:56:0;-1:-1:-1;;;;;36153:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36153:56:0;;-1:-1:-1;;;;;36153:56:0;;;;;;;;;;36100:497;;;36227:22;;:40;;31658:1;36227:40;36223:374;;;36278:20;27880:42;-1:-1:-1;;;;;36301:53:0;;36355:10;:26;;;36301:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;36301:81:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36301:81:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;36301:81:0;;-1:-1:-1;;;;;;36395:27:0;;;36391:133;;36473:26;;;;36435:79;;;-1:-1:-1;;;36435:79:0;;;;;;;;;-1:-1:-1;;;;;36435:79:0;;;;;;;27880:42;;36435:37;;:79;;;;;-1:-1:-1;;36435:79:0;;;;;;;-1:-1:-1;27880:42:0;36435:79;;;2:2:-1;;;;27:1;24;17:12;2:2;36435:79:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36435:79:0;;;;36391:133;36223:374;;;;36546:43;;;-1:-1:-1;;;36546:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;36610:12;;;36620:1;36610:12;;;;;;;;;;;-1:-1:-1;36603:19:0;35863:765;-1:-1:-1;;;;35863:765:0:o;6029:181::-;6087:7;6119:5;;;6143:6;;;;6135:46;;;;;-1:-1:-1;;;6135:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;57330:410;57426:7;32255:1;57446:40;;57442:223;;;32434:2;-1:-1:-1;;57505:38:0;;:57;;57497:88;;;;;-1:-1:-1;;;57497:88:0;;;;;;;;;;;;-1:-1:-1;;;57497:88:0;;;;;;;;;;;;;;;57601:56;:6;-1:-1:-1;;57617:38:0;;57612:2;:44;57601:56;:10;:56;:::i;:::-;57594:63;;;;57442:223;57678:56;:6;32255:1;57694:38;;;57689:2;:44;57678:56;:10;:56;:::i;6485:136::-;6543:7;6570:43;6574:1;6577;6570:43;;;;;;;;;;;;;;;;;:3;:43::i;8298:132::-;8356:7;8383:39;8387:1;8390;8383:39;;;;;;;;;;;;;;;;;:3;:39::i;48492:568::-;48630:14;;;48642:1;48630:14;;;;;;;;;48583:12;;;;48630:14;;;;;;;;;;;;;;;;;;-1:-1:-1;;48665:25:0;;48604:40;;-1:-1:-1;48665:41:0;;-1:-1:-1;;;;;48665:39:0;;:41::i;:::-;48651:8;48660:1;48651:11;;;;;;;;;;;;;:55;;;;48727:40;:14;:24;;;-1:-1:-1;;;;;48727:38:0;;:40::i;:::-;48713:8;48722:1;48713:11;;;;;;;;;;;;;:54;;;;48788:47;48796:14;:25;;;48788:34;;:45;:47::i;:::-;48774:8;48783:1;48774:11;;;;;;;;;;;;;:61;;;;48856:39;:14;:26;;;:37;:39::i;:::-;48842:8;48851:1;48842:11;;;;;;;;;;;;;:53;;;;48916:35;:14;:22;;;:33;:35::i;:::-;48902:8;48911:1;48902:11;;;;;;;;;;;;;:49;;;;48972:47;48980:14;:25;;;-1:-1:-1;;;;;48972:34:0;:45;:47::i;:::-;48958:8;48967:1;48958:11;;;;;;;;;;;;;:61;;;;49033:21;:8;:19;:21::i;54501:195::-;54660:2;54648:15;54642:22;;54501:195::o;55271:1237::-;55379:6;55394:16;55420:12;-1:-1:-1;;;;;55413:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;55413:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55413:31:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;55413:31:0;55479:29;;;-1:-1:-1;;;55479:29:0;;;;55394:50;;;;;-1:-1:-1;55451:25:0;;-1:-1:-1;;;;;55479:27:0;;;;;:29;;;;;;;;;;;;;;:27;:29;;;2:2:-1;;;;27:1;24;17:12;2:2;55479:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55479:29:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;55479:29:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;15:2;7:11;;4:2;;;31:1;28;21:12;4:2;55479:29:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;-1:-1;;;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;372:25;;-1:-1;55479:29:0;;420:4:-1;411:14;;;;55479:29:0;;;;;411:14:-1;55479:29:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;55479:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55479:29:0;;;;-1:-1:-1;;;55541:46:0;;27880:42;55541:46;;;;;55451:57;;-1:-1:-1;55515:23:0;;-1:-1:-1;;;;;55541:30:0;;;-1:-1:-1;55541:30:0;;-1:-1:-1;55541:46:0;;;;;-1:-1:-1;55541:46:0;;;;;;;:30;:46;;;2:2:-1;;;;27:1;24;17:12;2:2;55541:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55541:46:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;55541:46:0;55644:22;;;;55617;;;;55541:46;;-1:-1:-1;55594:20:0;;55617:50;;;:26;:50;:::i;:::-;55594:73;;55700:15;55678:10;:21;;;-1:-1:-1;;;;;55678:37:0;;55674:86;;;-1:-1:-1;31730:1:0;;-1:-1:-1;55726:26:0;;-1:-1:-1;;;55726:26:0;55674:86;55771:52;55783:11;55796:10;:26;;;55771:11;:52::i;:::-;55766:110;;-1:-1:-1;31790:1:0;;-1:-1:-1;55834:34:0;;-1:-1:-1;;;55834:34:0;55766:110;55904:12;55886:15;:30;55882:97;;;-1:-1:-1;31860:1:0;;-1:-1:-1;55927:44:0;;-1:-1:-1;;;55927:44:0;55882:97;56038:10;:22;;;55996:10;:23;;;-1:-1:-1;;;;;55989:43:0;;:45;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;55989:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55989:45:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;55989:45:0;:71;55985:134;;-1:-1:-1;31926:1:0;;-1:-1:-1;56071:40:0;;-1:-1:-1;;;56071:40:0;55985:134;56139:10;:24;;;56129:34;;:8;:34;56125:93;;-1:-1:-1;31988:1:0;;-1:-1:-1;56174:36:0;;-1:-1:-1;;;56174:36:0;56125:93;56282:26;;;;;56228:81;;;-1:-1:-1;;;56228:81:0;;;;;;;;;;56319:4;;27880:42;;56228:53;;:81;;;;;56282:26;56228:81;;;;;27880:42;56228:81;;;2:2:-1;;;;27:1;24;17:12;2:2;56228:81:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56228:81:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;56228:81:0;-1:-1:-1;;;;;56228:96:0;;;;:197;;;56420:4;56412:13;;27880:42;-1:-1:-1;;;;;56332:53:0;;56386:10;:23;;;56332:78;;;;;;;;;;;;;-1:-1:-1;;;;;56332:78:0;-1:-1:-1;;;;;56332:78:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;56332:78:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56332:78:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;56332:78:0;:93;;56228:197;56224:258;;;-1:-1:-1;32052:1:0;;-1:-1:-1;56436:38:0;;-1:-1:-1;;;56436:38:0;56224:258;-1:-1:-1;27052:1:0;;55271:1237;-1:-1:-1;;;;;;55271:1237:0:o;36634:346::-;36787:14;;;36799:1;36787:14;;;36740:12;36787:14;;;;;;36740:12;;36787:14;;;;;;;;;;;;;;;;;;-1:-1:-1;;36822:26:0;;36761:40;;-1:-1:-1;36822:39:0;;:37;;;:39::i;:::-;36808:8;36817:1;36808:11;;;;;;;;;;;;;:53;;;;36882:57;36890:19;:35;;;36882:44;;:55;:57::i;:::-;36868:8;36877:1;36868:11;;;;;;;46852:1059;46924:40;;:::i;:::-;46966:18;46988:32;47011:8;46988:22;:32::i;:::-;46923:97;;;;47035:13;47027:46;;;;;-1:-1:-1;;;47027:46:0;;;;;;;;;;;;-1:-1:-1;;;47027:46:0;;;;;;;;;;;;;;;47100:26;;;;;-1:-1:-1;;;;;47080:47:0;47130:5;47080:47;;;:19;:47;;;;;;:55;;-1:-1:-1;;47080:55:0;;;47146:26;;;;47080:55;47146:37;47142:764;;47237:26;;;;47195:69;;27880:42;;47195:69;;;;;;;;;47237:26;27880:42;47195:69;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47195:69:0;27880:42;-1:-1:-1;;;;;47273:35:0;;47309:16;:27;;;47338:16;:26;;;47366:16;:30;;;47273:124;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47273:124:0;-1:-1:-1;;;;;47273:124:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;47273:124:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;;47420:26:0;;;;;;-1:-1:-1;;;;;47406:41:0;;;;;;;:13;:41;;;;;;;:48;;-1:-1:-1;;47406:48:0;47450:4;47406:48;;;47482:26;;47510:27;;;;47468:70;;;;;;;;;;;;;;;;;;47547:7;;;;47142:764;47595:29;;47668:26;;;;47595:104;;47577:12;;-1:-1:-1;;;;;47595:34:0;;32310:5;;47577:12;47595:104;47577:12;47595:104;47668:26;47595:34;32310:5;47595:104;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;47576:123:0;;;47713:7;47708:108;;47779:26;;;;47733:73;;27701:42;;47733:73;;;;;;;;;47779:26;27701:42;47733:73;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47733:73:0;47708:108;47843:16;:26;;;-1:-1:-1;;;;;47829:69:0;;47871:16;:26;;;47829:69;;;;;;;;;;;;;;;;;;;;;;47142:764;46852:1059;;;;:::o;52179:735::-;52249:36;;:::i;:::-;52287:18;52309:30;52330:8;52309:20;:30::i;:::-;52248:91;;;;52354:13;52346:46;;;;;-1:-1:-1;;;52346:46:0;;;;;;;;;;;;-1:-1:-1;;;52346:46:0;;;;;;;;;;;;;;;52403:24;;;;:35;;52399:282;;52492:22;;;;;52450:65;;27880:42;;52450:65;;;;;;;;;52492:22;27880:42;52450:65;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52450:65:0;52541:14;:24;;;-1:-1:-1;;;;;52529:37:0;;;;;;;;;;;52575:7;;;;52399:282;52622:14;:24;;;-1:-1:-1;;;;;52610:63:0;;52648:14;:24;;;52610:63;;;;;;;;;;;;;;;;;;;;;;52706:25;;52775:22;;;;;52706:96;;52688:12;;-1:-1:-1;;;;;52706:30:0;;32310:5;;52688:12;52706:96;52688:12;52706:96;52775:22;52706:30;32310:5;52706:96;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;52687:115:0;;;52814:7;52809:100;;52878:22;;;;;52832:69;;27701:42;;52832:69;;;;;;;;;52878:22;27701:42;52832:69;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52832:69:0;52809:100;52179:735;;;;:::o;41586:733::-;41730:14;;;41742:1;41730:14;;;;;;;;;41683:12;;;;41730:14;;;;;;;;;;;;;;;;;;-1:-1:-1;;41765:29:0;;41704:40;;-1:-1:-1;41765:45:0;;-1:-1:-1;;;;;41765:43:0;;:45::i;:::-;41751:8;41760:1;41751:11;;;;;;;;;;;;;:59;;;;41831:42;:16;:26;;;-1:-1:-1;;;;;41831:40:0;;:42::i;:::-;41817:8;41826:1;41817:11;;;;;;;;;;;;;:56;;;;41894:48;41902:16;:26;;;41894:35;;:46;:48::i;:::-;41880:8;41889:1;41880:11;;;;;;;;;;;;;:62;;;;41963:50;41971:16;:28;;;41963:37;;:48;:50::i;:::-;41949:8;41958:1;41949:11;;;;;;;;;;;;;:64;;;;42034:41;:16;:28;;;:39;:41::i;:::-;42020:8;42029:1;42020:11;;;;;;;;;;;;;:55;;;;42096:52;42104:16;:30;;;42096:39;;:50;:52::i;:::-;42082:8;42091:1;42082:11;;;;;;;;;;;;;:66;;;;42169:39;:16;:26;;;:37;:39::i;:::-;42155:8;42164:1;42155:11;;;;;;;;;;;;;:53;;;;42229:49;42237:16;:27;;;-1:-1:-1;;;;;42229:36:0;:47;:49::i;:::-;42215:8;42224:1;42215:11;;;;;;;47917:569;47993:40;;:::i;:::-;48035:18;48057:32;48080:8;48057:22;:32::i;:::-;47992:97;;;;48104:13;48096:46;;;;;-1:-1:-1;;;48096:46:0;;;;;;;;;;;;-1:-1:-1;;;48096:46:0;;;;;;;;;;;;;;;48169:26;;;;;-1:-1:-1;;;;;48149:47:0;;;48199:5;48149:47;;;:19;:47;;;;;;:55;;-1:-1:-1;;48149:55:0;;;48230:29;;48303:26;;;;48230:34;;;32310:5;;48303:44;;32933:4;48303:44;:30;:44;:::i;:::-;48230:122;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;48211:141:0;;;48364:7;48359:122;;48428:26;;;;27701:42;;48382:91;;48428:44;;32933:4;48428:44;:30;:44;:::i;:::-;48382:91;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;52920:487:0;52994:36;;:::i;:::-;53032:18;53054:30;53075:8;53054:20;:30::i;:::-;52993:91;;;;53099:13;53091:46;;;;;-1:-1:-1;;;53091:46:0;;;;;;;;;;;;-1:-1:-1;;;53091:46:0;;;;;;;;;;;;;;;53163:25;;53232:22;;;;53145:12;;-1:-1:-1;;;;;53163:30:0;;32310:5;;53232:40;;32933:4;53232:40;:26;:40;:::i;:::-;53163:114;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;53144:133:0;;;53289:7;53284:118;;53353:22;;;;27701:42;;53307:87;;53353:40;;32933:4;53353:40;:26;:40;:::i;34836:1021::-;34911:21;;:::i;:::-;34934:4;34947:32;;:::i;:::-;34986:30;;:::i;:::-;35019:31;:20;:8;:18;:20::i;:::-;:29;:31::i;:::-;34986:64;-1:-1:-1;35057:12:0;;35104:713;35111:14;:4;:12;:14::i;:::-;35104:713;;;35142:8;35138:655;;35193:20;:11;:4;:9;:11::i;:::-;:18;:20::i;:::-;35157:57;;;;35138:655;;;35234:3;35241:1;35234:8;35230:563;;;35282:20;:11;:4;:9;:11::i;:20::-;35244:26;;;:59;35230:563;;;35323:3;35330:1;35323:8;35319:474;;;35363:23;:11;:4;:9;:11::i;:::-;:21;:23::i;:::-;-1:-1:-1;;;;;35333:53:0;:23;;;:53;35319:474;;;35406:3;35413:1;35406:8;35402:391;;;35446:20;:11;:4;:9;:11::i;:20::-;35416:22;;;:50;35402:391;;;35486:3;35493:1;35486:8;35482:311;;;35526:20;:11;:4;:9;:11::i;:20::-;35496:22;;;:50;35482:311;;;35566:3;35573:1;35566:8;35562:231;;;35612:20;:11;:4;:9;:11::i;:20::-;35576:57;;:24;;;:57;35562:231;;;35653:3;35660:1;35653:8;35649:144;;;35713:20;:11;:4;:9;:11::i;:20::-;-1:-1:-1;;;;;35676:58:0;:21;;;:58;35757:4;;-1:-1:-1;35649:144:0;;;35788:5;;35649:144;35804:5;;35104:713;;;-1:-1:-1;35831:10:0;;-1:-1:-1;35843:7:0;;-1:-1:-1;;34836:1021:0;;;:::o;7359:471::-;7417:7;7662:6;7658:47;;-1:-1:-1;7692:1:0;7685:8;;7658:47;7729:5;;;7733:1;7729;:5;:1;7753:5;;;;;:10;7745:56;;;;-1:-1:-1;;;7745:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6916:192;7002:7;7038:12;7030:6;;;;7022:29;;;;-1:-1:-1;;;7022:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;7022:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7074:5:0;;;6916:192::o;8918:345::-;9004:7;9106:12;9099:5;9091:28;;;;-1:-1:-1;;;9091:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;9091:28:0;;9130:9;9146:1;9142;:5;;;;;;;8918:345;-1:-1:-1;;;;;8918:345:0:o;11239:351::-;11388:4;11382:11;;-1:-1:-1;;;11426:55:0;;11421:2;11414:10;;11407:75;11516:2;11509:10;;11496:24;;;11299:12;;11568:14;11382:11;11568;:14::i;11729:121::-;11783:12;11815:27;11827:14;11836:4;11827:8;:14::i;:::-;11815:11;:27::i;12656:399::-;12720:12;12749:4;:11;12764:1;12749:16;12745:68;;;-1:-1:-1;12789:12:0;;;12799:1;12789:12;;;;;;;;12782:19;;12745:68;12823:20;12846:4;12851:1;12846:7;;;;;;;;;;;;;;12823:30;;12869:6;12878:1;12869:10;;12864:104;12885:4;:11;12881:1;:15;12864:104;;;12928:28;12939:7;12948:4;12953:1;12948:7;;;;;;;;;;;;;;12928:10;:28::i;:::-;12918:38;-1:-1:-1;12898:3:0;;12864:104;;;;12985:62;12996:41;13009:7;:14;10664:4;12996:41;;:12;:41::i;:::-;13039:7;12985:10;:62::i;56514:810::-;56683:23;;56609:4;;56660:11;;32885:1;-1:-1:-1;56683:50:0;:104;;-1:-1:-1;56737:23:0;;32828:1;-1:-1:-1;56683:104:0;56679:139;;;56805:5;56798:12;;;;;56679:139;56862:13;;;56872:2;56862:13;;;;;;;;;56826:33;;56862:13;;;21:6:-1;;108:14;56862:13:0;87:42:-1;143:17;;-1:-1;56862:13:0;56826:49;;56938:15;56933:2;56911:20;56907:29;56900:54;56971:20;56992:16;:23;56971:45;;;;;;;;;;;;;-1:-1:-1;;;;;;56971:45:0;-1:-1:-1;;;56971:53:0;56967:95;;57049:5;57042:12;;;;;;56967:95;57087:4;57068:16;57098:196;57128:16;:23;57120:5;:31;57098:196;;;57202:20;57223:5;57202:27;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57175:54:0;;:16;57192:5;57175:23;;;;;;;;;;;;-1:-1:-1;;;;;;57175:23:0;:54;57171:116;;57256:5;57242:19;;57272:5;;57171:116;57153:7;;57098:196;;;-1:-1:-1;57307:11:0;56514:810;-1:-1:-1;;;;;56514:810:0:o;43450:952::-;43527:23;;:::i;:::-;43552:4;43565:40;;:::i;:::-;43612:30;;:::i;:::-;43645:31;:20;:8;:18;:20::i;:31::-;43612:64;-1:-1:-1;43683:12:0;;43730:626;43737:14;:4;:12;:14::i;:::-;43730:626;;;43766:8;43762:572;;43815:23;:11;:4;:9;:11::i;:23::-;-1:-1:-1;;;;;43781:57:0;;;43762:572;;;43856:3;43863:1;43856:8;43852:482;;;43900:23;:11;:4;:9;:11::i;:23::-;-1:-1:-1;;;;;43866:57:0;:26;;;:57;43852:482;;;43941:3;43948:1;43941:8;43937:397;;;43991:20;:11;:4;:9;:11::i;:20::-;43951:61;;:30;;;:61;43937:397;;;44030:3;44037:1;44030:8;44026:308;;;44082:20;:11;:4;:9;:11::i;:20::-;44040:27;;;:63;44026:308;;;44121:3;44128:1;44121:8;44117:217;;;44165:20;:11;:4;:9;:11::i;:20::-;44131:26;;;:54;44117:217;;;44203:3;44210:1;44203:8;44199:135;;;44260:20;:11;:4;:9;:11::i;:20::-;44224:57;;:26;;;:57;44302:4;;-1:-1:-1;44199:135:0;44343:5;;43730:626;;49981:748;50056:21;;:::i;:::-;50079:4;50092:36;;:::i;:::-;50135:30;;:::i;:::-;50168:31;:20;:8;:18;:20::i;:31::-;50135:64;-1:-1:-1;50206:12:0;;50253:432;50260:14;:4;:12;:14::i;:::-;50253:432;;;50289:8;50285:378;;50334:23;:11;:4;:9;:11::i;:23::-;-1:-1:-1;;;;;50304:53:0;;;50285:378;;;50375:3;50382:1;50375:8;50371:292;;;50415:23;:11;:4;:9;:11::i;:23::-;-1:-1:-1;;;;;50385:53:0;:24;;;:53;50371:292;;;50456:3;50463:1;50456:8;50452:211;;;50496:20;:11;:4;:9;:11::i;:20::-;50466:22;;;:50;50452:211;;;50534:3;50541:1;50534:8;50530:133;;;50589:20;:11;:4;:9;:11::i;:20::-;50555:55;;:24;;;:55;50631:4;;-1:-1:-1;50530:133:0;50672:5;;50253:432;;42325:1119;42402:23;;:::i;:::-;42427:4;42440:40;;:::i;:::-;42487:30;;:::i;:::-;42520:31;:20;:8;:18;:20::i;:31::-;42487:64;-1:-1:-1;42558:12:0;;42605:793;42612:14;:4;:12;:14::i;:::-;42605:793;;;42641:8;42637:739;;42689:23;:11;:4;:9;:11::i;:23::-;-1:-1:-1;;;;;42656:56:0;;;42637:739;;;42730:3;42737:1;42730:8;42726:650;;;42773:23;:11;:4;:9;:11::i;:23::-;-1:-1:-1;;;;;42740:56:0;:26;;;:56;42726:650;;;42814:3;42821:1;42814:8;42810:566;;;42865:20;:11;:4;:9;:11::i;:20::-;42824:26;;;:62;42810:566;;;42904:3;42911:1;42904:8;42900:476;;;42955:20;:11;:4;:9;:11::i;:20::-;42914:28;;;:62;42900:476;;;42994:3;43001:1;42994:8;42990:386;;;43037:20;:11;:4;:9;:11::i;:20::-;43004:28;;;:53;42990:386;;;43075:3;43082:1;43075:8;43071:305;;;43124:20;:11;:4;:9;:11::i;:20::-;43085:60;;:30;;;:60;43071:305;;;43163:3;43170:1;43163:8;43159:217;;;43206:20;:11;:4;:9;:11::i;:20::-;43173:26;;;:53;43159:217;;;43244:3;43251:1;43244:8;43240:136;;;43302:20;:11;:4;:9;:11::i;:20::-;-1:-1:-1;;;;;43265:58:0;:27;;;:58;43344:4;;-1:-1:-1;43240:136:0;43385:5;;42605:793;;49066:909;49141:21;;:::i;:::-;49164:4;49177:36;;:::i;:::-;49220:30;;:::i;:::-;49253:31;:20;:8;:18;:20::i;:31::-;49220:64;-1:-1:-1;49291:12:0;;49338:593;49345:14;:4;:12;:14::i;:::-;49338:593;;;49374:8;49370:539;;49418:23;:11;:4;:9;:11::i;:23::-;-1:-1:-1;;;;;49389:52:0;;;49370:539;;;49459:3;49466:1;49459:8;49455:454;;;49498:23;:11;:4;:9;:11::i;:23::-;-1:-1:-1;;;;;49469:52:0;:24;;;:52;49455:454;;;49539:3;49546:1;49539:8;49535:374;;;49586:20;:11;:4;:9;:11::i;:20::-;49549:25;;;:58;49535:374;;;49625:3;49632:1;49625:8;49621:288;;;49664:20;:11;:4;:9;:11::i;:20::-;49635:26;;;:49;49621:288;;;49702:3;49709:1;49702:8;49698:211;;;49741:20;:11;:4;:9;:11::i;:20::-;49712:22;;;:49;49698:211;;;49779:3;49786:1;49779:8;49775:134;;;49835:20;:11;:4;:9;:11::i;:20::-;-1:-1:-1;;;;;49800:56:0;:25;;;:56;49877:4;;-1:-1:-1;49775:134:0;49918:5;;49338:593;;18923:225;18984:14;;:::i;:::-;-1:-1:-1;19112:28:0;;;;;;;;;19120:11;;19112:28;;19077:4;19067:15;;;19112:28;;;;18923:225;;;:::o;19156:221::-;19218:15;;:::i;:::-;19254:12;19261:4;19254:6;:12::i;:::-;19246:21;;12:1:-1;9;2:12;19246:21:0;19280:8;19305:27;19320:4;:11;;;19305:14;:27::i;:::-;19291:11;;;;;19350:19;;;;;;;;;;;;19291:41;;19350:19;;;;;-1:-1:-1;;19156:221:0;;;:::o;18742:173::-;18804:4;18821:19;;:::i;:::-;-1:-1:-1;;18843:9:0;;18899:8;;18885:11;;;;;18870:12;;;;;18885:22;;-1:-1:-1;;18742:173:0:o;18451:283::-;18510:14;;:::i;:::-;18545:13;18553:4;18545:7;:13::i;:::-;18537:22;;12:1:-1;9;2:12;18537:22:0;18583:12;;;;18572:8;18624:16;18583:12;18624:11;:16::i;:::-;18666;;;18651:12;;;;:31;18702:24;;;;;;;;;;;;;;;;;;;-1:-1:-1;18702:24:0;;18451:283;-1:-1:-1;18451:283:0:o;21371:613::-;21456:8;;21431:4;;21456:12;;;;:30;;-1:-1:-1;21472:8:0;;21484:2;-1:-1:-1;21472:14:0;21456:30;21448:39;;12:1:-1;9;2:12;21448:39:0;21500:11;21514:27;21529:4;:11;;;21514:14;:27::i;:::-;21500:41;;21572:6;21560:4;:8;;;:18;;21552:57;;;;;-1:-1:-1;;;21552:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21631:8;;21697:11;;;;;:20;;21762:13;;21631:17;;;;;21762:13;21849:11;;21846:2;;;-1:-1:-1;21915:2:0;21911:12;;;;21906:3;21902:22;21890:35;;;21970:6;-1:-1:-1;;;21371:613:0:o;21167:196::-;21299:8;;21230:7;;21311:2;21299:14;21291:23;;12:1:-1;9;2:12;21291:23:0;21342:12;21349:4;21342:6;:12::i;10841:250::-;10904:12;10933:4;:11;10948:1;10933:16;:35;;;;;10964:4;10953:15;;:4;10958:1;10953:7;;;;;;;;;;;;-1:-1:-1;;;;;;10953:7:0;:15;;10933:35;10929:79;;;-1:-1:-1;10992:4:0;10985:11;;10929:79;11025:58;11036:40;11049:4;:11;10624:4;11036:40;;:12;:40::i;:::-;11078:4;11025:10;:58::i;17105:788::-;17196:13;;;17206:2;17196:13;;;;;;;;;17154:12;;;;17196:13;;;;21:6:-1;;108:14;17196:13:0;87:42:-1;-1:-1;;;17258:2:0;17251:10;;17244:21;;;17179:30;-1:-1:-1;17286:6:0;-1:-1:-1;;17307:70:0;;17303:272;;-1:-1:-1;17403:2:0;17303:272;;;-1:-1:-1;;17427:70:0;;17423:152;;-1:-1:-1;17523:2:0;17423:152;;;-1:-1:-1;17562:1:0;17423:152;17596:2;17592:1;:6;17585:101;;;17624:1;17626;17624:4;;;;;;;;;;;;-1:-1:-1;;;;;;17624:4:0;:9;17620:55;;17654:5;;17620:55;17600:3;;17585:101;;;17696:11;17715:1;17710:2;:6;17696:20;;17727:15;17755:6;17745:17;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;108:14;17745:17:0;87:42:-1;143:17;;-1:-1;17745:17:0;-1:-1:-1;17804:15:0;;;17797:26;;;;-1:-1:-1;17837:18:0;;-1:-1:-1;17804:15:0;;17105:788;-1:-1:-1;;17105:788:0:o;13256:2915::-;13388:12;13418:22;13620:4;13614:11;13601:24;;13773:9;13767:16;13815:6;13804:9;13797:25;14050:4;14039:9;14035:20;14194:6;14190:2;14186:15;14385:4;14374:9;14370:20;14217:517;14413:3;14409:2;14406:11;14217:517;;;14709:9;;14698:21;;14518:4;14510:13;;;;14547;14217:517;;;-1:-1:-1;14938:17:0;;14999:16;;14987:29;;14969:48;;14938:17;-1:-1:-1;15157:3:0;-1:-1:-1;15289:15:0;;;15369:4;15353:21;;15320:228;15397:3;15393:2;15390:11;15320:228;;;15523:9;;15512:21;;15435:4;15427:13;;;;15464;15320:228;;;-1:-1:-1;16023:16:0;;16011:29;;;;16004:37;15995:47;;;;16066:2;15991:56;-1:-1:-1;;15973:150:0;15967:4;15960:164;-1:-1:-1;16154:9:0;-1:-1:-1;13256:2915:0;;;;:::o;16488:438::-;16559:12;16601:6;16592;:15;16584:42;;;;;-1:-1:-1;;;16584:42:0;;;;;;;;;;;;-1:-1:-1;;;16584:42:0;;;;;;;;;;;;;;;16655:12;;;16665:1;16655:12;;;;;;;;;16637:15;;16655:12;;;21:6:-1;;108:14;16655:12:0;87:42:-1;143:17;;-1:-1;16655:12:0;16637:30;;16692:2;16682:6;:12;16678:105;;16739:6;16730;:15;16719:28;;16711:2;16714:1;16711:5;;;;;;;;;;;:36;-1:-1:-1;;;;;16711:36:0;;;;;;;;-1:-1:-1;16769:2:0;-1:-1:-1;16762:9:0;;16678:105;16793:15;16811:16;16820:6;16811:8;:16::i;:::-;16793:34;;16869:6;16857:2;:9;:18;16878:2;16857:23;16846:36;;16838:2;16841:1;16838:5;;;;;;;;;;;:44;-1:-1:-1;;;;;16838:44:0;;;;;;;;;16900:18;16911:2;16915;16900:10;:18::i;:::-;16893:25;16488:438;-1:-1:-1;;;;;16488:438:0:o;20165:342::-;20246:8;;20225:4;;20242:31;;-1:-1:-1;20268:5:0;20261:12;;20242:31;20322:11;;;;20385:13;;20286:11;20377:22;;18121:4;20426:24;;20422:55;;;20472:5;20465:12;;;;;;20422:55;-1:-1:-1;20495:4:0;;20165:342;-1:-1:-1;;;20165:342:0:o;24746:551::-;24884:13;;24805:4;;24876:22;;18027:4;24925:26;;24921:368;;;24973:1;24966:8;;;;;24921:368;18074:4;24994:25;;;:83;;-1:-1:-1;18121:4:0;25024:25;;;;;:52;;-1:-1:-1;18168:4:0;25053:23;;25024:52;24990:299;;;25099:1;25092:8;;;;;24990:299;18121:4;25120:24;;25116:173;;;-1:-1:-1;;25185:35:0;;-1:-1:-1;25178:42:0;;25116:173;-1:-1:-1;;25256:33:0;;-1:-1:-1;25249:40:0;;23217:1474;23375:13;;23273:4;;;;23367:22;;18027:4;23416:26;;23412:1245;;;23467:1;23457:11;;23412:1245;;;18074:4;23490:25;;23486:1171;;;-1:-1:-1;;23540:30:0;;;-1:-1:-1;23486:1171:0;;;18121:4;23592:24;;23588:1069;;;23633:12;23714:4;23707:5;23703:16;23794:1;23786:6;23782:14;23772:24;;23932:7;23928:2;23924:16;23919:3;23915:26;23906:6;23900:13;23896:46;23885:57;;24030:1;24021:7;24017:15;24008:7;24004:29;23993:40;;;24081:7;24070;:18;;24062:48;;;;;-1:-1:-1;;;24062:48:0;;;;;;;;;;;;-1:-1:-1;;;24062:48:0;;;;;;;;;;;;;;;23588:1069;;;;18168:4;24143:23;;24139:518;;;-1:-1:-1;;24193:28:0;;;-1:-1:-1;24139:518:0;;;24265:12;24346:4;24339:5;24335:16;24391:1;24383:6;24379:14;24369:24;;24460:7;24456:2;24452:16;24447:3;24443:26;24434:6;24428:13;24424:46;24413:57;;24565:1;24556:7;24552:15;24543:7;24539:29;24528:40;;;24616:7;24605;:18;;24597:48;;;;;-1:-1:-1;;;24597:48:0;;;;;;;;;;;;-1:-1:-1;;;24597:48:0;;;;;;;;;;;;;;;24139:518;;-1:-1:-1;24676:7:0;23217:1474;-1:-1:-1;;23217:1474:0:o;30183:27560::-;;;;;;;;;-1:-1:-1;30183:27560:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;30183:27560:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;30183:27560:0;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;30183:27560:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;30183:27560:0;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://0181cc2360b762c035e0445790dcf19f8c7ed9a72fee8c6c76a706d9e554edee
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.