Contract 0x75df5dc2769770789e6a053fe2e14454e36f9e85 2
Contract Overview
Balance:
0 ETH
ETH Value:
$0.00
My Name Tag:
Not Available
Txn Hash | Method |
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0x5da30594227588d93c24742f1adaf07f3a9387dee36e694e497e3a1e44412a18 | 0x60806040 | 3265763 | 856 days 3 hrs ago | 0xdb13888fc7aa45d8c828325becd7c4b5c6e98779 | IN | Create: CrossDelegateV2 | 0 ETH | 0.133764719109 ETH |
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
CrossDelegateV2
Compiler Version
v0.4.26+commit.4563c3fc
Contract Source Code (Solidity)
/** *Submitted for verification at Arbiscan.io on 2021-11-24 */ // File: contracts/components/Proxy.sol /* Copyright 2019 Wanchain Foundation. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // _ _ _ // __ ____ _ _ __ ___| |__ __ _(_)_ __ __| | _____ __ // \ \ /\ / / _` | '_ \ / __| '_ \ / _` | | '_ \@/ _` |/ _ \ \ / / // \ V V / (_| | | | | (__| | | | (_| | | | | | (_| | __/\ V / // \_/\_/ \__,_|_| |_|\___|_| |_|\__,_|_|_| |_|\__,_|\___| \_/ // // pragma solidity ^0.4.24; /** * Math operations with safety checks */ contract Proxy { event Upgraded(address indexed implementation); address internal _implementation; function implementation() public view returns (address) { return _implementation; } function () external payable { address _impl = _implementation; require(_impl != address(0), "implementation contract not set"); assembly { let ptr := mload(0x40) calldatacopy(ptr, 0, calldatasize) let result := delegatecall(gas, _impl, ptr, calldatasize, 0, 0) let size := returndatasize returndatacopy(ptr, 0, size) switch result case 0 { revert(ptr, size) } default { return(ptr, size) } } } } // File: contracts/components/Owned.sol /* Copyright 2019 Wanchain Foundation. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // _ _ _ // __ ____ _ _ __ ___| |__ __ _(_)_ __ __| | _____ __ // \ \ /\ / / _` | '_ \ / __| '_ \ / _` | | '_ \@/ _` |/ _ \ \ / / // \ V V / (_| | | | | (__| | | | (_| | | | | | (_| | __/\ V / // \_/\_/ \__,_|_| |_|\___|_| |_|\__,_|_|_| |_|\__,_|\___| \_/ // // pragma solidity ^0.4.24; /// @dev `Owned` is a base level contract that assigns an `owner` that can be /// later changed contract Owned { event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /// @dev `owner` is the only address that can call a function with this /// modifier modifier onlyOwner() { require(msg.sender == owner, "Not owner"); _; } address public owner; /// @notice The Constructor assigns the message sender to be `owner` constructor() public { owner = msg.sender; } address public newOwner; function transferOwner(address _newOwner) public onlyOwner { require(_newOwner != address(0), "New owner is the zero address"); emit OwnershipTransferred(owner, _newOwner); owner = _newOwner; } /// @notice `owner` can step down and assign some other address to this role /// @param _newOwner The address of the new owner. 0x0 can be used to create /// an unowned neutral vault, however that cannot be undone function changeOwner(address _newOwner) public onlyOwner { newOwner = _newOwner; } function acceptOwnership() public { if (msg.sender == newOwner) { owner = newOwner; } } function renounceOwnership() public onlyOwner { owner = address(0); } } // File: contracts/components/Halt.sol /* Copyright 2019 Wanchain Foundation. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // _ _ _ // __ ____ _ _ __ ___| |__ __ _(_)_ __ __| | _____ __ // \ \ /\ / / _` | '_ \ / __| '_ \ / _` | | '_ \@/ _` |/ _ \ \ / / // \ V V / (_| | | | | (__| | | | (_| | | | | | (_| | __/\ V / // \_/\_/ \__,_|_| |_|\___|_| |_|\__,_|_|_| |_|\__,_|\___| \_/ // // pragma solidity ^0.4.24; contract Halt is Owned { bool public halted = false; modifier notHalted() { require(!halted, "Smart contract is halted"); _; } modifier isHalted() { require(halted, "Smart contract is not halted"); _; } /// @notice function Emergency situation that requires /// @notice contribution period to stop or not. function setHalt(bool halt) public onlyOwner { halted = halt; } } // File: contracts/components/ReentrancyGuard.sol pragma solidity 0.4.26; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ 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; } } // File: contracts/lib/BasicStorageLib.sol pragma solidity ^0.4.24; library BasicStorageLib { struct UintData { mapping(bytes => mapping(bytes => uint)) _storage; } struct BoolData { mapping(bytes => mapping(bytes => bool)) _storage; } struct AddressData { mapping(bytes => mapping(bytes => address)) _storage; } struct BytesData { mapping(bytes => mapping(bytes => bytes)) _storage; } struct StringData { mapping(bytes => mapping(bytes => string)) _storage; } /* uintStorage */ function setStorage(UintData storage self, bytes memory key, bytes memory innerKey, uint value) internal { self._storage[key][innerKey] = value; } function getStorage(UintData storage self, bytes memory key, bytes memory innerKey) internal view returns (uint) { return self._storage[key][innerKey]; } function delStorage(UintData storage self, bytes memory key, bytes memory innerKey) internal { delete self._storage[key][innerKey]; } /* boolStorage */ function setStorage(BoolData storage self, bytes memory key, bytes memory innerKey, bool value) internal { self._storage[key][innerKey] = value; } function getStorage(BoolData storage self, bytes memory key, bytes memory innerKey) internal view returns (bool) { return self._storage[key][innerKey]; } function delStorage(BoolData storage self, bytes memory key, bytes memory innerKey) internal { delete self._storage[key][innerKey]; } /* addressStorage */ function setStorage(AddressData storage self, bytes memory key, bytes memory innerKey, address value) internal { self._storage[key][innerKey] = value; } function getStorage(AddressData storage self, bytes memory key, bytes memory innerKey) internal view returns (address) { return self._storage[key][innerKey]; } function delStorage(AddressData storage self, bytes memory key, bytes memory innerKey) internal { delete self._storage[key][innerKey]; } /* bytesStorage */ function setStorage(BytesData storage self, bytes memory key, bytes memory innerKey, bytes memory value) internal { self._storage[key][innerKey] = value; } function getStorage(BytesData storage self, bytes memory key, bytes memory innerKey) internal view returns (bytes memory) { return self._storage[key][innerKey]; } function delStorage(BytesData storage self, bytes memory key, bytes memory innerKey) internal { delete self._storage[key][innerKey]; } /* stringStorage */ function setStorage(StringData storage self, bytes memory key, bytes memory innerKey, string memory value) internal { self._storage[key][innerKey] = value; } function getStorage(StringData storage self, bytes memory key, bytes memory innerKey) internal view returns (string memory) { return self._storage[key][innerKey]; } function delStorage(StringData storage self, bytes memory key, bytes memory innerKey) internal { delete self._storage[key][innerKey]; } } // File: contracts/components/BasicStorage.sol pragma solidity ^0.4.24; contract BasicStorage { /************************************************************ ** ** VARIABLES ** ************************************************************/ //// basic variables using BasicStorageLib for BasicStorageLib.UintData; using BasicStorageLib for BasicStorageLib.BoolData; using BasicStorageLib for BasicStorageLib.AddressData; using BasicStorageLib for BasicStorageLib.BytesData; using BasicStorageLib for BasicStorageLib.StringData; BasicStorageLib.UintData internal uintData; BasicStorageLib.BoolData internal boolData; BasicStorageLib.AddressData internal addressData; BasicStorageLib.BytesData internal bytesData; BasicStorageLib.StringData internal stringData; } // File: contracts/interfaces/IRC20Protocol.sol /* Copyright 2019 Wanchain Foundation. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // _ _ _ // __ ____ _ _ __ ___| |__ __ _(_)_ __ __| | _____ __ // \ \ /\ / / _` | '_ \ / __| '_ \ / _` | | '_ \@/ _` |/ _ \ \ / / // \ V V / (_| | | | | (__| | | | (_| | | | | | (_| | __/\ V / // \_/\_/ \__,_|_| |_|\___|_| |_|\__,_|_|_| |_|\__,_|\___| \_/ // // pragma solidity ^0.4.26; interface IRC20Protocol { function transfer(address, uint) external returns (bool); function transferFrom(address, address, uint) external returns (bool); function balanceOf(address _owner) external view returns (uint); } // File: contracts/interfaces/IQuota.sol /* Copyright 2019 Wanchain Foundation. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // _ _ _ // __ ____ _ _ __ ___| |__ __ _(_)_ __ __| | _____ __ // \ \ /\ / / _` | '_ \ / __| '_ \ / _` | | '_ \@/ _` |/ _ \ \ / / // \ V V / (_| | | | | (__| | | | (_| | | | | | (_| | __/\ V / // \_/\_/ \__,_|_| |_|\___|_| |_|\__,_|_|_| |_|\__,_|\___| \_/ // // pragma solidity 0.4.26; interface IQuota { function userLock(uint tokenId, bytes32 storemanGroupId, uint value) external; function userBurn(uint tokenId, bytes32 storemanGroupId, uint value) external; function smgRelease(uint tokenId, bytes32 storemanGroupId, uint value) external; function smgMint(uint tokenId, bytes32 storemanGroupId, uint value) external; function upgrade(bytes32 storemanGroupId) external; function transferAsset(bytes32 srcStoremanGroupId, bytes32 dstStoremanGroupId) external; function receiveDebt(bytes32 srcStoremanGroupId, bytes32 dstStoremanGroupId) external; function getUserMintQuota(uint tokenId, bytes32 storemanGroupId) external view returns (uint); function getSmgMintQuota(uint tokenId, bytes32 storemanGroupId) external view returns (uint); function getUserBurnQuota(uint tokenId, bytes32 storemanGroupId) external view returns (uint); function getSmgBurnQuota(uint tokenId, bytes32 storemanGroupId) external view returns (uint); function getAsset(uint tokenId, bytes32 storemanGroupId) external view returns (uint asset, uint asset_receivable, uint asset_payable); function getDebt(uint tokenId, bytes32 storemanGroupId) external view returns (uint debt, uint debt_receivable, uint debt_payable); function isDebtClean(bytes32 storemanGroupId) external view returns (bool); } // File: contracts/interfaces/IStoremanGroup.sol /* Copyright 2019 Wanchain Foundation. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // _ _ _ // __ ____ _ _ __ ___| |__ __ _(_)_ __ __| | _____ __ // \ \ /\ / / _` | '_ \ / __| '_ \ / _` | | '_ \@/ _` |/ _ \ \ / / // \ V V / (_| | | | | (__| | | | (_| | | | | | (_| | __/\ V / // \_/\_/ \__,_|_| |_|\___|_| |_|\__,_|_|_| |_|\__,_|\___| \_/ // // pragma solidity ^0.4.24; interface IStoremanGroup { function getSelectedSmNumber(bytes32 groupId) external view returns(uint number); function getStoremanGroupConfig(bytes32 id) external view returns(bytes32 groupId, uint8 status, uint deposit, uint chain1, uint chain2, uint curve1, uint curve2, bytes gpk1, bytes gpk2, uint startTime, uint endTime); function getDeposit(bytes32 id) external view returns(uint); function getStoremanGroupStatus(bytes32 id) external view returns(uint8 status, uint startTime, uint endTime); function setGpk(bytes32 groupId, bytes gpk1, bytes gpk2) external; function setInvalidSm(bytes32 groupId, uint[] indexs, uint8[] slashTypes) external returns(bool isContinue); function getThresholdByGrpId(bytes32 groupId) external view returns (uint); function getSelectedSmInfo(bytes32 groupId, uint index) external view returns(address wkAddr, bytes PK, bytes enodeId); function recordSmSlash(address wk) public; } // File: contracts/interfaces/ITokenManager.sol /* Copyright 2019 Wanchain Foundation. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // _ _ _ // __ ____ _ _ __ ___| |__ __ _(_)_ __ __| | _____ __ // \ \ /\ / / _` | '_ \ / __| '_ \ / _` | | '_ \@/ _` |/ _ \ \ / / // \ V V / (_| | | | | (__| | | | (_| | | | | | (_| | __/\ V / // \_/\_/ \__,_|_| |_|\___|_| |_|\__,_|_|_| |_|\__,_|\___| \_/ // // pragma solidity 0.4.26; interface ITokenManager { function getTokenPairInfo(uint id) external view returns (uint origChainID, bytes tokenOrigAccount, uint shadowChainID, bytes tokenShadowAccount); function getTokenPairInfoSlim(uint id) external view returns (uint origChainID, bytes tokenOrigAccount, uint shadowChainID); function getAncestorInfo(uint id) external view returns (bytes account, string name, string symbol, uint8 decimals, uint chainId); function mintToken(address tokenAddress, address to, uint value) external; function burnToken(address tokenAddress, address from, uint value) external; } // File: contracts/interfaces/ISignatureVerifier.sol /* Copyright 2019 Wanchain Foundation. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // _ _ _ // __ ____ _ _ __ ___| |__ __ _(_)_ __ __| | _____ __ // \ \ /\ / / _` | '_ \ / __| '_ \ / _` | | '_ \@/ _` |/ _ \ \ / / // \ V V / (_| | | | | (__| | | | (_| | | | | | (_| | __/\ V / // \_/\_/ \__,_|_| |_|\___|_| |_|\__,_|_|_| |_|\__,_|\___| \_/ // // pragma solidity 0.4.26; interface ISignatureVerifier { function verify( uint curveId, bytes32 signature, bytes32 groupKeyX, bytes32 groupKeyY, bytes32 randomPointX, bytes32 randomPointY, bytes32 message ) external returns (bool); } // File: contracts/lib/SafeMath.sol pragma solidity ^0.4.24; /** * Math operations with safety checks */ library SafeMath { /** * @dev Multiplies two numbers, reverts on 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-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath mul overflow"); return c; } /** * @dev Integer division of two numbers truncating the quotient, reverts on division by zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath div 0"); // Solidity only automatically asserts when dividing by 0 uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath sub b > a"); uint256 c = a - b; return c; } /** * @dev Adds two numbers, reverts on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath add overflow"); return c; } /** * @dev Divides two numbers and returns the remainder (unsigned integer modulo), * reverts when dividing by zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0, "SafeMath mod 0"); return a % b; } } // File: contracts/crossApproach/lib/HTLCTxLib.sol /* Copyright 2019 Wanchain Foundation. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // _ _ _ // __ ____ _ _ __ ___| |__ __ _(_)_ __ __| | _____ __ // \ \ /\ / / _` | '_ \ / __| '_ \ / _` | | '_ \@/ _` |/ _ \ \ / / // \ V V / (_| | | | | (__| | | | (_| | | | | | (_| | __/\ V / // \_/\_/ \__,_|_| |_|\___|_| |_|\__,_|_|_| |_|\__,_|\___| \_/ // // pragma solidity ^0.4.26; pragma experimental ABIEncoderV2; library HTLCTxLib { using SafeMath for uint; /** * * ENUMS * */ /// @notice tx info status /// @notice uninitialized,locked,redeemed,revoked enum TxStatus {None, Locked, Redeemed, Revoked, AssetLocked, DebtLocked} /** * * STRUCTURES * */ /// @notice struct of HTLC user mint lock parameters struct HTLCUserParams { bytes32 xHash; /// hash of HTLC random number bytes32 smgID; /// ID of storeman group which user has selected uint tokenPairID; /// token pair id on cross chain uint value; /// exchange token value uint lockFee; /// exchange token value uint lockedTime; /// HTLC lock time } /// @notice HTLC(Hashed TimeLock Contract) tx info struct BaseTx { bytes32 smgID; /// HTLC transaction storeman ID uint lockedTime; /// HTLC transaction locked time uint beginLockedTime; /// HTLC transaction begin locked time TxStatus status; /// HTLC transaction status } /// @notice user tx info struct UserTx { BaseTx baseTx; uint tokenPairID; uint value; uint fee; address userAccount; /// HTLC transaction sender address for the security check while user's revoke } /// @notice storeman tx info struct SmgTx { BaseTx baseTx; uint tokenPairID; uint value; address userAccount; /// HTLC transaction user address for the security check while user's redeem } /// @notice storeman debt tx info struct DebtTx { BaseTx baseTx; bytes32 srcSmgID; /// HTLC transaction sender(source storeman) ID } struct Data { /// @notice mapping of hash(x) to UserTx -- xHash->htlcUserTxData mapping(bytes32 => UserTx) mapHashXUserTxs; /// @notice mapping of hash(x) to SmgTx -- xHash->htlcSmgTxData mapping(bytes32 => SmgTx) mapHashXSmgTxs; /// @notice mapping of hash(x) to DebtTx -- xHash->htlcDebtTxData mapping(bytes32 => DebtTx) mapHashXDebtTxs; } /** * * MANIPULATIONS * */ /// @notice add user transaction info /// @param params parameters for user tx function addUserTx(Data storage self, HTLCUserParams memory params) public { UserTx memory userTx = self.mapHashXUserTxs[params.xHash]; // UserTx storage userTx = self.mapHashXUserTxs[params.xHash]; // require(params.value != 0, "Value is invalid"); require(userTx.baseTx.status == TxStatus.None, "User tx exists"); userTx.baseTx.smgID = params.smgID; userTx.baseTx.lockedTime = params.lockedTime; userTx.baseTx.beginLockedTime = now; userTx.baseTx.status = TxStatus.Locked; userTx.tokenPairID = params.tokenPairID; userTx.value = params.value; userTx.fee = params.lockFee; userTx.userAccount = msg.sender; self.mapHashXUserTxs[params.xHash] = userTx; } /// @notice refund coins from HTLC transaction, which is used for storeman redeem(outbound) /// @param x HTLC random number function redeemUserTx(Data storage self, bytes32 x) external returns(bytes32 xHash) { xHash = sha256(abi.encodePacked(x)); UserTx storage userTx = self.mapHashXUserTxs[xHash]; require(userTx.baseTx.status == TxStatus.Locked, "Status is not locked"); require(now < userTx.baseTx.beginLockedTime.add(userTx.baseTx.lockedTime), "Redeem timeout"); userTx.baseTx.status = TxStatus.Redeemed; return xHash; } /// @notice revoke user transaction /// @param xHash hash of HTLC random number function revokeUserTx(Data storage self, bytes32 xHash) external { UserTx storage userTx = self.mapHashXUserTxs[xHash]; require(userTx.baseTx.status == TxStatus.Locked, "Status is not locked"); require(now >= userTx.baseTx.beginLockedTime.add(userTx.baseTx.lockedTime), "Revoke is not permitted"); userTx.baseTx.status = TxStatus.Revoked; } /// @notice function for get user info /// @param xHash hash of HTLC random number /// @return smgID ID of storeman which user has selected /// @return tokenPairID token pair ID of cross chain /// @return value exchange value /// @return fee exchange fee /// @return userAccount HTLC transaction sender address for the security check while user's revoke function getUserTx(Data storage self, bytes32 xHash) external view returns (bytes32, uint, uint, uint, address) { UserTx storage userTx = self.mapHashXUserTxs[xHash]; return (userTx.baseTx.smgID, userTx.tokenPairID, userTx.value, userTx.fee, userTx.userAccount); } /// @notice add storeman transaction info /// @param xHash hash of HTLC random number /// @param smgID ID of the storeman which user has selected /// @param tokenPairID token pair ID of cross chain /// @param value HTLC transfer value of token /// @param userAccount user account address on the destination chain, which is used to redeem token function addSmgTx(Data storage self, bytes32 xHash, bytes32 smgID, uint tokenPairID, uint value, address userAccount, uint lockedTime) external { SmgTx memory smgTx = self.mapHashXSmgTxs[xHash]; // SmgTx storage smgTx = self.mapHashXSmgTxs[xHash]; require(value != 0, "Value is invalid"); require(smgTx.baseTx.status == TxStatus.None, "Smg tx exists"); smgTx.baseTx.smgID = smgID; smgTx.baseTx.status = TxStatus.Locked; smgTx.baseTx.lockedTime = lockedTime; smgTx.baseTx.beginLockedTime = now; smgTx.tokenPairID = tokenPairID; smgTx.value = value; smgTx.userAccount = userAccount; self.mapHashXSmgTxs[xHash] = smgTx; } /// @notice refund coins from HTLC transaction, which is used for users redeem(inbound) /// @param x HTLC random number function redeemSmgTx(Data storage self, bytes32 x) external returns(bytes32 xHash) { xHash = sha256(abi.encodePacked(x)); SmgTx storage smgTx = self.mapHashXSmgTxs[xHash]; require(smgTx.baseTx.status == TxStatus.Locked, "Status is not locked"); require(now < smgTx.baseTx.beginLockedTime.add(smgTx.baseTx.lockedTime), "Redeem timeout"); smgTx.baseTx.status = TxStatus.Redeemed; return xHash; } /// @notice revoke storeman transaction /// @param xHash hash of HTLC random number function revokeSmgTx(Data storage self, bytes32 xHash) external { SmgTx storage smgTx = self.mapHashXSmgTxs[xHash]; require(smgTx.baseTx.status == TxStatus.Locked, "Status is not locked"); require(now >= smgTx.baseTx.beginLockedTime.add(smgTx.baseTx.lockedTime), "Revoke is not permitted"); smgTx.baseTx.status = TxStatus.Revoked; } /// @notice function for get smg info /// @param xHash hash of HTLC random number /// @return smgID ID of storeman which user has selected /// @return tokenPairID token pair ID of cross chain /// @return value exchange value /// @return userAccount user account address for redeem function getSmgTx(Data storage self, bytes32 xHash) external view returns (bytes32, uint, uint, address) { SmgTx storage smgTx = self.mapHashXSmgTxs[xHash]; return (smgTx.baseTx.smgID, smgTx.tokenPairID, smgTx.value, smgTx.userAccount); } /// @notice add storeman transaction info /// @param xHash hash of HTLC random number /// @param srcSmgID ID of source storeman group /// @param destSmgID ID of the storeman which will take over of the debt of source storeman group /// @param lockedTime HTLC lock time /// @param status Status, should be 'Locked' for asset or 'DebtLocked' for debt function addDebtTx(Data storage self, bytes32 xHash, bytes32 srcSmgID, bytes32 destSmgID, uint lockedTime, TxStatus status) external { DebtTx memory debtTx = self.mapHashXDebtTxs[xHash]; // DebtTx storage debtTx = self.mapHashXDebtTxs[xHash]; require(debtTx.baseTx.status == TxStatus.None, "Debt tx exists"); debtTx.baseTx.smgID = destSmgID; debtTx.baseTx.status = status;//TxStatus.Locked; debtTx.baseTx.lockedTime = lockedTime; debtTx.baseTx.beginLockedTime = now; debtTx.srcSmgID = srcSmgID; self.mapHashXDebtTxs[xHash] = debtTx; } /// @notice refund coins from HTLC transaction /// @param x HTLC random number /// @param status Status, should be 'Locked' for asset or 'DebtLocked' for debt function redeemDebtTx(Data storage self, bytes32 x, TxStatus status) external returns(bytes32 xHash) { xHash = sha256(abi.encodePacked(x)); DebtTx storage debtTx = self.mapHashXDebtTxs[xHash]; // require(debtTx.baseTx.status == TxStatus.Locked, "Status is not locked"); require(debtTx.baseTx.status == status, "Status is not locked"); require(now < debtTx.baseTx.beginLockedTime.add(debtTx.baseTx.lockedTime), "Redeem timeout"); debtTx.baseTx.status = TxStatus.Redeemed; return xHash; } /// @notice revoke debt transaction, which is used for source storeman group /// @param xHash hash of HTLC random number /// @param status Status, should be 'Locked' for asset or 'DebtLocked' for debt function revokeDebtTx(Data storage self, bytes32 xHash, TxStatus status) external { DebtTx storage debtTx = self.mapHashXDebtTxs[xHash]; // require(debtTx.baseTx.status == TxStatus.Locked, "Status is not locked"); require(debtTx.baseTx.status == status, "Status is not locked"); require(now >= debtTx.baseTx.beginLockedTime.add(debtTx.baseTx.lockedTime), "Revoke is not permitted"); debtTx.baseTx.status = TxStatus.Revoked; } /// @notice function for get debt info /// @param xHash hash of HTLC random number /// @return srcSmgID ID of source storeman /// @return destSmgID ID of destination storeman function getDebtTx(Data storage self, bytes32 xHash) external view returns (bytes32, bytes32) { DebtTx storage debtTx = self.mapHashXDebtTxs[xHash]; return (debtTx.srcSmgID, debtTx.baseTx.smgID); } function getLeftTime(uint endTime) private view returns (uint) { if (now < endTime) { return endTime.sub(now); } return 0; } /// @notice function for get debt info /// @param xHash hash of HTLC random number /// @return leftTime the left lock time function getLeftLockedTime(Data storage self, bytes32 xHash) external view returns (uint) { UserTx storage userTx = self.mapHashXUserTxs[xHash]; if (userTx.baseTx.status != TxStatus.None) { return getLeftTime(userTx.baseTx.beginLockedTime.add(userTx.baseTx.lockedTime)); } SmgTx storage smgTx = self.mapHashXSmgTxs[xHash]; if (smgTx.baseTx.status != TxStatus.None) { return getLeftTime(smgTx.baseTx.beginLockedTime.add(smgTx.baseTx.lockedTime)); } DebtTx storage debtTx = self.mapHashXDebtTxs[xHash]; if (debtTx.baseTx.status != TxStatus.None) { return getLeftTime(debtTx.baseTx.beginLockedTime.add(debtTx.baseTx.lockedTime)); } require(false, 'invalid xHash'); } } // File: contracts/crossApproach/lib/RapidityTxLib.sol /* Copyright 2019 Wanchain Foundation. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // _ _ _ // __ ____ _ _ __ ___| |__ __ _(_)_ __ __| | _____ __ // \ \ /\ / / _` | '_ \ / __| '_ \ / _` | | '_ \@/ _` |/ _ \ \ / / // \ V V / (_| | | | | (__| | | | (_| | | | | | (_| | __/\ V / // \_/\_/ \__,_|_| |_|\___|_| |_|\__,_|_|_| |_|\__,_|\___| \_/ // // pragma solidity ^0.4.26; library RapidityTxLib { /** * * ENUMS * */ /// @notice tx info status /// @notice uninitialized,Redeemed enum TxStatus {None, Redeemed} /** * * STRUCTURES * */ struct Data { /// @notice mapping of uniqueID to TxStatus -- uniqueID->TxStatus mapping(bytes32 => TxStatus) mapTxStatus; } /** * * MANIPULATIONS * */ /// @notice add user transaction info /// @param uniqueID Rapidity random number function addRapidityTx(Data storage self, bytes32 uniqueID) internal { TxStatus status = self.mapTxStatus[uniqueID]; require(status == TxStatus.None, "Rapidity tx exists"); self.mapTxStatus[uniqueID] = TxStatus.Redeemed; } } // File: contracts/crossApproach/lib/CrossTypesV1.sol /* Copyright 2019 Wanchain Foundation. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // _ _ _ // __ ____ _ _ __ ___| |__ __ _(_)_ __ __| | _____ __ // \ \ /\ / / _` | '_ \ / __| '_ \ / _` | | '_ \@/ _` |/ _ \ \ / / // \ V V / (_| | | | | (__| | | | (_| | | | | | (_| | __/\ V / // \_/\_/ \__,_|_| |_|\___|_| |_|\__,_|_|_| |_|\__,_|\___| \_/ // // pragma solidity ^0.4.26; library CrossTypesV1 { using SafeMath for uint; /** * * STRUCTURES * */ struct Data { /// map of the htlc transaction info HTLCTxLib.Data htlcTxData; /// map of the rapidity transaction info RapidityTxLib.Data rapidityTxData; /// quota data of storeman group IQuota quota; /// token manager instance interface ITokenManager tokenManager; /// storemanGroup admin instance interface IStoremanGroup smgAdminProxy; /// storemanGroup fee admin instance address address smgFeeProxy; ISignatureVerifier sigVerifier; /// @notice transaction fee, smgID => fee mapping(bytes32 => uint) mapStoremanFee; /// @notice transaction fee, origChainID => shadowChainID => fee mapping(uint => mapping(uint =>uint)) mapContractFee; /// @notice transaction fee, origChainID => shadowChainID => fee mapping(uint => mapping(uint =>uint)) mapAgentFee; } /** * * MANIPULATIONS * */ // /// @notice convert bytes32 to address // /// @param b bytes32 // function bytes32ToAddress(bytes32 b) internal pure returns (address) { // return address(uint160(bytes20(b))); // high // // return address(uint160(uint256(b))); // low // } /// @notice convert bytes to address /// @param b bytes function bytesToAddress(bytes b) internal pure returns (address addr) { assembly { addr := mload(add(b,20)) } } function transfer(address tokenScAddr, address to, uint value) internal returns(bool) { uint beforeBalance; uint afterBalance; beforeBalance = IRC20Protocol(tokenScAddr).balanceOf(to); // IRC20Protocol(tokenScAddr).transfer(to, value); tokenScAddr.call(bytes4(keccak256("transfer(address,uint256)")), to, value); afterBalance = IRC20Protocol(tokenScAddr).balanceOf(to); return afterBalance == beforeBalance.add(value); } function transferFrom(address tokenScAddr, address from, address to, uint value) internal returns(bool) { uint beforeBalance; uint afterBalance; beforeBalance = IRC20Protocol(tokenScAddr).balanceOf(to); // IRC20Protocol(tokenScAddr).transferFrom(from, to, value); tokenScAddr.call(bytes4(keccak256("transferFrom(address,address,uint256)")), from, to, value); afterBalance = IRC20Protocol(tokenScAddr).balanceOf(to); return afterBalance == beforeBalance.add(value); } } // File: contracts/crossApproach/CrossStorageV1.sol /* Copyright 2019 Wanchain Foundation. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // _ _ _ // __ ____ _ _ __ ___| |__ __ _(_)_ __ __| | _____ __ // \ \ /\ / / _` | '_ \ / __| '_ \ / _` | | '_ \@/ _` |/ _ \ \ / / // \ V V / (_| | | | | (__| | | | (_| | | | | | (_| | __/\ V / // \_/\_/ \__,_|_| |_|\___|_| |_|\__,_|_|_| |_|\__,_|\___| \_/ // // pragma solidity ^0.4.26; contract CrossStorageV1 is BasicStorage { using HTLCTxLib for HTLCTxLib.Data; using RapidityTxLib for RapidityTxLib.Data; /************************************************************ ** ** VARIABLES ** ************************************************************/ CrossTypesV1.Data internal storageData; /// @notice locked time(in seconds) uint public lockedTime = uint(3600*36); /// @notice Since storeman group admin receiver address may be changed, system should make sure the new address /// @notice can be used, and the old address can not be used. The solution is add timestamp. /// @notice unit: second uint public smgFeeReceiverTimeout = uint(10*60); enum GroupStatus { none, initial, curveSeted, failed, selected, ready, unregistered, dismissed } } // File: contracts/crossApproach/CrossStorageV2.sol /* Copyright 2019 Wanchain Foundation. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // _ _ _ // __ ____ _ _ __ ___| |__ __ _(_)_ __ __| | _____ __ // \ \ /\ / / _` | '_ \ / __| '_ \ / _` | | '_ \@/ _` |/ _ \ \ / / // \ V V / (_| | | | | (__| | | | (_| | | | | | (_| | __/\ V / // \_/\_/ \__,_|_| |_|\___|_| |_|\__,_|_|_| |_|\__,_|\___| \_/ // // pragma solidity ^0.4.26; contract CrossStorageV2 is CrossStorageV1, ReentrancyGuard, Halt, Proxy { /************************************************************ ** ** VARIABLES ** ************************************************************/ /** STATE VARIABLES **/ uint256 public currentChainID; address public admin; /** STRUCTURES **/ struct SetFeesParam { uint256 srcChainID; uint256 destChainID; uint256 contractFee; uint256 agentFee; } struct GetFeesParam { uint256 srcChainID; uint256 destChainID; } struct GetFeesReturn { uint256 contractFee; uint256 agentFee; } } // File: contracts/crossApproach/lib/HTLCDebtLibV2.sol /* Copyright 2019 Wanchain Foundation. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // _ _ _ // __ ____ _ _ __ ___| |__ __ _(_)_ __ __| | _____ __ // \ \ /\ / / _` | '_ \ / __| '_ \ / _` | | '_ \@/ _` |/ _ \ \ / / // \ V V / (_| | | | | (__| | | | (_| | | | | | (_| | __/\ V / // \_/\_/ \__,_|_| |_|\___|_| |_|\__,_|_|_| |_|\__,_|\___| \_/ // // pragma solidity ^0.4.26; library HTLCDebtLibV2 { /** * * STRUCTURES * */ /// @notice struct of debt and asset parameters struct DebtAssetParams { bytes32 uniqueID; /// hash of HTLC random number bytes32 srcSmgID; /// ID of source storeman group bytes32 destSmgID; /// ID of destination storeman group } /** * * EVENTS * **/ /// @notice event of storeman asset transfer /// @param uniqueID random number /// @param srcSmgID ID of source storeman group /// @param destSmgID ID of destination storeman group event TransferAssetLogger(bytes32 indexed uniqueID, bytes32 indexed srcSmgID, bytes32 indexed destSmgID); /// @notice event of storeman debt receive /// @param uniqueID random number /// @param srcSmgID ID of source storeman group /// @param destSmgID ID of destination storeman group event ReceiveDebtLogger(bytes32 indexed uniqueID, bytes32 indexed srcSmgID, bytes32 indexed destSmgID); /** * * MANIPULATIONS * */ /// @notice transfer asset /// @param storageData Cross storage data /// @param params parameters of storeman debt lock function transferAsset(CrossTypesV1.Data storage storageData, DebtAssetParams memory params) public { if (address(storageData.quota) != address(0)) { storageData.quota.transferAsset(params.srcSmgID, params.destSmgID); } emit TransferAssetLogger(params.uniqueID, params.srcSmgID, params.destSmgID); } /// @notice receive debt /// @param storageData Cross storage data /// @param params parameters of storeman debt lock function receiveDebt(CrossTypesV1.Data storage storageData, DebtAssetParams memory params) public { if (address(storageData.quota) != address(0)) { storageData.quota.receiveDebt(params.srcSmgID, params.destSmgID); } emit ReceiveDebtLogger(params.uniqueID, params.srcSmgID, params.destSmgID); } } // File: contracts/interfaces/ISmgFeeProxy.sol /* Copyright 2019 Wanchain Foundation. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // _ _ _ // __ ____ _ _ __ ___| |__ __ _(_)_ __ __| | _____ __ // \ \ /\ / / _` | '_ \ / __| '_ \ / _` | | '_ \@/ _` |/ _ \ \ / / // \ V V / (_| | | | | (__| | | | (_| | | | | | (_| | __/\ V / // \_/\_/ \__,_|_| |_|\___|_| |_|\__,_|_|_| |_|\__,_|\___| \_/ // // pragma solidity 0.4.26; interface ISmgFeeProxy { function smgTransfer(bytes32 smgID) external payable; } // File: contracts/crossApproach/lib/RapidityLibV2.sol /* Copyright 2019 Wanchain Foundation. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // _ _ _ // __ ____ _ _ __ ___| |__ __ _(_)_ __ __| | _____ __ // \ \ /\ / / _` | '_ \ / __| '_ \ / _` | | '_ \@/ _` |/ _ \ \ / / // \ V V / (_| | | | | (__| | | | (_| | | | | | (_| | __/\ V / // \_/\_/ \__,_|_| |_|\___|_| |_|\__,_|_|_| |_|\__,_|\___| \_/ // // pragma solidity ^0.4.26; library RapidityLibV2 { using SafeMath for uint; using RapidityTxLib for RapidityTxLib.Data; /** * * STRUCTURES * */ /// @notice struct of Rapidity storeman mint lock parameters struct CrossFeeParams { uint contractFee; /// token pair id on cross chain uint agentFee; /// exchange token value } /// @notice struct of Rapidity storeman mint lock parameters struct RapidityUserLockParams { bytes32 smgID; /// ID of storeman group which user has selected uint tokenPairID; /// token pair id on cross chain uint value; /// exchange token value uint currentChainID; /// current chain ID bytes destUserAccount; /// account of shadow chain, used to receive token } /// @notice struct of Rapidity storeman mint lock parameters struct RapiditySmgMintParams { bytes32 uniqueID; /// Rapidity random number bytes32 smgID; /// ID of storeman group which user has selected uint tokenPairID; /// token pair id on cross chain uint value; /// exchange token value address destTokenAccount; /// shadow token account address destUserAccount; /// account of shadow chain, used to receive token } /// @notice struct of Rapidity user burn lock parameters struct RapidityUserBurnParams { bytes32 smgID; /// ID of storeman group which user has selected uint tokenPairID; /// token pair id on cross chain uint value; /// exchange token value uint currentChainID; /// current chain ID uint fee; /// exchange token fee address srcTokenAccount; /// shadow token account bytes destUserAccount; /// account of token destination chain, used to receive token } /// @notice struct of Rapidity user burn lock parameters struct RapiditySmgReleaseParams { bytes32 uniqueID; /// Rapidity random number bytes32 smgID; /// ID of storeman group which user has selected uint tokenPairID; /// token pair id on cross chain uint value; /// exchange token value address destTokenAccount; /// original token/coin account address destUserAccount; /// account of token original chain, used to receive token } /** * * EVENTS * **/ /// @notice event of exchange WRC-20 token with original chain token request /// @notice event invoked by storeman group /// @param smgID ID of storemanGroup /// @param tokenPairID token pair ID of cross chain token /// @param tokenAccount Rapidity original token account /// @param value Rapidity value /// @param userAccount account of shadow chain, used to receive token event UserLockLogger(bytes32 indexed smgID, uint indexed tokenPairID, address indexed tokenAccount, uint value, uint contractFee, bytes userAccount); /// @notice event of exchange WRC-20 token with original chain token request /// @notice event invoked by storeman group /// @param smgID ID of storemanGroup /// @param tokenPairID token pair ID of cross chain token /// @param tokenAccount Rapidity shadow token account /// @param value Rapidity value /// @param userAccount account of shadow chain, used to receive token event UserBurnLogger(bytes32 indexed smgID, uint indexed tokenPairID, address indexed tokenAccount, uint value, uint contractFee, uint fee, bytes userAccount); /// @notice event of exchange WRC-20 token with original chain token request /// @notice event invoked by storeman group /// @param uniqueID unique random number /// @param smgID ID of storemanGroup /// @param tokenPairID token pair ID of cross chain token /// @param value Rapidity value /// @param tokenAccount Rapidity shadow token account /// @param userAccount account of original chain, used to receive token event SmgMintLogger(bytes32 indexed uniqueID, bytes32 indexed smgID, uint indexed tokenPairID, uint value, address tokenAccount, address userAccount); /// @notice event of exchange WRC-20 token with original chain token request /// @notice event invoked by storeman group /// @param uniqueID unique random number /// @param smgID ID of storemanGroup /// @param tokenPairID token pair ID of cross chain token /// @param value Rapidity value /// @param tokenAccount Rapidity original token account /// @param userAccount account of original chain, used to receive token event SmgReleaseLogger(bytes32 indexed uniqueID, bytes32 indexed smgID, uint indexed tokenPairID, uint value, address tokenAccount, address userAccount); /** * * MANIPULATIONS * */ /// @notice mintBridge, user lock token on token original chain /// @notice event invoked by user mint lock /// @param storageData Cross storage data /// @param params parameters for user mint lock token on token original chain function userLock(CrossTypesV1.Data storage storageData, RapidityUserLockParams memory params) public { uint fromChainID; uint toChainID; bytes memory fromTokenAccount; (fromChainID,fromTokenAccount,toChainID) = storageData.tokenManager.getTokenPairInfoSlim(params.tokenPairID); require(fromChainID != 0, "Token does not exist"); if (address(storageData.quota) != address(0)) { storageData.quota.userLock(params.tokenPairID, params.smgID, params.value); } uint contractFee = storageData.mapContractFee[fromChainID][toChainID]; if (contractFee > 0) { if (storageData.smgFeeProxy == address(0)) { storageData.mapStoremanFee[bytes32(0)] = storageData.mapStoremanFee[bytes32(0)].add(contractFee); } else { (storageData.smgFeeProxy).transfer(contractFee); } } address tokenScAddr = CrossTypesV1.bytesToAddress(fromTokenAccount); uint left; if (tokenScAddr == address(0)) { left = (msg.value).sub(params.value).sub(contractFee); } else { left = (msg.value).sub(contractFee); require(CrossTypesV1.transferFrom(tokenScAddr, msg.sender, this, params.value), "Lock token failed"); } if (left != 0) { (msg.sender).transfer(left); } emit UserLockLogger(params.smgID, params.tokenPairID, tokenScAddr, params.value, contractFee, params.destUserAccount); } /// @notice burnBridge, user lock token on token original chain /// @notice event invoked by user burn lock /// @param storageData Cross storage data /// @param params parameters for user burn lock token on token original chain function userBurn(CrossTypesV1.Data storage storageData, RapidityUserBurnParams memory params) public { ITokenManager tokenManager = storageData.tokenManager; uint fromChainID; uint toChainID; bytes memory fromTokenAccount; bytes memory toTokenAccount; (fromChainID,fromTokenAccount,toChainID,toTokenAccount) = tokenManager.getTokenPairInfo(params.tokenPairID); require(fromChainID != 0, "Token does not exist"); uint256 contractFee; address tokenScAddr; if (params.currentChainID == toChainID) { contractFee = storageData.mapContractFee[toChainID][fromChainID]; tokenScAddr = CrossTypesV1.bytesToAddress(toTokenAccount); } else if (params.currentChainID == fromChainID) { contractFee = storageData.mapContractFee[fromChainID][toChainID]; tokenScAddr = CrossTypesV1.bytesToAddress(fromTokenAccount); } else { require(false, "Invalid token pair"); } require(params.srcTokenAccount == tokenScAddr, "invalid token account"); if (address(storageData.quota) != address(0)) { storageData.quota.userBurn(params.tokenPairID, params.smgID, params.value); } require(burnShadowToken(tokenManager, tokenScAddr, msg.sender, params.value), "burn failed"); if (contractFee > 0) { if (storageData.smgFeeProxy == address(0)) { storageData.mapStoremanFee[bytes32(0)] = storageData.mapStoremanFee[bytes32(0)].add(contractFee); } else { (storageData.smgFeeProxy).transfer(contractFee); } } uint left = (msg.value).sub(contractFee); // uint left = (msg.value).sub(contractFee); if (left != 0) { (msg.sender).transfer(left); } emit UserBurnLogger(params.smgID, params.tokenPairID, tokenScAddr, params.value, contractFee, params.fee, params.destUserAccount); } /// @notice mintBridge, storeman mint lock token on token shadow chain /// @notice event invoked by user mint lock /// @param storageData Cross storage data /// @param params parameters for storeman mint lock token on token shadow chain function smgMint(CrossTypesV1.Data storage storageData, RapiditySmgMintParams memory params) public { storageData.rapidityTxData.addRapidityTx(params.uniqueID); if (address(storageData.quota) != address(0)) { storageData.quota.smgMint(params.tokenPairID, params.smgID, params.value); } require(mintShadowToken(storageData.tokenManager, params.destTokenAccount, params.destUserAccount, params.value), "mint failed"); emit SmgMintLogger(params.uniqueID, params.smgID, params.tokenPairID, params.value, params.destTokenAccount, params.destUserAccount); } /// @notice burnBridge, storeman burn lock token on token shadow chain /// @notice event invoked by user burn lock /// @param storageData Cross storage data /// @param params parameters for storeman burn lock token on token shadow chain function smgRelease(CrossTypesV1.Data storage storageData, RapiditySmgReleaseParams memory params) public { storageData.rapidityTxData.addRapidityTx(params.uniqueID); if (address(storageData.quota) != address(0)) { storageData.quota.smgRelease(params.tokenPairID, params.smgID, params.value); } if (params.destTokenAccount == address(0)) { (params.destUserAccount).transfer(params.value); } else { require(CrossTypesV1.transfer(params.destTokenAccount, params.destUserAccount, params.value), "Transfer token failed"); } emit SmgReleaseLogger(params.uniqueID, params.smgID, params.tokenPairID, params.value, params.destTokenAccount, params.destUserAccount); } function burnShadowToken(address tokenManager, address tokenAddress, address userAccount, uint value) private returns (bool) { uint beforeBalance; uint afterBalance; beforeBalance = IRC20Protocol(tokenAddress).balanceOf(userAccount); ITokenManager(tokenManager).burnToken(tokenAddress, userAccount, value); afterBalance = IRC20Protocol(tokenAddress).balanceOf(userAccount); return afterBalance == beforeBalance.sub(value); } function mintShadowToken(address tokenManager, address tokenAddress, address userAccount, uint value) private returns (bool) { uint beforeBalance; uint afterBalance; beforeBalance = IRC20Protocol(tokenAddress).balanceOf(userAccount); ITokenManager(tokenManager).mintToken(tokenAddress, userAccount, value); afterBalance = IRC20Protocol(tokenAddress).balanceOf(userAccount); return afterBalance == beforeBalance.add(value); } } // File: contracts/crossApproach/CrossDelegateV2.sol /* Copyright 2019 Wanchain Foundation. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // _ _ _ // __ ____ _ _ __ ___| |__ __ _(_)_ __ __| | _____ __ // \ \ /\ / / _` | '_ \ / __| '_ \ / _` | | '_ \@/ _` |/ _ \ \ / / // \ V V / (_| | | | | (__| | | | (_| | | | | | (_| | __/\ V / // \_/\_/ \__,_|_| |_|\___|_| |_|\__,_|_|_| |_|\__,_|\___| \_/ // // pragma solidity ^0.4.26; contract CrossDelegateV2 is CrossStorageV2 { using SafeMath for uint; /** * * EVENTS * **/ /// @notice event of admin config /// @param adminAccount account of admin event SetAdmin(address adminAccount); /// @notice event of setFee or setFees /// @param srcChainID source of cross chain /// @param destChainID destination of cross chain /// @param contractFee contract fee /// @param agentFee agent fee event SetFee(uint srcChainID, uint destChainID, uint contractFee, uint agentFee); /// @notice event of storeman group ID withdraw the original coin to receiver /// @param smgID ID of storemanGroup /// @param timeStamp timestamp of the withdraw /// @param receiver receiver address /// @param fee shadow coin of the fee which the storeman group pk got it event SmgWithdrawFeeLogger(bytes32 indexed smgID, uint indexed timeStamp, address indexed receiver, uint fee); event WithdrawContractFeeLogger(uint indexed block, uint indexed timeStamp, address indexed receiver, uint fee); /** * * MODIFIERS * */ /// @notice check the admin or not modifier onlyAdmin() { require(msg.sender == admin, "not admin"); _; } /// @notice check the storeman group is ready /// @param smgID ID of storeman group modifier onlyReadySmg(bytes32 smgID) { uint8 status; uint startTime; uint endTime; (status,startTime,endTime) = storageData.smgAdminProxy.getStoremanGroupStatus(smgID); require(status == uint8(GroupStatus.ready) && now >= startTime && now <= endTime, "PK is not ready"); _; } /** * * MANIPULATIONS * */ /// @notice request exchange orignal coin or token with WRC20 on wanchain /// @param smgID ID of storeman /// @param tokenPairID token pair ID of cross chain coin/token /// @param value exchange value /// @param userAccount account of user, used to receive shadow chain token function userLock(bytes32 smgID, uint tokenPairID, uint value, bytes userAccount) external payable notHalted onlyReadySmg(smgID) { RapidityLibV2.RapidityUserLockParams memory params = RapidityLibV2.RapidityUserLockParams({ smgID: smgID, tokenPairID: tokenPairID, value: value, currentChainID: currentChainID, destUserAccount: userAccount }); RapidityLibV2.userLock(storageData, params); } /// @notice request exchange RC20 token with WRC20 on wanchain /// @param smgID ID of storeman /// @param tokenPairID token pair ID of cross chain token /// @param value exchange value /// @param userAccount account of user, used to receive original chain token function userBurn(bytes32 smgID, uint tokenPairID, uint value, uint fee, address tokenAccount, bytes userAccount) external payable notHalted onlyReadySmg(smgID) { RapidityLibV2.RapidityUserBurnParams memory params = RapidityLibV2.RapidityUserBurnParams({ smgID: smgID, tokenPairID: tokenPairID, value: value, fee: fee, currentChainID: currentChainID, srcTokenAccount: tokenAccount, destUserAccount: userAccount }); RapidityLibV2.userBurn(storageData, params); } /// @notice request exchange RC20 token with WRC20 on wanchain /// @param uniqueID fast cross chain random number /// @param smgID ID of storeman /// @param tokenPairID token pair ID of cross chain token /// @param value exchange value /// @param userAccount address of user, used to receive WRC20 token /// @param r signature /// @param s signature function smgMint(bytes32 uniqueID, bytes32 smgID, uint tokenPairID, uint value, address tokenAccount, address userAccount, bytes r, bytes32 s) external notHalted { uint curveID; bytes memory PK; (curveID, PK) = acquireReadySmgInfo(smgID); RapidityLibV2.RapiditySmgMintParams memory params = RapidityLibV2.RapiditySmgMintParams({ uniqueID: uniqueID, smgID: smgID, tokenPairID: tokenPairID, value: value, destTokenAccount: tokenAccount, destUserAccount: userAccount }); RapidityLibV2.smgMint(storageData, params); bytes32 mHash = sha256(abi.encode(currentChainID, uniqueID, tokenPairID, value, tokenAccount, userAccount)); verifySignature(curveID, mHash, PK, r, s); } /// @notice request exchange RC20 token with WRC20 on wanchain /// @param uniqueID fast cross chain random number /// @param smgID ID of storeman /// @param tokenPairID token pair ID of cross chain token /// @param value exchange value /// @param userAccount address of user, used to receive original token/coin /// @param r signature /// @param s signature function smgRelease(bytes32 uniqueID, bytes32 smgID, uint tokenPairID, uint value, address tokenAccount, address userAccount, bytes r, bytes32 s) external notHalted { uint curveID; bytes memory PK; (curveID, PK) = acquireReadySmgInfo(smgID); RapidityLibV2.RapiditySmgReleaseParams memory params = RapidityLibV2.RapiditySmgReleaseParams({ uniqueID: uniqueID, smgID: smgID, tokenPairID: tokenPairID, value: value, destTokenAccount: tokenAccount, destUserAccount: userAccount }); RapidityLibV2.smgRelease(storageData, params); bytes32 mHash = sha256(abi.encode(currentChainID, uniqueID, tokenPairID, value, tokenAccount, userAccount)); verifySignature(curveID, mHash, PK, r, s); } /// @notice transfer storeman asset /// @param uniqueID random number (likes old xHash) /// @param srcSmgID ID of src storeman /// @param destSmgID ID of dst storeman /// @param r signature /// @param s signature function transferAsset(bytes32 uniqueID, bytes32 srcSmgID, bytes32 destSmgID, bytes r, bytes32 s) external notHalted onlyReadySmg(destSmgID) { uint curveID; bytes memory PK; (curveID, PK) = acquireUnregisteredSmgInfo(srcSmgID); HTLCDebtLibV2.DebtAssetParams memory params = HTLCDebtLibV2.DebtAssetParams({ uniqueID: uniqueID, srcSmgID: srcSmgID, destSmgID: destSmgID }); HTLCDebtLibV2.transferAsset(storageData, params); bytes32 mHash = sha256(abi.encode(currentChainID, uniqueID, destSmgID)); verifySignature(curveID, mHash, PK, r, s); } /// @notice receive storeman debt /// @param uniqueID random number (likes old xHash) /// @param srcSmgID ID of src storeman /// @param destSmgID ID of dst storeman /// @param r signature /// @param s signature function receiveDebt(bytes32 uniqueID, bytes32 srcSmgID, bytes32 destSmgID, bytes r, bytes32 s) external notHalted { uint curveID; bytes memory PK; (curveID, PK) = acquireReadySmgInfo(destSmgID); HTLCDebtLibV2.DebtAssetParams memory params = HTLCDebtLibV2.DebtAssetParams({ uniqueID: uniqueID, srcSmgID: srcSmgID, destSmgID: destSmgID }); HTLCDebtLibV2.receiveDebt(storageData, params); bytes32 mHash = sha256(abi.encode(currentChainID, uniqueID, srcSmgID)); verifySignature(curveID, mHash, PK, r, s); } /// @notice get the fee of the storeman group should get /// @param param struct of setFee parameter function setFee(SetFeesParam param) public onlyAdmin { storageData.mapContractFee[param.srcChainID][param.destChainID] = param.contractFee; storageData.mapAgentFee[param.srcChainID][param.destChainID] = param.agentFee; emit SetFee(param.srcChainID, param.destChainID, param.contractFee, param.agentFee); } /// @notice get the fee of the storeman group should get /// @param params struct of setFees parameter function setFees(SetFeesParam [] params) public onlyAdmin { for (uint i = 0; i < params.length; ++i) { storageData.mapContractFee[params[i].srcChainID][params[i].destChainID] = params[i].contractFee; storageData.mapAgentFee[params[i].srcChainID][params[i].destChainID] = params[i].agentFee; emit SetFee(params[i].srcChainID, params[i].destChainID, params[i].contractFee, params[i].agentFee); } } function setChainID(uint256 chainID) external onlyAdmin { if (currentChainID == 0) { currentChainID = chainID; } } function setAdmin(address adminAccount) external onlyOwner { admin = adminAccount; emit SetAdmin(adminAccount); } function setUintValue(bytes key, bytes innerKey, uint value) external onlyAdmin { return uintData.setStorage(key, innerKey, value); } function delUintValue(bytes key, bytes innerKey) external onlyAdmin { return uintData.delStorage(key, innerKey); } /// @notice update the initialized state value of this contract /// @param tokenManager address of the token manager /// @param smgAdminProxy address of the storeman group admin /// @param smgFeeProxy address of the proxy to store fee for storeman group /// @param quota address of the quota /// @param sigVerifier address of the signature verifier function setPartners(address tokenManager, address smgAdminProxy, address smgFeeProxy, address quota, address sigVerifier) external onlyOwner { // require(tokenManager != address(0) && smgAdminProxy != address(0) && quota != address(0) && sigVerifier != address(0), // "Parameter is invalid"); require(tokenManager != address(0) && smgAdminProxy != address(0) && sigVerifier != address(0), "Parameter is invalid"); storageData.smgAdminProxy = IStoremanGroup(smgAdminProxy); storageData.tokenManager = ITokenManager(tokenManager); storageData.quota = IQuota(quota); storageData.smgFeeProxy = smgFeeProxy; storageData.sigVerifier = ISignatureVerifier(sigVerifier); } /// @notice withdraw the history fee to foundation account /// @param smgIDs array of storemanGroup ID function smgWithdrawFee(bytes32 [] smgIDs) external { uint fee; uint currentFee; address smgFeeProxy = storageData.smgFeeProxy; if (smgFeeProxy == address(0)) { smgFeeProxy = owner; } require(smgFeeProxy != address(0), "invalid smgFeeProxy"); for (uint i = 0; i < smgIDs.length; ++i) { currentFee = storageData.mapStoremanFee[smgIDs[i]]; delete storageData.mapStoremanFee[smgIDs[i]]; fee = fee.add(currentFee); emit SmgWithdrawFeeLogger(smgIDs[i], block.timestamp, smgFeeProxy, currentFee); } currentFee = storageData.mapStoremanFee[bytes32(0)]; if (currentFee > 0) { delete storageData.mapStoremanFee[bytes32(0)]; fee = fee.add(currentFee); } require(fee > 0, "Fee is null"); smgFeeProxy.transfer(fee); emit WithdrawContractFeeLogger(block.number, block.timestamp, smgFeeProxy, fee); } /** Get Functions */ function getUintValue(bytes key, bytes innerKey) public view returns (uint) { return uintData.getStorage(key, innerKey); } /// @notice get the fee of the storeman group should get /// @param smgID ID of storemanGroup /// @return fee original coin the storeman group should get function getStoremanFee(bytes32 smgID) external view returns(uint fee) { fee = storageData.mapStoremanFee[smgID]; } /// @notice get the fee of the storeman group should get /// @param param struct of getFee parameter /// @return fees struct of getFee return function getFee(GetFeesParam param) public view returns(GetFeesReturn fee) { fee.contractFee = storageData.mapContractFee[param.srcChainID][param.destChainID]; fee.agentFee = storageData.mapAgentFee[param.srcChainID][param.destChainID]; } /// @notice get the fee of the storeman group should get /// @param params struct of getFees parameter /// @return fees struct of getFees return function getFees(GetFeesParam [] params) public view returns(GetFeesReturn [] fees) { fees = new GetFeesReturn[](params.length); for (uint i = 0; i < params.length; ++i) { fees[i].contractFee = storageData.mapContractFee[params[i].srcChainID][params[i].destChainID]; fees[i].agentFee = storageData.mapAgentFee[params[i].srcChainID][params[i].destChainID]; } } /// @notice get the initialized state value of this contract /// @return tokenManager address of the token manager /// @return smgAdminProxy address of the storeman group admin /// @return smgFeeProxy address of the proxy to store fee for storeman group /// @return quota address of the quota /// @return sigVerifier address of the signature verifier function getPartners() external view returns(address tokenManager, address smgAdminProxy, address smgFeeProxy, address quota, address sigVerifier) { tokenManager = address(storageData.tokenManager); smgAdminProxy = address(storageData.smgAdminProxy); smgFeeProxy = storageData.smgFeeProxy; quota = address(storageData.quota); sigVerifier = address(storageData.sigVerifier); } /** Private and Internal Functions */ /// @notice check the storeman group is ready or not /// @param smgID ID of storeman group /// @return curveID ID of elliptic curve /// @return PK PK of storeman group function acquireReadySmgInfo(bytes32 smgID) internal view returns (uint curveID, bytes memory PK) { uint8 status; uint startTime; uint endTime; (,status,,,,curveID,,PK,,startTime,endTime) = storageData.smgAdminProxy.getStoremanGroupConfig(smgID); require(status == uint8(GroupStatus.ready) && now >= startTime && now <= endTime, "PK is not ready"); return (curveID, PK); } /// @notice get the unregistered storeman group info /// @param smgID ID of storeman group /// @return curveID ID of elliptic curve /// @return PK PK of storeman group function acquireUnregisteredSmgInfo(bytes32 smgID) internal view returns (uint curveID, bytes memory PK) { uint8 status; (,status,,,,curveID,,PK,,,) = storageData.smgAdminProxy.getStoremanGroupConfig(smgID); require(status == uint8(GroupStatus.unregistered), "PK is not unregistered"); } /// @notice convert bytes to bytes32 /// @param b bytes array /// @param offset offset of array to begin convert function bytesToBytes32(bytes memory b, uint offset) internal pure returns (bytes32 result) { assembly { result := mload(add(add(b, offset), 32)) } } /// @notice verify signature /// @param curveID ID of elliptic curve /// @param message message to be verified /// @param r Signature info r /// @param s Signature info s function verifySignature(uint curveID, bytes32 message, bytes PK, bytes r, bytes32 s) internal { bytes32 PKx = bytesToBytes32(PK, 0); bytes32 PKy = bytesToBytes32(PK, 32); bytes32 Rx = bytesToBytes32(r, 0); bytes32 Ry = bytesToBytes32(r, 32); require(storageData.sigVerifier.verify(curveID, s, PKx, PKy, Rx, Ry, message), "Signature verification failed"); } }
[{"constant":false,"inputs":[{"name":"tokenManager","type":"address"},{"name":"smgAdminProxy","type":"address"},{"name":"smgFeeProxy","type":"address"},{"name":"quota","type":"address"},{"name":"sigVerifier","type":"address"}],"name":"setPartners","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"components":[{"name":"srcChainID","type":"uint256"},{"name":"destChainID","type":"uint256"}],"name":"param","type":"tuple"}],"name":"getFee","outputs":[{"components":[{"name":"contractFee","type":"uint256"},{"name":"agentFee","type":"uint256"}],"name":"fee","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"uniqueID","type":"bytes32"},{"name":"smgID","type":"bytes32"},{"name":"tokenPairID","type":"uint256"},{"name":"value","type":"uint256"},{"name":"tokenAccount","type":"address"},{"name":"userAccount","type":"address"},{"name":"r","type":"bytes"},{"name":"s","type":"bytes32"}],"name":"smgRelease","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"smgID","type":"bytes32"},{"name":"tokenPairID","type":"uint256"},{"name":"value","type":"uint256"},{"name":"userAccount","type":"bytes"}],"name":"userLock","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"components":[{"name":"srcChainID","type":"uint256"},{"name":"destChainID","type":"uint256"}],"name":"params","type":"tuple[]"}],"name":"getFees","outputs":[{"components":[{"name":"contractFee","type":"uint256"},{"name":"agentFee","type":"uint256"}],"name":"fees","type":"tuple[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"smgID","type":"bytes32"},{"name":"tokenPairID","type":"uint256"},{"name":"value","type":"uint256"},{"name":"fee","type":"uint256"},{"name":"tokenAccount","type":"address"},{"name":"userAccount","type":"bytes"}],"name":"userBurn","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"uniqueID","type":"bytes32"},{"name":"srcSmgID","type":"bytes32"},{"name":"destSmgID","type":"bytes32"},{"name":"r","type":"bytes"},{"name":"s","type":"bytes32"}],"name":"receiveDebt","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"key","type":"bytes"},{"name":"innerKey","type":"bytes"}],"name":"delUintValue","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"components":[{"name":"srcChainID","type":"uint256"},{"name":"destChainID","type":"uint256"},{"name":"contractFee","type":"uint256"},{"name":"agentFee","type":"uint256"}],"name":"param","type":"tuple"}],"name":"setFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"uniqueID","type":"bytes32"},{"name":"smgID","type":"bytes32"},{"name":"tokenPairID","type":"uint256"},{"name":"value","type":"uint256"},{"name":"tokenAccount","type":"address"},{"name":"userAccount","type":"address"},{"name":"r","type":"bytes"},{"name":"s","type":"bytes32"}],"name":"smgMint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"implementation","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"uniqueID","type":"bytes32"},{"name":"srcSmgID","type":"bytes32"},{"name":"destSmgID","type":"bytes32"},{"name":"r","type":"bytes"},{"name":"s","type":"bytes32"}],"name":"transferAsset","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"adminAccount","type":"address"}],"name":"setAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"smgID","type":"bytes32"}],"name":"getStoremanFee","outputs":[{"name":"fee","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getPartners","outputs":[{"name":"tokenManager","type":"address"},{"name":"smgAdminProxy","type":"address"},{"name":"smgFeeProxy","type":"address"},{"name":"quota","type":"address"},{"name":"sigVerifier","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"key","type":"bytes"},{"name":"innerKey","type":"bytes"}],"name":"getUintValue","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"key","type":"bytes"},{"name":"innerKey","type":"bytes"},{"name":"value","type":"uint256"}],"name":"setUintValue","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"changeOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"lockedTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"currentChainID","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"halted","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"newOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"components":[{"name":"srcChainID","type":"uint256"},{"name":"destChainID","type":"uint256"},{"name":"contractFee","type":"uint256"},{"name":"agentFee","type":"uint256"}],"name":"params","type":"tuple[]"}],"name":"setFees","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"smgFeeReceiverTimeout","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"smgIDs","type":"bytes32[]"}],"name":"smgWithdrawFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"chainID","type":"uint256"}],"name":"setChainID","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"halt","type":"bool"}],"name":"setHalt","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"admin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"adminAccount","type":"address"}],"name":"SetAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"srcChainID","type":"uint256"},{"indexed":false,"name":"destChainID","type":"uint256"},{"indexed":false,"name":"contractFee","type":"uint256"},{"indexed":false,"name":"agentFee","type":"uint256"}],"name":"SetFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"smgID","type":"bytes32"},{"indexed":true,"name":"timeStamp","type":"uint256"},{"indexed":true,"name":"receiver","type":"address"},{"indexed":false,"name":"fee","type":"uint256"}],"name":"SmgWithdrawFeeLogger","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"block","type":"uint256"},{"indexed":true,"name":"timeStamp","type":"uint256"},{"indexed":true,"name":"receiver","type":"address"},{"indexed":false,"name":"fee","type":"uint256"}],"name":"WithdrawContractFeeLogger","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]
Contract Creation Code
60806040526201fa406011556102586012556014805460a060020a60ff02191690556013805460ff191660011761010060a860020a03191661010033021790556137618061004e6000396000f30060806040526004361061017c5763ffffffff60e060020a6000350416630a72b1ab81146101d85780630ec61b79146101fa5780630f85626714610230578063257011b614610250578063361b31bf1461026357806341ff1bcc1461029057806345edb2bc146102a35780634cc7125b146102c35780634fb2e45d146102e357806354c0de4a1461030357806358cee0c4146103235780635c60da1b146103435780635ed061cc14610365578063704b6c0214610385578063715018a6146103a5578063715f250c146103ba57806373e29b0d146103e757806379ba50971461040d5780638061babf146104225780638da5cb5b14610442578063926731ea14610457578063a6f9dae114610477578063a8b3820514610497578063b179e1e7146104ac578063b9b8af0b146104c1578063d4ee1d90146104e3578063d52012bc146104f8578063e92e2c1b14610518578063ebba47971461052d578063ed8d47e61461054d578063f49543871461056d578063f851a4401461058d575b601554600160a060020a03168015156101b35760405160e560020a62461bcd0281526004016101aa906133fe565b60405180910390fd5b60405136600082376000803683855af43d806000843e8180156101d4578184f35b8184fd5b3480156101e457600080fd5b506101f86101f33660046127a1565b6105a2565b005b34801561020657600080fd5b5061021a610215366004612e29565b610693565b6040516102279190613524565b60405180910390f35b34801561023c57600080fd5b506101f861024b3660046129ca565b6106de565b6101f861025e366004612a96565b6108f2565b34801561026f57600080fd5b5061028361027e366004612858565b610b02565b60405161022791906133c1565b6101f861029e366004612b14565b610c4f565b3480156102af57600080fd5b506101f86102be36600461293a565b610e76565b3480156102cf57600080fd5b506101f86102de366004612cd7565b611066565b3480156102ef57600080fd5b506101f86102fe36600461277b565b61110b565b34801561030f57600080fd5b506101f861031e366004612e47565b6111dc565b34801561032f57600080fd5b506101f861033e3660046129ca565b611291565b34801561034f57600080fd5b50610358611365565b6040516102279190613367565b34801561037157600080fd5b506101f861038036600461293a565b611374565b34801561039157600080fd5b506101f86103a036600461277b565b61163f565b3480156103b157600080fd5b506101f86116c9565b3480156103c657600080fd5b506103da6103d53660046128fe565b61171b565b60405161022791906133e0565b3480156103f357600080fd5b506103fc61172d565b604051610227959493929190613375565b34801561041957600080fd5b506101f8611758565b34801561042e57600080fd5b506103da61043d366004612dc0565b6117a4565b34801561044e57600080fd5b506103586117c0565b34801561046357600080fd5b506101f8610472366004612d47565b6117d4565b34801561048357600080fd5b506101f861049236600461277b565b61187c565b3480156104a357600080fd5b506103da6118dd565b3480156104b857600080fd5b506103da6118e3565b3480156104cd57600080fd5b506104d66118e9565b60405161022791906133d2565b3480156104ef57600080fd5b506103586118f9565b34801561050457600080fd5b506101f861051336600461288d565b611908565b34801561052457600080fd5b506103da611af1565b34801561053957600080fd5b506101f8610548366004612816565b611af7565b34801561055957600080fd5b506101f86105683660046128fe565b611d44565b34801561057957600080fd5b506101f86105883660046128c2565b611d83565b34801561059957600080fd5b50610358611de4565b6013546101009004600160a060020a031633146105d45760405160e560020a62461bcd0281526004016101aa9061344e565b600160a060020a038516158015906105f45750600160a060020a03841615155b80156106085750600160a060020a03811615155b15156106295760405160e560020a62461bcd0281526004016101aa906133ee565b600b805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a0396871617909155600a805482169686169690961790955560098054861692851692909217909155600c8054851692841692909217909155600d80549093169116179055565b61069b612381565b81516000908152600f6020908152604080832082860180518552908352818420548552945183526010825280832094518352938152929020549181019190915290565b600060606106ea612398565b60145460009060a060020a900460ff161561071a5760405160e560020a62461bcd0281526004016101aa9061342e565b6107238c611df3565b809450819550505060c0604051908101604052808e6000191681526020018d6000191681526020018c81526020018b81526020018a600160a060020a0316815260200189600160a060020a03168152509150738d508595f094c42ade6d3625a206abe9551c58586325d82a9b6005846040518363ffffffff1660e060020a0281526004016107b29291906134c9565b60006040518083038186803b1580156107ca57600080fd5b505af41580156107de573d6000803e3d6000fd5b5050505060026016548e8d8d8d8d604051602001610801969594939291906135c2565b6040516020818303038152906040526040518082805190602001908083835b6020831061083f5780518252601f199092019160209182019101610820565b51815160209384036101000a600019018019909216911617905260405191909301945091925050808303816000865af1158015610880573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052506108a3919081019061291c565b90506108e38482858a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437508e9450611f029350505050565b50505050505050505050505050565b6108fa6123cd565b60145460a060020a900460ff16156109275760405160e560020a62461bcd0281526004016101aa9061342e565b600b546040517f95e8d68a000000000000000000000000000000000000000000000000000000008152879160009182918291600160a060020a03909116906395e8d68a906109799087906004016133e0565b606060405180830381600087803b15801561099357600080fd5b505af11580156109a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506109cb9190810190612e65565b9194509250905060ff831660051480156109e55750814210155b80156109f15750804211155b1515610a125760405160e560020a62461bcd0281526004016101aa9061346e565b60a0604051908101604052808b6000191681526020018a8152602001898152602001601654815260200188888080601f0160208091040260200160405190810160405280939291908181526020018383808284375050509290935250506040517f3535ca1d000000000000000000000000000000000000000000000000000000008152919650738d508595f094c42ade6d3625a206abe9551c585891633535ca1d9150610ac6906005908990600401613504565b60006040518083038186803b158015610ade57600080fd5b505af4158015610af2573d6000803e3d6000fd5b5050505050505050505050505050565b606060008251604051908082528060200260200182016040528015610b4157816020015b610b2e612381565b815260200190600190039081610b265790505b509150600090505b8251811015610c49576005600a0160008483815181101515610b6757fe5b9060200190602002015160000151815260200190815260200160002060008483815181101515610b9357fe5b90602001906020020151602001518152602001908152602001600020548282815181101515610bbe57fe5b60209081029091010151528251601090600090859084908110610bdd57fe5b9060200190602002015160000151815260200190815260200160002060008483815181101515610c0957fe5b90602001906020020151602001518152602001908152602001600020548282815181101515610c3457fe5b60209081029091018101510152600101610b49565b50919050565b610c57612400565b60145460a060020a900460ff1615610c845760405160e560020a62461bcd0281526004016101aa9061342e565b600b546040517f95e8d68a000000000000000000000000000000000000000000000000000000008152899160009182918291600160a060020a03909116906395e8d68a90610cd69087906004016133e0565b606060405180830381600087803b158015610cf057600080fd5b505af1158015610d04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d289190810190612e65565b9194509250905060ff83166005148015610d425750814210155b8015610d4e5750804211155b1515610d6f5760405160e560020a62461bcd0281526004016101aa9061346e565b60e0604051908101604052808d6000191681526020018c81526020018b815260200160165481526020018a815260200189600160a060020a0316815260200188888080601f0160208091040260200160405190810160405280939291908181526020018383808284375050509290935250506040517f3d391930000000000000000000000000000000000000000000000000000000008152919650738d508595f094c42ade6d3625a206abe9551c585891633d3919309150610e389060059089906004016134e4565b60006040518083038186803b158015610e5057600080fd5b505af4158015610e64573d6000803e3d6000fd5b50505050505050505050505050505050565b60006060610e8261244a565b60145460009060a060020a900460ff1615610eb25760405160e560020a62461bcd0281526004016101aa9061342e565b610ebb88611df3565b604080516060810182528d8152602081018d90528082018c905290517f2742675800000000000000000000000000000000000000000000000000000000815292965090945092507347be7cc7c13315fdd1bbf3dbab512af23961ba5390632742675890610f2f9060059086906004016134ae565b60006040518083038186803b158015610f4757600080fd5b505af4158015610f5b573d6000803e3d6000fd5b5050505060026016548b8b604051602001610f7893929190613532565b6040516020818303038152906040526040518082805190602001908083835b60208310610fb65780518252601f199092019160209182019101610f97565b51815160209384036101000a600019018019909216911617905260405191909301945091925050808303816000865af1158015610ff7573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525061101a919081019061291c565b905061105a8482858a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437508e9450611f029350505050565b50505050505050505050565b601754600160a060020a031633146110935760405160e560020a62461bcd0281526004016101aa9061348e565b61110584848080601f0160208091040260200160405190810160405280939291908181526020018383808284375050604080516020601f8a0181900481028201810190925288815294508893508792508291508401838280828437506000969594505063ffffffff61200d1692505050565b50505050565b6013546101009004600160a060020a0316331461113d5760405160e560020a62461bcd0281526004016101aa9061344e565b600160a060020a03811615156111685760405160e560020a62461bcd0281526004016101aa9061341e565b601354604051600160a060020a0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a360138054600160a060020a039092166101000274ffffffffffffffffffffffffffffffffffffffff0019909216919091179055565b601754600160a060020a031633146112095760405160e560020a62461bcd0281526004016101aa9061348e565b6040808201805183516000908152600f602090815284822081870180518452908252858320939093556060860180518751845260108352868420855185529092529185902055845191519251905193517f2c40e30353ae48a032fd20f1fece20031c1b80a2bc8512a2c172ff4de2e595199461128694929161361c565b60405180910390a150565b6000606061129d612398565b60145460009060a060020a900460ff16156112cd5760405160e560020a62461bcd0281526004016101aa9061342e565b6112d68c611df3565b809450819550505060c0604051908101604052808e6000191681526020018d6000191681526020018c81526020018b81526020018a600160a060020a0316815260200189600160a060020a03168152509150738d508595f094c42ade6d3625a206abe9551c5858636307afb16005846040518363ffffffff1660e060020a0281526004016107b29291906134c9565b601554600160a060020a031690565b6000606061138061244a565b60145460009060a060020a900460ff16156113b05760405160e560020a62461bcd0281526004016101aa9061342e565b600b546040517f95e8d68a000000000000000000000000000000000000000000000000000000008152899160009182918291600160a060020a03909116906395e8d68a906114029087906004016133e0565b606060405180830381600087803b15801561141c57600080fd5b505af1158015611430573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114549190810190612e65565b9194509250905060ff8316600514801561146e5750814210155b801561147a5750804211155b151561149b5760405160e560020a62461bcd0281526004016101aa9061346e565b6114a48d6120d3565b80985081995050506060604051908101604052808f6000191681526020018e6000191681526020018d6000191681525095507347be7cc7c13315fdd1bbf3dbab512af23961ba53639cb100d96005886040518363ffffffff1660e060020a0281526004016115139291906134ae565b60006040518083038186803b15801561152b57600080fd5b505af415801561153f573d6000803e3d6000fd5b5050505060026016548f8e60405160200161155c93929190613532565b6040516020818303038152906040526040518082805190602001908083835b6020831061159a5780518252601f19909201916020918201910161157b565b51815160209384036101000a600019018019909216911617905260405191909301945091925050808303816000865af11580156115db573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052506115fe919081019061291c565b9450610af28886898e8e8080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050508d611f02565b6013546101009004600160a060020a031633146116715760405160e560020a62461bcd0281526004016101aa9061344e565b6017805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790556040517f5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a190611286908390613367565b6013546101009004600160a060020a031633146116fb5760405160e560020a62461bcd0281526004016101aa9061344e565b6013805474ffffffffffffffffffffffffffffffffffffffff0019169055565b6000908152600e602052604090205490565b600a54600b54600c54600954600d54600160a060020a03948516959385169492831693918316921690565b601454600160a060020a03163314156117a25760145460138054600160a060020a039092166101000274ffffffffffffffffffffffffffffffffffffffff00199092169190911790555b565b60006117b781848463ffffffff6121bf16565b90505b92915050565b6013546101009004600160a060020a031681565b601754600160a060020a031633146118015760405160e560020a62461bcd0281526004016101aa9061348e565b61187585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375050604080516020601f8b0181900481028201810190925289815294508993508892508291508401838280828437506000969594508893505063ffffffff61228916915050565b5050505050565b6013546101009004600160a060020a031633146118ae5760405160e560020a62461bcd0281526004016101aa9061344e565b6014805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60115481565b60165481565b60145460a060020a900460ff1681565b601454600160a060020a031681565b601754600090600160a060020a031633146119385760405160e560020a62461bcd0281526004016101aa9061348e565b5060005b8151811015611aed57818181518110151561195357fe5b90602001906020020151604001516005600a016000848481518110151561197657fe5b90602001906020020151600001518152602001908152602001600020600084848151811015156119a257fe5b906020019060200201516020015181526020019081526020016000208190555081818151811015156119d057fe5b90602001906020020151606001516005600b01600084848151811015156119f357fe5b9060200190602002015160000151815260200190815260200160002060008484815181101515611a1f57fe5b90602001906020020151602001518152602001908152602001600020819055507f2c40e30353ae48a032fd20f1fece20031c1b80a2bc8512a2c172ff4de2e595198282815181101515611a6e57fe5b60209081029091010151518351849084908110611a8757fe5b90602001906020020151602001518484815181101515611aa357fe5b90602001906020020151604001518585815181101515611abf57fe5b9060200190602002015160600151604051611add949392919061361c565b60405180910390a160010161193c565b5050565b60125481565b600c546000908190600160a060020a031681811515611b24576013546101009004600160a060020a031691505b600160a060020a0382161515611b4f5760405160e560020a62461bcd0281526004016101aa9061345e565b5060005b84811015611c2b57600e6000878784818110611b6b57fe5b602090810292909201358352508101919091526040016000908120549350600e90878784818110611b9857fe5b60209081029290920135835250810191909152604001600090812055611bc4848463ffffffff61235116565b9350600160a060020a03821642878784818110611bdd57fe5b9050602002013560001916600019167f0a22c3968ae76dda4fe52e9571fd986b9475a0d480bb7df923542c5129ae972686604051611c1b91906133e0565b60405180910390a4600101611b53565b6000808052600e6020527fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c549350831115611c9f576000808052600e6020527fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c55611c9c848463ffffffff61235116565b93505b60008411611cc25760405160e560020a62461bcd0281526004016101aa9061349e565b604051600160a060020a0383169085156108fc029086906000818181858888f19350505050158015611cf8573d6000803e3d6000fd5b5081600160a060020a031642437f2bc8aa4aaa1151f04803c964b80ccbb87f081675ba88d0b13074220096cbe96387604051611d3491906133e0565b60405180910390a4505050505050565b601754600160a060020a03163314611d715760405160e560020a62461bcd0281526004016101aa9061348e565b6016541515611d805760168190555b50565b6013546101009004600160a060020a03163314611db55760405160e560020a62461bcd0281526004016101aa9061344e565b6014805491151560a060020a0274ff000000000000000000000000000000000000000019909216919091179055565b601754600160a060020a031681565b600b546040517f44cefb69000000000000000000000000000000000000000000000000000000008152600091606091839182918291600160a060020a0316906344cefb6990611e469089906004016133e0565b600060405180830381600087803b158015611e6057600080fd5b505af1158015611e74573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611e9c9190810190612bb9565b949e50919c50969a50985090965060059550611eb9945050505050565b60ff168360ff16148015611ecd5750814210155b8015611ed95750804211155b1515611efa5760405160e560020a62461bcd0281526004016101aa9061346e565b505050915091565b600080600080611f13876000612379565b9350611f20876020612379565b9250611f2d866000612379565b9150611f3a866020612379565b9050600560080160009054906101000a9004600160a060020a0316600160a060020a0316634587b7b48a87878787878f6040518863ffffffff1660e060020a028152600401611f8f979695949392919061355a565b602060405180830381600087803b158015611fa957600080fd5b505af1158015611fbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611fe191908101906128e0565b15156120025760405160e560020a62461bcd0281526004016101aa9061343e565b505050505050505050565b82600001826040518082805190602001908083835b602083106120415780518252601f199092019160209182019101612022565b51815160209384036101000a6000190180199092169116179052920194855250604051938490038101842085519094869450925082918401908083835b6020831061209d5780518252601f19909201916020918201910161207e565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220600090555050505050565b600b546040517f44cefb690000000000000000000000000000000000000000000000000000000081526000916060918391600160a060020a0316906344cefb69906121229087906004016133e0565b600060405180830381600087803b15801561213c57600080fd5b505af1158015612150573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526121789190810190612bb9565b50939b509099509597506006965061219295505050505050565b60ff8281169116146121b95760405160e560020a62461bcd0281526004016101aa9061347e565b50915091565b600083600001836040518082805190602001908083835b602083106121f55780518252601f1990920191602091820191016121d6565b51815160209384036101000a6000190180199092169116179052920194855250604051938490038101842086519094879450925082918401908083835b602083106122515780518252601f199092019160209182019101612232565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922054925050505b9392505050565b8084600001846040518082805190602001908083835b602083106122be5780518252601f19909201916020918201910161229f565b51815160209384036101000a6000190180199092169116179052920194855250604051938490038101842087519094889450925082918401908083835b6020831061231a5780518252601f1990920191602091820191016122fb565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922092909255505050505050565b6000828201838110156122825760405160e560020a62461bcd0281526004016101aa9061340e565b016020015190565b604080518082019091526000808252602082015290565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b60a06040519081016040528060008019168152602001600081526020016000815260200160008152602001606081525090565b60e06040519081016040528060008019168152602001600081526020016000815260200160008152602001600081526020016000600160a060020a03168152602001606081525090565b604080516060810182526000808252602082018190529181019190915290565b60006117b782356136cb565b600080601f8301841361248857600080fd5b50813567ffffffffffffffff8111156124a057600080fd5b6020830191508360208202830111156124b857600080fd5b9250929050565b6000601f820183136124d057600080fd5b81356124e36124de82613678565b613651565b9150818183526020840193506020810190508385604084028201111561250857600080fd5b60005b83811015612536578161251e88826126b9565b8452506020909201916040919091019060010161250b565b5050505092915050565b6000601f8201831361255157600080fd5b813561255f6124de82613678565b9150818183526020840193506020810190508385608084028201111561258457600080fd5b60005b83811015612536578161259a8882612700565b84525060209092019160809190910190600101612587565b60006117b782356136d7565b60006117b782516136d7565b60006117b782356136dc565b60006117b782516136dc565b600080601f830184136125f457600080fd5b50813567ffffffffffffffff81111561260c57600080fd5b6020830191508360018202830111156124b857600080fd5b6000601f8201831361263557600080fd5b81356126436124de82613699565b9150808252602083016020830185838301111561265f57600080fd5b61266a8382846136e5565b50505092915050565b6000601f8201831361268457600080fd5b81516126926124de82613699565b915080825260208301602083018583830111156126ae57600080fd5b61266a8382846136f1565b6000604082840312156126cb57600080fd5b6126d56040613651565b905060006126e384846125ca565b82525060206126f4848483016125ca565b60208301525092915050565b60006080828403121561271257600080fd5b61271c6080613651565b9050600061272a84846125ca565b825250602061273b848483016125ca565b602083015250604061274f848285016125ca565b6040830152506060612763848285016125ca565b60608301525092915050565b60006117b782516136df565b60006020828403121561278d57600080fd5b6000612799848461246a565b949350505050565b600080600080600060a086880312156127b957600080fd5b60006127c5888861246a565b95505060206127d68882890161246a565b94505060406127e78882890161246a565b93505060606127f88882890161246a565b92505060806128098882890161246a565b9150509295509295909350565b6000806020838503121561282957600080fd5b823567ffffffffffffffff81111561284057600080fd5b61284c85828601612476565b92509250509250929050565b60006020828403121561286a57600080fd5b813567ffffffffffffffff81111561288157600080fd5b612799848285016124bf565b60006020828403121561289f57600080fd5b813567ffffffffffffffff8111156128b657600080fd5b61279984828501612540565b6000602082840312156128d457600080fd5b600061279984846125b2565b6000602082840312156128f257600080fd5b600061279984846125be565b60006020828403121561291057600080fd5b600061279984846125ca565b60006020828403121561292e57600080fd5b600061279984846125d6565b60008060008060008060a0878903121561295357600080fd5b600061295f89896125ca565b965050602061297089828a016125ca565b955050604061298189828a016125ca565b945050606087013567ffffffffffffffff81111561299e57600080fd5b6129aa89828a016125e2565b935093505060806129bd89828a016125ca565b9150509295509295509295565b60008060008060008060008060006101008a8c0312156129e957600080fd5b60006129f58c8c6125ca565b9950506020612a068c828d016125ca565b9850506040612a178c828d016125ca565b9750506060612a288c828d016125ca565b9650506080612a398c828d0161246a565b95505060a0612a4a8c828d0161246a565b94505060c08a013567ffffffffffffffff811115612a6757600080fd5b612a738c828d016125e2565b935093505060e0612a868c828d016125ca565b9150509295985092959850929598565b600080600080600060808688031215612aae57600080fd5b6000612aba88886125ca565b9550506020612acb888289016125ca565b9450506040612adc888289016125ca565b935050606086013567ffffffffffffffff811115612af957600080fd5b612b05888289016125e2565b92509250509295509295909350565b600080600080600080600060c0888a031215612b2f57600080fd5b6000612b3b8a8a6125ca565b9750506020612b4c8a828b016125ca565b9650506040612b5d8a828b016125ca565b9550506060612b6e8a828b016125ca565b9450506080612b7f8a828b0161246a565b93505060a088013567ffffffffffffffff811115612b9c57600080fd5b612ba88a828b016125e2565b925092505092959891949750929550565b60008060008060008060008060008060006101608c8e031215612bdb57600080fd5b6000612be78e8e6125d6565b9b50506020612bf88e828f0161276f565b9a50506040612c098e828f016125d6565b9950506060612c1a8e828f016125d6565b9850506080612c2b8e828f016125d6565b97505060a0612c3c8e828f016125d6565b96505060c0612c4d8e828f016125d6565b95505060e08c015167ffffffffffffffff811115612c6a57600080fd5b612c768e828f01612673565b9450506101008c015167ffffffffffffffff811115612c9457600080fd5b612ca08e828f01612673565b935050610120612cb28e828f016125d6565b925050610140612cc48e828f016125d6565b9150509295989b509295989b9093969950565b60008060008060408587031215612ced57600080fd5b843567ffffffffffffffff811115612d0457600080fd5b612d10878288016125e2565b9450945050602085013567ffffffffffffffff811115612d2f57600080fd5b612d3b878288016125e2565b95989497509550505050565b600080600080600060608688031215612d5f57600080fd5b853567ffffffffffffffff811115612d7657600080fd5b612d82888289016125e2565b9550955050602086013567ffffffffffffffff811115612da157600080fd5b612dad888289016125e2565b93509350506040612809888289016125ca565b60008060408385031215612dd357600080fd5b823567ffffffffffffffff811115612dea57600080fd5b612df685828601612624565b925050602083013567ffffffffffffffff811115612e1357600080fd5b612e1f85828601612624565b9150509250929050565b600060408284031215612e3b57600080fd5b600061279984846126b9565b600060808284031215612e5957600080fd5b60006127998484612700565b600080600060608486031215612e7a57600080fd5b6000612e86868661276f565b9350506020612e97868287016125d6565b9250506040612ea8868287016125d6565b9150509250925092565b612ebb816136cb565b82525050565b6000612ecc826136c7565b808452602084019350612ede836136c1565b60005b82811015612f0e57612ef48683516131da565b612efd826136c1565b604096909601959150600101612ee1565b5093949350505050565b612ebb816136d7565b612ebb816136dc565b6000612f35826136c7565b808452612f498160208601602086016136f1565b612f528161371d565b9093016020019392505050565b601481527f506172616d6574657220697320696e76616c6964000000000000000000000000602082015260400190565b601f81527f696d706c656d656e746174696f6e20636f6e7472616374206e6f742073657400602082015260400190565b601581527f536166654d61746820616464206f766572666c6f770000000000000000000000602082015260400190565b601d81527f4e6577206f776e657220697320746865207a65726f2061646472657373000000602082015260400190565b601881527f536d61727420636f6e74726163742069732068616c7465640000000000000000602082015260400190565b601d81527f5369676e617475726520766572696669636174696f6e206661696c6564000000602082015260400190565b600981527f4e6f74206f776e65720000000000000000000000000000000000000000000000602082015260400190565b601381527f696e76616c696420736d6746656550726f787900000000000000000000000000602082015260400190565b600f81527f504b206973206e6f742072656164790000000000000000000000000000000000602082015260400190565b601681527f504b206973206e6f7420756e7265676973746572656400000000000000000000602082015260400190565b600981527f6e6f742061646d696e0000000000000000000000000000000000000000000000602082015260400190565b600b81527f466565206973206e756c6c000000000000000000000000000000000000000000602082015260400190565b9052565b805160608301906131b48482612f21565b5060208201516131c76020850182612f21565b5060408201516111056040850182612f21565b805160408301906131eb8482612f21565b5060208201516111056020850182612f21565b805160c083019061320f8482612f21565b5060208201516132226020850182612f21565b5060408201516132356040850182612f21565b5060608201516132486060850182612f21565b50608082015161325b6080850182612eb2565b5060a082015161110560a0850182612eb2565b805160009060e08401906132828582612f21565b5060208301516132956020860182612f21565b5060408301516132a86040860182612f21565b5060608301516132bb6060860182612f21565b5060808301516132ce6080860182612f21565b5060a08301516132e160a0860182612eb2565b5060c083015184820360c08601526132f98282612f2a565b95945050505050565b805160009060a08401906133168582612f21565b5060208301516133296020860182612f21565b50604083015161333c6040860182612f21565b50606083015161334f6060860182612f21565b50608083015184820360808601526132f98282612f2a565b602081016117ba8284612eb2565b60a081016133838288612eb2565b6133906020830187612eb2565b61339d6040830186612eb2565b6133aa6060830185612eb2565b6133b76080830184612eb2565b9695505050505050565b602080825281016117b78184612ec1565b602081016117ba8284612f18565b602081016117ba8284612f21565b602080825281016117ba81612f5f565b602080825281016117ba81612f8f565b602080825281016117ba81612fbf565b602080825281016117ba81612fef565b602080825281016117ba8161301f565b602080825281016117ba8161304f565b602080825281016117ba8161307f565b602080825281016117ba816130af565b602080825281016117ba816130df565b602080825281016117ba8161310f565b602080825281016117ba8161313f565b602080825281016117ba8161316f565b608081016134bc828561319f565b61228260208301846131a3565b60e081016134d7828561319f565b61228260208301846131fe565b604081016134f2828561319f565b8181036020830152612799818461326e565b60408101613512828561319f565b81810360208301526127998184613302565b604081016117ba82846131da565b606081016135408286612f21565b61354d6020830185612f21565b6127996040830184612f21565b60e08101613568828a612f21565b6135756020830189612f21565b6135826040830188612f21565b61358f6060830187612f21565b61359c6080830186612f21565b6135a960a0830185612f21565b6135b660c0830184612f21565b98975050505050505050565b60c081016135d08289612f21565b6135dd6020830188612f21565b6135ea6040830187612f21565b6135f76060830186612f21565b6136046080830185612eb2565b61361160a0830184612eb2565b979650505050505050565b6080810161362a8287612f21565b6136376020830186612f21565b6136446040830185612f21565b6132f96060830184612f21565b60405181810167ffffffffffffffff8111828210171561367057600080fd5b604052919050565b600067ffffffffffffffff82111561368f57600080fd5b5060209081020190565b600067ffffffffffffffff8211156136b057600080fd5b506020601f91909101601f19160190565b60200190565b5190565b600160a060020a031690565b151590565b90565b60ff1690565b82818337506000910152565b60005b8381101561370c5781810151838201526020016136f4565b838111156111055750506000910152565b601f01601f1916905600a265627a7a72305820277203a73e5dff1ccce4eb5d66d8802cef858acdb7146c55d9b24ef30e7772de6c6578706572696d656e74616cf50037
Deployed Bytecode
0x60806040526004361061017c5763ffffffff60e060020a6000350416630a72b1ab81146101d85780630ec61b79146101fa5780630f85626714610230578063257011b614610250578063361b31bf1461026357806341ff1bcc1461029057806345edb2bc146102a35780634cc7125b146102c35780634fb2e45d146102e357806354c0de4a1461030357806358cee0c4146103235780635c60da1b146103435780635ed061cc14610365578063704b6c0214610385578063715018a6146103a5578063715f250c146103ba57806373e29b0d146103e757806379ba50971461040d5780638061babf146104225780638da5cb5b14610442578063926731ea14610457578063a6f9dae114610477578063a8b3820514610497578063b179e1e7146104ac578063b9b8af0b146104c1578063d4ee1d90146104e3578063d52012bc146104f8578063e92e2c1b14610518578063ebba47971461052d578063ed8d47e61461054d578063f49543871461056d578063f851a4401461058d575b601554600160a060020a03168015156101b35760405160e560020a62461bcd0281526004016101aa906133fe565b60405180910390fd5b60405136600082376000803683855af43d806000843e8180156101d4578184f35b8184fd5b3480156101e457600080fd5b506101f86101f33660046127a1565b6105a2565b005b34801561020657600080fd5b5061021a610215366004612e29565b610693565b6040516102279190613524565b60405180910390f35b34801561023c57600080fd5b506101f861024b3660046129ca565b6106de565b6101f861025e366004612a96565b6108f2565b34801561026f57600080fd5b5061028361027e366004612858565b610b02565b60405161022791906133c1565b6101f861029e366004612b14565b610c4f565b3480156102af57600080fd5b506101f86102be36600461293a565b610e76565b3480156102cf57600080fd5b506101f86102de366004612cd7565b611066565b3480156102ef57600080fd5b506101f86102fe36600461277b565b61110b565b34801561030f57600080fd5b506101f861031e366004612e47565b6111dc565b34801561032f57600080fd5b506101f861033e3660046129ca565b611291565b34801561034f57600080fd5b50610358611365565b6040516102279190613367565b34801561037157600080fd5b506101f861038036600461293a565b611374565b34801561039157600080fd5b506101f86103a036600461277b565b61163f565b3480156103b157600080fd5b506101f86116c9565b3480156103c657600080fd5b506103da6103d53660046128fe565b61171b565b60405161022791906133e0565b3480156103f357600080fd5b506103fc61172d565b604051610227959493929190613375565b34801561041957600080fd5b506101f8611758565b34801561042e57600080fd5b506103da61043d366004612dc0565b6117a4565b34801561044e57600080fd5b506103586117c0565b34801561046357600080fd5b506101f8610472366004612d47565b6117d4565b34801561048357600080fd5b506101f861049236600461277b565b61187c565b3480156104a357600080fd5b506103da6118dd565b3480156104b857600080fd5b506103da6118e3565b3480156104cd57600080fd5b506104d66118e9565b60405161022791906133d2565b3480156104ef57600080fd5b506103586118f9565b34801561050457600080fd5b506101f861051336600461288d565b611908565b34801561052457600080fd5b506103da611af1565b34801561053957600080fd5b506101f8610548366004612816565b611af7565b34801561055957600080fd5b506101f86105683660046128fe565b611d44565b34801561057957600080fd5b506101f86105883660046128c2565b611d83565b34801561059957600080fd5b50610358611de4565b6013546101009004600160a060020a031633146105d45760405160e560020a62461bcd0281526004016101aa9061344e565b600160a060020a038516158015906105f45750600160a060020a03841615155b80156106085750600160a060020a03811615155b15156106295760405160e560020a62461bcd0281526004016101aa906133ee565b600b805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a0396871617909155600a805482169686169690961790955560098054861692851692909217909155600c8054851692841692909217909155600d80549093169116179055565b61069b612381565b81516000908152600f6020908152604080832082860180518552908352818420548552945183526010825280832094518352938152929020549181019190915290565b600060606106ea612398565b60145460009060a060020a900460ff161561071a5760405160e560020a62461bcd0281526004016101aa9061342e565b6107238c611df3565b809450819550505060c0604051908101604052808e6000191681526020018d6000191681526020018c81526020018b81526020018a600160a060020a0316815260200189600160a060020a03168152509150738d508595f094c42ade6d3625a206abe9551c58586325d82a9b6005846040518363ffffffff1660e060020a0281526004016107b29291906134c9565b60006040518083038186803b1580156107ca57600080fd5b505af41580156107de573d6000803e3d6000fd5b5050505060026016548e8d8d8d8d604051602001610801969594939291906135c2565b6040516020818303038152906040526040518082805190602001908083835b6020831061083f5780518252601f199092019160209182019101610820565b51815160209384036101000a600019018019909216911617905260405191909301945091925050808303816000865af1158015610880573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052506108a3919081019061291c565b90506108e38482858a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437508e9450611f029350505050565b50505050505050505050505050565b6108fa6123cd565b60145460a060020a900460ff16156109275760405160e560020a62461bcd0281526004016101aa9061342e565b600b546040517f95e8d68a000000000000000000000000000000000000000000000000000000008152879160009182918291600160a060020a03909116906395e8d68a906109799087906004016133e0565b606060405180830381600087803b15801561099357600080fd5b505af11580156109a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506109cb9190810190612e65565b9194509250905060ff831660051480156109e55750814210155b80156109f15750804211155b1515610a125760405160e560020a62461bcd0281526004016101aa9061346e565b60a0604051908101604052808b6000191681526020018a8152602001898152602001601654815260200188888080601f0160208091040260200160405190810160405280939291908181526020018383808284375050509290935250506040517f3535ca1d000000000000000000000000000000000000000000000000000000008152919650738d508595f094c42ade6d3625a206abe9551c585891633535ca1d9150610ac6906005908990600401613504565b60006040518083038186803b158015610ade57600080fd5b505af4158015610af2573d6000803e3d6000fd5b5050505050505050505050505050565b606060008251604051908082528060200260200182016040528015610b4157816020015b610b2e612381565b815260200190600190039081610b265790505b509150600090505b8251811015610c49576005600a0160008483815181101515610b6757fe5b9060200190602002015160000151815260200190815260200160002060008483815181101515610b9357fe5b90602001906020020151602001518152602001908152602001600020548282815181101515610bbe57fe5b60209081029091010151528251601090600090859084908110610bdd57fe5b9060200190602002015160000151815260200190815260200160002060008483815181101515610c0957fe5b90602001906020020151602001518152602001908152602001600020548282815181101515610c3457fe5b60209081029091018101510152600101610b49565b50919050565b610c57612400565b60145460a060020a900460ff1615610c845760405160e560020a62461bcd0281526004016101aa9061342e565b600b546040517f95e8d68a000000000000000000000000000000000000000000000000000000008152899160009182918291600160a060020a03909116906395e8d68a90610cd69087906004016133e0565b606060405180830381600087803b158015610cf057600080fd5b505af1158015610d04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d289190810190612e65565b9194509250905060ff83166005148015610d425750814210155b8015610d4e5750804211155b1515610d6f5760405160e560020a62461bcd0281526004016101aa9061346e565b60e0604051908101604052808d6000191681526020018c81526020018b815260200160165481526020018a815260200189600160a060020a0316815260200188888080601f0160208091040260200160405190810160405280939291908181526020018383808284375050509290935250506040517f3d391930000000000000000000000000000000000000000000000000000000008152919650738d508595f094c42ade6d3625a206abe9551c585891633d3919309150610e389060059089906004016134e4565b60006040518083038186803b158015610e5057600080fd5b505af4158015610e64573d6000803e3d6000fd5b50505050505050505050505050505050565b60006060610e8261244a565b60145460009060a060020a900460ff1615610eb25760405160e560020a62461bcd0281526004016101aa9061342e565b610ebb88611df3565b604080516060810182528d8152602081018d90528082018c905290517f2742675800000000000000000000000000000000000000000000000000000000815292965090945092507347be7cc7c13315fdd1bbf3dbab512af23961ba5390632742675890610f2f9060059086906004016134ae565b60006040518083038186803b158015610f4757600080fd5b505af4158015610f5b573d6000803e3d6000fd5b5050505060026016548b8b604051602001610f7893929190613532565b6040516020818303038152906040526040518082805190602001908083835b60208310610fb65780518252601f199092019160209182019101610f97565b51815160209384036101000a600019018019909216911617905260405191909301945091925050808303816000865af1158015610ff7573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525061101a919081019061291c565b905061105a8482858a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437508e9450611f029350505050565b50505050505050505050565b601754600160a060020a031633146110935760405160e560020a62461bcd0281526004016101aa9061348e565b61110584848080601f0160208091040260200160405190810160405280939291908181526020018383808284375050604080516020601f8a0181900481028201810190925288815294508893508792508291508401838280828437506000969594505063ffffffff61200d1692505050565b50505050565b6013546101009004600160a060020a0316331461113d5760405160e560020a62461bcd0281526004016101aa9061344e565b600160a060020a03811615156111685760405160e560020a62461bcd0281526004016101aa9061341e565b601354604051600160a060020a0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a360138054600160a060020a039092166101000274ffffffffffffffffffffffffffffffffffffffff0019909216919091179055565b601754600160a060020a031633146112095760405160e560020a62461bcd0281526004016101aa9061348e565b6040808201805183516000908152600f602090815284822081870180518452908252858320939093556060860180518751845260108352868420855185529092529185902055845191519251905193517f2c40e30353ae48a032fd20f1fece20031c1b80a2bc8512a2c172ff4de2e595199461128694929161361c565b60405180910390a150565b6000606061129d612398565b60145460009060a060020a900460ff16156112cd5760405160e560020a62461bcd0281526004016101aa9061342e565b6112d68c611df3565b809450819550505060c0604051908101604052808e6000191681526020018d6000191681526020018c81526020018b81526020018a600160a060020a0316815260200189600160a060020a03168152509150738d508595f094c42ade6d3625a206abe9551c5858636307afb16005846040518363ffffffff1660e060020a0281526004016107b29291906134c9565b601554600160a060020a031690565b6000606061138061244a565b60145460009060a060020a900460ff16156113b05760405160e560020a62461bcd0281526004016101aa9061342e565b600b546040517f95e8d68a000000000000000000000000000000000000000000000000000000008152899160009182918291600160a060020a03909116906395e8d68a906114029087906004016133e0565b606060405180830381600087803b15801561141c57600080fd5b505af1158015611430573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114549190810190612e65565b9194509250905060ff8316600514801561146e5750814210155b801561147a5750804211155b151561149b5760405160e560020a62461bcd0281526004016101aa9061346e565b6114a48d6120d3565b80985081995050506060604051908101604052808f6000191681526020018e6000191681526020018d6000191681525095507347be7cc7c13315fdd1bbf3dbab512af23961ba53639cb100d96005886040518363ffffffff1660e060020a0281526004016115139291906134ae565b60006040518083038186803b15801561152b57600080fd5b505af415801561153f573d6000803e3d6000fd5b5050505060026016548f8e60405160200161155c93929190613532565b6040516020818303038152906040526040518082805190602001908083835b6020831061159a5780518252601f19909201916020918201910161157b565b51815160209384036101000a600019018019909216911617905260405191909301945091925050808303816000865af11580156115db573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052506115fe919081019061291c565b9450610af28886898e8e8080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050508d611f02565b6013546101009004600160a060020a031633146116715760405160e560020a62461bcd0281526004016101aa9061344e565b6017805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790556040517f5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a190611286908390613367565b6013546101009004600160a060020a031633146116fb5760405160e560020a62461bcd0281526004016101aa9061344e565b6013805474ffffffffffffffffffffffffffffffffffffffff0019169055565b6000908152600e602052604090205490565b600a54600b54600c54600954600d54600160a060020a03948516959385169492831693918316921690565b601454600160a060020a03163314156117a25760145460138054600160a060020a039092166101000274ffffffffffffffffffffffffffffffffffffffff00199092169190911790555b565b60006117b781848463ffffffff6121bf16565b90505b92915050565b6013546101009004600160a060020a031681565b601754600160a060020a031633146118015760405160e560020a62461bcd0281526004016101aa9061348e565b61187585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375050604080516020601f8b0181900481028201810190925289815294508993508892508291508401838280828437506000969594508893505063ffffffff61228916915050565b5050505050565b6013546101009004600160a060020a031633146118ae5760405160e560020a62461bcd0281526004016101aa9061344e565b6014805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60115481565b60165481565b60145460a060020a900460ff1681565b601454600160a060020a031681565b601754600090600160a060020a031633146119385760405160e560020a62461bcd0281526004016101aa9061348e565b5060005b8151811015611aed57818181518110151561195357fe5b90602001906020020151604001516005600a016000848481518110151561197657fe5b90602001906020020151600001518152602001908152602001600020600084848151811015156119a257fe5b906020019060200201516020015181526020019081526020016000208190555081818151811015156119d057fe5b90602001906020020151606001516005600b01600084848151811015156119f357fe5b9060200190602002015160000151815260200190815260200160002060008484815181101515611a1f57fe5b90602001906020020151602001518152602001908152602001600020819055507f2c40e30353ae48a032fd20f1fece20031c1b80a2bc8512a2c172ff4de2e595198282815181101515611a6e57fe5b60209081029091010151518351849084908110611a8757fe5b90602001906020020151602001518484815181101515611aa357fe5b90602001906020020151604001518585815181101515611abf57fe5b9060200190602002015160600151604051611add949392919061361c565b60405180910390a160010161193c565b5050565b60125481565b600c546000908190600160a060020a031681811515611b24576013546101009004600160a060020a031691505b600160a060020a0382161515611b4f5760405160e560020a62461bcd0281526004016101aa9061345e565b5060005b84811015611c2b57600e6000878784818110611b6b57fe5b602090810292909201358352508101919091526040016000908120549350600e90878784818110611b9857fe5b60209081029290920135835250810191909152604001600090812055611bc4848463ffffffff61235116565b9350600160a060020a03821642878784818110611bdd57fe5b9050602002013560001916600019167f0a22c3968ae76dda4fe52e9571fd986b9475a0d480bb7df923542c5129ae972686604051611c1b91906133e0565b60405180910390a4600101611b53565b6000808052600e6020527fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c549350831115611c9f576000808052600e6020527fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c55611c9c848463ffffffff61235116565b93505b60008411611cc25760405160e560020a62461bcd0281526004016101aa9061349e565b604051600160a060020a0383169085156108fc029086906000818181858888f19350505050158015611cf8573d6000803e3d6000fd5b5081600160a060020a031642437f2bc8aa4aaa1151f04803c964b80ccbb87f081675ba88d0b13074220096cbe96387604051611d3491906133e0565b60405180910390a4505050505050565b601754600160a060020a03163314611d715760405160e560020a62461bcd0281526004016101aa9061348e565b6016541515611d805760168190555b50565b6013546101009004600160a060020a03163314611db55760405160e560020a62461bcd0281526004016101aa9061344e565b6014805491151560a060020a0274ff000000000000000000000000000000000000000019909216919091179055565b601754600160a060020a031681565b600b546040517f44cefb69000000000000000000000000000000000000000000000000000000008152600091606091839182918291600160a060020a0316906344cefb6990611e469089906004016133e0565b600060405180830381600087803b158015611e6057600080fd5b505af1158015611e74573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611e9c9190810190612bb9565b949e50919c50969a50985090965060059550611eb9945050505050565b60ff168360ff16148015611ecd5750814210155b8015611ed95750804211155b1515611efa5760405160e560020a62461bcd0281526004016101aa9061346e565b505050915091565b600080600080611f13876000612379565b9350611f20876020612379565b9250611f2d866000612379565b9150611f3a866020612379565b9050600560080160009054906101000a9004600160a060020a0316600160a060020a0316634587b7b48a87878787878f6040518863ffffffff1660e060020a028152600401611f8f979695949392919061355a565b602060405180830381600087803b158015611fa957600080fd5b505af1158015611fbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611fe191908101906128e0565b15156120025760405160e560020a62461bcd0281526004016101aa9061343e565b505050505050505050565b82600001826040518082805190602001908083835b602083106120415780518252601f199092019160209182019101612022565b51815160209384036101000a6000190180199092169116179052920194855250604051938490038101842085519094869450925082918401908083835b6020831061209d5780518252601f19909201916020918201910161207e565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220600090555050505050565b600b546040517f44cefb690000000000000000000000000000000000000000000000000000000081526000916060918391600160a060020a0316906344cefb69906121229087906004016133e0565b600060405180830381600087803b15801561213c57600080fd5b505af1158015612150573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526121789190810190612bb9565b50939b509099509597506006965061219295505050505050565b60ff8281169116146121b95760405160e560020a62461bcd0281526004016101aa9061347e565b50915091565b600083600001836040518082805190602001908083835b602083106121f55780518252601f1990920191602091820191016121d6565b51815160209384036101000a6000190180199092169116179052920194855250604051938490038101842086519094879450925082918401908083835b602083106122515780518252601f199092019160209182019101612232565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922054925050505b9392505050565b8084600001846040518082805190602001908083835b602083106122be5780518252601f19909201916020918201910161229f565b51815160209384036101000a6000190180199092169116179052920194855250604051938490038101842087519094889450925082918401908083835b6020831061231a5780518252601f1990920191602091820191016122fb565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922092909255505050505050565b6000828201838110156122825760405160e560020a62461bcd0281526004016101aa9061340e565b016020015190565b604080518082019091526000808252602082015290565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b60a06040519081016040528060008019168152602001600081526020016000815260200160008152602001606081525090565b60e06040519081016040528060008019168152602001600081526020016000815260200160008152602001600081526020016000600160a060020a03168152602001606081525090565b604080516060810182526000808252602082018190529181019190915290565b60006117b782356136cb565b600080601f8301841361248857600080fd5b50813567ffffffffffffffff8111156124a057600080fd5b6020830191508360208202830111156124b857600080fd5b9250929050565b6000601f820183136124d057600080fd5b81356124e36124de82613678565b613651565b9150818183526020840193506020810190508385604084028201111561250857600080fd5b60005b83811015612536578161251e88826126b9565b8452506020909201916040919091019060010161250b565b5050505092915050565b6000601f8201831361255157600080fd5b813561255f6124de82613678565b9150818183526020840193506020810190508385608084028201111561258457600080fd5b60005b83811015612536578161259a8882612700565b84525060209092019160809190910190600101612587565b60006117b782356136d7565b60006117b782516136d7565b60006117b782356136dc565b60006117b782516136dc565b600080601f830184136125f457600080fd5b50813567ffffffffffffffff81111561260c57600080fd5b6020830191508360018202830111156124b857600080fd5b6000601f8201831361263557600080fd5b81356126436124de82613699565b9150808252602083016020830185838301111561265f57600080fd5b61266a8382846136e5565b50505092915050565b6000601f8201831361268457600080fd5b81516126926124de82613699565b915080825260208301602083018583830111156126ae57600080fd5b61266a8382846136f1565b6000604082840312156126cb57600080fd5b6126d56040613651565b905060006126e384846125ca565b82525060206126f4848483016125ca565b60208301525092915050565b60006080828403121561271257600080fd5b61271c6080613651565b9050600061272a84846125ca565b825250602061273b848483016125ca565b602083015250604061274f848285016125ca565b6040830152506060612763848285016125ca565b60608301525092915050565b60006117b782516136df565b60006020828403121561278d57600080fd5b6000612799848461246a565b949350505050565b600080600080600060a086880312156127b957600080fd5b60006127c5888861246a565b95505060206127d68882890161246a565b94505060406127e78882890161246a565b93505060606127f88882890161246a565b92505060806128098882890161246a565b9150509295509295909350565b6000806020838503121561282957600080fd5b823567ffffffffffffffff81111561284057600080fd5b61284c85828601612476565b92509250509250929050565b60006020828403121561286a57600080fd5b813567ffffffffffffffff81111561288157600080fd5b612799848285016124bf565b60006020828403121561289f57600080fd5b813567ffffffffffffffff8111156128b657600080fd5b61279984828501612540565b6000602082840312156128d457600080fd5b600061279984846125b2565b6000602082840312156128f257600080fd5b600061279984846125be565b60006020828403121561291057600080fd5b600061279984846125ca565b60006020828403121561292e57600080fd5b600061279984846125d6565b60008060008060008060a0878903121561295357600080fd5b600061295f89896125ca565b965050602061297089828a016125ca565b955050604061298189828a016125ca565b945050606087013567ffffffffffffffff81111561299e57600080fd5b6129aa89828a016125e2565b935093505060806129bd89828a016125ca565b9150509295509295509295565b60008060008060008060008060006101008a8c0312156129e957600080fd5b60006129f58c8c6125ca565b9950506020612a068c828d016125ca565b9850506040612a178c828d016125ca565b9750506060612a288c828d016125ca565b9650506080612a398c828d0161246a565b95505060a0612a4a8c828d0161246a565b94505060c08a013567ffffffffffffffff811115612a6757600080fd5b612a738c828d016125e2565b935093505060e0612a868c828d016125ca565b9150509295985092959850929598565b600080600080600060808688031215612aae57600080fd5b6000612aba88886125ca565b9550506020612acb888289016125ca565b9450506040612adc888289016125ca565b935050606086013567ffffffffffffffff811115612af957600080fd5b612b05888289016125e2565b92509250509295509295909350565b600080600080600080600060c0888a031215612b2f57600080fd5b6000612b3b8a8a6125ca565b9750506020612b4c8a828b016125ca565b9650506040612b5d8a828b016125ca565b9550506060612b6e8a828b016125ca565b9450506080612b7f8a828b0161246a565b93505060a088013567ffffffffffffffff811115612b9c57600080fd5b612ba88a828b016125e2565b925092505092959891949750929550565b60008060008060008060008060008060006101608c8e031215612bdb57600080fd5b6000612be78e8e6125d6565b9b50506020612bf88e828f0161276f565b9a50506040612c098e828f016125d6565b9950506060612c1a8e828f016125d6565b9850506080612c2b8e828f016125d6565b97505060a0612c3c8e828f016125d6565b96505060c0612c4d8e828f016125d6565b95505060e08c015167ffffffffffffffff811115612c6a57600080fd5b612c768e828f01612673565b9450506101008c015167ffffffffffffffff811115612c9457600080fd5b612ca08e828f01612673565b935050610120612cb28e828f016125d6565b925050610140612cc48e828f016125d6565b9150509295989b509295989b9093969950565b60008060008060408587031215612ced57600080fd5b843567ffffffffffffffff811115612d0457600080fd5b612d10878288016125e2565b9450945050602085013567ffffffffffffffff811115612d2f57600080fd5b612d3b878288016125e2565b95989497509550505050565b600080600080600060608688031215612d5f57600080fd5b853567ffffffffffffffff811115612d7657600080fd5b612d82888289016125e2565b9550955050602086013567ffffffffffffffff811115612da157600080fd5b612dad888289016125e2565b93509350506040612809888289016125ca565b60008060408385031215612dd357600080fd5b823567ffffffffffffffff811115612dea57600080fd5b612df685828601612624565b925050602083013567ffffffffffffffff811115612e1357600080fd5b612e1f85828601612624565b9150509250929050565b600060408284031215612e3b57600080fd5b600061279984846126b9565b600060808284031215612e5957600080fd5b60006127998484612700565b600080600060608486031215612e7a57600080fd5b6000612e86868661276f565b9350506020612e97868287016125d6565b9250506040612ea8868287016125d6565b9150509250925092565b612ebb816136cb565b82525050565b6000612ecc826136c7565b808452602084019350612ede836136c1565b60005b82811015612f0e57612ef48683516131da565b612efd826136c1565b604096909601959150600101612ee1565b5093949350505050565b612ebb816136d7565b612ebb816136dc565b6000612f35826136c7565b808452612f498160208601602086016136f1565b612f528161371d565b9093016020019392505050565b601481527f506172616d6574657220697320696e76616c6964000000000000000000000000602082015260400190565b601f81527f696d706c656d656e746174696f6e20636f6e7472616374206e6f742073657400602082015260400190565b601581527f536166654d61746820616464206f766572666c6f770000000000000000000000602082015260400190565b601d81527f4e6577206f776e657220697320746865207a65726f2061646472657373000000602082015260400190565b601881527f536d61727420636f6e74726163742069732068616c7465640000000000000000602082015260400190565b601d81527f5369676e617475726520766572696669636174696f6e206661696c6564000000602082015260400190565b600981527f4e6f74206f776e65720000000000000000000000000000000000000000000000602082015260400190565b601381527f696e76616c696420736d6746656550726f787900000000000000000000000000602082015260400190565b600f81527f504b206973206e6f742072656164790000000000000000000000000000000000602082015260400190565b601681527f504b206973206e6f7420756e7265676973746572656400000000000000000000602082015260400190565b600981527f6e6f742061646d696e0000000000000000000000000000000000000000000000602082015260400190565b600b81527f466565206973206e756c6c000000000000000000000000000000000000000000602082015260400190565b9052565b805160608301906131b48482612f21565b5060208201516131c76020850182612f21565b5060408201516111056040850182612f21565b805160408301906131eb8482612f21565b5060208201516111056020850182612f21565b805160c083019061320f8482612f21565b5060208201516132226020850182612f21565b5060408201516132356040850182612f21565b5060608201516132486060850182612f21565b50608082015161325b6080850182612eb2565b5060a082015161110560a0850182612eb2565b805160009060e08401906132828582612f21565b5060208301516132956020860182612f21565b5060408301516132a86040860182612f21565b5060608301516132bb6060860182612f21565b5060808301516132ce6080860182612f21565b5060a08301516132e160a0860182612eb2565b5060c083015184820360c08601526132f98282612f2a565b95945050505050565b805160009060a08401906133168582612f21565b5060208301516133296020860182612f21565b50604083015161333c6040860182612f21565b50606083015161334f6060860182612f21565b50608083015184820360808601526132f98282612f2a565b602081016117ba8284612eb2565b60a081016133838288612eb2565b6133906020830187612eb2565b61339d6040830186612eb2565b6133aa6060830185612eb2565b6133b76080830184612eb2565b9695505050505050565b602080825281016117b78184612ec1565b602081016117ba8284612f18565b602081016117ba8284612f21565b602080825281016117ba81612f5f565b602080825281016117ba81612f8f565b602080825281016117ba81612fbf565b602080825281016117ba81612fef565b602080825281016117ba8161301f565b602080825281016117ba8161304f565b602080825281016117ba8161307f565b602080825281016117ba816130af565b602080825281016117ba816130df565b602080825281016117ba8161310f565b602080825281016117ba8161313f565b602080825281016117ba8161316f565b608081016134bc828561319f565b61228260208301846131a3565b60e081016134d7828561319f565b61228260208301846131fe565b604081016134f2828561319f565b8181036020830152612799818461326e565b60408101613512828561319f565b81810360208301526127998184613302565b604081016117ba82846131da565b606081016135408286612f21565b61354d6020830185612f21565b6127996040830184612f21565b60e08101613568828a612f21565b6135756020830189612f21565b6135826040830188612f21565b61358f6060830187612f21565b61359c6080830186612f21565b6135a960a0830185612f21565b6135b660c0830184612f21565b98975050505050505050565b60c081016135d08289612f21565b6135dd6020830188612f21565b6135ea6040830187612f21565b6135f76060830186612f21565b6136046080830185612eb2565b61361160a0830184612eb2565b979650505050505050565b6080810161362a8287612f21565b6136376020830186612f21565b6136446040830185612f21565b6132f96060830184612f21565b60405181810167ffffffffffffffff8111828210171561367057600080fd5b604052919050565b600067ffffffffffffffff82111561368f57600080fd5b5060209081020190565b600067ffffffffffffffff8211156136b057600080fd5b506020601f91909101601f19160190565b60200190565b5190565b600160a060020a031690565b151590565b90565b60ff1690565b82818337506000910152565b60005b8381101561370c5781810151838201526020016136f4565b838111156111055750506000910152565b601f01601f1916905600a265627a7a72305820277203a73e5dff1ccce4eb5d66d8802cef858acdb7146c55d9b24ef30e7772de6c6578706572696d656e74616cf50037
Library Used
HTLCDebtLibV2 : 0x47be7cc7c13315fdd1bbf3dbab512af23961ba53RapidityLibV2 : 0x8d508595f094c42ade6d3625a206abe9551c5858
Deployed ByteCode Sourcemap
65569:18580:0:-;;;;;;;;;-1:-1:-1;;;65569:18580:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1349:15;;-1:-1:-1;;;;;1349:15:0;1383:19;;;1375:63;;;;-1:-1:-1;;;;;1375:63:0;;;;;;;;;;;;;;;;;1492:4;1486:11;1532:12;1529:1;1524:3;1511:34;1620:1;1617;1603:12;1598:3;1591:5;1586:3;1573:49;1648:14;1699:4;1696:1;1691:3;1676:28;1727:6;1747:28;;;;1811:4;1806:3;1799:17;1747:28;1768:4;1763:3;1756:17;77036:783;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;77036:783:0;;;;;;;;;;;79796:261;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;79796:261:0;;;;;;;;;;;;;;;;;;;;;;;;;71755:859;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;71755:859:0;;;;;;;;;68102:526;;;;;;;;;;80298:417;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;80298:417:0;;;;;;;;;;;;;;;;;69051:625;;;;;;;;;;74134:647;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;74134:647:0;;;;;;;;;76405:128;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;76405:128:0;;;;;;;;;3470:225;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3470:225:0;;;;;;;;;74951:360;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;74951:360:0;;;;;;;;;70288:847;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;70288:847:0;;;;;;;;;1188:97;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1188:97:0;;;;;;;;;;;;73030:690;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;73030:690:0;;;;;;;;;76106:136;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;76106:136:0;;;;;;;;;4168:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4168:83:0;;;;79428:129;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;79428:129:0;;;;;;;;;;;;;;;;;81215:457;;8:9:-1;5:2;;;30:1;27;20:12;5:2;81215:457:0;;;;;;;;;;;;;;;;4037:123;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4037:123:0;;;;79040:136;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;79040:136:0;;;;;;;;;3269:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3269:20:0;;;;76250:147;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;76250:147:0;;;;;;;;;3933:96;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3933:96:0;;;;;;;;;43720:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43720:38:0;;;;45492:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45492:29:0;;;;5306:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5306:26:0;;;;;;;;;;;;3438:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3438:23:0;;;;75483:457;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;75483:457:0;;;;;;;;;44012:47;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44012:47:0;;;;77990:1012;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;77990:1012:0;;;;;;;;;75948:150;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;75948:150:0;;;;;;;;;5664:100;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5664:100:0;;;;;;;;;45528:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45528:20:0;;;;77036:783;3222:5;;;;;-1:-1:-1;;;;;3222:5:0;3208:10;:19;3200:41;;;;-1:-1:-1;;;;;3200:41:0;;;;;;;;;-1:-1:-1;;;;;77392:26:0;;;;;;:57;;-1:-1:-1;;;;;;77422:27:0;;;;77392:57;:86;;;;-1:-1:-1;;;;;;77453:25:0;;;;77392:86;77384:132;;;;;;-1:-1:-1;;;;;77384:132:0;;;;;;;;;77529:25;:57;;-1:-1:-1;;77529:57:0;;;-1:-1:-1;;;;;77529:57:0;;;;;;;77597:24;:54;;;;;;;;;;;;;;77662:17;:33;;;;;;;;;;;;;;77706:23;:37;;;;;;;;;;;;;;77754:23;:57;;;;;;;;;;77036:783::o;79796:261::-;79852:17;;:::i;:::-;79927:16;;79900:44;;;;:26;:44;;;;;;;;79945:17;;;;;79900:63;;;;;;;;;79882:81;;80013:16;;79989:41;;:23;:41;;;;;80031:17;;79989:60;;;;;;;;;79974:12;;;:75;;;;79882:3;79796:261::o;71755:859::-;71954:12;71977:15;72058:52;;:::i;:::-;5382:6;;72447:13;;-1:-1:-1;;;5382:6:0;;;;5381:7;5373:44;;;;-1:-1:-1;;;;;5373:44:0;;;;;;;;;72019:26;72039:5;72019:19;:26::i;:::-;72003:42;;;;;;;;72113:265;;;;;;;;;72177:8;72113:265;;;;;;;72207:5;72113:265;;;;;;;72240:11;72113:265;;;;72273:5;72113:265;;;;72311:12;-1:-1:-1;;;;;72113:265:0;;;;;72355:11;-1:-1:-1;;;;;72113:265:0;;;;72058:320;;72389:13;:24;72414:11;72427:6;72389:45;;;;;-1:-1:-1;;;72389:45:0;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;72389:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;72389:45:0;;;;72463:91;72481:14;;72497:8;72507:11;72520:5;72527:12;72541:11;72470:83;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;72470:83:0;;;72463:91;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;72463:91:0;;;;;;;-1:-1:-1;263:2;;-1:-1;;72463:91:0;;;;-1:-1:-1;72463:91:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;72463:91:0;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;72463:91:0;;;;;;;;;72447:107;;72565:41;72581:7;72590:5;72597:2;72601:1;;72565:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;72604:1:0;;-1:-1:-1;72565:15:0;;-1:-1:-1;;;;72565:41:0:i;:::-;71755:859;;;;;;;;;;;;;:::o;68102:526::-;68283:50;;:::i;:::-;5382:6;;-1:-1:-1;;;5382:6:0;;;;5381:7;5373:44;;;;-1:-1:-1;;;;;5373:44:0;;;;;;;;;67419:25;;:55;;;;;68260:5;;67319:12;;;;;;-1:-1:-1;;;;;67419:25:0;;;;:48;;:55;;68260:5;;67419:55;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;67419:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;67419:55:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;67419:55:0;;;;;;;;;67390:84;;-1:-1:-1;67390:84:0;-1:-1:-1;67390:84:0;-1:-1:-1;67495:34:0;;;67511:17;67495:34;:54;;;;;67540:9;67533:3;:16;;67495:54;:72;;;;;67560:7;67553:3;:14;;67495:72;67487:100;;;;;;-1:-1:-1;;;;;67487:100:0;;;;;;;;;68336:230;;;;;;;;;68395:5;68336:230;;;;;;;68428:11;68336:230;;;;68461:5;68336:230;;;;68497:14;;68336:230;;;;68543:11;;68336:230;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;68336:230:0;;;;-1:-1:-1;;68577:43:0;;;;;68283:283;;-1:-1:-1;68577:13:0;;:22;;-1:-1:-1;68577:43:0;;68600:11;;68283:283;;68577:43;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;68577:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;68577:43:0;;;;5428:1;;;;68102:526;;;;;;:::o;80298:417::-;80359:21;80450:6;80420;:13;80400:34;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;80393:41;;80459:1;80450:10;;80445:263;80466:6;:13;80462:1;:17;80445:263;;;80523:11;:26;;:48;80550:6;80557:1;80550:9;;;;;;;;;;;;;;;;;;:20;;;80523:48;;;;;;;;;;;:71;80572:6;80579:1;80572:9;;;;;;;;;;;;;;;;;;:21;;;80523:71;;;;;;;;;;;;80501:4;80506:1;80501:7;;;;;;;;;;;;;;;;;;;:93;80652:9;;80628:23;;80501:19;;80652:6;;80659:1;;80652:9;;;;;;;;;;;;;;:20;;;80628:45;;;;;;;;;;;:68;80674:6;80681:1;80674:9;;;;;;;;;;;;;;;;;;:21;;;80628:68;;;;;;;;;;;;80609:4;80614:1;80609:7;;;;;;;;;;;;;;;;;;;;:16;:87;80481:3;;80445:263;;;80298:417;;;;:::o;69051:625::-;69264:50;;:::i;:::-;5382:6;;-1:-1:-1;;;5382:6:0;;;;5381:7;5373:44;;;;-1:-1:-1;;;;;5373:44:0;;;;;;;;;67419:25;;:55;;;;;69241:5;;67319:12;;;;;;-1:-1:-1;;;;;67419:25:0;;;;:48;;:55;;69241:5;;67419:55;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;67419:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;67419:55:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;67419:55:0;;;;;;;;;67390:84;;-1:-1:-1;67390:84:0;-1:-1:-1;67390:84:0;-1:-1:-1;67495:34:0;;;67511:17;67495:34;:54;;;;;67540:9;67533:3;:16;;67495:54;:72;;;;;67560:7;67553:3;:14;;67495:72;67487:100;;;;;;-1:-1:-1;;;;;67487:100:0;;;;;;;;;69317:297;;;;;;;;;69376:5;69317:297;;;;;;;69409:11;69317:297;;;;69442:5;69317:297;;;;69501:14;;69317:297;;;;69467:3;69317:297;;;;69547:12;-1:-1:-1;;;;;69317:297:0;;;;;69591:11;;69317:297;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;69317:297:0;;;;-1:-1:-1;;69625:43:0;;;;;69264:350;;-1:-1:-1;69625:13:0;;:22;;-1:-1:-1;69625:43:0;;69648:11;;69264:350;;69625:43;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;69625:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;69625:43:0;;;;5428:1;;;;69051:625;;;;;;;;:::o;74134:647::-;74284:12;74307:15;74392:43;;:::i;:::-;5382:6;;74651:13;;-1:-1:-1;;;5382:6:0;;;;5381:7;5373:44;;;;-1:-1:-1;;;;;5373:44:0;;;;;;;;;74349:30;74369:9;74349:19;:30::i;:::-;74438:143;;;;;;;;;;;;;;;;;;;;;;;74592:46;;;;;74333;;-1:-1:-1;74333:46:0;;-1:-1:-1;74438:143:0;-1:-1:-1;74592:13:0;;:25;;:46;;74618:11;;74438:143;;74592:46;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;74592:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;74592:46:0;;;;74667:54;74685:14;;74701:8;74711;74674:46;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;74674:46:0;;;74667:54;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;74667:54:0;;;;;;;-1:-1:-1;263:2;;-1:-1;;74667:54:0;;;;-1:-1:-1;74667:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;74667:54:0;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;74667:54:0;;;;;;;;;74651:70;;74732:41;74748:7;74757:5;74764:2;74768:1;;74732:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;74771:1:0;;-1:-1:-1;74732:15:0;;-1:-1:-1;;;;74732:41:0:i;:::-;74134:647;;;;;;;;;;:::o;76405:128::-;67071:5;;-1:-1:-1;;;;;67071:5:0;67057:10;:19;67049:41;;;;-1:-1:-1;;;;;67049:41:0;;;;;;;;;76491:34;76511:3;;76491:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;76491:34:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;76516:8:0;;-1:-1:-1;76516:8:0;;-1:-1:-1;76516:8:0;;-1:-1:-1;76491:34:0;;76516:8;;;;76491:34;;-1:-1:-1;76491:8:0;;:34;;-1:-1:-1;;76491:34:0;:19;:34;;-1:-1:-1;;;76491:34:0:i;:::-;76405:128;;;;:::o;3470:225::-;3222:5;;;;;-1:-1:-1;;;;;3222:5:0;3208:10;:19;3200:41;;;;-1:-1:-1;;;;;3200:41:0;;;;;;;;;-1:-1:-1;;;;;3548:23:0;;;;3540:65;;;;-1:-1:-1;;;;;3540:65:0;;;;;;;;;3642:5;;3621:38;;-1:-1:-1;;;;;3621:38:0;;;;3642:5;;;;;3621:38;;;;;3670:5;:17;;-1:-1:-1;;;;;3670:17:0;;;;;-1:-1:-1;;3670:17:0;;;;;;;;;3470:225::o;74951:360::-;67071:5;;-1:-1:-1;;;;;67071:5:0;67057:10;:19;67049:41;;;;-1:-1:-1;;;;;67049:41:0;;;;;;;;;75104:17;;;;;;75065:16;;75038:44;;;;:26;:44;;;;;;;75083:17;;;;;75038:63;;;;;;;;:83;;;;75195:14;;;;;75156:16;;75132:41;;:23;:41;;;;;75174:17;;75132:60;;;;;;;;;:77;75232:16;;75250:17;;75269;;75288:14;;75225:78;;;;;;75250:17;75269;75225:78;;;;;;;;;;74951:360;:::o;70288:847::-;70484:12;70507:15;70588:49;;:::i;:::-;5382:6;;70968:13;;-1:-1:-1;;;5382:6:0;;;;5381:7;5373:44;;;;-1:-1:-1;;;;;5373:44:0;;;;;;;;;70549:26;70569:5;70549:19;:26::i;:::-;70533:42;;;;;;;;70640:262;;;;;;;;;70701:8;70640:262;;;;;;;70731:5;70640:262;;;;;;;70764:11;70640:262;;;;70797:5;70640:262;;;;70835:12;-1:-1:-1;;;;;70640:262:0;;;;;70879:11;-1:-1:-1;;;;;70640:262:0;;;;70588:314;;70913:13;:21;70935:11;70948:6;70913:42;;;;;-1:-1:-1;;;70913:42:0;;;;;;;;;;;1188:97;1262:15;;-1:-1:-1;;;;;1262:15:0;1188:97;:::o;73030:690::-;73214:12;73237:15;73328:43;;:::i;:::-;5382:6;;73589:13;;-1:-1:-1;;;5382:6:0;;;;5381:7;5373:44;;;;-1:-1:-1;;;;;5373:44:0;;;;;;;;;67419:25;;:55;;;;;73187:9;;67319:12;;;;;;-1:-1:-1;;;;;67419:25:0;;;;:48;;:55;;73187:9;;67419:55;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;67419:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;67419:55:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;67419:55:0;;;;;;;;;67390:84;;-1:-1:-1;67390:84:0;-1:-1:-1;67390:84:0;-1:-1:-1;67495:34:0;;;67511:17;67495:34;:54;;;;;67540:9;67533:3;:16;;67495:54;:72;;;;;67560:7;67553:3;:14;;67495:72;67487:100;;;;;;-1:-1:-1;;;;;67487:100:0;;;;;;;;;73279:36;73306:8;73279:26;:36::i;:::-;73263:52;;;;;;;;73374:143;;;;;;;;;73429:8;73374:143;;;;;;;73462:8;73374:143;;;;;;;73496:9;73374:143;;;;;;73328:189;;73528:13;:27;73556:11;73569:6;73528:48;;;;;-1:-1:-1;;;73528:48:0;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;73528:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;73528:48:0;;;;73605:55;73623:14;;73639:8;73649:9;73612:47;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;73612:47:0;;;73605:55;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;73605:55:0;;;;;;;-1:-1:-1;263:2;;-1:-1;;73605:55:0;;;;-1:-1:-1;73605:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;73605:55:0;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;73605:55:0;;;;;;;;;73589:71;;73671:41;73687:7;73696:5;73703:2;73707:1;;73671:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73710:1;73671:15;:41::i;76106:136::-;3222:5;;;;;-1:-1:-1;;;;;3222:5:0;3208:10;:19;3200:41;;;;-1:-1:-1;;;;;3200:41:0;;;;;;;;;76176:5;:20;;-1:-1:-1;;76176:20:0;-1:-1:-1;;;;;76176:20:0;;;;;76212:22;;;;;;76176:20;;76212:22;;4168:83;3222:5;;;;;-1:-1:-1;;;;;3222:5:0;3208:10;:19;3200:41;;;;-1:-1:-1;;;;;3200:41:0;;;;;;;;;4225:5;:18;;-1:-1:-1;;4225:18:0;;;4168:83::o;79428:129::-;79489:8;79516:33;;;:26;:33;;;;;;;79428:129::o;81215:457::-;81428:24;;81488:25;;81539:23;;81589:17;;81640:23;;-1:-1:-1;;;;;81428:24:0;;;;81488:25;;;;81539:23;;;;81589:17;;;;81640:23;;81215:457::o;4037:123::-;4100:8;;-1:-1:-1;;;;;4100:8:0;4086:10;:22;4082:71;;;4133:8;;4125:5;:16;;-1:-1:-1;;;;;4133:8:0;;;;4125:16;-1:-1:-1;;4125:16:0;;;;;;;;;4082:71;4037:123::o;79040:136::-;79110:4;79134:34;79110:4;79154:3;79159:8;79134:34;:19;:34;:::i;:::-;79127:41;;79040:136;;;;;:::o;3269:20::-;;;;;;-1:-1:-1;;;;;3269:20:0;;:::o;76250:147::-;67071:5;;-1:-1:-1;;;;;67071:5:0;67057:10;:19;67049:41;;;;-1:-1:-1;;;;;67049:41:0;;;;;;;;;76348;76368:3;;76348:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;76348:41:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;76373:8:0;;-1:-1:-1;76373:8:0;;-1:-1:-1;76373:8:0;;-1:-1:-1;76348:41:0;;76373:8;;;;76348:41;;-1:-1:-1;76348:8:0;;:41;;-1:-1:-1;76383:5:0;;-1:-1:-1;;76348:41:0;:19;:41;;-1:-1:-1;;76348:41:0:i;:::-;76250:147;;;;;:::o;3933:96::-;3222:5;;;;;-1:-1:-1;;;;;3222:5:0;3208:10;:19;3200:41;;;;-1:-1:-1;;;;;3200:41:0;;;;;;;;;4001:8;:20;;-1:-1:-1;;4001:20:0;-1:-1:-1;;;;;4001:20:0;;;;;;;;;;3933:96::o;43720:38::-;;;;:::o;45492:29::-;;;;:::o;5306:26::-;;;-1:-1:-1;;;5306:26:0;;;;;:::o;3438:23::-;;;-1:-1:-1;;;;;3438:23:0;;:::o;75483:457::-;67071:5;;75557:6;;-1:-1:-1;;;;;67071:5:0;67057:10;:19;67049:41;;;;-1:-1:-1;;;;;67049:41:0;;;;;;;;;-1:-1:-1;75566:1:0;75552:381;75573:6;:13;75569:1;:17;75552:381;;;75682:6;75689:1;75682:9;;;;;;;;;;;;;;;;;;:21;;;75608:11;:26;;:48;75635:6;75642:1;75635:9;;;;;;;;;;;;;;;;;;:20;;;75608:48;;;;;;;;;;;:71;75657:6;75664:1;75657:9;;;;;;;;;;;;;;;;;;:21;;;75608:71;;;;;;;;;;;:95;;;;75789:6;75796:1;75789:9;;;;;;;;;;;;;;;;;;:18;;;75718:11;:23;;:45;75742:6;75749:1;75742:9;;;;;;;;;;;;;;;;;;:20;;;75718:45;;;;;;;;;;;:68;75764:6;75771:1;75764:9;;;;;;;;;;;;;;;;;;:21;;;75718:68;;;;;;;;;;;:89;;;;75827:94;75834:6;75841:1;75834:9;;;;;;;;;;;;;;;;;;;:20;75856:9;;:6;;75863:1;;75856:9;;;;;;;;;;;;;;:21;;;75879:6;75886:1;75879:9;;;;;;;;;;;;;;;;;;:21;;;75902:6;75909:1;75902:9;;;;;;;;;;;;;;;;;;:18;;;75827:94;;;;;;;;;;;;;;;;;;75588:3;;75552:381;;;75483:457;;:::o;44012:47::-;;;;:::o;77990:1012::-;78120:23;;78053:8;;;;-1:-1:-1;;;;;78120:23:0;78053:8;78158:25;;78154:77;;;78214:5;;;;;-1:-1:-1;;;;;78214:5:0;;-1:-1:-1;78154:77:0;-1:-1:-1;;;;;78249:25:0;;;;78241:57;;;;-1:-1:-1;;;;;78241:57:0;;;;;;;;;-1:-1:-1;78325:1:0;78311:310;78328:17;;;78311:310;;;78380:26;:37;78407:6;;78414:1;78407:9;;;;;;;;;;;;;;;;78380:37;;-1:-1:-1;78380:37:0;;;;;;;;78407:9;78380:37;;;;;-1:-1:-1;78439:26:0;;78466:6;;78473:1;78466:9;;;;;;;;;;;;;;;;78439:37;;-1:-1:-1;78439:37:0;;;;;;;;78466:9;78439:37;;;78432:44;78497:19;:3;78505:10;78497:19;:7;:19;:::i;:::-;78491:25;-1:-1:-1;;;;;;78536:73:0;;78568:15;78557:6;;78564:1;78557:9;;;;;;;;;;;;;;;;78536:73;;;;78598:10;78536:73;;;;;;;;;;;;;;;78347:3;;78311:310;;;78644:38;;;;:26;:38;;;;;-1:-1:-1;78697:14:0;;78693:132;;;78735:38;;;;:26;:38;;;78728:45;78794:19;:3;78802:10;78794:19;:7;:19;:::i;:::-;78788:25;;78693:132;78849:1;78843:7;;78835:31;;;;-1:-1:-1;;;;;78835:31:0;;;;;;;;;78879:25;;-1:-1:-1;;;;;78879:20:0;;;:25;;;;;78900:3;;78879:25;;;;78900:3;78879:20;:25;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;78879:25:0;78977:11;-1:-1:-1;;;;;78920:74:0;78960:15;78946:12;78920:74;78990:3;78920:74;;;;;;;;;;;;;;;77990:1012;;;;;;:::o;75948:150::-;67071:5;;-1:-1:-1;;;;;67071:5:0;67057:10;:19;67049:41;;;;-1:-1:-1;;;;;67049:41:0;;;;;;;;;76019:14;;:19;76015:76;;;76055:14;:24;;;76015:76;75948:150;:::o;5664:100::-;3222:5;;;;;-1:-1:-1;;;;;3222:5:0;3208:10;:19;3200:41;;;;-1:-1:-1;;;;;3200:41:0;;;;;;;;;5743:6;:13;;;;;-1:-1:-1;;;5743:13:0;-1:-1:-1;;5743:13:0;;;;;;;;;5664:100::o;45528:20::-;;;-1:-1:-1;;;;;45528:20:0;;:::o;82027:467::-;82285:25;;:55;;;;;82121:12;;82135:15;;82121:12;;;;;;-1:-1:-1;;;;;82285:25:0;;:48;;:55;;82334:5;;82285:55;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;82285:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;82285:55:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;82285:55:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;82285:55:0;;;;;;;;;82239:101;;-1:-1:-1;82239:101:0;;-1:-1:-1;82239:101:0;;-1:-1:-1;82239:101:0;-1:-1:-1;82239:101:0;;-1:-1:-1;82377:17:0;;-1:-1:-1;82371:24:0;;-1:-1:-1;;;;;82371:24:0;;82361:34;;:6;:34;;;:54;;;;;82406:9;82399:3;:16;;82361:54;:72;;;;;82426:7;82419:3;:14;;82361:72;82353:100;;;;;;-1:-1:-1;;;;;82353:100:0;;;;;;;;;82027:467;;;;;;:::o;83735:411::-;83841:11;83887;83936:10;83980;83855:21;83870:2;83874:1;83855:14;:21::i;:::-;83841:35;;83901:22;83916:2;83920;83901:14;:22::i;:::-;83887:36;;83949:20;83964:1;83967;83949:14;:20::i;:::-;83936:33;;83993:21;84008:1;84011:2;83993:14;:21::i;:::-;83980:34;;84035:11;:23;;;;;;;;;;-1:-1:-1;;;;;84035:23:0;-1:-1:-1;;;;;84035:30:0;;84066:7;84075:1;84078:3;84083;84088:2;84092;84096:7;84035:69;;;;;-1:-1:-1;;;84035:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;84035:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;84035:69:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;84035:69:0;;;;;;;;;84027:111;;;;;;-1:-1:-1;;;;;84027:111:0;;;;;;;;;83735:411;;;;;;;;;:::o;8990:147::-;9101:4;:13;;9115:3;9101:18;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;9101:18:0;;;;;-1:-1:-1;9101:18:0;;;;;;;;;;:28;;:18;;:28;;-1:-1:-1;9101:18:0;-1:-1:-1;9101:18:0;;:28;;;;:18;:28;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;9101:28:0;;;;;-1:-1:-1;9101:28:0;;;;;;;;;;-1:-1:-1;9094:35:0;;-1:-1:-1;;;;;8990:147:0:o;82802:353::-;83003:25;;:55;;;;;82903:12;;82917:15;;82903:12;;-1:-1:-1;;;;;83003:25:0;;:48;;:55;;83052:5;;83003:55;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;83003:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;83003:55:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;83003:55:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;83003:55:0;;;;;;;;;-1:-1:-1;82973:85:0;;-1:-1:-1;82973:85:0;;-1:-1:-1;82973:85:0;;-1:-1:-1;83095:24:0;;-1:-1:-1;83089:31:0;;-1:-1:-1;;;;;;83089:31:0;;83079:41;;;;;;;83071:76;;;;-1:-1:-1;;;;;83071:76:0;;;;;;;;;82802:353;;;;:::o;8815:167::-;8922:4;8946;:13;;8960:3;8946:18;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;8946:18:0;;;;;-1:-1:-1;8946:18:0;;;;;;;;;;:28;;:18;;:28;;-1:-1:-1;8946:18:0;-1:-1:-1;8946:18:0;;:28;;;;:18;:28;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;8946:28:0;;;;;-1:-1:-1;8946:28:0;;;;;;;;;;;;-1:-1:-1;;;8815:167:0;;;;;;:::o;8647:160::-;8794:5;8763:4;:13;;8777:3;8763:18;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;8763:18:0;;;;;-1:-1:-1;8763:18:0;;;;;;;;;;:28;;:18;;:28;;-1:-1:-1;8763:18:0;-1:-1:-1;8763:18:0;;:28;;;;:18;:28;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;8763:28:0;;;;;-1:-1:-1;8763:28:0;;;;;;;;;;:36;;;;-1:-1:-1;;;;;;8647:160:0:o;22245:175::-;22303:7;22335:5;;;22359:6;;;;22351:40;;;;-1:-1:-1;;;;;22351:40:0;;;;;;;;83302:185;83449:14;83465:2;83445:23;83439:30;;83414:66::o;65569:18580::-;;;;;;;;;;-1:-1:-1;65569:18580:0;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;65569:18580:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;65569:18580:0;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;65569:18580:0;;;;;;;;;;;;;;;;;:::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;148:352;;;271:4;259:17;;255:27;-1:-1;245:2;;296:1;293;286:12;245:2;-1:-1;316:20;;356:18;345:30;;342:2;;;388:1;385;378:12;342:2;422:4;414:6;410:17;398:29;;473:3;465:4;457:6;453:17;443:8;439:32;436:41;433:2;;;490:1;487;480:12;433:2;238:262;;;;;;553:785;;689:4;677:17;;673:27;-1:-1;663:2;;714:1;711;704:12;663:2;751:6;738:20;773:106;788:90;871:6;788:90;;;773:106;;;764:115;;896:5;921:6;914:5;907:21;951:4;943:6;939:17;929:27;;973:4;968:3;964:14;957:21;;1026:6;1073:3;1065:4;1057:6;1053:17;1048:3;1044:27;1041:36;1038:2;;;1090:1;1087;1080:12;1038:2;1115:1;1100:232;1125:6;1122:1;1119:13;1100:232;;;1183:3;1205:63;1264:3;1252:10;1205:63;;;1193:76;;-1:-1;1292:4;1283:14;;;;1320:4;1311:14;;;;;1147:1;1140:9;1100:232;;;1104:14;656:682;;;;;;;;1391:785;;1527:4;1515:17;;1511:27;-1:-1;1501:2;;1552:1;1549;1542:12;1501:2;1589:6;1576:20;1611:106;1626:90;1709:6;1626:90;;1611:106;1602:115;;1734:5;1759:6;1752:5;1745:21;1789:4;1781:6;1777:17;1767:27;;1811:4;1806:3;1802:14;1795:21;;1864:6;1911:3;1903:4;1895:6;1891:17;1886:3;1882:27;1879:36;1876:2;;;1928:1;1925;1918:12;1876:2;1953:1;1938:232;1963:6;1960:1;1957:13;1938:232;;;2021:3;2043:63;2102:3;2090:10;2043:63;;;2031:76;;-1:-1;2130:4;2121:14;;;;2158:4;2149:14;;;;;1985:1;1978:9;1938:232;;2184:112;;2248:43;2283:6;2270:20;2248:43;;2303:116;;2378:36;2406:6;2400:13;2378:36;;2426:118;;2493:46;2531:6;2518:20;2493:46;;2551:122;;2629:39;2660:6;2654:13;2629:39;;2694:335;;;2801:4;2789:17;;2785:27;-1:-1;2775:2;;2826:1;2823;2816:12;2775:2;-1:-1;2846:20;;2886:18;2875:30;;2872:2;;;2918:1;2915;2908:12;2872:2;2952:4;2944:6;2940:17;2928:29;;3002:3;2995;2987:6;2983:16;2973:8;2969:31;2966:40;2963:2;;;3019:1;3016;3009:12;3038:440;;3132:4;3120:17;;3116:27;-1:-1;3106:2;;3157:1;3154;3147:12;3106:2;3194:6;3181:20;3216:64;3231:48;3272:6;3231:48;;3216:64;3207:73;;3300:6;3293:5;3286:21;3336:4;3328:6;3324:17;3369:4;3362:5;3358:16;3404:3;3395:6;3390:3;3386:16;3383:25;3380:2;;;3421:1;3418;3411:12;3380:2;3431:41;3465:6;3460:3;3455;3431:41;;;3099:379;;;;;;;;3487:442;;3592:4;3580:17;;3576:27;-1:-1;3566:2;;3617:1;3614;3607:12;3566:2;3647:6;3641:13;3669:64;3684:48;3725:6;3684:48;;3669:64;3660:73;;3753:6;3746:5;3739:21;3789:4;3781:6;3777:17;3822:4;3815:5;3811:16;3857:3;3848:6;3843:3;3839:16;3836:25;3833:2;;;3874:1;3871;3864:12;3833:2;3884:39;3916:6;3911:3;3906;3884:39;;3978:480;;4093:4;4081:9;4076:3;4072:19;4068:30;4065:2;;;4111:1;4108;4101:12;4065:2;4129:20;4144:4;4129:20;;;4120:29;-1:-1;4205:1;4236:49;4281:3;4261:9;4236:49;;;4212:74;;-1:-1;4354:2;4387:49;4432:3;4408:22;;;4387:49;;;4380:4;4373:5;4369:16;4362:75;4307:141;4059:399;;;;;5038:779;;5153:4;5141:9;5136:3;5132:19;5128:30;5125:2;;;5171:1;5168;5161:12;5125:2;5189:20;5204:4;5189:20;;;5180:29;-1:-1;5265:1;5296:49;5341:3;5321:9;5296:49;;;5272:74;;-1:-1;5414:2;5447:49;5492:3;5468:22;;;5447:49;;;5440:4;5433:5;5429:16;5422:75;5367:141;5565:2;5598:49;5643:3;5634:6;5623:9;5619:22;5598:49;;;5591:4;5584:5;5580:16;5573:75;5518:141;5713:2;5746:49;5791:3;5782:6;5771:9;5767:22;5746:49;;;5739:4;5732:5;5728:16;5721:75;5669:138;5119:698;;;;;6909:118;;6985:37;7014:6;7008:13;6985:37;;7034:241;;7138:2;7126:9;7117:7;7113:23;7109:32;7106:2;;;7154:1;7151;7144:12;7106:2;7189:1;7206:53;7251:7;7231:9;7206:53;;;7196:63;7100:175;-1:-1;;;;7100:175;7282:743;;;;;;7454:3;7442:9;7433:7;7429:23;7425:33;7422:2;;;7471:1;7468;7461:12;7422:2;7506:1;7523:53;7568:7;7548:9;7523:53;;;7513:63;;7485:97;7613:2;7631:53;7676:7;7667:6;7656:9;7652:22;7631:53;;;7621:63;;7592:98;7721:2;7739:53;7784:7;7775:6;7764:9;7760:22;7739:53;;;7729:63;;7700:98;7829:2;7847:53;7892:7;7883:6;7872:9;7868:22;7847:53;;;7837:63;;7808:98;7937:3;7956:53;8001:7;7992:6;7981:9;7977:22;7956:53;;;7946:63;;7916:99;7416:609;;;;;;;;;8032:397;;;8171:2;8159:9;8150:7;8146:23;8142:32;8139:2;;;8187:1;8184;8177:12;8139:2;8222:31;;8273:18;8262:30;;8259:2;;;8305:1;8302;8295:12;8259:2;8333:80;8405:7;8396:6;8385:9;8381:22;8333:80;;;8315:98;;;;8201:218;8133:296;;;;;;8436:429;;8591:2;8579:9;8570:7;8566:23;8562:32;8559:2;;;8607:1;8604;8597:12;8559:2;8642:31;;8693:18;8682:30;;8679:2;;;8725:1;8722;8715:12;8679:2;8745:104;8841:7;8832:6;8821:9;8817:22;8745:104;;8872:429;;9027:2;9015:9;9006:7;9002:23;8998:32;8995:2;;;9043:1;9040;9033:12;8995:2;9078:31;;9129:18;9118:30;;9115:2;;;9161:1;9158;9151:12;9115:2;9181:104;9277:7;9268:6;9257:9;9253:22;9181:104;;9308:235;;9409:2;9397:9;9388:7;9384:23;9380:32;9377:2;;;9425:1;9422;9415:12;9377:2;9460:1;9477:50;9519:7;9499:9;9477:50;;9550:257;;9662:2;9650:9;9641:7;9637:23;9633:32;9630:2;;;9678:1;9675;9668:12;9630:2;9713:1;9730:61;9783:7;9763:9;9730:61;;9814:241;;9918:2;9906:9;9897:7;9893:23;9889:32;9886:2;;;9934:1;9931;9924:12;9886:2;9969:1;9986:53;10031:7;10011:9;9986:53;;10062:263;;10177:2;10165:9;10156:7;10152:23;10148:32;10145:2;;;10193:1;10190;10183:12;10145:2;10228:1;10245:64;10301:7;10281:9;10245:64;;10332:867;;;;;;;10523:3;10511:9;10502:7;10498:23;10494:33;10491:2;;;10540:1;10537;10530:12;10491:2;10575:1;10592:53;10637:7;10617:9;10592:53;;;10582:63;;10554:97;10682:2;10700:53;10745:7;10736:6;10725:9;10721:22;10700:53;;;10690:63;;10661:98;10790:2;10808:53;10853:7;10844:6;10833:9;10829:22;10808:53;;;10798:63;;10769:98;10926:2;10915:9;10911:18;10898:32;10950:18;10942:6;10939:30;10936:2;;;10982:1;10979;10972:12;10936:2;11010:64;11066:7;11057:6;11046:9;11042:22;11010:64;;;10992:82;;;;10877:203;11111:3;11130:53;11175:7;11166:6;11155:9;11151:22;11130:53;;;11120:63;;11090:99;10485:714;;;;;;;;;11206:1245;;;;;;;;;;11448:3;11436:9;11427:7;11423:23;11419:33;11416:2;;;11465:1;11462;11455:12;11416:2;11500:1;11517:53;11562:7;11542:9;11517:53;;;11507:63;;11479:97;11607:2;11625:53;11670:7;11661:6;11650:9;11646:22;11625:53;;;11615:63;;11586:98;11715:2;11733:53;11778:7;11769:6;11758:9;11754:22;11733:53;;;11723:63;;11694:98;11823:2;11841:53;11886:7;11877:6;11866:9;11862:22;11841:53;;;11831:63;;11802:98;11931:3;11950:53;11995:7;11986:6;11975:9;11971:22;11950:53;;;11940:63;;11910:99;12040:3;12059:53;12104:7;12095:6;12084:9;12080:22;12059:53;;;12049:63;;12019:99;12177:3;12166:9;12162:19;12149:33;12202:18;12194:6;12191:30;12188:2;;;12234:1;12231;12224:12;12188:2;12262:64;12318:7;12309:6;12298:9;12294:22;12262:64;;;12244:82;;;;12128:204;12363:3;12382:53;12427:7;12418:6;12407:9;12403:22;12382:53;;;12372:63;;12342:99;11410:1041;;;;;;;;;;;;12458:741;;;;;;12632:3;12620:9;12611:7;12607:23;12603:33;12600:2;;;12649:1;12646;12639:12;12600:2;12684:1;12701:53;12746:7;12726:9;12701:53;;;12691:63;;12663:97;12791:2;12809:53;12854:7;12845:6;12834:9;12830:22;12809:53;;;12799:63;;12770:98;12899:2;12917:53;12962:7;12953:6;12942:9;12938:22;12917:53;;;12907:63;;12878:98;13035:2;13024:9;13020:18;13007:32;13059:18;13051:6;13048:30;13045:2;;;13091:1;13088;13081:12;13045:2;13119:64;13175:7;13166:6;13155:9;13151:22;13119:64;;;13101:82;;;;12986:203;12594:605;;;;;;;;;13206:993;;;;;;;;13414:3;13402:9;13393:7;13389:23;13385:33;13382:2;;;13431:1;13428;13421:12;13382:2;13466:1;13483:53;13528:7;13508:9;13483:53;;;13473:63;;13445:97;13573:2;13591:53;13636:7;13627:6;13616:9;13612:22;13591:53;;;13581:63;;13552:98;13681:2;13699:53;13744:7;13735:6;13724:9;13720:22;13699:53;;;13689:63;;13660:98;13789:2;13807:53;13852:7;13843:6;13832:9;13828:22;13807:53;;;13797:63;;13768:98;13897:3;13916:53;13961:7;13952:6;13941:9;13937:22;13916:53;;;13906:63;;13876:99;14034:3;14023:9;14019:19;14006:33;14059:18;14051:6;14048:30;14045:2;;;14091:1;14088;14081:12;14045:2;14119:64;14175:7;14166:6;14155:9;14151:22;14119:64;;;14101:82;;;;13985:204;13376:823;;;;;;;;;;;14206:1823;;;;;;;;;;;;14508:3;14496:9;14487:7;14483:23;14479:33;14476:2;;;14525:1;14522;14515:12;14476:2;14560:1;14577:64;14633:7;14613:9;14577:64;;;14567:74;;14539:108;14678:2;14696:62;14750:7;14741:6;14730:9;14726:22;14696:62;;;14686:72;;14657:107;14795:2;14813:64;14869:7;14860:6;14849:9;14845:22;14813:64;;;14803:74;;14774:109;14914:2;14932:64;14988:7;14979:6;14968:9;14964:22;14932:64;;;14922:74;;14893:109;15033:3;15052:64;15108:7;15099:6;15088:9;15084:22;15052:64;;;15042:74;;15012:110;15153:3;15172:64;15228:7;15219:6;15208:9;15204:22;15172:64;;;15162:74;;15132:110;15273:3;15292:64;15348:7;15339:6;15328:9;15324:22;15292:64;;;15282:74;;15252:110;15414:3;15403:9;15399:19;15393:26;15439:18;15431:6;15428:30;15425:2;;;15471:1;15468;15461:12;15425:2;15491:73;15556:7;15547:6;15536:9;15532:22;15491:73;;;15481:83;;15372:198;15622:3;15611:9;15607:19;15601:26;15647:18;15639:6;15636:30;15633:2;;;15679:1;15676;15669:12;15633:2;15699:73;15764:7;15755:6;15744:9;15740:22;15699:73;;;15689:83;;15580:198;15809:3;15828:64;15884:7;15875:6;15864:9;15860:22;15828:64;;;15818:74;;15788:110;15929:3;15949:64;16005:7;15996:6;15985:9;15981:22;15949:64;;;15938:75;;15908:111;14470:1559;;;;;;;;;;;;;;;16036:614;;;;;16195:2;16183:9;16174:7;16170:23;16166:32;16163:2;;;16211:1;16208;16201:12;16163:2;16246:31;;16297:18;16286:30;;16283:2;;;16329:1;16326;16319:12;16283:2;16357:64;16413:7;16404:6;16393:9;16389:22;16357:64;;;16339:82;;;;16225:202;16486:2;16475:9;16471:18;16458:32;16510:18;16502:6;16499:30;16496:2;;;16542:1;16539;16532:12;16496:2;16570:64;16626:7;16617:6;16606:9;16602:22;16570:64;;;16157:493;;;;-1:-1;16552:82;-1:-1;;;;16157:493;16657:739;;;;;;16833:2;16821:9;16812:7;16808:23;16804:32;16801:2;;;16849:1;16846;16839:12;16801:2;16884:31;;16935:18;16924:30;;16921:2;;;16967:1;16964;16957:12;16921:2;16995:64;17051:7;17042:6;17031:9;17027:22;16995:64;;;16977:82;;;;16863:202;17124:2;17113:9;17109:18;17096:32;17148:18;17140:6;17137:30;17134:2;;;17180:1;17177;17170:12;17134:2;17208:64;17264:7;17255:6;17244:9;17240:22;17208:64;;;17190:82;;;;17075:203;17309:2;17327:53;17372:7;17363:6;17352:9;17348:22;17327:53;;17403:574;;;17542:2;17530:9;17521:7;17517:23;17513:32;17510:2;;;17558:1;17555;17548:12;17510:2;17593:31;;17644:18;17633:30;;17630:2;;;17676:1;17673;17666:12;17630:2;17696:62;17750:7;17741:6;17730:9;17726:22;17696:62;;;17686:72;;17572:192;17823:2;17812:9;17808:18;17795:32;17847:18;17839:6;17836:30;17833:2;;;17879:1;17876;17869:12;17833:2;17899:62;17953:7;17944:6;17933:9;17929:22;17899:62;;;17889:72;;17774:193;17504:473;;;;;;17984:301;;18118:2;18106:9;18097:7;18093:23;18089:32;18086:2;;;18134:1;18131;18124:12;18086:2;18169:1;18186:83;18261:7;18241:9;18186:83;;18292:302;;18426:3;18414:9;18405:7;18401:23;18397:33;18394:2;;;18443:1;18440;18433:12;18394:2;18478:1;18495:83;18570:7;18550:9;18495:83;;18849:531;;;;18996:2;18984:9;18975:7;18971:23;18967:32;18964:2;;;19012:1;19009;19002:12;18964:2;19047:1;19064:62;19118:7;19098:9;19064:62;;;19054:72;;19026:106;19163:2;19181:64;19237:7;19228:6;19217:9;19213:22;19181:64;;;19171:74;;19142:109;19282:2;19300:64;19356:7;19347:6;19336:9;19332:22;19300:64;;;19290:74;;19261:109;18958:422;;;;;;19387:110;19460:31;19485:5;19460:31;;;19455:3;19448:44;19442:55;;;19716:783;;19905:81;19980:5;19905:81;;;20004:6;19999:3;19992:19;20028:4;20023:3;20019:14;20012:21;;20073:83;20150:5;20073:83;;;20177:1;20162:315;20187:6;20184:1;20181:13;20162:315;;;20227:111;20334:3;20325:6;20319:13;20227:111;;;20355:87;20435:6;20355:87;;;20465:4;20456:14;;;;;20345:97;-1:-1;20209:1;20202:9;20162:315;;;-1:-1;20490:3;;19884:615;-1:-1;;;;19884:615;20507:101;20574:28;20596:5;20574:28;;20615:110;20688:31;20713:5;20688:31;;20857:297;;20961:34;20989:5;20961:34;;;21012:6;21007:3;21000:19;21024:63;21080:6;21073:4;21068:3;21064:14;21057:4;21050:5;21046:16;21024:63;;;21119:29;21141:6;21119:29;;;21099:50;;;21112:4;21099:50;;20941:213;-1:-1;;;20941:213;21162:296;21317:2;21305:15;;21354:66;21349:2;21340:12;;21333:88;21449:2;21440:12;;21298:160;21467:296;21622:2;21610:15;;21659:66;21654:2;21645:12;;21638:88;21754:2;21745:12;;21603:160;21772:296;21927:2;21915:15;;21964:66;21959:2;21950:12;;21943:88;22059:2;22050:12;;21908:160;22077:296;22232:2;22220:15;;22269:66;22264:2;22255:12;;22248:88;22364:2;22355:12;;22213:160;22382:296;22537:2;22525:15;;22574:66;22569:2;22560:12;;22553:88;22669:2;22660:12;;22518:160;22687:296;22842:2;22830:15;;22879:66;22874:2;22865:12;;22858:88;22974:2;22965:12;;22823:160;22992:295;23147:1;23135:14;;23183:66;23178:2;23169:12;;23162:88;23278:2;23269:12;;23128:159;23296:296;23451:2;23439:15;;23488:66;23483:2;23474:12;;23467:88;23583:2;23574:12;;23432:160;23601:296;23756:2;23744:15;;23793:66;23788:2;23779:12;;23772:88;23888:2;23879:12;;23737:160;23906:296;24061:2;24049:15;;24098:66;24093:2;24084:12;;24077:88;24193:2;24184:12;;24042:160;24211:295;24366:1;24354:14;;24402:66;24397:2;24388:12;;24381:88;24497:2;24488:12;;24347:159;24515:296;24670:2;24658:15;;24707:66;24702:2;24693:12;;24686:88;24802:2;24793:12;;24651:160;24819:111;24907:18;;24901:29;25020:721;25250:22;;25177:4;25168:14;;;25284:69;25172:3;25250:22;25284:69;;;25197:168;25445:4;25438:5;25434:16;25428:23;25463:70;25527:4;25522:3;25518:14;25505:11;25463:70;;;25375:170;25626:4;25619:5;25615:16;25609:23;25644:70;25708:4;25703:3;25699:14;25686:11;25644:70;;25829:515;26050:22;;25974:4;25965:14;;;26084:61;25969:3;26050:22;26084:61;;;25994:163;26237:4;26230:5;26226:16;26220:23;26255:62;26311:4;26306:3;26302:14;26289:11;26255:62;;27045:1284;27287:22;;27214:4;27205:14;;;27321:69;27209:3;27287:22;27321:69;;;27234:168;27479:4;27472:5;27468:16;27462:23;27497:70;27561:4;27556:3;27552:14;27539:11;27497:70;;;27412:167;27662:4;27655:5;27651:16;27645:23;27680:70;27744:4;27739:3;27735:14;27722:11;27680:70;;;27589:173;27839:4;27832:5;27828:16;27822:23;27857:70;27921:4;27916:3;27912:14;27899:11;27857:70;;;27772:167;28027:4;28020:5;28016:16;28010:23;28045:70;28109:4;28104:3;28100:14;28087:11;28045:70;;;27949:178;28214:4;28207:5;28203:16;28197:23;28232:70;28296:4;28291:3;28287:14;28274:11;28232:70;;29831:1542;30080:22;;29831:1542;;30010:4;30001:14;;;30114:69;30005:3;30080:22;30114:69;;;30030:165;30278:4;30271:5;30267:16;30261:23;30296:70;30360:4;30355:3;30351:14;30338:11;30296:70;;;30205:173;30455:4;30448:5;30444:16;30438:23;30473:70;30537:4;30532:3;30528:14;30515:11;30473:70;;;30388:167;30641:4;30634:5;30630:16;30624:23;30659:70;30723:4;30718:3;30714:14;30701:11;30659:70;;;30565:176;30816:4;30809:5;30805:16;30799:23;30834:70;30898:4;30893:3;30889:14;30876:11;30834:70;;;30751:165;31003:4;30996:5;30992:16;30986:23;31021:70;31085:4;31080:3;31076:14;31063:11;31021:70;;;30926:177;31190:4;31183:5;31179:16;31173:23;31241:3;31235:4;31231:14;31224:4;31219:3;31215:14;31208:38;31261:74;31330:4;31317:11;31261:74;;;31253:82;29983:1390;-1:-1;;;;;29983:1390;31477:1180;31726:22;;31477:1180;;31656:4;31647:14;;;31760:69;31651:3;31726:22;31760:69;;;31676:165;31924:4;31917:5;31913:16;31907:23;31942:70;32006:4;32001:3;31997:14;31984:11;31942:70;;;31851:173;32101:4;32094:5;32090:16;32084:23;32119:70;32183:4;32178:3;32174:14;32161:11;32119:70;;;32034:167;32287:4;32280:5;32276:16;32270:23;32305:70;32369:4;32364:3;32360:14;32347:11;32305:70;;;32211:176;32474:4;32467:5;32463:16;32457:23;32525:3;32519:4;32515:14;32508:4;32503:3;32499:14;32492:38;32545:74;32614:4;32601:11;32545:74;;32906:193;33014:2;32999:18;;33028:61;33003:9;33062:6;33028:61;;33106:599;33326:3;33311:19;;33341:61;33315:9;33375:6;33341:61;;;33413:62;33471:2;33460:9;33456:18;33447:6;33413:62;;;33486;33544:2;33533:9;33529:18;33520:6;33486:62;;;33559;33617:2;33606:9;33602:18;33593:6;33559:62;;;33632:63;33690:3;33679:9;33675:19;33666:6;33632:63;;;33297:408;;;;;;;;;33712:449;33924:2;33938:47;;;33909:18;;33999:152;33909:18;34137:6;33999:152;;34168:181;34270:2;34255:18;;34284:55;34259:9;34312:6;34284:55;;34356:193;34464:2;34449:18;;34478:61;34453:9;34512:6;34478:61;;34556:387;34737:2;34751:47;;;34722:18;;34812:121;34722:18;34812:121;;34950:387;35131:2;35145:47;;;35116:18;;35206:121;35116:18;35206:121;;35344:387;35525:2;35539:47;;;35510:18;;35600:121;35510:18;35600:121;;35738:387;35919:2;35933:47;;;35904:18;;35994:121;35904:18;35994:121;;36132:387;36313:2;36327:47;;;36298:18;;36388:121;36298:18;36388:121;;36526:387;36707:2;36721:47;;;36692:18;;36782:121;36692:18;36782:121;;36920:387;37101:2;37115:47;;;37086:18;;37176:121;37086:18;37176:121;;37314:387;37495:2;37509:47;;;37480:18;;37570:121;37480:18;37570:121;;37708:387;37889:2;37903:47;;;37874:18;;37964:121;37874:18;37964:121;;38102:387;38283:2;38297:47;;;38268:18;;38358:121;38268:18;38358:121;;38496:387;38677:2;38691:47;;;38662:18;;38752:121;38662:18;38752:121;;38890:387;39071:2;39085:47;;;39056:18;;39146:121;39056:18;39146:121;;39284:489;39513:3;39498:19;;39528:88;39502:9;39589:6;39528:88;;;39627:136;39759:2;39748:9;39744:18;39735:6;39627:136;;39780:513;40021:3;40006:19;;40036:88;40010:9;40097:6;40036:88;;;40135:148;40279:2;40268:9;40264:18;40255:6;40135:148;;40832:564;41075:2;41060:18;;41089:88;41064:9;41150:6;41089:88;;;41225:9;41219:4;41215:20;41210:2;41199:9;41195:18;41188:48;41250:136;41381:4;41372:6;41250:136;;41403:564;41646:2;41631:18;;41660:88;41635:9;41721:6;41660:88;;;41796:9;41790:4;41786:20;41781:2;41770:9;41766:18;41759:48;41821:136;41952:4;41943:6;41821:136;;41974:317;42144:2;42129:18;;42158:123;42133:9;42254:6;42158:123;;42498:395;42662:2;42647:18;;42676:61;42651:9;42710:6;42676:61;;;42748:62;42806:2;42795:9;42791:18;42782:6;42748:62;;;42821;42879:2;42868:9;42864:18;42855:6;42821:62;;42900:803;43176:3;43161:19;;43191:61;43165:9;43225:6;43191:61;;;43263:62;43321:2;43310:9;43306:18;43297:6;43263:62;;;43336;43394:2;43383:9;43379:18;43370:6;43336:62;;;43409;43467:2;43456:9;43452:18;43443:6;43409:62;;;43482:63;43540:3;43529:9;43525:19;43516:6;43482:63;;;43556;43614:3;43603:9;43599:19;43590:6;43556:63;;;43630;43688:3;43677:9;43673:19;43664:6;43630:63;;;43147:556;;;;;;;;;;;43710:701;43958:3;43943:19;;43973:61;43947:9;44007:6;43973:61;;;44045:62;44103:2;44092:9;44088:18;44079:6;44045:62;;;44118;44176:2;44165:9;44161:18;44152:6;44118:62;;;44191;44249:2;44238:9;44234:18;44225:6;44191:62;;;44264:63;44322:3;44311:9;44307:19;44298:6;44264:63;;;44338;44396:3;44385:9;44381:19;44372:6;44338:63;;;43929:482;;;;;;;;;;44418:497;44610:3;44595:19;;44625:61;44599:9;44659:6;44625:61;;;44697:62;44755:2;44744:9;44740:18;44731:6;44697:62;;;44770;44828:2;44817:9;44813:18;44804:6;44770:62;;;44843;44901:2;44890:9;44886:18;44877:6;44843:62;;44922:256;44984:2;44978:9;45010:17;;;45085:18;45070:34;;45106:22;;;45067:62;45064:2;;;45142:1;45139;45132:12;45064:2;45158;45151:22;44962:216;;-1:-1;44962:216;45185:284;;45370:18;45362:6;45359:30;45356:2;;;45402:1;45399;45392:12;45356:2;-1:-1;45431:4;45419:17;;;45449:15;;45293:176;45767:258;;45910:18;45902:6;45899:30;45896:2;;;45942:1;45939;45932:12;45896:2;-1:-1;46015:4;45986;45963:17;;;;-1:-1;;45959:33;46005:15;;45833:192;46034:148;46170:4;46158:17;;46139:43;46191:134;46308:12;;46292:33;46584:128;-1:-1;;;;;46653:54;;46636:76;46719:92;46792:13;46785:21;;46768:43;46818:79;46887:5;46870:27;47396:88;47474:4;47463:16;;47446:38;47492:145;47573:6;47568:3;47563;47550:30;-1:-1;47629:1;47611:16;;47604:27;47543:94;47646:268;47711:1;47718:101;47732:6;47729:1;47726:13;47718:101;;;47799:11;;;47793:18;47780:11;;;47773:39;47754:2;47747:10;47718:101;;;47834:6;47831:1;47828:13;47825:2;;;-1:-1;;47899:1;47881:16;;47874:27;47695:219;47922:97;48010:2;47990:14;-1:-1;;47986:28;;47970:49
Metadata Hash
277203a73e5dff1ccce4eb5d66d8802cef858acdb7146c55d9b24ef30e7772de
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.