Overview
ETH Balance
0.00020214 ETH
Eth Value
$0.69 (@ $3,398.84/ETH)More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 4,807 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Swap | 20144949 | 190 days ago | IN | 0.00020214 ETH | 0.00035224 | ||||
Extract Fee | 16676050 | 677 days ago | IN | 0 ETH | 0.00083753 | ||||
Swap | 16420512 | 712 days ago | IN | 0.000675 ETH | 0.00347291 | ||||
Remove_liquidity | 16373637 | 719 days ago | IN | 0.00104526 ETH | 0.00283156 | ||||
Remove_liquidity | 15945681 | 779 days ago | IN | 0.00940653 ETH | 0.0028082 | ||||
Remove_liquidity | 15911029 | 783 days ago | IN | 0.00619523 ETH | 0.00164345 | ||||
Swap | 15875300 | 788 days ago | IN | 0.00000818 ETH | 0.00197197 | ||||
Extract Fee | 15874893 | 788 days ago | IN | 0 ETH | 0.00023654 | ||||
Swap | 15866273 | 790 days ago | IN | 0.00065859 ETH | 0.00118357 | ||||
Swap | 15844833 | 793 days ago | IN | 0.0000007 ETH | 0.0021696 | ||||
Swap | 15844158 | 793 days ago | IN | 0.00064212 ETH | 0.00256493 | ||||
Swap | 15844056 | 793 days ago | IN | 0.00064268 ETH | 0.00236747 | ||||
Swap | 15843637 | 793 days ago | IN | 0.00000873 ETH | 0.00498248 | ||||
Swap | 15843095 | 793 days ago | IN | 0.00063887 ETH | 0.00256459 | ||||
Swap | 15842098 | 793 days ago | IN | 0.00000901 ETH | 0.00282154 | ||||
Remove_liquidity | 15683905 | 815 days ago | IN | 0.00073217 ETH | 0.00300813 | ||||
Swap | 15550668 | 834 days ago | IN | 0 ETH | 0.00020574 | ||||
Swap | 15550668 | 834 days ago | IN | 0.00064801 ETH | 0.00093268 | ||||
Swap | 15550477 | 834 days ago | IN | 0 ETH | 0.00081756 | ||||
Swap | 15548337 | 834 days ago | IN | 0 ETH | 0.00147764 | ||||
Remove_liquidity | 15462058 | 848 days ago | IN | 0.00660872 ETH | 0.00082166 | ||||
Remove_liquidity | 15413309 | 856 days ago | IN | 0.00378259 ETH | 0.00096622 | ||||
Swap | 15366911 | 863 days ago | IN | 0.00000376 ETH | 0.00246241 | ||||
Swap | 15366909 | 863 days ago | IN | 0.00000376 ETH | 0.00235154 | ||||
Swap | 15366676 | 863 days ago | IN | 0.00000428 ETH | 0.00180876 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
16676050 | 677 days ago | 0.01733021 ETH | ||||
15874893 | 788 days ago | 0.01498076 ETH | ||||
15536871 | 836 days ago | 0.00058044 ETH | ||||
15358001 | 865 days ago | 0.02052771 ETH | ||||
15190018 | 891 days ago | 0.2 ETH | ||||
15154018 | 896 days ago | 0.0006596 ETH | ||||
15153529 | 896 days ago | 20 ETH | ||||
15134417 | 899 days ago | 0.24 ETH | ||||
15132939 | 900 days ago | 0.01370967 ETH | ||||
15123858 | 901 days ago | 6.1 ETH | ||||
15123762 | 901 days ago | 3.9 ETH | ||||
15123727 | 901 days ago | 3.8 ETH | ||||
15123648 | 901 days ago | 0.25 ETH | ||||
15093833 | 906 days ago | 0.08433028 ETH | ||||
15062991 | 910 days ago | 0.00070254 ETH | ||||
15062588 | 911 days ago | 5 ETH | ||||
15046157 | 913 days ago | 0.00066492 ETH | ||||
15018709 | 918 days ago | 0.81 ETH | ||||
15008230 | 920 days ago | 0.9 ETH | ||||
14978337 | 926 days ago | 0.06123054 ETH | ||||
14967573 | 927 days ago | 0.10781171 ETH | ||||
14954747 | 930 days ago | 0.00029077 ETH | ||||
14900026 | 939 days ago | 1 ETH | ||||
14868339 | 944 days ago | 120 ETH | ||||
14868308 | 944 days ago | 150 ETH |
Loading...
Loading
Contract Name:
Swapper
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-11-10 */ pragma solidity ^0.6.0; library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b != 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } library ZeroCopySink { /* @notice Convert boolean value into bytes * @param b The boolean value * @return Converted bytes array */ function WriteBool(bool b) internal pure returns (bytes memory) { bytes memory buff; assembly{ buff := mload(0x40) mstore(buff, 1) switch iszero(b) case 1 { mstore(add(buff, 0x20), shl(248, 0x00)) // mstore8(add(buff, 0x20), 0x00) } default { mstore(add(buff, 0x20), shl(248, 0x01)) // mstore8(add(buff, 0x20), 0x01) } mstore(0x40, add(buff, 0x21)) } return buff; } /* @notice Convert byte value into bytes * @param b The byte value * @return Converted bytes array */ function WriteByte(byte b) internal pure returns (bytes memory) { return WriteUint8(uint8(b)); } /* @notice Convert uint8 value into bytes * @param v The uint8 value * @return Converted bytes array */ function WriteUint8(uint8 v) internal pure returns (bytes memory) { bytes memory buff; assembly{ buff := mload(0x40) mstore(buff, 1) mstore(add(buff, 0x20), shl(248, v)) // mstore(add(buff, 0x20), byte(0x1f, v)) mstore(0x40, add(buff, 0x21)) } return buff; } /* @notice Convert uint16 value into bytes * @param v The uint16 value * @return Converted bytes array */ function WriteUint16(uint16 v) internal pure returns (bytes memory) { bytes memory buff; assembly{ buff := mload(0x40) let byteLen := 0x02 mstore(buff, byteLen) for { let mindex := 0x00 let vindex := 0x1f } lt(mindex, byteLen) { mindex := add(mindex, 0x01) vindex := sub(vindex, 0x01) }{ mstore8(add(add(buff, 0x20), mindex), byte(vindex, v)) } mstore(0x40, add(buff, 0x22)) } return buff; } /* @notice Convert uint32 value into bytes * @param v The uint32 value * @return Converted bytes array */ function WriteUint32(uint32 v) internal pure returns(bytes memory) { bytes memory buff; assembly{ buff := mload(0x40) let byteLen := 0x04 mstore(buff, byteLen) for { let mindex := 0x00 let vindex := 0x1f } lt(mindex, byteLen) { mindex := add(mindex, 0x01) vindex := sub(vindex, 0x01) }{ mstore8(add(add(buff, 0x20), mindex), byte(vindex, v)) } mstore(0x40, add(buff, 0x24)) } return buff; } /* @notice Convert uint64 value into bytes * @param v The uint64 value * @return Converted bytes array */ function WriteUint64(uint64 v) internal pure returns(bytes memory) { bytes memory buff; assembly{ buff := mload(0x40) let byteLen := 0x08 mstore(buff, byteLen) for { let mindex := 0x00 let vindex := 0x1f } lt(mindex, byteLen) { mindex := add(mindex, 0x01) vindex := sub(vindex, 0x01) }{ mstore8(add(add(buff, 0x20), mindex), byte(vindex, v)) } mstore(0x40, add(buff, 0x28)) } return buff; } /* @notice Convert limited uint256 value into bytes * @param v The uint256 value * @return Converted bytes array */ function WriteUint255(uint256 v) internal pure returns (bytes memory) { require(v <= 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, "Value exceeds uint255 range"); bytes memory buff; assembly{ buff := mload(0x40) let byteLen := 0x20 mstore(buff, byteLen) for { let mindex := 0x00 let vindex := 0x1f } lt(mindex, byteLen) { mindex := add(mindex, 0x01) vindex := sub(vindex, 0x01) }{ mstore8(add(add(buff, 0x20), mindex), byte(vindex, v)) } mstore(0x40, add(buff, 0x40)) } return buff; } /* @notice Encode bytes format data into bytes * @param data The bytes array data * @return Encoded bytes array */ function WriteVarBytes(bytes memory data) internal pure returns (bytes memory) { uint64 l = uint64(data.length); return abi.encodePacked(WriteVarUint(l), data); } function WriteVarUint(uint64 v) internal pure returns (bytes memory) { if (v < 0xFD){ return WriteUint8(uint8(v)); } else if (v <= 0xFFFF) { return abi.encodePacked(WriteByte(0xFD), WriteUint16(uint16(v))); } else if (v <= 0xFFFFFFFF) { return abi.encodePacked(WriteByte(0xFE), WriteUint32(uint32(v))); } else { return abi.encodePacked(WriteByte(0xFF), WriteUint64(uint64(v))); } } } library ZeroCopySource { /* @notice Read next byte as boolean type starting at offset from buff * @param buff Source bytes array * @param offset The position from where we read the boolean value * @return The the read boolean value and new offset */ function NextBool(bytes memory buff, uint256 offset) internal pure returns(bool, uint256) { require(offset + 1 <= buff.length && offset < offset + 1, "Offset exceeds limit"); // byte === bytes1 byte v; assembly{ v := mload(add(add(buff, 0x20), offset)) } bool value; if (v == 0x01) { value = true; } else if (v == 0x00) { value = false; } else { revert("NextBool value error"); } return (value, offset + 1); } /* @notice Read next byte starting at offset from buff * @param buff Source bytes array * @param offset The position from where we read the byte value * @return The read byte value and new offset */ function NextByte(bytes memory buff, uint256 offset) internal pure returns (byte, uint256) { require(offset + 1 <= buff.length && offset < offset + 1, "NextByte, Offset exceeds maximum"); byte v; assembly{ v := mload(add(add(buff, 0x20), offset)) } return (v, offset + 1); } /* @notice Read next byte as uint8 starting at offset from buff * @param buff Source bytes array * @param offset The position from where we read the byte value * @return The read uint8 value and new offset */ function NextUint8(bytes memory buff, uint256 offset) internal pure returns (uint8, uint256) { require(offset + 1 <= buff.length && offset < offset + 1, "NextUint8, Offset exceeds maximum"); uint8 v; assembly{ let tmpbytes := mload(0x40) let bvalue := mload(add(add(buff, 0x20), offset)) mstore8(tmpbytes, byte(0, bvalue)) mstore(0x40, add(tmpbytes, 0x01)) v := mload(sub(tmpbytes, 0x1f)) } return (v, offset + 1); } /* @notice Read next two bytes as uint16 type starting from offset * @param buff Source bytes array * @param offset The position from where we read the uint16 value * @return The read uint16 value and updated offset */ function NextUint16(bytes memory buff, uint256 offset) internal pure returns (uint16, uint256) { require(offset + 2 <= buff.length && offset < offset + 2, "NextUint16, offset exceeds maximum"); uint16 v; assembly { let tmpbytes := mload(0x40) let bvalue := mload(add(add(buff, 0x20), offset)) mstore8(tmpbytes, byte(0x01, bvalue)) mstore8(add(tmpbytes, 0x01), byte(0, bvalue)) mstore(0x40, add(tmpbytes, 0x02)) v := mload(sub(tmpbytes, 0x1e)) } return (v, offset + 2); } /* @notice Read next four bytes as uint32 type starting from offset * @param buff Source bytes array * @param offset The position from where we read the uint32 value * @return The read uint32 value and updated offset */ function NextUint32(bytes memory buff, uint256 offset) internal pure returns (uint32, uint256) { require(offset + 4 <= buff.length && offset < offset + 4, "NextUint32, offset exceeds maximum"); uint32 v; assembly { let tmpbytes := mload(0x40) let byteLen := 0x04 for { let tindex := 0x00 let bindex := sub(byteLen, 0x01) let bvalue := mload(add(add(buff, 0x20), offset)) } lt(tindex, byteLen) { tindex := add(tindex, 0x01) bindex := sub(bindex, 0x01) }{ mstore8(add(tmpbytes, tindex), byte(bindex, bvalue)) } mstore(0x40, add(tmpbytes, byteLen)) v := mload(sub(tmpbytes, sub(0x20, byteLen))) } return (v, offset + 4); } /* @notice Read next eight bytes as uint64 type starting from offset * @param buff Source bytes array * @param offset The position from where we read the uint64 value * @return The read uint64 value and updated offset */ function NextUint64(bytes memory buff, uint256 offset) internal pure returns (uint64, uint256) { require(offset + 8 <= buff.length && offset < offset + 8, "NextUint64, offset exceeds maximum"); uint64 v; assembly { let tmpbytes := mload(0x40) let byteLen := 0x08 for { let tindex := 0x00 let bindex := sub(byteLen, 0x01) let bvalue := mload(add(add(buff, 0x20), offset)) } lt(tindex, byteLen) { tindex := add(tindex, 0x01) bindex := sub(bindex, 0x01) }{ mstore8(add(tmpbytes, tindex), byte(bindex, bvalue)) } mstore(0x40, add(tmpbytes, byteLen)) v := mload(sub(tmpbytes, sub(0x20, byteLen))) } return (v, offset + 8); } /* @notice Read next 32 bytes as uint256 type starting from offset, there are limits considering the numerical limits in multi-chain * @param buff Source bytes array * @param offset The position from where we read the uint256 value * @return The read uint256 value and updated offset */ function NextUint255(bytes memory buff, uint256 offset) internal pure returns (uint256, uint256) { require(offset + 32 <= buff.length && offset < offset + 32, "NextUint255, offset exceeds maximum"); uint256 v; assembly { let tmpbytes := mload(0x40) let byteLen := 0x20 for { let tindex := 0x00 let bindex := sub(byteLen, 0x01) let bvalue := mload(add(add(buff, 0x20), offset)) } lt(tindex, byteLen) { tindex := add(tindex, 0x01) bindex := sub(bindex, 0x01) }{ mstore8(add(tmpbytes, tindex), byte(bindex, bvalue)) } mstore(0x40, add(tmpbytes, byteLen)) v := mload(tmpbytes) } require(v <= 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, "Value exceeds the range"); return (v, offset + 32); } /* @notice Read next variable bytes starting from offset, the decoding rule coming from multi-chain * @param buff Source bytes array * @param offset The position from where we read the bytes value * @return The read variable bytes array value and updated offset */ function NextVarBytes(bytes memory buff, uint256 offset) internal pure returns(bytes memory, uint256) { uint len; (len, offset) = NextVarUint(buff, offset); require(offset + len <= buff.length && offset < offset + len, "NextVarBytes, offset exceeds maximum"); bytes memory tempBytes; assembly{ switch iszero(len) 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(len, 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, len) for { // The multiplication in the next line has the same exact purpose // as the one above. let cc := add(add(add(buff, lengthmod), mul(0x20, iszero(lengthmod))), offset) } lt(mc, end) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { mstore(mc, mload(cc)) } mstore(tempBytes, len) //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) mstore(0x40, add(tempBytes, 0x20)) } } return (tempBytes, offset + len); } /* @notice Read next 32 bytes starting from offset, * @param buff Source bytes array * @param offset The position from where we read the bytes value * @return The read bytes32 value and updated offset */ function NextHash(bytes memory buff, uint256 offset) internal pure returns (bytes32 , uint256) { require(offset + 32 <= buff.length && offset < offset + 32, "NextHash, offset exceeds maximum"); bytes32 v; assembly { v := mload(add(buff, add(offset, 0x20))) } return (v, offset + 32); } /* @notice Read next 20 bytes starting from offset, * @param buff Source bytes array * @param offset The position from where we read the bytes value * @return The read bytes20 value and updated offset */ function NextBytes20(bytes memory buff, uint256 offset) internal pure returns (bytes20 , uint256) { require(offset + 20 <= buff.length && offset < offset + 20, "NextBytes20, offset exceeds maximum"); bytes20 v; assembly { v := mload(add(buff, add(offset, 0x20))) } return (v, offset + 20); } function NextVarUint(bytes memory buff, uint256 offset) internal pure returns(uint, uint256) { byte v; (v, offset) = NextByte(buff, offset); uint value; if (v == 0xFD) { // return NextUint16(buff, offset); (value, offset) = NextUint16(buff, offset); require(value >= 0xFD && value <= 0xFFFF, "NextUint16, value outside range"); return (value, offset); } else if (v == 0xFE) { // return NextUint32(buff, offset); (value, offset) = NextUint32(buff, offset); require(value > 0xFFFF && value <= 0xFFFFFFFF, "NextVarUint, value outside range"); return (value, offset); } else if (v == 0xFF) { // return NextUint64(buff, offset); (value, offset) = NextUint64(buff, offset); require(value > 0xFFFFFFFF, "NextVarUint, value outside range"); return (value, offset); } else{ // return (uint8(v), offset); value = uint8(v); require(value < 0xFD, "NextVarUint, value outside range"); return (value, offset); } } } library Utils { /* @notice Convert the bytes array to bytes32 type, the bytes array length must be 32 * @param _bs Source bytes array * @return bytes32 */ function bytesToBytes32(bytes memory _bs) internal pure returns (bytes32 value) { require(_bs.length == 32, "bytes length is not 32."); assembly { // load 32 bytes from memory starting from position _bs + 0x20 since the first 0x20 bytes stores _bs length value := mload(add(_bs, 0x20)) } } /* @notice Convert bytes to uint256 * @param _b Source bytes should have length of 32 * @return uint256 */ function bytesToUint256(bytes memory _bs) internal pure returns (uint256 value) { require(_bs.length == 32, "bytes length is not 32."); assembly { // load 32 bytes from memory starting from position _bs + 32 value := mload(add(_bs, 0x20)) } require(value <= 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, "Value exceeds the range"); } /* @notice Convert uint256 to bytes * @param _b uint256 that needs to be converted * @return bytes */ function uint256ToBytes(uint256 _value) internal pure returns (bytes memory bs) { require(_value <= 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, "Value exceeds the range"); assembly { // Get a location of some free memory and store it in result as // Solidity does for memory variables. bs := mload(0x40) // Put 0x20 at the first word, the length of bytes for uint256 value mstore(bs, 0x20) //In the next word, put value in bytes format to the next 32 bytes mstore(add(bs, 0x20), _value) // Update the free-memory pointer by padding our last write location to 32 bytes mstore(0x40, add(bs, 0x40)) } } /* @notice Convert bytes to address * @param _bs Source bytes: bytes length must be 20 * @return Converted address from source bytes */ function bytesToAddress(bytes memory _bs) internal pure returns (address addr) { require(_bs.length == 20, "bytes length does not match address"); assembly { // for _bs, first word store _bs.length, second word store _bs.value // load 32 bytes from mem[_bs+20], convert it into Uint160, meaning we take last 20 bytes as addr (address). addr := mload(add(_bs, 0x14)) } } /* @notice Convert address to bytes * @param _addr Address need to be converted * @return Converted bytes from address */ function addressToBytes(address _addr) internal pure returns (bytes memory bs){ assembly { // Get a location of some free memory and store it in result as // Solidity does for memory variables. bs := mload(0x40) // Put 20 (address byte length) at the first word, the length of bytes for uint256 value mstore(bs, 0x14) // logical shift left _a by 12 bytes, change _a from right-aligned to left-aligned mstore(add(bs, 0x20), shl(96, _addr)) // Update the free-memory pointer by padding our last write location to 32 bytes mstore(0x40, add(bs, 0x40)) } } /* @notice Do hash leaf as the multi-chain does * @param _data Data in bytes format * @return Hashed value in bytes32 format */ function hashLeaf(bytes memory _data) internal pure returns (bytes32 result) { result = sha256(abi.encodePacked(byte(0x0), _data)); } /* @notice Do hash children as the multi-chain does * @param _l Left node * @param _r Right node * @return Hashed value in bytes32 format */ function hashChildren(bytes32 _l, bytes32 _r) internal pure returns (bytes32 result) { result = sha256(abi.encodePacked(bytes1(0x01), _l, _r)); } /* @notice Compare if two bytes are equal, which are in storage and memory, seperately Refer from https://github.com/summa-tx/bitcoin-spv/blob/master/solidity/contracts/BytesLib.sol#L368 * @param _preBytes The bytes stored in storage * @param _postBytes The bytes stored in memory * @return Bool type indicating if they are equal */ 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) // 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) // if lengths don't match the arrays are not equal switch eq(slength, mlength) case 1 { // fslot can contain both the length and contents of the array // if slength < 32 bytes so let's prepare for that // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage // slength != 0 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(uint(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; } /* @notice Slice the _bytes from _start index till the result has length of _length Refer from https://github.com/summa-tx/bitcoin-spv/blob/master/solidity/contracts/BytesLib.sol#L246 * @param _bytes The original bytes needs to be sliced * @param _start The index of _bytes for the start of sliced bytes * @param _length The index of _bytes for the end of sliced bytes * @return The sliced bytes */ function slice( bytes memory _bytes, uint _start, uint _length ) internal pure returns (bytes memory) { require(_bytes.length >= (_start + _length)); 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. // lengthmod <= _length % 32 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) mstore(0x40, add(tempBytes, 0x20)) } } return tempBytes; } /* @notice Check if the elements number of _signers within _keepers array is no less than _m * @param _keepers The array consists of serveral address * @param _signers Some specific addresses to be looked into * @param _m The number requirement paramter * @return True means containment, false meansdo do not contain. */ function containMAddresses(address[] memory _keepers, address[] memory _signers, uint _m) internal pure returns (bool){ uint m = 0; for(uint i = 0; i < _signers.length; i++){ for (uint j = 0; j < _keepers.length; j++) { if (_signers[i] == _keepers[j]) { m++; delete _keepers[j]; } } } return m >= _m; } /* @notice TODO * @param key * @return */ function compressMCPubKey(bytes memory key) internal pure returns (bytes memory newkey) { require(key.length >= 67, "key lenggh is too short"); newkey = slice(key, 0, 35); if (uint8(key[66]) % 2 == 0){ newkey[2] = byte(0x02); } else { newkey[2] = byte(0x03); } return newkey; } /** * @dev Returns true if `account` is a contract. * Refer from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol#L18 * * This test is non-exhaustive, and there may be false-negatives: during the * execution of a contract's constructor, its address will be reported as * not containing a contract. * * IMPORTANT: It is unsafe to assume that an address for which this * function returns false is an externally-owned account (EOA) and not a * contract. */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != 0x0 && codehash != accountHash); } } library SafeERC20 { using SafeMath for uint256; function safeTransfer(IERC20 token, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(Utils.isContract(address(token)), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } contract Pausable is Context { /** * @dev Emitted when the pause is triggered by a pauser (`account`). */ event Paused(address account); /** * @dev Emitted when the pause is lifted by a pauser (`account`). */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor () internal { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. */ modifier whenNotPaused() { require(!_paused, "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. */ modifier whenPaused() { require(_paused, "Pausable: not paused"); _; } /** * @dev Called to pause, triggers stopped state. */ function _pause() internal whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Called to unpause, returns to normal state. */ function _unpause() internal whenPaused { _paused = false; emit Unpaused(_msgSender()); } } 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 () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return _msgSender() == _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 onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = 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 onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } contract ReentrancyGuard { bool private _notEntered; constructor () internal { // Storing an initial non-zero value makes deployment a bit more // expensive, but in exchange the refund on every call to nonReentrant // will be lower in amount. Since refunds are capped to a percetange of // the total transaction's gas, it is best to keep them low in cases // like this one, to increase the likelihood of the full refund coming // into effect. _notEntered = true; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_notEntered, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _notEntered = false; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _notEntered = true; } } interface IERC20 { /** * @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 `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } interface IEthCrossChainManager { function crossChain(uint64 _toChainId, bytes calldata _toContract, bytes calldata _method, bytes calldata _txData) external returns (bool); } interface IEthCrossChainManagerProxy { function getEthCrossChainManager() external view returns (address); } interface IWETH { function deposit() external payable; function transfer(address to, uint value) external returns (bool); function withdraw(uint) external; } contract Swapper is Ownable, Pausable, ReentrancyGuard { using SafeMath for uint; using SafeERC20 for IERC20; struct TxArgs { uint amount; uint minOut; uint64 toPoolId; uint64 toChainId; bytes fromAssetHash; bytes fromAddress; bytes toAssetHash; bytes toAddress; } address public WETH; address public feeCollector; address public lockProxyAddress; address public managerProxyContract; bytes public swapProxyHash; uint64 public swapChainId; uint64 public chainId; mapping(bytes => mapping(uint64 => bool)) public assetInPool; mapping(uint64 => address) public poolTokenMap; event LockEvent(address fromAssetHash, address fromAddress, uint64 toChainId, bytes toAssetHash, bytes toAddress, uint256 amount); event SwapEvent(address fromAssetHash, address fromAddress, uint64 toPoolId, uint64 toChainId, bytes toAssetHash, bytes toAddress, uint amount,uint fee, uint id); event AddLiquidityEvent(address fromAssetHash, address fromAddress, uint64 toPoolId, uint64 toChainId, bytes toAssetHash, bytes toAddress, uint amount, uint fee, uint id); event RemoveLiquidityEvent(address fromAssetHash, address fromAddress, uint64 toPoolId, uint64 toChainId, bytes toAssetHash, bytes toAddress, uint amount, uint fee, uint id); constructor(address _owner, uint64 _chainId, uint64 _swapChianId, address _lockProxy, address _CCMP, address _weth, bytes memory _swapProxyHash) public { require(_chainId != 0, "!legal"); transferOwnership(_owner); chainId = _chainId; lockProxyAddress = _lockProxy; managerProxyContract = _CCMP; WETH = _weth; swapProxyHash = _swapProxyHash; swapChainId = _swapChianId; } modifier onlyManagerContract() { IEthCrossChainManagerProxy ieccmp = IEthCrossChainManagerProxy(managerProxyContract); require(_msgSender() == ieccmp.getEthCrossChainManager(), "msgSender is not EthCrossChainManagerContract"); _; } function pause() external onlyOwner { _pause(); } function unpause() external onlyOwner { _unpause(); } function setFeeCollector(address collector) external onlyOwner { require(collector != address(0), "emtpy address"); feeCollector = collector; } function setLockProxy(address _lockProxy) external onlyOwner { require(_lockProxy != address(0), "emtpy address"); lockProxyAddress = _lockProxy; } function setManagerProxy(address ethCCMProxyAddr) onlyOwner public { managerProxyContract = ethCCMProxyAddr; } function setSwapProxyHash(bytes memory swapProxyAddr) onlyOwner public { swapProxyHash = swapProxyAddr; } function setSwapChainId(uint64 _swapChianId) onlyOwner public { swapChainId = _swapChianId; } function setWETH(address _weth) external onlyOwner { WETH = _weth; } function bindAssetAndPool(bytes memory fromAssetHash, uint64 poolId) onlyOwner public returns (bool) { assetInPool[fromAssetHash][poolId] = true; return true; } function bind3Asset(bytes memory asset1, bytes memory asset2, bytes memory asset3, uint64 poolId) onlyOwner public { assetInPool[asset1][poolId] = true; assetInPool[asset2][poolId] = true; assetInPool[asset3][poolId] = true; } function registerPoolWith3Assets(uint64 poolId, address poolTokenAddress, bytes memory asset1, bytes memory asset2, bytes memory asset3) onlyOwner public { poolTokenMap[poolId] = poolTokenAddress; assetInPool[asset1][poolId] = true; assetInPool[asset2][poolId] = true; assetInPool[asset3][poolId] = true; } function registerPool(uint64 poolId, address poolTokenAddress) onlyOwner public returns (bool) { poolTokenMap[poolId] = poolTokenAddress; return true; } function extractFee(address token) external { require(msg.sender == feeCollector, "!feeCollector"); if (token == address(0)) { msg.sender.transfer(address(this).balance); } else { IERC20(token).safeTransfer(feeCollector, IERC20(token).balanceOf(address(this))); } } function swap(address fromAssetHash, uint64 toPoolId, uint64 toChainId, bytes memory toAssetHash, bytes memory toAddress, uint amount, uint minOutAmount, uint fee, uint id) public payable nonReentrant whenNotPaused returns (bool) { _pull(fromAssetHash, amount); amount = _checkoutFee(fromAssetHash, amount, fee); _push(fromAssetHash, amount); fromAssetHash = fromAssetHash==address(0) ? WETH : fromAssetHash ; require(poolTokenMap[toPoolId] != address(0), "given pool do not exsit"); require(assetInPool[Utils.addressToBytes(fromAssetHash)][toPoolId],"input token not in given pool"); require(assetInPool[toAssetHash][toPoolId],"output token not in given pool"); require(toAddress.length !=0, "empty toAddress"); address addr; assembly { addr := mload(add(toAddress,0x14)) } require(addr != address(0),"zero toAddress"); { TxArgs memory txArgs = TxArgs({ amount: amount, minOut: minOutAmount, toPoolId: toPoolId, toChainId: toChainId, fromAssetHash: Utils.addressToBytes(fromAssetHash), fromAddress: Utils.addressToBytes(_msgSender()), toAssetHash: toAssetHash, toAddress: toAddress }); bytes memory txData = _serializeTxArgs(txArgs); address eccmAddr = IEthCrossChainManagerProxy(managerProxyContract).getEthCrossChainManager(); IEthCrossChainManager eccm = IEthCrossChainManager(eccmAddr); require(eccm.crossChain(swapChainId, swapProxyHash, "swap", txData), "EthCrossChainManager crossChain executed error!"); } emit LockEvent(fromAssetHash, _msgSender(), swapChainId, Utils.addressToBytes(address(0)), swapProxyHash, amount); emit SwapEvent(fromAssetHash, _msgSender(), toPoolId, toChainId, toAssetHash, toAddress, amount, fee, id); return true; } function add_liquidity(address fromAssetHash, uint64 toPoolId, uint64 toChainId, bytes memory toAddress, uint amount, uint minOutAmount, uint fee, uint id) public payable nonReentrant whenNotPaused returns (bool) { _pull(fromAssetHash, amount); amount = _checkoutFee(fromAssetHash, amount, fee); _push(fromAssetHash, amount); fromAssetHash = fromAssetHash==address(0) ? WETH : fromAssetHash ; require(poolTokenMap[toPoolId] != address(0), "given pool do not exsit"); require(assetInPool[Utils.addressToBytes(fromAssetHash)][toPoolId],"input token not in given pool"); require(toAddress.length !=0, "empty toAddress"); address addr; assembly { addr := mload(add(toAddress,0x14)) } require(addr != address(0),"zero toAddress"); { TxArgs memory txArgs = TxArgs({ amount: amount, minOut: minOutAmount, toPoolId: toPoolId, toChainId: toChainId, fromAssetHash: Utils.addressToBytes(fromAssetHash), fromAddress: Utils.addressToBytes(_msgSender()), toAssetHash: Utils.addressToBytes(address(0)), toAddress: toAddress }); bytes memory txData = _serializeTxArgs(txArgs); address eccmAddr = IEthCrossChainManagerProxy(managerProxyContract).getEthCrossChainManager(); IEthCrossChainManager eccm = IEthCrossChainManager(eccmAddr); require(eccm.crossChain(swapChainId, swapProxyHash, "add", txData), "EthCrossChainManager crossChain executed error!"); } emit LockEvent(fromAssetHash, _msgSender(), swapChainId, Utils.addressToBytes(address(0)), swapProxyHash, amount); emit AddLiquidityEvent(fromAssetHash, _msgSender(), toPoolId, toChainId, Utils.addressToBytes(address(0)), toAddress, amount, fee, id); return true; } function remove_liquidity(address fromAssetHash, uint64 toPoolId, uint64 toChainId, bytes memory toAssetHash, bytes memory toAddress, uint amount, uint minOutAmount, uint fee, uint id) public payable nonReentrant whenNotPaused returns (bool) { _pull(fromAssetHash, amount); amount = _checkoutFee(fromAssetHash, amount, fee); _push(fromAssetHash, amount); fromAssetHash = fromAssetHash==address(0) ? WETH : fromAssetHash ; require(poolTokenMap[toPoolId] != address(0), "given pool do not exsit"); require(poolTokenMap[toPoolId] == fromAssetHash,"input token is not pool LP token"); require(assetInPool[toAssetHash][toPoolId],"output token not in given pool"); require(toAddress.length !=0, "empty toAddress"); address addr; assembly { addr := mload(add(toAddress,0x14)) } require(addr != address(0),"zero toAddress"); { TxArgs memory txArgs = TxArgs({ amount: amount, minOut: minOutAmount, toPoolId: toPoolId, toChainId: toChainId, fromAssetHash: Utils.addressToBytes(fromAssetHash), fromAddress: Utils.addressToBytes(_msgSender()), toAssetHash: toAssetHash, toAddress: toAddress }); bytes memory txData = _serializeTxArgs(txArgs); address eccmAddr = IEthCrossChainManagerProxy(managerProxyContract).getEthCrossChainManager(); IEthCrossChainManager eccm = IEthCrossChainManager(eccmAddr); require(eccm.crossChain(swapChainId, swapProxyHash, "remove", txData), "EthCrossChainManager crossChain executed error!"); } emit LockEvent(fromAssetHash, _msgSender(), swapChainId, Utils.addressToBytes(address(0)), swapProxyHash, amount); emit RemoveLiquidityEvent(fromAssetHash, _msgSender(), toPoolId, toChainId, toAssetHash, toAddress, amount, fee, id); return true; } function getBalanceFor(address fromAssetHash) public view returns (uint256) { if (fromAssetHash == address(0)) { // return address(this).balance; // this expression would result in error: Failed to decode output: Error: insufficient data for uint256 type address selfAddr = address(this); return selfAddr.balance; } else { IERC20 erc20Token = IERC20(fromAssetHash); return erc20Token.balanceOf(address(this)); } } // take input function _pull(address fromAsset, uint amount) internal { if (fromAsset == address(0)) { require(msg.value == amount, "insufficient ether"); } else { IERC20(fromAsset).safeTransferFrom(msg.sender, address(this), amount); } } // take fee in the form of ether function _checkoutFee(address fromAsset, uint amount, uint fee) internal view returns (uint) { if (fromAsset == address(0)) { require(msg.value == amount, "insufficient ether"); require(amount > fee, "amount less than fee"); return amount.sub(fee); } else { require(msg.value == fee, "insufficient ether"); return amount; } } // lock money in LockProxy, ether store in swapper function _push(address fromAsset, uint amount) internal { if (fromAsset == address(0)) { // TODO: send ether to LockProxy, ** LockProxy do not have receive(),cannot send ether now IWETH(WETH).deposit{value: amount}(); IWETH(WETH).transfer(lockProxyAddress, amount); } else { IERC20(fromAsset).safeTransfer(lockProxyAddress, amount); } } function _serializeTxArgs(TxArgs memory args) internal pure returns (bytes memory) { bytes memory buff; buff = abi.encodePacked( ZeroCopySink.WriteUint255(args.amount), ZeroCopySink.WriteUint255(args.minOut), ZeroCopySink.WriteUint64(args.toPoolId), ZeroCopySink.WriteUint64(args.toChainId), ZeroCopySink.WriteVarBytes(args.fromAssetHash), ZeroCopySink.WriteVarBytes(args.fromAddress), ZeroCopySink.WriteVarBytes(args.toAssetHash), ZeroCopySink.WriteVarBytes(args.toAddress) ); return buff; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint64","name":"_chainId","type":"uint64"},{"internalType":"uint64","name":"_swapChianId","type":"uint64"},{"internalType":"address","name":"_lockProxy","type":"address"},{"internalType":"address","name":"_CCMP","type":"address"},{"internalType":"address","name":"_weth","type":"address"},{"internalType":"bytes","name":"_swapProxyHash","type":"bytes"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"fromAssetHash","type":"address"},{"indexed":false,"internalType":"address","name":"fromAddress","type":"address"},{"indexed":false,"internalType":"uint64","name":"toPoolId","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"toChainId","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"toAssetHash","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"toAddress","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"AddLiquidityEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"fromAssetHash","type":"address"},{"indexed":false,"internalType":"address","name":"fromAddress","type":"address"},{"indexed":false,"internalType":"uint64","name":"toChainId","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"toAssetHash","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"toAddress","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LockEvent","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"fromAssetHash","type":"address"},{"indexed":false,"internalType":"address","name":"fromAddress","type":"address"},{"indexed":false,"internalType":"uint64","name":"toPoolId","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"toChainId","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"toAssetHash","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"toAddress","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"RemoveLiquidityEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"fromAssetHash","type":"address"},{"indexed":false,"internalType":"address","name":"fromAddress","type":"address"},{"indexed":false,"internalType":"uint64","name":"toPoolId","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"toChainId","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"toAssetHash","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"toAddress","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"SwapEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fromAssetHash","type":"address"},{"internalType":"uint64","name":"toPoolId","type":"uint64"},{"internalType":"uint64","name":"toChainId","type":"uint64"},{"internalType":"bytes","name":"toAddress","type":"bytes"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minOutAmount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"add_liquidity","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"assetInPool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"asset1","type":"bytes"},{"internalType":"bytes","name":"asset2","type":"bytes"},{"internalType":"bytes","name":"asset3","type":"bytes"},{"internalType":"uint64","name":"poolId","type":"uint64"}],"name":"bind3Asset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"fromAssetHash","type":"bytes"},{"internalType":"uint64","name":"poolId","type":"uint64"}],"name":"bindAssetAndPool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"chainId","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"extractFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeCollector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fromAssetHash","type":"address"}],"name":"getBalanceFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockProxyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"managerProxyContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"}],"name":"poolTokenMap","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"poolId","type":"uint64"},{"internalType":"address","name":"poolTokenAddress","type":"address"}],"name":"registerPool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"poolId","type":"uint64"},{"internalType":"address","name":"poolTokenAddress","type":"address"},{"internalType":"bytes","name":"asset1","type":"bytes"},{"internalType":"bytes","name":"asset2","type":"bytes"},{"internalType":"bytes","name":"asset3","type":"bytes"}],"name":"registerPoolWith3Assets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fromAssetHash","type":"address"},{"internalType":"uint64","name":"toPoolId","type":"uint64"},{"internalType":"uint64","name":"toChainId","type":"uint64"},{"internalType":"bytes","name":"toAssetHash","type":"bytes"},{"internalType":"bytes","name":"toAddress","type":"bytes"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minOutAmount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"remove_liquidity","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collector","type":"address"}],"name":"setFeeCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lockProxy","type":"address"}],"name":"setLockProxy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ethCCMProxyAddr","type":"address"}],"name":"setManagerProxy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_swapChianId","type":"uint64"}],"name":"setSwapChainId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"swapProxyAddr","type":"bytes"}],"name":"setSwapProxyHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_weth","type":"address"}],"name":"setWETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fromAssetHash","type":"address"},{"internalType":"uint64","name":"toPoolId","type":"uint64"},{"internalType":"uint64","name":"toChainId","type":"uint64"},{"internalType":"bytes","name":"toAssetHash","type":"bytes"},{"internalType":"bytes","name":"toAddress","type":"bytes"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minOutAmount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"swap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"swapChainId","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapProxyHash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162004ac638038062004ac6833981810160405260e08110156200003757600080fd5b815160208301516040808501516060860151608087015160a088015160c089018051955197999698949793969295919483019291846401000000008211156200007f57600080fd5b9083019060208201858111156200009557600080fd5b8251640100000000811182820188101715620000b057600080fd5b82525081516020918201929091019080838360005b83811015620000df578181015183820152602001620000c5565b50505050905090810190601f1680156200010d5780820380516001836020036101000a031916815260200191505b506040525050506000620001266200026e60201b60201c565b600080546001600160a01b0319166001600160a01b03831690811782556040519293509160008051602062004aa6833981519152908290a3506000805461ffff60a01b1916600160a81b1790556001600160401b038616620001b8576040805162461bcd60e51b8152602060048201526006602482015265085b1959d85b60d21b604482015290519081900360640190fd5b620001c38762000272565b60068054600160401b600160801b031916680100000000000000006001600160401b03891602179055600380546001600160a01b03199081166001600160a01b03878116919091179092556004805482168684161790556001805490911691841691909117905580516200023f90600590602084019062000393565b5050600680546001600160401b0319166001600160401b039590951694909417909355506200042f9350505050565b3390565b6200027c620002dc565b620002ce576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b620002d98162000302565b50565b600080546001600160a01b0316620002f36200026e565b6001600160a01b031614905090565b6001600160a01b038116620003495760405162461bcd60e51b815260040180806020018281038252602681526020018062004a806026913960400191505060405180910390fd5b600080546040516001600160a01b038085169392169160008051602062004aa683398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620003d657805160ff191683800117855562000406565b8280016001018555821562000406579182015b8281111562000406578251825591602001919060010190620003e9565b506200041492915062000418565b5090565b5b8082111562000414576000815560010162000419565b614641806200043f6000396000f3fe6080604052600436106101d85760003560e01c80638456cb5911610102578063ad5c464811610095578063d798f88111610064578063d798f88114610cfe578063de77f69b14610d13578063f2fde38b14610ed9578063f916aa8514610f0c576101d8565b8063ad5c464814610c6e578063af24986114610c83578063af9980f014610cb6578063c415b95c14610ce9576101d8565b80639462c985116100d15780639462c98514610b285780639a8a059214610be4578063a3e28eb414610bf9578063a42dce8014610c3b576101d8565b80638456cb5914610a2d57806384eae14e14610a425780638da5cb5b14610afe5780638f32d59b14610b13576101d8565b806359c589a11161017a5780636f2b6ee6116101495780636f2b6ee614610850578063715018a614610883578063773c9d9c1461089857806378b556fa146109fc576101d8565b806359c589a1146107395780635b769f3c1461077e5780635c975abb146107b15780635f56bc53146107c6576101d8565b80633f4ba83a116101b65780633f4ba83a1461049c5780634672b083146104b15780634ad43eda146105a4578063559ebe57146105d5576101d8565b806316675e4f146101dd5780631745399d146103b85780631f237452146103eb575b600080fd5b3480156101e957600080fd5b506103b6600480360360a081101561020057600080fd5b6001600160401b03823516916001600160a01b0360208201351691810190606081016040820135600160201b81111561023857600080fd5b82018360208201111561024a57600080fd5b803590602001918460018302840111600160201b8311171561026b57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156102bd57600080fd5b8201836020820111156102cf57600080fd5b803590602001918460018302840111600160201b831117156102f057600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561034257600080fd5b82018360208201111561035457600080fd5b803590602001918460018302840111600160201b8311171561037557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610f3f945050505050565b005b3480156103c457600080fd5b506103b6600480360360208110156103db57600080fd5b50356001600160a01b031661115a565b3480156103f757600080fd5b506103b66004803603602081101561040e57600080fd5b810190602081018135600160201b81111561042857600080fd5b82018360208201111561043a57600080fd5b803590602001918460018302840111600160201b8311171561045b57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061127c945050505050565b3480156104a857600080fd5b506103b66112da565b61059060048036036101008110156104c857600080fd5b6001600160a01b03823516916001600160401b03602082013581169260408301359091169190810190608081016060820135600160201b81111561050b57600080fd5b82018360208201111561051d57600080fd5b803590602001918460018302840111600160201b8311171561053e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550508235935050506020810135906040810135906060013561132b565b604080519115158252519081900360200190f35b3480156105b057600080fd5b506105b9611bcf565b604080516001600160a01b039092168252519081900360200190f35b61059060048036036101208110156105ec57600080fd5b6001600160a01b03823516916001600160401b03602082013581169260408301359091169190810190608081016060820135600160201b81111561062f57600080fd5b82018360208201111561064157600080fd5b803590602001918460018302840111600160201b8311171561066257600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156106b457600080fd5b8201836020820111156106c657600080fd5b803590602001918460018302840111600160201b831117156106e757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505082359350505060208101359060408101359060600135611bde565b34801561074557600080fd5b5061076c6004803603602081101561075c57600080fd5b50356001600160a01b031661253b565b60408051918252519081900360200190f35b34801561078a57600080fd5b506103b6600480360360208110156107a157600080fd5b50356001600160a01b03166125d6565b3480156107bd57600080fd5b5061059061263f565b3480156107d257600080fd5b506107db61264f565b6040805160208082528351818301528351919283929083019185019080838360005b838110156108155781810151838201526020016107fd565b50505050905090810190601f1680156108425780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561085c57600080fd5b506103b66004803603602081101561087357600080fd5b50356001600160a01b03166126dd565b34801561088f57600080fd5b506103b6612791565b61059060048036036101208110156108af57600080fd5b6001600160a01b03823516916001600160401b03602082013581169260408301359091169190810190608081016060820135600160201b8111156108f257600080fd5b82018360208201111561090457600080fd5b803590602001918460018302840111600160201b8311171561092557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561097757600080fd5b82018360208201111561098957600080fd5b803590602001918460018302840111600160201b831117156109aa57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505082359350505060208101359060408101359060600135612822565b348015610a0857600080fd5b50610a11612fc6565b604080516001600160401b039092168252519081900360200190f35b348015610a3957600080fd5b506103b6612fd5565b348015610a4e57600080fd5b5061059060048036036040811015610a6557600080fd5b810190602081018135600160201b811115610a7f57600080fd5b820183602082011115610a9157600080fd5b803590602001918460018302840111600160201b83111715610ab257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160401b031691506130249050565b348015610b0a57600080fd5b506105b9613054565b348015610b1f57600080fd5b50610590613063565b348015610b3457600080fd5b5061059060048036036040811015610b4b57600080fd5b810190602081018135600160201b811115610b6557600080fd5b820183602082011115610b7757600080fd5b803590602001918460018302840111600160201b83111715610b9857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160401b031691506130879050565b348015610bf057600080fd5b50610a11613162565b348015610c0557600080fd5b5061059060048036036040811015610c1c57600080fd5b5080356001600160401b031690602001356001600160a01b031661317d565b348015610c4757600080fd5b506103b660048036036020811015610c5e57600080fd5b50356001600160a01b0316613202565b348015610c7a57600080fd5b506105b96132b6565b348015610c8f57600080fd5b506105b960048036036020811015610ca657600080fd5b50356001600160401b03166132c5565b348015610cc257600080fd5b506103b660048036036020811015610cd957600080fd5b50356001600160a01b03166132e0565b348015610cf557600080fd5b506105b9613349565b348015610d0a57600080fd5b506105b9613358565b348015610d1f57600080fd5b506103b660048036036080811015610d3657600080fd5b810190602081018135600160201b811115610d5057600080fd5b820183602082011115610d6257600080fd5b803590602001918460018302840111600160201b83111715610d8357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b811115610dd557600080fd5b820183602082011115610de757600080fd5b803590602001918460018302840111600160201b83111715610e0857600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b811115610e5a57600080fd5b820183602082011115610e6c57600080fd5b803590602001918460018302840111600160201b83111715610e8d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160401b031691506133679050565b348015610ee557600080fd5b506103b660048036036020811015610efc57600080fd5b50356001600160a01b0316613548565b348015610f1857600080fd5b506103b660048036036020811015610f2f57600080fd5b50356001600160401b0316613598565b610f47613063565b610f86576040805162461bcd60e51b81526020600482018190526024820152600080516020614593833981519152604482015290519081900360640190fd5b6001600160401b03851660009081526008602090815260409182902080546001600160a01b0319166001600160a01b03881617905590518451600192600792879290918291908401908083835b60208310610ff25780518252601f199092019160209182019101610fd3565b51815160209384036101000a60001901801990921691161790529201948552506040805194859003820185206001600160401b038c16600090815290835220805460ff19169515159590951790945550508351600192600792869290918291908401908083835b602083106110785780518252601f199092019160209182019101611059565b51815160209384036101000a60001901801990921691161790529201948552506040805194859003820185206001600160401b038c16600090815290835220805460ff19169515159590951790945550508251600192600792859290918291908401908083835b602083106110fe5780518252601f1990920191602091820191016110df565b51815160209384036101000a6000190180199092169116179052920194855250604080519485900382019094206001600160401b039a909a1660009081529990525050909520805460ff19169515159590951790945550505050565b6002546001600160a01b031633146111a9576040805162461bcd60e51b815260206004820152600d60248201526c10b332b2a1b7b63632b1ba37b960991b604482015290519081900360640190fd5b6001600160a01b0381166111e95760405133904780156108fc02916000818181858888f193505050501580156111e3573d6000803e3d6000fd5b50611279565b600254604080516370a0823160e01b81523060048201529051611279926001600160a01b0390811692908516916370a0823191602480820192602092909190829003018186803b15801561123c57600080fd5b505afa158015611250573d6000803e3d6000fd5b505050506040513d602081101561126657600080fd5b50516001600160a01b0384169190613602565b50565b611284613063565b6112c3576040805162461bcd60e51b81526020600482018190526024820152600080516020614593833981519152604482015290519081900360640190fd5b80516112d6906005906020840190614482565b5050565b6112e2613063565b611321576040805162461bcd60e51b81526020600482018190526024820152600080516020614593833981519152604482015290519081900360640190fd5b611329613659565b565b60008054600160a81b900460ff1661138a576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6000805460ff60a81b191690819055600160a01b900460ff16156113e8576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6113f28986613701565b6113fd898685613772565b9450611409898661387a565b6001600160a01b0389161561141e578861142b565b6001546001600160a01b03165b6001600160401b0389166000908152600860205260409020549099506001600160a01b031661149b576040805162461bcd60e51b815260206004820152601760248201527619da5d995b881c1bdbdb08191bc81b9bdd08195e1cda5d604a1b604482015290519081900360640190fd5b60076114a68a613994565b6040518082805190602001908083835b602083106114d55780518252601f1990920191602091820191016114b6565b51815160209384036101000a6000190180199092169116179052920194855250604080519485900382019094206001600160401b038d1660009081529152929092205460ff1691506115709050576040805162461bcd60e51b815260206004820152601d60248201527f696e70757420746f6b656e206e6f7420696e20676976656e20706f6f6c000000604482015290519081900360640190fd5b85516115b5576040805162461bcd60e51b815260206004820152600f60248201526e656d70747920746f4164647265737360881b604482015290519081900360640190fd5b60148601516001600160a01b038116611606576040805162461bcd60e51b815260206004820152600e60248201526d7a65726f20746f4164647265737360901b604482015290519081900360640190fd5b61160e614500565b6040518061010001604052808881526020018781526020018b6001600160401b031681526020018a6001600160401b0316815260200161164d8d613994565b815260200161166261165d6139af565b613994565b81526020016116716000613994565b815260200189905290506060611686826139b3565b90506000600460009054906101000a90046001600160a01b03166001600160a01b03166387939a7f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156116d857600080fd5b505afa1580156116ec573d6000803e3d6000fd5b505050506040513d602081101561170257600080fd5b505160065460405163bd5cf62560e01b81526001600160401b039091166004820181815260806024840190815260058054600260001960018316156101000201909116046084860181905295965086956001600160a01b0387169563bd5cf625959492938a939290916044810191606482019160a40190879080156117c85780601f1061179d576101008083540402835291602001916117c8565b820191906000526020600020905b8154815290600101906020018083116117ab57829003601f168201915b5050848103835260038152602001806218591960ea1b815250602001848103825285818151815260200191508051906020019080838360005b83811015611819578181015183820152602001611801565b50505050905090810190601f1680156118465780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b15801561186957600080fd5b505af115801561187d573d6000803e3d6000fd5b505050506040513d602081101561189357600080fd5b50516118d05760405162461bcd60e51b815260040180806020018281038252602f8152602001806145b3602f913960400191505060405180910390fd5b505050507f8636abd6d0e464fe725a13346c7ac779b73561c705506044a2e6b2cdb1295ea58a6118fe6139af565b6006546001600160401b03166119146000613994565b60058b60405180876001600160a01b03168152602001866001600160a01b03168152602001856001600160401b031681526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b8381101561198b578181015183820152602001611973565b50505050905090810190601f1680156119b85780820380516001836020036101000a031916815260200191505b50838103825285546002600019610100600184161502019091160480825260209091019086908015611a2b5780601f10611a0057610100808354040283529160200191611a2b565b820191906000526020600020905b815481529060010190602001808311611a0e57829003601f168201915b50509850505050505050505060405180910390a17f7b634860445c375b3604695e3d36b0ca94d7342cacaae46d96b8727e86522d328a611a696139af565b8b8b611a756000613994565b8c8c8b8b604051808a6001600160a01b03168152602001896001600160a01b03168152602001886001600160401b03168152602001876001600160401b031681526020018060200180602001868152602001858152602001848152602001838103835288818151815260200191508051906020019080838360005b83811015611b08578181015183820152602001611af0565b50505050905090810190601f168015611b355780820380516001836020036101000a031916815260200191505b50838103825287518152875160209182019189019080838360005b83811015611b68578181015183820152602001611b50565b50505050905090810190601f168015611b955780820380516001836020036101000a031916815260200191505b509b50505050505050505050505060405180910390a160019150506000805460ff60a81b1916600160a81b17905598975050505050505050565b6003546001600160a01b031681565b60008054600160a81b900460ff16611c3d576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6000805460ff60a81b191690819055600160a01b900460ff1615611c9b576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b611ca58a86613701565b611cb08a8685613772565b9450611cbc8a8661387a565b6001600160a01b038a1615611cd15789611cde565b6001546001600160a01b03165b6001600160401b038a16600090815260086020526040902054909a506001600160a01b0316611d4e576040805162461bcd60e51b815260206004820152601760248201527619da5d995b881c1bdbdb08191bc81b9bdd08195e1cda5d604a1b604482015290519081900360640190fd5b6007611d598b613994565b6040518082805190602001908083835b60208310611d885780518252601f199092019160209182019101611d69565b51815160209384036101000a6000190180199092169116179052920194855250604080519485900382019094206001600160401b038e1660009081529152929092205460ff169150611e239050576040805162461bcd60e51b815260206004820152601d60248201527f696e70757420746f6b656e206e6f7420696e20676976656e20706f6f6c000000604482015290519081900360640190fd5b6007876040518082805190602001908083835b60208310611e555780518252601f199092019160209182019101611e36565b51815160209384036101000a6000190180199092169116179052920194855250604080519485900382019094206001600160401b038e1660009081529152929092205460ff169150611ef09050576040805162461bcd60e51b815260206004820152601e60248201527f6f757470757420746f6b656e206e6f7420696e20676976656e20706f6f6c0000604482015290519081900360640190fd5b8551611f35576040805162461bcd60e51b815260206004820152600f60248201526e656d70747920746f4164647265737360881b604482015290519081900360640190fd5b60148601516001600160a01b038116611f86576040805162461bcd60e51b815260206004820152600e60248201526d7a65726f20746f4164647265737360901b604482015290519081900360640190fd5b611f8e614500565b6040518061010001604052808881526020018781526020018c6001600160401b031681526020018b6001600160401b03168152602001611fcd8e613994565b8152602001611fdd61165d6139af565b81526020018a81526020018981525090506060611ff9826139b3565b90506000600460009054906101000a90046001600160a01b03166001600160a01b03166387939a7f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561204b57600080fd5b505afa15801561205f573d6000803e3d6000fd5b505050506040513d602081101561207557600080fd5b505160065460405163bd5cf62560e01b81526001600160401b039091166004820181815260806024840190815260058054600260001960018316156101000201909116046084860181905295965086956001600160a01b0387169563bd5cf625959492938a939290916044810191606482019160a401908790801561213b5780601f106121105761010080835404028352916020019161213b565b820191906000526020600020905b81548152906001019060200180831161211e57829003601f168201915b505084810383526004815260200180630737761760e41b815250602001848103825285818151815260200191508051906020019080838360005b8381101561218d578181015183820152602001612175565b50505050905090810190601f1680156121ba5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b1580156121dd57600080fd5b505af11580156121f1573d6000803e3d6000fd5b505050506040513d602081101561220757600080fd5b50516122445760405162461bcd60e51b815260040180806020018281038252602f8152602001806145b3602f913960400191505060405180910390fd5b505050507f8636abd6d0e464fe725a13346c7ac779b73561c705506044a2e6b2cdb1295ea58b6122726139af565b6006546001600160401b03166122886000613994565b60058b60405180876001600160a01b03168152602001866001600160a01b03168152602001856001600160401b031681526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b838110156122ff5781810151838201526020016122e7565b50505050905090810190601f16801561232c5780820380516001836020036101000a031916815260200191505b5083810382528554600260001961010060018416150201909116048082526020909101908690801561239f5780601f106123745761010080835404028352916020019161239f565b820191906000526020600020905b81548152906001019060200180831161238257829003601f168201915b50509850505050505050505060405180910390a17f9e37e0e96b266241aa70174d3c6d60151148a5b4181a57fb3d9475aa39ed06728b6123dd6139af565b8c8c8c8c8c8b8b604051808a6001600160a01b03168152602001896001600160a01b03168152602001886001600160401b03168152602001876001600160401b031681526020018060200180602001868152602001858152602001848152602001838103835288818151815260200191508051906020019080838360005b8381101561247357818101518382015260200161245b565b50505050905090810190601f1680156124a05780820380516001836020036101000a031916815260200191505b50838103825287518152875160209182019189019080838360005b838110156124d35781810151838201526020016124bb565b50505050905090810190601f1680156125005780820380516001836020036101000a031916815260200191505b509b50505050505050505050505060405180910390a160019150506000805460ff60a81b1916600160a81b1790559998505050505050505050565b60006001600160a01b038216612553575030316125d1565b604080516370a0823160e01b8152306004820152905183916001600160a01b038316916370a0823191602480820192602092909190829003018186803b15801561259c57600080fd5b505afa1580156125b0573d6000803e3d6000fd5b505050506040513d60208110156125c657600080fd5b505191506125d19050565b919050565b6125de613063565b61261d576040805162461bcd60e51b81526020600482018190526024820152600080516020614593833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600054600160a01b900460ff1690565b6005805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156126d55780601f106126aa576101008083540402835291602001916126d5565b820191906000526020600020905b8154815290600101906020018083116126b857829003601f168201915b505050505081565b6126e5613063565b612724576040805162461bcd60e51b81526020600482018190526024820152600080516020614593833981519152604482015290519081900360640190fd5b6001600160a01b03811661276f576040805162461bcd60e51b815260206004820152600d60248201526c656d747079206164647265737360981b604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b612799613063565b6127d8576040805162461bcd60e51b81526020600482018190526024820152600080516020614593833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60008054600160a81b900460ff16612881576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6000805460ff60a81b191690819055600160a01b900460ff16156128df576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6128e98a86613701565b6128f48a8685613772565b94506129008a8661387a565b6001600160a01b038a16156129155789612922565b6001546001600160a01b03165b6001600160401b038a16600090815260086020526040902054909a506001600160a01b0316612992576040805162461bcd60e51b815260206004820152601760248201527619da5d995b881c1bdbdb08191bc81b9bdd08195e1cda5d604a1b604482015290519081900360640190fd5b6001600160401b0389166000908152600860205260409020546001600160a01b038b8116911614612a0a576040805162461bcd60e51b815260206004820181905260248201527f696e70757420746f6b656e206973206e6f7420706f6f6c204c5020746f6b656e604482015290519081900360640190fd5b6007876040518082805190602001908083835b60208310612a3c5780518252601f199092019160209182019101612a1d565b51815160209384036101000a6000190180199092169116179052920194855250604080519485900382019094206001600160401b038e1660009081529152929092205460ff169150612ad79050576040805162461bcd60e51b815260206004820152601e60248201527f6f757470757420746f6b656e206e6f7420696e20676976656e20706f6f6c0000604482015290519081900360640190fd5b8551612b1c576040805162461bcd60e51b815260206004820152600f60248201526e656d70747920746f4164647265737360881b604482015290519081900360640190fd5b60148601516001600160a01b038116612b6d576040805162461bcd60e51b815260206004820152600e60248201526d7a65726f20746f4164647265737360901b604482015290519081900360640190fd5b612b75614500565b6040518061010001604052808881526020018781526020018c6001600160401b031681526020018b6001600160401b03168152602001612bb48e613994565b8152602001612bc461165d6139af565b81526020018a81526020018981525090506060612be0826139b3565b90506000600460009054906101000a90046001600160a01b03166001600160a01b03166387939a7f6040518163ffffffff1660e01b815260040160206040518083038186803b158015612c3257600080fd5b505afa158015612c46573d6000803e3d6000fd5b505050506040513d6020811015612c5c57600080fd5b505160065460405163bd5cf62560e01b81526001600160401b039091166004820181815260806024840190815260058054600260001960018316156101000201909116046084860181905295965086956001600160a01b0387169563bd5cf625959492938a939290916044810191606482019160a4019087908015612d225780601f10612cf757610100808354040283529160200191612d22565b820191906000526020600020905b815481529060010190602001808311612d0557829003601f168201915b5050848103835260068152602001806572656d6f766560d01b815250602001848103825285818151815260200191508051906020019080838360005b83811015612d76578181015183820152602001612d5e565b50505050905090810190601f168015612da35780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b158015612dc657600080fd5b505af1158015612dda573d6000803e3d6000fd5b505050506040513d6020811015612df057600080fd5b5051612e2d5760405162461bcd60e51b815260040180806020018281038252602f8152602001806145b3602f913960400191505060405180910390fd5b505050507f8636abd6d0e464fe725a13346c7ac779b73561c705506044a2e6b2cdb1295ea58b612e5b6139af565b6006546001600160401b0316612e716000613994565b60058b60405180876001600160a01b03168152602001866001600160a01b03168152602001856001600160401b031681526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b83811015612ee8578181015183820152602001612ed0565b50505050905090810190601f168015612f155780820380516001836020036101000a031916815260200191505b50838103825285546002600019610100600184161502019091160480825260209091019086908015612f885780601f10612f5d57610100808354040283529160200191612f88565b820191906000526020600020905b815481529060010190602001808311612f6b57829003601f168201915b50509850505050505050505060405180910390a17f7ee445799431a22b707efdb3f751a430c4f01f12d902e952200041d81255a41e8b6123dd6139af565b6006546001600160401b031681565b612fdd613063565b61301c576040805162461bcd60e51b81526020600482018190526024820152600080516020614593833981519152604482015290519081900360640190fd5b611329613c8e565b81516020818401810180516007825292820194820194909420919093529091526000908152604090205460ff1681565b6000546001600160a01b031690565b600080546001600160a01b03166130786139af565b6001600160a01b031614905090565b6000613091613063565b6130d0576040805162461bcd60e51b81526020600482018190526024820152600080516020614593833981519152604482015290519081900360640190fd5b60016007846040518082805190602001908083835b602083106131045780518252601f1990920191602091820191016130e5565b51815160209384036101000a6000190180199092169116179052920194855250604080519485900382019094206001600160401b039790971660009081529690525050909220805460ff191692151592909217909155506001919050565b6006546801000000000000000090046001600160401b031681565b6000613187613063565b6131c6576040805162461bcd60e51b81526020600482018190526024820152600080516020614593833981519152604482015290519081900360640190fd5b506001600160401b038216600090815260086020526040902080546001600160a01b0383166001600160a01b0319909116179055600192915050565b61320a613063565b613249576040805162461bcd60e51b81526020600482018190526024820152600080516020614593833981519152604482015290519081900360640190fd5b6001600160a01b038116613294576040805162461bcd60e51b815260206004820152600d60248201526c656d747079206164647265737360981b604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031681565b6008602052600090815260409020546001600160a01b031681565b6132e8613063565b613327576040805162461bcd60e51b81526020600482018190526024820152600080516020614593833981519152604482015290519081900360640190fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031681565b6004546001600160a01b031681565b61336f613063565b6133ae576040805162461bcd60e51b81526020600482018190526024820152600080516020614593833981519152604482015290519081900360640190fd5b60016007856040518082805190602001908083835b602083106133e25780518252601f1990920191602091820191016133c3565b51815160209384036101000a60001901801990921691161790529201948552506040805194859003820185206001600160401b038816600090815290835220805460ff19169515159590951790945550508451600192600792879290918291908401908083835b602083106134685780518252601f199092019160209182019101613449565b51815160209384036101000a60001901801990921691161790529201948552506040805194859003820185206001600160401b038816600090815290835220805460ff19169515159590951790945550508351600192600792869290918291908401908083835b602083106134ee5780518252601f1990920191602091820191016134cf565b51815160209384036101000a6000190180199092169116179052920194855250604080519485900382019094206001600160401b039690961660009081529590525050909120805460ff1916911515919091179055505050565b613550613063565b61358f576040805162461bcd60e51b81526020600482018190526024820152600080516020614593833981519152604482015290519081900360640190fd5b61127981613d1c565b6135a0613063565b6135df576040805162461bcd60e51b81526020600482018190526024820152600080516020614593833981519152604482015290519081900360640190fd5b6006805467ffffffffffffffff19166001600160401b0392909216919091179055565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052613654908490613dbc565b505050565b600054600160a01b900460ff166136ae576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6136e46139af565b604080516001600160a01b039092168252519081900360200190a1565b6001600160a01b03821661375d57803414613758576040805162461bcd60e51b815260206004820152601260248201527134b739bab33334b1b4b2b73a1032ba3432b960711b604482015290519081900360640190fd5b6112d6565b6112d66001600160a01b038316333084613f71565b60006001600160a01b038416613827578234146137cb576040805162461bcd60e51b815260206004820152601260248201527134b739bab33334b1b4b2b73a1032ba3432b960711b604482015290519081900360640190fd5b818311613816576040805162461bcd60e51b8152602060048201526014602482015273616d6f756e74206c657373207468616e2066656560601b604482015290519081900360640190fd5b6138208383613fcb565b9050613873565b813414613870576040805162461bcd60e51b815260206004820152601260248201527134b739bab33334b1b4b2b73a1032ba3432b960711b604482015290519081900360640190fd5b50815b9392505050565b6001600160a01b03821661397a57600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156138d857600080fd5b505af11580156138ec573d6000803e3d6000fd5b50506001546003546040805163a9059cbb60e01b81526001600160a01b03928316600482015260248101889052905191909216945063a9059cbb9350604480830193506020928290030181600087803b15801561394857600080fd5b505af115801561395c573d6000803e3d6000fd5b505050506040513d602081101561397257600080fd5b506112d69050565b6003546112d6906001600160a01b03848116911683613602565b604080516014815260609290921b6020830152818101905290565b3390565b6060806139c3836000015161400d565b6139d0846020015161400d565b6139dd85604001516140aa565b6139ea86606001516140aa565b6139f787608001516140ed565b613a048860a001516140ed565b613a118960c001516140ed565b613a1e8a60e001516140ed565b6040516020018089805190602001908083835b60208310613a505780518252601f199092019160209182019101613a31565b51815160209384036101000a60001901801990921691161790528b5191909301928b0191508083835b60208310613a985780518252601f199092019160209182019101613a79565b51815160209384036101000a60001901801990921691161790528a5191909301928a0191508083835b60208310613ae05780518252601f199092019160209182019101613ac1565b51815160209384036101000a600019018019909216911617905289519190930192890191508083835b60208310613b285780518252601f199092019160209182019101613b09565b51815160209384036101000a600019018019909216911617905288519190930192880191508083835b60208310613b705780518252601f199092019160209182019101613b51565b51815160209384036101000a600019018019909216911617905287519190930192870191508083835b60208310613bb85780518252601f199092019160209182019101613b99565b51815160209384036101000a600019018019909216911617905286519190930192860191508083835b60208310613c005780518252601f199092019160209182019101613be1565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b60208310613c485780518252601f199092019160209182019101613c29565b6001836020036101000a03801982511681845116808217855250505050505090500198505050505050505050604051602081830303815290604052905080915050919050565b600054600160a01b900460ff1615613ce0576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586136e46139af565b6001600160a01b038116613d615760405162461bcd60e51b815260040180806020018281038252602681526020018061456d6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b613dc5826141b3565b613e16576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310613e545780518252601f199092019160209182019101613e35565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613eb6576040519150601f19603f3d011682016040523d82523d6000602084013e613ebb565b606091505b509150915081613f12576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115613f6b57808060200190516020811015613f2e57600080fd5b5051613f6b5760405162461bcd60e51b815260040180806020018281038252602a8152602001806145e2602a913960400191505060405180910390fd5b50505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052613f6b908590613dbc565b600061387383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506141ef565b60606001600160ff1b0382111561406b576040805162461bcd60e51b815260206004820152601b60248201527f56616c756520657863656564732075696e743235352072616e67650000000000604482015290519081900360640190fd5b60405160208082526000601f5b8282101561409a5785811a826020860101536001919091019060001901614078565b5050506040818101905292915050565b6040516008808252606091906000601f5b828210156140dd5785811a8260208601015360019190910190600019016140bb565b5050506028810160405292915050565b80516060906140fb81614286565b836040516020018083805190602001908083835b6020831061412e5780518252601f19909201916020918201910161410f565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106141765780518252601f199092019160209182019101614157565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052915050919050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906141e75750808214155b949350505050565b6000818484111561427e5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561424357818101518382015260200161422b565b50505050905090810190601f1680156142705780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b606060fd826001600160401b031610156142aa576142a3826143cc565b90506125d1565b61ffff826001600160401b031611614388576142c960fd60f81b6143e8565b6142d2836143fc565b6040516020018083805190602001908083835b602083106143045780518252601f1990920191602091820191016142e5565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b6020831061434c5780518252601f19909201916020918201910161432d565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405290506125d1565b63ffffffff826001600160401b0316116143b2576143a9607f60f91b6143e8565b6142d28361443f565b6143c36001600160f81b03196143e8565b6142d2836140aa565b604080516001815260f89290921b602083015260218201905290565b60606143f68260f81c6143cc565b92915050565b6040516002808252606091906000601f5b8282101561442f5785811a82602086010153600191909101906000190161440d565b5050506022810160405292915050565b6040516004808252606091906000601f5b828210156144725785811a826020860101536001919091019060001901614450565b5050506024810160405292915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106144c357805160ff19168380011785556144f0565b828001600101855582156144f0579182015b828111156144f05782518255916020019190600101906144d5565b506144fc929150614557565b5090565b604051806101000160405280600081526020016000815260200160006001600160401b0316815260200160006001600160401b03168152602001606081526020016060815260200160608152602001606081525090565b5b808211156144fc576000815560010161455856fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245746843726f7373436861696e4d616e616765722063726f7373436861696e206578656375746564206572726f72215361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220cb056f3cd929a5e622dd12481320fc08059c066eefeba2833d3b93636dc6be7b64736f6c634300060c00334f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573738be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0000000000000000000000000432dd61660f870ed30091e55df65c66570e0bc250000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000250e76987d838a75310c34bf422ea9f1ac4cc9060000000000000000000000005a51e2ebf8d136926b9ca7b59b60464e7c44d2eb000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000001434d4a23a1fc0c694f0d74ddaf9d8d564cfe2d430000000000000000000000000
Deployed Bytecode
0x6080604052600436106101d85760003560e01c80638456cb5911610102578063ad5c464811610095578063d798f88111610064578063d798f88114610cfe578063de77f69b14610d13578063f2fde38b14610ed9578063f916aa8514610f0c576101d8565b8063ad5c464814610c6e578063af24986114610c83578063af9980f014610cb6578063c415b95c14610ce9576101d8565b80639462c985116100d15780639462c98514610b285780639a8a059214610be4578063a3e28eb414610bf9578063a42dce8014610c3b576101d8565b80638456cb5914610a2d57806384eae14e14610a425780638da5cb5b14610afe5780638f32d59b14610b13576101d8565b806359c589a11161017a5780636f2b6ee6116101495780636f2b6ee614610850578063715018a614610883578063773c9d9c1461089857806378b556fa146109fc576101d8565b806359c589a1146107395780635b769f3c1461077e5780635c975abb146107b15780635f56bc53146107c6576101d8565b80633f4ba83a116101b65780633f4ba83a1461049c5780634672b083146104b15780634ad43eda146105a4578063559ebe57146105d5576101d8565b806316675e4f146101dd5780631745399d146103b85780631f237452146103eb575b600080fd5b3480156101e957600080fd5b506103b6600480360360a081101561020057600080fd5b6001600160401b03823516916001600160a01b0360208201351691810190606081016040820135600160201b81111561023857600080fd5b82018360208201111561024a57600080fd5b803590602001918460018302840111600160201b8311171561026b57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156102bd57600080fd5b8201836020820111156102cf57600080fd5b803590602001918460018302840111600160201b831117156102f057600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561034257600080fd5b82018360208201111561035457600080fd5b803590602001918460018302840111600160201b8311171561037557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610f3f945050505050565b005b3480156103c457600080fd5b506103b6600480360360208110156103db57600080fd5b50356001600160a01b031661115a565b3480156103f757600080fd5b506103b66004803603602081101561040e57600080fd5b810190602081018135600160201b81111561042857600080fd5b82018360208201111561043a57600080fd5b803590602001918460018302840111600160201b8311171561045b57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061127c945050505050565b3480156104a857600080fd5b506103b66112da565b61059060048036036101008110156104c857600080fd5b6001600160a01b03823516916001600160401b03602082013581169260408301359091169190810190608081016060820135600160201b81111561050b57600080fd5b82018360208201111561051d57600080fd5b803590602001918460018302840111600160201b8311171561053e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550508235935050506020810135906040810135906060013561132b565b604080519115158252519081900360200190f35b3480156105b057600080fd5b506105b9611bcf565b604080516001600160a01b039092168252519081900360200190f35b61059060048036036101208110156105ec57600080fd5b6001600160a01b03823516916001600160401b03602082013581169260408301359091169190810190608081016060820135600160201b81111561062f57600080fd5b82018360208201111561064157600080fd5b803590602001918460018302840111600160201b8311171561066257600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156106b457600080fd5b8201836020820111156106c657600080fd5b803590602001918460018302840111600160201b831117156106e757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505082359350505060208101359060408101359060600135611bde565b34801561074557600080fd5b5061076c6004803603602081101561075c57600080fd5b50356001600160a01b031661253b565b60408051918252519081900360200190f35b34801561078a57600080fd5b506103b6600480360360208110156107a157600080fd5b50356001600160a01b03166125d6565b3480156107bd57600080fd5b5061059061263f565b3480156107d257600080fd5b506107db61264f565b6040805160208082528351818301528351919283929083019185019080838360005b838110156108155781810151838201526020016107fd565b50505050905090810190601f1680156108425780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561085c57600080fd5b506103b66004803603602081101561087357600080fd5b50356001600160a01b03166126dd565b34801561088f57600080fd5b506103b6612791565b61059060048036036101208110156108af57600080fd5b6001600160a01b03823516916001600160401b03602082013581169260408301359091169190810190608081016060820135600160201b8111156108f257600080fd5b82018360208201111561090457600080fd5b803590602001918460018302840111600160201b8311171561092557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561097757600080fd5b82018360208201111561098957600080fd5b803590602001918460018302840111600160201b831117156109aa57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505082359350505060208101359060408101359060600135612822565b348015610a0857600080fd5b50610a11612fc6565b604080516001600160401b039092168252519081900360200190f35b348015610a3957600080fd5b506103b6612fd5565b348015610a4e57600080fd5b5061059060048036036040811015610a6557600080fd5b810190602081018135600160201b811115610a7f57600080fd5b820183602082011115610a9157600080fd5b803590602001918460018302840111600160201b83111715610ab257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160401b031691506130249050565b348015610b0a57600080fd5b506105b9613054565b348015610b1f57600080fd5b50610590613063565b348015610b3457600080fd5b5061059060048036036040811015610b4b57600080fd5b810190602081018135600160201b811115610b6557600080fd5b820183602082011115610b7757600080fd5b803590602001918460018302840111600160201b83111715610b9857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160401b031691506130879050565b348015610bf057600080fd5b50610a11613162565b348015610c0557600080fd5b5061059060048036036040811015610c1c57600080fd5b5080356001600160401b031690602001356001600160a01b031661317d565b348015610c4757600080fd5b506103b660048036036020811015610c5e57600080fd5b50356001600160a01b0316613202565b348015610c7a57600080fd5b506105b96132b6565b348015610c8f57600080fd5b506105b960048036036020811015610ca657600080fd5b50356001600160401b03166132c5565b348015610cc257600080fd5b506103b660048036036020811015610cd957600080fd5b50356001600160a01b03166132e0565b348015610cf557600080fd5b506105b9613349565b348015610d0a57600080fd5b506105b9613358565b348015610d1f57600080fd5b506103b660048036036080811015610d3657600080fd5b810190602081018135600160201b811115610d5057600080fd5b820183602082011115610d6257600080fd5b803590602001918460018302840111600160201b83111715610d8357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b811115610dd557600080fd5b820183602082011115610de757600080fd5b803590602001918460018302840111600160201b83111715610e0857600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b811115610e5a57600080fd5b820183602082011115610e6c57600080fd5b803590602001918460018302840111600160201b83111715610e8d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160401b031691506133679050565b348015610ee557600080fd5b506103b660048036036020811015610efc57600080fd5b50356001600160a01b0316613548565b348015610f1857600080fd5b506103b660048036036020811015610f2f57600080fd5b50356001600160401b0316613598565b610f47613063565b610f86576040805162461bcd60e51b81526020600482018190526024820152600080516020614593833981519152604482015290519081900360640190fd5b6001600160401b03851660009081526008602090815260409182902080546001600160a01b0319166001600160a01b03881617905590518451600192600792879290918291908401908083835b60208310610ff25780518252601f199092019160209182019101610fd3565b51815160209384036101000a60001901801990921691161790529201948552506040805194859003820185206001600160401b038c16600090815290835220805460ff19169515159590951790945550508351600192600792869290918291908401908083835b602083106110785780518252601f199092019160209182019101611059565b51815160209384036101000a60001901801990921691161790529201948552506040805194859003820185206001600160401b038c16600090815290835220805460ff19169515159590951790945550508251600192600792859290918291908401908083835b602083106110fe5780518252601f1990920191602091820191016110df565b51815160209384036101000a6000190180199092169116179052920194855250604080519485900382019094206001600160401b039a909a1660009081529990525050909520805460ff19169515159590951790945550505050565b6002546001600160a01b031633146111a9576040805162461bcd60e51b815260206004820152600d60248201526c10b332b2a1b7b63632b1ba37b960991b604482015290519081900360640190fd5b6001600160a01b0381166111e95760405133904780156108fc02916000818181858888f193505050501580156111e3573d6000803e3d6000fd5b50611279565b600254604080516370a0823160e01b81523060048201529051611279926001600160a01b0390811692908516916370a0823191602480820192602092909190829003018186803b15801561123c57600080fd5b505afa158015611250573d6000803e3d6000fd5b505050506040513d602081101561126657600080fd5b50516001600160a01b0384169190613602565b50565b611284613063565b6112c3576040805162461bcd60e51b81526020600482018190526024820152600080516020614593833981519152604482015290519081900360640190fd5b80516112d6906005906020840190614482565b5050565b6112e2613063565b611321576040805162461bcd60e51b81526020600482018190526024820152600080516020614593833981519152604482015290519081900360640190fd5b611329613659565b565b60008054600160a81b900460ff1661138a576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6000805460ff60a81b191690819055600160a01b900460ff16156113e8576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6113f28986613701565b6113fd898685613772565b9450611409898661387a565b6001600160a01b0389161561141e578861142b565b6001546001600160a01b03165b6001600160401b0389166000908152600860205260409020549099506001600160a01b031661149b576040805162461bcd60e51b815260206004820152601760248201527619da5d995b881c1bdbdb08191bc81b9bdd08195e1cda5d604a1b604482015290519081900360640190fd5b60076114a68a613994565b6040518082805190602001908083835b602083106114d55780518252601f1990920191602091820191016114b6565b51815160209384036101000a6000190180199092169116179052920194855250604080519485900382019094206001600160401b038d1660009081529152929092205460ff1691506115709050576040805162461bcd60e51b815260206004820152601d60248201527f696e70757420746f6b656e206e6f7420696e20676976656e20706f6f6c000000604482015290519081900360640190fd5b85516115b5576040805162461bcd60e51b815260206004820152600f60248201526e656d70747920746f4164647265737360881b604482015290519081900360640190fd5b60148601516001600160a01b038116611606576040805162461bcd60e51b815260206004820152600e60248201526d7a65726f20746f4164647265737360901b604482015290519081900360640190fd5b61160e614500565b6040518061010001604052808881526020018781526020018b6001600160401b031681526020018a6001600160401b0316815260200161164d8d613994565b815260200161166261165d6139af565b613994565b81526020016116716000613994565b815260200189905290506060611686826139b3565b90506000600460009054906101000a90046001600160a01b03166001600160a01b03166387939a7f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156116d857600080fd5b505afa1580156116ec573d6000803e3d6000fd5b505050506040513d602081101561170257600080fd5b505160065460405163bd5cf62560e01b81526001600160401b039091166004820181815260806024840190815260058054600260001960018316156101000201909116046084860181905295965086956001600160a01b0387169563bd5cf625959492938a939290916044810191606482019160a40190879080156117c85780601f1061179d576101008083540402835291602001916117c8565b820191906000526020600020905b8154815290600101906020018083116117ab57829003601f168201915b5050848103835260038152602001806218591960ea1b815250602001848103825285818151815260200191508051906020019080838360005b83811015611819578181015183820152602001611801565b50505050905090810190601f1680156118465780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b15801561186957600080fd5b505af115801561187d573d6000803e3d6000fd5b505050506040513d602081101561189357600080fd5b50516118d05760405162461bcd60e51b815260040180806020018281038252602f8152602001806145b3602f913960400191505060405180910390fd5b505050507f8636abd6d0e464fe725a13346c7ac779b73561c705506044a2e6b2cdb1295ea58a6118fe6139af565b6006546001600160401b03166119146000613994565b60058b60405180876001600160a01b03168152602001866001600160a01b03168152602001856001600160401b031681526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b8381101561198b578181015183820152602001611973565b50505050905090810190601f1680156119b85780820380516001836020036101000a031916815260200191505b50838103825285546002600019610100600184161502019091160480825260209091019086908015611a2b5780601f10611a0057610100808354040283529160200191611a2b565b820191906000526020600020905b815481529060010190602001808311611a0e57829003601f168201915b50509850505050505050505060405180910390a17f7b634860445c375b3604695e3d36b0ca94d7342cacaae46d96b8727e86522d328a611a696139af565b8b8b611a756000613994565b8c8c8b8b604051808a6001600160a01b03168152602001896001600160a01b03168152602001886001600160401b03168152602001876001600160401b031681526020018060200180602001868152602001858152602001848152602001838103835288818151815260200191508051906020019080838360005b83811015611b08578181015183820152602001611af0565b50505050905090810190601f168015611b355780820380516001836020036101000a031916815260200191505b50838103825287518152875160209182019189019080838360005b83811015611b68578181015183820152602001611b50565b50505050905090810190601f168015611b955780820380516001836020036101000a031916815260200191505b509b50505050505050505050505060405180910390a160019150506000805460ff60a81b1916600160a81b17905598975050505050505050565b6003546001600160a01b031681565b60008054600160a81b900460ff16611c3d576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6000805460ff60a81b191690819055600160a01b900460ff1615611c9b576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b611ca58a86613701565b611cb08a8685613772565b9450611cbc8a8661387a565b6001600160a01b038a1615611cd15789611cde565b6001546001600160a01b03165b6001600160401b038a16600090815260086020526040902054909a506001600160a01b0316611d4e576040805162461bcd60e51b815260206004820152601760248201527619da5d995b881c1bdbdb08191bc81b9bdd08195e1cda5d604a1b604482015290519081900360640190fd5b6007611d598b613994565b6040518082805190602001908083835b60208310611d885780518252601f199092019160209182019101611d69565b51815160209384036101000a6000190180199092169116179052920194855250604080519485900382019094206001600160401b038e1660009081529152929092205460ff169150611e239050576040805162461bcd60e51b815260206004820152601d60248201527f696e70757420746f6b656e206e6f7420696e20676976656e20706f6f6c000000604482015290519081900360640190fd5b6007876040518082805190602001908083835b60208310611e555780518252601f199092019160209182019101611e36565b51815160209384036101000a6000190180199092169116179052920194855250604080519485900382019094206001600160401b038e1660009081529152929092205460ff169150611ef09050576040805162461bcd60e51b815260206004820152601e60248201527f6f757470757420746f6b656e206e6f7420696e20676976656e20706f6f6c0000604482015290519081900360640190fd5b8551611f35576040805162461bcd60e51b815260206004820152600f60248201526e656d70747920746f4164647265737360881b604482015290519081900360640190fd5b60148601516001600160a01b038116611f86576040805162461bcd60e51b815260206004820152600e60248201526d7a65726f20746f4164647265737360901b604482015290519081900360640190fd5b611f8e614500565b6040518061010001604052808881526020018781526020018c6001600160401b031681526020018b6001600160401b03168152602001611fcd8e613994565b8152602001611fdd61165d6139af565b81526020018a81526020018981525090506060611ff9826139b3565b90506000600460009054906101000a90046001600160a01b03166001600160a01b03166387939a7f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561204b57600080fd5b505afa15801561205f573d6000803e3d6000fd5b505050506040513d602081101561207557600080fd5b505160065460405163bd5cf62560e01b81526001600160401b039091166004820181815260806024840190815260058054600260001960018316156101000201909116046084860181905295965086956001600160a01b0387169563bd5cf625959492938a939290916044810191606482019160a401908790801561213b5780601f106121105761010080835404028352916020019161213b565b820191906000526020600020905b81548152906001019060200180831161211e57829003601f168201915b505084810383526004815260200180630737761760e41b815250602001848103825285818151815260200191508051906020019080838360005b8381101561218d578181015183820152602001612175565b50505050905090810190601f1680156121ba5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b1580156121dd57600080fd5b505af11580156121f1573d6000803e3d6000fd5b505050506040513d602081101561220757600080fd5b50516122445760405162461bcd60e51b815260040180806020018281038252602f8152602001806145b3602f913960400191505060405180910390fd5b505050507f8636abd6d0e464fe725a13346c7ac779b73561c705506044a2e6b2cdb1295ea58b6122726139af565b6006546001600160401b03166122886000613994565b60058b60405180876001600160a01b03168152602001866001600160a01b03168152602001856001600160401b031681526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b838110156122ff5781810151838201526020016122e7565b50505050905090810190601f16801561232c5780820380516001836020036101000a031916815260200191505b5083810382528554600260001961010060018416150201909116048082526020909101908690801561239f5780601f106123745761010080835404028352916020019161239f565b820191906000526020600020905b81548152906001019060200180831161238257829003601f168201915b50509850505050505050505060405180910390a17f9e37e0e96b266241aa70174d3c6d60151148a5b4181a57fb3d9475aa39ed06728b6123dd6139af565b8c8c8c8c8c8b8b604051808a6001600160a01b03168152602001896001600160a01b03168152602001886001600160401b03168152602001876001600160401b031681526020018060200180602001868152602001858152602001848152602001838103835288818151815260200191508051906020019080838360005b8381101561247357818101518382015260200161245b565b50505050905090810190601f1680156124a05780820380516001836020036101000a031916815260200191505b50838103825287518152875160209182019189019080838360005b838110156124d35781810151838201526020016124bb565b50505050905090810190601f1680156125005780820380516001836020036101000a031916815260200191505b509b50505050505050505050505060405180910390a160019150506000805460ff60a81b1916600160a81b1790559998505050505050505050565b60006001600160a01b038216612553575030316125d1565b604080516370a0823160e01b8152306004820152905183916001600160a01b038316916370a0823191602480820192602092909190829003018186803b15801561259c57600080fd5b505afa1580156125b0573d6000803e3d6000fd5b505050506040513d60208110156125c657600080fd5b505191506125d19050565b919050565b6125de613063565b61261d576040805162461bcd60e51b81526020600482018190526024820152600080516020614593833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600054600160a01b900460ff1690565b6005805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156126d55780601f106126aa576101008083540402835291602001916126d5565b820191906000526020600020905b8154815290600101906020018083116126b857829003601f168201915b505050505081565b6126e5613063565b612724576040805162461bcd60e51b81526020600482018190526024820152600080516020614593833981519152604482015290519081900360640190fd5b6001600160a01b03811661276f576040805162461bcd60e51b815260206004820152600d60248201526c656d747079206164647265737360981b604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b612799613063565b6127d8576040805162461bcd60e51b81526020600482018190526024820152600080516020614593833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60008054600160a81b900460ff16612881576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6000805460ff60a81b191690819055600160a01b900460ff16156128df576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6128e98a86613701565b6128f48a8685613772565b94506129008a8661387a565b6001600160a01b038a16156129155789612922565b6001546001600160a01b03165b6001600160401b038a16600090815260086020526040902054909a506001600160a01b0316612992576040805162461bcd60e51b815260206004820152601760248201527619da5d995b881c1bdbdb08191bc81b9bdd08195e1cda5d604a1b604482015290519081900360640190fd5b6001600160401b0389166000908152600860205260409020546001600160a01b038b8116911614612a0a576040805162461bcd60e51b815260206004820181905260248201527f696e70757420746f6b656e206973206e6f7420706f6f6c204c5020746f6b656e604482015290519081900360640190fd5b6007876040518082805190602001908083835b60208310612a3c5780518252601f199092019160209182019101612a1d565b51815160209384036101000a6000190180199092169116179052920194855250604080519485900382019094206001600160401b038e1660009081529152929092205460ff169150612ad79050576040805162461bcd60e51b815260206004820152601e60248201527f6f757470757420746f6b656e206e6f7420696e20676976656e20706f6f6c0000604482015290519081900360640190fd5b8551612b1c576040805162461bcd60e51b815260206004820152600f60248201526e656d70747920746f4164647265737360881b604482015290519081900360640190fd5b60148601516001600160a01b038116612b6d576040805162461bcd60e51b815260206004820152600e60248201526d7a65726f20746f4164647265737360901b604482015290519081900360640190fd5b612b75614500565b6040518061010001604052808881526020018781526020018c6001600160401b031681526020018b6001600160401b03168152602001612bb48e613994565b8152602001612bc461165d6139af565b81526020018a81526020018981525090506060612be0826139b3565b90506000600460009054906101000a90046001600160a01b03166001600160a01b03166387939a7f6040518163ffffffff1660e01b815260040160206040518083038186803b158015612c3257600080fd5b505afa158015612c46573d6000803e3d6000fd5b505050506040513d6020811015612c5c57600080fd5b505160065460405163bd5cf62560e01b81526001600160401b039091166004820181815260806024840190815260058054600260001960018316156101000201909116046084860181905295965086956001600160a01b0387169563bd5cf625959492938a939290916044810191606482019160a4019087908015612d225780601f10612cf757610100808354040283529160200191612d22565b820191906000526020600020905b815481529060010190602001808311612d0557829003601f168201915b5050848103835260068152602001806572656d6f766560d01b815250602001848103825285818151815260200191508051906020019080838360005b83811015612d76578181015183820152602001612d5e565b50505050905090810190601f168015612da35780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b158015612dc657600080fd5b505af1158015612dda573d6000803e3d6000fd5b505050506040513d6020811015612df057600080fd5b5051612e2d5760405162461bcd60e51b815260040180806020018281038252602f8152602001806145b3602f913960400191505060405180910390fd5b505050507f8636abd6d0e464fe725a13346c7ac779b73561c705506044a2e6b2cdb1295ea58b612e5b6139af565b6006546001600160401b0316612e716000613994565b60058b60405180876001600160a01b03168152602001866001600160a01b03168152602001856001600160401b031681526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b83811015612ee8578181015183820152602001612ed0565b50505050905090810190601f168015612f155780820380516001836020036101000a031916815260200191505b50838103825285546002600019610100600184161502019091160480825260209091019086908015612f885780601f10612f5d57610100808354040283529160200191612f88565b820191906000526020600020905b815481529060010190602001808311612f6b57829003601f168201915b50509850505050505050505060405180910390a17f7ee445799431a22b707efdb3f751a430c4f01f12d902e952200041d81255a41e8b6123dd6139af565b6006546001600160401b031681565b612fdd613063565b61301c576040805162461bcd60e51b81526020600482018190526024820152600080516020614593833981519152604482015290519081900360640190fd5b611329613c8e565b81516020818401810180516007825292820194820194909420919093529091526000908152604090205460ff1681565b6000546001600160a01b031690565b600080546001600160a01b03166130786139af565b6001600160a01b031614905090565b6000613091613063565b6130d0576040805162461bcd60e51b81526020600482018190526024820152600080516020614593833981519152604482015290519081900360640190fd5b60016007846040518082805190602001908083835b602083106131045780518252601f1990920191602091820191016130e5565b51815160209384036101000a6000190180199092169116179052920194855250604080519485900382019094206001600160401b039790971660009081529690525050909220805460ff191692151592909217909155506001919050565b6006546801000000000000000090046001600160401b031681565b6000613187613063565b6131c6576040805162461bcd60e51b81526020600482018190526024820152600080516020614593833981519152604482015290519081900360640190fd5b506001600160401b038216600090815260086020526040902080546001600160a01b0383166001600160a01b0319909116179055600192915050565b61320a613063565b613249576040805162461bcd60e51b81526020600482018190526024820152600080516020614593833981519152604482015290519081900360640190fd5b6001600160a01b038116613294576040805162461bcd60e51b815260206004820152600d60248201526c656d747079206164647265737360981b604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031681565b6008602052600090815260409020546001600160a01b031681565b6132e8613063565b613327576040805162461bcd60e51b81526020600482018190526024820152600080516020614593833981519152604482015290519081900360640190fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031681565b6004546001600160a01b031681565b61336f613063565b6133ae576040805162461bcd60e51b81526020600482018190526024820152600080516020614593833981519152604482015290519081900360640190fd5b60016007856040518082805190602001908083835b602083106133e25780518252601f1990920191602091820191016133c3565b51815160209384036101000a60001901801990921691161790529201948552506040805194859003820185206001600160401b038816600090815290835220805460ff19169515159590951790945550508451600192600792879290918291908401908083835b602083106134685780518252601f199092019160209182019101613449565b51815160209384036101000a60001901801990921691161790529201948552506040805194859003820185206001600160401b038816600090815290835220805460ff19169515159590951790945550508351600192600792869290918291908401908083835b602083106134ee5780518252601f1990920191602091820191016134cf565b51815160209384036101000a6000190180199092169116179052920194855250604080519485900382019094206001600160401b039690961660009081529590525050909120805460ff1916911515919091179055505050565b613550613063565b61358f576040805162461bcd60e51b81526020600482018190526024820152600080516020614593833981519152604482015290519081900360640190fd5b61127981613d1c565b6135a0613063565b6135df576040805162461bcd60e51b81526020600482018190526024820152600080516020614593833981519152604482015290519081900360640190fd5b6006805467ffffffffffffffff19166001600160401b0392909216919091179055565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052613654908490613dbc565b505050565b600054600160a01b900460ff166136ae576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6136e46139af565b604080516001600160a01b039092168252519081900360200190a1565b6001600160a01b03821661375d57803414613758576040805162461bcd60e51b815260206004820152601260248201527134b739bab33334b1b4b2b73a1032ba3432b960711b604482015290519081900360640190fd5b6112d6565b6112d66001600160a01b038316333084613f71565b60006001600160a01b038416613827578234146137cb576040805162461bcd60e51b815260206004820152601260248201527134b739bab33334b1b4b2b73a1032ba3432b960711b604482015290519081900360640190fd5b818311613816576040805162461bcd60e51b8152602060048201526014602482015273616d6f756e74206c657373207468616e2066656560601b604482015290519081900360640190fd5b6138208383613fcb565b9050613873565b813414613870576040805162461bcd60e51b815260206004820152601260248201527134b739bab33334b1b4b2b73a1032ba3432b960711b604482015290519081900360640190fd5b50815b9392505050565b6001600160a01b03821661397a57600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156138d857600080fd5b505af11580156138ec573d6000803e3d6000fd5b50506001546003546040805163a9059cbb60e01b81526001600160a01b03928316600482015260248101889052905191909216945063a9059cbb9350604480830193506020928290030181600087803b15801561394857600080fd5b505af115801561395c573d6000803e3d6000fd5b505050506040513d602081101561397257600080fd5b506112d69050565b6003546112d6906001600160a01b03848116911683613602565b604080516014815260609290921b6020830152818101905290565b3390565b6060806139c3836000015161400d565b6139d0846020015161400d565b6139dd85604001516140aa565b6139ea86606001516140aa565b6139f787608001516140ed565b613a048860a001516140ed565b613a118960c001516140ed565b613a1e8a60e001516140ed565b6040516020018089805190602001908083835b60208310613a505780518252601f199092019160209182019101613a31565b51815160209384036101000a60001901801990921691161790528b5191909301928b0191508083835b60208310613a985780518252601f199092019160209182019101613a79565b51815160209384036101000a60001901801990921691161790528a5191909301928a0191508083835b60208310613ae05780518252601f199092019160209182019101613ac1565b51815160209384036101000a600019018019909216911617905289519190930192890191508083835b60208310613b285780518252601f199092019160209182019101613b09565b51815160209384036101000a600019018019909216911617905288519190930192880191508083835b60208310613b705780518252601f199092019160209182019101613b51565b51815160209384036101000a600019018019909216911617905287519190930192870191508083835b60208310613bb85780518252601f199092019160209182019101613b99565b51815160209384036101000a600019018019909216911617905286519190930192860191508083835b60208310613c005780518252601f199092019160209182019101613be1565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b60208310613c485780518252601f199092019160209182019101613c29565b6001836020036101000a03801982511681845116808217855250505050505090500198505050505050505050604051602081830303815290604052905080915050919050565b600054600160a01b900460ff1615613ce0576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586136e46139af565b6001600160a01b038116613d615760405162461bcd60e51b815260040180806020018281038252602681526020018061456d6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b613dc5826141b3565b613e16576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310613e545780518252601f199092019160209182019101613e35565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613eb6576040519150601f19603f3d011682016040523d82523d6000602084013e613ebb565b606091505b509150915081613f12576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115613f6b57808060200190516020811015613f2e57600080fd5b5051613f6b5760405162461bcd60e51b815260040180806020018281038252602a8152602001806145e2602a913960400191505060405180910390fd5b50505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052613f6b908590613dbc565b600061387383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506141ef565b60606001600160ff1b0382111561406b576040805162461bcd60e51b815260206004820152601b60248201527f56616c756520657863656564732075696e743235352072616e67650000000000604482015290519081900360640190fd5b60405160208082526000601f5b8282101561409a5785811a826020860101536001919091019060001901614078565b5050506040818101905292915050565b6040516008808252606091906000601f5b828210156140dd5785811a8260208601015360019190910190600019016140bb565b5050506028810160405292915050565b80516060906140fb81614286565b836040516020018083805190602001908083835b6020831061412e5780518252601f19909201916020918201910161410f565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106141765780518252601f199092019160209182019101614157565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052915050919050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906141e75750808214155b949350505050565b6000818484111561427e5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561424357818101518382015260200161422b565b50505050905090810190601f1680156142705780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b606060fd826001600160401b031610156142aa576142a3826143cc565b90506125d1565b61ffff826001600160401b031611614388576142c960fd60f81b6143e8565b6142d2836143fc565b6040516020018083805190602001908083835b602083106143045780518252601f1990920191602091820191016142e5565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b6020831061434c5780518252601f19909201916020918201910161432d565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405290506125d1565b63ffffffff826001600160401b0316116143b2576143a9607f60f91b6143e8565b6142d28361443f565b6143c36001600160f81b03196143e8565b6142d2836140aa565b604080516001815260f89290921b602083015260218201905290565b60606143f68260f81c6143cc565b92915050565b6040516002808252606091906000601f5b8282101561442f5785811a82602086010153600191909101906000190161440d565b5050506022810160405292915050565b6040516004808252606091906000601f5b828210156144725785811a826020860101536001919091019060001901614450565b5050506024810160405292915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106144c357805160ff19168380011785556144f0565b828001600101855582156144f0579182015b828111156144f05782518255916020019190600101906144d5565b506144fc929150614557565b5090565b604051806101000160405280600081526020016000815260200160006001600160401b0316815260200160006001600160401b03168152602001606081526020016060815260200160608152602001606081525090565b5b808211156144fc576000815560010161455856fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245746843726f7373436861696e4d616e616765722063726f7373436861696e206578656375746564206572726f72215361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220cb056f3cd929a5e622dd12481320fc08059c066eefeba2833d3b93636dc6be7b64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000432dd61660f870ed30091e55df65c66570e0bc250000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000250e76987d838a75310c34bf422ea9f1ac4cc9060000000000000000000000005a51e2ebf8d136926b9ca7b59b60464e7c44d2eb000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000001434d4a23a1fc0c694f0d74ddaf9d8d564cfe2d430000000000000000000000000
-----Decoded View---------------
Arg [0] : _owner (address): 0x432dD61660F870ED30091E55DF65C66570E0bc25
Arg [1] : _chainId (uint64): 2
Arg [2] : _swapChianId (uint64): 10
Arg [3] : _lockProxy (address): 0x250e76987d838a75310c34bf422ea9f1AC4Cc906
Arg [4] : _CCMP (address): 0x5a51E2ebF8D136926b9cA7b59B60464E7C44d2Eb
Arg [5] : _weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [6] : _swapProxyHash (bytes): 0x34d4a23a1fc0c694f0d74ddaf9d8d564cfe2d430
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 000000000000000000000000432dd61660f870ed30091e55df65c66570e0bc25
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [2] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [3] : 000000000000000000000000250e76987d838a75310c34bf422ea9f1ac4cc906
Arg [4] : 0000000000000000000000005a51e2ebf8d136926b9ca7b59b60464e7c44d2eb
Arg [5] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [6] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [8] : 34d4a23a1fc0c694f0d74ddaf9d8d564cfe2d430000000000000000000000000
Deployed Bytecode Sourcemap
48395:13187:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51972:347;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51972:347:0;;;;-1:-1:-1;;;;;51972:347:0;;;;;;;;;;;;;;;;-1:-1:-1;;;51972:347:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51972:347:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51972:347:0;;;;;;;;-1:-1:-1;51972:347:0;;-1:-1:-1;;;;;51972:347:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51972:347:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51972:347:0;;;;;;;;-1:-1:-1;51972:347:0;;-1:-1:-1;;;;;51972:347:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51972:347:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51972:347:0;;-1:-1:-1;51972:347:0;;-1:-1:-1;;;;;51972:347:0:i;:::-;;52518:332;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52518:332:0;-1:-1:-1;;;;;52518:332:0;;:::i;51163:119::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51163:119:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51163:119:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51163:119:0;;-1:-1:-1;51163:119:0;;-1:-1:-1;;;;;51163:119:0:i;50592:67::-;;;;;;;;;;;;;:::i;54966:2038::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54966:2038:0;;;;-1:-1:-1;;;;;54966:2038:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;54966:2038:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;54966:2038:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54966:2038:0;;-1:-1:-1;;54966:2038:0;;;-1:-1:-1;;;54966:2038:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;48825:31;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;48825:31:0;;;;;;;;;;;;;;52862:2092;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52862:2092:0;;;;-1:-1:-1;;;;;52862:2092:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;52862:2092:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;52862:2092:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52862:2092:0;;;;;;;;-1:-1:-1;52862:2092:0;;-1:-1:-1;;;;;52862:2092:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;52862:2092:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52862:2092:0;;-1:-1:-1;;52862:2092:0;;;-1:-1:-1;;;52862:2092:0;;;;;;;;;;;;;;:::i;59140:510::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59140:510:0;-1:-1:-1;;;;;59140:510:0;;:::i;:::-;;;;;;;;;;;;;;;;51413:82;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51413:82:0;-1:-1:-1;;;;;51413:82:0;;:::i;40968:78::-;;;;;;;;;;;;;:::i;48905:26::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50845:170;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50845:170:0;-1:-1:-1;;;;;50845:170:0;;:::i;43158:140::-;;;;;;;;;;;;;:::i;57016:2112::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57016:2112:0;;;;-1:-1:-1;;;;;57016:2112:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57016:2112:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57016:2112:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57016:2112:0;;;;;;;;-1:-1:-1;57016:2112:0;;-1:-1:-1;;;;;57016:2112:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57016:2112:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57016:2112:0;;-1:-1:-1;;57016:2112:0;;;-1:-1:-1;;;57016:2112:0;;;;;;;;;;;;;;:::i;48938:25::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;48938:25:0;;;;;;;;;;;;;;50521:63;;;;;;;;;;;;;:::i;49003:60::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;49003:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;49003:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49003:60:0;;-1:-1:-1;;;49003:60:0;;-1:-1:-1;;;;;49003:60:0;;-1:-1:-1;49003:60:0;;-1:-1:-1;49003:60:0:i;42347:79::-;;;;;;;;;;;;;:::i;42713:94::-;;;;;;;;;;;;;:::i;51507:183::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51507:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51507:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51507:183:0;;-1:-1:-1;;;51507:183:0;;-1:-1:-1;;;;;51507:183:0;;-1:-1:-1;51507:183:0;;-1:-1:-1;51507:183:0:i;48970:21::-;;;;;;;;;;;;;:::i;52331:175::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52331:175:0;;-1:-1:-1;;;;;52331:175:0;;;;;-1:-1:-1;;;;;52331:175:0;;:::i;50671:166::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50671:166:0;-1:-1:-1;;;;;50671:166:0;;:::i;48765:19::-;;;;;;;;;;;;;:::i;49070:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49070:46:0;-1:-1:-1;;;;;49070:46:0;;:::i;51027:124::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51027:124:0;-1:-1:-1;;;;;51027:124:0;;:::i;48791:27::-;;;;;;;;;;;;;:::i;48863:35::-;;;;;;;;;;;;;:::i;51702:258::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51702:258:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51702:258:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51702:258:0;;;;;;;;-1:-1:-1;51702:258:0;;-1:-1:-1;;;;;51702:258:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51702:258:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51702:258:0;;;;;;;;-1:-1:-1;51702:258:0;;-1:-1:-1;;;;;51702:258:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51702:258:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51702:258:0;;-1:-1:-1;;;51702:258:0;;-1:-1:-1;;;;;51702:258:0;;-1:-1:-1;51702:258:0;;-1:-1:-1;51702:258:0:i;43453:110::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43453:110:0;-1:-1:-1;;;;;43453:110:0;;:::i;51294:107::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51294:107:0;-1:-1:-1;;;;;51294:107:0;;:::i;51972:347::-;42559:9;:7;:9::i;:::-;42551:54;;;;;-1:-1:-1;;;42551:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;42551:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;52137:20:0;::::1;;::::0;;;:12:::1;:20;::::0;;;;;;;;:39;;-1:-1:-1;;;;;;52137:39:0::1;-1:-1:-1::0;;;;;52137:39:0;::::1;;::::0;;52187:19;;;;-1:-1:-1;;52187:11:0::1;::::0;:19;;;;;;;;::::1;::::0;;;;::::1;;;;;;::::0;;;;-1:-1:-1;;52187:19:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;::::0;;;::::1;::::0;;::::1;;;-1:-1:-1::0;;52187:19:0;;::::1;::::0;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;;-1:-1:-1;52187:19:0::1;::::0;;;;;;;;;;-1:-1:-1;;;;;52187:27:0;::::1;-1:-1:-1::0;52187:27:0;;;;;;;:34;;-1:-1:-1;;52187:34:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;-1:-1:-1;;52232:19:0;;-1:-1:-1;;52232:11:0::1;::::0;:19;;52187;;;;52232;;::::1;::::0;;52187;52232;::::1;;;;;;::::0;;;;-1:-1:-1;;52232:19:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;::::0;;;::::1;::::0;;::::1;;;-1:-1:-1::0;;52232:19:0;;::::1;::::0;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;;-1:-1:-1;52232:19:0::1;::::0;;;;;;;;;;-1:-1:-1;;;;;52232:27:0;::::1;-1:-1:-1::0;52232:27:0;;;;;;;:34;;-1:-1:-1;;52232:34:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;-1:-1:-1;;52277:19:0;;-1:-1:-1;;52277:11:0::1;::::0;:19;;52232;;;;52277;;::::1;::::0;;52232;52277;::::1;;;;;;::::0;;;;-1:-1:-1;;52277:19:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;::::0;;;::::1;::::0;;::::1;;;-1:-1:-1::0;;52277:19:0;;::::1;::::0;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;;-1:-1:-1;52277:19:0::1;::::0;;;;;;;;;;;-1:-1:-1;;;;;52277:27:0;;;::::1;-1:-1:-1::0;52277:27:0;;;;;;-1:-1:-1;;52277:27:0;;;:34;;-1:-1:-1;;52277:34:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;-1:-1:-1;;;;51972:347:0:o;52518:332::-;52595:12;;-1:-1:-1;;;;;52595:12:0;52581:10;:26;52573:52;;;;;-1:-1:-1;;;52573:52:0;;;;;;;;;;;;-1:-1:-1;;;52573:52:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;52640:19:0;;52636:207;;52676:42;;:10;;52696:21;52676:42;;;;;;;;;52696:21;52676:10;:42;;;;;;;;;;;;;;;;;;;;;52636:207;;;52778:12;;52792:38;;;-1:-1:-1;;;52792:38:0;;52824:4;52792:38;;;;;;52751:80;;-1:-1:-1;;;;;52778:12:0;;;;52792:23;;;;;;:38;;;;;;;;;;;;;;;:23;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52792:38:0;-1:-1:-1;;;;;52751:26:0;;;:80;:26;:80::i;:::-;52518:332;:::o;51163:119::-;42559:9;:7;:9::i;:::-;42551:54;;;;;-1:-1:-1;;;42551:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;42551:54:0;;;;;;;;;;;;;;;51245:29;;::::1;::::0;:13:::1;::::0;:29:::1;::::0;::::1;::::0;::::1;:::i;:::-;;51163:119:::0;:::o;50592:67::-;42559:9;:7;:9::i;:::-;42551:54;;;;;-1:-1:-1;;;42551:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;42551:54:0;;;;;;;;;;;;;;;50641:10:::1;:8;:10::i;:::-;50592:67::o:0;54966:2038::-;55173:4;44946:11;;-1:-1:-1;;;44946:11:0;;;;44938:55;;;;;-1:-1:-1;;;44938:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45085:5;45071:19;;-1:-1:-1;;;;45071:19:0;;;;;-1:-1:-1;;;41205:7:0;::::1;45071:19:::0;41205:7:::1;41204:8;41196:37;;;::::0;;-1:-1:-1;;;41196:37:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41196:37:0;;;;;;;;;;;;;::::1;;55190:28:::2;55196:13;55211:6;55190:5;:28::i;:::-;55252:40;55265:13;55280:6;55288:3;55252:12;:40::i;:::-;55243:49;;55313:28;55319:13;55334:6;55313:5;:28::i;:::-;-1:-1:-1::0;;;;;55370:25:0;::::2;::::0;:48:::2;;55405:13;55370:48;;;55398:4;::::0;-1:-1:-1;;;;;55398:4:0::2;55370:48;-1:-1:-1::0;;;;;55441:22:0;::::2;55475:1;55441:22:::0;;;:12:::2;:22;::::0;;;;;55354:64;;-1:-1:-1;;;;;;55441:22:0::2;55433:72;;;::::0;;-1:-1:-1;;;55433:72:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;55433:72:0;;;;;;;;;;;;;::::2;;55524:11;55536:35;55557:13;55536:20;:35::i;:::-;55524:48;;;;;;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;55524:48:0;;;;::::2;::::0;;::::2;::::0;::::2;;;;::::0;;;::::2;::::0;;::::2;;;-1:-1:-1::0;;55524:48:0;;::::2;::::0;;::::2;::::0;::::2;;::::0;;;::::2;::::0;;;-1:-1:-1;55524:48:0::2;::::0;;;;;;;;;;;-1:-1:-1;;;;;55524:58:0;::::2;-1:-1:-1::0;55524:58:0;;;;;;;;;;::::2;;::::0;-1:-1:-1;55516:99:0::2;::::0;-1:-1:-1;55516:99:0::2;;::::0;;-1:-1:-1;;;55516:99:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;55634:16:::0;;55626:48:::2;;;::::0;;-1:-1:-1;;;55626:48:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;55626:48:0;;;;;;;;;;;;;::::2;;55747:4;55733:19:::0;::::2;55727:26:::0;-1:-1:-1;;;;;55773:18:0;::::2;55765:44;;;::::0;;-1:-1:-1;;;55765:44:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;55765:44:0;;;;;;;;;;;;;::::2;;55845:20;;:::i;:::-;55868:409;;;;;;;;55902:6;55868:409;;;;55935:12;55868:409;;;;55976:8;-1:-1:-1::0;;;;;55868:409:0::2;;;;;56014:9;-1:-1:-1::0;;;;;55868:409:0::2;;;;;56057:35;56078:13;56057:20;:35::i;:::-;55868:409;;;;56124:34;56145:12;:10;:12::i;:::-;56124:20;:34::i;:::-;55868:409;;;;56190:32;56219:1;56190:20;:32::i;:::-;55868:409:::0;;::::2;;::::0;;;55845:432;-1:-1:-1;56292:19:0::2;56314:24;55845:432:::0;56314:16:::2;:24::i;:::-;56292:46;;56367:16;56413:20;;;;;;;;;-1:-1:-1::0;;;;;56413:20:0::2;-1:-1:-1::0;;;;;56386:72:0::2;;:74;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;56386:74:0;56588:11:::2;::::0;56572:58:::2;::::0;-1:-1:-1;;;56572:58:0;;-1:-1:-1;;;;;56588:11:0;;::::2;56572:58;::::0;::::2;::::0;;;;;;;;;;56601:13:::2;56572:58:::0;;::::2;-1:-1:-1::0;;56588:11:0;56572:58;::::2;;56588:11;56572:58;::::0;;;::::2;;::::0;;;;;;56386:74;;-1:-1:-1;56386:74:0;;-1:-1:-1;;;;;56572:15:0;::::2;::::0;::::2;::::0;56588:11;56601:13;;56623:6;;56572:58;;;;;;;;;;;;;;56601:13;;56572:58;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;56572:58:0::2;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;56572:58:0;56564:118:::2;;;;-1:-1:-1::0;;;56564:118:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41244:1;;;;56711:108;56721:13;56736:12;:10;:12::i;:::-;56750:11;::::0;-1:-1:-1;;;;;56750:11:0::2;56763:32;56750:11;56763:20;:32::i;:::-;56797:13;56812:6;56711:108;;;;-1:-1:-1::0;;;;;56711:108:0::2;;;;;;-1:-1:-1::0;;;;;56711:108:0::2;;;;;;-1:-1:-1::0;;;;;56711:108:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;56711:108:0;;::::2;::::0;;;;::::2;-1:-1:-1::0;;56711:108:0::2;;::::0;::::2;;;::::0;;;::::2;;::::0;;;::::2;::::0;;::::2;::::0;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56835:129;56853:13;56868:12;:10;:12::i;:::-;56882:8;56892:9;56903:32;56932:1;56903:20;:32::i;:::-;56937:9;56948:6;56956:3;56961:2;56835:129;;;;-1:-1:-1::0;;;;;56835:129:0::2;;;;;;-1:-1:-1::0;;;;;56835:129:0::2;;;;;;-1:-1:-1::0;;;;;56835:129:0::2;;;;;;-1:-1:-1::0;;;;;56835:129:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;56835:129:0;;::::2;::::0;;;;;;;;::::2;::::0;;::::2;::::0;;::::2;::::0;;;;::::2;;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56992:4;56985:11;;;45251::::0;:18;;-1:-1:-1;;;;45251:18:0;-1:-1:-1;;;45251:18:0;;;54966:2038;;-1:-1:-1;;;;;;;;54966:2038:0:o;48825:31::-;;;-1:-1:-1;;;;;48825:31:0;;:::o;52862:2092::-;53086:4;44946:11;;-1:-1:-1;;;44946:11:0;;;;44938:55;;;;;-1:-1:-1;;;44938:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45085:5;45071:19;;-1:-1:-1;;;;45071:19:0;;;;;-1:-1:-1;;;41205:7:0;::::1;45071:19:::0;41205:7:::1;41204:8;41196:37;;;::::0;;-1:-1:-1;;;41196:37:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41196:37:0;;;;;;;;;;;;;::::1;;53103:28:::2;53109:13;53124:6;53103:5;:28::i;:::-;53157:40;53170:13;53185:6;53193:3;53157:12;:40::i;:::-;53148:49;;53218:28;53224:13;53239:6;53218:5;:28::i;:::-;-1:-1:-1::0;;;;;53275:25:0;::::2;::::0;:48:::2;;53310:13;53275:48;;;53303:4;::::0;-1:-1:-1;;;;;53303:4:0::2;53275:48;-1:-1:-1::0;;;;;53344:22:0;::::2;53378:1;53344:22:::0;;;:12:::2;:22;::::0;;;;;53259:64;;-1:-1:-1;;;;;;53344:22:0::2;53336:72;;;::::0;;-1:-1:-1;;;53336:72:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;53336:72:0;;;;;;;;;;;;;::::2;;53427:11;53439:35;53460:13;53439:20;:35::i;:::-;53427:48;;;;;;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;53427:48:0;;;;::::2;::::0;;::::2;::::0;::::2;;;;::::0;;;::::2;::::0;;::::2;;;-1:-1:-1::0;;53427:48:0;;::::2;::::0;;::::2;::::0;::::2;;::::0;;;::::2;::::0;;;-1:-1:-1;53427:48:0::2;::::0;;;;;;;;;;;-1:-1:-1;;;;;53427:58:0;::::2;-1:-1:-1::0;53427:58:0;;;;;;;;;;::::2;;::::0;-1:-1:-1;53419:99:0::2;::::0;-1:-1:-1;53419:99:0::2;;::::0;;-1:-1:-1;;;53419:99:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;53537:11;53549;53537:24;;;;;;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;53537:24:0;;;;::::2;::::0;;::::2;::::0;::::2;;;;::::0;;;::::2;::::0;;::::2;;;-1:-1:-1::0;;53537:24:0;;::::2;::::0;;::::2;::::0;::::2;;::::0;;;::::2;::::0;;;-1:-1:-1;53537:24:0::2;::::0;;;;;;;;;;;-1:-1:-1;;;;;53537:34:0;::::2;-1:-1:-1::0;53537:34:0;;;;;;;;;;::::2;;::::0;-1:-1:-1;53529:76:0::2;::::0;-1:-1:-1;53529:76:0::2;;::::0;;-1:-1:-1;;;53529:76:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;53624:16:::0;;53616:48:::2;;;::::0;;-1:-1:-1;;;53616:48:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;53616:48:0;;;;;;;;;;;;;::::2;;53737:4;53723:19:::0;::::2;53717:26:::0;-1:-1:-1;;;;;53763:18:0;::::2;53755:44;;;::::0;;-1:-1:-1;;;53755:44:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;53755:44:0;;;;;;;;;;;;;::::2;;53836:20;;:::i;:::-;53859:388;;;;;;;;53893:6;53859:388;;;;53926:12;53859:388;;;;53967:8;-1:-1:-1::0;;;;;53859:388:0::2;;;;;54005:9;-1:-1:-1::0;;;;;53859:388:0::2;;;;;54048:35;54069:13;54048:20;:35::i;:::-;53859:388;;;;54115:34;54136:12;:10;:12::i;54115:34::-;53859:388;;;;54181:11;53859:388;;;;54222:9;53859:388;;::::0;53836:411:::2;;54262:19;54284:24;54301:6;54284:16;:24::i;:::-;54262:46;;54337:16;54383:20;;;;;;;;;-1:-1:-1::0;;;;;54383:20:0::2;-1:-1:-1::0;;;;;54356:72:0::2;;:74;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;54356:74:0;54558:11:::2;::::0;54542:59:::2;::::0;-1:-1:-1;;;54542:59:0;;-1:-1:-1;;;;;54558:11:0;;::::2;54542:59;::::0;::::2;::::0;;;;;;;;;;54571:13:::2;54542:59:::0;;::::2;-1:-1:-1::0;;54558:11:0;54542:59;::::2;;54558:11;54542:59;::::0;;;::::2;;::::0;;;;;;54356:74;;-1:-1:-1;54356:74:0;;-1:-1:-1;;;;;54542:15:0;::::2;::::0;::::2;::::0;54558:11;54571:13;;54594:6;;54542:59;;;;;;;;;;;;;;54571:13;;54542:59;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;54542:59:0::2;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;54542:59:0;54534:119:::2;;;;-1:-1:-1::0;;;54534:119:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41244:1;;;;54690:108;54700:13;54715:12;:10;:12::i;:::-;54729:11;::::0;-1:-1:-1;;;;;54729:11:0::2;54742:32;54729:11;54742:20;:32::i;:::-;54776:13;54791:6;54690:108;;;;-1:-1:-1::0;;;;;54690:108:0::2;;;;;;-1:-1:-1::0;;;;;54690:108:0::2;;;;;;-1:-1:-1::0;;;;;54690:108:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;54690:108:0;;::::2;::::0;;;;::::2;-1:-1:-1::0;;54690:108:0::2;;::::0;::::2;;;::::0;;;::::2;;::::0;;;::::2;::::0;;::::2;::::0;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54814:100;54824:13;54839:12;:10;:12::i;:::-;54853:8;54863:9;54874:11;54887:9;54898:6;54906:3;54911:2;54814:100;;;;-1:-1:-1::0;;;;;54814:100:0::2;;;;;;-1:-1:-1::0;;;;;54814:100:0::2;;;;;;-1:-1:-1::0;;;;;54814:100:0::2;;;;;;-1:-1:-1::0;;;;;54814:100:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;54814:100:0;;::::2;::::0;;;;;;;;::::2;::::0;;::::2;::::0;;::::2;::::0;;;;::::2;;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54942:4;54935:11;;;45251::::0;:18;;-1:-1:-1;;;;45251:18:0;-1:-1:-1;;;45251:18:0;;;52862:2092;;-1:-1:-1;;;;;;;;;52862:2092:0:o;59140:510::-;59207:7;-1:-1:-1;;;;;59231:27:0;;59227:416;;-1:-1:-1;59457:4:0;59484:16;59477:23;;59227:416;59596:35;;;-1:-1:-1;;;59596:35:0;;59625:4;59596:35;;;;;;59560:13;;-1:-1:-1;;;;;59596:20:0;;;;;:35;;;;;;;;;;;;;;;:20;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59596:35:0;;-1:-1:-1;59589:42:0;;-1:-1:-1;59589:42:0;59227:416;59140:510;;;:::o;51413:82::-;42559:9;:7;:9::i;:::-;42551:54;;;;;-1:-1:-1;;;42551:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;42551:54:0;;;;;;;;;;;;;;;51475:4:::1;:12:::0;;-1:-1:-1;;;;;;51475:12:0::1;-1:-1:-1::0;;;;;51475:12:0;;;::::1;::::0;;;::::1;::::0;;51413:82::o;40968:78::-;41007:4;41031:7;-1:-1:-1;;;41031:7:0;;;;;40968:78::o;48905:26::-;;;;;;;;;;;;;;;-1:-1:-1;;48905:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50845:170::-;42559:9;:7;:9::i;:::-;42551:54;;;;;-1:-1:-1;;;42551:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;42551:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;50925:24:0;::::1;50917:50;;;::::0;;-1:-1:-1;;;50917:50:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;50917:50:0;;;;;;;;;;;;;::::1;;50978:16;:29:::0;;-1:-1:-1;;;;;;50978:29:0::1;-1:-1:-1::0;;;;;50978:29:0;;;::::1;::::0;;;::::1;::::0;;50845:170::o;43158:140::-;42559:9;:7;:9::i;:::-;42551:54;;;;;-1:-1:-1;;;42551:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;42551:54:0;;;;;;;;;;;;;;;43257:1:::1;43241:6:::0;;43220:40:::1;::::0;-1:-1:-1;;;;;43241:6:0;;::::1;::::0;43220:40:::1;::::0;43257:1;;43220:40:::1;43288:1;43271:19:::0;;-1:-1:-1;;;;;;43271:19:0::1;::::0;;43158:140::o;57016:2112::-;57252:4;44946:11;;-1:-1:-1;;;44946:11:0;;;;44938:55;;;;;-1:-1:-1;;;44938:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45085:5;45071:19;;-1:-1:-1;;;;45071:19:0;;;;;-1:-1:-1;;;41205:7:0;::::1;45071:19:::0;41205:7:::1;41204:8;41196:37;;;::::0;;-1:-1:-1;;;41196:37:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41196:37:0;;;;;;;;;;;;;::::1;;57269:28:::2;57275:13;57290:6;57269:5;:28::i;:::-;57323:40;57336:13;57351:6;57359:3;57323:12;:40::i;:::-;57314:49;;57384:28;57390:13;57405:6;57384:5;:28::i;:::-;-1:-1:-1::0;;;;;57453:25:0;::::2;::::0;:48:::2;;57488:13;57453:48;;;57481:4;::::0;-1:-1:-1;;;;;57481:4:0::2;57453:48;-1:-1:-1::0;;;;;57522:22:0;::::2;57556:1;57522:22:::0;;;:12:::2;:22;::::0;;;;;57437:64;;-1:-1:-1;;;;;;57522:22:0::2;57514:72;;;::::0;;-1:-1:-1;;;57514:72:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;57514:72:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;57605:22:0;::::2;;::::0;;;:12:::2;:22;::::0;;;;;-1:-1:-1;;;;;57605:39:0;;::::2;:22:::0;::::2;:39;57597:83;;;::::0;;-1:-1:-1;;;57597:83:0;;::::2;;::::0;::::2;::::0;;;;;;;::::2;::::0;;;;;;;;;;;;;::::2;;57699:11;57711;57699:24;;;;;;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;57699:24:0;;;;::::2;::::0;;::::2;::::0;::::2;;;;::::0;;;::::2;::::0;;::::2;;;-1:-1:-1::0;;57699:24:0;;::::2;::::0;;::::2;::::0;::::2;;::::0;;;::::2;::::0;;;-1:-1:-1;57699:24:0::2;::::0;;;;;;;;;;;-1:-1:-1;;;;;57699:34:0;::::2;-1:-1:-1::0;57699:34:0;;;;;;;;;;::::2;;::::0;-1:-1:-1;57691:76:0::2;::::0;-1:-1:-1;57691:76:0::2;;::::0;;-1:-1:-1;;;57691:76:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;57786:16:::0;;57778:48:::2;;;::::0;;-1:-1:-1;;;57778:48:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;57778:48:0;;;;;;;;;;;;;::::2;;57899:4;57885:19:::0;::::2;57879:26:::0;-1:-1:-1;;;;;57925:18:0;::::2;57917:44;;;::::0;;-1:-1:-1;;;57917:44:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;57917:44:0;;;;;;;;;;;;;::::2;;57997:20;;:::i;:::-;58020:388;;;;;;;;58054:6;58020:388;;;;58087:12;58020:388;;;;58128:8;-1:-1:-1::0;;;;;58020:388:0::2;;;;;58166:9;-1:-1:-1::0;;;;;58020:388:0::2;;;;;58209:35;58230:13;58209:20;:35::i;:::-;58020:388;;;;58276:34;58297:12;:10;:12::i;58276:34::-;58020:388;;;;58342:11;58020:388;;;;58383:9;58020:388;;::::0;57997:411:::2;;58423:19;58445:24;58462:6;58445:16;:24::i;:::-;58423:46;;58498:16;58544:20;;;;;;;;;-1:-1:-1::0;;;;;58544:20:0::2;-1:-1:-1::0;;;;;58517:72:0::2;;:74;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;58517:74:0;58719:11:::2;::::0;58703:61:::2;::::0;-1:-1:-1;;;58703:61:0;;-1:-1:-1;;;;;58719:11:0;;::::2;58703:61;::::0;::::2;::::0;;;;;;;;;;58732:13:::2;58703:61:::0;;::::2;-1:-1:-1::0;;58719:11:0;58703:61;::::2;;58719:11;58703:61;::::0;;;::::2;;::::0;;;;;;58517:74;;-1:-1:-1;58517:74:0;;-1:-1:-1;;;;;58703:15:0;::::2;::::0;::::2;::::0;58719:11;58732:13;;58757:6;;58703:61;;;;;;;;;;;;;;58732:13;;58703:61;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;58703:61:0::2;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;58703:61:0;58695:121:::2;;;;-1:-1:-1::0;;;58695:121:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41244:1;;;;58853:108;58863:13;58878:12;:10;:12::i;:::-;58892:11;::::0;-1:-1:-1;;;;;58892:11:0::2;58905:32;58892:11;58905:20;:32::i;:::-;58939:13;58954:6;58853:108;;;;-1:-1:-1::0;;;;;58853:108:0::2;;;;;;-1:-1:-1::0;;;;;58853:108:0::2;;;;;;-1:-1:-1::0;;;;;58853:108:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;58853:108:0;;::::2;::::0;;;;::::2;-1:-1:-1::0;;58853:108:0::2;;::::0;::::2;;;::::0;;;::::2;;::::0;;;::::2;::::0;;::::2;::::0;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58977:111;58998:13;59013:12;:10;:12::i;48938:25::-:0;;;-1:-1:-1;;;;;48938:25:0;;:::o;50521:63::-;42559:9;:7;:9::i;:::-;42551:54;;;;;-1:-1:-1;;;42551:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;42551:54:0;;;;;;;;;;;;;;;50568:8:::1;:6;:8::i;49003:60::-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49003:60:0;;;;;;;;;;:::o;42347:79::-;42385:7;42412:6;-1:-1:-1;;;;;42412:6:0;42347:79;:::o;42713:94::-;42753:4;42793:6;;-1:-1:-1;;;;;42793:6:0;42777:12;:10;:12::i;:::-;-1:-1:-1;;;;;42777:22:0;;42770:29;;42713:94;:::o;51507:183::-;51602:4;42559:9;:7;:9::i;:::-;42551:54;;;;;-1:-1:-1;;;42551:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;42551:54:0;;;;;;;;;;;;;;;51656:4:::1;51619:11;51631:13;51619:26;;;;;;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;51619:26:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;::::0;;;::::1;::::0;;::::1;;;-1:-1:-1::0;;51619:26:0;;::::1;::::0;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;;-1:-1:-1;51619:26:0::1;::::0;;;;;;;;;;;-1:-1:-1;;;;;51619:34:0;;;::::1;-1:-1:-1::0;51619:34:0;;;;;;-1:-1:-1;;51619:34:0;;;:41;;-1:-1:-1;;51619:41:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;-1:-1:-1;;;51507:183:0;-1:-1:-1;51507:183:0:o;48970:21::-;;;;;;-1:-1:-1;;;;;48970:21:0;;:::o;52331:175::-;52420:4;42559:9;:7;:9::i;:::-;42551:54;;;;;-1:-1:-1;;;42551:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;42551:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;;52437:20:0;::::1;;::::0;;;:12:::1;:20;::::0;;;;:39;;-1:-1:-1;;;;;52437:39:0;::::1;-1:-1:-1::0;;;;;;52437:39:0;;::::1;;::::0;;;52331:175;;;;:::o;50671:166::-;42559:9;:7;:9::i;:::-;42551:54;;;;;-1:-1:-1;;;42551:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;42551:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;50753:23:0;::::1;50745:49;;;::::0;;-1:-1:-1;;;50745:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;50745:49:0;;;;;;;;;;;;;::::1;;50805:12;:24:::0;;-1:-1:-1;;;;;;50805:24:0::1;-1:-1:-1::0;;;;;50805:24:0;;;::::1;::::0;;;::::1;::::0;;50671:166::o;48765:19::-;;;-1:-1:-1;;;;;48765:19:0;;:::o;49070:46::-;;;;;;;;;;;;-1:-1:-1;;;;;49070:46:0;;:::o;51027:124::-;42559:9;:7;:9::i;:::-;42551:54;;;;;-1:-1:-1;;;42551:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;42551:54:0;;;;;;;;;;;;;;;51105:20:::1;:38:::0;;-1:-1:-1;;;;;;51105:38:0::1;-1:-1:-1::0;;;;;51105:38:0;;;::::1;::::0;;;::::1;::::0;;51027:124::o;48791:27::-;;;-1:-1:-1;;;;;48791:27:0;;:::o;48863:35::-;;;-1:-1:-1;;;;;48863:35:0;;:::o;51702:258::-;42559:9;:7;:9::i;:::-;42551:54;;;;;-1:-1:-1;;;42551:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;42551:54:0;;;;;;;;;;;;;;;51858:4:::1;51828:11;51840:6;51828:19;;;;;;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;51828:19:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;::::0;;;::::1;::::0;;::::1;;;-1:-1:-1::0;;51828:19:0;;::::1;::::0;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;;-1:-1:-1;51828:19:0::1;::::0;;;;;;;;;;-1:-1:-1;;;;;51828:27:0;::::1;-1:-1:-1::0;51828:27:0;;;;;;;:34;;-1:-1:-1;;51828:34:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;-1:-1:-1;;51873:19:0;;-1:-1:-1;;51873:11:0::1;::::0;:19;;51828;;;;51873;;::::1;::::0;;51828;51873;::::1;;;;;;::::0;;;;-1:-1:-1;;51873:19:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;::::0;;;::::1;::::0;;::::1;;;-1:-1:-1::0;;51873:19:0;;::::1;::::0;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;;-1:-1:-1;51873:19:0::1;::::0;;;;;;;;;;-1:-1:-1;;;;;51873:27:0;::::1;-1:-1:-1::0;51873:27:0;;;;;;;:34;;-1:-1:-1;;51873:34:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;-1:-1:-1;;51918:19:0;;-1:-1:-1;;51918:11:0::1;::::0;:19;;51873;;;;51918;;::::1;::::0;;51873;51918;::::1;;;;;;::::0;;;;-1:-1:-1;;51918:19:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;::::0;;;::::1;::::0;;::::1;;;-1:-1:-1::0;;51918:19:0;;::::1;::::0;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;;-1:-1:-1;51918:19:0::1;::::0;;;;;;;;;;;-1:-1:-1;;;;;51918:27:0;;;::::1;-1:-1:-1::0;51918:27:0;;;;;;-1:-1:-1;;51918:27:0;;;:34;;-1:-1:-1;;51918:34:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;;;51702:258:0:o;43453:110::-;42559:9;:7;:9::i;:::-;42551:54;;;;;-1:-1:-1;;;42551:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;42551:54:0;;;;;;;;;;;;;;;43527:28:::1;43546:8;43527:18;:28::i;51294:107::-:0;42559:9;:7;:9::i;:::-;42551:54;;;;;-1:-1:-1;;;42551:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;42551:54:0;;;;;;;;;;;;;;;51367:11:::1;:26:::0;;-1:-1:-1;;51367:26:0::1;-1:-1:-1::0;;;;;51367:26:0;;;::::1;::::0;;;::::1;::::0;;51294:107::o;36688:176::-;36797:58;;;-1:-1:-1;;;;;36797:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36797:58:0;-1:-1:-1;;;36797:58:0;;;36771:85;;36790:5;;36771:18;:85::i;:::-;36688:176;;;:::o;41729:112::-;41404:7;;-1:-1:-1;;;41404:7:0;;;;41396:40;;;;;-1:-1:-1;;;41396:40:0;;;;;;;;;;;;-1:-1:-1;;;41396:40:0;;;;;;;;;;;;;;;41790:5:::1;41780:15:::0;;-1:-1:-1;;;;41780:15:0::1;::::0;;41811:22:::1;41820:12;:10;:12::i;:::-;41811:22;::::0;;-1:-1:-1;;;;;41811:22:0;;::::1;::::0;;;;;;;::::1;::::0;;::::1;41729:112::o:0;59681:282::-;-1:-1:-1;;;;;59752:23:0;;59748:208;;59813:6;59800:9;:19;59792:50;;;;;-1:-1:-1;;;59792:50:0;;;;;;;;;;;;-1:-1:-1;;;59792:50:0;;;;;;;;;;;;;;;59748:208;;;59875:69;-1:-1:-1;;;;;59875:34:0;;59910:10;59930:4;59937:6;59875:34;:69::i;60013:422::-;60100:4;-1:-1:-1;;;;;60121:23:0;;60117:311;;60182:6;60169:9;:19;60161:50;;;;;-1:-1:-1;;;60161:50:0;;;;;;;;;;;;-1:-1:-1;;;60161:50:0;;;;;;;;;;;;;;;60243:3;60234:6;:12;60226:45;;;;;-1:-1:-1;;;60226:45:0;;;;;;;;;;;;-1:-1:-1;;;60226:45:0;;;;;;;;;;;;;;;60293:15;:6;60304:3;60293:10;:15::i;:::-;60286:22;;;;60117:311;60362:3;60349:9;:16;60341:47;;;;;-1:-1:-1;;;60341:47:0;;;;;;;;;;;;-1:-1:-1;;;60341:47:0;;;;;;;;;;;;;;;-1:-1:-1;60410:6:0;60117:311;60013:422;;;;;:::o;60504:420::-;-1:-1:-1;;;;;60575:23:0;;60571:346;;60725:4;;;;;;;;;-1:-1:-1;;;;;60725:4:0;-1:-1:-1;;;;;60719:19:0;;60746:6;60719:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60776:4:0;;60791:16;;60770:46;;;-1:-1:-1;;;60770:46:0;;-1:-1:-1;;;;;60791:16:0;;;60770:46;;;;;;;;;;;;60776:4;;;;;-1:-1:-1;60770:20:0;;-1:-1:-1;60770:46:0;;;;;-1:-1:-1;60770:46:0;;;;;;;60776:4;;60770:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60571:346:0;;-1:-1:-1;60571:346:0;;60880:16;;60849:56;;-1:-1:-1;;;;;60849:30:0;;;;60880:16;60898:6;60849:30;:56::i;25777:690::-;26031:4;26025:11;;26163:4;26152:16;;25839:15;26300:14;;;;26293:4;26285:13;;26278:37;26436:13;;;26423:27;;26025:11;25875:585::o;40075:98::-;40155:10;40075:98;:::o;60936:641::-;61005:12;61030:17;61096:38;61122:4;:11;;;61096:25;:38::i;:::-;61149;61175:4;:11;;;61149:25;:38::i;:::-;61202:39;61227:4;:13;;;61202:24;:39::i;:::-;61256:40;61281:4;:14;;;61256:24;:40::i;:::-;61311:46;61338:4;:18;;;61311:26;:46::i;:::-;61372:44;61399:4;:16;;;61372:26;:44::i;:::-;61431;61458:4;:16;;;61431:26;:44::i;:::-;61490:42;61517:4;:14;;;61490:26;:42::i;:::-;61065:482;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61065:482:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61065:482:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61065:482:0;;;;;;;;;;;;;-1:-1:-1;;61065:482:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61065:482:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61065:482:0;;;;;;;;;;;;;-1:-1:-1;;61065:482:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61065:482:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61065:482:0;;;;;;;;;;;;;-1:-1:-1;;61065:482:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61065:482:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61065:482:0;;;;;;;;;;;;;-1:-1:-1;;61065:482:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61065:482:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61065:482:0;;;;;;;;;;;;;-1:-1:-1;;61065:482:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61065:482:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61065:482:0;;;;;;;;;;;;;-1:-1:-1;;61065:482:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61065:482:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61065:482:0;;;;;;;;;;;;;-1:-1:-1;;61065:482:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61058:489;;61565:4;61558:11;;;60936:641;;;:::o;41536:110::-;41205:7;;-1:-1:-1;;;41205:7:0;;;;41204:8;41196:37;;;;;-1:-1:-1;;;41196:37:0;;;;;;;;;;;;-1:-1:-1;;;41196:37:0;;;;;;;;;;;;;;;41588:7:::1;:14:::0;;-1:-1:-1;;;;41588:14:0::1;-1:-1:-1::0;;;41588:14:0::1;::::0;;41618:20:::1;41625:12;:10;:12::i;43669:229::-:0;-1:-1:-1;;;;;43743:22:0;;43735:73;;;;-1:-1:-1;;;43735:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43845:6;;;43824:38;;-1:-1:-1;;;;;43824:38:0;;;;43845:6;;;43824:38;;;43873:6;:17;;-1:-1:-1;;;;;;43873:17:0;-1:-1:-1;;;;;43873:17:0;;;;;;;;;;43669:229::o;38682:1119::-;39286:32;39311:5;39286:16;:32::i;:::-;39278:76;;;;;-1:-1:-1;;;39278:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39428:12;39442:23;39477:5;-1:-1:-1;;;;;39469:19:0;39489:4;39469:25;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39469:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39427:67;;;;39513:7;39505:52;;;;;-1:-1:-1;;;39505:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39574:17;;:21;39570:224;;39716:10;39705:30;;;;;;;;;;;;;;;-1:-1:-1;39705:30:0;39697:85;;;;-1:-1:-1;;;39697:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38682:1119;;;;:::o;36872:204::-;36999:68;;;-1:-1:-1;;;;;36999:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36999:68:0;-1:-1:-1;;;36999:68:0;;;36973:95;;36992:5;;36973:18;:95::i;736:136::-;794:7;821:43;825:1;828;821:43;;;;;;;;;;;;;;;;;:3;:43::i;8959:747::-;9015:12;-1:-1:-1;;;;;9048:1:0;:71;;9040:111;;;;;-1:-1:-1;;;9040:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9229:4;9223:11;9263:4;9281:21;;;9353:4;9389;9316:307;9420:7;9412:6;9409:19;9316:307;;;9605:1;9597:6;9592:15;9583:6;9576:4;9570;9566:15;9562:28;9554:54;9470:4;9458:17;;;;;-1:-1:-1;;9503:17:0;9316:307;;;-1:-1:-1;;;9660:4:0;9650:15;;;9637:29;;9650:15;8959:747;-1:-1:-1;;8959:747:0:o;8165:622::-;8310:4;8304:11;8344:4;8362:21;;;8218:12;;8304:11;8434:4;8470;8397:307;8501:7;8493:6;8490:19;8397:307;;;8686:1;8678:6;8673:15;8664:6;8657:4;8651;8647:15;8643:28;8635:54;8551:4;8539:17;;;;;-1:-1:-1;;8584:17:0;8397:307;;;-1:-1:-1;;;8741:4:0;8731:15;;8725:4;8718:29;8731:15;8165:622;-1:-1:-1;;8165:622:0:o;9874:185::-;9982:11;;9939:12;;10029:15;9982:11;10029:12;:15::i;:::-;10046:4;10012:39;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10012:39:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10012:39:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10012:39:0;;;;;;;;;;;;;-1:-1:-1;;10012:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10005:46;;;9874:185;;;:::o;35813:810::-;35873:4;36532:20;;36375:66;36572:15;;;;;:42;;;36603:11;36591:8;:23;;36572:42;36564:51;35813:810;-1:-1:-1;;;;35813:810:0:o;1209:192::-;1295:7;1331:12;1323:6;;;;1315:29;;;;-1:-1:-1;;;1315:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1367:5:0;;;1209:192::o;10067:453::-;10122:12;10155:4;10151:1;-1:-1:-1;;;;;10151:8:0;;10147:366;;;10176:20;10193:1;10176:10;:20::i;:::-;10169:27;;;;10147:366;10220:6;10215:1;-1:-1:-1;;;;;10215:11:0;;10211:302;;10261:15;-1:-1:-1;;;10261:9:0;:15::i;:::-;10278:22;10297:1;10278:11;:22::i;:::-;10244:57;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10244:57:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10244:57:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10244:57:0;;;;;;;;;;;;;-1:-1:-1;;10244:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10237:64;;;;10211:302;10325:10;10320:1;-1:-1:-1;;;;;10320:15:0;;10316:197;;10376:15;-1:-1:-1;;;10376:9:0;:15::i;:::-;10393:22;10412:1;10393:11;:22::i;10316:197::-;10464:15;-1:-1:-1;;;;;;10464:9:0;:15::i;:::-;10481:22;10500:1;10481:11;:22::i;6068:364::-;6210:4;6204:11;;6242:1;6229:15;;6286:3;6282:11;;;;6275:4;6265:15;;6258:36;6386:4;6376:15;;6363:29;;6204:11;6068:364::o;5798:110::-;5848:12;5880:20;5897:1;5891:8;;5880:10;:20::i;:::-;5873:27;5798:110;-1:-1:-1;;5798:110:0:o;6594:623::-;6740:4;6734:11;6774:4;6792:21;;;6648:12;;6734:11;6864:4;6900;6827:307;6931:7;6923:6;6920:19;6827:307;;;7116:1;7108:6;7103:15;7094:6;7087:4;7081;7077:15;7073:28;7065:54;6981:4;6969:17;;;;;-1:-1:-1;;7014:17:0;6827:307;;;-1:-1:-1;;;7171:4:0;7161:15;;7155:4;7148:29;7161:15;6594:623;-1:-1:-1;;6594:623:0:o;7383:620::-;7526:4;7520:11;7560:4;7578:21;;;7436:12;;7520:11;7650:4;7686;7613:307;7717:7;7709:6;7706:19;7613:307;;;7902:1;7894:6;7889:15;7880:6;7873:4;7867;7863:15;7859:28;7851:54;7767:4;7755:17;;;;;-1:-1:-1;;7800:17:0;7613:307;;;-1:-1:-1;;;7957:4:0;7947:15;;7941:4;7934:29;7947:15;7383:620;-1:-1:-1;;7383:620:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;
Swarm Source
ipfs://cb056f3cd929a5e622dd12481320fc08059c066eefeba2833d3b93636dc6be7b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $3,398.84 | 0.00020214 | $0.687042 |
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.