ETH Price: $2,502.08 (-0.34%)

Token

CAD (CAD)
 

Overview

Max Total Supply

28,404,232.335788 CAD

Holders

1,391 (0.00%)

Market

Price

$0.12 @ 0.000049 ETH (+10.04%)

Onchain Market Cap

$3,496,791.34

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.000000000000000001 CAD

Value
$0.00 ( ~0 Eth) [0.0000%]
0x1dFAB2C23426393BFEF2E8dfdeDFB8176a2e897e
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Cadence is an intent-centric perpetuals aggregator first launching as the flagship perpetuals protocol on Canto that will be the most capital-efficient use of liquidity by integrating Real World Assets (RWAs), Contract-Secured Revenue (CSR), and Liquid Staking Derivatives (LSDs).

Market

Volume (24H):$34,355.34
Market Capitalization:$0.00
Circulating Supply:0.00 CAD
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume
1
Uniswap V2 (Ethereum)
0X912529007BC0D2A5464A6A211EBFE217DFB75DFF-0XC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2$0.1222
0.0000488 Eth
$33,109.00
282,291.216 0X912529007BC0D2A5464A6A211EBFE217DFB75DFF
99.3126%
2
Canto Dex
0X8F20150205165C31D9B29C55A7B01F4911396306-0X826551890DC65655A0ACECA109AB11ABDBD7A07B$0.1113
0.0000444 Eth
$215.08
1,953.785 0X8F20150205165C31D9B29C55A7B01F4911396306
0.6874%

Contract Source Code Verified (Exact Match)

Contract Name:
CadenceOFTV2

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-01-20
*/

// Source: contracts/CadenceOFTV2.sol

pragma solidity 0.8.19;

// SPDX-License-Identifier: BUSL-1.1 AND MIT AND Unlicense

// File @layerzerolabs/solidity-examples/contracts/lzApp/interfaces/[email protected]

interface ILayerZeroUserApplicationConfig {
    // @notice set the configuration of the LayerZero messaging library of the specified version
    // @param _version - messaging library version
    // @param _chainId - the chainId for the pending config change
    // @param _configType - type of configuration. every messaging library has its own convention.
    // @param _config - configuration in the bytes. can encode arbitrary content.
    function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external;

    // @notice set the send() LayerZero messaging library version to _version
    // @param _version - new messaging library version
    function setSendVersion(uint16 _version) external;

    // @notice set the lzReceive() LayerZero messaging library version to _version
    // @param _version - new messaging library version
    function setReceiveVersion(uint16 _version) external;

    // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload
    // @param _srcChainId - the chainId of the source chain
    // @param _srcAddress - the contract address of the source contract at the source chain
    function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external;
}

// File @layerzerolabs/solidity-examples/contracts/lzApp/interfaces/[email protected]

interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig {
    // @notice send a LayerZero message to the specified address at a LayerZero endpoint.
    // @param _dstChainId - the destination chain identifier
    // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains
    // @param _payload - a custom bytes payload to send to the destination contract
    // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address
    // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction
    // @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination
    function send(
        uint16 _dstChainId,
        bytes calldata _destination,
        bytes calldata _payload,
        address payable _refundAddress,
        address _zroPaymentAddress,
        bytes calldata _adapterParams
    ) external payable;

    // @notice used by the messaging library to publish verified payload
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source contract (as bytes) at the source chain
    // @param _dstAddress - the address on destination chain
    // @param _nonce - the unbound message ordering nonce
    // @param _gasLimit - the gas limit for external contract execution
    // @param _payload - verified payload to send to the destination contract
    function receivePayload(
        uint16 _srcChainId,
        bytes calldata _srcAddress,
        address _dstAddress,
        uint64 _nonce,
        uint _gasLimit,
        bytes calldata _payload
    ) external;

    // @notice get the inboundNonce of a lzApp from a source chain which could be EVM or non-EVM chain
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64);

    // @notice get the outboundNonce from this source chain which, consequently, is always an EVM
    // @param _srcAddress - the source chain contract address
    function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64);

    // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery
    // @param _dstChainId - the destination chain identifier
    // @param _userApplication - the user app address on this EVM chain
    // @param _payload - the custom message to send over LayerZero
    // @param _payInZRO - if false, user app pays the protocol fee in native token
    // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain
    function estimateFees(
        uint16 _dstChainId,
        address _userApplication,
        bytes calldata _payload,
        bool _payInZRO,
        bytes calldata _adapterParam
    ) external view returns (uint nativeFee, uint zroFee);

    // @notice get this Endpoint's immutable source identifier
    function getChainId() external view returns (uint16);

    // @notice the interface to retry failed message on this Endpoint destination
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    // @param _payload - the payload to be retried
    function retryPayload(uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload) external;

    // @notice query if any STORED payload (message blocking) at the endpoint.
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool);

    // @notice query if the _libraryAddress is valid for sending msgs.
    // @param _userApplication - the user app address on this EVM chain
    function getSendLibraryAddress(address _userApplication) external view returns (address);

    // @notice query if the _libraryAddress is valid for receiving msgs.
    // @param _userApplication - the user app address on this EVM chain
    function getReceiveLibraryAddress(address _userApplication) external view returns (address);

    // @notice query if the non-reentrancy guard for send() is on
    // @return true if the guard is on. false otherwise
    function isSendingPayload() external view returns (bool);

    // @notice query if the non-reentrancy guard for receive() is on
    // @return true if the guard is on. false otherwise
    function isReceivingPayload() external view returns (bool);

    // @notice get the configuration of the LayerZero messaging library of the specified version
    // @param _version - messaging library version
    // @param _chainId - the chainId for the pending config change
    // @param _userApplication - the contract address of the user application
    // @param _configType - type of configuration. every messaging library has its own convention.
    function getConfig(uint16 _version, uint16 _chainId, address _userApplication, uint _configType) external view returns (bytes memory);

    // @notice get the send() LayerZero messaging library version
    // @param _userApplication - the contract address of the user application
    function getSendVersion(address _userApplication) external view returns (uint16);

    // @notice get the lzReceive() LayerZero messaging library version
    // @param _userApplication - the contract address of the user application
    function getReceiveVersion(address _userApplication) external view returns (uint16);
}

// File @layerzerolabs/solidity-examples/contracts/libraries/[email protected]

/*
 * @title Solidity Bytes Arrays Utils
 * @author Gonçalo Sá <[email protected]>
 *
 * @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity.
 *      The library lets you concatenate, slice and type cast bytes arrays both in memory and storage.
 */

library BytesLib {
    function concat(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;
    }

    function concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal {
        assembly {
            // Read the first 32 bytes of _preBytes storage, which is the length
            // of the array. (We don't need to use the offset into the slot
            // because arrays use the entire slot.)
            let fslot := sload(_preBytes.slot)
            // Arrays of 31 bytes or less have an even value in their slot,
            // while longer arrays have an odd value. The actual length is
            // the slot divided by two for odd values, and the lowest order
            // byte divided by two for even values.
            // If the slot is even, bitwise and the slot with 255 and divide by
            // two to get the length. If the slot is odd, bitwise and the slot
            // with -1 and divide by two.
            let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)
            let mlength := mload(_postBytes)
            let newlength := add(slength, mlength)
            // slength can contain both the length and contents of the array
            // if length < 32 bytes so let's prepare for that
            // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage
            switch add(lt(slength, 32), lt(newlength, 32))
            case 2 {
                // Since the new array still fits in the slot, we just need to
                // update the contents of the slot.
                // uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length
                sstore(
                    _preBytes.slot,
                    // all the modifications to the slot are inside this
                    // next block
                    add(
                        // we can just add to the slot contents because the
                        // bytes we want to change are the LSBs
                        fslot,
                        add(
                            mul(
                                div(
                                    // load the bytes from memory
                                    mload(add(_postBytes, 0x20)),
                                    // zero all bytes to the right
                                    exp(0x100, sub(32, mlength))
                                ),
                                // and now shift left the number of bytes to
                                // leave space for the length in the slot
                                exp(0x100, sub(32, newlength))
                            ),
                            // increase length by the double of the memory
                            // bytes length
                            mul(mlength, 2)
                        )
                    )
                )
            }
            case 1 {
                // The stored value fits in the slot, but the combined value
                // will exceed it.
                // get the keccak hash to get the contents of the array
                mstore(0x0, _preBytes.slot)
                let sc := add(keccak256(0x0, 0x20), div(slength, 32))

                // save new length
                sstore(_preBytes.slot, add(mul(newlength, 2), 1))

                // The contents of the _postBytes array start 32 bytes into
                // the structure. Our first read should obtain the `submod`
                // bytes that can fit into the unused space in the last word
                // of the stored array. To get this, we read 32 bytes starting
                // from `submod`, so the data we read overlaps with the array
                // contents by `submod` bytes. Masking the lowest-order
                // `submod` bytes allows us to add that value directly to the
                // stored value.

                let submod := sub(32, slength)
                let mc := add(_postBytes, submod)
                let end := add(_postBytes, mlength)
                let mask := sub(exp(0x100, submod), 1)

                sstore(sc, add(and(fslot, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00), and(mload(mc), mask)))

                for {
                    mc := add(mc, 0x20)
                    sc := add(sc, 1)
                } lt(mc, end) {
                    sc := add(sc, 1)
                    mc := add(mc, 0x20)
                } {
                    sstore(sc, mload(mc))
                }

                mask := exp(0x100, sub(mc, end))

                sstore(sc, mul(div(mload(mc), mask), mask))
            }
            default {
                // get the keccak hash to get the contents of the array
                mstore(0x0, _preBytes.slot)
                // Start copying to the last used word of the stored array.
                let sc := add(keccak256(0x0, 0x20), div(slength, 32))

                // save new length
                sstore(_preBytes.slot, add(mul(newlength, 2), 1))

                // Copy over the first `submod` bytes of the new data as in
                // case 1 above.
                let slengthmod := mod(slength, 32)
                let mlengthmod := mod(mlength, 32)
                let submod := sub(32, slengthmod)
                let mc := add(_postBytes, submod)
                let end := add(_postBytes, mlength)
                let mask := sub(exp(0x100, submod), 1)

                sstore(sc, add(sload(sc), and(mload(mc), mask)))

                for {
                    sc := add(sc, 1)
                    mc := add(mc, 0x20)
                } lt(mc, end) {
                    sc := add(sc, 1)
                    mc := add(mc, 0x20)
                } {
                    sstore(sc, mload(mc))
                }

                mask := exp(0x100, sub(mc, end))

                sstore(sc, mul(div(mload(mc), mask), mask))
            }
        }
    }

    function slice(bytes memory _bytes, uint _start, uint _length) internal pure returns (bytes memory) {
        require(_length + 31 >= _length, 'slice_overflow');
        require(_bytes.length >= _start + _length, 'slice_outOfBounds');

        bytes memory tempBytes;

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

                // The first word of the slice result is potentially a partial
                // word read from the original array. To read it, we calculate
                // the length of that partial word and start copying that many
                // bytes into the array. The first word we copy will start with
                // data we don't care about, but the last `lengthmod` bytes will
                // land at the beginning of the contents of the new array. When
                // we're done copying, we overwrite the full first word with
                // the actual length of the slice.
                let lengthmod := and(_length, 31)

                // The multiplication in the next line is necessary
                // because when slicing multiples of 32 bytes (lengthmod == 0)
                // the following copy loop was copying the origin's length
                // and then ending prematurely not copying everything it should.
                let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))
                let end := add(mc, _length)

                for {
                    // The multiplication in the next line has the same exact purpose
                    // as the one above.
                    let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)
                } lt(mc, end) {
                    mc := add(mc, 0x20)
                    cc := add(cc, 0x20)
                } {
                    mstore(mc, mload(cc))
                }

                mstore(tempBytes, _length)

                //update free-memory pointer
                //allocating the array padded to 32 bytes like the compiler does now
                mstore(0x40, and(add(mc, 31), not(31)))
            }
            //if we want a zero-length slice let's just return a zero-length array
            default {
                tempBytes := mload(0x40)
                //zero out the 32 bytes slice we are about to return
                //we need to do it because Solidity does not garbage collect
                mstore(tempBytes, 0)

                mstore(0x40, add(tempBytes, 0x20))
            }
        }

        return tempBytes;
    }

    function toAddress(bytes memory _bytes, uint _start) internal pure returns (address) {
        require(_bytes.length >= _start + 20, 'toAddress_outOfBounds');
        address tempAddress;

        assembly {
            tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)
        }

        return tempAddress;
    }

    function toUint8(bytes memory _bytes, uint _start) internal pure returns (uint8) {
        require(_bytes.length >= _start + 1, 'toUint8_outOfBounds');
        uint8 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x1), _start))
        }

        return tempUint;
    }

    function toUint16(bytes memory _bytes, uint _start) internal pure returns (uint16) {
        require(_bytes.length >= _start + 2, 'toUint16_outOfBounds');
        uint16 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x2), _start))
        }

        return tempUint;
    }

    function toUint32(bytes memory _bytes, uint _start) internal pure returns (uint32) {
        require(_bytes.length >= _start + 4, 'toUint32_outOfBounds');
        uint32 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x4), _start))
        }

        return tempUint;
    }

    function toUint64(bytes memory _bytes, uint _start) internal pure returns (uint64) {
        require(_bytes.length >= _start + 8, 'toUint64_outOfBounds');
        uint64 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x8), _start))
        }

        return tempUint;
    }

    function toUint96(bytes memory _bytes, uint _start) internal pure returns (uint96) {
        require(_bytes.length >= _start + 12, 'toUint96_outOfBounds');
        uint96 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0xc), _start))
        }

        return tempUint;
    }

    function toUint128(bytes memory _bytes, uint _start) internal pure returns (uint128) {
        require(_bytes.length >= _start + 16, 'toUint128_outOfBounds');
        uint128 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x10), _start))
        }

        return tempUint;
    }

    function toUint256(bytes memory _bytes, uint _start) internal pure returns (uint) {
        require(_bytes.length >= _start + 32, 'toUint256_outOfBounds');
        uint tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x20), _start))
        }

        return tempUint;
    }

    function toBytes32(bytes memory _bytes, uint _start) internal pure returns (bytes32) {
        require(_bytes.length >= _start + 32, 'toBytes32_outOfBounds');
        bytes32 tempBytes32;

        assembly {
            tempBytes32 := mload(add(add(_bytes, 0x20), _start))
        }

        return tempBytes32;
    }

    function equal(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bool) {
        bool success = true;

        assembly {
            let length := mload(_preBytes)

            // if lengths don't match the arrays are not equal
            switch eq(length, mload(_postBytes))
            case 1 {
                // cb is a circuit breaker in the for loop since there's
                //  no said feature for inline assembly loops
                // cb = 1 - don't breaker
                // cb = 0 - break
                let cb := 1

                let mc := add(_preBytes, 0x20)
                let end := add(mc, length)

                for {
                    let cc := add(_postBytes, 0x20)
                    // the next line is the loop condition:
                    // while(uint256(mc < end) + cb == 2)
                } eq(add(lt(mc, end), cb), 2) {
                    mc := add(mc, 0x20)
                    cc := add(cc, 0x20)
                } {
                    // if any of these checks fails then arrays are not equal
                    if iszero(eq(mload(mc), mload(cc))) {
                        // unsuccess:
                        success := 0
                        cb := 0
                    }
                }
            }
            default {
                // unsuccess:
                success := 0
            }
        }

        return success;
    }

    function equalStorage(bytes storage _preBytes, bytes memory _postBytes) internal view returns (bool) {
        bool success = true;

        assembly {
            // we know _preBytes_offset is 0
            let fslot := sload(_preBytes.slot)
            // Decode the length of the stored array like in concatStorage().
            let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)
            let mlength := mload(_postBytes)

            // if lengths don't match the arrays are not equal
            switch eq(slength, mlength)
            case 1 {
                // slength can contain both the length and contents of the array
                // if length < 32 bytes so let's prepare for that
                // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage
                if iszero(iszero(slength)) {
                    switch lt(slength, 32)
                    case 1 {
                        // blank the last byte which is the length
                        fslot := mul(div(fslot, 0x100), 0x100)

                        if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) {
                            // unsuccess:
                            success := 0
                        }
                    }
                    default {
                        // cb is a circuit breaker in the for loop since there's
                        //  no said feature for inline assembly loops
                        // cb = 1 - don't breaker
                        // cb = 0 - break
                        let cb := 1

                        // get the keccak hash to get the contents of the array
                        mstore(0x0, _preBytes.slot)
                        let sc := keccak256(0x0, 0x20)

                        let mc := add(_postBytes, 0x20)
                        let end := add(mc, mlength)

                        // the next line is the loop condition:
                        // while(uint256(mc < end) + cb == 2)
                        for {

                        } eq(add(lt(mc, end), cb), 2) {
                            sc := add(sc, 1)
                            mc := add(mc, 0x20)
                        } {
                            if iszero(eq(sload(sc), mload(mc))) {
                                // unsuccess:
                                success := 0
                                cb := 0
                            }
                        }
                    }
                }
            }
            default {
                // unsuccess:
                success := 0
            }
        }

        return success;
    }
}

// File @layerzerolabs/solidity-examples/contracts/lzApp/interfaces/[email protected]

interface ILayerZeroReceiver {
    // @notice LayerZero endpoint will invoke this function to deliver the message on the destination
    // @param _srcChainId - the source endpoint identifier
    // @param _srcAddress - the source sending contract address from the source chain
    // @param _nonce - the ordered message nonce
    // @param _payload - the signed payload is the UA bytes has encoded to be sent
    function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) external;
}

// File @openzeppelin/contracts/utils/[email protected]

// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)

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

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

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

// File @openzeppelin/contracts/access/[email protected]

// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), 'Ownable: caller is not the owner');
    }

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

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

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

// File @layerzerolabs/solidity-examples/contracts/lzApp/[email protected]

/*
 * a generic LzReceiver implementation
 */
abstract contract LzApp is Ownable, ILayerZeroReceiver, ILayerZeroUserApplicationConfig {
    using BytesLib for bytes;

    // ua can not send payload larger than this by default, but it can be changed by the ua owner
    uint public constant DEFAULT_PAYLOAD_SIZE_LIMIT = 10000;

    ILayerZeroEndpoint public immutable lzEndpoint;
    mapping(uint16 => bytes) public trustedRemoteLookup;
    mapping(uint16 => mapping(uint16 => uint)) public minDstGasLookup;
    mapping(uint16 => uint) public payloadSizeLimitLookup;
    address public precrime;

    event SetPrecrime(address precrime);
    event SetTrustedRemote(uint16 _remoteChainId, bytes _path);
    event SetTrustedRemoteAddress(uint16 _remoteChainId, bytes _remoteAddress);
    event SetMinDstGas(uint16 _dstChainId, uint16 _type, uint _minDstGas);

    constructor(address _endpoint) {
        lzEndpoint = ILayerZeroEndpoint(_endpoint);
    }

    function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) public virtual override {
        // lzReceive must be called by the endpoint for security
        require(_msgSender() == address(lzEndpoint), 'LzApp: invalid endpoint caller');

        bytes memory trustedRemote = trustedRemoteLookup[_srcChainId];
        // if will still block the message pathway from (srcChainId, srcAddress). should not receive message from untrusted remote.
        require(
            _srcAddress.length == trustedRemote.length && trustedRemote.length > 0 && keccak256(_srcAddress) == keccak256(trustedRemote),
            'LzApp: invalid source sending contract'
        );

        _blockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
    }

    // abstract function - the default behaviour of LayerZero is blocking. See: NonblockingLzApp if you dont need to enforce ordered messaging
    function _blockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual;

    function _lzSend(
        uint16 _dstChainId,
        bytes memory _payload,
        address payable _refundAddress,
        address _zroPaymentAddress,
        bytes memory _adapterParams,
        uint _nativeFee
    ) internal virtual {
        bytes memory trustedRemote = trustedRemoteLookup[_dstChainId];
        require(trustedRemote.length != 0, 'LzApp: destination chain is not a trusted source');
        _checkPayloadSize(_dstChainId, _payload.length);
        lzEndpoint.send{ value: _nativeFee }(_dstChainId, trustedRemote, _payload, _refundAddress, _zroPaymentAddress, _adapterParams);
    }

    function _checkGasLimit(uint16 _dstChainId, uint16 _type, bytes memory _adapterParams, uint _extraGas) internal view virtual {
        uint providedGasLimit = _getGasLimit(_adapterParams);
        uint minGasLimit = minDstGasLookup[_dstChainId][_type];
        require(minGasLimit > 0, 'LzApp: minGasLimit not set');
        require(providedGasLimit >= minGasLimit + _extraGas, 'LzApp: gas limit is too low');
    }

    function _getGasLimit(bytes memory _adapterParams) internal pure virtual returns (uint gasLimit) {
        require(_adapterParams.length >= 34, 'LzApp: invalid adapterParams');
        assembly {
            gasLimit := mload(add(_adapterParams, 34))
        }
    }

    function _checkPayloadSize(uint16 _dstChainId, uint _payloadSize) internal view virtual {
        uint payloadSizeLimit = payloadSizeLimitLookup[_dstChainId];
        if (payloadSizeLimit == 0) {
            // use default if not set
            payloadSizeLimit = DEFAULT_PAYLOAD_SIZE_LIMIT;
        }
        require(_payloadSize <= payloadSizeLimit, 'LzApp: payload size is too large');
    }

    //---------------------------UserApplication config----------------------------------------
    function getConfig(uint16 _version, uint16 _chainId, address, uint _configType) external view returns (bytes memory) {
        return lzEndpoint.getConfig(_version, _chainId, address(this), _configType);
    }

    // generic config for LayerZero user Application
    function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external override onlyOwner {
        lzEndpoint.setConfig(_version, _chainId, _configType, _config);
    }

    function setSendVersion(uint16 _version) external override onlyOwner {
        lzEndpoint.setSendVersion(_version);
    }

    function setReceiveVersion(uint16 _version) external override onlyOwner {
        lzEndpoint.setReceiveVersion(_version);
    }

    function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external override onlyOwner {
        lzEndpoint.forceResumeReceive(_srcChainId, _srcAddress);
    }

    // _path = abi.encodePacked(remoteAddress, localAddress)
    // this function set the trusted path for the cross-chain communication
    function setTrustedRemote(uint16 _remoteChainId, bytes calldata _path) external onlyOwner {
        trustedRemoteLookup[_remoteChainId] = _path;
        emit SetTrustedRemote(_remoteChainId, _path);
    }

    function setTrustedRemoteAddress(uint16 _remoteChainId, bytes calldata _remoteAddress) external onlyOwner {
        trustedRemoteLookup[_remoteChainId] = abi.encodePacked(_remoteAddress, address(this));
        emit SetTrustedRemoteAddress(_remoteChainId, _remoteAddress);
    }

    function getTrustedRemoteAddress(uint16 _remoteChainId) external view returns (bytes memory) {
        bytes memory path = trustedRemoteLookup[_remoteChainId];
        require(path.length != 0, 'LzApp: no trusted path record');
        return path.slice(0, path.length - 20); // the last 20 bytes should be address(this)
    }

    function setPrecrime(address _precrime) external onlyOwner {
        precrime = _precrime;
        emit SetPrecrime(_precrime);
    }

    function setMinDstGas(uint16 _dstChainId, uint16 _packetType, uint _minGas) external onlyOwner {
        minDstGasLookup[_dstChainId][_packetType] = _minGas;
        emit SetMinDstGas(_dstChainId, _packetType, _minGas);
    }

    // if the size is 0, it means default size limit
    function setPayloadSizeLimit(uint16 _dstChainId, uint _size) external onlyOwner {
        payloadSizeLimitLookup[_dstChainId] = _size;
    }

    //--------------------------- VIEW FUNCTION ----------------------------------------
    function isTrustedRemote(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool) {
        bytes memory trustedSource = trustedRemoteLookup[_srcChainId];
        return keccak256(trustedSource) == keccak256(_srcAddress);
    }
}

