ERC-20
DeFi
Overview
Max Total Supply
19,044,151.176489 CAD
Holders
1,392 ( 0.072%)
Market
Price
$0.13 @ 0.000053 ETH (+0.73%)
Onchain Market Cap
$2,535,535.30
Circulating Supply Market Cap
$0.00
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
CadenceOFTV2
Compiler Version
v0.8.19+commit.7dd6d404
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
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}]
Contract Creation Code
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.