Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 158 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Send From | 20676291 | 92 days ago | IN | 0.00037006 ETH | 0.00040851 | ||||
Send From | 20188321 | 160 days ago | IN | 0.0002588 ETH | 0.00072636 | ||||
Send From | 19855212 | 207 days ago | IN | 0.00030499 ETH | 0.00088123 | ||||
Send From | 19849845 | 208 days ago | IN | 0.00030499 ETH | 0.0007667 | ||||
Send From | 19059746 | 318 days ago | IN | 0.00035829 ETH | 0.00255952 | ||||
Send From | 19017048 | 324 days ago | IN | 0.00035847 ETH | 0.007245 | ||||
Send From | 19011078 | 325 days ago | IN | 0.00035861 ETH | 0.00387147 | ||||
Send From | 18851081 | 348 days ago | IN | 0.00042886 ETH | 0.00505427 | ||||
Send From | 18843988 | 349 days ago | IN | 0.0003976 ETH | 0.00696619 | ||||
Send From | 18527312 | 393 days ago | IN | 0.00049888 ETH | 0.00559337 | ||||
Send From | 18505209 | 396 days ago | IN | 0.00049739 ETH | 0.00373627 | ||||
Send From | 18498834 | 397 days ago | IN | 0.00049739 ETH | 0.00495314 | ||||
Send From | 18479896 | 400 days ago | IN | 0.00049652 ETH | 0.00928852 | ||||
Send From | 18458121 | 403 days ago | IN | 0.00049652 ETH | 0.00338514 | ||||
Send From | 18214656 | 437 days ago | IN | 0.00064793 ETH | 0.00234241 | ||||
Send From | 18185142 | 441 days ago | IN | 0.00056841 ETH | 0.00270765 | ||||
Send From | 18175572 | 442 days ago | IN | 0.00056841 ETH | 0.00206226 | ||||
Send From | 18171980 | 443 days ago | IN | 0.00056841 ETH | 0.00404804 | ||||
Send From | 18170114 | 443 days ago | IN | 0.00056841 ETH | 0.00293063 | ||||
Send From | 18088889 | 454 days ago | IN | 0.00056636 ETH | 0.0026325 | ||||
Send From | 18069288 | 457 days ago | IN | 0.00056636 ETH | 0.00238085 | ||||
Send From | 18018684 | 464 days ago | IN | 0.00055575 ETH | 0.00336831 | ||||
Send From | 17979009 | 470 days ago | IN | 0.00055575 ETH | 0.00779316 | ||||
Send From | 17961644 | 472 days ago | IN | 0.00055575 ETH | 0.00288242 | ||||
Send From | 17801764 | 495 days ago | IN | 0.00046494 ETH | 0.00587463 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
20676291 | 92 days ago | 0.00037006 ETH | ||||
20188321 | 160 days ago | 0.0002588 ETH | ||||
19855212 | 207 days ago | 0.00030499 ETH | ||||
19849845 | 208 days ago | 0.00030499 ETH | ||||
19059746 | 318 days ago | 0.00035829 ETH | ||||
19017048 | 324 days ago | 0.00035847 ETH | ||||
19011078 | 325 days ago | 0.00035861 ETH | ||||
18851081 | 348 days ago | 0.00042886 ETH | ||||
18843988 | 349 days ago | 0.0003976 ETH | ||||
18527312 | 393 days ago | 0.00049888 ETH | ||||
18505209 | 396 days ago | 0.00049739 ETH | ||||
18498834 | 397 days ago | 0.00049739 ETH | ||||
18479896 | 400 days ago | 0.00049652 ETH | ||||
18458121 | 403 days ago | 0.00049652 ETH | ||||
18214656 | 437 days ago | 0.00064793 ETH | ||||
18185142 | 441 days ago | 0.00056841 ETH | ||||
18175572 | 442 days ago | 0.00056841 ETH | ||||
18171980 | 443 days ago | 0.00056841 ETH | ||||
18170114 | 443 days ago | 0.00056841 ETH | ||||
18088889 | 454 days ago | 0.00056636 ETH | ||||
18069288 | 457 days ago | 0.00056636 ETH | ||||
18018684 | 464 days ago | 0.00055575 ETH | ||||
17979009 | 470 days ago | 0.00055575 ETH | ||||
17961644 | 472 days ago | 0.00055575 ETH | ||||
17801764 | 495 days ago | 0.00046494 ETH |
Loading...
Loading
Contract Name:
LayerZeroPipe
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.7; import "./IERC165.sol"; import "./OFTCore.sol"; import "./AuthAdmin.sol"; import "./IOFT.sol"; interface d2OLike { function decreaseAllowanceAdmin(address owner, address spender, uint256 subtractedValue) external returns (bool); function totalSupply() external view returns (uint256 supply); function burn(address,uint256) external; function mintAndDelay(address,uint256) external; } contract LayerZeroPipe is OFTCore, IOFT, AuthAdmin("LayerZeroPipe", msg.sender) { address public immutable d2OContract; event MintLayerZero(address indexed from, uint256 amount, uint16 _srcChainId); event BurnLayerZero(address indexed from, uint256 amount, uint16 _dstChainId); constructor(address _lzEndpoint, address _d2OContract) OFTCore(_lzEndpoint) { require(_lzEndpoint != address(0) && _d2OContract != address(0), "d2OConnectorLZ/invalid address"); d2OContract = _d2OContract; } function supportsInterface(bytes4 interfaceId) public view virtual override(OFTCore, IERC165) returns (bool) { return interfaceId == type(IOFT).interfaceId || interfaceId == type(IERC20).interfaceId || super.supportsInterface(interfaceId); } function circulatingSupply() public view virtual override returns (uint) { return d2OLike(d2OContract).totalSupply(); } function _debitFrom(address _from, uint16 _dstChainId, bytes memory, uint _amount) internal virtual override alive { address spender = _msgSender(); if (_from != spender) { require(d2OLike(d2OContract).decreaseAllowanceAdmin(_from, spender, _amount),"d2OConnectorLZ/Must have proper allowance"); } d2OLike(d2OContract).burn(_from, _amount); emit BurnLayerZero(_from, _amount, _dstChainId); } function _creditTo(uint16 _srcChainId, address _toAddress, uint _amount) internal virtual override alive { d2OLike(d2OContract).mintAndDelay(_toAddress, _amount); emit MintLayerZero(_toAddress, _amount, _srcChainId); } function setTrustedRemoteAuth(uint16 _srcChainId, bytes calldata _path) external auth { trustedRemoteLookup[_srcChainId] = _path; emit SetTrustedRemote(_srcChainId, _path); } function setTrustedRemoteAddressAuth(uint16 _remoteChainId, bytes calldata _remoteAddress) external auth { trustedRemoteLookup[_remoteChainId] = abi.encodePacked(_remoteAddress, address(this)); emit SetTrustedRemoteAddress(_remoteChainId, _remoteAddress); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.7; contract AuthAdmin { string private parentContractName; address public ArchAdmin; mapping (address => uint256) public admins; uint256 public live; event Rely(address indexed usr); event Deny(address indexed usr); event Cage(uint256 live); modifier auth { require(admins[msg.sender] == 1, string.concat(parentContractName, "/not-authorized")); _; } modifier alive { require(live == 1, string.concat(parentContractName, "/not-live")); _; } constructor(string memory contractName, address deployer) { parentContractName = contractName; live = 1; admins[deployer] = 1; ArchAdmin = deployer; emit Rely(deployer); } function setArchAdmin(address newArch) external auth { require(ArchAdmin == msg.sender && newArch != address(0), string.concat(parentContractName, "/Must be ArchAdmin")); ArchAdmin = newArch; admins[ArchAdmin] = 1; } function rely(address usr) external auth { admins[usr] = 1; emit Rely(usr); } function deny(address usr) external auth { require(usr != ArchAdmin, string.concat(parentContractName, "/ArchAdmin cannot lose admin - update ArchAdmin to another address")); admins[usr] = 0; emit Deny(usr); } function cage(uint256 _live) external auth { live = _live; emit Cage(_live); } }
// SPDX-License-Identifier: Unlicense /* * @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. */ pragma solidity >=0.8.0 <0.9.0; 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, uint256 _start, uint256 _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, uint256 _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, uint256 _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, uint256 _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, uint256 _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, uint256 _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, uint256 _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, uint256 _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, uint256 _start) internal pure returns (uint256) { require(_bytes.length >= _start + 32, "toUint256_outOfBounds"); uint256 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x20), _start)) } return tempUint; } function toBytes32(bytes memory _bytes, uint256 _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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.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; } }
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity >=0.7.6; library ExcessivelySafeCall { uint256 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, uint256 _gas, uint16 _maxCopy, bytes memory _calldata ) internal returns (bool, bytes memory) { // set up for assembly call uint256 _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, uint256 _gas, uint16 _maxCopy, bytes memory _calldata ) internal view returns (bool, bytes memory) { // set up for assembly call uint256 _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); uint256 _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) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @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); }
// SPDX-License-Identifier: MIT pragma solidity >=0.5.0; import "./ILayerZeroUserApplicationConfig.sol"; 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); }
// SPDX-License-Identifier: MIT pragma solidity >=0.5.0; 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; }
// SPDX-License-Identifier: MIT pragma solidity >=0.5.0; 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; }
// SPDX-License-Identifier: MIT pragma solidity >=0.5.0; import "./IOFTCore.sol"; /** * @dev Interface of the OFT standard */ interface IOFT is IOFTCore { }
// SPDX-License-Identifier: MIT pragma solidity >=0.5.0; import "./IERC20.sol"; import "./IERC165.sol"; /** * @dev Interface of the IOFT core standard */ interface IOFTCore is IERC165 { /** * @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, bytes calldata _toAddress, uint _amount, bool _useZro, bytes calldata _adapterParams) external view returns (uint nativeFee, uint zroFee); /** * @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, bytes calldata _toAddress, uint _amount, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable; /** * @dev returns the circulating amount of tokens on current chain */ function circulatingSupply() external view returns (uint); /** * @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, bytes 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, bytes _fromAddress, address indexed _to, uint _amount); event SetUseCustomAdapterParams(bool _useCustomAdapterParams); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Ownable.sol"; import "./ILayerZeroReceiver.sol"; import "./ILayerZeroUserApplicationConfig.sol"; import "./ILayerZeroEndpoint.sol"; import "./BytesLib.sol"; /* * a generic LzReceiver implementation */ abstract contract LzApp is Ownable, ILayerZeroReceiver, ILayerZeroUserApplicationConfig { using BytesLib for bytes; ILayerZeroEndpoint public immutable lzEndpoint; mapping(uint16 => bytes) public trustedRemoteLookup; mapping(uint16 => mapping(uint16 => uint)) public minDstGasLookup; 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"); 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] + _extraGas; require(minGasLimit > 0, "LzApp: minGasLimit not set"); require(providedGasLimit >= minGasLimit, "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)) } } //---------------------------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 _srcChainId, bytes calldata _path) external onlyOwner { trustedRemoteLookup[_srcChainId] = _path; emit SetTrustedRemote(_srcChainId, _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 { require(_minGas > 0, "LzApp: invalid minGas"); minDstGasLookup[_dstChainId][_packetType] = _minGas; emit SetMinDstGas(_dstChainId, _packetType, _minGas); } //--------------------------- VIEW FUNCTION ---------------------------------------- function isTrustedRemote(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool) { bytes memory trustedSource = trustedRemoteLookup[_srcChainId]; return keccak256(trustedSource) == keccak256(_srcAddress); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./LzApp.sol"; import "./ExcessivelySafeCall.sol"; /* * 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)); // try-catch all errors/exceptions if (!success) { 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); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./NonblockingLzApp.sol"; import "./IOFTCore.sol"; import "./ERC165.sol"; abstract contract OFTCore is NonblockingLzApp, ERC165, IOFTCore { using BytesLib for bytes; uint public constant NO_EXTRA_GAS = 0; // packet type uint16 public constant PT_SEND = 0; bool public useCustomAdapterParams; constructor(address _lzEndpoint) NonblockingLzApp(_lzEndpoint) {} function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IOFTCore).interfaceId || super.supportsInterface(interfaceId); } function estimateSendFee(uint16 _dstChainId, bytes calldata _toAddress, uint _amount, bool _useZro, bytes calldata _adapterParams) public view virtual override returns (uint nativeFee, uint zroFee) { // mock the payload for sendFrom() bytes memory payload = abi.encode(PT_SEND, abi.encodePacked(msg.sender), _toAddress, _amount); return lzEndpoint.estimateFees(_dstChainId, address(this), payload, _useZro, _adapterParams); } function sendFrom(address _from, uint16 _dstChainId, bytes calldata _toAddress, uint _amount, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) public payable virtual override { _send(_from, _dstChainId, _toAddress, _amount, _refundAddress, _zroPaymentAddress, _adapterParams); } function setUseCustomAdapterParams(bool _useCustomAdapterParams) public virtual onlyOwner { useCustomAdapterParams = _useCustomAdapterParams; emit SetUseCustomAdapterParams(_useCustomAdapterParams); } function _nonblockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual override { uint16 packetType; assembly { packetType := mload(add(_payload, 32)) } if (packetType == PT_SEND) { _sendAck(_srcChainId, _srcAddress, _nonce, _payload); } else { revert("OFTCore: unknown packet type"); } } function _send(address _from, uint16 _dstChainId, bytes memory _toAddress, uint _amount, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams) internal virtual { _checkAdapterParams(_dstChainId, PT_SEND, _adapterParams, NO_EXTRA_GAS); _debitFrom(_from, _dstChainId, _toAddress, _amount); bytes memory lzPayload = abi.encode(PT_SEND, abi.encodePacked(_from), _toAddress, _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 { (, bytes memory from, bytes memory toAddressBytes, uint amount) = abi.decode(_payload, (uint16, bytes, bytes, uint)); address to = toAddressBytes.toAddress(0); _creditTo(_srcChainId, to, amount); emit ReceiveFromChain(_srcChainId, from, to, amount); } function _checkAdapterParams(uint16 _dstChainId, uint16 _pkType, bytes memory _adapterParams, uint _extraGas) internal virtual { if (useCustomAdapterParams) { _checkGasLimit(_dstChainId, _pkType, _adapterParams, _extraGas); } else { require(_adapterParams.length == 0, "OFTCore: _adapterParams must be empty."); } } function _debitFrom(address _from, uint16 _dstChainId, bytes memory _toAddress, uint _amount) internal virtual; function _creditTo(uint16 _srcChainId, address _toAddress, uint _amount) internal virtual; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _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 anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_lzEndpoint","type":"address"},{"internalType":"address","name":"_d2OContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint16","name":"_dstChainId","type":"uint16"}],"name":"BurnLayerZero","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"live","type":"uint256"}],"name":"Cage","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"usr","type":"address"}],"name":"Deny","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":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"}],"name":"MintLayerZero","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":false,"internalType":"bytes","name":"_fromAddress","type":"bytes"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"ReceiveFromChain","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"usr","type":"address"}],"name":"Rely","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":"bytes","name":"_toAddress","type":"bytes"},{"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":false,"internalType":"bool","name":"_useCustomAdapterParams","type":"bool"}],"name":"SetUseCustomAdapterParams","type":"event"},{"inputs":[],"name":"ArchAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"admins","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_live","type":"uint256"}],"name":"cage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"circulatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"d2OContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"usr","type":"address"}],"name":"deny","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_toAddress","type":"bytes"},{"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":"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":"live","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"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":[],"name":"precrime","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"usr","type":"address"}],"name":"rely","outputs":[],"stateMutability":"nonpayable","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":"bytes","name":"_toAddress","type":"bytes"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address payable","name":"_refundAddress","type":"address"},{"internalType":"address","name":"_zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"sendFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newArch","type":"address"}],"name":"setArchAdmin","outputs":[],"stateMutability":"nonpayable","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":"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":"_srcChainId","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":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"internalType":"bytes","name":"_remoteAddress","type":"bytes"}],"name":"setTrustedRemoteAddressAuth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_path","type":"bytes"}],"name":"setTrustedRemoteAuth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_useCustomAdapterParams","type":"bool"}],"name":"setUseCustomAdapterParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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"},{"inputs":[],"name":"useCustomAdapterParams","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c06040523480156200001157600080fd5b5060405162003d8038038062003d808339810160408190526200003491620001d6565b60408051808201909152600d81526c4c617965725a65726f5069706560981b602082015233838080620000678462000169565b6001600160a01b03166080525060069050620000848382620002b3565b50600160098190556001600160a01b03821660008181526008602052604080822093909355600780546001600160a01b03191683179055915190917fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a6091a250506001600160a01b038216158015906200010557506001600160a01b03811615155b620001565760405162461bcd60e51b815260206004820152601e60248201527f64324f436f6e6e6563746f724c5a2f696e76616c696420616464726573730000604482015260640160405180910390fd5b6001600160a01b031660a052506200037f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b0381168114620001d157600080fd5b919050565b60008060408385031215620001ea57600080fd5b620001f583620001b9565b91506200020560208401620001b9565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200023957607f821691505b6020821081036200025a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002ae57600081815260208120601f850160051c81016020861015620002895750805b601f850160051c820191505b81811015620002aa5782815560010162000295565b5050505b505050565b81516001600160401b03811115620002cf57620002cf6200020e565b620002e781620002e0845462000224565b8462000260565b602080601f8311600181146200031f5760008415620003065750858301515b600019600386901b1c1916600185901b178555620002aa565b600085815260208120601f198616915b8281101562000350578886015182559484019460019091019084016200032f565b50858210156200036f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051613987620003f9600039600081816106ee0152818161132e015281816123c8015281816124e601526129b80152600081816107220152818161085401528181610b5a01528181610bfc01528181610cbe01528181610e52015281816117d001528181611c8c01526126d501526139876000f3fe6080604052600436106102ba5760003560e01c80639358928b1161016e578063b353aaa7116100cb578063eab45d9c1161007f578063ed629c5c11610064578063ed629c5c146107f7578063f2fde38b14610811578063f5ecbdbc1461083157600080fd5b8063eab45d9c146107b7578063eb8d72b7146107d757600080fd5b8063cbed8b9c116100b0578063cbed8b9c14610764578063d1deba1f14610784578063df2a5b3b1461079757600080fd5b8063b353aaa714610710578063baf3292d1461074457600080fd5b80639f38369a11610122578063a6c3d16511610107578063a6c3d1651461069c578063aac5185c146106bc578063b1dc45b5146106dc57600080fd5b80639f38369a1461065c578063a2f91af21461067c57600080fd5b8063957aa58c11610153578063957aa58c146106065780639c52a7f11461061c5780639d8b53a91461063c57600080fd5b80639358928b146105d1578063950c8a74146105e657600080fd5b8063519056361161021c578063715018a6116101d05780638182c32e116101b55780638182c32e146105475780638cfd8f5c146105675780638da5cb5b1461059f57600080fd5b8063715018a6146105055780637533d7881461051a57600080fd5b8063622f082911610201578063622f0829146104a557806365fae35e146104c557806366ad5c8a146104e557600080fd5b806351905636146104435780635b8c41e61461045657600080fd5b80633d8b38f61161027357806342d65a8d1161025857806342d65a8d146103e657806344770515146104065780634c42899a1461041b57600080fd5b80633d8b38f61461038b578063429b62e5146103ab57600080fd5b806307e0db17116102a457806307e0db171461031657806310ddb137146103365780632a205e3d1461035657600080fd5b80621d3567146102bf57806301ffc9a7146102e1575b600080fd5b3480156102cb57600080fd5b506102df6102da366004612b32565b610851565b005b3480156102ed57600080fd5b506103016102fc366004612bc8565b610a99565b60405190151581526020015b60405180910390f35b34801561032257600080fd5b506102df610331366004612c0a565b610b20565b34801561034257600080fd5b506102df610351366004612c0a565b610bc2565b34801561036257600080fd5b50610376610371366004612c35565b610c33565b6040805192835260208301919091520161030d565b34801561039757600080fd5b506103016103a6366004612cd6565b610d4e565b3480156103b757600080fd5b506103d86103c6366004612d40565b60086020526000908152604090205481565b60405190815260200161030d565b3480156103f257600080fd5b506102df610401366004612cd6565b610e1a565b34801561041257600080fd5b506103d8600081565b34801561042757600080fd5b50610430600081565b60405161ffff909116815260200161030d565b6102df610451366004612d5d565b610eb9565b34801561046257600080fd5b506103d8610471366004612e96565b6004602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205481565b3480156104b157600080fd5b506102df6104c0366004612d40565b610f3e565b3480156104d157600080fd5b506102df6104e0366004612d40565b611037565b3480156104f157600080fd5b506102df610500366004612b32565b6110d3565b34801561051157600080fd5b506102df6111c6565b34801561052657600080fd5b5061053a610535366004612c0a565b6111da565b60405161030d9190612f89565b34801561055357600080fd5b506102df610562366004612cd6565b611274565b34801561057357600080fd5b506103d8610582366004612f9c565b600260209081526000928352604080842090915290825290205481565b3480156105ab57600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200161030d565b3480156105dd57600080fd5b506103d861132a565b3480156105f257600080fd5b506003546105b9906001600160a01b031681565b34801561061257600080fd5b506103d860095481565b34801561062857600080fd5b506102df610637366004612d40565b6113b3565b34801561064857600080fd5b506102df610657366004612cd6565b6114a4565b34801561066857600080fd5b5061053a610677366004612c0a565b61156f565b34801561068857600080fd5b506102df610697366004612fd5565b611685565b3480156106a857600080fd5b506102df6106b7366004612cd6565b611718565b3480156106c857600080fd5b506007546105b9906001600160a01b031681565b3480156106e857600080fd5b506105b97f000000000000000000000000000000000000000000000000000000000000000081565b34801561071c57600080fd5b506105b97f000000000000000000000000000000000000000000000000000000000000000081565b34801561075057600080fd5b506102df61075f366004612d40565b611735565b34801561077057600080fd5b506102df61077f366004612fee565b611798565b6102df610792366004612b32565b61183b565b3480156107a357600080fd5b506102df6107b2366004613061565b611a89565b3480156107c357600080fd5b506102df6107d23660046130a2565b611b43565b3480156107e357600080fd5b506102df6107f2366004612cd6565b611b8c565b34801561080357600080fd5b506005546103019060ff1681565b34801561081d57600080fd5b506102df61082c366004612d40565b611bb2565b34801561083d57600080fd5b5061053a61084c3660046130bf565b611c42565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146108ce5760405162461bcd60e51b815260206004820152601e60248201527f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c6572000060448201526064015b60405180910390fd5b61ffff8616600090815260016020526040812080546108ec90613110565b80601f016020809104026020016040519081016040528092919081815260200182805461091890613110565b80156109655780601f1061093a57610100808354040283529160200191610965565b820191906000526020600020905b81548152906001019060200180831161094857829003601f168201915b50505050509050805186869050148015610980575060008151115b80156109a857508051602082012060405161099e908890889061314a565b6040518091039020145b610a1a5760405162461bcd60e51b815260206004820152602660248201527f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084016108c5565b610a908787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a018190048102820181019092528881528a935091508890889081908401838280828437600092019190915250611d0c92505050565b50505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082161580610b0b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f36372b0700000000000000000000000000000000000000000000000000000000145b80610b1a5750610b1a82611e44565b92915050565b610b28611edb565b6040517f07e0db1700000000000000000000000000000000000000000000000000000000815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906307e0db17906024015b600060405180830381600087803b158015610ba757600080fd5b505af1158015610bbb573d6000803e3d6000fd5b5050505050565b610bca611edb565b6040517f10ddb13700000000000000000000000000000000000000000000000000000000815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906310ddb13790602401610b8d565b6040516bffffffffffffffffffffffff193360601b16602082015260009081908190819060340160408051601f1981840301815290829052610c7e92918c908c908c90602001613185565b60408051601f19818403018152908290527f40a7bb1000000000000000000000000000000000000000000000000000000000825291506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906340a7bb1090610cfd908d90309086908c908c908c906004016131c8565b6040805180830381865afa158015610d19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3d919061321c565b925092505097509795505050505050565b61ffff831660009081526001602052604081208054829190610d6f90613110565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9b90613110565b8015610de85780601f10610dbd57610100808354040283529160200191610de8565b820191906000526020600020905b815481529060010190602001808311610dcb57829003601f168201915b505050505090508383604051610dff92919061314a565b60405180910390208180519060200120149150509392505050565b610e22611edb565b6040517f42d65a8d0000000000000000000000000000000000000000000000000000000081526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906342d65a8d90610e8b90869086908690600401613240565b600060405180830381600087803b158015610ea557600080fd5b505af1158015610a90573d6000803e3d6000fd5b610f33898989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a018190048102820181019092528881528c93508b92508a918a908a9081908401838280828437600092019190915250611f3592505050565b505050505050505050565b33600090815260086020908152604091829020549151600190921491610f6791600691016132d1565b60405160208183030381529060405290610f945760405162461bcd60e51b81526004016108c59190612f89565b506007546001600160a01b031633148015610fb757506001600160a01b03811615155b6006604051602001610fc9919061330a565b60405160208183030381529060405290610ff65760405162461bcd60e51b81526004016108c59190612f89565b50600780546001600160a01b0390921673ffffffffffffffffffffffffffffffffffffffff1990921682179055600090815260086020526040902060019055565b3360009081526008602090815260409182902054915160019092149161106091600691016132d1565b6040516020818303038152906040529061108d5760405162461bcd60e51b81526004016108c59190612f89565b506001600160a01b03811660008181526008602052604080822060019055517fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a609190a250565b3330146111485760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d75737420626560448201527f204c7a417070000000000000000000000000000000000000000000000000000060648201526084016108c5565b6111be8686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f89018190048102820181019092528781528993509150879087908190840183828082843760009201919091525061201c92505050565b505050505050565b6111ce611edb565b6111d86000612083565b565b600160205260009081526040902080546111f390613110565b80601f016020809104026020016040519081016040528092919081815260200182805461121f90613110565b801561126c5780601f106112415761010080835404028352916020019161126c565b820191906000526020600020905b81548152906001019060200180831161124f57829003601f168201915b505050505081565b3360009081526008602090815260409182902054915160019092149161129d91600691016132d1565b604051602081830303815290604052906112ca5760405162461bcd60e51b81526004016108c59190612f89565b5061ffff831660009081526001602052604090206112e982848361338e565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab83838360405161131d93929190613240565b60405180910390a1505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561138a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ae919061344e565b905090565b336000908152600860209081526040918290205491516001909214916113dc91600691016132d1565b604051602081830303815290604052906114095760405162461bcd60e51b81526004016108c59190612f89565b506007546040516001600160a01b03838116921691909114159061143290600690602001613467565b6040516020818303038152906040529061145f5760405162461bcd60e51b81526004016108c59190612f89565b506001600160a01b038116600081815260086020526040808220829055517f184450df2e323acec0ed3b5c7531b81f9b4cdef7914dfd4c0a4317416bb5251b9190a250565b336000908152600860209081526040918290205491516001909214916114cd91600691016132d1565b604051602081830303815290604052906114fa5760405162461bcd60e51b81526004016108c59190612f89565b50818130604051602001611510939291906134ec565b60408051601f1981840301815291815261ffff851660009081526001602052209061153b9082613512565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce83838360405161131d93929190613240565b61ffff811660009081526001602052604081208054606092919061159290613110565b80601f01602080910402602001604051908101604052809291908181526020018280546115be90613110565b801561160b5780601f106115e05761010080835404028352916020019161160b565b820191906000526020600020905b8154815290600101906020018083116115ee57829003601f168201915b5050505050905080516000036116635760405162461bcd60e51b815260206004820152601d60248201527f4c7a4170703a206e6f20747275737465642070617468207265636f726400000060448201526064016108c5565b61167e60006014835161167691906135e8565b8391906120e0565b9392505050565b336000908152600860209081526040918290205491516001909214916116ae91600691016132d1565b604051602081830303815290604052906116db5760405162461bcd60e51b81526004016108c59190612f89565b5060098190556040518181527f8b2f35c645f75532175a00d9b4565154e45c8eb57ee0155e03d0958f3a4d4b89906020015b60405180910390a150565b611720611edb565b818130604051602001611510939291906134ec565b61173d611edb565b6003805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b9060200161170d565b6117a0611edb565b6040517fcbed8b9c0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063cbed8b9c9061180d90889088908890889088906004016135fb565b600060405180830381600087803b15801561182757600080fd5b505af1158015610f33573d6000803e3d6000fd5b61ffff8616600090815260046020526040808220905161185e908890889061314a565b908152604080516020928190038301902067ffffffffffffffff8716600090815292529020549050806118f95760405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201527f616765000000000000000000000000000000000000000000000000000000000060648201526084016108c5565b80838360405161190a92919061314a565b6040518091039020146119855760405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f6160448201527f640000000000000000000000000000000000000000000000000000000000000060648201526084016108c5565b61ffff871660009081526004602052604080822090516119a8908990899061314a565b908152604080516020928190038301812067ffffffffffffffff8916600090815290845282902093909355601f88018290048202830182019052868252611a41918991899089908190840183828082843760009201919091525050604080516020601f8a018190048102820181019092528881528a93509150889088908190840183828082843760009201919091525061201c92505050565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e58787878785604051611a78959493929190613634565b60405180910390a150505050505050565b611a91611edb565b60008111611ae15760405162461bcd60e51b815260206004820152601560248201527f4c7a4170703a20696e76616c6964206d696e476173000000000000000000000060448201526064016108c5565b61ffff83811660008181526002602090815260408083209487168084529482529182902085905581519283528201929092529081018290527f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac09060600161131d565b611b4b611edb565b6005805460ff19168215159081179091556040519081527f1584ad594a70cbe1e6515592e1272a987d922b097ead875069cebe8b40c004a49060200161170d565b611b94611edb565b61ffff831660009081526001602052604090206112e982848361338e565b611bba611edb565b6001600160a01b038116611c365760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108c5565b611c3f81612083565b50565b6040517ff5ecbdbc00000000000000000000000000000000000000000000000000000000815261ffff808616600483015284166024820152306044820152606481018290526060907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f5ecbdbc90608401600060405180830381865afa158015611cdb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d0391908101906136bd565b95945050505050565b600080611d9c5a60966366ad5c8a60e01b89898989604051602401611d3494939291906136f2565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915230929190612208565b91509150816111be578280519060200120600460008861ffff1661ffff16815260200190815260200160002086604051611dd69190613731565b90815260408051918290036020908101832067ffffffffffffffff89166000908152915220919091557fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c90611e34908890889088908890879061374d565b60405180910390a1505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fe8e89a80000000000000000000000000000000000000000000000000000000001480610b1a57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610b1a565b6000546001600160a01b031633146111d85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108c5565b611f43866000836000612293565b611f4f8787878761232a565b6040516bffffffffffffffffffffffff19606089901b166020820152600090819060340160408051601f1981840301815290829052611f959291899089906020016137ac565b6040516020818303038152906040529050611fb4878286868634612590565b85604051611fc29190613731565b6040518091039020886001600160a01b03168861ffff167f39a4c66499bcf4b56d79f0dde8ed7a9d4925a0df55825206b2b8531e202be0d08860405161200a91815260200190565b60405180910390a45050505050505050565b602081015161ffff811661203b5761203685858585612751565b610bbb565b60405162461bcd60e51b815260206004820152601c60248201527f4f4654436f72653a20756e6b6e6f776e207061636b657420747970650000000060448201526064016108c5565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060816120ee81601f6137ed565b101561213c5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016108c5565b61214682846137ed565b845110156121965760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016108c5565b6060821580156121b557604051915060008252602082016040526121ff565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156121ee5780518352602092830192016121d6565b5050858452601f01601f1916604052505b50949350505050565b6000606060008060008661ffff1667ffffffffffffffff81111561222e5761222e612e27565b6040519080825280601f01601f191660200182016040528015612258576020820181803683370190505b50905060008087516020890160008d8df191503d92508683111561227a578692505b828152826000602083013e909890975095505050505050565b60055460ff16156122af576122aa848484846127de565b612324565b8151156123245760405162461bcd60e51b815260206004820152602660248201527f4f4654436f72653a205f61646170746572506172616d73206d7573742062652060448201527f656d7074792e000000000000000000000000000000000000000000000000000060648201526084016108c5565b50505050565b60095460011460066040516020016123429190613800565b6040516020818303038152906040529061236f5760405162461bcd60e51b81526004016108c59190612f89565b50336001600160a01b03851681146124a7576040517f5314dc600000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301528281166024830152604482018490527f00000000000000000000000000000000000000000000000000000000000000001690635314dc60906064016020604051808303816000875af1158015612411573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124359190613839565b6124a75760405162461bcd60e51b815260206004820152602960248201527f64324f436f6e6e6563746f724c5a2f4d75737420686176652070726f7065722060448201527f616c6c6f77616e6365000000000000000000000000000000000000000000000060648201526084016108c5565b6040517f9dc29fac0000000000000000000000000000000000000000000000000000000081526001600160a01b038681166004830152602482018490527f00000000000000000000000000000000000000000000000000000000000000001690639dc29fac90604401600060405180830381600087803b15801561252a57600080fd5b505af115801561253e573d6000803e3d6000fd5b50506040805185815261ffff881660208201526001600160a01b03891693507faf30bc91dcb8592714146afe47ec9564891c7dd31614acd28be7ac5cc8e1a7a392500160405180910390a25050505050565b61ffff8616600090815260016020526040812080546125ae90613110565b80601f01602080910402602001604051908101604052809291908181526020018280546125da90613110565b80156126275780601f106125fc57610100808354040283529160200191612627565b820191906000526020600020905b81548152906001019060200180831161260a57829003601f168201915b5050505050905080516000036126a55760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201527f61207472757374656420736f757263650000000000000000000000000000000060648201526084016108c5565b6040517fc58031000000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c5803100908490612716908b9086908c908c908c908c90600401613856565b6000604051808303818588803b15801561272f57600080fd5b505af1158015612743573d6000803e3d6000fd5b505050505050505050505050565b60008060008380602001905181019061276a91906138b0565b919550935091506000905061277f83826128bd565b905061278c888284612933565b806001600160a01b03168861ffff167f776434b505c7beb3db155c58df6c88985bf7c31730767e43ec773005059fed7a86856040516127cc92919061392f565b60405180910390a35050505050505050565b60006127e983612a60565b61ffff80871660009081526002602090815260408083209389168352929052908120549192509061281b9084906137ed565b90506000811161286d5760405162461bcd60e51b815260206004820152601a60248201527f4c7a4170703a206d696e4761734c696d6974206e6f742073657400000000000060448201526064016108c5565b808210156111be5760405162461bcd60e51b815260206004820152601b60248201527f4c7a4170703a20676173206c696d697420697320746f6f206c6f77000000000060448201526064016108c5565b60006128ca8260146137ed565b8351101561291a5760405162461bcd60e51b815260206004820152601560248201527f746f416464726573735f6f75744f66426f756e6473000000000000000000000060448201526064016108c5565b5001602001516c01000000000000000000000000900490565b600954600114600660405160200161294b9190613800565b604051602081830303815290604052906129785760405162461bcd60e51b81526004016108c59190612f89565b506040517fe2cc65c70000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063e2cc65c790604401600060405180830381600087803b1580156129fc57600080fd5b505af1158015612a10573d6000803e3d6000fd5b50506040805184815261ffff871660208201526001600160a01b03861693507fa1a429a04b12e4c95492f8b3d0bf30e400cd4cc224dbb63904989896ea21cc3b92500160405180910390a2505050565b6000602282511015612ab45760405162461bcd60e51b815260206004820152601c60248201527f4c7a4170703a20696e76616c69642061646170746572506172616d730000000060448201526064016108c5565b506022015190565b61ffff81168114611c3f57600080fd5b60008083601f840112612ade57600080fd5b50813567ffffffffffffffff811115612af657600080fd5b602083019150836020828501011115612b0e57600080fd5b9250929050565b803567ffffffffffffffff81168114612b2d57600080fd5b919050565b60008060008060008060808789031215612b4b57600080fd5b8635612b5681612abc565b9550602087013567ffffffffffffffff80821115612b7357600080fd5b612b7f8a838b01612acc565b9097509550859150612b9360408a01612b15565b94506060890135915080821115612ba957600080fd5b50612bb689828a01612acc565b979a9699509497509295939492505050565b600060208284031215612bda57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461167e57600080fd5b600060208284031215612c1c57600080fd5b813561167e81612abc565b8015158114611c3f57600080fd5b600080600080600080600060a0888a031215612c5057600080fd5b8735612c5b81612abc565b9650602088013567ffffffffffffffff80821115612c7857600080fd5b612c848b838c01612acc565b909850965060408a0135955060608a01359150612ca082612c27565b90935060808901359080821115612cb657600080fd5b50612cc38a828b01612acc565b989b979a50959850939692959293505050565b600080600060408486031215612ceb57600080fd5b8335612cf681612abc565b9250602084013567ffffffffffffffff811115612d1257600080fd5b612d1e86828701612acc565b9497909650939450505050565b6001600160a01b0381168114611c3f57600080fd5b600060208284031215612d5257600080fd5b813561167e81612d2b565b600080600080600080600080600060e08a8c031215612d7b57600080fd5b8935612d8681612d2b565b985060208a0135612d9681612abc565b975060408a013567ffffffffffffffff80821115612db357600080fd5b612dbf8d838e01612acc565b909950975060608c0135965060808c01359150612ddb82612d2b565b90945060a08b013590612ded82612d2b565b90935060c08b01359080821115612e0357600080fd5b50612e108c828d01612acc565b915080935050809150509295985092959850929598565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612e6657612e66612e27565b604052919050565b600067ffffffffffffffff821115612e8857612e88612e27565b50601f01601f191660200190565b600080600060608486031215612eab57600080fd5b8335612eb681612abc565b9250602084013567ffffffffffffffff811115612ed257600080fd5b8401601f81018613612ee357600080fd5b8035612ef6612ef182612e6e565b612e3d565b818152876020838501011115612f0b57600080fd5b81602084016020830137600060208383010152809450505050612f3060408501612b15565b90509250925092565b60005b83811015612f54578181015183820152602001612f3c565b50506000910152565b60008151808452612f75816020860160208601612f39565b601f01601f19169290920160200192915050565b60208152600061167e6020830184612f5d565b60008060408385031215612faf57600080fd5b8235612fba81612abc565b91506020830135612fca81612abc565b809150509250929050565b600060208284031215612fe757600080fd5b5035919050565b60008060008060006080868803121561300657600080fd5b853561301181612abc565b9450602086013561302181612abc565b935060408601359250606086013567ffffffffffffffff81111561304457600080fd5b61305088828901612acc565b969995985093965092949392505050565b60008060006060848603121561307657600080fd5b833561308181612abc565b9250602084013561309181612abc565b929592945050506040919091013590565b6000602082840312156130b457600080fd5b813561167e81612c27565b600080600080608085870312156130d557600080fd5b84356130e081612abc565b935060208501356130f081612abc565b9250604085013561310081612d2b565b9396929550929360600135925050565b600181811c9082168061312457607f821691505b60208210810361314457634e487b7160e01b600052602260045260246000fd5b50919050565b8183823760009101908152919050565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b61ffff861681526080602082015260006131a26080830187612f5d565b82810360408401526131b581868861315a565b9150508260608301529695505050505050565b61ffff871681526001600160a01b038616602082015260a0604082015260006131f460a0830187612f5d565b8515156060840152828103608084015261320f81858761315a565b9998505050505050505050565b6000806040838503121561322f57600080fd5b505080516020909101519092909150565b61ffff84168152604060208201526000611d0360408301848661315a565b6000815461326b81613110565b600182811680156132835760018114613298576132c7565b60ff19841687528215158302870194506132c7565b8560005260208060002060005b858110156132be5781548a8201529084019082016132a5565b50505082870194505b5050505092915050565b60006132dd828461325e565b7f2f6e6f742d617574686f72697a656400000000000000000000000000000000008152600f019392505050565b6000613316828461325e565b7f2f4d757374206265204172636841646d696e000000000000000000000000000081526012019392505050565b601f82111561338957600081815260208120601f850160051c8101602086101561336a5750805b601f850160051c820191505b818110156111be57828155600101613376565b505050565b67ffffffffffffffff8311156133a6576133a6612e27565b6133ba836133b48354613110565b83613343565b6000601f8411600181146133ee57600085156133d65750838201355b600019600387901b1c1916600186901b178355610bbb565b600083815260209020601f19861690835b8281101561341f57868501358255602094850194600190920191016133ff565b508682101561343c5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60006020828403121561346057600080fd5b5051919050565b6000613473828461325e565b7f2f4172636841646d696e2063616e6e6f74206c6f73652061646d696e202d207581527f7064617465204172636841646d696e20746f20616e6f7468657220616464726560208201527f737300000000000000000000000000000000000000000000000000000000000060408201526042019392505050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b815167ffffffffffffffff81111561352c5761352c612e27565b6135408161353a8454613110565b84613343565b602080601f831160018114613575576000841561355d5750858301515b600019600386901b1c1916600185901b1785556111be565b600085815260208120601f198616915b828110156135a457888601518255948401946001909101908401613585565b50858210156135c25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b81810381811115610b1a57610b1a6135d2565b600061ffff80881683528087166020840152508460408301526080606083015261362960808301848661315a565b979650505050505050565b61ffff8616815260806020820152600061365260808301868861315a565b67ffffffffffffffff94909416604083015250606001529392505050565b600082601f83011261368157600080fd5b815161368f612ef182612e6e565b8181528460208386010111156136a457600080fd5b6136b5826020830160208701612f39565b949350505050565b6000602082840312156136cf57600080fd5b815167ffffffffffffffff8111156136e657600080fd5b6136b584828501613670565b61ffff8516815260806020820152600061370f6080830186612f5d565b67ffffffffffffffff8516604084015282810360608401526136298185612f5d565b60008251613743818460208701612f39565b9190910192915050565b61ffff8616815260a06020820152600061376a60a0830187612f5d565b67ffffffffffffffff86166040840152828103606084015261378c8186612f5d565b905082810360808401526137a08185612f5d565b98975050505050505050565b61ffff851681526080602082015260006137c96080830186612f5d565b82810360408401526137db8186612f5d565b91505082606083015295945050505050565b80820180821115610b1a57610b1a6135d2565b600061380c828461325e565b7f2f6e6f742d6c697665000000000000000000000000000000000000000000000081526009019392505050565b60006020828403121561384b57600080fd5b815161167e81612c27565b61ffff8716815260c06020820152600061387360c0830188612f5d565b82810360408401526138858188612f5d565b6001600160a01b0387811660608601528616608085015283810360a0850152905061320f8185612f5d565b600080600080608085870312156138c657600080fd5b84516138d181612abc565b602086015190945067ffffffffffffffff808211156138ef57600080fd5b6138fb88838901613670565b9450604087015191508082111561391157600080fd5b5061391e87828801613670565b606096909601519497939650505050565b6040815260006139426040830185612f5d565b9050826020830152939250505056fea2646970667358221220fe95330fca94ac50c88a934bd194657bf2e6218c8aa063f4b0137d025e8f276d64736f6c6343000811003300000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6750000000000000000000000002fda8c6783aa36bed645bad28a4cdc8769dcd252
Deployed Bytecode
0x6080604052600436106102ba5760003560e01c80639358928b1161016e578063b353aaa7116100cb578063eab45d9c1161007f578063ed629c5c11610064578063ed629c5c146107f7578063f2fde38b14610811578063f5ecbdbc1461083157600080fd5b8063eab45d9c146107b7578063eb8d72b7146107d757600080fd5b8063cbed8b9c116100b0578063cbed8b9c14610764578063d1deba1f14610784578063df2a5b3b1461079757600080fd5b8063b353aaa714610710578063baf3292d1461074457600080fd5b80639f38369a11610122578063a6c3d16511610107578063a6c3d1651461069c578063aac5185c146106bc578063b1dc45b5146106dc57600080fd5b80639f38369a1461065c578063a2f91af21461067c57600080fd5b8063957aa58c11610153578063957aa58c146106065780639c52a7f11461061c5780639d8b53a91461063c57600080fd5b80639358928b146105d1578063950c8a74146105e657600080fd5b8063519056361161021c578063715018a6116101d05780638182c32e116101b55780638182c32e146105475780638cfd8f5c146105675780638da5cb5b1461059f57600080fd5b8063715018a6146105055780637533d7881461051a57600080fd5b8063622f082911610201578063622f0829146104a557806365fae35e146104c557806366ad5c8a146104e557600080fd5b806351905636146104435780635b8c41e61461045657600080fd5b80633d8b38f61161027357806342d65a8d1161025857806342d65a8d146103e657806344770515146104065780634c42899a1461041b57600080fd5b80633d8b38f61461038b578063429b62e5146103ab57600080fd5b806307e0db17116102a457806307e0db171461031657806310ddb137146103365780632a205e3d1461035657600080fd5b80621d3567146102bf57806301ffc9a7146102e1575b600080fd5b3480156102cb57600080fd5b506102df6102da366004612b32565b610851565b005b3480156102ed57600080fd5b506103016102fc366004612bc8565b610a99565b60405190151581526020015b60405180910390f35b34801561032257600080fd5b506102df610331366004612c0a565b610b20565b34801561034257600080fd5b506102df610351366004612c0a565b610bc2565b34801561036257600080fd5b50610376610371366004612c35565b610c33565b6040805192835260208301919091520161030d565b34801561039757600080fd5b506103016103a6366004612cd6565b610d4e565b3480156103b757600080fd5b506103d86103c6366004612d40565b60086020526000908152604090205481565b60405190815260200161030d565b3480156103f257600080fd5b506102df610401366004612cd6565b610e1a565b34801561041257600080fd5b506103d8600081565b34801561042757600080fd5b50610430600081565b60405161ffff909116815260200161030d565b6102df610451366004612d5d565b610eb9565b34801561046257600080fd5b506103d8610471366004612e96565b6004602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205481565b3480156104b157600080fd5b506102df6104c0366004612d40565b610f3e565b3480156104d157600080fd5b506102df6104e0366004612d40565b611037565b3480156104f157600080fd5b506102df610500366004612b32565b6110d3565b34801561051157600080fd5b506102df6111c6565b34801561052657600080fd5b5061053a610535366004612c0a565b6111da565b60405161030d9190612f89565b34801561055357600080fd5b506102df610562366004612cd6565b611274565b34801561057357600080fd5b506103d8610582366004612f9c565b600260209081526000928352604080842090915290825290205481565b3480156105ab57600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200161030d565b3480156105dd57600080fd5b506103d861132a565b3480156105f257600080fd5b506003546105b9906001600160a01b031681565b34801561061257600080fd5b506103d860095481565b34801561062857600080fd5b506102df610637366004612d40565b6113b3565b34801561064857600080fd5b506102df610657366004612cd6565b6114a4565b34801561066857600080fd5b5061053a610677366004612c0a565b61156f565b34801561068857600080fd5b506102df610697366004612fd5565b611685565b3480156106a857600080fd5b506102df6106b7366004612cd6565b611718565b3480156106c857600080fd5b506007546105b9906001600160a01b031681565b3480156106e857600080fd5b506105b97f0000000000000000000000002fda8c6783aa36bed645bad28a4cdc8769dcd25281565b34801561071c57600080fd5b506105b97f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67581565b34801561075057600080fd5b506102df61075f366004612d40565b611735565b34801561077057600080fd5b506102df61077f366004612fee565b611798565b6102df610792366004612b32565b61183b565b3480156107a357600080fd5b506102df6107b2366004613061565b611a89565b3480156107c357600080fd5b506102df6107d23660046130a2565b611b43565b3480156107e357600080fd5b506102df6107f2366004612cd6565b611b8c565b34801561080357600080fd5b506005546103019060ff1681565b34801561081d57600080fd5b506102df61082c366004612d40565b611bb2565b34801561083d57600080fd5b5061053a61084c3660046130bf565b611c42565b337f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6756001600160a01b0316146108ce5760405162461bcd60e51b815260206004820152601e60248201527f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c6572000060448201526064015b60405180910390fd5b61ffff8616600090815260016020526040812080546108ec90613110565b80601f016020809104026020016040519081016040528092919081815260200182805461091890613110565b80156109655780601f1061093a57610100808354040283529160200191610965565b820191906000526020600020905b81548152906001019060200180831161094857829003601f168201915b50505050509050805186869050148015610980575060008151115b80156109a857508051602082012060405161099e908890889061314a565b6040518091039020145b610a1a5760405162461bcd60e51b815260206004820152602660248201527f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084016108c5565b610a908787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a018190048102820181019092528881528a935091508890889081908401838280828437600092019190915250611d0c92505050565b50505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082161580610b0b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f36372b0700000000000000000000000000000000000000000000000000000000145b80610b1a5750610b1a82611e44565b92915050565b610b28611edb565b6040517f07e0db1700000000000000000000000000000000000000000000000000000000815261ffff821660048201527f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6756001600160a01b0316906307e0db17906024015b600060405180830381600087803b158015610ba757600080fd5b505af1158015610bbb573d6000803e3d6000fd5b5050505050565b610bca611edb565b6040517f10ddb13700000000000000000000000000000000000000000000000000000000815261ffff821660048201527f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6756001600160a01b0316906310ddb13790602401610b8d565b6040516bffffffffffffffffffffffff193360601b16602082015260009081908190819060340160408051601f1981840301815290829052610c7e92918c908c908c90602001613185565b60408051601f19818403018152908290527f40a7bb1000000000000000000000000000000000000000000000000000000000825291506001600160a01b037f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67516906340a7bb1090610cfd908d90309086908c908c908c906004016131c8565b6040805180830381865afa158015610d19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3d919061321c565b925092505097509795505050505050565b61ffff831660009081526001602052604081208054829190610d6f90613110565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9b90613110565b8015610de85780601f10610dbd57610100808354040283529160200191610de8565b820191906000526020600020905b815481529060010190602001808311610dcb57829003601f168201915b505050505090508383604051610dff92919061314a565b60405180910390208180519060200120149150509392505050565b610e22611edb565b6040517f42d65a8d0000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67516906342d65a8d90610e8b90869086908690600401613240565b600060405180830381600087803b158015610ea557600080fd5b505af1158015610a90573d6000803e3d6000fd5b610f33898989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a018190048102820181019092528881528c93508b92508a918a908a9081908401838280828437600092019190915250611f3592505050565b505050505050505050565b33600090815260086020908152604091829020549151600190921491610f6791600691016132d1565b60405160208183030381529060405290610f945760405162461bcd60e51b81526004016108c59190612f89565b506007546001600160a01b031633148015610fb757506001600160a01b03811615155b6006604051602001610fc9919061330a565b60405160208183030381529060405290610ff65760405162461bcd60e51b81526004016108c59190612f89565b50600780546001600160a01b0390921673ffffffffffffffffffffffffffffffffffffffff1990921682179055600090815260086020526040902060019055565b3360009081526008602090815260409182902054915160019092149161106091600691016132d1565b6040516020818303038152906040529061108d5760405162461bcd60e51b81526004016108c59190612f89565b506001600160a01b03811660008181526008602052604080822060019055517fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a609190a250565b3330146111485760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d75737420626560448201527f204c7a417070000000000000000000000000000000000000000000000000000060648201526084016108c5565b6111be8686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f89018190048102820181019092528781528993509150879087908190840183828082843760009201919091525061201c92505050565b505050505050565b6111ce611edb565b6111d86000612083565b565b600160205260009081526040902080546111f390613110565b80601f016020809104026020016040519081016040528092919081815260200182805461121f90613110565b801561126c5780601f106112415761010080835404028352916020019161126c565b820191906000526020600020905b81548152906001019060200180831161124f57829003601f168201915b505050505081565b3360009081526008602090815260409182902054915160019092149161129d91600691016132d1565b604051602081830303815290604052906112ca5760405162461bcd60e51b81526004016108c59190612f89565b5061ffff831660009081526001602052604090206112e982848361338e565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab83838360405161131d93929190613240565b60405180910390a1505050565b60007f0000000000000000000000002fda8c6783aa36bed645bad28a4cdc8769dcd2526001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561138a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ae919061344e565b905090565b336000908152600860209081526040918290205491516001909214916113dc91600691016132d1565b604051602081830303815290604052906114095760405162461bcd60e51b81526004016108c59190612f89565b506007546040516001600160a01b03838116921691909114159061143290600690602001613467565b6040516020818303038152906040529061145f5760405162461bcd60e51b81526004016108c59190612f89565b506001600160a01b038116600081815260086020526040808220829055517f184450df2e323acec0ed3b5c7531b81f9b4cdef7914dfd4c0a4317416bb5251b9190a250565b336000908152600860209081526040918290205491516001909214916114cd91600691016132d1565b604051602081830303815290604052906114fa5760405162461bcd60e51b81526004016108c59190612f89565b50818130604051602001611510939291906134ec565b60408051601f1981840301815291815261ffff851660009081526001602052209061153b9082613512565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce83838360405161131d93929190613240565b61ffff811660009081526001602052604081208054606092919061159290613110565b80601f01602080910402602001604051908101604052809291908181526020018280546115be90613110565b801561160b5780601f106115e05761010080835404028352916020019161160b565b820191906000526020600020905b8154815290600101906020018083116115ee57829003601f168201915b5050505050905080516000036116635760405162461bcd60e51b815260206004820152601d60248201527f4c7a4170703a206e6f20747275737465642070617468207265636f726400000060448201526064016108c5565b61167e60006014835161167691906135e8565b8391906120e0565b9392505050565b336000908152600860209081526040918290205491516001909214916116ae91600691016132d1565b604051602081830303815290604052906116db5760405162461bcd60e51b81526004016108c59190612f89565b5060098190556040518181527f8b2f35c645f75532175a00d9b4565154e45c8eb57ee0155e03d0958f3a4d4b89906020015b60405180910390a150565b611720611edb565b818130604051602001611510939291906134ec565b61173d611edb565b6003805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b9060200161170d565b6117a0611edb565b6040517fcbed8b9c0000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675169063cbed8b9c9061180d90889088908890889088906004016135fb565b600060405180830381600087803b15801561182757600080fd5b505af1158015610f33573d6000803e3d6000fd5b61ffff8616600090815260046020526040808220905161185e908890889061314a565b908152604080516020928190038301902067ffffffffffffffff8716600090815292529020549050806118f95760405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201527f616765000000000000000000000000000000000000000000000000000000000060648201526084016108c5565b80838360405161190a92919061314a565b6040518091039020146119855760405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f6160448201527f640000000000000000000000000000000000000000000000000000000000000060648201526084016108c5565b61ffff871660009081526004602052604080822090516119a8908990899061314a565b908152604080516020928190038301812067ffffffffffffffff8916600090815290845282902093909355601f88018290048202830182019052868252611a41918991899089908190840183828082843760009201919091525050604080516020601f8a018190048102820181019092528881528a93509150889088908190840183828082843760009201919091525061201c92505050565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e58787878785604051611a78959493929190613634565b60405180910390a150505050505050565b611a91611edb565b60008111611ae15760405162461bcd60e51b815260206004820152601560248201527f4c7a4170703a20696e76616c6964206d696e476173000000000000000000000060448201526064016108c5565b61ffff83811660008181526002602090815260408083209487168084529482529182902085905581519283528201929092529081018290527f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac09060600161131d565b611b4b611edb565b6005805460ff19168215159081179091556040519081527f1584ad594a70cbe1e6515592e1272a987d922b097ead875069cebe8b40c004a49060200161170d565b611b94611edb565b61ffff831660009081526001602052604090206112e982848361338e565b611bba611edb565b6001600160a01b038116611c365760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108c5565b611c3f81612083565b50565b6040517ff5ecbdbc00000000000000000000000000000000000000000000000000000000815261ffff808616600483015284166024820152306044820152606481018290526060907f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6756001600160a01b03169063f5ecbdbc90608401600060405180830381865afa158015611cdb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d0391908101906136bd565b95945050505050565b600080611d9c5a60966366ad5c8a60e01b89898989604051602401611d3494939291906136f2565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915230929190612208565b91509150816111be578280519060200120600460008861ffff1661ffff16815260200190815260200160002086604051611dd69190613731565b90815260408051918290036020908101832067ffffffffffffffff89166000908152915220919091557fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c90611e34908890889088908890879061374d565b60405180910390a1505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fe8e89a80000000000000000000000000000000000000000000000000000000001480610b1a57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610b1a565b6000546001600160a01b031633146111d85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108c5565b611f43866000836000612293565b611f4f8787878761232a565b6040516bffffffffffffffffffffffff19606089901b166020820152600090819060340160408051601f1981840301815290829052611f959291899089906020016137ac565b6040516020818303038152906040529050611fb4878286868634612590565b85604051611fc29190613731565b6040518091039020886001600160a01b03168861ffff167f39a4c66499bcf4b56d79f0dde8ed7a9d4925a0df55825206b2b8531e202be0d08860405161200a91815260200190565b60405180910390a45050505050505050565b602081015161ffff811661203b5761203685858585612751565b610bbb565b60405162461bcd60e51b815260206004820152601c60248201527f4f4654436f72653a20756e6b6e6f776e207061636b657420747970650000000060448201526064016108c5565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060816120ee81601f6137ed565b101561213c5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016108c5565b61214682846137ed565b845110156121965760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016108c5565b6060821580156121b557604051915060008252602082016040526121ff565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156121ee5780518352602092830192016121d6565b5050858452601f01601f1916604052505b50949350505050565b6000606060008060008661ffff1667ffffffffffffffff81111561222e5761222e612e27565b6040519080825280601f01601f191660200182016040528015612258576020820181803683370190505b50905060008087516020890160008d8df191503d92508683111561227a578692505b828152826000602083013e909890975095505050505050565b60055460ff16156122af576122aa848484846127de565b612324565b8151156123245760405162461bcd60e51b815260206004820152602660248201527f4f4654436f72653a205f61646170746572506172616d73206d7573742062652060448201527f656d7074792e000000000000000000000000000000000000000000000000000060648201526084016108c5565b50505050565b60095460011460066040516020016123429190613800565b6040516020818303038152906040529061236f5760405162461bcd60e51b81526004016108c59190612f89565b50336001600160a01b03851681146124a7576040517f5314dc600000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301528281166024830152604482018490527f0000000000000000000000002fda8c6783aa36bed645bad28a4cdc8769dcd2521690635314dc60906064016020604051808303816000875af1158015612411573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124359190613839565b6124a75760405162461bcd60e51b815260206004820152602960248201527f64324f436f6e6e6563746f724c5a2f4d75737420686176652070726f7065722060448201527f616c6c6f77616e6365000000000000000000000000000000000000000000000060648201526084016108c5565b6040517f9dc29fac0000000000000000000000000000000000000000000000000000000081526001600160a01b038681166004830152602482018490527f0000000000000000000000002fda8c6783aa36bed645bad28a4cdc8769dcd2521690639dc29fac90604401600060405180830381600087803b15801561252a57600080fd5b505af115801561253e573d6000803e3d6000fd5b50506040805185815261ffff881660208201526001600160a01b03891693507faf30bc91dcb8592714146afe47ec9564891c7dd31614acd28be7ac5cc8e1a7a392500160405180910390a25050505050565b61ffff8616600090815260016020526040812080546125ae90613110565b80601f01602080910402602001604051908101604052809291908181526020018280546125da90613110565b80156126275780601f106125fc57610100808354040283529160200191612627565b820191906000526020600020905b81548152906001019060200180831161260a57829003601f168201915b5050505050905080516000036126a55760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201527f61207472757374656420736f757263650000000000000000000000000000000060648201526084016108c5565b6040517fc58031000000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675169063c5803100908490612716908b9086908c908c908c908c90600401613856565b6000604051808303818588803b15801561272f57600080fd5b505af1158015612743573d6000803e3d6000fd5b505050505050505050505050565b60008060008380602001905181019061276a91906138b0565b919550935091506000905061277f83826128bd565b905061278c888284612933565b806001600160a01b03168861ffff167f776434b505c7beb3db155c58df6c88985bf7c31730767e43ec773005059fed7a86856040516127cc92919061392f565b60405180910390a35050505050505050565b60006127e983612a60565b61ffff80871660009081526002602090815260408083209389168352929052908120549192509061281b9084906137ed565b90506000811161286d5760405162461bcd60e51b815260206004820152601a60248201527f4c7a4170703a206d696e4761734c696d6974206e6f742073657400000000000060448201526064016108c5565b808210156111be5760405162461bcd60e51b815260206004820152601b60248201527f4c7a4170703a20676173206c696d697420697320746f6f206c6f77000000000060448201526064016108c5565b60006128ca8260146137ed565b8351101561291a5760405162461bcd60e51b815260206004820152601560248201527f746f416464726573735f6f75744f66426f756e6473000000000000000000000060448201526064016108c5565b5001602001516c01000000000000000000000000900490565b600954600114600660405160200161294b9190613800565b604051602081830303815290604052906129785760405162461bcd60e51b81526004016108c59190612f89565b506040517fe2cc65c70000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152602482018390527f0000000000000000000000002fda8c6783aa36bed645bad28a4cdc8769dcd252169063e2cc65c790604401600060405180830381600087803b1580156129fc57600080fd5b505af1158015612a10573d6000803e3d6000fd5b50506040805184815261ffff871660208201526001600160a01b03861693507fa1a429a04b12e4c95492f8b3d0bf30e400cd4cc224dbb63904989896ea21cc3b92500160405180910390a2505050565b6000602282511015612ab45760405162461bcd60e51b815260206004820152601c60248201527f4c7a4170703a20696e76616c69642061646170746572506172616d730000000060448201526064016108c5565b506022015190565b61ffff81168114611c3f57600080fd5b60008083601f840112612ade57600080fd5b50813567ffffffffffffffff811115612af657600080fd5b602083019150836020828501011115612b0e57600080fd5b9250929050565b803567ffffffffffffffff81168114612b2d57600080fd5b919050565b60008060008060008060808789031215612b4b57600080fd5b8635612b5681612abc565b9550602087013567ffffffffffffffff80821115612b7357600080fd5b612b7f8a838b01612acc565b9097509550859150612b9360408a01612b15565b94506060890135915080821115612ba957600080fd5b50612bb689828a01612acc565b979a9699509497509295939492505050565b600060208284031215612bda57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461167e57600080fd5b600060208284031215612c1c57600080fd5b813561167e81612abc565b8015158114611c3f57600080fd5b600080600080600080600060a0888a031215612c5057600080fd5b8735612c5b81612abc565b9650602088013567ffffffffffffffff80821115612c7857600080fd5b612c848b838c01612acc565b909850965060408a0135955060608a01359150612ca082612c27565b90935060808901359080821115612cb657600080fd5b50612cc38a828b01612acc565b989b979a50959850939692959293505050565b600080600060408486031215612ceb57600080fd5b8335612cf681612abc565b9250602084013567ffffffffffffffff811115612d1257600080fd5b612d1e86828701612acc565b9497909650939450505050565b6001600160a01b0381168114611c3f57600080fd5b600060208284031215612d5257600080fd5b813561167e81612d2b565b600080600080600080600080600060e08a8c031215612d7b57600080fd5b8935612d8681612d2b565b985060208a0135612d9681612abc565b975060408a013567ffffffffffffffff80821115612db357600080fd5b612dbf8d838e01612acc565b909950975060608c0135965060808c01359150612ddb82612d2b565b90945060a08b013590612ded82612d2b565b90935060c08b01359080821115612e0357600080fd5b50612e108c828d01612acc565b915080935050809150509295985092959850929598565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612e6657612e66612e27565b604052919050565b600067ffffffffffffffff821115612e8857612e88612e27565b50601f01601f191660200190565b600080600060608486031215612eab57600080fd5b8335612eb681612abc565b9250602084013567ffffffffffffffff811115612ed257600080fd5b8401601f81018613612ee357600080fd5b8035612ef6612ef182612e6e565b612e3d565b818152876020838501011115612f0b57600080fd5b81602084016020830137600060208383010152809450505050612f3060408501612b15565b90509250925092565b60005b83811015612f54578181015183820152602001612f3c565b50506000910152565b60008151808452612f75816020860160208601612f39565b601f01601f19169290920160200192915050565b60208152600061167e6020830184612f5d565b60008060408385031215612faf57600080fd5b8235612fba81612abc565b91506020830135612fca81612abc565b809150509250929050565b600060208284031215612fe757600080fd5b5035919050565b60008060008060006080868803121561300657600080fd5b853561301181612abc565b9450602086013561302181612abc565b935060408601359250606086013567ffffffffffffffff81111561304457600080fd5b61305088828901612acc565b969995985093965092949392505050565b60008060006060848603121561307657600080fd5b833561308181612abc565b9250602084013561309181612abc565b929592945050506040919091013590565b6000602082840312156130b457600080fd5b813561167e81612c27565b600080600080608085870312156130d557600080fd5b84356130e081612abc565b935060208501356130f081612abc565b9250604085013561310081612d2b565b9396929550929360600135925050565b600181811c9082168061312457607f821691505b60208210810361314457634e487b7160e01b600052602260045260246000fd5b50919050565b8183823760009101908152919050565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b61ffff861681526080602082015260006131a26080830187612f5d565b82810360408401526131b581868861315a565b9150508260608301529695505050505050565b61ffff871681526001600160a01b038616602082015260a0604082015260006131f460a0830187612f5d565b8515156060840152828103608084015261320f81858761315a565b9998505050505050505050565b6000806040838503121561322f57600080fd5b505080516020909101519092909150565b61ffff84168152604060208201526000611d0360408301848661315a565b6000815461326b81613110565b600182811680156132835760018114613298576132c7565b60ff19841687528215158302870194506132c7565b8560005260208060002060005b858110156132be5781548a8201529084019082016132a5565b50505082870194505b5050505092915050565b60006132dd828461325e565b7f2f6e6f742d617574686f72697a656400000000000000000000000000000000008152600f019392505050565b6000613316828461325e565b7f2f4d757374206265204172636841646d696e000000000000000000000000000081526012019392505050565b601f82111561338957600081815260208120601f850160051c8101602086101561336a5750805b601f850160051c820191505b818110156111be57828155600101613376565b505050565b67ffffffffffffffff8311156133a6576133a6612e27565b6133ba836133b48354613110565b83613343565b6000601f8411600181146133ee57600085156133d65750838201355b600019600387901b1c1916600186901b178355610bbb565b600083815260209020601f19861690835b8281101561341f57868501358255602094850194600190920191016133ff565b508682101561343c5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60006020828403121561346057600080fd5b5051919050565b6000613473828461325e565b7f2f4172636841646d696e2063616e6e6f74206c6f73652061646d696e202d207581527f7064617465204172636841646d696e20746f20616e6f7468657220616464726560208201527f737300000000000000000000000000000000000000000000000000000000000060408201526042019392505050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b815167ffffffffffffffff81111561352c5761352c612e27565b6135408161353a8454613110565b84613343565b602080601f831160018114613575576000841561355d5750858301515b600019600386901b1c1916600185901b1785556111be565b600085815260208120601f198616915b828110156135a457888601518255948401946001909101908401613585565b50858210156135c25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b81810381811115610b1a57610b1a6135d2565b600061ffff80881683528087166020840152508460408301526080606083015261362960808301848661315a565b979650505050505050565b61ffff8616815260806020820152600061365260808301868861315a565b67ffffffffffffffff94909416604083015250606001529392505050565b600082601f83011261368157600080fd5b815161368f612ef182612e6e565b8181528460208386010111156136a457600080fd5b6136b5826020830160208701612f39565b949350505050565b6000602082840312156136cf57600080fd5b815167ffffffffffffffff8111156136e657600080fd5b6136b584828501613670565b61ffff8516815260806020820152600061370f6080830186612f5d565b67ffffffffffffffff8516604084015282810360608401526136298185612f5d565b60008251613743818460208701612f39565b9190910192915050565b61ffff8616815260a06020820152600061376a60a0830187612f5d565b67ffffffffffffffff86166040840152828103606084015261378c8186612f5d565b905082810360808401526137a08185612f5d565b98975050505050505050565b61ffff851681526080602082015260006137c96080830186612f5d565b82810360408401526137db8186612f5d565b91505082606083015295945050505050565b80820180821115610b1a57610b1a6135d2565b600061380c828461325e565b7f2f6e6f742d6c697665000000000000000000000000000000000000000000000081526009019392505050565b60006020828403121561384b57600080fd5b815161167e81612c27565b61ffff8716815260c06020820152600061387360c0830188612f5d565b82810360408401526138858188612f5d565b6001600160a01b0387811660608601528616608085015283810360a0850152905061320f8185612f5d565b600080600080608085870312156138c657600080fd5b84516138d181612abc565b602086015190945067ffffffffffffffff808211156138ef57600080fd5b6138fb88838901613670565b9450604087015191508082111561391157600080fd5b5061391e87828801613670565b606096909601519497939650505050565b6040815260006139426040830185612f5d565b9050826020830152939250505056fea2646970667358221220fe95330fca94ac50c88a934bd194657bf2e6218c8aa063f4b0137d025e8f276d64736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6750000000000000000000000002fda8c6783aa36bed645bad28a4cdc8769dcd252
-----Decoded View---------------
Arg [0] : _lzEndpoint (address): 0x66A71Dcef29A0fFBDBE3c6a460a3B5BC225Cd675
Arg [1] : _d2OContract (address): 0x2FdA8c6783Aa36BeD645baD28a4cDC8769dCD252
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675
Arg [1] : 0000000000000000000000002fda8c6783aa36bed645bad28a4cdc8769dcd252
Deployed Bytecode Sourcemap
460:2106:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;964:753:13;;;;;;;;;;-1:-1:-1;964:753:13;;;;;:::i;:::-;;:::i;:::-;;990:253:12;;;;;;;;;;-1:-1:-1;990:253:12;;;;;:::i;:::-;;:::i;:::-;;;2094:14:17;;2087:22;2069:41;;2057:2;2042:18;990:253:12;;;;;;;;3763:121:13;;;;;;;;;;-1:-1:-1;3763:121:13;;;;;:::i;:::-;;:::i;3890:127::-;;;;;;;;;;-1:-1:-1;3890:127:13;;;;;:::i;:::-;;:::i;676:453:15:-;;;;;;;;;;-1:-1:-1;676:453:15;;;;;:::i;:::-;;:::i;:::-;;;;3728:25:17;;;3784:2;3769:18;;3762:34;;;;3701:18;676:453:15;3554:248:17;5673:247:13;;;;;;;;;;-1:-1:-1;5673:247:13;;;;;:::i;:::-;;:::i;153:42:0:-;;;;;;;;;;-1:-1:-1;153:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;4911:25:17;;;4899:2;4884:18;153:42:0;4765:177:17;4023:176:13;;;;;;;;;;-1:-1:-1;4023:176:13;;;;;:::i;:::-;;:::i;241:37:15:-;;;;;;;;;;;;277:1;241:37;;304:34;;;;;;;;;;;;337:1;304:34;;;;;5121:6:17;5109:19;;;5091:38;;5079:2;5064:18;304:34:15;4947:188:17;1135:332:15;;;;;;:::i;:::-;;:::i;611:85:14:-;;;;;;;;;;-1:-1:-1;611:85:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;802:244:0;;;;;;;;;;-1:-1:-1;802:244:0;;;;;:::i;:::-;;:::i;1052:97::-;;;;;;;;;;-1:-1:-1;1052:97:0;;;;;:::i;:::-;;:::i;1571:342:14:-;;;;;;;;;;-1:-1:-1;1571:342:14;;;;;:::i;:::-;;:::i;1824:101:16:-;;;;;;;;;;;;;:::i;449:51:13:-;;;;;;;;;;-1:-1:-1;449:51:13;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2083:194:12:-;;;;;;;;;;-1:-1:-1;2083:194:12;;;;;:::i;:::-;;:::i;506:65:13:-;;;;;;;;;;-1:-1:-1;506:65:13;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;1194:85:16;;;;;;;;;;-1:-1:-1;1240:7:16;1266:6;-1:-1:-1;;;;;1266:6:16;1194:85;;;-1:-1:-1;;;;;9703:55:17;;;9685:74;;9673:2;9658:18;1194:85:16;9539:226:17;1249:131:12;;;;;;;;;;;;;:::i;577:23:13:-;;;;;;;;;;-1:-1:-1;577:23:13;;;;-1:-1:-1;;;;;577:23:13;;;201:19:0;;;;;;;;;;;;;;;;1155:237;;;;;;;;;;-1:-1:-1;1155:237:0;;;;;:::i;:::-;;:::i;2287:277:12:-;;;;;;;;;;-1:-1:-1;2287:277:12;;;;;:::i;:::-;;:::i;4827:326:13:-;;;;;;;;;;-1:-1:-1;4827:326:13;;;;;:::i;:::-;;:::i;1398:98:0:-;;;;;;;;;;-1:-1:-1;1398:98:0;;;;;:::i;:::-;;:::i;4543:278:13:-;;;;;;;;;;-1:-1:-1;4543:278:13;;;;;:::i;:::-;;:::i;123:24:0:-;;;;;;;;;;-1:-1:-1;123:24:0;;;;-1:-1:-1;;;;;123:24:0;;;547:36:12;;;;;;;;;;;;;;;397:46:13;;;;;;;;;;;;;;;5159:133;;;;;;;;;;-1:-1:-1;5159:133:13;;;;;:::i;:::-;;:::i;3555:202::-;;;;;;;;;;-1:-1:-1;3555:202:13;;;;;:::i;:::-;;:::i;2094:757:14:-;;;;;;:::i;:::-;;:::i;5298:280:13:-;;;;;;;;;;-1:-1:-1;5298:280:13;;;;;:::i;:::-;;:::i;1473:220:15:-;;;;;;;;;;-1:-1:-1;1473:220:15;;;;;:::i;:::-;;:::i;4342:195:13:-;;;;;;;;;;-1:-1:-1;4342:195:13;;;;;:::i;:::-;;:::i;345:34:15:-;;;;;;;;;;-1:-1:-1;345:34:15;;;;;;;;2074:198:16;;;;;;;;;;-1:-1:-1;2074:198:16;;;;;:::i;:::-;;:::i;3287:209:13:-;;;;;;;;;;-1:-1:-1;3287:209:13;;;;;:::i;:::-;;:::i;964:753::-;719:10:2;1202::13;-1:-1:-1;;;;;1178:35:13;;1170:78;;;;-1:-1:-1;;;1170:78:13;;12471:2:17;1170:78:13;;;12453:21:17;12510:2;12490:18;;;12483:30;12549:32;12529:18;;;12522:60;12599:18;;1170:78:13;;;;;;;;;1288:32;;;1259:26;1288:32;;;:19;:32;;;;;1259:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1492:13;:20;1470:11;;:18;;:42;:70;;;;;1539:1;1516:13;:20;:24;1470:70;:124;;;;-1:-1:-1;1570:24:13;;;;;;1544:22;;;;1554:11;;;;1544:22;:::i;:::-;;;;;;;;:50;1470:124;1462:175;;;;-1:-1:-1;;;1462:175:13;;13548:2:17;1462:175:13;;;13530:21:17;13587:2;13567:18;;;13560:30;13626:34;13606:18;;;13599:62;13697:8;13677:18;;;13670:36;13723:19;;1462:175:13;13346:402:17;1462:175:13;1648:62;1667:11;1680;;1648:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1648:62:13;;;;;;;;;;;;;;;;;;;;;;1693:6;;-1:-1:-1;1648:62:13;-1:-1:-1;1701:8:13;;;;;;1648:62;;1701:8;;;;1648:62;;;;;;;;;-1:-1:-1;1648:18:13;;-1:-1:-1;;;1648:62:13:i;:::-;1095:622;964:753;;;;;;:::o;990:253:12:-;1093:4;1116:37;;;;;:80;;-1:-1:-1;1157:39:12;;;1172:24;1157:39;1116:80;:120;;;;1200:36;1224:11;1200:23;:36::i;:::-;1109:127;990:253;-1:-1:-1;;990:253:12:o;3763:121:13:-;1087:13:16;:11;:13::i;:::-;3842:35:13::1;::::0;;;;5121:6:17;5109:19;;3842:35:13::1;::::0;::::1;5091:38:17::0;3842:10:13::1;-1:-1:-1::0;;;;;3842:25:13::1;::::0;::::1;::::0;5064:18:17;;3842:35:13::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;3763:121:::0;:::o;3890:127::-;1087:13:16;:11;:13::i;:::-;3972:38:13::1;::::0;;;;5121:6:17;5109:19;;3972:38:13::1;::::0;::::1;5091::17::0;3972:10:13::1;-1:-1:-1::0;;;;;3972:28:13::1;::::0;::::1;::::0;5064:18:17;;3972:38:13::1;4947:188:17::0;676:453:15;970:28;;-1:-1:-1;;987:10:15;13902:2:17;13898:15;13894:88;970:28:15;;;13882:101:17;845:14:15;;;;;;;;13999:12:17;;970:28:15;;;-1:-1:-1;;970:28:15;;;;;;;;;;950:70;;;1000:10;;;;1012:7;;970:28;950:70;;:::i;:::-;;;;-1:-1:-1;;950:70:15;;;;;;;;;;1037:85;;;950:70;-1:-1:-1;;;;;;1037:10:15;:23;;;;:85;;1061:11;;1082:4;;950:70;;1098:7;;1107:14;;;;1037:85;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1030:92;;;;;676:453;;;;;;;;;;:::o;5673:247:13:-;5814:32;;;5769:4;5814:32;;;:19;:32;;;;;5785:61;;5769:4;;5814:32;5785:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5901:11;;5891:22;;;;;;;:::i;:::-;;;;;;;;5873:13;5863:24;;;;;;:50;5856:57;;;5673:247;;;;;:::o;4023:176::-;1087:13:16;:11;:13::i;:::-;4137:55:13::1;::::0;;;;-1:-1:-1;;;;;4137:10:13::1;:29;::::0;::::1;::::0;:55:::1;::::0;4167:11;;4180;;;;4137:55:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;1135:332:15::0;1362:98;1368:5;1375:11;1388:10;;1362:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1362:98:15;;;;;;;;;;;;;;;;;;;;;;1400:7;;-1:-1:-1;1409:14:15;;-1:-1:-1;1425:18:15;;1445:14;;;;;;1362:98;;1445:14;;;;1362:98;;;;;;;;;-1:-1:-1;1362:5:15;;-1:-1:-1;;;1362:98:15:i;:::-;1135:332;;;;;;;;;:::o;802:244:0:-;371:10;364:18;;;;:6;:18;;;;;;;;;;389:52;;386:1;364:23;;;;389:52;;403:18;;389:52;;:::i;:::-;;;;;;;;;;;;;356:86;;;;;-1:-1:-1;;;356:86:0;;;;;;;;:::i;:::-;-1:-1:-1;873:9:0::1;::::0;-1:-1:-1;;;;;873:9:0::1;886:10;873:23;:48:::0;::::1;;;-1:-1:-1::0;;;;;;900:21:0;::::1;::::0;::::1;873:48;937:18;923:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;865:114;;;;;-1:-1:-1::0;;;865:114:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;989:9:0::1;:19:::0;;-1:-1:-1;;;;;989:19:0;;::::1;-1:-1:-1::0;;989:19:0;;::::1;::::0;::::1;::::0;;:9:::1;1018:17:::0;;;:6:::1;:17;::::0;;;;989:19;1018:21;;802:244::o;1052:97::-;371:10;364:18;;;;:6;:18;;;;;;;;;;389:52;;386:1;364:23;;;;389:52;;403:18;;389:52;;:::i;:::-;;;;;;;;;;;;;356:86;;;;;-1:-1:-1;;;356:86:0;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;1103:11:0;::::1;;::::0;;;:6:::1;:11;::::0;;;;;1117:1:::1;1103:15:::0;;1133:9;::::1;::::0;1103:11;1133:9:::1;1052:97:::0;:::o;1571:342:14:-;719:10:2;1783:4:14;1759:29;1751:80;;;;-1:-1:-1;;;1751:80:14;;18272:2:17;1751:80:14;;;18254:21:17;18311:2;18291:18;;;18284:30;18350:34;18330:18;;;18323:62;18421:8;18401:18;;;18394:36;18447:19;;1751:80:14;18070:402:17;1751:80:14;1841:65;1863:11;1876;;1841:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1841:65:14;;;;;;;;;;;;;;;;;;;;;;1889:6;;-1:-1:-1;1841:65:14;-1:-1:-1;1897:8:14;;;;;;1841:65;;1897:8;;;;1841:65;;;;;;;;;-1:-1:-1;1841:21:14;;-1:-1:-1;;;1841:65:14:i;:::-;1571:342;;;;;;:::o;1824:101:16:-;1087:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;449:51:13:-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2083:194:12:-;371:10:0;364:18;;;;:6;:18;;;;;;;;;;389:52;;386:1;364:23;;;;389:52;;403:18;;389:52;;:::i;:::-;;;;;;;;;;;;;356:86;;;;;-1:-1:-1;;;356:86:0;;;;;;;;:::i;:::-;-1:-1:-1;2179:32:12::1;::::0;::::1;;::::0;;;:19:::1;:32;::::0;;;;:40:::1;2214:5:::0;;2179:32;:40:::1;:::i;:::-;;2234:36;2251:11;2264:5;;2234:36;;;;;;;;:::i;:::-;;;;;;;;2083:194:::0;;;:::o;1249:131::-;1316:4;1347:11;-1:-1:-1;;;;;1339:32:12;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1332:41;;1249:131;:::o;1155:237:0:-;371:10;364:18;;;;:6;:18;;;;;;;;;;389:52;;386:1;364:23;;;;389:52;;403:18;;389:52;;:::i;:::-;;;;;;;;;;;;;356:86;;;;;-1:-1:-1;;;356:86:0;;;;;;;;:::i;:::-;-1:-1:-1;1221:9:0::1;::::0;1232:103:::1;::::0;-1:-1:-1;;;;;1214:16:0;;::::1;1221:9:::0;::::1;1214:16:::0;;;::::1;;::::0;1232:103:::1;::::0;1246:18:::1;::::0;1232:103:::1;;;:::i;:::-;;;;;;;;;;;;;1206:130;;;;;-1:-1:-1::0;;;1206:130:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;;1346:11:0;::::1;1360:1;1346:11:::0;;;:6:::1;:11;::::0;;;;;:15;;;1376:9;::::1;::::0;1360:1;1376:9:::1;1155:237:::0;:::o;2287:277:12:-;371:10:0;364:18;;;;:6;:18;;;;;;;;;;389:52;;386:1;364:23;;;;389:52;;403:18;;389:52;;:::i;:::-;;;;;;;;;;;;;356:86;;;;;-1:-1:-1;;;356:86:0;;;;;;;;:::i;:::-;;2457:14:12::1;;2481:4;2440:47;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;2440:47:12;;::::1;::::0;;;;;;2402:35:::1;::::0;::::1;;::::0;;;:19:::1;2440:47;2402:35:::0;;;:85:::1;::::0;:35;:85:::1;:::i;:::-;;2502:55;2526:14;2542;;2502:55;;;;;;;;:::i;4827:326:13:-:0;4950:35;;;4930:17;4950:35;;;:19;:35;;;;;4930:55;;4906:12;;4930:17;4950:35;4930:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5003:4;:11;5018:1;5003:16;4995:58;;;;-1:-1:-1;;;4995:58:13;;23334:2:17;4995:58:13;;;23316:21:17;23373:2;23353:18;;;23346:30;23412:31;23392:18;;;23385:59;23461:18;;4995:58:13;23132:353:17;4995:58:13;5070:31;5081:1;5098:2;5084:4;:11;:16;;;;:::i;:::-;5070:4;;:31;:10;:31::i;:::-;5063:38;4827:326;-1:-1:-1;;;4827:326:13:o;1398:98:0:-;371:10;364:18;;;;:6;:18;;;;;;;;;;389:52;;386:1;364:23;;;;389:52;;403:18;;389:52;;:::i;:::-;;;;;;;;;;;;;356:86;;;;;-1:-1:-1;;;356:86:0;;;;;;;;:::i;:::-;-1:-1:-1;1451:4:0::1;:12:::0;;;1478:11:::1;::::0;4911:25:17;;;1478:11:0::1;::::0;4899:2:17;4884:18;1478:11:0::1;;;;;;;;1398:98:::0;:::o;4543:278:13:-;1087:13:16;:11;:13::i;:::-;4714:14:13::1;;4738:4;4697:47;;;;;;;;;;:::i;5159:133::-:0;1087:13:16;:11;:13::i;:::-;5228:8:13::1;:20:::0;;-1:-1:-1;;5228:20:13::1;-1:-1:-1::0;;;;;5228:20:13;::::1;::::0;;::::1;::::0;;;5263:22:::1;::::0;9685:74:17;;;5263:22:13::1;::::0;9673:2:17;9658:18;5263:22:13::1;9539:226:17::0;3555:202:13;1087:13:16;:11;:13::i;:::-;3688:62:13::1;::::0;;;;-1:-1:-1;;;;;3688:10:13::1;:20;::::0;::::1;::::0;:62:::1;::::0;3709:8;;3719;;3729:11;;3742:7;;;;3688:62:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;2094:757:14::0;2303:27;;;2281:19;2303:27;;;:14;:27;;;;;;:40;;;;2331:11;;;;2303:40;:::i;:::-;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;-1:-1:-1;2303:48:14;2361:73;;;;-1:-1:-1;;;2361:73:14;;24517:2:17;2361:73:14;;;24499:21:17;24556:2;24536:18;;;24529:30;24595:34;24575:18;;;24568:62;24666:5;24646:18;;;24639:33;24689:19;;2361:73:14;24315:399:17;2361:73:14;2475:11;2462:8;;2452:19;;;;;;;:::i;:::-;;;;;;;;:34;2444:80;;;;-1:-1:-1;;;2444:80:14;;24921:2:17;2444:80:14;;;24903:21:17;24960:2;24940:18;;;24933:30;24999:34;24979:18;;;24972:62;25070:3;25050:18;;;25043:31;25091:19;;2444:80:14;24719:397:17;2444:80:14;2570:27;;;2629:1;2570:27;;;:14;:27;;;;;;:40;;;;2598:11;;;;2570:40;:::i;:::-;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;:61;;;;2698:65;;;;;;;;;;;;;;;;;;;2720:11;;2733;;2698:65;;;;;;2733:11;2698:65;;2733:11;2698:65;;;;;;;;;-1:-1:-1;;2698:65:14;;;;;;;;;;;;;;;;;;;;;;2746:6;;-1:-1:-1;2698:65:14;-1:-1:-1;2754:8:14;;;;;;2698:65;;2754:8;;;;2698:65;;;;;;;;;-1:-1:-1;2698:21:14;;-1:-1:-1;;;2698:65:14:i;:::-;2778:66;2798:11;2811;;2824:6;2832:11;2778:66;;;;;;;;;;:::i;:::-;;;;;;;;2227:624;2094:757;;;;;;:::o;5298:280:13:-;1087:13:16;:11;:13::i;:::-;5421:1:13::1;5411:7;:11;5403:45;;;::::0;-1:-1:-1;;;5403:45:13;;25821:2:17;5403:45:13::1;::::0;::::1;25803:21:17::0;25860:2;25840:18;;;25833:30;25899:23;25879:18;;;25872:51;25940:18;;5403:45:13::1;25619:345:17::0;5403:45:13::1;5458:28;::::0;;::::1;;::::0;;;:15:::1;:28;::::0;;;;;;;:41;;::::1;::::0;;;;;;;;;;:51;;;5524:47;;26192:34:17;;;26242:18;;26235:43;;;;26294:18;;;26287:34;;;5524:47:13::1;::::0;26155:2:17;26140:18;5524:47:13::1;25969:358:17::0;1473:220:15;1087:13:16;:11;:13::i;:::-;1573:22:15::1;:48:::0;;-1:-1:-1;;1573:48:15::1;::::0;::::1;;::::0;;::::1;::::0;;;1636:50:::1;::::0;2069:41:17;;;1636:50:15::1;::::0;2057:2:17;2042:18;1636:50:15::1;1929:187:17::0;4342:195:13;1087:13:16;:11;:13::i;:::-;4439:32:13::1;::::0;::::1;;::::0;;;:19:::1;:32;::::0;;;;:40:::1;4474:5:::0;;4439:32;:40:::1;:::i;2074:198:16:-:0;1087:13;:11;:13::i;:::-;-1:-1:-1;;;;;2162:22:16;::::1;2154:73;;;::::0;-1:-1:-1;;;2154:73:16;;26534:2:17;2154:73:16::1;::::0;::::1;26516:21:17::0;26573:2;26553:18;;;26546:30;26612:34;26592:18;;;26585:62;26683:8;26663:18;;;26656:36;26709:19;;2154:73:16::1;26332:402:17::0;2154:73:16::1;2237:28;2256:8;2237:18;:28::i;:::-;2074:198:::0;:::o;3287:209:13:-;3421:68;;;;;26976:6:17;27009:15;;;3421:68:13;;;26991:34:17;27061:15;;27041:18;;;27034:43;3470:4:13;27093:18:17;;;27086:83;27185:18;;;27178:34;;;3390:12:13;;3421:10;-1:-1:-1;;;;;3421:20:13;;;;26938:19:17;;3421:68:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3421:68:13;;;;;;;;;;;;:::i;:::-;3414:75;3287:209;-1:-1:-1;;;;;3287:209:13:o;974:591:14:-;1123:12;1137:19;1160:153;1194:9;1205:3;1233:34;;;1269:11;1282;1295:6;1303:8;1210:102;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1210:102:14;;;;;;;;;;;;;;;;;;;;;;;;;;;1168:4;;1160:153;;:33;:153::i;:::-;1122:191;;;;1371:7;1366:193;;1455:8;1445:19;;;;;;1394:14;:27;1409:11;1394:27;;;;;;;;;;;;;;;1422:11;1394:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:48;;;;;;;;;;:70;;;;1483:65;;;;1497:11;;1510;;1435:6;;1531:8;;1541:6;;1483:65;:::i;:::-;;;;;;;;1112:453;;974:591;;;;:::o;457:213:15:-;559:4;582:41;;;597:26;582:41;;:81;;-1:-1:-1;952:25:3;937:40;;;;627:36:15;829:155:3;1352:130:16;1240:7;1266:6;-1:-1:-1;;;;;1266:6:16;719:10:2;1415:23:16;1407:68;;;;-1:-1:-1;;;1407:68:16;;29784:2:17;1407:68:16;;;29766:21:17;;;29803:18;;;29796:30;29862:34;29842:18;;;29835:62;29914:18;;1407:68:16;29582:356:17;2143:618:15;2348:71;2368:11;337:1;2390:14;277:1;2348:19;:71::i;:::-;2430:51;2441:5;2448:11;2461:10;2473:7;2430:10;:51::i;:::-;2537:23;;-1:-1:-1;;13902:2:17;13898:15;;;13894:88;2537:23:15;;;13882:101:17;2492:22:15;;;;13999:12:17;;2537:23:15;;;-1:-1:-1;;2537:23:15;;;;;;;;;;2517:65;;;2562:10;;2574:7;;2537:23;2517:65;;:::i;:::-;;;;;;;;;;;;;2492:90;;2592:94;2600:11;2613:9;2624:14;2640:18;2660:14;2676:9;2592:7;:94::i;:::-;2734:10;2702:52;;;;;;:::i;:::-;;;;;;;;2727:5;-1:-1:-1;;;;;2702:52:15;2714:11;2702:52;;;2746:7;2702:52;;;;4911:25:17;;4899:2;4884:18;;4765:177;2702:52:15;;;;;;;;2338:423;2143:618;;;;;;;:::o;1699:438::-;1934:2;1920:17;;1914:24;1962:21;;;1958:173;;1999:52;2008:11;2021;2034:6;2042:8;1999;:52::i;:::-;1958:173;;;2082:38;;-1:-1:-1;;;2082:38:15;;30682:2:17;2082:38:15;;;30664:21:17;30721:2;30701:18;;;30694:30;30760;30740:18;;;30733:58;30808:18;;2082:38:15;30480:352:17;2426:187:16;2499:16;2518:6;;-1:-1:-1;;;;;2534:17:16;;;-1:-1:-1;;2534:17:16;;;;;;2566:40;;2518:6;;;;;;;2566:40;;2499:16;2566:40;2489:124;2426:187;:::o;8865:2712:1:-;8999:12;9051:7;9035:12;9051:7;9045:2;9035:12;:::i;:::-;:23;;9027:50;;;;-1:-1:-1;;;9027:50:1;;31169:2:17;9027:50:1;;;31151:21:17;31208:2;31188:18;;;31181:30;31247:16;31227:18;;;31220:44;31281:18;;9027:50:1;30967:338:17;9027:50:1;9112:16;9121:7;9112:6;:16;:::i;:::-;9095:6;:13;:33;;9087:63;;;;-1:-1:-1;;;9087:63:1;;31512:2:17;9087:63:1;;;31494:21:17;31551:2;31531:18;;;31524:30;31590:19;31570:18;;;31563:47;31627:18;;9087:63:1;31310:341:17;9087:63:1;9161:22;9224:15;;9252:1895;;;;11288:4;11282:11;11269:24;;11466:1;11455:9;11448:20;11514:4;11503:9;11499:20;11493:4;11486:34;9217:2317;;9252:1895;9426:4;9420:11;9407:24;;10053:2;10044:7;10040:16;10419:9;10412:17;10406:4;10402:28;10390:9;10379;10375:25;10371:60;10467:7;10463:2;10459:16;10711:6;10697:9;10690:17;10684:4;10680:28;10668:9;10660:6;10656:22;10652:57;10648:70;10493:417;10744:3;10740:2;10737:11;10493:417;;;10882:9;;10871:21;;10785:4;10777:13;;;;10817;10493:417;;;-1:-1:-1;;10928:26:1;;;11128:2;11111:11;-1:-1:-1;;11107:25:1;11101:4;11094:39;-1:-1:-1;9217:2317:1;-1:-1:-1;11561:9:1;8865:2712;-1:-1:-1;;;;8865:2712:1:o;1118:1240:4:-;1275:4;1281:12;1341:15;1366:13;1389:24;1426:8;1416:19;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1416:19:4;;1389:46;;1904:1;1879;1846:9;1840:16;1812:4;1801:9;1797:20;1767:1;1733:7;1708:4;1690:239;1678:251;;1992:16;1981:27;;2036:8;2027:7;2024:21;2021:76;;;2075:8;2064:19;;2021:76;2178:7;2165:11;2158:28;2294:7;2291:1;2284:4;2271:11;2267:22;2252:50;2329:8;;;;-1:-1:-1;1118:1240:4;-1:-1:-1;;;;;;1118:1240:4:o;3164:367:15:-;3305:22;;;;3301:224;;;3343:63;3358:11;3371:7;3380:14;3396:9;3343:14;:63::i;:::-;3301:224;;;3445:21;;:26;3437:77;;;;-1:-1:-1;;;3437:77:15;;31858:2:17;3437:77:15;;;31840:21:17;31897:2;31877:18;;;31870:30;31936:34;31916:18;;;31909:62;32007:8;31987:18;;;31980:36;32033:19;;3437:77:15;31656:402:17;3437:77:15;3164:367;;;;:::o;1386:447:12:-;499:4:0;;507:1;499:9;524:18;510:46;;;;;;;;:::i;:::-;;;;;;;;;;;;;491:66;;;;;-1:-1:-1;;;491:66:0;;;;;;;;:::i;:::-;-1:-1:-1;719:10:2;-1:-1:-1;;;;;1555:16:12;::::1;::::0;::::1;1551:168;;1595:68;::::0;;;;-1:-1:-1;;;;;32706:15:17;;;1595:68:12::1;::::0;::::1;32688:34:17::0;32758:15;;;32738:18;;;32731:43;32790:18;;;32783:34;;;1603:11:12::1;1595:43;::::0;::::1;::::0;32600:18:17;;1595:68:12::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1587:121;;;::::0;-1:-1:-1;;;1587:121:12;;33280:2:17;1587:121:12::1;::::0;::::1;33262:21:17::0;33319:2;33299:18;;;33292:30;33358:34;33338:18;;;33331:62;33429:11;33409:18;;;33402:39;33458:19;;1587:121:12::1;33078:405:17::0;1587:121:12::1;1728:41;::::0;;;;-1:-1:-1;;;;;33680:55:17;;;1728:41:12::1;::::0;::::1;33662:74:17::0;33752:18;;;33745:34;;;1736:11:12::1;1728:25;::::0;::::1;::::0;33635:18:17;;1728:41:12::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;1784:42:12::1;::::0;;33962:25:17;;;34035:6;34023:19;;34018:2;34003:18;;33996:47;-1:-1:-1;;;;;1784:42:12;::::1;::::0;-1:-1:-1;1784:42:12::1;::::0;-1:-1:-1;33935:18:17;1784:42:12::1;;;;;;;1501:332;1386:447:::0;;;;:::o;2001:491:13:-;2223:32;;;2194:26;2223:32;;;:19;:32;;;;;2194:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2273:13;:20;2297:1;2273:25;2265:86;;;;-1:-1:-1;;;2265:86:13;;34256:2:17;2265:86:13;;;34238:21:17;34295:2;34275:18;;;34268:30;34334:34;34314:18;;;34307:62;34405:18;34385;;;34378:46;34441:19;;2265:86:13;34054:412:17;2265:86:13;2361:124;;;;;-1:-1:-1;;;;;2361:10:13;:15;;;;2384:10;;2361:124;;2396:11;;2409:13;;2424:8;;2434:14;;2450:18;;2470:14;;2361:124;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2184:308;2001:491;;;;;;:::o;2767:391:15:-;2880:17;2899:27;2928:11;2954:8;2943:50;;;;;;;;;;;;:::i;:::-;2877:116;;-1:-1:-1;2877:116:15;-1:-1:-1;2877:116:15;-1:-1:-1;3004:10:15;;-1:-1:-1;3017:27:15;2877:116;3004:10;3017:24;:27::i;:::-;3004:40;;3055:34;3065:11;3078:2;3082:6;3055:9;:34::i;:::-;3140:2;-1:-1:-1;;;;;3104:47:15;3121:11;3104:47;;;3134:4;3144:6;3104:47;;;;;;;:::i;:::-;;;;;;;;2867:291;;;;2767:391;;;;:::o;2498:415:13:-;2633:21;2657:28;2670:14;2657:12;:28::i;:::-;2714;;;;2695:16;2714:28;;;:15;:28;;;;;;;;:35;;;;;;;;;;;;2633:52;;-1:-1:-1;2695:16:13;2714:47;;2752:9;;2714:47;:::i;:::-;2695:66;;2793:1;2779:11;:15;2771:54;;;;-1:-1:-1;;;2771:54:13;;36582:2:17;2771:54:13;;;36564:21:17;36621:2;36601:18;;;36594:30;36660:28;36640:18;;;36633:56;36706:18;;2771:54:13;36380:350:17;2771:54:13;2863:11;2843:16;:31;;2835:71;;;;-1:-1:-1;;;2835:71:13;;36937:2:17;2835:71:13;;;36919:21:17;36976:2;36956:18;;;36949:30;37015:29;36995:18;;;36988:57;37062:18;;2835:71:13;36735:351:17;11583:354:1;11662:7;11706:11;:6;11715:2;11706:11;:::i;:::-;11689:6;:13;:28;;11681:62;;;;-1:-1:-1;;;11681:62:1;;37293:2:17;11681:62:1;;;37275:21:17;37332:2;37312:18;;;37305:30;37371:23;37351:18;;;37344:51;37412:18;;11681:62:1;37091:345:17;11681:62:1;-1:-1:-1;11831:30:1;11847:4;11831:30;11825:37;11864:27;11821:71;;;11583:354::o;1839:238:12:-;499:4:0;;507:1;499:9;524:18;510:46;;;;;;;;:::i;:::-;;;;;;;;;;;;;491:66;;;;;-1:-1:-1;;;491:66:0;;;;;;;;:::i;:::-;-1:-1:-1;1954:54:12::1;::::0;;;;-1:-1:-1;;;;;33680:55:17;;;1954:54:12::1;::::0;::::1;33662:74:17::0;33752:18;;;33745:34;;;1962:11:12::1;1954:33;::::0;::::1;::::0;33635:18:17;;1954:54:12::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;2023:47:12::1;::::0;;33962:25:17;;;34035:6;34023:19;;34018:2;34003:18;;33996:47;-1:-1:-1;;;;;2023:47:12;::::1;::::0;-1:-1:-1;2023:47:12::1;::::0;-1:-1:-1;33935:18:17;2023:47:12::1;;;;;;;1839:238:::0;;;:::o;2919:266:13:-;3001:13;3059:2;3034:14;:21;:27;;3026:68;;;;-1:-1:-1;;;3026:68:13;;37643:2:17;3026:68:13;;;37625:21:17;37682:2;37662:18;;;37655:30;37721;37701:18;;;37694:58;37769:18;;3026:68:13;37441:352:17;3026:68:13;-1:-1:-1;3165:2:13;3145:23;3139:30;;2919:266::o;14:117:17:-;99:6;92:5;88:18;81:5;78:29;68:57;;121:1;118;111:12;136:347;187:8;197:6;251:3;244:4;236:6;232:17;228:27;218:55;;269:1;266;259:12;218:55;-1:-1:-1;292:20:17;;335:18;324:30;;321:50;;;367:1;364;357:12;321:50;404:4;396:6;392:17;380:29;;456:3;449:4;440:6;432;428:19;424:30;421:39;418:59;;;473:1;470;463:12;418:59;136:347;;;;;:::o;488:171::-;555:20;;615:18;604:30;;594:41;;584:69;;649:1;646;639:12;584:69;488:171;;;:::o;664:923::-;770:6;778;786;794;802;810;863:3;851:9;842:7;838:23;834:33;831:53;;;880:1;877;870:12;831:53;919:9;906:23;938:30;962:5;938:30;:::i;:::-;987:5;-1:-1:-1;1043:2:17;1028:18;;1015:32;1066:18;1096:14;;;1093:34;;;1123:1;1120;1113:12;1093:34;1162:58;1212:7;1203:6;1192:9;1188:22;1162:58;:::i;:::-;1239:8;;-1:-1:-1;1136:84:17;-1:-1:-1;1136:84:17;;-1:-1:-1;1293:37:17;1326:2;1311:18;;1293:37;:::i;:::-;1283:47;;1383:2;1372:9;1368:18;1355:32;1339:48;;1412:2;1402:8;1399:16;1396:36;;;1428:1;1425;1418:12;1396:36;;1467:60;1519:7;1508:8;1497:9;1493:24;1467:60;:::i;:::-;664:923;;;;-1:-1:-1;664:923:17;;-1:-1:-1;664:923:17;;1546:8;;664:923;-1:-1:-1;;;664:923:17:o;1592:332::-;1650:6;1703:2;1691:9;1682:7;1678:23;1674:32;1671:52;;;1719:1;1716;1709:12;1671:52;1758:9;1745:23;1808:66;1801:5;1797:78;1790:5;1787:89;1777:117;;1890:1;1887;1880:12;2121:245;2179:6;2232:2;2220:9;2211:7;2207:23;2203:32;2200:52;;;2248:1;2245;2238:12;2200:52;2287:9;2274:23;2306:30;2330:5;2306:30;:::i;2371:118::-;2457:5;2450:13;2443:21;2436:5;2433:32;2423:60;;2479:1;2476;2469:12;2494:1055;2607:6;2615;2623;2631;2639;2647;2655;2708:3;2696:9;2687:7;2683:23;2679:33;2676:53;;;2725:1;2722;2715:12;2676:53;2764:9;2751:23;2783:30;2807:5;2783:30;:::i;:::-;2832:5;-1:-1:-1;2888:2:17;2873:18;;2860:32;2911:18;2941:14;;;2938:34;;;2968:1;2965;2958:12;2938:34;3007:58;3057:7;3048:6;3037:9;3033:22;3007:58;:::i;:::-;3084:8;;-1:-1:-1;2981:84:17;-1:-1:-1;3166:2:17;3151:18;;3138:32;;-1:-1:-1;3222:2:17;3207:18;;3194:32;;-1:-1:-1;3235:30:17;3194:32;3235:30;:::i;:::-;3284:7;;-1:-1:-1;3344:3:17;3329:19;;3316:33;;3361:16;;;3358:36;;;3390:1;3387;3380:12;3358:36;;3429:60;3481:7;3470:8;3459:9;3455:24;3429:60;:::i;:::-;2494:1055;;;;-1:-1:-1;2494:1055:17;;-1:-1:-1;2494:1055:17;;;;3403:86;;-1:-1:-1;;;2494:1055:17:o;3807:542::-;3885:6;3893;3901;3954:2;3942:9;3933:7;3929:23;3925:32;3922:52;;;3970:1;3967;3960:12;3922:52;4009:9;3996:23;4028:30;4052:5;4028:30;:::i;:::-;4077:5;-1:-1:-1;4133:2:17;4118:18;;4105:32;4160:18;4149:30;;4146:50;;;4192:1;4189;4182:12;4146:50;4231:58;4281:7;4272:6;4261:9;4257:22;4231:58;:::i;:::-;3807:542;;4308:8;;-1:-1:-1;4205:84:17;;-1:-1:-1;;;;3807:542:17:o;4354:154::-;-1:-1:-1;;;;;4433:5:17;4429:54;4422:5;4419:65;4409:93;;4498:1;4495;4488:12;4513:247;4572:6;4625:2;4613:9;4604:7;4600:23;4596:32;4593:52;;;4641:1;4638;4631:12;4593:52;4680:9;4667:23;4699:31;4724:5;4699:31;:::i;5140:1353::-;5282:6;5290;5298;5306;5314;5322;5330;5338;5346;5399:3;5387:9;5378:7;5374:23;5370:33;5367:53;;;5416:1;5413;5406:12;5367:53;5455:9;5442:23;5474:31;5499:5;5474:31;:::i;:::-;5524:5;-1:-1:-1;5581:2:17;5566:18;;5553:32;5594;5553;5594;:::i;:::-;5645:7;-1:-1:-1;5703:2:17;5688:18;;5675:32;5726:18;5756:14;;;5753:34;;;5783:1;5780;5773:12;5753:34;5822:58;5872:7;5863:6;5852:9;5848:22;5822:58;:::i;:::-;5899:8;;-1:-1:-1;5796:84:17;-1:-1:-1;5981:2:17;5966:18;;5953:32;;-1:-1:-1;6037:3:17;6022:19;;6009:33;;-1:-1:-1;6051:33:17;6009;6051;:::i;:::-;6103:7;;-1:-1:-1;6162:3:17;6147:19;;6134:33;;6176;6134;6176;:::i;:::-;6228:7;;-1:-1:-1;6288:3:17;6273:19;;6260:33;;6305:16;;;6302:36;;;6334:1;6331;6324:12;6302:36;;6373:60;6425:7;6414:8;6403:9;6399:24;6373:60;:::i;:::-;6347:86;;6452:8;6442:18;;;6479:8;6469:18;;;5140:1353;;;;;;;;;;;:::o;6498:184::-;-1:-1:-1;;;6547:1:17;6540:88;6647:4;6644:1;6637:15;6671:4;6668:1;6661:15;6687:334;6758:2;6752:9;6814:2;6804:13;;-1:-1:-1;;6800:86:17;6788:99;;6917:18;6902:34;;6938:22;;;6899:62;6896:88;;;6964:18;;:::i;:::-;7000:2;6993:22;6687:334;;-1:-1:-1;6687:334:17:o;7026:245::-;7074:4;7107:18;7099:6;7096:30;7093:56;;;7129:18;;:::i;:::-;-1:-1:-1;7186:2:17;7174:15;-1:-1:-1;;7170:88:17;7260:4;7166:99;;7026:245::o;7276:876::-;7360:6;7368;7376;7429:2;7417:9;7408:7;7404:23;7400:32;7397:52;;;7445:1;7442;7435:12;7397:52;7484:9;7471:23;7503:30;7527:5;7503:30;:::i;:::-;7552:5;-1:-1:-1;7608:2:17;7593:18;;7580:32;7635:18;7624:30;;7621:50;;;7667:1;7664;7657:12;7621:50;7690:22;;7743:4;7735:13;;7731:27;-1:-1:-1;7721:55:17;;7772:1;7769;7762:12;7721:55;7808:2;7795:16;7833:48;7849:31;7877:2;7849:31;:::i;:::-;7833:48;:::i;:::-;7904:2;7897:5;7890:17;7944:7;7939:2;7934;7930;7926:11;7922:20;7919:33;7916:53;;;7965:1;7962;7955:12;7916:53;8020:2;8015;8011;8007:11;8002:2;7995:5;7991:14;7978:45;8064:1;8059:2;8054;8047:5;8043:14;8039:23;8032:34;8085:5;8075:15;;;;;8109:37;8142:2;8131:9;8127:18;8109:37;:::i;:::-;8099:47;;7276:876;;;;;:::o;8339:250::-;8424:1;8434:113;8448:6;8445:1;8442:13;8434:113;;;8524:11;;;8518:18;8505:11;;;8498:39;8470:2;8463:10;8434:113;;;-1:-1:-1;;8581:1:17;8563:16;;8556:27;8339:250::o;8594:329::-;8635:3;8673:5;8667:12;8700:6;8695:3;8688:19;8716:76;8785:6;8778:4;8773:3;8769:14;8762:4;8755:5;8751:16;8716:76;:::i;:::-;8837:2;8825:15;-1:-1:-1;;8821:88:17;8812:98;;;;8912:4;8808:109;;8594:329;-1:-1:-1;;8594:329:17:o;8928:217::-;9075:2;9064:9;9057:21;9038:4;9095:44;9135:2;9124:9;9120:18;9112:6;9095:44;:::i;9150:384::-;9216:6;9224;9277:2;9265:9;9256:7;9252:23;9248:32;9245:52;;;9293:1;9290;9283:12;9245:52;9332:9;9319:23;9351:30;9375:5;9351:30;:::i;:::-;9400:5;-1:-1:-1;9457:2:17;9442:18;;9429:32;9470;9429;9470;:::i;:::-;9521:7;9511:17;;;9150:384;;;;;:::o;9770:180::-;9829:6;9882:2;9870:9;9861:7;9857:23;9853:32;9850:52;;;9898:1;9895;9888:12;9850:52;-1:-1:-1;9921:23:17;;9770:180;-1:-1:-1;9770:180:17:o;10212:750::-;10307:6;10315;10323;10331;10339;10392:3;10380:9;10371:7;10367:23;10363:33;10360:53;;;10409:1;10406;10399:12;10360:53;10448:9;10435:23;10467:30;10491:5;10467:30;:::i;:::-;10516:5;-1:-1:-1;10573:2:17;10558:18;;10545:32;10586;10545;10586;:::i;:::-;10637:7;-1:-1:-1;10691:2:17;10676:18;;10663:32;;-1:-1:-1;10746:2:17;10731:18;;10718:32;10773:18;10762:30;;10759:50;;;10805:1;10802;10795:12;10759:50;10844:58;10894:7;10885:6;10874:9;10870:22;10844:58;:::i;:::-;10212:750;;;;-1:-1:-1;10212:750:17;;-1:-1:-1;10921:8:17;;10818:84;10212:750;-1:-1:-1;;;10212:750:17:o;10967:452::-;11042:6;11050;11058;11111:2;11099:9;11090:7;11086:23;11082:32;11079:52;;;11127:1;11124;11117:12;11079:52;11166:9;11153:23;11185:30;11209:5;11185:30;:::i;:::-;11234:5;-1:-1:-1;11291:2:17;11276:18;;11263:32;11304;11263;11304;:::i;:::-;10967:452;;11355:7;;-1:-1:-1;;;11409:2:17;11394:18;;;;11381:32;;10967:452::o;11424:241::-;11480:6;11533:2;11521:9;11512:7;11508:23;11504:32;11501:52;;;11549:1;11546;11539:12;11501:52;11588:9;11575:23;11607:28;11629:5;11607:28;:::i;11670:594::-;11754:6;11762;11770;11778;11831:3;11819:9;11810:7;11806:23;11802:33;11799:53;;;11848:1;11845;11838:12;11799:53;11887:9;11874:23;11906:30;11930:5;11906:30;:::i;:::-;11955:5;-1:-1:-1;12012:2:17;11997:18;;11984:32;12025;11984;12025;:::i;:::-;12076:7;-1:-1:-1;12135:2:17;12120:18;;12107:32;12148:33;12107:32;12148:33;:::i;:::-;11670:594;;;;-1:-1:-1;12200:7:17;;12254:2;12239:18;12226:32;;-1:-1:-1;;11670:594:17:o;12628:437::-;12707:1;12703:12;;;;12750;;;12771:61;;12825:4;12817:6;12813:17;12803:27;;12771:61;12878:2;12870:6;12867:14;12847:18;12844:38;12841:218;;-1:-1:-1;;;12912:1:17;12905:88;13016:4;13013:1;13006:15;13044:4;13041:1;13034:15;12841:218;;12628:437;;;:::o;13070:271::-;13253:6;13245;13240:3;13227:33;13209:3;13279:16;;13304:13;;;13279:16;13070:271;-1:-1:-1;13070:271:17:o;14022:325::-;14110:6;14105:3;14098:19;14162:6;14155:5;14148:4;14143:3;14139:14;14126:43;;14214:1;14207:4;14198:6;14193:3;14189:16;14185:27;14178:38;14080:3;14336:4;-1:-1:-1;;14261:2:17;14253:6;14249:15;14245:88;14240:3;14236:98;14232:109;14225:116;;14022:325;;;;:::o;14352:559::-;14621:6;14613;14609:19;14598:9;14591:38;14665:3;14660:2;14649:9;14645:18;14638:31;14572:4;14692:45;14732:3;14721:9;14717:19;14709:6;14692:45;:::i;:::-;14785:9;14777:6;14773:22;14768:2;14757:9;14753:18;14746:50;14813:49;14855:6;14847;14839;14813:49;:::i;:::-;14805:57;;;14898:6;14893:2;14882:9;14878:18;14871:34;14352:559;;;;;;;;:::o;14916:690::-;15207:6;15199;15195:19;15184:9;15177:38;-1:-1:-1;;;;;15255:6:17;15251:55;15246:2;15235:9;15231:18;15224:83;15343:3;15338:2;15327:9;15323:18;15316:31;15158:4;15370:45;15410:3;15399:9;15395:19;15387:6;15370:45;:::i;:::-;15465:6;15458:14;15451:22;15446:2;15435:9;15431:18;15424:50;15523:9;15515:6;15511:22;15505:3;15494:9;15490:19;15483:51;15551:49;15593:6;15585;15577;15551:49;:::i;:::-;15543:57;14916:690;-1:-1:-1;;;;;;;;;14916:690:17:o;15611:245::-;15690:6;15698;15751:2;15739:9;15730:7;15726:23;15722:32;15719:52;;;15767:1;15764;15757:12;15719:52;-1:-1:-1;;15790:16:17;;15846:2;15831:18;;;15825:25;15790:16;;15825:25;;-1:-1:-1;15611:245:17:o;15861:326::-;16056:6;16048;16044:19;16033:9;16026:38;16100:2;16095;16084:9;16080:18;16073:30;16007:4;16120:61;16177:2;16166:9;16162:18;16154:6;16146;16120:61;:::i;16318:780::-;16368:3;16409:5;16403:12;16438:36;16464:9;16438:36;:::i;:::-;16493:1;16510:18;;;16537:191;;;;16742:1;16737:355;;;;16503:589;;16537:191;-1:-1:-1;;16574:9:17;16570:82;16565:3;16558:95;16708:6;16701:14;16694:22;16686:6;16682:35;16677:3;16673:45;16666:52;;16537:191;;16737:355;16768:5;16765:1;16758:16;16797:4;16842:2;16839:1;16829:16;16867:1;16881:165;16895:6;16892:1;16889:13;16881:165;;;16973:14;;16960:11;;;16953:35;17016:16;;;;16910:10;;16881:165;;;16885:3;;;17075:6;17070:3;17066:16;17059:23;;16503:589;;;;;16318:780;;;;:::o;17103:365::-;17322:3;17353:38;17387:3;17379:6;17353:38;:::i;:::-;17414:17;17400:32;;17459:2;17448:14;;17103:365;-1:-1:-1;;;17103:365:17:o;17697:368::-;17916:3;17947:38;17981:3;17973:6;17947:38;:::i;:::-;18008:20;17994:35;;18056:2;18045:14;;17697:368;-1:-1:-1;;;17697:368:17:o;18477:544::-;18578:2;18573:3;18570:11;18567:448;;;18614:1;18639:5;18635:2;18628:17;18684:4;18680:2;18670:19;18754:2;18742:10;18738:19;18735:1;18731:27;18725:4;18721:38;18790:4;18778:10;18775:20;18772:47;;;-1:-1:-1;18813:4:17;18772:47;18868:2;18863:3;18859:12;18856:1;18852:20;18846:4;18842:31;18832:41;;18923:82;18941:2;18934:5;18931:13;18923:82;;;18986:17;;;18967:1;18956:13;18923:82;;18567:448;18477:544;;;:::o;19257:1322::-;19379:18;19374:3;19371:27;19368:53;;;19401:18;;:::i;:::-;19430:93;19519:3;19479:38;19511:4;19505:11;19479:38;:::i;:::-;19473:4;19430:93;:::i;:::-;19549:1;19574:2;19569:3;19566:11;19591:1;19586:735;;;;20365:1;20382:3;20379:93;;;-1:-1:-1;20438:19:17;;;20425:33;20379:93;-1:-1:-1;;19154:1:17;19150:11;;;19146:84;19142:89;19132:100;19238:1;19234:11;;;19129:117;20485:78;;19559:1014;;19586:735;16265:1;16258:14;;;16302:4;16289:18;;-1:-1:-1;;19622:76:17;;;19782:9;19804:229;19818:7;19815:1;19812:14;19804:229;;;19907:19;;;19894:33;19879:49;;20014:4;19999:20;;;;19967:1;19955:14;;;;19834:12;19804:229;;;19808:3;20061;20052:7;20049:16;20046:219;;;-1:-1:-1;;20175:3:17;20169;20166:1;20162:11;20158:21;20154:94;20150:99;20137:9;20132:3;20128:19;20115:33;20111:139;20103:6;20096:155;20046:219;;;20308:1;20302:3;20299:1;20295:11;20291:19;20285:4;20278:33;19559:1014;;19257:1322;;;:::o;20584:184::-;20654:6;20707:2;20695:9;20686:7;20682:23;20678:32;20675:52;;;20723:1;20720;20713:12;20675:52;-1:-1:-1;20746:16:17;;20584:184;-1:-1:-1;20584:184:17:o;20773:481::-;21002:3;21030:38;21064:3;21056:6;21030:38;:::i;:::-;21088:34;21077:46;;21152:34;21147:2;21139:11;;21132:55;21216:4;21211:2;21203:11;;21196:25;21245:2;21237:11;;20773:481;-1:-1:-1;;;20773:481:17:o;21259:395::-;21470:6;21462;21457:3;21444:33;21540:2;21536:15;;;;-1:-1:-1;;21532:88:17;21496:16;;21521:100;;;21645:2;21637:11;;21259:395;-1:-1:-1;21259:395:17:o;21659:1468::-;21783:3;21777:10;21810:18;21802:6;21799:30;21796:56;;;21832:18;;:::i;:::-;21861:96;21950:6;21910:38;21942:4;21936:11;21910:38;:::i;:::-;21904:4;21861:96;:::i;:::-;22012:4;;22076:2;22065:14;;22093:1;22088:782;;;;22914:1;22931:6;22928:89;;;-1:-1:-1;22983:19:17;;;22977:26;22928:89;-1:-1:-1;;19154:1:17;19150:11;;;19146:84;19142:89;19132:100;19238:1;19234:11;;;19129:117;23030:81;;22058:1063;;22088:782;16265:1;16258:14;;;16302:4;16289:18;;-1:-1:-1;;22124:79:17;;;22301:236;22315:7;22312:1;22309:14;22301:236;;;22404:19;;;22398:26;22383:42;;22496:27;;;;22464:1;22452:14;;;;22331:19;;22301:236;;;22305:3;22565:6;22556:7;22553:19;22550:261;;;22626:19;;;22620:26;-1:-1:-1;;22709:1:17;22705:14;;;22721:3;22701:24;22697:97;22693:102;22678:118;22663:134;;22550:261;-1:-1:-1;;;;;22857:1:17;22841:14;;;22837:22;22824:36;;-1:-1:-1;21659:1468:17:o;23490:184::-;-1:-1:-1;;;23539:1:17;23532:88;23639:4;23636:1;23629:15;23663:4;23660:1;23653:15;23679:128;23746:9;;;23767:11;;;23764:37;;;23781:18;;:::i;23812:498::-;24012:4;24041:6;24086:2;24078:6;24074:15;24063:9;24056:34;24138:2;24130:6;24126:15;24121:2;24110:9;24106:18;24099:43;;24178:6;24173:2;24162:9;24158:18;24151:34;24221:3;24216:2;24205:9;24201:18;24194:31;24242:62;24299:3;24288:9;24284:19;24276:6;24268;24242:62;:::i;:::-;24234:70;23812:498;-1:-1:-1;;;;;;;23812:498:17:o;25121:493::-;25370:6;25362;25358:19;25347:9;25340:38;25414:3;25409:2;25398:9;25394:18;25387:31;25321:4;25435:62;25492:3;25481:9;25477:19;25469:6;25461;25435:62;:::i;:::-;25545:18;25533:31;;;;25528:2;25513:18;;25506:59;-1:-1:-1;25596:2:17;25581:18;25574:34;25427:70;25121:493;-1:-1:-1;;;25121:493:17:o;27223:441::-;27276:5;27329:3;27322:4;27314:6;27310:17;27306:27;27296:55;;27347:1;27344;27337:12;27296:55;27376:6;27370:13;27407:48;27423:31;27451:2;27423:31;:::i;27407:48::-;27480:2;27471:7;27464:19;27526:3;27519:4;27514:2;27506:6;27502:15;27498:26;27495:35;27492:55;;;27543:1;27540;27533:12;27492:55;27556:77;27630:2;27623:4;27614:7;27610:18;27603:4;27595:6;27591:17;27556:77;:::i;:::-;27651:7;27223:441;-1:-1:-1;;;;27223:441:17:o;27669:335::-;27748:6;27801:2;27789:9;27780:7;27776:23;27772:32;27769:52;;;27817:1;27814;27807:12;27769:52;27850:9;27844:16;27883:18;27875:6;27872:30;27869:50;;;27915:1;27912;27905:12;27869:50;27938:60;27990:7;27981:6;27970:9;27966:22;27938:60;:::i;28009:555::-;28266:6;28258;28254:19;28243:9;28236:38;28310:3;28305:2;28294:9;28290:18;28283:31;28217:4;28337:45;28377:3;28366:9;28362:19;28354:6;28337:45;:::i;:::-;28430:18;28422:6;28418:31;28413:2;28402:9;28398:18;28391:59;28498:9;28490:6;28486:22;28481:2;28470:9;28466:18;28459:50;28526:32;28551:6;28543;28526:32;:::i;28569:287::-;28698:3;28736:6;28730:13;28752:66;28811:6;28806:3;28799:4;28791:6;28787:17;28752:66;:::i;:::-;28834:16;;;;;28569:287;-1:-1:-1;;28569:287:17:o;28861:716::-;29164:6;29156;29152:19;29141:9;29134:38;29208:3;29203:2;29192:9;29188:18;29181:31;29115:4;29235:45;29275:3;29264:9;29260:19;29252:6;29235:45;:::i;:::-;29328:18;29320:6;29316:31;29311:2;29300:9;29296:18;29289:59;29396:9;29388:6;29384:22;29379:2;29368:9;29364:18;29357:50;29430:32;29455:6;29447;29430:32;:::i;:::-;29416:46;;29511:9;29503:6;29499:22;29493:3;29482:9;29478:19;29471:51;29539:32;29564:6;29556;29539:32;:::i;:::-;29531:40;28861:716;-1:-1:-1;;;;;;;;28861:716:17:o;29943:532::-;30202:6;30194;30190:19;30179:9;30172:38;30246:3;30241:2;30230:9;30226:18;30219:31;30153:4;30273:45;30313:3;30302:9;30298:19;30290:6;30273:45;:::i;:::-;30366:9;30358:6;30354:22;30349:2;30338:9;30334:18;30327:50;30394:32;30419:6;30411;30394:32;:::i;:::-;30386:40;;;30462:6;30457:2;30446:9;30442:18;30435:34;29943:532;;;;;;;:::o;30837:125::-;30902:9;;;30923:10;;;30920:36;;;30936:18;;:::i;32063:357::-;32281:3;32312:38;32346:3;32338:6;32312:38;:::i;:::-;32373:11;32359:26;;32412:1;32401:13;;32063:357;-1:-1:-1;;;32063:357:17:o;32828:245::-;32895:6;32948:2;32936:9;32927:7;32923:23;32919:32;32916:52;;;32964:1;32961;32954:12;32916:52;32996:9;32990:16;33015:28;33037:5;33015:28;:::i;34471:860::-;34820:6;34812;34808:19;34797:9;34790:38;34864:3;34859:2;34848:9;34844:18;34837:31;34771:4;34891:45;34931:3;34920:9;34916:19;34908:6;34891:45;:::i;:::-;34984:9;34976:6;34972:22;34967:2;34956:9;34952:18;34945:50;35018:32;35043:6;35035;35018:32;:::i;:::-;-1:-1:-1;;;;;35147:15:17;;;35142:2;35127:18;;35120:43;35200:15;;35194:3;35179:19;;35172:44;35253:22;;;35247:3;35232:19;;35225:51;35004:46;-1:-1:-1;35293:32:17;35004:46;35310:6;35293:32;:::i;35336:746::-;35450:6;35458;35466;35474;35527:3;35515:9;35506:7;35502:23;35498:33;35495:53;;;35544:1;35541;35534:12;35495:53;35576:9;35570:16;35595:30;35619:5;35595:30;:::i;:::-;35693:2;35678:18;;35672:25;35644:5;;-1:-1:-1;35716:18:17;35746:14;;;35743:34;;;35773:1;35770;35763:12;35743:34;35796:60;35848:7;35839:6;35828:9;35824:22;35796:60;:::i;:::-;35786:70;;35902:2;35891:9;35887:18;35881:25;35865:41;;35931:2;35921:8;35918:16;35915:36;;;35947:1;35944;35937:12;35915:36;;35970:62;36024:7;36013:8;36002:9;35998:24;35970:62;:::i;:::-;36072:2;36057:18;;;;36051:25;35336:746;;;;-1:-1:-1;;;;35336:746:17:o;36087:288::-;36262:2;36251:9;36244:21;36225:4;36282:44;36322:2;36311:9;36307:18;36299:6;36282:44;:::i;:::-;36274:52;;36362:6;36357:2;36346:9;36342:18;36335:34;36087:288;;;;;:::o
Swarm Source
ipfs://fe95330fca94ac50c88a934bd194657bf2e6218c8aa063f4b0137d025e8f276d
Loading...
Loading
Loading...
Loading
OVERVIEW
Enables teleportation of d2o through Layer Zero.Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.