// File @layerzerolabs/solidity-examples/contracts/libraries/[email protected]

library ExcessivelySafeCall {
    uint constant LOW_28_MASK = 0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff;

    /// @notice Use when you _really_ really _really_ don't trust the called
    /// contract. This prevents the called contract from causing reversion of
    /// the caller in as many ways as we can.
    /// @dev The main difference between this and a solidity low-level call is
    /// that we limit the number of bytes that the callee can cause to be
    /// copied to caller memory. This prevents stupid things like malicious
    /// contracts returning 10,000,000 bytes causing a local OOG when copying
    /// to memory.
    /// @param _target The address to call
    /// @param _gas The amount of gas to forward to the remote contract
    /// @param _maxCopy The maximum number of bytes of returndata to copy
    /// to memory.
    /// @param _calldata The data to send to the remote contract
    /// @return success and returndata, as `.call()`. Returndata is capped to
    /// `_maxCopy` bytes.
    function excessivelySafeCall(
        address _target,
        uint _gas,
        uint16 _maxCopy,
        bytes memory _calldata
    ) internal returns (bool, bytes memory) {
        // set up for assembly call
        uint _toCopy;
        bool _success;
        bytes memory _returnData = new bytes(_maxCopy);
        // dispatch message to recipient
        // by assembly calling "handle" function
        // we call via assembly to avoid memcopying a very large returndata
        // returned by a malicious contract
        assembly {
            _success := call(
                _gas, // gas
                _target, // recipient
                0, // ether value
                add(_calldata, 0x20), // inloc
                mload(_calldata), // inlen
                0, // outloc
                0 // outlen
            )
            // limit our copy to 256 bytes
            _toCopy := returndatasize()
            if gt(_toCopy, _maxCopy) {
                _toCopy := _maxCopy
            }
            // Store the length of the copied bytes
            mstore(_returnData, _toCopy)
            // copy the bytes from returndata[0:_toCopy]
            returndatacopy(add(_returnData, 0x20), 0, _toCopy)
        }
        return (_success, _returnData);
    }

    /// @notice Use when you _really_ really _really_ don't trust the called
    /// contract. This prevents the called contract from causing reversion of
    /// the caller in as many ways as we can.
    /// @dev The main difference between this and a solidity low-level call is
    /// that we limit the number of bytes that the callee can cause to be
    /// copied to caller memory. This prevents stupid things like malicious
    /// contracts returning 10,000,000 bytes causing a local OOG when copying
    /// to memory.
    /// @param _target The address to call
    /// @param _gas The amount of gas to forward to the remote contract
    /// @param _maxCopy The maximum number of bytes of returndata to copy
    /// to memory.
    /// @param _calldata The data to send to the remote contract
    /// @return success and returndata, as `.call()`. Returndata is capped to
    /// `_maxCopy` bytes.
    function excessivelySafeStaticCall(
        address _target,
        uint _gas,
        uint16 _maxCopy,
        bytes memory _calldata
    ) internal view returns (bool, bytes memory) {
        // set up for assembly call
        uint _toCopy;
        bool _success;
        bytes memory _returnData = new bytes(_maxCopy);
        // dispatch message to recipient
        // by assembly calling "handle" function
        // we call via assembly to avoid memcopying a very large returndata
        // returned by a malicious contract
        assembly {
            _success := staticcall(
                _gas, // gas
                _target, // recipient
                add(_calldata, 0x20), // inloc
                mload(_calldata), // inlen
                0, // outloc
                0 // outlen
            )
            // limit our copy to 256 bytes
            _toCopy := returndatasize()
            if gt(_toCopy, _maxCopy) {
                _toCopy := _maxCopy
            }
            // Store the length of the copied bytes
            mstore(_returnData, _toCopy)
            // copy the bytes from returndata[0:_toCopy]
            returndatacopy(add(_returnData, 0x20), 0, _toCopy)
        }
        return (_success, _returnData);
    }

    /**
     * @notice Swaps function selectors in encoded contract calls
     * @dev Allows reuse of encoded calldata for functions with identical
     * argument types but different names. It simply swaps out the first 4 bytes
     * for the new selector. This function modifies memory in place, and should
     * only be used with caution.
     * @param _newSelector The new 4-byte selector
     * @param _buf The encoded contract args
     */
    function swapSelector(bytes4 _newSelector, bytes memory _buf) internal pure {
        require(_buf.length >= 4);
        uint _mask = LOW_28_MASK;
        assembly {
            // load the first word of
            let _word := mload(add(_buf, 0x20))
            // mask out the top 4 bytes
            // /x
            _word := and(_word, _mask)
            _word := or(_newSelector, _word)
            mstore(add(_buf, 0x20), _word)
        }
    }
}

// File @layerzerolabs/solidity-examples/contracts/lzApp/[email protected]

/*
 * the default LayerZero messaging behaviour is blocking, i.e. any failed message will block the channel
 * this abstract class try-catch all fail messages and store locally for future retry. hence, non-blocking
 * NOTE: if the srcAddress is not configured properly, it will still block the message pathway from (srcChainId, srcAddress)
 */
abstract contract NonblockingLzApp is LzApp {
    using ExcessivelySafeCall for address;

    constructor(address _endpoint) LzApp(_endpoint) {}

    mapping(uint16 => mapping(bytes => mapping(uint64 => bytes32))) public failedMessages;

    event MessageFailed(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload, bytes _reason);
    event RetryMessageSuccess(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes32 _payloadHash);

    // overriding the virtual function in LzReceiver
    function _blockingLzReceive(
        uint16 _srcChainId,
        bytes memory _srcAddress,
        uint64 _nonce,
        bytes memory _payload
    ) internal virtual override {
        (bool success, bytes memory reason) = address(this).excessivelySafeCall(
            gasleft(),
            150,
            abi.encodeWithSelector(this.nonblockingLzReceive.selector, _srcChainId, _srcAddress, _nonce, _payload)
        );
        if (!success) {
            _storeFailedMessage(_srcChainId, _srcAddress, _nonce, _payload, reason);
        }
    }

    function _storeFailedMessage(
        uint16 _srcChainId,
        bytes memory _srcAddress,
        uint64 _nonce,
        bytes memory _payload,
        bytes memory _reason
    ) internal virtual {
        failedMessages[_srcChainId][_srcAddress][_nonce] = keccak256(_payload);
        emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload, _reason);
    }

    function nonblockingLzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) public virtual {
        // only internal transaction
        require(_msgSender() == address(this), 'NonblockingLzApp: caller must be LzApp');
        _nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
    }

    //@notice override this function
    function _nonblockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual;

    function retryMessage(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) public payable virtual {
        // assert there is message to retry
        bytes32 payloadHash = failedMessages[_srcChainId][_srcAddress][_nonce];
        require(payloadHash != bytes32(0), 'NonblockingLzApp: no stored message');
        require(keccak256(_payload) == payloadHash, 'NonblockingLzApp: invalid payload');
        // clear the stored message
        failedMessages[_srcChainId][_srcAddress][_nonce] = bytes32(0);
        // execute the message. revert if it fails again
        _nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
        emit RetryMessageSuccess(_srcChainId, _srcAddress, _nonce, payloadHash);
    }
}

// File @openzeppelin/contracts/utils/introspection/[email protected]

// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File @layerzerolabs/solidity-examples/contracts/token/oft/v2/interfaces/[email protected]

/**
 * @dev Interface of the IOFT core standard
 */
interface ICommonOFT is IERC165 {
    struct LzCallParams {
        address payable refundAddress;
        address zroPaymentAddress;
        bytes adapterParams;
    }

    /**
     * @dev estimate send token `_tokenId` to (`_dstChainId`, `_toAddress`)
     * _dstChainId - L0 defined chain id to send tokens too
     * _toAddress - dynamic bytes array which contains the address to whom you are sending tokens to on the dstChain
     * _amount - amount of the tokens to transfer
     * _useZro - indicates to use zro to pay L0 fees
     * _adapterParam - flexible bytes array to indicate messaging adapter services in L0
     */
    function estimateSendFee(
        uint16 _dstChainId,
        bytes32 _toAddress,
        uint _amount,
        bool _useZro,
        bytes calldata _adapterParams
    ) external view returns (uint nativeFee, uint zroFee);

    function estimateSendAndCallFee(
        uint16 _dstChainId,
        bytes32 _toAddress,
        uint _amount,
        bytes calldata _payload,
        uint64 _dstGasForCall,
        bool _useZro,
        bytes calldata _adapterParams
    ) external view returns (uint nativeFee, uint zroFee);

    /**
     * @dev returns the circulating amount of tokens on current chain
     */
    function circulatingSupply() external view returns (uint);

    /**
     * @dev returns the address of the ERC20 token
     */
    function token() external view returns (address);
}

// File @layerzerolabs/solidity-examples/contracts/token/oft/v2/interfaces/[email protected]

/**
 * @dev Interface of the IOFT core standard
 */
interface IOFTV2 is ICommonOFT {
    /**
     * @dev send `_amount` amount of token to (`_dstChainId`, `_toAddress`) from `_from`
     * `_from` the owner of token
     * `_dstChainId` the destination chain identifier
     * `_toAddress` can be any size depending on the `dstChainId`.
     * `_amount` the quantity of tokens in wei
     * `_refundAddress` the address LayerZero refunds if too much message fee is sent
     * `_zroPaymentAddress` set to address(0x0) if not paying in ZRO (LayerZero Token)
     * `_adapterParams` is a flexible bytes array to indicate messaging adapter services
     */
    function sendFrom(
        address _from,
        uint16 _dstChainId,
        bytes32 _toAddress,
        uint _amount,
        LzCallParams calldata _callParams
    ) external payable;

    function sendAndCall(
        address _from,
        uint16 _dstChainId,
        bytes32 _toAddress,
        uint _amount,
        bytes calldata _payload,
        uint64 _dstGasForCall,
        LzCallParams calldata _callParams
    ) external payable;
}

// File @layerzerolabs/solidity-examples/contracts/token/oft/v2/interfaces/[email protected]

interface IOFTReceiverV2 {
    /**
     * @dev Called by the OFT contract when tokens are received from source chain.
     * @param _srcChainId The chain id of the source chain.
     * @param _srcAddress The address of the OFT token contract on the source chain.
     * @param _nonce The nonce of the transaction on the source chain.
     * @param _from The address of the account who calls the sendAndCall() on the source chain.
     * @param _amount The amount of tokens to transfer.
     * @param _payload Additional data with no specified format.
     */
    function onOFTReceived(
        uint16 _srcChainId,
        bytes calldata _srcAddress,
        uint64 _nonce,
        bytes32 _from,
        uint _amount,
        bytes calldata _payload
    ) external;
}

// File @layerzerolabs/solidity-examples/contracts/token/oft/v2/[email protected]

abstract contract OFTCoreV2 is NonblockingLzApp {
    using BytesLib for bytes;
    using ExcessivelySafeCall for address;

    uint public constant NO_EXTRA_GAS = 0;

    // packet type
    uint8 public constant PT_SEND = 0;
    uint8 public constant PT_SEND_AND_CALL = 1;

    uint8 public immutable sharedDecimals;

    mapping(uint16 => mapping(bytes => mapping(uint64 => bool))) public creditedPackets;

    /**
     * @dev Emitted when `_amount` tokens are moved from the `_sender` to (`_dstChainId`, `_toAddress`)
     * `_nonce` is the outbound nonce
     */
    event SendToChain(uint16 indexed _dstChainId, address indexed _from, bytes32 indexed _toAddress, uint _amount);

    /**
     * @dev Emitted when `_amount` tokens are received from `_srcChainId` into the `_toAddress` on the local chain.
     * `_nonce` is the inbound nonce.
     */
    event ReceiveFromChain(uint16 indexed _srcChainId, address indexed _to, uint _amount);

    event CallOFTReceivedSuccess(uint16 indexed _srcChainId, bytes _srcAddress, uint64 _nonce, bytes32 _hash);

    event NonContractAddress(address _address);

    // _sharedDecimals should be the minimum decimals on all chains
    constructor(uint8 _sharedDecimals, address _lzEndpoint) NonblockingLzApp(_lzEndpoint) {
        sharedDecimals = _sharedDecimals;
    }

    /************************************************************************
     * public functions
     ************************************************************************/
    function callOnOFTReceived(
        uint16 _srcChainId,
        bytes calldata _srcAddress,
        uint64 _nonce,
        bytes32 _from,
        address _to,
        uint _amount,
        bytes calldata _payload,
        uint _gasForCall
    ) public virtual {
        require(_msgSender() == address(this), 'OFTCore: caller must be OFTCore');

        // send
        _amount = _transferFrom(address(this), _to, _amount);
        emit ReceiveFromChain(_srcChainId, _to, _amount);

        // call
        IOFTReceiverV2(_to).onOFTReceived{ gas: _gasForCall }(_srcChainId, _srcAddress, _nonce, _from, _amount, _payload);
    }

    /************************************************************************
     * internal functions
     ************************************************************************/
    function _estimateSendFee(
        uint16 _dstChainId,
        bytes32 _toAddress,
        uint _amount,
        bool _useZro,
        bytes memory _adapterParams
    ) internal view virtual returns (uint nativeFee, uint zroFee) {
        // mock the payload for sendFrom()
        bytes memory payload = _encodeSendPayload(_toAddress, _ld2sd(_amount));
        return lzEndpoint.estimateFees(_dstChainId, address(this), payload, _useZro, _adapterParams);
    }

    function _estimateSendAndCallFee(
        uint16 _dstChainId,
        bytes32 _toAddress,
        uint _amount,
        bytes memory _payload,
        uint64 _dstGasForCall,
        bool _useZro,
        bytes memory _adapterParams
    ) internal view virtual returns (uint nativeFee, uint zroFee) {
        // mock the payload for sendAndCall()
        bytes memory payload = _encodeSendAndCallPayload(msg.sender, _toAddress, _ld2sd(_amount), _payload, _dstGasForCall);
        return lzEndpoint.estimateFees(_dstChainId, address(this), payload, _useZro, _adapterParams);
    }

    function _nonblockingLzReceive(
        uint16 _srcChainId,
        bytes memory _srcAddress,
        uint64 _nonce,
        bytes memory _payload
    ) internal virtual override {
        uint8 packetType = _payload.toUint8(0);

        if (packetType == PT_SEND) {
            _sendAck(_srcChainId, _srcAddress, _nonce, _payload);
        } else if (packetType == PT_SEND_AND_CALL) {
            _sendAndCallAck(_srcChainId, _srcAddress, _nonce, _payload);
        } else {
            revert('OFTCore: unknown packet type');
        }
    }

    function _send(
        address _from,
        uint16 _dstChainId,
        bytes32 _toAddress,
        uint _amount,
        address payable _refundAddress,
        address _zroPaymentAddress,
        bytes memory _adapterParams
    ) internal virtual returns (uint amount) {
        _checkGasLimit(_dstChainId, PT_SEND, _adapterParams, NO_EXTRA_GAS);

        (amount, ) = _removeDust(_amount);
        amount = _debitFrom(_from, _dstChainId, _toAddress, amount); // amount returned should not have dust
        require(amount > 0, 'OFTCore: amount too small');

        bytes memory lzPayload = _encodeSendPayload(_toAddress, _ld2sd(amount));
        _lzSend(_dstChainId, lzPayload, _refundAddress, _zroPaymentAddress, _adapterParams, msg.value);

        emit SendToChain(_dstChainId, _from, _toAddress, amount);
    }

    function _sendAck(uint16 _srcChainId, bytes memory, uint64, bytes memory _payload) internal virtual {
        (address to, uint64 amountSD) = _decodeSendPayload(_payload);
        if (to == address(0)) {
            to = address(0xdead);
        }

        uint amount = _sd2ld(amountSD);
        amount = _creditTo(_srcChainId, to, amount);

        emit ReceiveFromChain(_srcChainId, to, amount);
    }

    function _sendAndCall(
        address _from,
        uint16 _dstChainId,
        bytes32 _toAddress,
        uint _amount,
        bytes memory _payload,
        uint64 _dstGasForCall,
        address payable _refundAddress,
        address _zroPaymentAddress,
        bytes memory _adapterParams
    ) internal virtual returns (uint amount) {
        _checkGasLimit(_dstChainId, PT_SEND_AND_CALL, _adapterParams, _dstGasForCall);

        (amount, ) = _removeDust(_amount);
        amount = _debitFrom(_from, _dstChainId, _toAddress, amount);
        require(amount > 0, 'OFTCore: amount too small');

        // encode the msg.sender into the payload instead of _from
        bytes memory lzPayload = _encodeSendAndCallPayload(msg.sender, _toAddress, _ld2sd(amount), _payload, _dstGasForCall);
        _lzSend(_dstChainId, lzPayload, _refundAddress, _zroPaymentAddress, _adapterParams, msg.value);

        emit SendToChain(_dstChainId, _from, _toAddress, amount);
    }

    function _sendAndCallAck(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual {
        (bytes32 from, address to, uint64 amountSD, bytes memory payloadForCall, uint64 gasForCall) = _decodeSendAndCallPayload(_payload);

        bool credited = creditedPackets[_srcChainId][_srcAddress][_nonce];
        uint amount = _sd2ld(amountSD);

        // credit to this contract first, and then transfer to receiver only if callOnOFTReceived() succeeds
        if (!credited) {
            amount = _creditTo(_srcChainId, address(this), amount);
            creditedPackets[_srcChainId][_srcAddress][_nonce] = true;
        }

        if (!_isContract(to)) {
            emit NonContractAddress(to);
            return;
        }

        // workaround for stack too deep
        uint16 srcChainId = _srcChainId;
        bytes memory srcAddress = _srcAddress;
        uint64 nonce = _nonce;
        bytes memory payload = _payload;
        bytes32 from_ = from;
        address to_ = to;
        uint amount_ = amount;
        bytes memory payloadForCall_ = payloadForCall;

        // no gas limit for the call if retry
        uint gas = credited ? gasleft() : gasForCall;
        (bool success, bytes memory reason) = address(this).excessivelySafeCall(
            gasleft(),
            150,
            abi.encodeWithSelector(
                this.callOnOFTReceived.selector,
                srcChainId,
                srcAddress,
                nonce,
                from_,
                to_,
                amount_,
                payloadForCall_,
                gas
            )
        );

        if (success) {
            bytes32 hash = keccak256(payload);
            emit CallOFTReceivedSuccess(srcChainId, srcAddress, nonce, hash);
        } else {
            // store the failed message into the nonblockingLzApp
            _storeFailedMessage(srcChainId, srcAddress, nonce, payload, reason);
        }
    }

    function _isContract(address _account) internal view returns (bool) {
        return _account.code.length > 0;
    }

    function _ld2sd(uint _amount) internal view virtual returns (uint64) {
        uint amountSD = _amount / _ld2sdRate();
        require(amountSD <= type(uint64).max, 'OFTCore: amountSD overflow');
        return uint64(amountSD);
    }

    function _sd2ld(uint64 _amountSD) internal view virtual returns (uint) {
        return _amountSD * _ld2sdRate();
    }

    function _removeDust(uint _amount) internal view virtual returns (uint amountAfter, uint dust) {
        dust = _amount % _ld2sdRate();
        amountAfter = _amount - dust;
    }

    function _encodeSendPayload(bytes32 _toAddress, uint64 _amountSD) internal view virtual returns (bytes memory) {
        return abi.encodePacked(PT_SEND, _toAddress, _amountSD);
    }

    function _decodeSendPayload(bytes memory _payload) internal view virtual returns (address to, uint64 amountSD) {
        require(_payload.toUint8(0) == PT_SEND && _payload.length == 41, 'OFTCore: invalid payload');

        to = _payload.toAddress(13); // drop the first 12 bytes of bytes32
        amountSD = _payload.toUint64(33);
    }

    function _encodeSendAndCallPayload(
        address _from,
        bytes32 _toAddress,
        uint64 _amountSD,
        bytes memory _payload,
        uint64 _dstGasForCall
    ) internal view virtual returns (bytes memory) {
        return abi.encodePacked(PT_SEND_AND_CALL, _toAddress, _amountSD, _addressToBytes32(_from), _dstGasForCall, _payload);
    }

    function _decodeSendAndCallPayload(
        bytes memory _payload
    ) internal view virtual returns (bytes32 from, address to, uint64 amountSD, bytes memory payload, uint64 dstGasForCall) {
        require(_payload.toUint8(0) == PT_SEND_AND_CALL, 'OFTCore: invalid payload');

        to = _payload.toAddress(13); // drop the first 12 bytes of bytes32
        amountSD = _payload.toUint64(33);
        from = _payload.toBytes32(41);
        dstGasForCall = _payload.toUint64(73);
        payload = _payload.slice(81, _payload.length - 81);
    }

    function _addressToBytes32(address _address) internal pure virtual returns (bytes32) {
        return bytes32(uint(uint160(_address)));
    }

    function _debitFrom(address _from, uint16 _dstChainId, bytes32 _toAddress, uint _amount) internal virtual returns (uint);

    function _creditTo(uint16 _srcChainId, address _toAddress, uint _amount) internal virtual returns (uint);

    function _transferFrom(address _from, address _to, uint _amount) internal virtual returns (uint);

    function _ld2sdRate() internal view virtual returns (uint);
}

// File @openzeppelin/contracts/utils/introspection/[email protected]

// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File @layerzerolabs/solidity-examples/contracts/token/oft/v2/[email protected]

abstract contract BaseOFTV2 is OFTCoreV2, ERC165, IOFTV2 {
    constructor(uint8 _sharedDecimals, address _lzEndpoint) OFTCoreV2(_sharedDecimals, _lzEndpoint) {}

    /************************************************************************
     * public functions
     ************************************************************************/
    function sendFrom(
        address _from,
        uint16 _dstChainId,
        bytes32 _toAddress,
        uint _amount,
        LzCallParams calldata _callParams
    ) public payable virtual override {
        _send(_from, _dstChainId, _toAddress, _amount, _callParams.refundAddress, _callParams.zroPaymentAddress, _callParams.adapterParams);
    }

    function sendAndCall(
        address _from,
        uint16 _dstChainId,
        bytes32 _toAddress,
        uint _amount,
        bytes calldata _payload,
        uint64 _dstGasForCall,
        LzCallParams calldata _callParams
    ) public payable virtual override {
        _sendAndCall(
            _from,
            _dstChainId,
            _toAddress,
            _amount,
            _payload,
            _dstGasForCall,
            _callParams.refundAddress,
            _callParams.zroPaymentAddress,
            _callParams.adapterParams
        );
    }

    /************************************************************************
     * public view functions
     ************************************************************************/
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return interfaceId == type(IOFTV2).interfaceId || super.supportsInterface(interfaceId);
    }

    function estimateSendFee(
        uint16 _dstChainId,
        bytes32 _toAddress,
        uint _amount,
        bool _useZro,
        bytes calldata _adapterParams
    ) public view virtual override returns (uint nativeFee, uint zroFee) {
        return _estimateSendFee(_dstChainId, _toAddress, _amount, _useZro, _adapterParams);
    }

    function estimateSendAndCallFee(
        uint16 _dstChainId,
        bytes32 _toAddress,
        uint _amount,
        bytes calldata _payload,
        uint64 _dstGasForCall,
        bool _useZro,
        bytes calldata _adapterParams
    ) public view virtual override returns (uint nativeFee, uint zroFee) {
        return _estimateSendAndCallFee(_dstChainId, _toAddress, _amount, _payload, _dstGasForCall, _useZro, _adapterParams);
    }

    function circulatingSupply() public view virtual override returns (uint);

    function token() public view virtual override returns (address);
}

// File @openzeppelin/contracts/token/ERC20/[email protected]

// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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);

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

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

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

// File @openzeppelin/contracts/token/ERC20/extensions/[email protected]

// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

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

// File @openzeppelin/contracts/token/ERC20/[email protected]

// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, 'ERC20: decreased allowance below zero');
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(address from, address to, uint256 amount) internal virtual {
        require(from != address(0), 'ERC20: transfer from the zero address');
        require(to != address(0), 'ERC20: transfer to the zero address');

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, 'ERC20: transfer amount exceeds balance');
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), 'ERC20: mint to the zero address');

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), 'ERC20: burn from the zero address');

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, 'ERC20: burn amount exceeds balance');
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), 'ERC20: approve from the zero address');
        require(spender != address(0), 'ERC20: approve to the zero address');

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, 'ERC20: insufficient allowance');
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}

// File @layerzerolabs/solidity-examples/contracts/token/oft/v2/[email protected]

contract OFTV2 is BaseOFTV2, ERC20 {
    uint internal immutable ld2sdRate;

    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _sharedDecimals,
        address _lzEndpoint
    ) ERC20(_name, _symbol) BaseOFTV2(_sharedDecimals, _lzEndpoint) {
        uint8 decimals = decimals();
        require(_sharedDecimals <= decimals, 'OFT: sharedDecimals must be <= decimals');
        ld2sdRate = 10 ** (decimals - _sharedDecimals);
    }

    /************************************************************************
     * public functions
     ************************************************************************/
    function circulatingSupply() public view virtual override returns (uint) {
        return totalSupply();
    }

    function token() public view virtual override returns (address) {
        return address(this);
    }

    /************************************************************************
     * internal functions
     ************************************************************************/
    function _debitFrom(address _from, uint16, bytes32, uint _amount) internal virtual override returns (uint) {
        address spender = _msgSender();
        if (_from != spender) _spendAllowance(_from, spender, _amount);
        _burn(_from, _amount);
        return _amount;
    }

    function _creditTo(uint16, address _toAddress, uint _amount) internal virtual override returns (uint) {
        _mint(_toAddress, _amount);
        return _amount;
    }

    function _transferFrom(address _from, address _to, uint _amount) internal virtual override returns (uint) {
        address spender = _msgSender();
        // if transfer from this contract, no need to check allowance
        if (_from != address(this) && _from != spender) _spendAllowance(_from, spender, _amount);
        _transfer(_from, _to, _amount);
        return _amount;
    }

    function _ld2sdRate() internal view virtual override returns (uint) {
        return ld2sdRate;
    }
}

// File contracts/CadenceOFTV2.sol

contract CadenceOFTV2 is OFTV2 {
    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _sharedDecimals,
        address _lzEndpoint
    ) OFTV2(_name, _symbol, _sharedDecimals, _lzEndpoint) {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_sharedDecimals","type":"uint8"},{"internalType":"address","name":"_lzEndpoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"_hash","type":"bytes32"}],"name":"CallOFTReceivedSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"_reason","type":"bytes"}],"name":"MessageFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"}],"name":"NonContractAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"ReceiveFromChain","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"_payloadHash","type":"bytes32"}],"name":"RetryMessageSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"bytes32","name":"_toAddress","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"SendToChain","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"_type","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"_minDstGas","type":"uint256"}],"name":"SetMinDstGas","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"precrime","type":"address"}],"name":"SetPrecrime","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_path","type":"bytes"}],"name":"SetTrustedRemote","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_remoteAddress","type":"bytes"}],"name":"SetTrustedRemoteAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_PAYLOAD_SIZE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NO_EXTRA_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PT_SEND","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PT_SEND_AND_CALL","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes32","name":"_from","type":"bytes32"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_payload","type":"bytes"},{"internalType":"uint256","name":"_gasForCall","type":"uint256"}],"name":"callOnOFTReceived","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"circulatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"creditedPackets","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes32","name":"_toAddress","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_payload","type":"bytes"},{"internalType":"uint64","name":"_dstGasForCall","type":"uint64"},{"internalType":"bool","name":"_useZro","type":"bool"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"estimateSendAndCallFee","outputs":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"zroFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes32","name":"_toAddress","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_useZro","type":"bool"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"estimateSendFee","outputs":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"zroFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"failedMessages","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"forceResumeReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"_configType","type":"uint256"}],"name":"getConfig","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"}],"name":"getTrustedRemoteAddress","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"isTrustedRemote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lzEndpoint","outputs":[{"internalType":"contract ILayerZeroEndpoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"}],"name":"minDstGasLookup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"nonblockingLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"payloadSizeLimitLookup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"precrime","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"retryMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes32","name":"_toAddress","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_payload","type":"bytes"},{"internalType":"uint64","name":"_dstGasForCall","type":"uint64"},{"components":[{"internalType":"address payable","name":"refundAddress","type":"address"},{"internalType":"address","name":"zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"adapterParams","type":"bytes"}],"internalType":"struct ICommonOFT.LzCallParams","name":"_callParams","type":"tuple"}],"name":"sendAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes32","name":"_toAddress","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"components":[{"internalType":"address payable","name":"refundAddress","type":"address"},{"internalType":"address","name":"zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"adapterParams","type":"bytes"}],"internalType":"struct ICommonOFT.LzCallParams","name":"_callParams","type":"tuple"}],"name":"sendFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"_configType","type":"uint256"},{"internalType":"bytes","name":"_config","type":"bytes"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint16","name":"_packetType","type":"uint16"},{"internalType":"uint256","name":"_minGas","type":"uint256"}],"name":"setMinDstGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint256","name":"_size","type":"uint256"}],"name":"setPayloadSizeLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_precrime","type":"address"}],"name":"setPrecrime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setReceiveVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setSendVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"internalType":"bytes","name":"_path","type":"bytes"}],"name":"setTrustedRemote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"internalType":"bytes","name":"_remoteAddress","type":"bytes"}],"name":"setTrustedRemoteAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sharedDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"trustedRemoteLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"}]

60e06040523480156200001157600080fd5b50604051620047e5380380620047e5833981016040819052620000349162000247565b8383838383838383818180806200004b336200012d565b6001600160a01b0316608052505060ff1660a05250600a90506200007083826200037a565b50600b6200007f82826200037a565b5050506000620000946200017d60201b60201c565b90508060ff168360ff161115620001015760405162461bcd60e51b815260206004820152602760248201527f4f46543a20736861726564446563696d616c73206d757374206265203c3d20646044820152666563696d616c7360c81b606482015260840160405180910390fd5b6200010d83826200045c565b6200011a90600a6200057b565b60c0525062000593975050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b601290565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001aa57600080fd5b81516001600160401b0380821115620001c757620001c762000182565b604051601f8301601f19908116603f01168101908282118183101715620001f257620001f262000182565b816040528381526020925086838588010111156200020f57600080fd5b600091505b8382101562000233578582018301518183018401529082019062000214565b600093810190920192909252949350505050565b600080600080608085870312156200025e57600080fd5b84516001600160401b03808211156200027657600080fd5b620002848883890162000198565b955060208701519150808211156200029b57600080fd5b50620002aa8782880162000198565b935050604085015160ff81168114620002c257600080fd5b60608601519092506001600160a01b0381168114620002e057600080fd5b939692955090935050565b600181811c908216806200030057607f821691505b6020821081036200032157634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200037557600081815260208120601f850160051c81016020861015620003505750805b601f850160051c820191505b8181101562000371578281556001016200035c565b5050505b505050565b81516001600160401b0381111562000396576200039662000182565b620003ae81620003a78454620002eb565b8462000327565b602080601f831160018114620003e65760008415620003cd5750858301515b600019600386901b1c1916600185901b17855562000371565b600085815260208120601f198616915b828110156200041757888601518255948401946001909101908401620003f6565b5085821015620004365787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b60ff828116828216039081111562000478576200047862000446565b92915050565b600181815b80851115620004bf578160001904821115620004a357620004a362000446565b80851615620004b157918102915b93841c939080029062000483565b509250929050565b600082620004d85750600162000478565b81620004e75750600062000478565b81600181146200050057600281146200050b576200052b565b600191505062000478565b60ff8411156200051f576200051f62000446565b50506001821b62000478565b5060208310610133831016604e8410600b841016171562000550575081810a62000478565b6200055c83836200047e565b806000190482111562000573576200057362000446565b029392505050565b60006200058c60ff841683620004c7565b9392505050565b60805160a05160c0516141d5620006106000396000818161261d01528181612a720152612d4e0152600061060a0152600081816107e40152818161095a01528181610c7201528181610d3201528181610eef0152818161154b01528181611a8401528181611f88015281816124090152612c0501526141d56000f3fe6080604052600436106102ad5760003560e01c8063857749b011610175578063b353aaa7116100dc578063df2a5b3b11610095578063eb8d72b71161006f578063eb8d72b7146108e4578063f2fde38b14610904578063f5ecbdbc14610924578063fc0c546a1461094457600080fd5b8063df2a5b3b1461088f578063e6a20ae6146108af578063eaffd49a146108c457600080fd5b8063b353aaa7146107d2578063baf3292d14610806578063c446183414610826578063cbed8b9c1461083c578063d1deba1f1461085c578063dd62ed3e1461086f57600080fd5b80639bdb98121161012e5780639bdb9812146106e05780639f38369a14610732578063a457c2d714610752578063a4c51df514610772578063a6c3d16514610792578063a9059cbb146107b257600080fd5b8063857749b0146105f85780638cfd8f5c1461062c5780638da5cb5b146106645780639358928b14610696578063950c8a74146106ab57806395d89b41146106cb57600080fd5b80633d8b38f61161021957806366ad5c8a116101d257806366ad5c8a14610547578063695ef6bf1461056757806370a082311461057a578063715018a6146105b05780637533d788146105c557806376203b48146105e557600080fd5b80633d8b38f6146104615780633f1f4fa41461048157806342d65a8d146104ae57806344770515146104ce5780634c42899a146104e35780635b8c41e6146104f857600080fd5b806310ddb1371161026b57806310ddb1371461038b57806318160ddd146103ab57806323b872dd146103ca578063313ce567146103ea578063365260b41461040c578063395093511461044157600080fd5b80621d3567146102b257806301ffc9a7146102d457806306fdde031461030957806307e0db171461032b578063095ea7b31461034b5780630df374831461036b575b600080fd5b3480156102be57600080fd5b506102d26102cd36600461329e565b610957565b005b3480156102e057600080fd5b506102f46102ef366004613331565b610b88565b60405190151581526020015b60405180910390f35b34801561031557600080fd5b5061031e610bbf565b60405161030091906133ab565b34801561033757600080fd5b506102d26103463660046133be565b610c51565b34801561035757600080fd5b506102f46103663660046133ee565b610cda565b34801561037757600080fd5b506102d261038636600461341a565b610cf2565b34801561039757600080fd5b506102d26103a63660046133be565b610d11565b3480156103b757600080fd5b506009545b604051908152602001610300565b3480156103d657600080fd5b506102f46103e5366004613436565b610d69565b3480156103f657600080fd5b5060125b60405160ff9091168152602001610300565b34801561041857600080fd5b5061042c610427366004613487565b610d8d565b60408051928352602083019190915201610300565b34801561044d57600080fd5b506102f461045c3660046133ee565b610de2565b34801561046d57600080fd5b506102f461047c3660046134ec565b610e04565b34801561048d57600080fd5b506103bc61049c3660046133be565b60036020526000908152604090205481565b3480156104ba57600080fd5b506102d26104c93660046134ec565b610ed0565b3480156104da57600080fd5b506103bc600081565b3480156104ef57600080fd5b506103fa600081565b34801561050457600080fd5b506103bc6105133660046135ab565b6005602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205481565b34801561055357600080fd5b506102d261056236600461329e565b610f56565b6102d2610575366004613663565b611032565b34801561058657600080fd5b506103bc6105953660046136d6565b6001600160a01b031660009081526007602052604090205490565b3480156105bc57600080fd5b506102d261109d565b3480156105d157600080fd5b5061031e6105e03660046133be565b6110b1565b6102d26105f33660046136f3565b61114b565b34801561060457600080fd5b506103fa7f000000000000000000000000000000000000000000000000000000000000000081565b34801561063857600080fd5b506103bc6106473660046137a5565b600260209081526000928352604080842090915290825290205481565b34801561067057600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610300565b3480156106a257600080fd5b506103bc6111fa565b3480156106b757600080fd5b5060045461067e906001600160a01b031681565b3480156106d757600080fd5b5061031e61120a565b3480156106ec57600080fd5b506102f46106fb3660046135ab565b6006602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205460ff1681565b34801561073e57600080fd5b5061031e61074d3660046133be565b611219565b34801561075e57600080fd5b506102f461076d3660046133ee565b61132f565b34801561077e57600080fd5b5061042c61078d3660046137d8565b6113aa565b34801561079e57600080fd5b506102d26107ad3660046134ec565b611439565b3480156107be57600080fd5b506102f46107cd3660046133ee565b6114c2565b3480156107de57600080fd5b5061067e7f000000000000000000000000000000000000000000000000000000000000000081565b34801561081257600080fd5b506102d26108213660046136d6565b6114d0565b34801561083257600080fd5b506103bc61271081565b34801561084857600080fd5b506102d2610857366004613891565b61152c565b6102d261086a36600461329e565b6115b6565b34801561087b57600080fd5b506103bc61088a3660046138ff565b6117cc565b34801561089b57600080fd5b506102d26108aa366004613938565b6117f7565b3480156108bb57600080fd5b506103fa600181565b3480156108d057600080fd5b506102d26108df366004613974565b611861565b3480156108f057600080fd5b506102d26108ff3660046134ec565b611980565b34801561091057600080fd5b506102d261091f3660046136d6565b6119da565b34801561093057600080fd5b5061031e61093f366004613a3c565b611a53565b34801561095057600080fd5b503061067e565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146109d45760405162461bcd60e51b815260206004820152601e60248201527f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c6572000060448201526064015b60405180910390fd5b61ffff8616600090815260016020526040812080546109f290613a89565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1e90613a89565b8015610a6b5780601f10610a4057610100808354040283529160200191610a6b565b820191906000526020600020905b815481529060010190602001808311610a4e57829003601f168201915b50505050509050805186869050148015610a86575060008151115b8015610aae575080516020820120604051610aa49088908890613abd565b6040518091039020145b610b095760405162461bcd60e51b815260206004820152602660248201527f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f6044820152651b9d1c9858dd60d21b60648201526084016109cb565b610b7f8787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a018190048102820181019092528881528a935091508890889081908401838280828437600092019190915250611b0492505050565b50505050505050565b60006001600160e01b03198216631f7ecdf760e01b1480610bb957506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600a8054610bce90613a89565b80601f0160208091040260200160405190810160405280929190818152602001828054610bfa90613a89565b8015610c475780601f10610c1c57610100808354040283529160200191610c47565b820191906000526020600020905b815481529060010190602001808311610c2a57829003601f168201915b5050505050905090565b610c59611b7d565b6040516307e0db1760e01b815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906307e0db17906024015b600060405180830381600087803b158015610cbf57600080fd5b505af1158015610cd3573d6000803e3d6000fd5b5050505050565b600033610ce8818585611bd7565b5060019392505050565b610cfa611b7d565b61ffff909116600090815260036020526040902055565b610d19611b7d565b6040516310ddb13760e01b815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906310ddb13790602401610ca5565b600033610d77858285611cfb565b610d82858585611d75565b506001949350505050565b600080610dd38888888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611f2092505050565b91509150965096945050505050565b600033610ce8818585610df583836117cc565b610dff9190613ae3565b611bd7565b61ffff831660009081526001602052604081208054829190610e2590613a89565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5190613a89565b8015610e9e5780601f10610e7357610100808354040283529160200191610e9e565b820191906000526020600020905b815481529060010190602001808311610e8157829003601f168201915b505050505090508383604051610eb5929190613abd565b60405180910390208180519060200120149150509392505050565b610ed8611b7d565b6040516342d65a8d60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906342d65a8d90610f2890869086908690600401613b1f565b600060405180830381600087803b158015610f4257600080fd5b505af1158015610b7f573d6000803e3d6000fd5b333014610fb45760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d7573742062656044820152650204c7a4170760d41b60648201526084016109cb565b61102a8686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f89018190048102820181019092528781528993509150879087908190840183828082843760009201919091525061201492505050565b505050505050565b61102a8585858561104660208701876136d6565b61105660408801602089016136d6565b6110636040890189613b3d565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061209b92505050565b6110a5611b7d565b6110af6000612183565b565b600160205260009081526040902080546110ca90613a89565b80601f01602080910402602001604051908101604052809291908181526020018280546110f690613a89565b80156111435780601f1061111857610100808354040283529160200191611143565b820191906000526020600020905b81548152906001019060200180831161112657829003601f168201915b505050505081565b6111ef8888888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a925061119891505060208901896136d6565b6111a860408a0160208b016136d6565b6111b560408b018b613b3d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506121d392505050565b505050505050505050565b600061120560095490565b905090565b6060600b8054610bce90613a89565b61ffff811660009081526001602052604081208054606092919061123c90613a89565b80601f016020809104026020016040519081016040528092919081815260200182805461126890613a89565b80156112b55780601f1061128a576101008083540402835291602001916112b5565b820191906000526020600020905b81548152906001019060200180831161129857829003601f168201915b50505050509050805160000361130d5760405162461bcd60e51b815260206004820152601d60248201527f4c7a4170703a206e6f20747275737465642070617468207265636f726400000060448201526064016109cb565b6113286000601483516113209190613b83565b8391906122cf565b9392505050565b6000338161133d82866117cc565b90508381101561139d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016109cb565b610d828286868403611bd7565b6000806114278b8b8b8b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8d018190048102820181019092528b81528e93508d9250908c908c90819084018382808284376000920191909152506123dc92505050565b91509150995099975050505050505050565b611441611b7d565b81813060405160200161145693929190613b96565b60408051601f1981840301815291815261ffff85166000908152600160205220906114819082613c02565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce8383836040516114b593929190613b1f565b60405180910390a1505050565b600033610ce8818585611d75565b6114d8611b7d565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b9060200160405180910390a150565b611534611b7d565b6040516332fb62e760e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063cbed8b9c906115889088908890889088908890600401613cc1565b600060405180830381600087803b1580156115a257600080fd5b505af11580156111ef573d6000803e3d6000fd5b61ffff861660009081526005602052604080822090516115d99088908890613abd565b90815260408051602092819003830190206001600160401b038716600090815292529020549050806116595760405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201526261676560e81b60648201526084016109cb565b80838360405161166a929190613abd565b6040518091039020146116c95760405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f616044820152601960fa1b60648201526084016109cb565b61ffff871660009081526005602052604080822090516116ec9089908990613abd565b90815260408051602092819003830181206001600160401b038916600090815290845282902093909355601f88018290048202830182019052868252611784918991899089908190840183828082843760009201919091525050604080516020601f8a018190048102820181019092528881528a93509150889088908190840183828082843760009201919091525061201492505050565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e587878787856040516117bb959493929190613cfa565b60405180910390a150505050505050565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b6117ff611b7d565b61ffff83811660008181526002602090815260408083209487168084529482529182902085905581519283528201929092529081018290527f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac0906060016114b5565b3330146118b05760405162461bcd60e51b815260206004820152601f60248201527f4f4654436f72653a2063616c6c6572206d757374206265204f4654436f72650060448201526064016109cb565b6118bb308686612497565b9350846001600160a01b03168a61ffff167fbf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bf866040516118fd91815260200190565b60405180910390a3604051633fe79aed60e11b81526001600160a01b03861690637fcf35da908390611941908e908e908e908e908e908d908d908d90600401613d35565b600060405180830381600088803b15801561195b57600080fd5b5087f115801561196f573d6000803e3d6000fd5b505050505050505050505050505050565b611988611b7d565b61ffff831660009081526001602052604090206119a6828483613d90565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab8383836040516114b593929190613b1f565b6119e2611b7d565b6001600160a01b038116611a475760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109cb565b611a5081612183565b50565b604051633d7b2f6f60e21b815261ffff808616600483015284166024820152306044820152606481018290526060907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f5ecbdbc90608401600060405180830381865afa158015611ad3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611afb9190810190613e4f565b95945050505050565b600080611b675a60966366ad5c8a60e01b89898989604051602401611b2c9493929190613ebc565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152309291906124e9565b915091508161102a5761102a8686868685612573565b6000546001600160a01b031633146110af5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109cb565b6001600160a01b038316611c395760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016109cb565b6001600160a01b038216611c9a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016109cb565b6001600160a01b0383811660008181526008602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000611d0784846117cc565b90506000198114611d6f5781811015611d625760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016109cb565b611d6f8484848403611bd7565b50505050565b6001600160a01b038316611dd95760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016109cb565b6001600160a01b038216611e3b5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016109cb565b6001600160a01b03831660009081526007602052604090205481811015611eb35760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016109cb565b6001600160a01b0380851660008181526007602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611f139086815260200190565b60405180910390a3611d6f565b6000806000611f6e87611f3288612615565b6040805160006020820152602181019390935260c09190911b6001600160c01b0319166041830152805160298184030181526049909201905290565b60405163040a7bb160e41b81529091506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906340a7bb1090611fc5908b90309086908b908b90600401613efa565b6040805180830381865afa158015611fe1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120059190613f4e565b92509250509550959350505050565b6000612020828261269b565b905060ff811661203b57612036858585856126f7565b610cd3565b60001960ff8216016120535761203685858585612787565b60405162461bcd60e51b815260206004820152601c60248201527f4f4654436f72653a20756e6b6e6f776e207061636b657420747970650000000060448201526064016109cb565b60006120a987828481612995565b6120b285612a6a565b5090506120c188888884612aaa565b90506000811161210f5760405162461bcd60e51b815260206004820152601960248201527813d19510dbdc994e88185b5bdd5b9d081d1bdbc81cdb585b1b603a1b60448201526064016109cb565b600061211e87611f3284612615565b905061212e888287878734612adc565b86896001600160a01b03168961ffff167fd81fc9b8523134ed613870ed029d6170cbb73aa6a6bc311b9a642689fb9df59a8560405161216f91815260200190565b60405180910390a450979650505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006121eb896001846001600160401b038916612995565b6121f487612a6a565b5090506122038a8a8a84612aaa565b9050600081116122515760405162461bcd60e51b815260206004820152601960248201527813d19510dbdc994e88185b5bdd5b9d081d1bdbc81cdb585b1b603a1b60448201526064016109cb565b6000612268338a61226185612615565b8a8a612c81565b90506122788a8287878734612adc565b888b6001600160a01b03168b61ffff167fd81fc9b8523134ed613870ed029d6170cbb73aa6a6bc311b9a642689fb9df59a856040516122b991815260200190565b60405180910390a4509998505050505050505050565b6060816122dd81601f613ae3565b101561231c5760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b60448201526064016109cb565b6123268284613ae3565b8451101561236a5760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b60448201526064016109cb565b60608215801561238957604051915060008252602082016040526123d3565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156123c25780518352602092830192016123aa565b5050858452601f01601f1916604052505b50949350505050565b60008060006123ef338a6122618b612615565b60405163040a7bb160e41b81529091506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906340a7bb1090612446908d90309086908b908b90600401613efa565b6040805180830381865afa158015612462573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124869190613f4e565b925092505097509795505050505050565b600033306001600160a01b038616148015906124c55750806001600160a01b0316856001600160a01b031614155b156124d5576124d5858285611cfb565b6124e0858585611d75565b50909392505050565b6000606060008060008661ffff166001600160401b0381111561250e5761250e61353e565b6040519080825280601f01601f191660200182016040528015612538576020820181803683370190505b50905060008087516020890160008d8df191503d92508683111561255a578692505b828152826000602083013e909890975095505050505050565b8180519060200120600560008761ffff1661ffff168152602001908152602001600020856040516125a49190613f72565b9081526040805191829003602090810183206001600160401b0388166000908152915220919091557fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c906126019087908790879087908790613f8e565b60405180910390a15050505050565b505050565b6000806126427f000000000000000000000000000000000000000000000000000000000000000084613ff6565b90506001600160401b03811115610bb95760405162461bcd60e51b815260206004820152601a60248201527f4f4654436f72653a20616d6f756e745344206f766572666c6f7700000000000060448201526064016109cb565b60006126a8826001613ae3565b835110156126ee5760405162461bcd60e51b8152602060048201526013602482015272746f55696e74385f6f75744f66426f756e647360681b60448201526064016109cb565b50016001015190565b60008061270383612cc2565b90925090506001600160a01b03821661271c5761dead91505b600061272782612d47565b9050612734878483612d7c565b9050826001600160a01b03168761ffff167fbf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bf8360405161277691815260200190565b60405180910390a350505050505050565b600080600080600061279886612d8f565b945094509450945094506000600660008b61ffff1661ffff168152602001908152602001600020896040516127cd9190613f72565b90815260408051602092819003830190206001600160401b038b166000908152925281205460ff16915061280085612d47565b90508161286e576128128b3083612d7c565b61ffff8c1660009081526006602052604090819020905191925060019161283a908d90613f72565b90815260408051602092819003830190206001600160401b038d16600090815292529020805460ff19169115159190911790555b6001600160a01b0386163b6128c5576040516001600160a01b03871681527f9aedf5fdba8716db3b6705ca00150643309995d4f818a249ed6dde6677e7792d9060200160405180910390a150505050505050611d6f565b8a8a8a8a8a8a868a60008a6128e3578b6001600160401b03166128e5565b5a5b90506000806129175a609663eaffd49a60e01b8e8e8e8d8d8d8d8d604051602401611b2c98979695949392919061400a565b915091508115612970578751602089012060405161ffff8d16907fb8890edbfc1c74692f527444645f95489c3703cc2df42e4a366f5d06fa6cd88490612962908e908e90869061407e565b60405180910390a25061297d565b61297d8b8b8b8b85612573565b50505050505050505050505050505050505050505050565b60006129a083612e46565b61ffff80871660009081526002602090815260408083209389168352929052205490915080612a115760405162461bcd60e51b815260206004820152601a60248201527f4c7a4170703a206d696e4761734c696d6974206e6f742073657400000000000060448201526064016109cb565b612a1b8382613ae3565b82101561102a5760405162461bcd60e51b815260206004820152601b60248201527f4c7a4170703a20676173206c696d697420697320746f6f206c6f77000000000060448201526064016109cb565b600080612a977f0000000000000000000000000000000000000000000000000000000000000000846140ac565b9050612aa38184613b83565b9150915091565b6000336001600160a01b0386168114612ac857612ac8868285611cfb565b612ad28684612ea2565b5090949350505050565b61ffff861660009081526001602052604081208054612afa90613a89565b80601f0160208091040260200160405190810160405280929190818152602001828054612b2690613a89565b8015612b735780601f10612b4857610100808354040283529160200191612b73565b820191906000526020600020905b815481529060010190602001808311612b5657829003601f168201915b505050505090508051600003612be45760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201526f61207472757374656420736f7572636560801b60648201526084016109cb565b612bef878751612fd6565b60405162c5803160e81b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c5803100908490612c46908b9086908c908c908c908c906004016140c0565b6000604051808303818588803b158015612c5f57600080fd5b505af1158015612c73573d6000803e3d6000fd5b505050505050505050505050565b6060600185856001600160a01b0389168587604051602001612ca896959493929190614127565b604051602081830303815290604052905095945050505050565b60008080612cd0848261269b565b60ff16148015612ce1575082516029145b612d285760405162461bcd60e51b815260206004820152601860248201527713d19510dbdc994e881a5b9d985b1a59081c185e5b1bd85960421b60448201526064016109cb565b612d3383600d613047565b9150612d408360216130ac565b9050915091565b6000610bb97f00000000000000000000000000000000000000000000000000000000000000006001600160401b038416614188565b6000612d888383613109565b5092915050565b600080806060816001612da2878361269b565b60ff1614612ded5760405162461bcd60e51b815260206004820152601860248201527713d19510dbdc994e881a5b9d985b1a59081c185e5b1bd85960421b60448201526064016109cb565b612df886600d613047565b9350612e058660216130ac565b9250612e128660296131ca565b9450612e1f8660496130ac565b9050612e3b6051808851612e339190613b83565b8891906122cf565b915091939590929450565b6000602282511015612e9a5760405162461bcd60e51b815260206004820152601c60248201527f4c7a4170703a20696e76616c69642061646170746572506172616d730000000060448201526064016109cb565b506022015190565b6001600160a01b038216612f025760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016109cb565b6001600160a01b03821660009081526007602052604090205481811015612f765760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016109cb565b6001600160a01b03831660008181526007602090815260408083208686039055600980548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b61ffff821660009081526003602052604081205490819003612ff757506127105b808211156126105760405162461bcd60e51b815260206004820181905260248201527f4c7a4170703a207061796c6f61642073697a6520697320746f6f206c6172676560448201526064016109cb565b6000613054826014613ae3565b8351101561309c5760405162461bcd60e51b8152602060048201526015602482015274746f416464726573735f6f75744f66426f756e647360581b60448201526064016109cb565b500160200151600160601b900490565b60006130b9826008613ae3565b835110156131005760405162461bcd60e51b8152602060048201526014602482015273746f55696e7436345f6f75744f66426f756e647360601b60448201526064016109cb565b50016008015190565b6001600160a01b03821661315f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016109cb565b80600960008282546131719190613ae3565b90915550506001600160a01b0382166000818152600760209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b60006131d7826020613ae3565b8351101561321f5760405162461bcd60e51b8152602060048201526015602482015274746f427974657333325f6f75744f66426f756e647360581b60448201526064016109cb565b50016020015190565b803561ffff8116811461323a57600080fd5b919050565b60008083601f84011261325157600080fd5b5081356001600160401b0381111561326857600080fd5b60208301915083602082850101111561328057600080fd5b9250929050565b80356001600160401b038116811461323a57600080fd5b600080600080600080608087890312156132b757600080fd5b6132c087613228565b955060208701356001600160401b03808211156132dc57600080fd5b6132e88a838b0161323f565b90975095508591506132fc60408a01613287565b9450606089013591508082111561331257600080fd5b5061331f89828a0161323f565b979a9699509497509295939492505050565b60006020828403121561334357600080fd5b81356001600160e01b03198116811461132857600080fd5b60005b8381101561337657818101518382015260200161335e565b50506000910152565b6000815180845261339781602086016020860161335b565b601f01601f19169290920160200192915050565b602081526000611328602083018461337f565b6000602082840312156133d057600080fd5b61132882613228565b6001600160a01b0381168114611a5057600080fd5b6000806040838503121561340157600080fd5b823561340c816133d9565b946020939093013593505050565b6000806040838503121561342d57600080fd5b61340c83613228565b60008060006060848603121561344b57600080fd5b8335613456816133d9565b92506020840135613466816133d9565b929592945050506040919091013590565b8035801515811461323a57600080fd5b60008060008060008060a087890312156134a057600080fd5b6134a987613228565b955060208701359450604087013593506134c560608801613477565b925060808701356001600160401b038111156134e057600080fd5b61331f89828a0161323f565b60008060006040848603121561350157600080fd5b61350a84613228565b925060208401356001600160401b0381111561352557600080fd5b6135318682870161323f565b9497909650939450505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561357c5761357c61353e565b604052919050565b60006001600160401b0382111561359d5761359d61353e565b50601f01601f191660200190565b6000806000606084860312156135c057600080fd5b6135c984613228565b925060208401356001600160401b038111156135e457600080fd5b8401601f810186136135f557600080fd5b803561360861360382613584565b613554565b81815287602083850101111561361d57600080fd5b8160208401602083013760006020838301015280945050505061364260408501613287565b90509250925092565b60006060828403121561365d57600080fd5b50919050565b600080600080600060a0868803121561367b57600080fd5b8535613686816133d9565b945061369460208701613228565b9350604086013592506060860135915060808601356001600160401b038111156136bd57600080fd5b6136c98882890161364b565b9150509295509295909350565b6000602082840312156136e857600080fd5b8135611328816133d9565b60008060008060008060008060e0898b03121561370f57600080fd5b883561371a816133d9565b975061372860208a01613228565b9650604089013595506060890135945060808901356001600160401b038082111561375257600080fd5b61375e8c838d0161323f565b909650945084915061377260a08c01613287565b935060c08b013591508082111561378857600080fd5b506137958b828c0161364b565b9150509295985092959890939650565b600080604083850312156137b857600080fd5b6137c183613228565b91506137cf60208401613228565b90509250929050565b600080600080600080600080600060e08a8c0312156137f657600080fd5b6137ff8a613228565b985060208a0135975060408a0135965060608a01356001600160401b038082111561382957600080fd5b6138358d838e0161323f565b909850965086915061384960808d01613287565b955061385760a08d01613477565b945060c08c013591508082111561386d57600080fd5b5061387a8c828d0161323f565b915080935050809150509295985092959850929598565b6000806000806000608086880312156138a957600080fd5b6138b286613228565b94506138c060208701613228565b93506040860135925060608601356001600160401b038111156138e257600080fd5b6138ee8882890161323f565b969995985093965092949392505050565b6000806040838503121561391257600080fd5b823561391d816133d9565b9150602083013561392d816133d9565b809150509250929050565b60008060006060848603121561394d57600080fd5b61395684613228565b925061396460208501613228565b9150604084013590509250925092565b6000806000806000806000806000806101008b8d03121561399457600080fd5b61399d8b613228565b995060208b01356001600160401b03808211156139b957600080fd5b6139c58e838f0161323f565b909b5099508991506139d960408e01613287565b985060608d0135975060808d013591506139f2826133d9565b90955060a08c0135945060c08c01359080821115613a0f57600080fd5b50613a1c8d828e0161323f565b9150809450508092505060e08b013590509295989b9194979a5092959850565b60008060008060808587031215613a5257600080fd5b613a5b85613228565b9350613a6960208601613228565b92506040850135613a79816133d9565b9396929550929360600135925050565b600181811c90821680613a9d57607f821691505b60208210810361365d57634e487b7160e01b600052602260045260246000fd5b8183823760009101908152919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610bb957610bb9613acd565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b61ffff84168152604060208201526000611afb604083018486613af6565b6000808335601e19843603018112613b5457600080fd5b8301803591506001600160401b03821115613b6e57600080fd5b60200191503681900382131561328057600080fd5b81810381811115610bb957610bb9613acd565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b601f82111561261057600081815260208120601f850160051c81016020861015613be35750805b601f850160051c820191505b8181101561102a57828155600101613bef565b81516001600160401b03811115613c1b57613c1b61353e565b613c2f81613c298454613a89565b84613bbc565b602080601f831160018114613c645760008415613c4c5750858301515b600019600386901b1c1916600185901b17855561102a565b600085815260208120601f198616915b82811015613c9357888601518255948401946001909101908401613c74565b5085821015613cb15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600061ffff808816835280871660208401525084604083015260806060830152613cef608083018486613af6565b979650505050505050565b61ffff86168152608060208201526000613d18608083018688613af6565b6001600160401b0394909416604083015250606001529392505050565b61ffff8916815260c060208201526000613d5360c08301898b613af6565b6001600160401b038816604084015286606084015285608084015282810360a0840152613d81818587613af6565b9b9a5050505050505050505050565b6001600160401b03831115613da757613da761353e565b613dbb83613db58354613a89565b83613bbc565b6000601f841160018114613def5760008515613dd75750838201355b600019600387901b1c1916600186901b178355610cd3565b600083815260209020601f19861690835b82811015613e205786850135825560209485019460019092019101613e00565b5086821015613e3d5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b600060208284031215613e6157600080fd5b81516001600160401b03811115613e7757600080fd5b8201601f81018413613e8857600080fd5b8051613e9661360382613584565b818152856020838501011115613eab57600080fd5b611afb82602083016020860161335b565b61ffff85168152608060208201526000613ed9608083018661337f565b6001600160401b03851660408401528281036060840152613cef818561337f565b61ffff861681526001600160a01b038516602082015260a060408201819052600090613f289083018661337f565b84151560608401528281036080840152613f42818561337f565b98975050505050505050565b60008060408385031215613f6157600080fd5b505080516020909101519092909150565b60008251613f8481846020870161335b565b9190910192915050565b61ffff8616815260a060208201526000613fab60a083018761337f565b6001600160401b03861660408401528281036060840152613fcc818661337f565b90508281036080840152613f42818561337f565b634e487b7160e01b600052601260045260246000fd5b60008261400557614005613fe0565b500490565b600061010061ffff8b1683528060208401526140288184018b61337f565b6001600160401b038a166040850152606084018990526001600160a01b038816608085015260a0840187905283810360c08501529050614068818661337f565b9150508260e08301529998505050505050505050565b606081526000614091606083018661337f565b6001600160401b039490941660208301525060400152919050565b6000826140bb576140bb613fe0565b500690565b61ffff8716815260c0602082015260006140dd60c083018861337f565b82810360408401526140ef818861337f565b6001600160a01b0387811660608601528616608085015283810360a0850152905061411a818561337f565b9998505050505050505050565b60ff60f81b8760f81b16815285600182015260006001600160401b0360c01b808760c01b166021840152856029840152808560c01b16604984015250825161417681605185016020870161335b565b91909101605101979650505050505050565b8082028115828204841417610bb957610bb9613acd56fea2646970667358221220f3bed692b28b2aecba06d87914e6ce298241a1f2c207daf9b18731c69ebb290c64736f6c63430008130033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000600000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6750000000000000000000000000000000000000000000000000000000000000003434144000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034341440000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102ad5760003560e01c8063857749b011610175578063b353aaa7116100dc578063df2a5b3b11610095578063eb8d72b71161006f578063eb8d72b7146108e4578063f2fde38b14610904578063f5ecbdbc14610924578063fc0c546a1461094457600080fd5b8063df2a5b3b1461088f578063e6a20ae6146108af578063eaffd49a146108c457600080fd5b8063b353aaa7146107d2578063baf3292d14610806578063c446183414610826578063cbed8b9c1461083c578063d1deba1f1461085c578063dd62ed3e1461086f57600080fd5b80639bdb98121161012e5780639bdb9812146106e05780639f38369a14610732578063a457c2d714610752578063a4c51df514610772578063a6c3d16514610792578063a9059cbb146107b257600080fd5b8063857749b0146105f85780638cfd8f5c1461062c5780638da5cb5b146106645780639358928b14610696578063950c8a74146106ab57806395d89b41146106cb57600080fd5b80633d8b38f61161021957806366ad5c8a116101d257806366ad5c8a14610547578063695ef6bf1461056757806370a082311461057a578063715018a6146105b05780637533d788146105c557806376203b48146105e557600080fd5b80633d8b38f6146104615780633f1f4fa41461048157806342d65a8d146104ae57806344770515146104ce5780634c42899a146104e35780635b8c41e6146104f857600080fd5b806310ddb1371161026b57806310ddb1371461038b57806318160ddd146103ab57806323b872dd146103ca578063313ce567146103ea578063365260b41461040c578063395093511461044157600080fd5b80621d3567146102b257806301ffc9a7146102d457806306fdde031461030957806307e0db171461032b578063095ea7b31461034b5780630df374831461036b575b600080fd5b3480156102be57600080fd5b506102d26102cd36600461329e565b610957565b005b3480156102e057600080fd5b506102f46102ef366004613331565b610b88565b60405190151581526020015b60405180910390f35b34801561031557600080fd5b5061031e610bbf565b60405161030091906133ab565b34801561033757600080fd5b506102d26103463660046133be565b610c51565b34801561035757600080fd5b506102f46103663660046133ee565b610cda565b34801561037757600080fd5b506102d261038636600461341a565b610cf2565b34801561039757600080fd5b506102d26103a63660046133be565b610d11565b3480156103b757600080fd5b506009545b604051908152602001610300565b3480156103d657600080fd5b506102f46103e5366004613436565b610d69565b3480156103f657600080fd5b5060125b60405160ff9091168152602001610300565b34801561041857600080fd5b5061042c610427366004613487565b610d8d565b60408051928352602083019190915201610300565b34801561044d57600080fd5b506102f461045c3660046133ee565b610de2565b34801561046d57600080fd5b506102f461047c3660046134ec565b610e04565b34801561048d57600080fd5b506103bc61049c3660046133be565b60036020526000908152604090205481565b3480156104ba57600080fd5b506102d26104c93660046134ec565b610ed0565b3480156104da57600080fd5b506103bc600081565b3480156104ef57600080fd5b506103fa600081565b34801561050457600080fd5b506103bc6105133660046135ab565b6005602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205481565b34801561055357600080fd5b506102d261056236600461329e565b610f56565b6102d2610575366004613663565b611032565b34801561058657600080fd5b506103bc6105953660046136d6565b6001600160a01b031660009081526007602052604090205490565b3480156105bc57600080fd5b506102d261109d565b3480156105d157600080fd5b5061031e6105e03660046133be565b6110b1565b6102d26105f33660046136f3565b61114b565b34801561060457600080fd5b506103fa7f000000000000000000000000000000000000000000000000000000000000000681565b34801561063857600080fd5b506103bc6106473660046137a5565b600260209081526000928352604080842090915290825290205481565b34801561067057600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610300565b3480156106a257600080fd5b506103bc6111fa565b3480156106b757600080fd5b5060045461067e906001600160a01b031681565b3480156106d757600080fd5b5061031e61120a565b3480156106ec57600080fd5b506102f46106fb3660046135ab565b6006602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205460ff1681565b34801561073e57600080fd5b5061031e61074d3660046133be565b611219565b34801561075e57600080fd5b506102f461076d3660046133ee565b61132f565b34801561077e57600080fd5b5061042c61078d3660046137d8565b6113aa565b34801561079e57600080fd5b506102d26107ad3660046134ec565b611439565b3480156107be57600080fd5b506102f46107cd3660046133ee565b6114c2565b3480156107de57600080fd5b5061067e7f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67581565b34801561081257600080fd5b506102d26108213660046136d6565b6114d0565b34801561083257600080fd5b506103bc61271081565b34801561084857600080fd5b506102d2610857366004613891565b61152c565b6102d261086a36600461329e565b6115b6565b34801561087b57600080fd5b506103bc61088a3660046138ff565b6117cc565b34801561089b57600080fd5b506102d26108aa366004613938565b6117f7565b3480156108bb57600080fd5b506103fa600181565b3480156108d057600080fd5b506102d26108df366004613974565b611861565b3480156108f057600080fd5b506102d26108ff3660046134ec565b611980565b34801561091057600080fd5b506102d261091f3660046136d6565b6119da565b34801561093057600080fd5b5061031e61093f366004613a3c565b611a53565b34801561095057600080fd5b503061067e565b337f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6756001600160a01b0316146109d45760405162461bcd60e51b815260206004820152601e60248201527f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c6572000060448201526064015b60405180910390fd5b61ffff8616600090815260016020526040812080546109f290613a89565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1e90613a89565b8015610a6b5780601f10610a4057610100808354040283529160200191610a6b565b820191906000526020600020905b815481529060010190602001808311610a4e57829003601f168201915b50505050509050805186869050148015610a86575060008151115b8015610aae575080516020820120604051610aa49088908890613abd565b6040518091039020145b610b095760405162461bcd60e51b815260206004820152602660248201527f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f6044820152651b9d1c9858dd60d21b60648201526084016109cb565b610b7f8787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a018190048102820181019092528881528a935091508890889081908401838280828437600092019190915250611b0492505050565b50505050505050565b60006001600160e01b03198216631f7ecdf760e01b1480610bb957506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600a8054610bce90613a89565b80601f0160208091040260200160405190810160405280929190818152602001828054610bfa90613a89565b8015610c475780601f10610c1c57610100808354040283529160200191610c47565b820191906000526020600020905b815481529060010190602001808311610c2a57829003601f168201915b5050505050905090565b610c59611b7d565b6040516307e0db1760e01b815261ffff821660048201527f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6756001600160a01b0316906307e0db17906024015b600060405180830381600087803b158015610cbf57600080fd5b505af1158015610cd3573d6000803e3d6000fd5b5050505050565b600033610ce8818585611bd7565b5060019392505050565b610cfa611b7d565b61ffff909116600090815260036020526040902055565b610d19611b7d565b6040516310ddb13760e01b815261ffff821660048201527f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6756001600160a01b0316906310ddb13790602401610ca5565b600033610d77858285611cfb565b610d82858585611d75565b506001949350505050565b600080610dd38888888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611f2092505050565b91509150965096945050505050565b600033610ce8818585610df583836117cc565b610dff9190613ae3565b611bd7565b61ffff831660009081526001602052604081208054829190610e2590613a89565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5190613a89565b8015610e9e5780601f10610e7357610100808354040283529160200191610e9e565b820191906000526020600020905b815481529060010190602001808311610e8157829003601f168201915b505050505090508383604051610eb5929190613abd565b60405180910390208180519060200120149150509392505050565b610ed8611b7d565b6040516342d65a8d60e01b81526001600160a01b037f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67516906342d65a8d90610f2890869086908690600401613b1f565b600060405180830381600087803b158015610f4257600080fd5b505af1158015610b7f573d6000803e3d6000fd5b333014610fb45760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d7573742062656044820152650204c7a4170760d41b60648201526084016109cb565b61102a8686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f89018190048102820181019092528781528993509150879087908190840183828082843760009201919091525061201492505050565b505050505050565b61102a8585858561104660208701876136d6565b61105660408801602089016136d6565b6110636040890189613b3d565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061209b92505050565b6110a5611b7d565b6110af6000612183565b565b600160205260009081526040902080546110ca90613a89565b80601f01602080910402602001604051908101604052809291908181526020018280546110f690613a89565b80156111435780601f1061111857610100808354040283529160200191611143565b820191906000526020600020905b81548152906001019060200180831161112657829003601f168201915b505050505081565b6111ef8888888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a925061119891505060208901896136d6565b6111a860408a0160208b016136d6565b6111b560408b018b613b3d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506121d392505050565b505050505050505050565b600061120560095490565b905090565b6060600b8054610bce90613a89565b61ffff811660009081526001602052604081208054606092919061123c90613a89565b80601f016020809104026020016040519081016040528092919081815260200182805461126890613a89565b80156112b55780601f1061128a576101008083540402835291602001916112b5565b820191906000526020600020905b81548152906001019060200180831161129857829003601f168201915b50505050509050805160000361130d5760405162461bcd60e51b815260206004820152601d60248201527f4c7a4170703a206e6f20747275737465642070617468207265636f726400000060448201526064016109cb565b6113286000601483516113209190613b83565b8391906122cf565b9392505050565b6000338161133d82866117cc565b90508381101561139d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016109cb565b610d828286868403611bd7565b6000806114278b8b8b8b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8d018190048102820181019092528b81528e93508d9250908c908c90819084018382808284376000920191909152506123dc92505050565b91509150995099975050505050505050565b611441611b7d565b81813060405160200161145693929190613b96565b60408051601f1981840301815291815261ffff85166000908152600160205220906114819082613c02565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce8383836040516114b593929190613b1f565b60405180910390a1505050565b600033610ce8818585611d75565b6114d8611b7d565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b9060200160405180910390a150565b611534611b7d565b6040516332fb62e760e21b81526001600160a01b037f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675169063cbed8b9c906115889088908890889088908890600401613cc1565b600060405180830381600087803b1580156115a257600080fd5b505af11580156111ef573d6000803e3d6000fd5b61ffff861660009081526005602052604080822090516115d99088908890613abd565b90815260408051602092819003830190206001600160401b038716600090815292529020549050806116595760405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201526261676560e81b60648201526084016109cb565b80838360405161166a929190613abd565b6040518091039020146116c95760405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f616044820152601960fa1b60648201526084016109cb565b61ffff871660009081526005602052604080822090516116ec9089908990613abd565b90815260408051602092819003830181206001600160401b038916600090815290845282902093909355601f88018290048202830182019052868252611784918991899089908190840183828082843760009201919091525050604080516020601f8a018190048102820181019092528881528a93509150889088908190840183828082843760009201919091525061201492505050565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e587878787856040516117bb959493929190613cfa565b60405180910390a150505050505050565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b6117ff611b7d565b61ffff83811660008181526002602090815260408083209487168084529482529182902085905581519283528201929092529081018290527f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac0906060016114b5565b3330146118b05760405162461bcd60e51b815260206004820152601f60248201527f4f4654436f72653a2063616c6c6572206d757374206265204f4654436f72650060448201526064016109cb565b6118bb308686612497565b9350846001600160a01b03168a61ffff167fbf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bf866040516118fd91815260200190565b60405180910390a3604051633fe79aed60e11b81526001600160a01b03861690637fcf35da908390611941908e908e908e908e908e908d908d908d90600401613d35565b600060405180830381600088803b15801561195b57600080fd5b5087f115801561196f573d6000803e3d6000fd5b505050505050505050505050505050565b611988611b7d565b61ffff831660009081526001602052604090206119a6828483613d90565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab8383836040516114b593929190613b1f565b6119e2611b7d565b6001600160a01b038116611a475760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109cb565b611a5081612183565b50565b604051633d7b2f6f60e21b815261ffff808616600483015284166024820152306044820152606481018290526060907f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6756001600160a01b03169063f5ecbdbc90608401600060405180830381865afa158015611ad3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611afb9190810190613e4f565b95945050505050565b600080611b675a60966366ad5c8a60e01b89898989604051602401611b2c9493929190613ebc565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152309291906124e9565b915091508161102a5761102a8686868685612573565b6000546001600160a01b031633146110af5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109cb565b6001600160a01b038316611c395760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016109cb565b6001600160a01b038216611c9a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016109cb565b6001600160a01b0383811660008181526008602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000611d0784846117cc565b90506000198114611d6f5781811015611d625760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016109cb565b611d6f8484848403611bd7565b50505050565b6001600160a01b038316611dd95760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016109cb565b6001600160a01b038216611e3b5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016109cb565b6001600160a01b03831660009081526007602052604090205481811015611eb35760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016109cb565b6001600160a01b0380851660008181526007602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611f139086815260200190565b60405180910390a3611d6f565b6000806000611f6e87611f3288612615565b6040805160006020820152602181019390935260c09190911b6001600160c01b0319166041830152805160298184030181526049909201905290565b60405163040a7bb160e41b81529091506001600160a01b037f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67516906340a7bb1090611fc5908b90309086908b908b90600401613efa565b6040805180830381865afa158015611fe1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120059190613f4e565b92509250509550959350505050565b6000612020828261269b565b905060ff811661203b57612036858585856126f7565b610cd3565b60001960ff8216016120535761203685858585612787565b60405162461bcd60e51b815260206004820152601c60248201527f4f4654436f72653a20756e6b6e6f776e207061636b657420747970650000000060448201526064016109cb565b60006120a987828481612995565b6120b285612a6a565b5090506120c188888884612aaa565b90506000811161210f5760405162461bcd60e51b815260206004820152601960248201527813d19510dbdc994e88185b5bdd5b9d081d1bdbc81cdb585b1b603a1b60448201526064016109cb565b600061211e87611f3284612615565b905061212e888287878734612adc565b86896001600160a01b03168961ffff167fd81fc9b8523134ed613870ed029d6170cbb73aa6a6bc311b9a642689fb9df59a8560405161216f91815260200190565b60405180910390a450979650505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006121eb896001846001600160401b038916612995565b6121f487612a6a565b5090506122038a8a8a84612aaa565b9050600081116122515760405162461bcd60e51b815260206004820152601960248201527813d19510dbdc994e88185b5bdd5b9d081d1bdbc81cdb585b1b603a1b60448201526064016109cb565b6000612268338a61226185612615565b8a8a612c81565b90506122788a8287878734612adc565b888b6001600160a01b03168b61ffff167fd81fc9b8523134ed613870ed029d6170cbb73aa6a6bc311b9a642689fb9df59a856040516122b991815260200190565b60405180910390a4509998505050505050505050565b6060816122dd81601f613ae3565b101561231c5760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b60448201526064016109cb565b6123268284613ae3565b8451101561236a5760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b60448201526064016109cb565b60608215801561238957604051915060008252602082016040526123d3565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156123c25780518352602092830192016123aa565b5050858452601f01601f1916604052505b50949350505050565b60008060006123ef338a6122618b612615565b60405163040a7bb160e41b81529091506001600160a01b037f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67516906340a7bb1090612446908d90309086908b908b90600401613efa565b6040805180830381865afa158015612462573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124869190613f4e565b925092505097509795505050505050565b600033306001600160a01b038616148015906124c55750806001600160a01b0316856001600160a01b031614155b156124d5576124d5858285611cfb565b6124e0858585611d75565b50909392505050565b6000606060008060008661ffff166001600160401b0381111561250e5761250e61353e565b6040519080825280601f01601f191660200182016040528015612538576020820181803683370190505b50905060008087516020890160008d8df191503d92508683111561255a578692505b828152826000602083013e909890975095505050505050565b8180519060200120600560008761ffff1661ffff168152602001908152602001600020856040516125a49190613f72565b9081526040805191829003602090810183206001600160401b0388166000908152915220919091557fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c906126019087908790879087908790613f8e565b60405180910390a15050505050565b505050565b6000806126427f000000000000000000000000000000000000000000000000000000e8d4a5100084613ff6565b90506001600160401b03811115610bb95760405162461bcd60e51b815260206004820152601a60248201527f4f4654436f72653a20616d6f756e745344206f766572666c6f7700000000000060448201526064016109cb565b60006126a8826001613ae3565b835110156126ee5760405162461bcd60e51b8152602060048201526013602482015272746f55696e74385f6f75744f66426f756e647360681b60448201526064016109cb565b50016001015190565b60008061270383612cc2565b90925090506001600160a01b03821661271c5761dead91505b600061272782612d47565b9050612734878483612d7c565b9050826001600160a01b03168761ffff167fbf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bf8360405161277691815260200190565b60405180910390a350505050505050565b600080600080600061279886612d8f565b945094509450945094506000600660008b61ffff1661ffff168152602001908152602001600020896040516127cd9190613f72565b90815260408051602092819003830190206001600160401b038b166000908152925281205460ff16915061280085612d47565b90508161286e576128128b3083612d7c565b61ffff8c1660009081526006602052604090819020905191925060019161283a908d90613f72565b90815260408051602092819003830190206001600160401b038d16600090815292529020805460ff19169115159190911790555b6001600160a01b0386163b6128c5576040516001600160a01b03871681527f9aedf5fdba8716db3b6705ca00150643309995d4f818a249ed6dde6677e7792d9060200160405180910390a150505050505050611d6f565b8a8a8a8a8a8a868a60008a6128e3578b6001600160401b03166128e5565b5a5b90506000806129175a609663eaffd49a60e01b8e8e8e8d8d8d8d8d604051602401611b2c98979695949392919061400a565b915091508115612970578751602089012060405161ffff8d16907fb8890edbfc1c74692f527444645f95489c3703cc2df42e4a366f5d06fa6cd88490612962908e908e90869061407e565b60405180910390a25061297d565b61297d8b8b8b8b85612573565b50505050505050505050505050505050505050505050565b60006129a083612e46565b61ffff80871660009081526002602090815260408083209389168352929052205490915080612a115760405162461bcd60e51b815260206004820152601a60248201527f4c7a4170703a206d696e4761734c696d6974206e6f742073657400000000000060448201526064016109cb565b612a1b8382613ae3565b82101561102a5760405162461bcd60e51b815260206004820152601b60248201527f4c7a4170703a20676173206c696d697420697320746f6f206c6f77000000000060448201526064016109cb565b600080612a977f000000000000000000000000000000000000000000000000000000e8d4a51000846140ac565b9050612aa38184613b83565b9150915091565b6000336001600160a01b0386168114612ac857612ac8868285611cfb565b612ad28684612ea2565b5090949350505050565b61ffff861660009081526001602052604081208054612afa90613a89565b80601f0160208091040260200160405190810160405280929190818152602001828054612b2690613a89565b8015612b735780601f10612b4857610100808354040283529160200191612b73565b820191906000526020600020905b815481529060010190602001808311612b5657829003601f168201915b505050505090508051600003612be45760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201526f61207472757374656420736f7572636560801b60648201526084016109cb565b612bef878751612fd6565b60405162c5803160e81b81526001600160a01b037f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675169063c5803100908490612c46908b9086908c908c908c908c906004016140c0565b6000604051808303818588803b158015612c5f57600080fd5b505af1158015612c73573d6000803e3d6000fd5b505050505050505050505050565b6060600185856001600160a01b0389168587604051602001612ca896959493929190614127565b604051602081830303815290604052905095945050505050565b60008080612cd0848261269b565b60ff16148015612ce1575082516029145b612d285760405162461bcd60e51b815260206004820152601860248201527713d19510dbdc994e881a5b9d985b1a59081c185e5b1bd85960421b60448201526064016109cb565b612d3383600d613047565b9150612d408360216130ac565b9050915091565b6000610bb97f000000000000000000000000000000000000000000000000000000e8d4a510006001600160401b038416614188565b6000612d888383613109565b5092915050565b600080806060816001612da2878361269b565b60ff1614612ded5760405162461bcd60e51b815260206004820152601860248201527713d19510dbdc994e881a5b9d985b1a59081c185e5b1bd85960421b60448201526064016109cb565b612df886600d613047565b9350612e058660216130ac565b9250612e128660296131ca565b9450612e1f8660496130ac565b9050612e3b6051808851612e339190613b83565b8891906122cf565b915091939590929450565b6000602282511015612e9a5760405162461bcd60e51b815260206004820152601c60248201527f4c7a4170703a20696e76616c69642061646170746572506172616d730000000060448201526064016109cb565b506022015190565b6001600160a01b038216612f025760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016109cb565b6001600160a01b03821660009081526007602052604090205481811015612f765760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016109cb565b6001600160a01b03831660008181526007602090815260408083208686039055600980548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b61ffff821660009081526003602052604081205490819003612ff757506127105b808211156126105760405162461bcd60e51b815260206004820181905260248201527f4c7a4170703a207061796c6f61642073697a6520697320746f6f206c6172676560448201526064016109cb565b6000613054826014613ae3565b8351101561309c5760405162461bcd60e51b8152602060048201526015602482015274746f416464726573735f6f75744f66426f756e647360581b60448201526064016109cb565b500160200151600160601b900490565b60006130b9826008613ae3565b835110156131005760405162461bcd60e51b8152602060048201526014602482015273746f55696e7436345f6f75744f66426f756e647360601b60448201526064016109cb565b50016008015190565b6001600160a01b03821661315f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016109cb565b80600960008282546131719190613ae3565b90915550506001600160a01b0382166000818152600760209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b60006131d7826020613ae3565b8351101561321f5760405162461bcd60e51b8152602060048201526015602482015274746f427974657333325f6f75744f66426f756e647360581b60448201526064016109cb565b50016020015190565b803561ffff8116811461323a57600080fd5b919050565b60008083601f84011261325157600080fd5b5081356001600160401b0381111561326857600080fd5b60208301915083602082850101111561328057600080fd5b9250929050565b80356001600160401b038116811461323a57600080fd5b600080600080600080608087890312156132b757600080fd5b6132c087613228565b955060208701356001600160401b03808211156132dc57600080fd5b6132e88a838b0161323f565b90975095508591506132fc60408a01613287565b9450606089013591508082111561331257600080fd5b5061331f89828a0161323f565b979a9699509497509295939492505050565b60006020828403121561334357600080fd5b81356001600160e01b03198116811461132857600080fd5b60005b8381101561337657818101518382015260200161335e565b50506000910152565b6000815180845261339781602086016020860161335b565b601f01601f19169290920160200192915050565b602081526000611328602083018461337f565b6000602082840312156133d057600080fd5b61132882613228565b6001600160a01b0381168114611a5057600080fd5b6000806040838503121561340157600080fd5b823561340c816133d9565b946020939093013593505050565b6000806040838503121561342d57600080fd5b61340c83613228565b60008060006060848603121561344b57600080fd5b8335613456816133d9565b92506020840135613466816133d9565b929592945050506040919091013590565b8035801515811461323a57600080fd5b60008060008060008060a087890312156134a057600080fd5b6134a987613228565b955060208701359450604087013593506134c560608801613477565b925060808701356001600160401b038111156134e057600080fd5b61331f89828a0161323f565b60008060006040848603121561350157600080fd5b61350a84613228565b925060208401356001600160401b0381111561352557600080fd5b6135318682870161323f565b9497909650939450505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561357c5761357c61353e565b604052919050565b60006001600160401b0382111561359d5761359d61353e565b50601f01601f191660200190565b6000806000606084860312156135c057600080fd5b6135c984613228565b925060208401356001600160401b038111156135e457600080fd5b8401601f810186136135f557600080fd5b803561360861360382613584565b613554565b81815287602083850101111561361d57600080fd5b8160208401602083013760006020838301015280945050505061364260408501613287565b90509250925092565b60006060828403121561365d57600080fd5b50919050565b600080600080600060a0868803121561367b57600080fd5b8535613686816133d9565b945061369460208701613228565b9350604086013592506060860135915060808601356001600160401b038111156136bd57600080fd5b6136c98882890161364b565b9150509295509295909350565b6000602082840312156136e857600080fd5b8135611328816133d9565b60008060008060008060008060e0898b03121561370f57600080fd5b883561371a816133d9565b975061372860208a01613228565b9650604089013595506060890135945060808901356001600160401b038082111561375257600080fd5b61375e8c838d0161323f565b909650945084915061377260a08c01613287565b935060c08b013591508082111561378857600080fd5b506137958b828c0161364b565b9150509295985092959890939650565b600080604083850312156137b857600080fd5b6137c183613228565b91506137cf60208401613228565b90509250929050565b600080600080600080600080600060e08a8c0312156137f657600080fd5b6137ff8a613228565b985060208a0135975060408a0135965060608a01356001600160401b038082111561382957600080fd5b6138358d838e0161323f565b909850965086915061384960808d01613287565b955061385760a08d01613477565b945060c08c013591508082111561386d57600080fd5b5061387a8c828d0161323f565b915080935050809150509295985092959850929598565b6000806000806000608086880312156138a957600080fd5b6138b286613228565b94506138c060208701613228565b93506040860135925060608601356001600160401b038111156138e257600080fd5b6138ee8882890161323f565b969995985093965092949392505050565b6000806040838503121561391257600080fd5b823561391d816133d9565b9150602083013561392d816133d9565b809150509250929050565b60008060006060848603121561394d57600080fd5b61395684613228565b925061396460208501613228565b9150604084013590509250925092565b6000806000806000806000806000806101008b8d03121561399457600080fd5b61399d8b613228565b995060208b01356001600160401b03808211156139b957600080fd5b6139c58e838f0161323f565b909b5099508991506139d960408e01613287565b985060608d0135975060808d013591506139f2826133d9565b90955060a08c0135945060c08c01359080821115613a0f57600080fd5b50613a1c8d828e0161323f565b9150809450508092505060e08b013590509295989b9194979a5092959850565b60008060008060808587031215613a5257600080fd5b613a5b85613228565b9350613a6960208601613228565b92506040850135613a79816133d9565b9396929550929360600135925050565b600181811c90821680613a9d57607f821691505b60208210810361365d57634e487b7160e01b600052602260045260246000fd5b8183823760009101908152919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610bb957610bb9613acd565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b61ffff84168152604060208201526000611afb604083018486613af6565b6000808335601e19843603018112613b5457600080fd5b8301803591506001600160401b03821115613b6e57600080fd5b60200191503681900382131561328057600080fd5b81810381811115610bb957610bb9613acd565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b601f82111561261057600081815260208120601f850160051c81016020861015613be35750805b601f850160051c820191505b8181101561102a57828155600101613bef565b81516001600160401b03811115613c1b57613c1b61353e565b613c2f81613c298454613a89565b84613bbc565b602080601f831160018114613c645760008415613c4c5750858301515b600019600386901b1c1916600185901b17855561102a565b600085815260208120601f198616915b82811015613c9357888601518255948401946001909101908401613c74565b5085821015613cb15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600061ffff808816835280871660208401525084604083015260806060830152613cef608083018486613af6565b979650505050505050565b61ffff86168152608060208201526000613d18608083018688613af6565b6001600160401b0394909416604083015250606001529392505050565b61ffff8916815260c060208201526000613d5360c08301898b613af6565b6001600160401b038816604084015286606084015285608084015282810360a0840152613d81818587613af6565b9b9a5050505050505050505050565b6001600160401b03831115613da757613da761353e565b613dbb83613db58354613a89565b83613bbc565b6000601f841160018114613def5760008515613dd75750838201355b600019600387901b1c1916600186901b178355610cd3565b600083815260209020601f19861690835b82811015613e205786850135825560209485019460019092019101613e00565b5086821015613e3d5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b600060208284031215613e6157600080fd5b81516001600160401b03811115613e7757600080fd5b8201601f81018413613e8857600080fd5b8051613e9661360382613584565b818152856020838501011115613eab57600080fd5b611afb82602083016020860161335b565b61ffff85168152608060208201526000613ed9608083018661337f565b6001600160401b03851660408401528281036060840152613cef818561337f565b61ffff861681526001600160a01b038516602082015260a060408201819052600090613f289083018661337f565b84151560608401528281036080840152613f42818561337f565b98975050505050505050565b60008060408385031215613f6157600080fd5b505080516020909101519092909150565b60008251613f8481846020870161335b565b9190910192915050565b61ffff8616815260a060208201526000613fab60a083018761337f565b6001600160401b03861660408401528281036060840152613fcc818661337f565b90508281036080840152613f42818561337f565b634e487b7160e01b600052601260045260246000fd5b60008261400557614005613fe0565b500490565b600061010061ffff8b1683528060208401526140288184018b61337f565b6001600160401b038a166040850152606084018990526001600160a01b038816608085015260a0840187905283810360c08501529050614068818661337f565b9150508260e08301529998505050505050505050565b606081526000614091606083018661337f565b6001600160401b039490941660208301525060400152919050565b6000826140bb576140bb613fe0565b500690565b61ffff8716815260c0602082015260006140dd60c083018861337f565b82810360408401526140ef818861337f565b6001600160a01b0387811660608601528616608085015283810360a0850152905061411a818561337f565b9998505050505050505050565b60ff60f81b8760f81b16815285600182015260006001600160401b0360c01b808760c01b166021840152856029840152808560c01b16604984015250825161417681605185016020870161335b565b91909101605101979650505050505050565b8082028115828204841417610bb957610bb9613acd56fea2646970667358221220f3bed692b28b2aecba06d87914e6ce298241a1f2c207daf9b18731c69ebb290c64736f6c63430008130033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000600000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6750000000000000000000000000000000000000000000000000000000000000003434144000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034341440000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): CAD
Arg [1] : _symbol (string): CAD
Arg [2] : _sharedDecimals (uint8): 6
Arg [3] : _lzEndpoint (address): 0x66A71Dcef29A0fFBDBE3c6a460a3B5BC225Cd675

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [3] : 00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [5] : 4341440000000000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [7] : 4341440000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

85366:238:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32330:799;;;;;;;;;;-1:-1:-1;32330:799:0;;;;;:::i;:::-;;:::i;:::-;;65343:213;;;;;;;;;;-1:-1:-1;65343:213:0;;;;;:::i;:::-;;:::i;:::-;;;2029:14:1;;2022:22;2004:41;;1992:2;1977:18;65343:213:0;;;;;;;;72177:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;35741:123::-;;;;;;;;;;-1:-1:-1;35741:123:0;;;;;:::i;:::-;;:::i;74537:201::-;;;;;;;;;;-1:-1:-1;74537:201:0;;;;;:::i;:::-;;:::i;37610:142::-;;;;;;;;;;-1:-1:-1;37610:142:0;;;;;:::i;:::-;;:::i;35872:129::-;;;;;;;;;;-1:-1:-1;35872:129:0;;;;;:::i;:::-;;:::i;73306:108::-;;;;;;;;;;-1:-1:-1;73394:12:0;;73306:108;;;3860:25:1;;;3848:2;3833:18;73306:108:0;3714:177:1;75318:261:0;;;;;;;;;;-1:-1:-1;75318:261:0;;;;;:::i;:::-;;:::i;73148:93::-;;;;;;;;;;-1:-1:-1;73231:2:0;73148:93;;;4529:4:1;4517:17;;;4499:36;;4487:2;4472:18;73148:93:0;4357:184:1;65564:344:0;;;;;;;;;;-1:-1:-1;65564:344:0;;;;;:::i;:::-;;:::i;:::-;;;;5577:25:1;;;5633:2;5618:18;;5611:34;;;;5550:18;65564:344:0;5403:248:1;75988:238:0;;;;;;;;;;-1:-1:-1;75988:238:0;;;;;:::i;:::-;;:::i;37850:250::-;;;;;;;;;;-1:-1:-1;37850:250:0;;;;;:::i;:::-;;:::i;31872:53::-;;;;;;;;;;-1:-1:-1;31872:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;36009:178;;;;;;;;;;-1:-1:-1;36009:178:0;;;;;:::i;:::-;;:::i;51815:37::-;;;;;;;;;;;;51851:1;51815:37;;51881:33;;;;;;;;;;;;51913:1;51881:33;;44313:85;;;;;;;;;;-1:-1:-1;44313:85:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45636:346;;;;;;;;;;-1:-1:-1;45636:346:0;;;;;:::i;:::-;;:::i;64196:356::-;;;;;;:::i;:::-;;:::i;73477:127::-;;;;;;;;;;-1:-1:-1;73477:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;73578:18:0;73551:7;73578:18;;;:9;:18;;;;;;;73477:127;30455:103;;;;;;;;;;;;;:::i;31742:51::-;;;;;;;;;;-1:-1:-1;31742:51:0;;;;;:::i;:::-;;:::i;64560:586::-;;;;;;:::i;:::-;;:::i;51972:37::-;;;;;;;;;;;;;;;31800:65;;;;;;;;;;-1:-1:-1;31800:65:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;29814:87;;;;;;;;;;-1:-1:-1;29860:7:0;29887:6;-1:-1:-1;;;;;29887:6:0;29814:87;;;-1:-1:-1;;;;;10626:32:1;;;10608:51;;10596:2;10581:18;29814:87:0;10462:203:1;83928:112:0;;;;;;;;;;;;;:::i;31932:23::-;;;;;;;;;;-1:-1:-1;31932:23:0;;;;-1:-1:-1;;;;;31932:23:0;;;72396:104;;;;;;;;;;;;;:::i;52018:83::-;;;;;;;;;;-1:-1:-1;52018:83:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36838:330;;;;;;;;;;-1:-1:-1;36838:330:0;;;;;:::i;:::-;;:::i;76729:436::-;;;;;;;;;;-1:-1:-1;76729:436:0;;;;;:::i;:::-;;:::i;65916:450::-;;;;;;;;;;-1:-1:-1;65916:450:0;;;;;:::i;:::-;;:::i;36549:281::-;;;;;;;;;;-1:-1:-1;36549:281:0;;;;;:::i;:::-;;:::i;73810:193::-;;;;;;;;;;-1:-1:-1;73810:193:0;;;;;:::i;:::-;;:::i;31689:46::-;;;;;;;;;;;;;;;37176:136;;;;;;;;;;-1:-1:-1;37176:136:0;;;;;:::i;:::-;;:::i;31625:55::-;;;;;;;;;;;;31675:5;31625:55;;35529:204;;;;;;;;;;-1:-1:-1;35529:204:0;;;;;:::i;:::-;;:::i;46168:767::-;;;;;;:::i;:::-;;:::i;74066:151::-;;;;;;;;;;-1:-1:-1;74066:151:0;;;;;:::i;:::-;;:::i;37320:228::-;;;;;;;;;;-1:-1:-1;37320:228:0;;;;;:::i;:::-;;:::i;51921:42::-;;;;;;;;;;;;51962:1;51921:42;;53222:645;;;;;;;;;;-1:-1:-1;53222:645:0;;;;;:::i;:::-;;:::i;36334:207::-;;;;;;;;;;-1:-1:-1;36334:207:0;;;;;:::i;:::-;;:::i;30713:201::-;;;;;;;;;;-1:-1:-1;30713:201:0;;;;;:::i;:::-;;:::i;35256:211::-;;;;;;;;;;-1:-1:-1;35256:211:0;;;;;:::i;:::-;;:::i;84048:103::-;;;;;;;;;;-1:-1:-1;84138:4:0;84048:103;;32330:799;28363:10;32570;-1:-1:-1;;;;;32546:35:0;;32538:78;;;;-1:-1:-1;;;32538:78:0;;15204:2:1;32538:78:0;;;15186:21:1;15243:2;15223:18;;;15216:30;15282:32;15262:18;;;15255:60;15332:18;;32538:78:0;;;;;;;;;32658:32;;;32629:26;32658:32;;;:19;:32;;;;;32629:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32878:13;:20;32856:11;;:18;;:42;:70;;;;;32925:1;32902:13;:20;:24;32856:70;:124;;;;-1:-1:-1;32956:24:0;;;;;;32930:22;;;;32940:11;;;;32930:22;:::i;:::-;;;;;;;;:50;32856:124;32834:212;;;;-1:-1:-1;;;32834:212:0;;16224:2:1;32834:212:0;;;16206:21:1;16263:2;16243:18;;;16236:30;16302:34;16282:18;;;16275:62;-1:-1:-1;;;16353:18:1;;;16346:36;16399:19;;32834:212:0;16022:402:1;32834:212:0;33059:62;33078:11;33091;;33059:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33059:62:0;;;;;;;;;;;;;;;;;;;;;;33104:6;;-1:-1:-1;33059:62:0;-1:-1:-1;33112:8:0;;;;;;33059:62;;33112:8;;;;33059:62;;;;;;;;;-1:-1:-1;33059:18:0;;-1:-1:-1;;;33059:62:0:i;:::-;32461:668;32330:799;;;;;;:::o;65343:213::-;65445:4;-1:-1:-1;;;;;;65469:39:0;;-1:-1:-1;;;65469:39:0;;:79;;-1:-1:-1;;;;;;;;;;63699:40:0;;;65512:36;65462:86;65343:213;-1:-1:-1;;65343:213:0:o;72177:100::-;72231:13;72264:5;72257:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72177:100;:::o;35741:123::-;29700:13;:11;:13::i;:::-;35821:35:::1;::::0;-1:-1:-1;;;35821:35:0;;16603:6:1;16591:19;;35821:35:0::1;::::0;::::1;16573:38:1::0;35821:10:0::1;-1:-1:-1::0;;;;;35821:25:0::1;::::0;::::1;::::0;16546:18:1;;35821:35:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;35741:123:::0;:::o;74537:201::-;74620:4;28363:10;74676:32;28363:10;74692:7;74701:6;74676:8;:32::i;:::-;-1:-1:-1;74726:4:0;;74537:201;-1:-1:-1;;;74537:201:0:o;37610:142::-;29700:13;:11;:13::i;:::-;37701:35:::1;::::0;;::::1;;::::0;;;:22:::1;:35;::::0;;;;:43;37610:142::o;35872:129::-;29700:13;:11;:13::i;:::-;35955:38:::1;::::0;-1:-1:-1;;;35955:38:0;;16603:6:1;16591:19;;35955:38:0::1;::::0;::::1;16573::1::0;35955:10:0::1;-1:-1:-1::0;;;;;35955:28:0::1;::::0;::::1;::::0;16546:18:1;;35955:38:0::1;16429:188:1::0;75318:261:0;75415:4;28363:10;75473:38;75489:4;28363:10;75504:6;75473:15;:38::i;:::-;75522:27;75532:4;75538:2;75542:6;75522:9;:27::i;:::-;-1:-1:-1;75567:4:0;;75318:261;-1:-1:-1;;;;75318:261:0:o;65564:344::-;65778:14;65794:11;65825:75;65842:11;65855:10;65867:7;65876;65885:14;;65825:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65825:16:0;;-1:-1:-1;;;65825:75:0:i;:::-;65818:82;;;;65564:344;;;;;;;;;:::o;75988:238::-;76076:4;28363:10;76132:64;28363:10;76148:7;76185:10;76157:25;28363:10;76148:7;76157:9;:25::i;:::-;:38;;;;:::i;:::-;76132:8;:64::i;37850:250::-;37992:32;;;37946:4;37992:32;;;:19;:32;;;;;37963:61;;37946:4;;37992:32;37963:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38080:11;;38070:22;;;;;;;:::i;:::-;;;;;;;;38052:13;38042:24;;;;;;:50;38035:57;;;37850:250;;;;;:::o;36009:178::-;29700:13;:11;:13::i;:::-;36124:55:::1;::::0;-1:-1:-1;;;36124:55:0;;-1:-1:-1;;;;;36124:10:0::1;:29;::::0;::::1;::::0;:55:::1;::::0;36154:11;;36167;;;;36124:55:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;45636:346:::0;28363:10;45850:4;45826:29;45818:80;;;;-1:-1:-1;;;45818:80:0;;17688:2:1;45818:80:0;;;17670:21:1;17727:2;17707:18;;;17700:30;17766:34;17746:18;;;17739:62;-1:-1:-1;;;17817:18:1;;;17810:36;17863:19;;45818:80:0;17486:402:1;45818:80:0;45909:65;45931:11;45944;;45909:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45909:65:0;;;;;;;;;;;;;;;;;;;;;;45957:6;;-1:-1:-1;45909:65:0;-1:-1:-1;45965:8:0;;;;;;45909:65;;45965:8;;;;45909:65;;;;;;;;;-1:-1:-1;45909:21:0;;-1:-1:-1;;;45909:65:0:i;:::-;45636:346;;;;;;:::o;64196:356::-;64413:131;64419:5;64426:11;64439:10;64451:7;64460:25;;;;:11;:25;:::i;:::-;64487:29;;;;;;;;:::i;:::-;64518:25;;;;:11;:25;:::i;:::-;64413:131;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64413:5:0;;-1:-1:-1;;;64413:131:0:i;30455:103::-;29700:13;:11;:13::i;:::-;30520:30:::1;30547:1;30520:18;:30::i;:::-;30455:103::o:0;31742:51::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;64560:586::-;64846:292;64873:5;64893:11;64919:10;64944:7;64966:8;;64846:292;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64989:14:0;;-1:-1:-1;65018:25:0;;-1:-1:-1;;65018:25:0;;;:11;:25;:::i;:::-;65058:29;;;;;;;;:::i;:::-;65102:25;;;;:11;:25;:::i;:::-;64846:292;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64846:12:0;;-1:-1:-1;;;64846:292:0:i;:::-;;64560:586;;;;;;;;:::o;83928:112::-;83995:4;84019:13;73394:12;;;73306:108;84019:13;84012:20;;83928:112;:::o;72396:104::-;72452:13;72485:7;72478:14;;;;;:::i;36838:330::-;36962:35;;;36942:17;36962:35;;;:19;:35;;;;;36942:55;;36917:12;;36942:17;36962:35;36942:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37016:4;:11;37031:1;37016:16;37008:58;;;;-1:-1:-1;;;37008:58:0;;18881:2:1;37008:58:0;;;18863:21:1;18920:2;18900:18;;;18893:30;18959:31;18939:18;;;18932:59;19008:18;;37008:58:0;18679:353:1;37008:58:0;37084:31;37095:1;37112:2;37098:4;:11;:16;;;;:::i;:::-;37084:4;;:31;:10;:31::i;:::-;37077:38;36838:330;-1:-1:-1;;;36838:330:0:o;76729:436::-;76822:4;28363:10;76822:4;76905:25;28363:10;76922:7;76905:9;:25::i;:::-;76878:52;;76969:15;76949:16;:35;;76941:85;;;;-1:-1:-1;;;76941:85:0;;19372:2:1;76941:85:0;;;19354:21:1;19411:2;19391:18;;;19384:30;19450:34;19430:18;;;19423:62;-1:-1:-1;;;19501:18:1;;;19494:35;19546:19;;76941:85:0;19170:401:1;76941:85:0;77062:60;77071:5;77078:7;77106:15;77087:16;:34;77062:8;:60::i;65916:450::-;66203:14;66219:11;66250:108;66274:11;66287:10;66299:7;66308:8;;66250:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;66250:108:0;;;;;;;;;;;;;;;;;;;;;;66318:14;;-1:-1:-1;66334:7:0;;-1:-1:-1;66250:108:0;66343:14;;;;;;66250:108;;66343:14;;;;66250:108;;;;;;;;;-1:-1:-1;66250:23:0;;-1:-1:-1;;;66250:108:0:i;:::-;66243:115;;;;65916:450;;;;;;;;;;;;:::o;36549:281::-;29700:13;:11;:13::i;:::-;36721:14:::1;;36745:4;36704:47;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;36704:47:0;;::::1;::::0;;;;;;36666:35:::1;::::0;::::1;;::::0;;;:19:::1;36704:47;36666:35:::0;;;:85:::1;::::0;:35;:85:::1;:::i;:::-;;36767:55;36791:14;36807;;36767:55;;;;;;;;:::i;:::-;;;;;;;;36549:281:::0;;;:::o;73810:193::-;73889:4;28363:10;73945:28;28363:10;73962:2;73966:6;73945:9;:28::i;37176:136::-;29700:13;:11;:13::i;:::-;37246:8:::1;:20:::0;;-1:-1:-1;;;;;;37246:20:0::1;-1:-1:-1::0;;;;;37246:20:0;::::1;::::0;;::::1;::::0;;;37282:22:::1;::::0;10608:51:1;;;37282:22:0::1;::::0;10596:2:1;10581:18;37282:22:0::1;;;;;;;37176:136:::0;:::o;35529:204::-;29700:13;:11;:13::i;:::-;35663:62:::1;::::0;-1:-1:-1;;;35663:62:0;;-1:-1:-1;;;;;35663:10:0::1;:20;::::0;::::1;::::0;:62:::1;::::0;35684:8;;35694;;35704:11;;35717:7;;;;35663:62:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;46168:767:::0;46379:27;;;46357:19;46379:27;;;:14;:27;;;;;;:40;;;;46407:11;;;;46379:40;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46379:48:0;;;;;;;;;;;;-1:-1:-1;46379:48:0;46438:73;;;;-1:-1:-1;;;46438:73:0;;22844:2:1;46438:73:0;;;22826:21:1;22883:2;22863:18;;;22856:30;22922:34;22902:18;;;22895:62;-1:-1:-1;;;22973:18:1;;;22966:33;23016:19;;46438:73:0;22642:399:1;46438:73:0;46553:11;46540:8;;46530:19;;;;;;;:::i;:::-;;;;;;;;:34;46522:80;;;;-1:-1:-1;;;46522:80:0;;23248:2:1;46522:80:0;;;23230:21:1;23287:2;23267:18;;;23260:30;23326:34;23306:18;;;23299:62;-1:-1:-1;;;23377:18:1;;;23370:31;23418:19;;46522:80:0;23046:397:1;46522:80:0;46650:27;;;46709:1;46650:27;;;:14;:27;;;;;;:40;;;;46678:11;;;;46650:40;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46650:48:0;;;;;;;;;;;;:61;;;;46780:65;;;;;;;;;;;;;;;;;;;46802:11;;46815;;46780:65;;;;;;46815:11;46780:65;;46815:11;46780:65;;;;;;;;;-1:-1:-1;;46780:65:0;;;;;;;;;;;;;;;;;;;;;;46828:6;;-1:-1:-1;46780:65:0;-1:-1:-1;46836:8:0;;;;;;46780:65;;46836:8;;;;46780:65;;;;;;;;;-1:-1:-1;46780:21:0;;-1:-1:-1;;;46780:65:0:i;:::-;46861:66;46881:11;46894;;46907:6;46915:11;46861:66;;;;;;;;;;:::i;:::-;;;;;;;;46301:634;46168:767;;;;;;:::o;74066:151::-;-1:-1:-1;;;;;74182:18:0;;;74155:7;74182:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;74066:151::o;37320:228::-;29700:13;:11;:13::i;:::-;37426:28:::1;::::0;;::::1;;::::0;;;:15:::1;:28;::::0;;;;;;;:41;;::::1;::::0;;;;;;;;;;:51;;;37493:47;;24169:34:1;;;24219:18;;24212:43;;;;24271:18;;;24264:34;;;37493:47:0::1;::::0;24132:2:1;24117:18;37493:47:0::1;23946:358:1::0;53222:645:0;28363:10;53534:4;53510:29;53502:73;;;;-1:-1:-1;;;53502:73:0;;24511:2:1;53502:73:0;;;24493:21:1;24550:2;24530:18;;;24523:30;24589:33;24569:18;;;24562:61;24640:18;;53502:73:0;24309:355:1;53502:73:0;53615:42;53637:4;53644:3;53649:7;53615:13;:42::i;:::-;53605:52;;53703:3;-1:-1:-1;;;;;53673:43:0;53690:11;53673:43;;;53708:7;53673:43;;;;3860:25:1;;3848:2;3833:18;;3714:177;53673:43:0;;;;;;;;53746:113;;-1:-1:-1;;;53746:113:0;;-1:-1:-1;;;;;53746:33:0;;;;;53786:11;;53746:113;;53800:11;;53813;;;;53826:6;;53834:5;;53841:7;;53850:8;;;;53746:113;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53222:645;;;;;;;;;;:::o;36334:207::-;29700:13;:11;:13::i;:::-;36435:35:::1;::::0;::::1;;::::0;;;:19:::1;:35;::::0;;;;:43:::1;36473:5:::0;;36435:35;:43:::1;:::i;:::-;;36494:39;36511:14;36527:5;;36494:39;;;;;;;;:::i;30713:201::-:0;29700:13;:11;:13::i;:::-;-1:-1:-1;;;;;30802:22:0;::::1;30794:73;;;::::0;-1:-1:-1;;;30794:73:0;;26836:2:1;30794:73:0::1;::::0;::::1;26818:21:1::0;26875:2;26855:18;;;26848:30;26914:34;26894:18;;;26887:62;-1:-1:-1;;;26965:18:1;;;26958:36;27011:19;;30794:73:0::1;26634:402:1::0;30794:73:0::1;30878:28;30897:8;30878:18;:28::i;:::-;30713:201:::0;:::o;35256:211::-;35391:68;;-1:-1:-1;;;35391:68:0;;27278:6:1;27311:15;;;35391:68:0;;;27293:34:1;27363:15;;27343:18;;;27336:43;35440:4:0;27395:18:1;;;27388:60;27464:18;;;27457:34;;;35359:12:0;;35391:10;-1:-1:-1;;;;;35391:20:0;;;;27240:19:1;;35391:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;35391:68:0;;;;;;;;;;;;:::i;:::-;35384:75;35256:211;-1:-1:-1;;;;;35256:211:0:o;44682:563::-;44875:12;44889:19;44912:203;44960:9;44984:3;45025:34;;;45061:11;45074;45087:6;45095:8;45002:102;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;45002:102:0;;;;;;;;;;;;;;-1:-1:-1;;;;;45002:102:0;-1:-1:-1;;;;;;45002:102:0;;;;;;;;;;44920:4;;44912:203;;:33;:203::i;:::-;44874:241;;;;45131:7;45126:112;;45155:71;45175:11;45188;45201:6;45209:8;45219:6;45155:19;:71::i;29979:132::-;29860:7;29887:6;-1:-1:-1;;;;;29887:6:0;28363:10;30043:23;30035:68;;;;-1:-1:-1;;;30035:68:0;;28918:2:1;30035:68:0;;;28900:21:1;;;28937:18;;;28930:30;28996:34;28976:18;;;28969:62;29048:18;;30035:68:0;28716:356:1;80722:346:0;-1:-1:-1;;;;;80824:19:0;;80816:68;;;;-1:-1:-1;;;80816:68:0;;29279:2:1;80816:68:0;;;29261:21:1;29318:2;29298:18;;;29291:30;29357:34;29337:18;;;29330:62;-1:-1:-1;;;29408:18:1;;;29401:34;29452:19;;80816:68:0;29077:400:1;80816:68:0;-1:-1:-1;;;;;80903:21:0;;80895:68;;;;-1:-1:-1;;;80895:68:0;;29684:2:1;80895:68:0;;;29666:21:1;29723:2;29703:18;;;29696:30;29762:34;29742:18;;;29735:62;-1:-1:-1;;;29813:18:1;;;29806:32;29855:19;;80895:68:0;29482:398:1;80895:68:0;-1:-1:-1;;;;;80976:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;81028:32;;3860:25:1;;;81028:32:0;;3833:18:1;81028:32:0;;;;;;;80722:346;;;:::o;81359:419::-;81460:24;81487:25;81497:5;81504:7;81487:9;:25::i;:::-;81460:52;;-1:-1:-1;;81527:16:0;:37;81523:248;;81609:6;81589:16;:26;;81581:68;;;;-1:-1:-1;;;81581:68:0;;30087:2:1;81581:68:0;;;30069:21:1;30126:2;30106:18;;;30099:30;30165:31;30145:18;;;30138:59;30214:18;;81581:68:0;29885:353:1;81581:68:0;81693:51;81702:5;81709:7;81737:6;81718:16;:25;81693:8;:51::i;:::-;81449:329;81359:419;;;:::o;77635:806::-;-1:-1:-1;;;;;77732:18:0;;77724:68;;;;-1:-1:-1;;;77724:68:0;;30445:2:1;77724:68:0;;;30427:21:1;30484:2;30464:18;;;30457:30;30523:34;30503:18;;;30496:62;-1:-1:-1;;;30574:18:1;;;30567:35;30619:19;;77724:68:0;30243:401:1;77724:68:0;-1:-1:-1;;;;;77811:16:0;;77803:64;;;;-1:-1:-1;;;77803:64:0;;30851:2:1;77803:64:0;;;30833:21:1;30890:2;30870:18;;;30863:30;30929:34;30909:18;;;30902:62;-1:-1:-1;;;30980:18:1;;;30973:33;31023:19;;77803:64:0;30649:399:1;77803:64:0;-1:-1:-1;;;;;77953:15:0;;77931:19;77953:15;;;:9;:15;;;;;;77987:21;;;;77979:72;;;;-1:-1:-1;;;77979:72:0;;31255:2:1;77979:72:0;;;31237:21:1;31294:2;31274:18;;;31267:30;31333:34;31313:18;;;31306:62;-1:-1:-1;;;31384:18:1;;;31377:36;31430:19;;77979:72:0;31053:402:1;77979:72:0;-1:-1:-1;;;;;78087:15:0;;;;;;;:9;:15;;;;;;78105:20;;;78087:38;;78305:13;;;;;;;;;;:23;;;;;;78357:26;;;;;;78119:6;3860:25:1;;3848:2;3833:18;;3714:177;78357:26:0;;;;;;;;78396:37;82378:91;54061:471;54267:14;54283:11;54351:20;54374:47;54393:10;54405:15;54412:7;54405:6;:15::i;:::-;60832:48;;;51913:1;60832:48;;;35564:49:1;35629:11;;;35622:27;;;;35705:3;35683:16;;;;-1:-1:-1;;;;;;35679:51:1;35665:12;;;35658:73;60832:48:0;;;;;;;;;35747:12:1;;;;60832:48:0;;;60703:185;54374:47;54439:85;;-1:-1:-1;;;54439:85:0;;54351:70;;-1:-1:-1;;;;;;54439:10:0;:23;;;;:85;;54463:11;;54484:4;;54351:70;;54500:7;;54509:14;;54439:85;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54432:92;;;;;54061:471;;;;;;;;:::o;55138:558::-;55333:16;55352:19;:8;55333:16;55352;:19::i;:::-;55333:38;-1:-1:-1;55388:21:0;;;55384:305;;55426:52;55435:11;55448;55461:6;55469:8;55426;:52::i;:::-;55384:305;;;-1:-1:-1;;55500:30:0;;;;55496:193;;55547:59;55563:11;55576;55589:6;55597:8;55547:15;:59::i;55496:193::-;55639:38;;-1:-1:-1;;;55639:38:0;;32559:2:1;55639:38:0;;;32541:21:1;32598:2;32578:18;;;32571:30;32637;32617:18;;;32610:58;32685:18;;55639:38:0;32357:352:1;55704:840:0;55973:11;55997:66;56012:11;55973;56034:14;55973:11;55997:14;:66::i;:::-;56089:20;56101:7;56089:11;:20::i;:::-;-1:-1:-1;56076:33:0;-1:-1:-1;56129:50:0;56140:5;56147:11;56160:10;56076:33;56129:10;:50::i;:::-;56120:59;;56247:1;56238:6;:10;56230:48;;;;-1:-1:-1;;;56230:48:0;;32916:2:1;56230:48:0;;;32898:21:1;32955:2;32935:18;;;32928:30;-1:-1:-1;;;32974:18:1;;;32967:55;33039:18;;56230:48:0;32714:349:1;56230:48:0;56291:22;56316:46;56335:10;56347:14;56354:6;56347;:14::i;56316:46::-;56291:71;;56373:94;56381:11;56394:9;56405:14;56421:18;56441:14;56457:9;56373:7;:94::i;:::-;56517:10;56510:5;-1:-1:-1;;;;;56485:51:0;56497:11;56485:51;;;56529:6;56485:51;;;;3860:25:1;;3848:2;3833:18;;3714:177;56485:51:0;;;;;;;;55986:558;55704:840;;;;;;;;;:::o;31074:191::-;31148:16;31167:6;;-1:-1:-1;;;;;31184:17:0;;;-1:-1:-1;;;;;;31184:17:0;;;;;;31217:40;;31167:6;;;;;;;31217:40;;31148:16;31217:40;31137:128;31074:191;:::o;56974:995::-;57314:11;57338:77;57353:11;51962:1;57384:14;-1:-1:-1;;;;;57338:77:0;;:14;:77::i;:::-;57441:20;57453:7;57441:11;:20::i;:::-;-1:-1:-1;57428:33:0;-1:-1:-1;57481:50:0;57492:5;57499:11;57512:10;57428:33;57481:10;:50::i;:::-;57472:59;;57559:1;57550:6;:10;57542:48;;;;-1:-1:-1;;;57542:48:0;;32916:2:1;57542:48:0;;;32898:21:1;32955:2;32935:18;;;32928:30;-1:-1:-1;;;32974:18:1;;;32967:55;33039:18;;57542:48:0;32714:349:1;57542:48:0;57671:22;57696:91;57722:10;57734;57746:14;57753:6;57746;:14::i;:::-;57762:8;57772:14;57696:25;:91::i;:::-;57671:116;;57798:94;57806:11;57819:9;57830:14;57846:18;57866:14;57882:9;57798:7;:94::i;:::-;57942:10;57935:5;-1:-1:-1;;;;;57910:51:0;57922:11;57910:51;;;57954:6;57910:51;;;;3860:25:1;;3848:2;3833:18;;3714:177;57910:51:0;;;;;;;;57327:642;56974:995;;;;;;;;;;;:::o;16992:2799::-;17078:12;17127:7;17111:12;17127:7;17121:2;17111:12;:::i;:::-;:23;;17103:50;;;;-1:-1:-1;;;17103:50:0;;33270:2:1;17103:50:0;;;33252:21:1;33309:2;33289:18;;;33282:30;-1:-1:-1;;;33328:18:1;;;33321:44;33382:18;;17103:50:0;33068:338:1;17103:50:0;17189:16;17198:7;17189:6;:16;:::i;:::-;17172:6;:13;:33;;17164:63;;;;-1:-1:-1;;;17164:63:0;;33613:2:1;17164:63:0;;;33595:21:1;33652:2;33632:18;;;33625:30;-1:-1:-1;;;33671:18:1;;;33664:47;33728:18;;17164:63:0;33411:341:1;17164:63:0;17240:22;17306:15;;17335:2005;;;;19484:4;19478:11;19465:24;;19673:1;19662:9;19655:20;19723:4;19712:9;19708:20;19702:4;19695:34;17299:2445;;17335:2005;17520:4;17514:11;17501:24;;18189:2;18180:7;18176:16;18577:9;18570:17;18564:4;18560:28;18548:9;18537;18533:25;18529:60;18626:7;18622:2;18618:16;18883:6;18869:9;18862:17;18856:4;18852:28;18840:9;18832:6;18828:22;18824:57;18820:70;18654:434;18917:3;18913:2;18910:11;18654:434;;;19059:9;;19048:21;;18959:4;18951:13;;;;18992;18654:434;;;-1:-1:-1;;19108:26:0;;;19320:2;19303:11;-1:-1:-1;;19299:25:0;19293:4;19286:39;-1:-1:-1;17299:2445:0;-1:-1:-1;19774:9:0;16992:2799;-1:-1:-1;;;;16992:2799:0:o;54540:590::-;54817:14;54833:11;54904:20;54927:92;54953:10;54965;54977:15;54984:7;54977:6;:15::i;54927:92::-;55037:85;;-1:-1:-1;;;55037:85:0;;54904:115;;-1:-1:-1;;;;;;55037:10:0;:23;;;;:85;;55061:11;;55082:4;;54904:115;;55098:7;;55107:14;;55037:85;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55030:92;;;;;54540:590;;;;;;;;;;:::o;84819:391::-;84919:4;28363:10;85069:4;-1:-1:-1;;;;;85052:22:0;;;;;;:42;;;85087:7;-1:-1:-1;;;;;85078:16:0;:5;-1:-1:-1;;;;;85078:16:0;;;85052:42;85048:88;;;85096:40;85112:5;85119:7;85128;85096:15;:40::i;:::-;85147:30;85157:5;85164:3;85169:7;85147:9;:30::i;:::-;-1:-1:-1;85195:7:0;;84819:391;-1:-1:-1;;;84819:391:0:o;39259:1309::-;39418:4;39424:12;39486;39509:13;39533:24;39570:8;39560:19;;-1:-1:-1;;;;;39560:19:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39560:19:0;;39533:46;;40089:1;40059;40021:9;40015:16;39982:4;39971:9;39967:20;39932:1;39893:7;39863:4;39840:275;39828:287;;40184:16;40173:27;;40229:8;40220:7;40217:21;40214:78;;;40269:8;40258:19;;40214:78;40379:7;40366:11;40359:28;40501:7;40498:1;40491:4;40478:11;40474:22;40459:50;40538:8;;;;-1:-1:-1;39259:1309:0;-1:-1:-1;;;;;;39259:1309:0:o;45253:375::-;45529:8;45519:19;;;;;;45468:14;:27;45483:11;45468:27;;;;;;;;;;;;;;;45496:11;45468:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45468:48:0;;;;;;;;;:70;;;;45554:66;;;;45568:11;;45581;;45509:6;;45602:8;;45612:7;;45554:66;:::i;:::-;;;;;;;;45253:375;;;;;:::o;82378:91::-;;;;:::o;60138:238::-;60199:6;;60234:22;85304:9;60234:7;:22;:::i;:::-;60218:38;-1:-1:-1;;;;;;60275:28:0;;;60267:67;;;;-1:-1:-1;;;60267:67:0;;35232:2:1;60267:67:0;;;35214:21:1;35271:2;35251:18;;;35244:30;35310:28;35290:18;;;35283:56;35356:18;;60267:67:0;35030:350:1;20167:307:0;20241:5;20284:10;:6;20293:1;20284:10;:::i;:::-;20267:6;:13;:27;;20259:59;;;;-1:-1:-1;;;20259:59:0;;35972:2:1;20259:59:0;;;35954:21:1;36011:2;35991:18;;;35984:30;-1:-1:-1;;;36030:18:1;;;36023:49;36089:18;;20259:59:0;35770:343:1;20259:59:0;-1:-1:-1;20398:29:0;20414:3;20398:29;20392:36;;20167:307::o;56552:414::-;56664:10;56676:15;56695:28;56714:8;56695:18;:28::i;:::-;56663:60;;-1:-1:-1;56663:60:0;-1:-1:-1;;;;;;56738:16:0;;56734:69;;56784:6;56771:20;;56734:69;56815:11;56829:16;56836:8;56829:6;:16::i;:::-;56815:30;;56865:34;56875:11;56888:2;56892:6;56865:9;:34::i;:::-;56856:43;;56947:2;-1:-1:-1;;;;;56917:41:0;56934:11;56917:41;;;56951:6;56917:41;;;;3860:25:1;;3848:2;3833:18;;3714:177;56917:41:0;;;;;;;;56652:314;;;56552:414;;;;:::o;57977:2027::-;58115:12;58129:10;58141:15;58158:27;58187:17;58208:35;58234:8;58208:25;:35::i;:::-;58114:129;;;;;;;;;;58256:13;58272:15;:28;58288:11;58272:28;;;;;;;;;;;;;;;58301:11;58272:41;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58272:49:0;;;;;;;;;;;;;;-1:-1:-1;58346:16:0;58353:8;58346:6;:16::i;:::-;58332:30;;58490:8;58485:167;;58524:45;58534:11;58555:4;58562:6;58524:9;:45::i;:::-;58584:28;;;;;;;:15;:28;;;;;;;:41;;58515:54;;-1:-1:-1;58636:4:0;;58584:41;;58613:11;;58584:41;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58584:49:0;;;;;;;;;;:56;;-1:-1:-1;;58584:56:0;;;;;;;;;;58485:167;-1:-1:-1;;;;;60098:20:0;;;58664:97;;58706:22;;-1:-1:-1;;;;;10626:32:1;;10608:51;;58706:22:0;;10596:2:1;10581:18;58706:22:0;;;;;;;58743:7;;;;;;;;;58664:97;58835:11;58883;58920:6;58960:8;58995:4;59024:2;59052:6;59100:14;58815:17;59185:8;:33;;59208:10;-1:-1:-1;;;;;59185:33:0;;;;59196:9;59185:33;59174:44;;59230:12;59244:19;59267:398;59315:9;59339:3;59398:31;;;59448:10;59477;59506:5;59530;59554:3;59576:7;59602:15;59636:3;59357:297;;;;;;;;;;;;;;;:::i;59267:398::-;59229:436;;;;59682:7;59678:319;;;59721:18;;;;;;59759:59;;;;;;;;;;59794:10;;59806:5;;59721:18;;59759:59;:::i;:::-;;;;;;;;59691:139;59678:319;;;59918:67;59938:10;59950;59962:5;59969:7;59978:6;59918:19;:67::i;:::-;58103:1901;;;;;;;;;;;;;;;;;;57977:2027;;;;:::o;34042:420::-;34178:21;34202:28;34215:14;34202:12;:28::i;:::-;34260;;;;34241:16;34260:28;;;:15;:28;;;;;;;;:35;;;;;;;;;;34178:52;;-1:-1:-1;34314:15:0;34306:54;;;;-1:-1:-1;;;34306:54:0;;37604:2:1;34306:54:0;;;37586:21:1;37643:2;37623:18;;;37616:30;37682:28;37662:18;;;37655:56;37728:18;;34306:54:0;37402:350:1;34306:54:0;34399:23;34413:9;34399:11;:23;:::i;:::-;34379:16;:43;;34371:83;;;;-1:-1:-1;;;34371:83:0;;37959:2:1;34371:83:0;;;37941:21:1;37998:2;37978:18;;;37971:30;38037:29;38017:18;;;38010:57;38084:18;;34371:83:0;37757:351:1;60513:182:0;60579:16;;60626:22;85304:9;60626:7;:22;:::i;:::-;60619:29;-1:-1:-1;60673:14:0;60619:29;60673:7;:14;:::i;:::-;60659:28;;60513:182;;;:::o;84345:286::-;84446:4;28363:10;-1:-1:-1;;;;;84508:16:0;;;;84504:62;;84526:40;84542:5;84549:7;84558;84526:15;:40::i;:::-;84577:21;84583:5;84590:7;84577:5;:21::i;:::-;-1:-1:-1;84616:7:0;;84345:286;-1:-1:-1;;;;84345:286:0:o;33418:616::-;33702:32;;;33673:26;33702:32;;;:19;:32;;;;;33673:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33753:13;:20;33777:1;33753:25;33745:86;;;;-1:-1:-1;;;33745:86:0;;38432:2:1;33745:86:0;;;38414:21:1;38471:2;38451:18;;;38444:30;38510:34;38490:18;;;38483:62;-1:-1:-1;;;38561:18:1;;;38554:46;38617:19;;33745:86:0;38230:412:1;33745:86:0;33842:47;33860:11;33873:8;:15;33842:17;:47::i;:::-;33900:126;;-1:-1:-1;;;33900:126:0;;-1:-1:-1;;;;;33900:10:0;:15;;;;33924:10;;33900:126;;33937:11;;33950:13;;33965:8;;33975:14;;33991:18;;34011:14;;33900:126;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33662:372;33418:616;;;;;;:::o;61247:366::-;61464:12;51962:1;61531:10;61543:9;-1:-1:-1;;;;;62297:23:0;;61580:14;61596:8;61496:109;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61489:116;;61247:366;;;;;;;:::o;60896:343::-;60978:10;;;61026:19;:8;60978:10;61026:16;:19::i;:::-;:30;;;:55;;;;;61060:8;:15;61079:2;61060:21;61026:55;61018:92;;;;-1:-1:-1;;;61018:92:0;;40426:2:1;61018:92:0;;;40408:21:1;40465:2;40445:18;;;40438:30;-1:-1:-1;;;40484:18:1;;;40477:54;40548:18;;61018:92:0;40224:348:1;61018:92:0;61128:22;:8;61147:2;61128:18;:22::i;:::-;61123:27;-1:-1:-1;61210:21:0;:8;61228:2;61210:17;:21::i;:::-;61199:32;;60896:343;;;:::o;60384:121::-;60449:4;60473:24;85304:9;-1:-1:-1;;;;;60473:24:0;;;:::i;84639:172::-;84735:4;84752:26;84758:10;84770:7;84752:5;:26::i;:::-;-1:-1:-1;84796:7:0;84639:172;-1:-1:-1;;84639:172:0:o;61621:557::-;61726:12;;;61769:20;61726:12;51962:1;61832:19;:8;61726:12;61832:16;:19::i;:::-;:39;;;61824:76;;;;-1:-1:-1;;;61824:76:0;;40426:2:1;61824:76:0;;;40408:21:1;40465:2;40445:18;;;40438:30;-1:-1:-1;;;40484:18:1;;;40477:54;40548:18;;61824:76:0;40224:348:1;61824:76:0;61918:22;:8;61937:2;61918:18;:22::i;:::-;61913:27;-1:-1:-1;62000:21:0;:8;62018:2;62000:17;:21::i;:::-;61989:32;-1:-1:-1;62039:22:0;:8;62058:2;62039:18;:22::i;:::-;62032:29;-1:-1:-1;62088:21:0;:8;62106:2;62088:17;:21::i;:::-;62072:37;;62130:40;62145:2;62167;62149:8;:15;:20;;;;:::i;:::-;62130:8;;:40;:14;:40::i;:::-;62120:50;;61621:557;;;;;;;:::o;34470:271::-;34552:13;34611:2;34586:14;:21;:27;;34578:68;;;;-1:-1:-1;;;34578:68:0;;40952:2:1;34578:68:0;;;40934:21:1;40991:2;40971:18;;;40964:30;41030;41010:18;;;41003:58;41078:18;;34578:68:0;40750:352:1;34578:68:0;-1:-1:-1;34719:2:0;34699:23;34693:30;;34470:271::o;79609:675::-;-1:-1:-1;;;;;79693:21:0;;79685:67;;;;-1:-1:-1;;;79685:67:0;;41309:2:1;79685:67:0;;;41291:21:1;41348:2;41328:18;;;41321:30;41387:34;41367:18;;;41360:62;-1:-1:-1;;;41438:18:1;;;41431:31;41479:19;;79685:67:0;41107:397:1;79685:67:0;-1:-1:-1;;;;;79852:18:0;;79827:22;79852:18;;;:9;:18;;;;;;79889:24;;;;79881:71;;;;-1:-1:-1;;;79881:71:0;;41711:2:1;79881:71:0;;;41693:21:1;41750:2;41730:18;;;41723:30;41789:34;41769:18;;;41762:62;-1:-1:-1;;;41840:18:1;;;41833:32;41882:19;;79881:71:0;41509:398:1;79881:71:0;-1:-1:-1;;;;;79988:18:0;;;;;;:9;:18;;;;;;;;80009:23;;;79988:44;;80127:12;:22;;;;;;;80178:37;3860:25:1;;;79988:18:0;;;80178:37;;3833:18:1;80178:37:0;;;;;;;82378:91;;;:::o;34749:402::-;34872:35;;;34848:21;34872:35;;;:22;:35;;;;;;;34922:21;;;34918:138;;-1:-1:-1;31675:5:0;34918:138;35090:16;35074:12;:32;;35066:77;;;;-1:-1:-1;;;35066:77:0;;42114:2:1;35066:77:0;;;42096:21:1;;;42133:18;;;42126:30;42192:34;42172:18;;;42165:62;42244:18;;35066:77:0;41912:356:1;19799:360:0;19875:7;19920:11;:6;19929:2;19920:11;:::i;:::-;19903:6;:13;:28;;19895:62;;;;-1:-1:-1;;;19895:62:0;;42475:2:1;19895:62:0;;;42457:21:1;42514:2;42494:18;;;42487:30;-1:-1:-1;;;42533:18:1;;;42526:51;42594:18;;19895:62:0;42273:345:1;19895:62:0;-1:-1:-1;20049:30:0;20065:4;20049:30;20043:37;-1:-1:-1;;;20039:71:0;;;19799:360::o;21120:311::-;21195:6;21239:10;:6;21248:1;21239:10;:::i;:::-;21222:6;:13;:27;;21214:60;;;;-1:-1:-1;;;21214:60:0;;42825:2:1;21214:60:0;;;42807:21:1;42864:2;42844:18;;;42837:30;-1:-1:-1;;;42883:18:1;;;42876:50;42943:18;;21214:60:0;42623:344:1;21214:60:0;-1:-1:-1;21355:29:0;21371:3;21355:29;21349:36;;21120:311::o;78728:548::-;-1:-1:-1;;;;;78812:21:0;;78804:65;;;;-1:-1:-1;;;78804:65:0;;43174:2:1;78804:65:0;;;43156:21:1;43213:2;43193:18;;;43186:30;43252:33;43232:18;;;43225:61;43303:18;;78804:65:0;42972:355:1;78804:65:0;78960:6;78944:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;79115:18:0;;;;;;:9;:18;;;;;;;;:28;;;;;;79170:37;3860:25:1;;;79170:37:0;;3833:18:1;79170:37:0;;;;;;;78728:548;;:::o;22403:326::-;22479:7;22524:11;:6;22533:2;22524:11;:::i;:::-;22507:6;:13;:28;;22499:62;;;;-1:-1:-1;;;22499:62:0;;43534:2:1;22499:62:0;;;43516:21:1;43573:2;43553:18;;;43546:30;-1:-1:-1;;;43592:18:1;;;43585:51;43653:18;;22499:62:0;43332:345:1;22499:62:0;-1:-1:-1;22649:30:0;22665:4;22649:30;22643:37;;22403:326::o;14:159:1:-;81:20;;141:6;130:18;;120:29;;110:57;;163:1;160;153:12;110:57;14:159;;;:::o;178:347::-;229:8;239:6;293:3;286:4;278:6;274:17;270:27;260:55;;311:1;308;301:12;260:55;-1:-1:-1;334:20:1;;-1:-1:-1;;;;;366:30:1;;363:50;;;409:1;406;399:12;363:50;446:4;438:6;434:17;422:29;;498:3;491:4;482:6;474;470:19;466:30;463:39;460:59;;;515:1;512;505:12;460:59;178:347;;;;;:::o;530:171::-;597:20;;-1:-1:-1;;;;;646:30:1;;636:41;;626:69;;691:1;688;681:12;706:862;812:6;820;828;836;844;852;905:3;893:9;884:7;880:23;876:33;873:53;;;922:1;919;912:12;873:53;945:28;963:9;945:28;:::i;:::-;935:38;;1024:2;1013:9;1009:18;996:32;-1:-1:-1;;;;;1088:2:1;1080:6;1077:14;1074:34;;;1104:1;1101;1094:12;1074:34;1143:58;1193:7;1184:6;1173:9;1169:22;1143:58;:::i;:::-;1220:8;;-1:-1:-1;1117:84:1;-1:-1:-1;1117:84:1;;-1:-1:-1;1274:37:1;1307:2;1292:18;;1274:37;:::i;:::-;1264:47;;1364:2;1353:9;1349:18;1336:32;1320:48;;1393:2;1383:8;1380:16;1377:36;;;1409:1;1406;1399:12;1377:36;;1448:60;1500:7;1489:8;1478:9;1474:24;1448:60;:::i;:::-;706:862;;;;-1:-1:-1;706:862:1;;-1:-1:-1;706:862:1;;1527:8;;706:862;-1:-1:-1;;;706:862:1:o;1573:286::-;1631:6;1684:2;1672:9;1663:7;1659:23;1655:32;1652:52;;;1700:1;1697;1690:12;1652:52;1726:23;;-1:-1:-1;;;;;;1778:32:1;;1768:43;;1758:71;;1825:1;1822;1815:12;2056:250;2141:1;2151:113;2165:6;2162:1;2159:13;2151:113;;;2241:11;;;2235:18;2222:11;;;2215:39;2187:2;2180:10;2151:113;;;-1:-1:-1;;2298:1:1;2280:16;;2273:27;2056:250::o;2311:271::-;2353:3;2391:5;2385:12;2418:6;2413:3;2406:19;2434:76;2503:6;2496:4;2491:3;2487:14;2480:4;2473:5;2469:16;2434:76;:::i;:::-;2564:2;2543:15;-1:-1:-1;;2539:29:1;2530:39;;;;2571:4;2526:50;;2311:271;-1:-1:-1;;2311:271:1:o;2587:220::-;2736:2;2725:9;2718:21;2699:4;2756:45;2797:2;2786:9;2782:18;2774:6;2756:45;:::i;2812:184::-;2870:6;2923:2;2911:9;2902:7;2898:23;2894:32;2891:52;;;2939:1;2936;2929:12;2891:52;2962:28;2980:9;2962:28;:::i;3001:131::-;-1:-1:-1;;;;;3076:31:1;;3066:42;;3056:70;;3122:1;3119;3112:12;3137:315;3205:6;3213;3266:2;3254:9;3245:7;3241:23;3237:32;3234:52;;;3282:1;3279;3272:12;3234:52;3321:9;3308:23;3340:31;3365:5;3340:31;:::i;:::-;3390:5;3442:2;3427:18;;;;3414:32;;-1:-1:-1;;;3137:315:1:o;3457:252::-;3524:6;3532;3585:2;3573:9;3564:7;3560:23;3556:32;3553:52;;;3601:1;3598;3591:12;3553:52;3624:28;3642:9;3624:28;:::i;3896:456::-;3973:6;3981;3989;4042:2;4030:9;4021:7;4017:23;4013:32;4010:52;;;4058:1;4055;4048:12;4010:52;4097:9;4084:23;4116:31;4141:5;4116:31;:::i;:::-;4166:5;-1:-1:-1;4223:2:1;4208:18;;4195:32;4236:33;4195:32;4236:33;:::i;:::-;3896:456;;4288:7;;-1:-1:-1;;;4342:2:1;4327:18;;;;4314:32;;3896:456::o;4546:160::-;4611:20;;4667:13;;4660:21;4650:32;;4640:60;;4696:1;4693;4686:12;4711:687;4813:6;4821;4829;4837;4845;4853;4906:3;4894:9;4885:7;4881:23;4877:33;4874:53;;;4923:1;4920;4913:12;4874:53;4946:28;4964:9;4946:28;:::i;:::-;4936:38;;5021:2;5010:9;5006:18;4993:32;4983:42;;5072:2;5061:9;5057:18;5044:32;5034:42;;5095:35;5126:2;5115:9;5111:18;5095:35;:::i;:::-;5085:45;;5181:3;5170:9;5166:19;5153:33;-1:-1:-1;;;;;5201:6:1;5198:30;5195:50;;;5241:1;5238;5231:12;5195:50;5280:58;5330:7;5321:6;5310:9;5306:22;5280:58;:::i;5656:481::-;5734:6;5742;5750;5803:2;5791:9;5782:7;5778:23;5774:32;5771:52;;;5819:1;5816;5809:12;5771:52;5842:28;5860:9;5842:28;:::i;:::-;5832:38;;5921:2;5910:9;5906:18;5893:32;-1:-1:-1;;;;;5940:6:1;5937:30;5934:50;;;5980:1;5977;5970:12;5934:50;6019:58;6069:7;6060:6;6049:9;6045:22;6019:58;:::i;:::-;5656:481;;6096:8;;-1:-1:-1;5993:84:1;;-1:-1:-1;;;;5656:481:1:o;6142:127::-;6203:10;6198:3;6194:20;6191:1;6184:31;6234:4;6231:1;6224:15;6258:4;6255:1;6248:15;6274:275;6345:2;6339:9;6410:2;6391:13;;-1:-1:-1;;6387:27:1;6375:40;;-1:-1:-1;;;;;6430:34:1;;6466:22;;;6427:62;6424:88;;;6492:18;;:::i;:::-;6528:2;6521:22;6274:275;;-1:-1:-1;6274:275:1:o;6554:186::-;6602:4;-1:-1:-1;;;;;6627:6:1;6624:30;6621:56;;;6657:18;;:::i;:::-;-1:-1:-1;6723:2:1;6702:15;-1:-1:-1;;6698:29:1;6729:4;6694:40;;6554:186::o;6745:815::-;6829:6;6837;6845;6898:2;6886:9;6877:7;6873:23;6869:32;6866:52;;;6914:1;6911;6904:12;6866:52;6937:28;6955:9;6937:28;:::i;:::-;6927:38;;7016:2;7005:9;7001:18;6988:32;-1:-1:-1;;;;;7035:6:1;7032:30;7029:50;;;7075:1;7072;7065:12;7029:50;7098:22;;7151:4;7143:13;;7139:27;-1:-1:-1;7129:55:1;;7180:1;7177;7170:12;7129:55;7216:2;7203:16;7241:48;7257:31;7285:2;7257:31;:::i;:::-;7241:48;:::i;:::-;7312:2;7305:5;7298:17;7352:7;7347:2;7342;7338;7334:11;7330:20;7327:33;7324:53;;;7373:1;7370;7363:12;7324:53;7428:2;7423;7419;7415:11;7410:2;7403:5;7399:14;7386:45;7472:1;7467:2;7462;7455:5;7451:14;7447:23;7440:34;7493:5;7483:15;;;;;7517:37;7550:2;7539:9;7535:18;7517:37;:::i;:::-;7507:47;;6745:815;;;;;:::o;7747:160::-;7812:5;7857:2;7848:6;7843:3;7839:16;7835:25;7832:45;;;7873:1;7870;7863:12;7832:45;-1:-1:-1;7895:6:1;7747:160;-1:-1:-1;7747:160:1:o;7912:711::-;8038:6;8046;8054;8062;8070;8123:3;8111:9;8102:7;8098:23;8094:33;8091:53;;;8140:1;8137;8130:12;8091:53;8179:9;8166:23;8198:31;8223:5;8198:31;:::i;:::-;8248:5;-1:-1:-1;8272:37:1;8305:2;8290:18;;8272:37;:::i;:::-;8262:47;;8356:2;8345:9;8341:18;8328:32;8318:42;;8407:2;8396:9;8392:18;8379:32;8369:42;;8462:3;8451:9;8447:19;8434:33;-1:-1:-1;;;;;8482:6:1;8479:30;8476:50;;;8522:1;8519;8512:12;8476:50;8545:72;8609:7;8600:6;8589:9;8585:22;8545:72;:::i;:::-;8535:82;;;7912:711;;;;;;;;:::o;8628:247::-;8687:6;8740:2;8728:9;8719:7;8715:23;8711:32;8708:52;;;8756:1;8753;8746:12;8708:52;8795:9;8782:23;8814:31;8839:5;8814:31;:::i;9103:1093::-;9257:6;9265;9273;9281;9289;9297;9305;9313;9366:3;9354:9;9345:7;9341:23;9337:33;9334:53;;;9383:1;9380;9373:12;9334:53;9422:9;9409:23;9441:31;9466:5;9441:31;:::i;:::-;9491:5;-1:-1:-1;9515:37:1;9548:2;9533:18;;9515:37;:::i;:::-;9505:47;;9599:2;9588:9;9584:18;9571:32;9561:42;;9650:2;9639:9;9635:18;9622:32;9612:42;;9705:3;9694:9;9690:19;9677:33;-1:-1:-1;;;;;9770:2:1;9762:6;9759:14;9756:34;;;9786:1;9783;9776:12;9756:34;9825:58;9875:7;9866:6;9855:9;9851:22;9825:58;:::i;:::-;9902:8;;-1:-1:-1;9799:84:1;-1:-1:-1;9799:84:1;;-1:-1:-1;9956:38:1;9989:3;9974:19;;9956:38;:::i;:::-;9946:48;;10047:3;10036:9;10032:19;10019:33;10003:49;;10077:2;10067:8;10064:16;10061:36;;;10093:1;10090;10083:12;10061:36;;10116:74;10182:7;10171:8;10160:9;10156:24;10116:74;:::i;:::-;10106:84;;;9103:1093;;;;;;;;;;;:::o;10201:256::-;10267:6;10275;10328:2;10316:9;10307:7;10303:23;10299:32;10296:52;;;10344:1;10341;10334:12;10296:52;10367:28;10385:9;10367:28;:::i;:::-;10357:38;;10414:37;10447:2;10436:9;10432:18;10414:37;:::i;:::-;10404:47;;10201:256;;;;;:::o;10670:1069::-;10800:6;10808;10816;10824;10832;10840;10848;10856;10864;10917:3;10905:9;10896:7;10892:23;10888:33;10885:53;;;10934:1;10931;10924:12;10885:53;10957:28;10975:9;10957:28;:::i;:::-;10947:38;;11032:2;11021:9;11017:18;11004:32;10994:42;;11083:2;11072:9;11068:18;11055:32;11045:42;;11138:2;11127:9;11123:18;11110:32;-1:-1:-1;;;;;11202:2:1;11194:6;11191:14;11188:34;;;11218:1;11215;11208:12;11188:34;11257:58;11307:7;11298:6;11287:9;11283:22;11257:58;:::i;:::-;11334:8;;-1:-1:-1;11231:84:1;-1:-1:-1;11231:84:1;;-1:-1:-1;11388:38:1;11421:3;11406:19;;11388:38;:::i;:::-;11378:48;;11445:36;11476:3;11465:9;11461:19;11445:36;:::i;:::-;11435:46;;11534:3;11523:9;11519:19;11506:33;11490:49;;11564:2;11554:8;11551:16;11548:36;;;11580:1;11577;11570:12;11548:36;;11619:60;11671:7;11660:8;11649:9;11645:24;11619:60;:::i;:::-;11593:86;;11698:8;11688:18;;;11725:8;11715:18;;;10670:1069;;;;;;;;;;;:::o;11978:622::-;12073:6;12081;12089;12097;12105;12158:3;12146:9;12137:7;12133:23;12129:33;12126:53;;;12175:1;12172;12165:12;12126:53;12198:28;12216:9;12198:28;:::i;:::-;12188:38;;12245:37;12278:2;12267:9;12263:18;12245:37;:::i;:::-;12235:47;;12329:2;12318:9;12314:18;12301:32;12291:42;;12384:2;12373:9;12369:18;12356:32;-1:-1:-1;;;;;12403:6:1;12400:30;12397:50;;;12443:1;12440;12433:12;12397:50;12482:58;12532:7;12523:6;12512:9;12508:22;12482:58;:::i;:::-;11978:622;;;;-1:-1:-1;11978:622:1;;-1:-1:-1;12559:8:1;;12456:84;11978:622;-1:-1:-1;;;11978:622:1:o;12605:388::-;12673:6;12681;12734:2;12722:9;12713:7;12709:23;12705:32;12702:52;;;12750:1;12747;12740:12;12702:52;12789:9;12776:23;12808:31;12833:5;12808:31;:::i;:::-;12858:5;-1:-1:-1;12915:2:1;12900:18;;12887:32;12928:33;12887:32;12928:33;:::i;:::-;12980:7;12970:17;;;12605:388;;;;;:::o;12998:324::-;13073:6;13081;13089;13142:2;13130:9;13121:7;13117:23;13113:32;13110:52;;;13158:1;13155;13148:12;13110:52;13181:28;13199:9;13181:28;:::i;:::-;13171:38;;13228:37;13261:2;13250:9;13246:18;13228:37;:::i;:::-;13218:47;;13312:2;13301:9;13297:18;13284:32;13274:42;;12998:324;;;;;:::o;13327:1205::-;13469:6;13477;13485;13493;13501;13509;13517;13525;13533;13541;13594:3;13582:9;13573:7;13569:23;13565:33;13562:53;;;13611:1;13608;13601:12;13562:53;13634:28;13652:9;13634:28;:::i;:::-;13624:38;;13713:2;13702:9;13698:18;13685:32;-1:-1:-1;;;;;13777:2:1;13769:6;13766:14;13763:34;;;13793:1;13790;13783:12;13763:34;13832:58;13882:7;13873:6;13862:9;13858:22;13832:58;:::i;:::-;13909:8;;-1:-1:-1;13806:84:1;-1:-1:-1;13806:84:1;;-1:-1:-1;13963:37:1;13996:2;13981:18;;13963:37;:::i;:::-;13953:47;;14047:2;14036:9;14032:18;14019:32;14009:42;;14101:3;14090:9;14086:19;14073:33;14060:46;;14115:31;14140:5;14115:31;:::i;:::-;14165:5;;-1:-1:-1;14217:3:1;14202:19;;14189:33;;-1:-1:-1;14275:3:1;14260:19;;14247:33;;14292:16;;;14289:36;;;14321:1;14318;14311:12;14289:36;;14360:60;14412:7;14401:8;14390:9;14386:24;14360:60;:::i;:::-;14334:86;;14439:8;14429:18;;;14466:8;14456:18;;;14521:3;14510:9;14506:19;14493:33;14483:43;;13327:1205;;;;;;;;;;;;;:::o;14537:460::-;14621:6;14629;14637;14645;14698:3;14686:9;14677:7;14673:23;14669:33;14666:53;;;14715:1;14712;14705:12;14666:53;14738:28;14756:9;14738:28;:::i;:::-;14728:38;;14785:37;14818:2;14807:9;14803:18;14785:37;:::i;:::-;14775:47;;14872:2;14861:9;14857:18;14844:32;14885:31;14910:5;14885:31;:::i;:::-;14537:460;;;;-1:-1:-1;14935:5:1;;14987:2;14972:18;14959:32;;-1:-1:-1;;14537:460:1:o;15361:380::-;15440:1;15436:12;;;;15483;;;15504:61;;15558:4;15550:6;15546:17;15536:27;;15504:61;15611:2;15603:6;15600:14;15580:18;15577:38;15574:161;;15657:10;15652:3;15648:20;15645:1;15638:31;15692:4;15689:1;15682:15;15720:4;15717:1;15710:15;15746:271;15929:6;15921;15916:3;15903:33;15885:3;15955:16;;15980:13;;;15955:16;15746:271;-1:-1:-1;15746:271:1:o;16622:127::-;16683:10;16678:3;16674:20;16671:1;16664:31;16714:4;16711:1;16704:15;16738:4;16735:1;16728:15;16754:125;16819:9;;;16840:10;;;16837:36;;;16853:18;;:::i;16884:266::-;16972:6;16967:3;16960:19;17024:6;17017:5;17010:4;17005:3;17001:14;16988:43;-1:-1:-1;17076:1:1;17051:16;;;17069:4;17047:27;;;17040:38;;;;17132:2;17111:15;;;-1:-1:-1;;17107:29:1;17098:39;;;17094:50;;16884:266::o;17155:326::-;17350:6;17342;17338:19;17327:9;17320:38;17394:2;17389;17378:9;17374:18;17367:30;17301:4;17414:61;17471:2;17460:9;17456:18;17448:6;17440;17414:61;:::i;18153:521::-;18230:4;18236:6;18296:11;18283:25;18390:2;18386:7;18375:8;18359:14;18355:29;18351:43;18331:18;18327:68;18317:96;;18409:1;18406;18399:12;18317:96;18436:33;;18488:20;;;-1:-1:-1;;;;;;18520:30:1;;18517:50;;;18563:1;18560;18553:12;18517:50;18596:4;18584:17;;-1:-1:-1;18627:14:1;18623:27;;;18613:38;;18610:58;;;18664:1;18661;18654:12;19037:128;19104:9;;;19125:11;;;19122:37;;;19139:18;;:::i;19576:360::-;19787:6;19779;19774:3;19761:33;19857:2;19853:15;;;;-1:-1:-1;;19849:53:1;19813:16;;19838:65;;;19927:2;19919:11;;19576:360;-1:-1:-1;19576:360:1:o;20066:544::-;20167:2;20162:3;20159:11;20156:448;;;20203:1;20228:5;20224:2;20217:17;20273:4;20269:2;20259:19;20343:2;20331:10;20327:19;20324:1;20320:27;20314:4;20310:38;20379:4;20367:10;20364:20;20361:47;;;-1:-1:-1;20402:4:1;20361:47;20457:2;20452:3;20448:12;20445:1;20441:20;20435:4;20431:31;20421:41;;20512:82;20530:2;20523:5;20520:13;20512:82;;;20575:17;;;20556:1;20545:13;20512:82;;20786:1348;20910:3;20904:10;-1:-1:-1;;;;;20929:6:1;20926:30;20923:56;;;20959:18;;:::i;:::-;20988:96;21077:6;21037:38;21069:4;21063:11;21037:38;:::i;:::-;21031:4;20988:96;:::i;:::-;21139:4;;21203:2;21192:14;;21220:1;21215:662;;;;21921:1;21938:6;21935:89;;;-1:-1:-1;21990:19:1;;;21984:26;21935:89;-1:-1:-1;;20743:1:1;20739:11;;;20735:24;20731:29;20721:40;20767:1;20763:11;;;20718:57;22037:81;;21185:943;;21215:662;20013:1;20006:14;;;20050:4;20037:18;;-1:-1:-1;;21251:20:1;;;21368:236;21382:7;21379:1;21376:14;21368:236;;;21471:19;;;21465:26;21450:42;;21563:27;;;;21531:1;21519:14;;;;21398:19;;21368:236;;;21372:3;21632:6;21623:7;21620:19;21617:201;;;21693:19;;;21687:26;-1:-1:-1;;21776:1:1;21772:14;;;21788:3;21768:24;21764:37;21760:42;21745:58;21730:74;;21617:201;-1:-1:-1;;;;;21864:1:1;21848:14;;;21844:22;21831:36;;-1:-1:-1;20786:1348:1:o;22139:498::-;22339:4;22368:6;22413:2;22405:6;22401:15;22390:9;22383:34;22465:2;22457:6;22453:15;22448:2;22437:9;22433:18;22426:43;;22505:6;22500:2;22489:9;22485:18;22478:34;22548:3;22543:2;22532:9;22528:18;22521:31;22569:62;22626:3;22615:9;22611:19;22603:6;22595;22569:62;:::i;:::-;22561:70;22139:498;-1:-1:-1;;;;;;;22139:498:1:o;23448:493::-;23697:6;23689;23685:19;23674:9;23667:38;23741:3;23736:2;23725:9;23721:18;23714:31;23648:4;23762:62;23819:3;23808:9;23804:19;23796:6;23788;23762:62;:::i;:::-;-1:-1:-1;;;;;23860:31:1;;;;23855:2;23840:18;;23833:59;-1:-1:-1;23923:2:1;23908:18;23901:34;23754:70;23448:493;-1:-1:-1;;;23448:493:1:o;24669:753::-;25002:6;24994;24990:19;24979:9;24972:38;25046:3;25041:2;25030:9;25026:18;25019:31;24953:4;25073:62;25130:3;25119:9;25115:19;25107:6;25099;25073:62;:::i;:::-;-1:-1:-1;;;;;25175:6:1;25171:31;25166:2;25155:9;25151:18;25144:59;25239:6;25234:2;25223:9;25219:18;25212:34;25283:6;25277:3;25266:9;25262:19;25255:35;25339:9;25331:6;25327:22;25321:3;25310:9;25306:19;25299:51;25367:49;25409:6;25401;25393;25367:49;:::i;:::-;25359:57;24669:753;-1:-1:-1;;;;;;;;;;;24669:753:1:o;25427:1202::-;-1:-1:-1;;;;;25544:3:1;25541:27;25538:53;;;25571:18;;:::i;:::-;25600:93;25689:3;25649:38;25681:4;25675:11;25649:38;:::i;:::-;25643:4;25600:93;:::i;:::-;25719:1;25744:2;25739:3;25736:11;25761:1;25756:615;;;;26415:1;26432:3;26429:93;;;-1:-1:-1;26488:19:1;;;26475:33;26429:93;-1:-1:-1;;20743:1:1;20739:11;;;20735:24;20731:29;20721:40;20767:1;20763:11;;;20718:57;26535:78;;25729:894;;25756:615;20013:1;20006:14;;;20050:4;20037:18;;-1:-1:-1;;25792:17:1;;;25892:9;25914:229;25928:7;25925:1;25922:14;25914:229;;;26017:19;;;26004:33;25989:49;;26124:4;26109:20;;;;26077:1;26065:14;;;;25944:12;25914:229;;;25918:3;26171;26162:7;26159:16;26156:159;;;26295:1;26291:6;26285:3;26279;26276:1;26272:11;26268:21;26264:34;26260:39;26247:9;26242:3;26238:19;26225:33;26221:79;26213:6;26206:95;26156:159;;;26358:1;26352:3;26349:1;26345:11;26341:19;26335:4;26328:33;25729:894;;25427:1202;;;:::o;27502:647::-;27581:6;27634:2;27622:9;27613:7;27609:23;27605:32;27602:52;;;27650:1;27647;27640:12;27602:52;27683:9;27677:16;-1:-1:-1;;;;;27708:6:1;27705:30;27702:50;;;27748:1;27745;27738:12;27702:50;27771:22;;27824:4;27816:13;;27812:27;-1:-1:-1;27802:55:1;;27853:1;27850;27843:12;27802:55;27882:2;27876:9;27907:48;27923:31;27951:2;27923:31;:::i;27907:48::-;27978:2;27971:5;27964:17;28018:7;28013:2;28008;28004;28000:11;27996:20;27993:33;27990:53;;;28039:1;28036;28029:12;27990:53;28052:67;28116:2;28111;28104:5;28100:14;28095:2;28091;28087:11;28052:67;:::i;28154:557::-;28411:6;28403;28399:19;28388:9;28381:38;28455:3;28450:2;28439:9;28435:18;28428:31;28362:4;28482:46;28523:3;28512:9;28508:19;28500:6;28482:46;:::i;:::-;-1:-1:-1;;;;;28568:6:1;28564:31;28559:2;28548:9;28544:18;28537:59;28644:9;28636:6;28632:22;28627:2;28616:9;28612:18;28605:50;28672:33;28698:6;28690;28672:33;:::i;31460:642::-;31741:6;31729:19;;31711:38;;-1:-1:-1;;;;;31785:32:1;;31780:2;31765:18;;31758:60;31805:3;31849:2;31834:18;;31827:31;;;-1:-1:-1;;31881:46:1;;31907:19;;31899:6;31881:46;:::i;:::-;31977:6;31970:14;31963:22;31958:2;31947:9;31943:18;31936:50;32035:9;32027:6;32023:22;32017:3;32006:9;32002:19;31995:51;32063:33;32089:6;32081;32063:33;:::i;:::-;32055:41;31460:642;-1:-1:-1;;;;;;;;31460:642:1:o;32107:245::-;32186:6;32194;32247:2;32235:9;32226:7;32222:23;32218:32;32215:52;;;32263:1;32260;32253:12;32215:52;-1:-1:-1;;32286:16:1;;32342:2;32327:18;;;32321:25;32286:16;;32321:25;;-1:-1:-1;32107:245:1:o;33757:287::-;33886:3;33924:6;33918:13;33940:66;33999:6;33994:3;33987:4;33979:6;33975:17;33940:66;:::i;:::-;34022:16;;;;;33757:287;-1:-1:-1;;33757:287:1:o;34049:719::-;34352:6;34344;34340:19;34329:9;34322:38;34396:3;34391:2;34380:9;34376:18;34369:31;34303:4;34423:46;34464:3;34453:9;34449:19;34441:6;34423:46;:::i;:::-;-1:-1:-1;;;;;34509:6:1;34505:31;34500:2;34489:9;34485:18;34478:59;34585:9;34577:6;34573:22;34568:2;34557:9;34553:18;34546:50;34619:33;34645:6;34637;34619:33;:::i;:::-;34605:47;;34701:9;34693:6;34689:22;34683:3;34672:9;34668:19;34661:51;34729:33;34755:6;34747;34729:33;:::i;34773:127::-;34834:10;34829:3;34825:20;34822:1;34815:31;34865:4;34862:1;34855:15;34889:4;34886:1;34879:15;34905:120;34945:1;34971;34961:35;;34976:18;;:::i;:::-;-1:-1:-1;35010:9:1;;34905:120::o;36118:891::-;36438:4;36467:3;36509:6;36501;36497:19;36486:9;36479:38;36553:2;36548;36537:9;36533:18;36526:30;36579:45;36620:2;36609:9;36605:18;36597:6;36579:45;:::i;:::-;-1:-1:-1;;;;;36660:31:1;;36655:2;36640:18;;36633:59;36723:2;36708:18;;36701:34;;;-1:-1:-1;;;;;36772:32:1;;36766:3;36751:19;;36744:61;36792:3;36821:19;;36814:35;;;36886:22;;;36880:3;36865:19;;36858:51;36565:59;-1:-1:-1;36926:33:1;36565:59;36944:6;36926:33;:::i;:::-;36918:41;;;36996:6;36990:3;36979:9;36975:19;36968:35;36118:891;;;;;;;;;;;:::o;37014:383::-;37215:2;37204:9;37197:21;37178:4;37235:45;37276:2;37265:9;37261:18;37253:6;37235:45;:::i;:::-;-1:-1:-1;;;;;37316:31:1;;;;37311:2;37296:18;;37289:59;-1:-1:-1;37379:2:1;37364:18;37357:34;37227:53;37014:383;-1:-1:-1;37014:383:1:o;38113:112::-;38145:1;38171;38161:35;;38176:18;;:::i;:::-;-1:-1:-1;38210:9:1;;38113:112::o;38647:840::-;38996:6;38988;38984:19;38973:9;38966:38;39040:3;39035:2;39024:9;39020:18;39013:31;38947:4;39067:46;39108:3;39097:9;39093:19;39085:6;39067:46;:::i;:::-;39161:9;39153:6;39149:22;39144:2;39133:9;39129:18;39122:50;39195:33;39221:6;39213;39195:33;:::i;:::-;-1:-1:-1;;;;;39302:15:1;;;39297:2;39282:18;;39275:43;39355:15;;39349:3;39334:19;;39327:44;39408:22;;;39255:3;39387:19;;39380:51;39181:47;-1:-1:-1;39448:33:1;39181:47;39466:6;39448:33;:::i;:::-;39440:41;38647:840;-1:-1:-1;;;;;;;;;38647:840:1:o;39492:727::-;39814:3;39809;39805:13;39796:6;39791:3;39787:16;39783:36;39778:3;39771:49;39849:6;39845:1;39840:3;39836:11;39829:27;39753:3;-1:-1:-1;;;;;39879:3:1;39875:28;39955:2;39946:6;39941:3;39937:16;39933:25;39928:2;39923:3;39919:12;39912:47;39989:6;39984:2;39979:3;39975:12;39968:28;40048:2;40039:6;40034:3;40030:16;40026:25;40021:2;40016:3;40012:12;40005:47;;40081:6;40075:13;40097:75;40165:6;40160:2;40155:3;40151:12;40144:4;40136:6;40132:17;40097:75;:::i;:::-;40192:16;;;;40210:2;40188:25;;39492:727;-1:-1:-1;;;;;;;39492:727:1:o;40577:168::-;40650:9;;;40681;;40698:15;;;40692:22;;40678:37;40668:71;;40719:18;;:::i

Swarm Source

ipfs://f3bed692b28b2aecba06d87914e6ce298241a1f2c207daf9b18731c69ebb290c
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.