Polygon Sponsored slots available. Book your slot here!
Overview
POL Balance
0 POL
POL Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
40298690 | 639 days ago | Contract Creation | 0 POL |
Loading...
Loading
Contract Name:
LiquidVault
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT // Copyright (c) Scale Labs Ltd. All rights reserved. pragma solidity 0.8.17; import { IERC20 } from "./interfaces/IERC20-Token.sol"; import { IERC20Metadata } from "./interfaces/IERC20-Metadata.sol"; import { ILiquidVault } from "./interfaces/ILiquidVault.sol"; import { IERC173Ownable } from "./interfaces/IERC173-Ownable.sol"; import { IERC3643Liquid } from "./interfaces/IERC3643-Liquid.sol"; import { IERC3643LiquidDeployer } from "./interfaces/IERC3643-LiquidDeployer.sol"; import { Address } from "./lib/Address.sol"; import { SafeERC20 } from "./lib/SafeERC20.sol"; import { VoteProxy } from "./lib/VoteProxy.sol"; struct Fees { uint64 solidifyMinimumFeeGwei; uint64 liquifyMinimumFeeGwei; uint64 solidifyFeeRateGwei; uint64 liquifyFeeRateGwei; } // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. uint256 constant _FALSE = 1; uint256 constant _TRUE = 2; uint256 constant gasCoinDecimals = 18; uint256 constant gweiDecimals = 9; /// @title vault to hold the solid token collateral backing the liquid tokens issued /// @author Scale Labs Ltd /// @notice Features /// /// * IERC20 compatible contract /// * Supports cross chain bridging via 3rd party; /// with settable limits and enable/disable. /// * BEP20 <-> BEP2 Bridge compatibility /// * Maintains public statistics for total liquified, /// total solidified, total bridged in, total bridged out /// * Dynamic total supply for what is currently issued /// on that chain. /// * External tokens held at the contract address can be /// transferred out. (e.g. accidental sends) contract LiquidVault is VoteProxy, ILiquidVault { using SafeERC20 for IERC20; using SafeERC20 for IERC20Metadata; using Address for address payable; // The value being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to modifiers will be lower in // amount. Since refunds are capped to a percentage 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. uint256 internal _exchanging = _FALSE; mapping(address => Fees) private _fees; IERC3643LiquidDeployer public deployer; address payable public feeReceiver; mapping(IERC3643Liquid => IERC20) public solidTokens; mapping(IERC20 => IERC3643Liquid) public liquidTokens; mapping(IERC20 => uint256) public collateral; address[] private _allSolidTokens; uint256 public totalFees; modifier lockExchange() { require(_exchanging != _TRUE); _exchanging = _TRUE; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _exchanging = _FALSE; } constructor() { _transferOwnership(0x5cA1e1Ab50E1c9765F02B01FD2Ed340f394c5DDA); _updateFeeReceiver(owner()); } // Function to receive ETH when msg.data is be empty receive() external payable {} /** * @dev change the liquid token deployer * * Emits a {DeployerAddressUpdated} event. */ function updateDeployerAddress(address deployerAddress) external onlyOwner { notZeroAddress(deployerAddress); deployer = IERC3643LiquidDeployer(deployerAddress); emit DeployerAddressUpdated(deployerAddress); } function name() external pure returns (string memory) { return "Liquid Vault"; } /** * @dev Register new solid token and deploy corresponding liquid token. * * Emits a {TokenRegistered} event. */ //slither-disable-next-line reentrancy-no-eth,reentrancy-events,reentrancy-benign function deployAndRegisterToken( address solidTokenAddress, uint64 _solidifyMinimumFeeGwei, uint64 _liquifyMinimumFeeGwei, uint64 _solidifyFeeRateGwei, uint64 _liquifyFeeRateGwei ) external onlyOwner lockExchange returns (address liquidTokenAddress) { IERC20 solidToken = IERC20(solidTokenAddress); require(address(liquidTokens[solidToken]) == address(0), "Token already registered"); liquidTokenAddress = deployer.deployLiquidTokenWithVault(solidTokenAddress); require(liquidTokenAddress != address(0), "Invalid token"); registerToken( solidTokenAddress, liquidTokenAddress, _solidifyMinimumFeeGwei, _liquifyMinimumFeeGwei, _solidifyFeeRateGwei, _liquifyFeeRateGwei ); } /** * @dev Register new token pair * * Emits a {TokenRegistered} event. */ function registerToken( address solidTokenAddress, address liquidTokenAddress, uint64 _solidifyMinimumFeeGwei, uint64 _liquifyMinimumFeeGwei, uint64 _solidifyFeeRateGwei, uint64 _liquifyFeeRateGwei ) public onlyOwner { IERC20 solidToken = IERC20(solidTokenAddress); require(address(liquidTokens[solidToken]) == address(0), "Token already registered"); _allSolidTokens.push(solidTokenAddress); IERC3643Liquid liquidToken = IERC3643Liquid(liquidTokenAddress); liquidTokens[solidToken] = liquidToken; solidTokens[liquidToken] = solidToken; _fees[solidTokenAddress] = Fees( _solidifyMinimumFeeGwei, _liquifyMinimumFeeGwei, _solidifyFeeRateGwei, _liquifyFeeRateGwei ); emit TokenRegistered( solidTokenAddress, liquidTokenAddress, _solidifyMinimumFeeGwei, _liquifyMinimumFeeGwei, _solidifyFeeRateGwei, _liquifyFeeRateGwei ); } /** * @dev Update fees * * Emits a {FeesUpdated} event. */ function updateFees( address solidToken, uint64 _solidifyMinimumFeeGwei, uint64 _liquifyMinimumFeeGwei, uint64 _solidifyFeeRateGwei, uint64 _liquifyFeeRateGwei ) external onlyOwner { IERC20 _solidToken = IERC20(solidToken); address liquidToken = address(liquidTokens[_solidToken]); require(liquidToken != address(0), "Not registered token"); _fees[solidToken] = Fees( _solidifyMinimumFeeGwei, _liquifyMinimumFeeGwei, _solidifyFeeRateGwei, _liquifyFeeRateGwei ); emit FeesUpdated( solidToken, liquidToken, _solidifyMinimumFeeGwei, _liquifyMinimumFeeGwei, _solidifyFeeRateGwei, _liquifyFeeRateGwei ); } /** * @dev When the vault has ownership of the token, but setting need to be adjusted on it * rather than proxying calls, transfer the ownership. This is also useful if ownership needs * to be proved for registration on scans to update logos, websites etc */ function transferTokenOwnership(address tokenAddress, address newOwner) external onlyOwner { notZeroAddress(newOwner); IERC173Ownable(tokenAddress).transferOwnership(newOwner); } /** * @dev Minimum fees for solidifying tokens */ function solidifyMinimumFeeGwei(address token) public view returns (uint256 minimumFeeGwei) { return _fees[token].solidifyMinimumFeeGwei; } /** * @dev Fee rate in Gwei per liquid token */ function solidifyFeeRateGwei(address token) public view returns (uint256 gweiPerToken) { return _fees[token].solidifyFeeRateGwei; } /** * @dev Minimum fees for liquifying tokens */ function liquifyMinimumFeeGwei(address token) public view returns (uint256 minimumFeeGwei) { return _fees[token].liquifyMinimumFeeGwei; } /** * @dev Fee rate in Gwei per solid token */ function liquifyFeeRateGwei(address token) public view returns (uint256 gweiPerToken) { return _fees[token].liquifyFeeRateGwei; } /** * @dev Get all fees together in single call */ function fees( address token ) external view returns ( uint256 _solidifyMinimumFeeGwei, uint256 _solidifyFeeRateGwei, uint256 _liquifyMinimumFeeGwei, uint256 _liquifyFeeRateGwei ) { Fees memory tokenFees = _fees[token]; return ( tokenFees.solidifyMinimumFeeGwei, tokenFees.solidifyFeeRateGwei, tokenFees.liquifyMinimumFeeGwei, tokenFees.liquifyFeeRateGwei ); } /** * @dev Convert liquid tokens to solid tokens. * Can only be called by the liquid token contract. * * Emits a {Solidified} event. */ function solidifyTo( address fromAddress, address toAddress, address solidTokenAddress, uint256 amount ) external payable { notZeroAddress(solidTokenAddress); notZeroAddress(fromAddress); notZeroAddress(toAddress); address sender = _msgSender(); IERC20 solidToken = IERC20(solidTokenAddress); address liquidToken = address(liquidTokens[IERC20(solidToken)]); require(sender == liquidToken, "Only callable by liquid token"); // Ensure enough collateral uint256 currentCollateral = collateral[solidToken]; uint256 balance = solidToken.balanceOf(address(this)); require(balance >= amount || currentCollateral >= amount, "Not enough collateral"); // Decrease collateral currentCollateral -= amount; collateral[solidToken] = currentCollateral; _solidify(fromAddress, toAddress, solidTokenAddress, liquidToken, amount); require(solidToken.balanceOf(address(this)) >= currentCollateral, "Not enough collateral"); } function _solidify( address fromAddress, address toAddress, address solidTokenAddress, address liquidTokenAddress, uint256 amount ) private lockExchange { IERC20Metadata solidToken = IERC20Metadata(solidTokenAddress); Fees memory tokenFees = _fees[address(solidToken)]; uint256 fee = (amount * tokenFees.solidifyFeeRateGwei * 10 ** gasCoinDecimals) / (10 ** solidToken.decimals()) / 10 ** gweiDecimals; fee = fee < tokenFees.solidifyMinimumFeeGwei ? tokenFees.solidifyMinimumFeeGwei : fee; require(msg.value >= fee, "Fee is not enough"); totalFees += fee; emit Solidified(fromAddress, toAddress, solidTokenAddress, liquidTokenAddress, amount); solidToken.safeTransfer(toAddress, amount); } /** * @dev Convert solid tokens to liquid tokens. * Can only be called by the liquid token contract. * * Emits a {Liquidifed} event. */ function liquifyTo( address fromAddress, address toAddress, address solidTokenAddress, uint256 amount ) external payable { notZeroAddress(solidTokenAddress); notZeroAddress(fromAddress); notZeroAddress(toAddress); address sender = _msgSender(); IERC20 solidToken = IERC20(solidTokenAddress); address liquidToken = address(liquidTokens[solidToken]); require(sender == liquidToken, "Only callable by liquid token"); uint256 currentCollateral = collateral[solidToken]; // Increase collateral currentCollateral += amount; collateral[solidToken] = currentCollateral; require(currentCollateral <= solidToken.totalSupply(), "More than total supply"); _liquify(fromAddress, toAddress, solidTokenAddress, liquidToken, amount); // Ensure collateral has increased require(solidToken.balanceOf(address(this)) >= currentCollateral, "Not enough collateral"); } function _liquify( address fromAddress, address toAddress, address solidTokenAddress, address liquidTokenAddress, uint256 amount ) private lockExchange { IERC20Metadata solidToken = IERC20Metadata(solidTokenAddress); Fees memory tokenFees = _fees[address(solidToken)]; uint256 fee = (amount * tokenFees.liquifyFeeRateGwei * 10 ** gasCoinDecimals) / (10 ** solidToken.decimals()) / 10 ** gweiDecimals; fee = fee < tokenFees.liquifyMinimumFeeGwei ? tokenFees.liquifyMinimumFeeGwei : fee; require(msg.value >= fee, "Fee is not enough"); totalFees += fee; emit Liquidifed(fromAddress, toAddress, solidTokenAddress, liquidTokenAddress, amount); } /** * @dev Update fee recevier that the function {transferEth} sends to * * Emits a {FeeReceiverUpdated} event. */ function updateFeeReceiver(address account) public onlyOwner { notZeroAddress(account); _updateFeeReceiver(account); } function _updateFeeReceiver(address account) private { feeReceiver = payable(account); emit FeeReceiverUpdated(account); } /** * @dev Transfers ETH (or equivalent native gas coin) from vault * * Emits a {TransferEth} event. */ function transferEth() external onlyOwner { address payable receiver = feeReceiver; notZeroAddress(receiver); uint256 balance = address(this).balance; emit TransferEth(receiver, balance); receiver.sendValue(balance); } /** * @dev Transfers tokens from vault. * Does not allow collateral for liquid tokens to be removed. * * Emits a {TransferExtraTokens} event. */ function transferExtraTokens(address tokenAddress, address to, uint256 amount) external onlyOwner { notZeroAddress(to); transferTokens(tokenAddress, to, amount); } function transferTokens(address tokenAddress, address to, uint256 amount) private { IERC20 token = IERC20(tokenAddress); uint256 balance = token.balanceOf(address(this)); require(balance >= amount, "Larger than balance"); emit TransferExtraTokens(tokenAddress, to, amount); token.safeTransfer(to, amount); // If token is a solid token that the vault is using for collateral to back a liquid token // any removals must retain 100% backing and not drop below the issued liquid token amount if (address(liquidTokens[token]) != address(0)) { require(token.balanceOf(address(this)) >= collateral[token], "Would remove collateral"); } } /** * @dev gets array of registered liquid tokens */ function allLiquidTokens() external view returns (address[] memory tokens) { uint256 length = _allSolidTokens.length; tokens = new address[](length); for (uint256 i = 0; i < length; i++) { // Use solid token to look up liquid token tokens[i] = address(liquidTokens[IERC20(_allSolidTokens[i])]); } } /** * @dev gets registered liquid token at index in array * @param index of liquid token to return */ function allLiquidTokens(uint256 index) external view returns (address) { // Use solid token to look up liquid token return address(liquidTokens[IERC20(_allSolidTokens[index])]); } /** * @dev get length of registered liquid token array */ function allLiquidTokensLength() external view returns (uint256) { // Same as solid tokens return _allSolidTokens.length; } /** * @dev gets registered solid token at index in array * @param index of solid token to return */ function allSolidTokens(uint256 index) external view returns (address) { return _allSolidTokens[index]; } /** * @dev gets array of registered solid tokens */ function allSolidTokens() external view returns (address[] memory) { return _allSolidTokens; } /** * @dev get length of registered solid token array */ function allSolidTokensLength() external view returns (uint256) { return _allSolidTokens.length; } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; import { IGovernor } from "../interfaces/IGovernor.sol"; import { NameRegistrable } from "./NameRegistrable.sol"; /// @title Allows a contract to perform onchain voting using an Open Zeppelin Governor for any tokens it may hold /// @author Scale Labs Ltd abstract contract VoteProxy is NameRegistrable { event GovernorAddressUpdated(address indexed solidTokenAddress, address indexed governorAddress); mapping(address => IGovernor) public governors; /** * @dev sets the Governor associated with a token * @param solidTokenAddress The address of the token set the governor contract for * * Emits a {GovernorAddressUpdated} event. */ function updateGovernor(address solidTokenAddress, address governorAddress) external onlyOwner { require(solidTokenAddress != address(0), "Not zero address"); require(governorAddress != address(0), "Not zero address"); governors[solidTokenAddress] = IGovernor(governorAddress); emit GovernorAddressUpdated(solidTokenAddress, governorAddress); } /** * @dev clears the Governor associated with a token * @param solidTokenAddress The address of the token to clear the governor for * * Emits a {GovernorAddressUpdated} event. */ function clearGovernor(address solidTokenAddress) external onlyOwner { require(solidTokenAddress != address(0), "Not zero address"); governors[solidTokenAddress] = IGovernor(address(0)); emit GovernorAddressUpdated(solidTokenAddress, address(0x0)); } /** * @dev Create a new proposal. * @param targetToken The address of the token to call propose for */ function propose( address targetToken, address[] memory targets, uint256[] memory values, bytes[] memory calldatas, string memory description ) external onlyOwner returns (uint256 proposalId) { IGovernor governor = governors[targetToken]; require(address(governor) != address(0), "Governor not set"); return governor.propose(targets, values, calldatas, description); } /** * @dev Execute a successful proposal. This requires the quorum to be reached, the vote to be successful, and the * deadline to be reached. * @param targetToken The address of the token to call execute for */ function execute( address targetToken, address[] memory targets, uint256[] memory values, bytes[] memory calldatas, bytes32 descriptionHash ) external payable onlyOwner returns (uint256 proposalId) { IGovernor governor = governors[targetToken]; require(address(governor) != address(0), "Governor not set"); return governor.execute{ value: msg.value }(targets, values, calldatas, descriptionHash); } /** * @dev Cast a vote * @param targetToken The address of the token to call castVote for */ function castVote( address targetToken, uint256 proposalId, uint8 support ) external onlyOwner returns (uint256 balance) { IGovernor governor = governors[targetToken]; require(address(governor) != address(0), "Governor not set"); return governor.castVote(proposalId, support); } /** * @dev Cast a with a reason * @param targetToken The address of the token to call castVoteWithReason for */ function castVoteWithReason( address targetToken, uint256 proposalId, uint8 support, string calldata reason ) external onlyOwner returns (uint256 balance) { IGovernor governor = governors[targetToken]; require(address(governor) != address(0), "Governor not set"); return governor.castVoteWithReason(proposalId, support, reason); } /** * @dev Function to queue a proposal to the timelock. * @param targetToken The address of the token to call queue for */ function queue( address targetToken, address[] memory targets, uint256[] memory values, bytes[] memory calldatas, bytes32 descriptionHash ) external onlyOwner returns (uint256) { IGovernor governor = governors[targetToken]; require(address(governor) != address(0), "Governor not set"); return governor.queue(targets, values, calldatas, descriptionHash); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; import { IERC20 } from "../interfaces/IERC20-Token.sol"; import { Address } from "./Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev Always reverts on unsucessful transfer * @param token The token targeted by the call. * @param to The address to transfer to. * @param value Number of tokens to transfer. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } /** * @dev Always reverts on unsucessful transfer * @param token The token targeted by the call. * @param from The address to transfer from. * @param to The address to transfer to. * @param value Number of tokens to transfer. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity 0.8.17; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{ value: value }(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; interface IERC3643LiquidDeployer { /** * @dev Emitted when a token deployer is approved or disapproved. */ event DeployersUpdated(address indexed account, bool enabled); /** * @dev Emitted when the vault address is updated. */ event VaultAddressUpdated(address indexed vaultAddress); /** * @dev Emitted when a new liquid token is deployed. */ event LiquidTokenDeployed(address indexed solidToken, address indexed deployedLiquidToken); /** * @dev Deploys a liquid token looking up the parameters from the solid token * and transfers ownership to the vault. * * Emits a {LiquidTokenDeployed} event. */ function deployLiquidTokenWithVault(address solidTokenAddress) external returns (address liquidTokenAddress); /** * @dev Deploys a liquid token. * * Emits a {LiquidTokenDeployed} event. */ function deployLiquidToken( address solidTokenAddress, uint8 decimals, string memory orinalName, string memory originalSymbol ) external returns (address liquidTokenAddress); }
// SPDX-License-Identifier: MIT import { IAnySwap } from "./IAnySwap.sol"; import { IERC20Metadata } from "./IERC20-Metadata.sol"; import { IERC173Ownable } from "./IERC173-Ownable.sol"; pragma solidity 0.8.17; interface IERC3643Liquid is IERC20Metadata, IAnySwap, IERC173Ownable { /** * @dev Emitted when bridging is enabled for the token. */ event BridgingEnable(bool enabled); /** * @dev Emitted when the mint and burn is approved for bridging. */ event ApprovedBridgeMintBurn(address toApprove, uint256 amount); /** * @dev Emitted when the vault address is updated. */ event VaultAddressUpdated(address indexed vaultAddress); /** * @dev Number of holders on of the liquid token on this chain */ function holders() external view returns (uint256); /** * @dev Convert liquid tokens to solid tokens */ function solidify(uint256 amount, address toAddress) external payable; /** * @dev Convert solid tokens to liquid tokens */ function liquify(uint256 amount, address toAddress) external payable; /** * @dev Allows contract owner to aprove mint/burn limits for bridging. */ function approveBridgeMintBurn(address toApprove, uint256 amount) external; /** * @dev allow or disallow minting and burning by a bridge */ function enableBridging(bool enabled) external; /** * @dev returns bridging status */ function bridgingEnabled() external returns (bool enabled); /** * @dev prevent changes to initalization parameters and activate token. * This seperation of finalization allows incorrect parameters to be * corrected prior to the token going live. */ function finalize() external; function activate() external; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; /** * @dev Interface which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. */ interface IERC173Ownable { /** * @dev Returns the address of the current owner. */ function owner() external view returns (address); /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) external; /** * @dev Emitted when ownership is moved from one account (`previousOwner`) to * another (`newOwner`). */ event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; /** * @dev Interface of the required functions for liquid vault */ interface ILiquidVault { /** * @dev Event emitted when tokens are liquidifed */ event Liquidifed( address indexed from, address indexed to, address indexed solidToken, address liquidToken, uint256 amount ); /** * @dev Event emitted when tokens are solidified */ event Solidified( address indexed from, address indexed to, address indexed solidToken, address liquidToken, uint256 amount ); /** * @dev Event emitted when vault token deployer is changed */ event DeployerAddressUpdated(address indexed deployerAddress); /** * @dev Event emitted when tokens are transfered from the vault other than solidify and liquify */ event TransferExtraTokens(address indexed tokenAddress, address indexed to, uint256 amount); /** * @dev Event emitted when ETH (or equivalent native gas coin) is removed from the contract */ event TransferEth(address indexed feeReceiver, uint256 amount); /** * @dev Event emitted when fee receiver is changed */ event FeeReceiverUpdated(address indexed feeReceiver); /** * @dev Event emitted when new token registered */ event TokenRegistered( address indexed solidToken, address indexed liquidToken, uint64 solidifyMinimumFeeGwei, uint64 liquifyMinimumFeeGwei, uint64 solidifyFeeRateGwei, uint64 liquifyFeeRateGwei ); /** * @dev Event emitted when fees are updated */ event FeesUpdated( address indexed solidToken, address indexed liquidToken, uint64 solidifyMinimumFeeGwei, uint64 liquifyMinimumFeeGwei, uint64 solidifyFeeRateGwei, uint64 liquifyFeeRateGwei ); /** * @dev Minimum fees for solidifying tokens * @param token is address of solid token */ function solidifyMinimumFeeGwei(address token) external view returns (uint256 minimumFeeGwei); /** * @dev Fee rate in Gwei per liquid token * @param token is address of solid token */ function solidifyFeeRateGwei(address token) external view returns (uint256 gweiPerToken); /** * @dev Minimum fees for liquifying tokens * @param token is address of solid token */ function liquifyMinimumFeeGwei(address token) external view returns (uint256 minimumFeeGwei); /** * @dev Fee rate in Gwei per solid token * @param token is address of solid token */ function liquifyFeeRateGwei(address token) external view returns (uint256 gweiPerToken); /** * @dev Get all fees together in single call * @param token is address of solid token */ function fees( address token ) external view returns ( uint256 _solidifyMinimumFeeGwei, uint256 _solidifyFeeRateGwei, uint256 _liquifyMinimumFeeGwei, uint256 _liquifyFeeRateGwei ); /** * @dev Convert liquid tokens to solid tokens. * Can only be called by the liquid token contract. */ function solidifyTo(address fromAddress, address toAddress, address solidToken, uint256 amount) external payable; /** * @dev Convert solid tokens to liquid tokens. * Can only be called by the liquid token contract. */ function liquifyTo(address fromAddress, address toAddress, address solidToken, uint256 amount) external payable; /** * @dev Update fees */ function updateFees( address solidToken, uint64 _solidifyMinimumFeeGwei, uint64 _liquifyMinimumFeeGwei, uint64 _solidifyFeeRateGwei, uint64 _liquifyFeeRateGwei ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity 0.8.17; import { IERC20 } from "./IERC20-Token.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity 0.8.17; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; import { IEnsReverseRegistrar } from "../interfaces/IEnsReverseRegistrar.sol"; import { ERC173Ownable } from "./ERC173-Ownable.sol"; /// @title Allows a contract to be ens named /// @author Scale Labs Ltd abstract contract NameRegistrable is ERC173Ownable { /** * @dev Transfers ownership of the reverse ENS record associated with the * calling account. * @param registrar The address of the reverse registrar. * @param reverseRecordOwner The address to set as the owner of the reverse record in ENS. * @return node The ENS node hash of the reverse record. */ function ensClaim(address registrar, address reverseRecordOwner) external onlyOwner returns (bytes32 node) { return IEnsReverseRegistrar(registrar).claim(reverseRecordOwner); } /** * @dev Transfers ownership of the reverse ENS record associated with the * calling account. * @param registrar The address of the reverse registrar. * @param reverseRecordOwner The address to set as the owner of the reverse record in ENS. * @param resolver The address of the resolver to set; 0 to leave unchanged. * @return node The ENS node hash of the reverse record. */ function ensClaimWithResolver( address registrar, address reverseRecordOwner, address resolver ) external onlyOwner returns (bytes32 node) { return IEnsReverseRegistrar(registrar).claimWithResolver(reverseRecordOwner, resolver); } /** * @dev Sets the `name()` record for the reverse ENS record associated with * the calling account. First updates the resolver to the default reverse * resolver if necessary. * @param registrar The address of the reverse registrar. * @param name The name to set for this address. * @return node The ENS node hash of the reverse record. */ function ensSetName(address registrar, string memory name) external onlyOwner returns (bytes32 node) { return IEnsReverseRegistrar(registrar).setName(name); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; interface IGovernor { /** * @dev Create a new proposal. Vote start {IGovernor-votingDelay} blocks after the proposal is created and ends * {IGovernor-votingPeriod} blocks after the voting starts. * * Emits a {ProposalCreated} event. */ function propose( address[] memory targets, uint256[] memory values, bytes[] memory calldatas, string memory description ) external returns (uint256 proposalId); /** * @dev Execute a successful proposal. This requires the quorum to be reached, the vote to be successful, and the * deadline to be reached. * * Emits a {ProposalExecuted} event. * * Note: some module can modify the requirements for execution, for example by adding an additional timelock. */ function execute( address[] memory targets, uint256[] memory values, bytes[] memory calldatas, bytes32 descriptionHash ) external payable returns (uint256 proposalId); /** * @dev Cast a vote * * Emits a {VoteCast} event. */ function castVote(uint256 proposalId, uint8 support) external returns (uint256 balance); /** * @dev Cast a with a reason * * Emits a {VoteCast} event. */ function castVoteWithReason( uint256 proposalId, uint8 support, string calldata reason ) external returns (uint256 balance); /** * @dev Function to queue a proposal to the timelock. */ function queue( address[] memory targets, uint256[] memory values, bytes[] memory calldatas, bytes32 descriptionHash ) external returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; /** * @dev Interface of the required functions for Anyswap / multichain bridge compatibility */ interface IAnySwap { function mint(address to, uint256 amount) external; function burn(address from, uint256 amount) external; function underlying() external view returns (address); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; import { IERC173Ownable } from "../interfaces/IERC173-Ownable.sol"; import { Context } from "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract ERC173Ownable is IERC173Ownable, Context { address private _owner; /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _onlyOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _onlyOwner() private view { require(_owner == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public onlyOwner { notZeroAddress(newOwner); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } function notZeroAddress(address account) pure internal { require(account != address(0), "Not zero address"); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; interface IEnsReverseRegistrar { function claim(address owner) external returns (bytes32 node); function claimWithResolver(address owner, address resolver) external returns (bytes32 node); function setName(string memory name) external returns (bytes32 node); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view returns (address payable) { return payable(msg.sender); } }
{ "optimizer": { "enabled": true, "runs": 2000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"deployerAddress","type":"address"}],"name":"DeployerAddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"feeReceiver","type":"address"}],"name":"FeeReceiverUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"solidToken","type":"address"},{"indexed":true,"internalType":"address","name":"liquidToken","type":"address"},{"indexed":false,"internalType":"uint64","name":"solidifyMinimumFeeGwei","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"liquifyMinimumFeeGwei","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"solidifyFeeRateGwei","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"liquifyFeeRateGwei","type":"uint64"}],"name":"FeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"solidTokenAddress","type":"address"},{"indexed":true,"internalType":"address","name":"governorAddress","type":"address"}],"name":"GovernorAddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"address","name":"solidToken","type":"address"},{"indexed":false,"internalType":"address","name":"liquidToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Liquidifed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"address","name":"solidToken","type":"address"},{"indexed":false,"internalType":"address","name":"liquidToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Solidified","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"solidToken","type":"address"},{"indexed":true,"internalType":"address","name":"liquidToken","type":"address"},{"indexed":false,"internalType":"uint64","name":"solidifyMinimumFeeGwei","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"liquifyMinimumFeeGwei","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"solidifyFeeRateGwei","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"liquifyFeeRateGwei","type":"uint64"}],"name":"TokenRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"feeReceiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferEth","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferExtraTokens","type":"event"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"allLiquidTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allLiquidTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allLiquidTokensLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"allSolidTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allSolidTokens","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allSolidTokensLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"targetToken","type":"address"},{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"uint8","name":"support","type":"uint8"}],"name":"castVote","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"targetToken","type":"address"},{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"uint8","name":"support","type":"uint8"},{"internalType":"string","name":"reason","type":"string"}],"name":"castVoteWithReason","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"solidTokenAddress","type":"address"}],"name":"clearGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"name":"collateral","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"solidTokenAddress","type":"address"},{"internalType":"uint64","name":"_solidifyMinimumFeeGwei","type":"uint64"},{"internalType":"uint64","name":"_liquifyMinimumFeeGwei","type":"uint64"},{"internalType":"uint64","name":"_solidifyFeeRateGwei","type":"uint64"},{"internalType":"uint64","name":"_liquifyFeeRateGwei","type":"uint64"}],"name":"deployAndRegisterToken","outputs":[{"internalType":"address","name":"liquidTokenAddress","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deployer","outputs":[{"internalType":"contract IERC3643LiquidDeployer","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"registrar","type":"address"},{"internalType":"address","name":"reverseRecordOwner","type":"address"}],"name":"ensClaim","outputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrar","type":"address"},{"internalType":"address","name":"reverseRecordOwner","type":"address"},{"internalType":"address","name":"resolver","type":"address"}],"name":"ensClaimWithResolver","outputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrar","type":"address"},{"internalType":"string","name":"name","type":"string"}],"name":"ensSetName","outputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"targetToken","type":"address"},{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"internalType":"bytes32","name":"descriptionHash","type":"bytes32"}],"name":"execute","outputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"feeReceiver","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"fees","outputs":[{"internalType":"uint256","name":"_solidifyMinimumFeeGwei","type":"uint256"},{"internalType":"uint256","name":"_solidifyFeeRateGwei","type":"uint256"},{"internalType":"uint256","name":"_liquifyMinimumFeeGwei","type":"uint256"},{"internalType":"uint256","name":"_liquifyFeeRateGwei","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"governors","outputs":[{"internalType":"contract IGovernor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"name":"liquidTokens","outputs":[{"internalType":"contract IERC3643Liquid","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"liquifyFeeRateGwei","outputs":[{"internalType":"uint256","name":"gweiPerToken","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"liquifyMinimumFeeGwei","outputs":[{"internalType":"uint256","name":"minimumFeeGwei","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fromAddress","type":"address"},{"internalType":"address","name":"toAddress","type":"address"},{"internalType":"address","name":"solidTokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"liquifyTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"targetToken","type":"address"},{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"internalType":"string","name":"description","type":"string"}],"name":"propose","outputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"targetToken","type":"address"},{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"internalType":"bytes32","name":"descriptionHash","type":"bytes32"}],"name":"queue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"solidTokenAddress","type":"address"},{"internalType":"address","name":"liquidTokenAddress","type":"address"},{"internalType":"uint64","name":"_solidifyMinimumFeeGwei","type":"uint64"},{"internalType":"uint64","name":"_liquifyMinimumFeeGwei","type":"uint64"},{"internalType":"uint64","name":"_solidifyFeeRateGwei","type":"uint64"},{"internalType":"uint64","name":"_liquifyFeeRateGwei","type":"uint64"}],"name":"registerToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC3643Liquid","name":"","type":"address"}],"name":"solidTokens","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"solidifyFeeRateGwei","outputs":[{"internalType":"uint256","name":"gweiPerToken","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"solidifyMinimumFeeGwei","outputs":[{"internalType":"uint256","name":"minimumFeeGwei","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fromAddress","type":"address"},{"internalType":"address","name":"toAddress","type":"address"},{"internalType":"address","name":"solidTokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"solidifyTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transferEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferExtraTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferTokenOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"deployerAddress","type":"address"}],"name":"updateDeployerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"updateFeeReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"solidToken","type":"address"},{"internalType":"uint64","name":"_solidifyMinimumFeeGwei","type":"uint64"},{"internalType":"uint64","name":"_liquifyMinimumFeeGwei","type":"uint64"},{"internalType":"uint64","name":"_solidifyFeeRateGwei","type":"uint64"},{"internalType":"uint64","name":"_liquifyFeeRateGwei","type":"uint64"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"solidTokenAddress","type":"address"},{"internalType":"address","name":"governorAddress","type":"address"}],"name":"updateGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405260016002553480156200001657600080fd5b50620000223362000064565b62000041735ca1e1ab50e1c9765f02b01fd2ed340f394c5dda62000064565b6200005e620000586000546001600160a01b031690565b620000b4565b620000fe565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600580546001600160a01b0319166001600160a01b0383169081179091556040517f27aae5db36d94179909d019ae0b1ac7c16d96d953148f63c0f6a0a9c8ead79ee90600090a250565b6135ab806200010e6000396000f3fe6080604052600436106102ca5760003560e01c80638da5cb5b11610179578063be220734116100d6578063e3eece261161008a578063faaebd2111610064578063faaebd2114610893578063fcadd1f714610939578063ffcb461c1461036a57600080fd5b8063e3eece261461081d578063ea86ef5d14610853578063f2fde38b1461087357600080fd5b8063c50adadf116100bb578063c50adadf146107bd578063c69bebe4146107dd578063d5f39488146107fd57600080fd5b8063be2207341461077d578063c0ab2cc61461079d57600080fd5b8063a189872f1161012d578063ad9d6e9411610112578063ad9d6e9414610728578063b15286ba1461073d578063b3f006741461075d57600080fd5b8063a189872f146106b4578063a5fdc5de146106fb57600080fd5b806393ae4cb91161015e57806393ae4cb9146106545780639a94b975146106745780639e4919291461069457600080fd5b80638da5cb5b146106165780639142f9bb1461063457600080fd5b80632e2b245d1161022757806357fc8170116101db578063894511b3116101c0578063894511b31461059e5780638bddfac0146105d45780638c037845146105f657600080fd5b806357fc817014610553578063598526861461058957600080fd5b8063383fe4671161020c578063383fe467146105005780634123d27d146105205780634bcafd611461054057600080fd5b80632e2b245d1461046d57806332dc38cc146104b957600080fd5b806313114a9d1161027e578063191028351161026357806319102835146103d55780631c52db5414610415578063294078411461044d57600080fd5b806313114a9d1461039f578063143009f1146103b557600080fd5b806306fdde03116102af57806306fdde031461031e5780631126f9991461036a578063122c6e6c1461037f57600080fd5b806301957cc7146102d657806303f95b521461030957600080fd5b366102d157005b600080fd5b3480156102e257600080fd5b506102f66102f1366004612c22565b61094c565b6040519081526020015b60405180910390f35b61031c610317366004612cc5565b610a4f565b005b34801561032a57600080fd5b50604080518082018252600c81527f4c6971756964205661756c740000000000000000000000000000000000000000602082015290516103009190612d66565b34801561037657600080fd5b506009546102f6565b34801561038b57600080fd5b5061031c61039a366004612d79565b610ca7565b3480156103ab57600080fd5b506102f6600a5481565b3480156103c157600080fd5b506102f66103d0366004612dc1565b610dbf565b3480156103e157600080fd5b506102f66103f0366004612e60565b6001600160a01b031660009081526003602052604090205467ffffffffffffffff1690565b34801561042157600080fd5b50610435610430366004612e84565b610e6f565b6040516001600160a01b039091168152602001610300565b34801561045957600080fd5b506102f6610468366004612d79565b610e9f565b34801561047957600080fd5b506102f6610488366004612e60565b6001600160a01b031660009081526003602052604090205468010000000000000000900467ffffffffffffffff1690565b3480156104c557600080fd5b506102f66104d4366004612e60565b6001600160a01b0316600090815260036020526040902054600160801b900467ffffffffffffffff1690565b34801561050c57600080fd5b5061031c61051b366004612d79565b610f38565b34801561052c57600080fd5b5061031c61053b366004612e9d565b610fc1565b61031c61054e366004612cc5565b610fe2565b34801561055f57600080fd5b5061043561056e366004612e60565b6006602052600090815260409020546001600160a01b031681565b34801561059557600080fd5b5061031c611238565b3480156105aa57600080fd5b506104356105b9366004612e60565b6007602052600090815260409020546001600160a01b031681565b3480156105e057600080fd5b506105e96112ac565b6040516103009190612f22565b34801561060257600080fd5b506102f6610611366004612f55565b61130e565b34801561062257600080fd5b506000546001600160a01b0316610435565b34801561064057600080fd5b5061031c61064f366004612e60565b61135d565b34801561066057600080fd5b5061031c61066f366004612fc2565b6113c5565b34801561068057600080fd5b5061043561068f366004612e84565b6115e9565b3480156106a057600080fd5b506104356106af36600461303a565b611633565b3480156106c057600080fd5b506102f66106cf366004612e60565b6001600160a01b0316600090815260036020526040902054600160c01b900467ffffffffffffffff1690565b34801561070757600080fd5b506102f6610716366004612e60565b60086020526000908152604090205481565b34801561073457600080fd5b506105e96117b9565b34801561074957600080fd5b5061031c610758366004612e60565b611896565b34801561076957600080fd5b50600554610435906001600160a01b031681565b34801561078957600080fd5b5061031c61079836600461303a565b611954565b3480156107a957600080fd5b506102f66107b83660046130a1565b611b1a565b3480156107c957600080fd5b506102f66107d83660046130e3565b611c15565b3480156107e957600080fd5b5061031c6107f8366004612e60565b611cc5565b34801561080957600080fd5b50600454610435906001600160a01b031681565b34801561082957600080fd5b50610435610838366004612e60565b6001602052600090815260409020546001600160a01b031681565b34801561085f57600080fd5b506102f661086e3660046131a3565b611ce2565b34801561087f57600080fd5b5061031c61088e366004612e60565b611d81565b34801561089f57600080fd5b506109196108ae366004612e60565b6001600160a01b03166000908152600360209081526040918290208251608081018452905467ffffffffffffffff8082168084526801000000000000000083048216948401859052600160801b83048216958401869052600160c01b90920416606090920182905293565b604080519485526020850193909352918301526060820152608001610300565b6102f6610947366004612c22565b611d9b565b6000610956611e90565b6001600160a01b0380871660009081526001602052604090205416806109b65760405162461bcd60e51b815260206004820152601060248201526f11dbdd995c9b9bdc881b9bdd081cd95d60821b60448201526064015b60405180910390fd5b6040517f160cbed70000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063160cbed790610a01908990899089908990600401613268565b6020604051808303816000875af1158015610a20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4491906132b3565b979650505050505050565b610a5882611eec565b610a6184611eec565b610a6a83611eec565b6001600160a01b038281166000908152600760205260409020543391849116808314610ad85760405162461bcd60e51b815260206004820152601d60248201527f4f6e6c792063616c6c61626c65206279206c697175696420746f6b656e00000060448201526064016109ad565b6001600160a01b038216600090815260086020526040902054610afb85826132e2565b90508060086000856001600160a01b03166001600160a01b0316815260200190815260200160002081905550826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8991906132b3565b811115610bd85760405162461bcd60e51b815260206004820152601660248201527f4d6f7265207468616e20746f74616c20737570706c790000000000000000000060448201526064016109ad565b610be58888888589611f42565b6040516370a0823160e01b815230600482015281906001600160a01b038516906370a0823190602401602060405180830381865afa158015610c2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4f91906132b3565b1015610c9d5760405162461bcd60e51b815260206004820152601560248201527f4e6f7420656e6f75676820636f6c6c61746572616c000000000000000000000060448201526064016109ad565b5050505050505050565b610caf611e90565b6001600160a01b038216610d055760405162461bcd60e51b815260206004820152601060248201527f4e6f74207a65726f20616464726573730000000000000000000000000000000060448201526064016109ad565b6001600160a01b038116610d5b5760405162461bcd60e51b815260206004820152601060248201527f4e6f74207a65726f20616464726573730000000000000000000000000000000060448201526064016109ad565b6001600160a01b03828116600081815260016020526040808220805473ffffffffffffffffffffffffffffffffffffffff19169486169485179055517fb44860919895f7e2b7e6e58ec169787d7f779c353f45a674db8394c2cf2dbbd29190a35050565b6000610dc9611e90565b6001600160a01b038087166000908152600160205260409020541680610e245760405162461bcd60e51b815260206004820152601060248201526f11dbdd995c9b9bdc881b9bdd081cd95d60821b60448201526064016109ad565b6040517f7b3c71d30000000000000000000000000000000000000000000000000000000081526001600160a01b03821690637b3c71d390610a019089908990899089906004016132f5565b600060098281548110610e8457610e84613335565b6000918252602090912001546001600160a01b031692915050565b6000610ea9611e90565b6040517f1e83409a0000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152841690631e83409a906024015b6020604051808303816000875af1158015610f0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2f91906132b3565b90505b92915050565b610f40611e90565b610f4981611eec565b6040517ff2fde38b0000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015283169063f2fde38b90602401600060405180830381600087803b158015610fa557600080fd5b505af1158015610fb9573d6000803e3d6000fd5b505050505050565b610fc9611e90565b610fd282611eec565b610fdd83838361216e565b505050565b610feb82611eec565b610ff484611eec565b610ffd83611eec565b6001600160a01b03828116600090815260076020526040902054339184911680831461106b5760405162461bcd60e51b815260206004820152601d60248201527f4f6e6c792063616c6c61626c65206279206c697175696420746f6b656e00000060448201526064016109ad565b6001600160a01b0382166000818152600860205260408082205490516370a0823160e01b81523060048201529092906370a0823190602401602060405180830381865afa1580156110c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e491906132b3565b905085811015806110f55750858210155b6111415760405162461bcd60e51b815260206004820152601560248201527f4e6f7420656e6f75676820636f6c6c61746572616c000000000000000000000060448201526064016109ad565b61114b868361334b565b6001600160a01b03851660009081526008602052604090208190559150611175898989868a61237d565b6040516370a0823160e01b815230600482015282906001600160a01b038616906370a0823190602401602060405180830381865afa1580156111bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111df91906132b3565b101561122d5760405162461bcd60e51b815260206004820152601560248201527f4e6f7420656e6f75676820636f6c6c61746572616c000000000000000000000060448201526064016109ad565b505050505050505050565b611240611e90565b6005546001600160a01b031661125581611eec565b60405147808252906001600160a01b038316907fd9b66890b56321a19d7a216dd918f8c0d4023759afc4088deb9be15aca68ece29060200160405180910390a26112a86001600160a01b038316826125b8565b5050565b6060600980548060200260200160405190810160405280929190818152602001828054801561130457602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116112e6575b5050505050905090565b6000611318611e90565b6040517fc47f00270000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063c47f002790610eec908590600401612d66565b611365611e90565b61136e81611eec565b6004805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f346b72e103d36b50dff42245b22c45e34589a3ea9deb00de088962720385c36b90600090a250565b6113cd611e90565b6001600160a01b03808716600090815260076020526040902054879116156114375760405162461bcd60e51b815260206004820152601860248201527f546f6b656e20616c72656164792072656769737465726564000000000000000060448201526064016109ad565b60098054600181019091557f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b0389811673ffffffffffffffffffffffffffffffffffffffff19928316811790935583811660008181526007602090815260408083208054958e169587168617905584835260068252808320805490961690931790945581516080808201845267ffffffffffffffff8c81168084528c82168489018181528d84168689018181528e86166060808a018281528f8c5260038f529a8c902099518a54955193519b518916600160c01b0277ffffffffffffffffffffffffffffffffffffffffffffffff9c8a16600160801b029c909c166fffffffffffffffffffffffffffffffff948a1668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090971691909916179490941791909116959095179790971790955586519182529781019790975293860192909252840191909152899391927f99b777ab94f993bf2207b943388c75f4cffff06eab8e3d3904a16baa4a199158910160405180910390a35050505050505050565b6000600760006009848154811061160257611602613335565b60009182526020808320909101546001600160a01b0390811684529083019390935260409091019020541692915050565b600061163d611e90565b600280540361164b57600080fd5b600280556001600160a01b03808716600090815260076020526040902054879116156116b95760405162461bcd60e51b815260206004820152601860248201527f546f6b656e20616c72656164792072656769737465726564000000000000000060448201526064016109ad565b600480546040517fbecf03450000000000000000000000000000000000000000000000000000000081526001600160a01b038a81169382019390935291169063becf0345906024016020604051808303816000875af1158015611720573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611744919061335e565b91506001600160a01b03821661179c5760405162461bcd60e51b815260206004820152600d60248201527f496e76616c696420746f6b656e0000000000000000000000000000000000000060448201526064016109ad565b6117aa8783888888886113c5565b50600160025595945050505050565b6009546060908067ffffffffffffffff8111156117d8576117d86129fb565b604051908082528060200260200182016040528015611801578160200160208202803683370190505b50915060005b8181101561189157600760006009838154811061182657611826613335565b60009182526020808320909101546001600160a01b039081168452908301939093526040909101902054845191169084908390811061186757611867613335565b6001600160a01b0390921660209283029190910190910152806118898161337b565b915050611807565b505090565b61189e611e90565b6001600160a01b0381166118f45760405162461bcd60e51b815260206004820152601060248201527f4e6f74207a65726f20616464726573730000000000000000000000000000000060448201526064016109ad565b6001600160a01b038116600081815260016020526040808220805473ffffffffffffffffffffffffffffffffffffffff19169055519091907fb44860919895f7e2b7e6e58ec169787d7f779c353f45a674db8394c2cf2dbbd2908390a350565b61195c611e90565b6001600160a01b03808616600090815260076020526040902054869116806119c65760405162461bcd60e51b815260206004820152601460248201527f4e6f74207265676973746572656420746f6b656e00000000000000000000000060448201526064016109ad565b6040805160808101825267ffffffffffffffff80891682528781166020808401918252888316848601908152888416606086019081526001600160a01b03808f166000818152600390955293889020965187549551935192518716600160c01b0277ffffffffffffffffffffffffffffffffffffffffffffffff938816600160801b02939093166fffffffffffffffffffffffffffffffff94881668010000000000000000027fffffffffffffffffffffffffffffffff00000000000000000000000000000000909716919097161794909417919091169390931792909217909255915190831691907fdd28fd27bb286d7ba021bf83a88f972e78e25fd725f246b8ec0f432c8a6d42ea90611b09908a908a908a908a9067ffffffffffffffff948516815292841660208401529083166040830152909116606082015260800190565b60405180910390a350505050505050565b6000611b24611e90565b6001600160a01b038085166000908152600160205260409020541680611b7f5760405162461bcd60e51b815260206004820152601060248201526f11dbdd995c9b9bdc881b9bdd081cd95d60821b60448201526064016109ad565b6040517f567813880000000000000000000000000000000000000000000000000000000081526004810185905260ff841660248201526001600160a01b038216906356781388906044016020604051808303816000875af1158015611be8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c0c91906132b3565b95945050505050565b6000611c1f611e90565b6001600160a01b038087166000908152600160205260409020541680611c7a5760405162461bcd60e51b815260206004820152601060248201526f11dbdd995c9b9bdc881b9bdd081cd95d60821b60448201526064016109ad565b6040517f7d5e81e20000000000000000000000000000000000000000000000000000000081526001600160a01b03821690637d5e81e290610a01908990899089908990600401613395565b611ccd611e90565b611cd681611eec565b611cdf816126d1565b50565b6000611cec611e90565b6040517f0f5a54660000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301528381166024830152851690630f5a5466906044016020604051808303816000875af1158015611d55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7991906132b3565b949350505050565b611d89611e90565b611d9281611eec565b611cdf81612728565b6000611da5611e90565b6001600160a01b038087166000908152600160205260409020541680611e005760405162461bcd60e51b815260206004820152601060248201526f11dbdd995c9b9bdc881b9bdd081cd95d60821b60448201526064016109ad565b6040517f2656227d0000000000000000000000000000000000000000000000000000000081526001600160a01b03821690632656227d903490611e4d908a908a908a908a90600401613268565b60206040518083038185885af1158015611e6b573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610a4491906132b3565b6000546001600160a01b03163314611eea5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ad565b565b6001600160a01b038116611cdf5760405162461bcd60e51b815260206004820152601060248201527f4e6f74207a65726f20616464726573730000000000000000000000000000000060448201526064016109ad565b6002805403611f5057600080fd5b600280556001600160a01b03831660009081526003602090815260408083208151608081018352905467ffffffffffffffff8082168352680100000000000000008204811694830194909452600160801b8104841692820192909252600160c01b90910490911660608201528491611fca6009600a6134c6565b836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612008573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202c91906134d2565b61203790600a6134ef565b6120436012600a6134c6565b606085015161205c9067ffffffffffffffff16886134fe565b61206691906134fe565b6120709190613515565b61207a9190613515565b9050816020015167ffffffffffffffff16811061209757806120a7565b816020015167ffffffffffffffff165b9050803410156120f95760405162461bcd60e51b815260206004820152601160248201527f466565206973206e6f7420656e6f75676800000000000000000000000000000060448201526064016109ad565b80600a600082825461210b91906132e2565b9091555050604080516001600160a01b03878116825260208201879052808916928a821692918c16917f11a3bda8d2bae4e32ce5f5e314d014d59ecb5117f06c564a0025b73c037bb008910160405180910390a450506001600255505050505050565b6040516370a0823160e01b815230600482015283906000906001600160a01b038316906370a0823190602401602060405180830381865afa1580156121b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121db91906132b3565b90508281101561222d5760405162461bcd60e51b815260206004820152601360248201527f4c6172676572207468616e2062616c616e63650000000000000000000000000060448201526064016109ad565b836001600160a01b0316856001600160a01b03167ffb77546ff24ae381d0d05efd1e3f3c402609aa857d5003835c5e5cf1a8e5f52a8560405161227291815260200190565b60405180910390a361228e6001600160a01b0383168585612785565b6001600160a01b038281166000908152600760205260409020541615612376576001600160a01b038216600081815260086020526040908190205490516370a0823160e01b81523060048201529091906370a0823190602401602060405180830381865afa158015612304573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061232891906132b3565b10156123765760405162461bcd60e51b815260206004820152601760248201527f576f756c642072656d6f766520636f6c6c61746572616c00000000000000000060448201526064016109ad565b5050505050565b600280540361238b57600080fd5b600280556001600160a01b03831660009081526003602090815260408083208151608081018352905467ffffffffffffffff8082168352680100000000000000008204811694830194909452600160801b8104841692820192909252600160c01b909104909116606082015284916124056009600a6134c6565b836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612443573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061246791906134d2565b61247290600a6134ef565b61247e6012600a6134c6565b60408501516124979067ffffffffffffffff16886134fe565b6124a191906134fe565b6124ab9190613515565b6124b59190613515565b825190915067ffffffffffffffff1681106124d057806124dd565b815167ffffffffffffffff165b90508034101561252f5760405162461bcd60e51b815260206004820152601160248201527f466565206973206e6f7420656e6f75676800000000000000000000000000000060448201526064016109ad565b80600a600082825461254191906132e2565b9091555050604080516001600160a01b03878116825260208201879052808916928a821692918c16917fd3a5abeffcfa96b4a0e7cda5e18332d3433b069c5098a631e9a9e28bf9282800910160405180910390a46125a96001600160a01b0384168886612785565b50506001600255505050505050565b804710156126085760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016109ad565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612655576040519150601f19603f3d011682016040523d82523d6000602084013e61265a565b606091505b5050905080610fdd5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016109ad565b6005805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f27aae5db36d94179909d019ae0b1ac7c16d96d953148f63c0f6a0a9c8ead79ee90600090a250565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610fdd928692916000916128439185169084906128d3565b805190915015610fdd57808060200190518101906128619190613537565b610fdd5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016109ad565b6060611d79848460008585600080866001600160a01b031685876040516128fa9190613559565b60006040518083038185875af1925050503d8060008114612937576040519150601f19603f3d011682016040523d82523d6000602084013e61293c565b606091505b5091509150610a4487838387606083156129b75782516000036129b0576001600160a01b0385163b6129b05760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109ad565b5081611d79565b611d7983838151156129cc5781518083602001fd5b8060405162461bcd60e51b81526004016109ad9190612d66565b6001600160a01b0381168114611cdf57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612a3a57612a3a6129fb565b604052919050565b600067ffffffffffffffff821115612a5c57612a5c6129fb565b5060051b60200190565b600082601f830112612a7757600080fd5b81356020612a8c612a8783612a42565b612a11565b82815260059290921b84018101918181019086841115612aab57600080fd5b8286015b84811015612acf578035612ac2816129e6565b8352918301918301612aaf565b509695505050505050565b600082601f830112612aeb57600080fd5b81356020612afb612a8783612a42565b82815260059290921b84018101918181019086841115612b1a57600080fd5b8286015b84811015612acf5780358352918301918301612b1e565b600067ffffffffffffffff831115612b4f57612b4f6129fb565b612b626020601f19601f86011601612a11565b9050828152838383011115612b7657600080fd5b828260208301376000602084830101529392505050565b600082601f830112612b9e57600080fd5b81356020612bae612a8783612a42565b82815260059290921b84018101918181019086841115612bcd57600080fd5b8286015b84811015612acf57803567ffffffffffffffff811115612bf15760008081fd5b8701603f81018913612c035760008081fd5b612c14898683013560408401612b35565b845250918301918301612bd1565b600080600080600060a08688031215612c3a57600080fd5b8535612c45816129e6565b9450602086013567ffffffffffffffff80821115612c6257600080fd5b612c6e89838a01612a66565b95506040880135915080821115612c8457600080fd5b612c9089838a01612ada565b94506060880135915080821115612ca657600080fd5b50612cb388828901612b8d565b95989497509295608001359392505050565b60008060008060808587031215612cdb57600080fd5b8435612ce6816129e6565b93506020850135612cf6816129e6565b92506040850135612d06816129e6565b9396929550929360600135925050565b60005b83811015612d31578181015183820152602001612d19565b50506000910152565b60008151808452612d52816020860160208601612d16565b601f01601f19169290920160200192915050565b602081526000610f2f6020830184612d3a565b60008060408385031215612d8c57600080fd5b8235612d97816129e6565b91506020830135612da7816129e6565b809150509250929050565b60ff81168114611cdf57600080fd5b600080600080600060808688031215612dd957600080fd5b8535612de4816129e6565b9450602086013593506040860135612dfb81612db2565b9250606086013567ffffffffffffffff80821115612e1857600080fd5b818801915088601f830112612e2c57600080fd5b813581811115612e3b57600080fd5b896020828501011115612e4d57600080fd5b9699959850939650602001949392505050565b600060208284031215612e7257600080fd5b8135612e7d816129e6565b9392505050565b600060208284031215612e9657600080fd5b5035919050565b600080600060608486031215612eb257600080fd5b8335612ebd816129e6565b92506020840135612ecd816129e6565b929592945050506040919091013590565b600081518084526020808501945080840160005b83811015612f175781516001600160a01b031687529582019590820190600101612ef2565b509495945050505050565b602081526000610f2f6020830184612ede565b600082601f830112612f4657600080fd5b610f2f83833560208501612b35565b60008060408385031215612f6857600080fd5b8235612f73816129e6565b9150602083013567ffffffffffffffff811115612f8f57600080fd5b612f9b85828601612f35565b9150509250929050565b803567ffffffffffffffff81168114612fbd57600080fd5b919050565b60008060008060008060c08789031215612fdb57600080fd5b8635612fe6816129e6565b95506020870135612ff6816129e6565b945061300460408801612fa5565b935061301260608801612fa5565b925061302060808801612fa5565b915061302e60a08801612fa5565b90509295509295509295565b600080600080600060a0868803121561305257600080fd5b853561305d816129e6565b945061306b60208701612fa5565b935061307960408701612fa5565b925061308760608701612fa5565b915061309560808701612fa5565b90509295509295909350565b6000806000606084860312156130b657600080fd5b83356130c1816129e6565b92506020840135915060408401356130d881612db2565b809150509250925092565b600080600080600060a086880312156130fb57600080fd5b8535613106816129e6565b9450602086013567ffffffffffffffff8082111561312357600080fd5b61312f89838a01612a66565b9550604088013591508082111561314557600080fd5b61315189838a01612ada565b9450606088013591508082111561316757600080fd5b61317389838a01612b8d565b9350608088013591508082111561318957600080fd5b5061319688828901612f35565b9150509295509295909350565b6000806000606084860312156131b857600080fd5b83356131c3816129e6565b925060208401356131d3816129e6565b915060408401356130d8816129e6565b600081518084526020808501945080840160005b83811015612f17578151875295820195908201906001016131f7565b600081518084526020808501808196508360051b8101915082860160005b8581101561325b578284038952613249848351612d3a565b98850198935090840190600101613231565b5091979650505050505050565b60808152600061327b6080830187612ede565b828103602084015261328d81876131e3565b905082810360408401526132a18186613213565b91505082606083015295945050505050565b6000602082840312156132c557600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610f3257610f326132cc565b84815260ff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f909201601f191601019392505050565b634e487b7160e01b600052603260045260246000fd5b81810381811115610f3257610f326132cc565b60006020828403121561337057600080fd5b8151612e7d816129e6565b6000600019820361338e5761338e6132cc565b5060010190565b6080815260006133a86080830187612ede565b82810360208401526133ba81876131e3565b905082810360408401526133ce8186613213565b90508281036060840152610a448185612d3a565b600181815b8085111561341d578160001904821115613403576134036132cc565b8085161561341057918102915b93841c93908002906133e7565b509250929050565b60008261343457506001610f32565b8161344157506000610f32565b816001811461345757600281146134615761347d565b6001915050610f32565b60ff841115613472576134726132cc565b50506001821b610f32565b5060208310610133831016604e8410600b84101617156134a0575081810a610f32565b6134aa83836133e2565b80600019048211156134be576134be6132cc565b029392505050565b6000610f2f8383613425565b6000602082840312156134e457600080fd5b8151612e7d81612db2565b6000610f2f60ff841683613425565b8082028115828204841417610f3257610f326132cc565b60008261353257634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561354957600080fd5b81518015158114612e7d57600080fd5b6000825161356b818460208701612d16565b919091019291505056fea26469706673582212205e4e3e57c3e450dc3c5dbaa72af4174c82d765c2f19e9edc97cac915efdc1c8964736f6c63430008110033
Deployed Bytecode
0x6080604052600436106102ca5760003560e01c80638da5cb5b11610179578063be220734116100d6578063e3eece261161008a578063faaebd2111610064578063faaebd2114610893578063fcadd1f714610939578063ffcb461c1461036a57600080fd5b8063e3eece261461081d578063ea86ef5d14610853578063f2fde38b1461087357600080fd5b8063c50adadf116100bb578063c50adadf146107bd578063c69bebe4146107dd578063d5f39488146107fd57600080fd5b8063be2207341461077d578063c0ab2cc61461079d57600080fd5b8063a189872f1161012d578063ad9d6e9411610112578063ad9d6e9414610728578063b15286ba1461073d578063b3f006741461075d57600080fd5b8063a189872f146106b4578063a5fdc5de146106fb57600080fd5b806393ae4cb91161015e57806393ae4cb9146106545780639a94b975146106745780639e4919291461069457600080fd5b80638da5cb5b146106165780639142f9bb1461063457600080fd5b80632e2b245d1161022757806357fc8170116101db578063894511b3116101c0578063894511b31461059e5780638bddfac0146105d45780638c037845146105f657600080fd5b806357fc817014610553578063598526861461058957600080fd5b8063383fe4671161020c578063383fe467146105005780634123d27d146105205780634bcafd611461054057600080fd5b80632e2b245d1461046d57806332dc38cc146104b957600080fd5b806313114a9d1161027e578063191028351161026357806319102835146103d55780631c52db5414610415578063294078411461044d57600080fd5b806313114a9d1461039f578063143009f1146103b557600080fd5b806306fdde03116102af57806306fdde031461031e5780631126f9991461036a578063122c6e6c1461037f57600080fd5b806301957cc7146102d657806303f95b521461030957600080fd5b366102d157005b600080fd5b3480156102e257600080fd5b506102f66102f1366004612c22565b61094c565b6040519081526020015b60405180910390f35b61031c610317366004612cc5565b610a4f565b005b34801561032a57600080fd5b50604080518082018252600c81527f4c6971756964205661756c740000000000000000000000000000000000000000602082015290516103009190612d66565b34801561037657600080fd5b506009546102f6565b34801561038b57600080fd5b5061031c61039a366004612d79565b610ca7565b3480156103ab57600080fd5b506102f6600a5481565b3480156103c157600080fd5b506102f66103d0366004612dc1565b610dbf565b3480156103e157600080fd5b506102f66103f0366004612e60565b6001600160a01b031660009081526003602052604090205467ffffffffffffffff1690565b34801561042157600080fd5b50610435610430366004612e84565b610e6f565b6040516001600160a01b039091168152602001610300565b34801561045957600080fd5b506102f6610468366004612d79565b610e9f565b34801561047957600080fd5b506102f6610488366004612e60565b6001600160a01b031660009081526003602052604090205468010000000000000000900467ffffffffffffffff1690565b3480156104c557600080fd5b506102f66104d4366004612e60565b6001600160a01b0316600090815260036020526040902054600160801b900467ffffffffffffffff1690565b34801561050c57600080fd5b5061031c61051b366004612d79565b610f38565b34801561052c57600080fd5b5061031c61053b366004612e9d565b610fc1565b61031c61054e366004612cc5565b610fe2565b34801561055f57600080fd5b5061043561056e366004612e60565b6006602052600090815260409020546001600160a01b031681565b34801561059557600080fd5b5061031c611238565b3480156105aa57600080fd5b506104356105b9366004612e60565b6007602052600090815260409020546001600160a01b031681565b3480156105e057600080fd5b506105e96112ac565b6040516103009190612f22565b34801561060257600080fd5b506102f6610611366004612f55565b61130e565b34801561062257600080fd5b506000546001600160a01b0316610435565b34801561064057600080fd5b5061031c61064f366004612e60565b61135d565b34801561066057600080fd5b5061031c61066f366004612fc2565b6113c5565b34801561068057600080fd5b5061043561068f366004612e84565b6115e9565b3480156106a057600080fd5b506104356106af36600461303a565b611633565b3480156106c057600080fd5b506102f66106cf366004612e60565b6001600160a01b0316600090815260036020526040902054600160c01b900467ffffffffffffffff1690565b34801561070757600080fd5b506102f6610716366004612e60565b60086020526000908152604090205481565b34801561073457600080fd5b506105e96117b9565b34801561074957600080fd5b5061031c610758366004612e60565b611896565b34801561076957600080fd5b50600554610435906001600160a01b031681565b34801561078957600080fd5b5061031c61079836600461303a565b611954565b3480156107a957600080fd5b506102f66107b83660046130a1565b611b1a565b3480156107c957600080fd5b506102f66107d83660046130e3565b611c15565b3480156107e957600080fd5b5061031c6107f8366004612e60565b611cc5565b34801561080957600080fd5b50600454610435906001600160a01b031681565b34801561082957600080fd5b50610435610838366004612e60565b6001602052600090815260409020546001600160a01b031681565b34801561085f57600080fd5b506102f661086e3660046131a3565b611ce2565b34801561087f57600080fd5b5061031c61088e366004612e60565b611d81565b34801561089f57600080fd5b506109196108ae366004612e60565b6001600160a01b03166000908152600360209081526040918290208251608081018452905467ffffffffffffffff8082168084526801000000000000000083048216948401859052600160801b83048216958401869052600160c01b90920416606090920182905293565b604080519485526020850193909352918301526060820152608001610300565b6102f6610947366004612c22565b611d9b565b6000610956611e90565b6001600160a01b0380871660009081526001602052604090205416806109b65760405162461bcd60e51b815260206004820152601060248201526f11dbdd995c9b9bdc881b9bdd081cd95d60821b60448201526064015b60405180910390fd5b6040517f160cbed70000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063160cbed790610a01908990899089908990600401613268565b6020604051808303816000875af1158015610a20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4491906132b3565b979650505050505050565b610a5882611eec565b610a6184611eec565b610a6a83611eec565b6001600160a01b038281166000908152600760205260409020543391849116808314610ad85760405162461bcd60e51b815260206004820152601d60248201527f4f6e6c792063616c6c61626c65206279206c697175696420746f6b656e00000060448201526064016109ad565b6001600160a01b038216600090815260086020526040902054610afb85826132e2565b90508060086000856001600160a01b03166001600160a01b0316815260200190815260200160002081905550826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8991906132b3565b811115610bd85760405162461bcd60e51b815260206004820152601660248201527f4d6f7265207468616e20746f74616c20737570706c790000000000000000000060448201526064016109ad565b610be58888888589611f42565b6040516370a0823160e01b815230600482015281906001600160a01b038516906370a0823190602401602060405180830381865afa158015610c2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4f91906132b3565b1015610c9d5760405162461bcd60e51b815260206004820152601560248201527f4e6f7420656e6f75676820636f6c6c61746572616c000000000000000000000060448201526064016109ad565b5050505050505050565b610caf611e90565b6001600160a01b038216610d055760405162461bcd60e51b815260206004820152601060248201527f4e6f74207a65726f20616464726573730000000000000000000000000000000060448201526064016109ad565b6001600160a01b038116610d5b5760405162461bcd60e51b815260206004820152601060248201527f4e6f74207a65726f20616464726573730000000000000000000000000000000060448201526064016109ad565b6001600160a01b03828116600081815260016020526040808220805473ffffffffffffffffffffffffffffffffffffffff19169486169485179055517fb44860919895f7e2b7e6e58ec169787d7f779c353f45a674db8394c2cf2dbbd29190a35050565b6000610dc9611e90565b6001600160a01b038087166000908152600160205260409020541680610e245760405162461bcd60e51b815260206004820152601060248201526f11dbdd995c9b9bdc881b9bdd081cd95d60821b60448201526064016109ad565b6040517f7b3c71d30000000000000000000000000000000000000000000000000000000081526001600160a01b03821690637b3c71d390610a019089908990899089906004016132f5565b600060098281548110610e8457610e84613335565b6000918252602090912001546001600160a01b031692915050565b6000610ea9611e90565b6040517f1e83409a0000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152841690631e83409a906024015b6020604051808303816000875af1158015610f0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2f91906132b3565b90505b92915050565b610f40611e90565b610f4981611eec565b6040517ff2fde38b0000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015283169063f2fde38b90602401600060405180830381600087803b158015610fa557600080fd5b505af1158015610fb9573d6000803e3d6000fd5b505050505050565b610fc9611e90565b610fd282611eec565b610fdd83838361216e565b505050565b610feb82611eec565b610ff484611eec565b610ffd83611eec565b6001600160a01b03828116600090815260076020526040902054339184911680831461106b5760405162461bcd60e51b815260206004820152601d60248201527f4f6e6c792063616c6c61626c65206279206c697175696420746f6b656e00000060448201526064016109ad565b6001600160a01b0382166000818152600860205260408082205490516370a0823160e01b81523060048201529092906370a0823190602401602060405180830381865afa1580156110c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e491906132b3565b905085811015806110f55750858210155b6111415760405162461bcd60e51b815260206004820152601560248201527f4e6f7420656e6f75676820636f6c6c61746572616c000000000000000000000060448201526064016109ad565b61114b868361334b565b6001600160a01b03851660009081526008602052604090208190559150611175898989868a61237d565b6040516370a0823160e01b815230600482015282906001600160a01b038616906370a0823190602401602060405180830381865afa1580156111bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111df91906132b3565b101561122d5760405162461bcd60e51b815260206004820152601560248201527f4e6f7420656e6f75676820636f6c6c61746572616c000000000000000000000060448201526064016109ad565b505050505050505050565b611240611e90565b6005546001600160a01b031661125581611eec565b60405147808252906001600160a01b038316907fd9b66890b56321a19d7a216dd918f8c0d4023759afc4088deb9be15aca68ece29060200160405180910390a26112a86001600160a01b038316826125b8565b5050565b6060600980548060200260200160405190810160405280929190818152602001828054801561130457602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116112e6575b5050505050905090565b6000611318611e90565b6040517fc47f00270000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063c47f002790610eec908590600401612d66565b611365611e90565b61136e81611eec565b6004805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f346b72e103d36b50dff42245b22c45e34589a3ea9deb00de088962720385c36b90600090a250565b6113cd611e90565b6001600160a01b03808716600090815260076020526040902054879116156114375760405162461bcd60e51b815260206004820152601860248201527f546f6b656e20616c72656164792072656769737465726564000000000000000060448201526064016109ad565b60098054600181019091557f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b0389811673ffffffffffffffffffffffffffffffffffffffff19928316811790935583811660008181526007602090815260408083208054958e169587168617905584835260068252808320805490961690931790945581516080808201845267ffffffffffffffff8c81168084528c82168489018181528d84168689018181528e86166060808a018281528f8c5260038f529a8c902099518a54955193519b518916600160c01b0277ffffffffffffffffffffffffffffffffffffffffffffffff9c8a16600160801b029c909c166fffffffffffffffffffffffffffffffff948a1668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090971691909916179490941791909116959095179790971790955586519182529781019790975293860192909252840191909152899391927f99b777ab94f993bf2207b943388c75f4cffff06eab8e3d3904a16baa4a199158910160405180910390a35050505050505050565b6000600760006009848154811061160257611602613335565b60009182526020808320909101546001600160a01b0390811684529083019390935260409091019020541692915050565b600061163d611e90565b600280540361164b57600080fd5b600280556001600160a01b03808716600090815260076020526040902054879116156116b95760405162461bcd60e51b815260206004820152601860248201527f546f6b656e20616c72656164792072656769737465726564000000000000000060448201526064016109ad565b600480546040517fbecf03450000000000000000000000000000000000000000000000000000000081526001600160a01b038a81169382019390935291169063becf0345906024016020604051808303816000875af1158015611720573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611744919061335e565b91506001600160a01b03821661179c5760405162461bcd60e51b815260206004820152600d60248201527f496e76616c696420746f6b656e0000000000000000000000000000000000000060448201526064016109ad565b6117aa8783888888886113c5565b50600160025595945050505050565b6009546060908067ffffffffffffffff8111156117d8576117d86129fb565b604051908082528060200260200182016040528015611801578160200160208202803683370190505b50915060005b8181101561189157600760006009838154811061182657611826613335565b60009182526020808320909101546001600160a01b039081168452908301939093526040909101902054845191169084908390811061186757611867613335565b6001600160a01b0390921660209283029190910190910152806118898161337b565b915050611807565b505090565b61189e611e90565b6001600160a01b0381166118f45760405162461bcd60e51b815260206004820152601060248201527f4e6f74207a65726f20616464726573730000000000000000000000000000000060448201526064016109ad565b6001600160a01b038116600081815260016020526040808220805473ffffffffffffffffffffffffffffffffffffffff19169055519091907fb44860919895f7e2b7e6e58ec169787d7f779c353f45a674db8394c2cf2dbbd2908390a350565b61195c611e90565b6001600160a01b03808616600090815260076020526040902054869116806119c65760405162461bcd60e51b815260206004820152601460248201527f4e6f74207265676973746572656420746f6b656e00000000000000000000000060448201526064016109ad565b6040805160808101825267ffffffffffffffff80891682528781166020808401918252888316848601908152888416606086019081526001600160a01b03808f166000818152600390955293889020965187549551935192518716600160c01b0277ffffffffffffffffffffffffffffffffffffffffffffffff938816600160801b02939093166fffffffffffffffffffffffffffffffff94881668010000000000000000027fffffffffffffffffffffffffffffffff00000000000000000000000000000000909716919097161794909417919091169390931792909217909255915190831691907fdd28fd27bb286d7ba021bf83a88f972e78e25fd725f246b8ec0f432c8a6d42ea90611b09908a908a908a908a9067ffffffffffffffff948516815292841660208401529083166040830152909116606082015260800190565b60405180910390a350505050505050565b6000611b24611e90565b6001600160a01b038085166000908152600160205260409020541680611b7f5760405162461bcd60e51b815260206004820152601060248201526f11dbdd995c9b9bdc881b9bdd081cd95d60821b60448201526064016109ad565b6040517f567813880000000000000000000000000000000000000000000000000000000081526004810185905260ff841660248201526001600160a01b038216906356781388906044016020604051808303816000875af1158015611be8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c0c91906132b3565b95945050505050565b6000611c1f611e90565b6001600160a01b038087166000908152600160205260409020541680611c7a5760405162461bcd60e51b815260206004820152601060248201526f11dbdd995c9b9bdc881b9bdd081cd95d60821b60448201526064016109ad565b6040517f7d5e81e20000000000000000000000000000000000000000000000000000000081526001600160a01b03821690637d5e81e290610a01908990899089908990600401613395565b611ccd611e90565b611cd681611eec565b611cdf816126d1565b50565b6000611cec611e90565b6040517f0f5a54660000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301528381166024830152851690630f5a5466906044016020604051808303816000875af1158015611d55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7991906132b3565b949350505050565b611d89611e90565b611d9281611eec565b611cdf81612728565b6000611da5611e90565b6001600160a01b038087166000908152600160205260409020541680611e005760405162461bcd60e51b815260206004820152601060248201526f11dbdd995c9b9bdc881b9bdd081cd95d60821b60448201526064016109ad565b6040517f2656227d0000000000000000000000000000000000000000000000000000000081526001600160a01b03821690632656227d903490611e4d908a908a908a908a90600401613268565b60206040518083038185885af1158015611e6b573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610a4491906132b3565b6000546001600160a01b03163314611eea5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ad565b565b6001600160a01b038116611cdf5760405162461bcd60e51b815260206004820152601060248201527f4e6f74207a65726f20616464726573730000000000000000000000000000000060448201526064016109ad565b6002805403611f5057600080fd5b600280556001600160a01b03831660009081526003602090815260408083208151608081018352905467ffffffffffffffff8082168352680100000000000000008204811694830194909452600160801b8104841692820192909252600160c01b90910490911660608201528491611fca6009600a6134c6565b836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612008573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202c91906134d2565b61203790600a6134ef565b6120436012600a6134c6565b606085015161205c9067ffffffffffffffff16886134fe565b61206691906134fe565b6120709190613515565b61207a9190613515565b9050816020015167ffffffffffffffff16811061209757806120a7565b816020015167ffffffffffffffff165b9050803410156120f95760405162461bcd60e51b815260206004820152601160248201527f466565206973206e6f7420656e6f75676800000000000000000000000000000060448201526064016109ad565b80600a600082825461210b91906132e2565b9091555050604080516001600160a01b03878116825260208201879052808916928a821692918c16917f11a3bda8d2bae4e32ce5f5e314d014d59ecb5117f06c564a0025b73c037bb008910160405180910390a450506001600255505050505050565b6040516370a0823160e01b815230600482015283906000906001600160a01b038316906370a0823190602401602060405180830381865afa1580156121b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121db91906132b3565b90508281101561222d5760405162461bcd60e51b815260206004820152601360248201527f4c6172676572207468616e2062616c616e63650000000000000000000000000060448201526064016109ad565b836001600160a01b0316856001600160a01b03167ffb77546ff24ae381d0d05efd1e3f3c402609aa857d5003835c5e5cf1a8e5f52a8560405161227291815260200190565b60405180910390a361228e6001600160a01b0383168585612785565b6001600160a01b038281166000908152600760205260409020541615612376576001600160a01b038216600081815260086020526040908190205490516370a0823160e01b81523060048201529091906370a0823190602401602060405180830381865afa158015612304573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061232891906132b3565b10156123765760405162461bcd60e51b815260206004820152601760248201527f576f756c642072656d6f766520636f6c6c61746572616c00000000000000000060448201526064016109ad565b5050505050565b600280540361238b57600080fd5b600280556001600160a01b03831660009081526003602090815260408083208151608081018352905467ffffffffffffffff8082168352680100000000000000008204811694830194909452600160801b8104841692820192909252600160c01b909104909116606082015284916124056009600a6134c6565b836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612443573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061246791906134d2565b61247290600a6134ef565b61247e6012600a6134c6565b60408501516124979067ffffffffffffffff16886134fe565b6124a191906134fe565b6124ab9190613515565b6124b59190613515565b825190915067ffffffffffffffff1681106124d057806124dd565b815167ffffffffffffffff165b90508034101561252f5760405162461bcd60e51b815260206004820152601160248201527f466565206973206e6f7420656e6f75676800000000000000000000000000000060448201526064016109ad565b80600a600082825461254191906132e2565b9091555050604080516001600160a01b03878116825260208201879052808916928a821692918c16917fd3a5abeffcfa96b4a0e7cda5e18332d3433b069c5098a631e9a9e28bf9282800910160405180910390a46125a96001600160a01b0384168886612785565b50506001600255505050505050565b804710156126085760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016109ad565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612655576040519150601f19603f3d011682016040523d82523d6000602084013e61265a565b606091505b5050905080610fdd5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016109ad565b6005805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f27aae5db36d94179909d019ae0b1ac7c16d96d953148f63c0f6a0a9c8ead79ee90600090a250565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610fdd928692916000916128439185169084906128d3565b805190915015610fdd57808060200190518101906128619190613537565b610fdd5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016109ad565b6060611d79848460008585600080866001600160a01b031685876040516128fa9190613559565b60006040518083038185875af1925050503d8060008114612937576040519150601f19603f3d011682016040523d82523d6000602084013e61293c565b606091505b5091509150610a4487838387606083156129b75782516000036129b0576001600160a01b0385163b6129b05760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109ad565b5081611d79565b611d7983838151156129cc5781518083602001fd5b8060405162461bcd60e51b81526004016109ad9190612d66565b6001600160a01b0381168114611cdf57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612a3a57612a3a6129fb565b604052919050565b600067ffffffffffffffff821115612a5c57612a5c6129fb565b5060051b60200190565b600082601f830112612a7757600080fd5b81356020612a8c612a8783612a42565b612a11565b82815260059290921b84018101918181019086841115612aab57600080fd5b8286015b84811015612acf578035612ac2816129e6565b8352918301918301612aaf565b509695505050505050565b600082601f830112612aeb57600080fd5b81356020612afb612a8783612a42565b82815260059290921b84018101918181019086841115612b1a57600080fd5b8286015b84811015612acf5780358352918301918301612b1e565b600067ffffffffffffffff831115612b4f57612b4f6129fb565b612b626020601f19601f86011601612a11565b9050828152838383011115612b7657600080fd5b828260208301376000602084830101529392505050565b600082601f830112612b9e57600080fd5b81356020612bae612a8783612a42565b82815260059290921b84018101918181019086841115612bcd57600080fd5b8286015b84811015612acf57803567ffffffffffffffff811115612bf15760008081fd5b8701603f81018913612c035760008081fd5b612c14898683013560408401612b35565b845250918301918301612bd1565b600080600080600060a08688031215612c3a57600080fd5b8535612c45816129e6565b9450602086013567ffffffffffffffff80821115612c6257600080fd5b612c6e89838a01612a66565b95506040880135915080821115612c8457600080fd5b612c9089838a01612ada565b94506060880135915080821115612ca657600080fd5b50612cb388828901612b8d565b95989497509295608001359392505050565b60008060008060808587031215612cdb57600080fd5b8435612ce6816129e6565b93506020850135612cf6816129e6565b92506040850135612d06816129e6565b9396929550929360600135925050565b60005b83811015612d31578181015183820152602001612d19565b50506000910152565b60008151808452612d52816020860160208601612d16565b601f01601f19169290920160200192915050565b602081526000610f2f6020830184612d3a565b60008060408385031215612d8c57600080fd5b8235612d97816129e6565b91506020830135612da7816129e6565b809150509250929050565b60ff81168114611cdf57600080fd5b600080600080600060808688031215612dd957600080fd5b8535612de4816129e6565b9450602086013593506040860135612dfb81612db2565b9250606086013567ffffffffffffffff80821115612e1857600080fd5b818801915088601f830112612e2c57600080fd5b813581811115612e3b57600080fd5b896020828501011115612e4d57600080fd5b9699959850939650602001949392505050565b600060208284031215612e7257600080fd5b8135612e7d816129e6565b9392505050565b600060208284031215612e9657600080fd5b5035919050565b600080600060608486031215612eb257600080fd5b8335612ebd816129e6565b92506020840135612ecd816129e6565b929592945050506040919091013590565b600081518084526020808501945080840160005b83811015612f175781516001600160a01b031687529582019590820190600101612ef2565b509495945050505050565b602081526000610f2f6020830184612ede565b600082601f830112612f4657600080fd5b610f2f83833560208501612b35565b60008060408385031215612f6857600080fd5b8235612f73816129e6565b9150602083013567ffffffffffffffff811115612f8f57600080fd5b612f9b85828601612f35565b9150509250929050565b803567ffffffffffffffff81168114612fbd57600080fd5b919050565b60008060008060008060c08789031215612fdb57600080fd5b8635612fe6816129e6565b95506020870135612ff6816129e6565b945061300460408801612fa5565b935061301260608801612fa5565b925061302060808801612fa5565b915061302e60a08801612fa5565b90509295509295509295565b600080600080600060a0868803121561305257600080fd5b853561305d816129e6565b945061306b60208701612fa5565b935061307960408701612fa5565b925061308760608701612fa5565b915061309560808701612fa5565b90509295509295909350565b6000806000606084860312156130b657600080fd5b83356130c1816129e6565b92506020840135915060408401356130d881612db2565b809150509250925092565b600080600080600060a086880312156130fb57600080fd5b8535613106816129e6565b9450602086013567ffffffffffffffff8082111561312357600080fd5b61312f89838a01612a66565b9550604088013591508082111561314557600080fd5b61315189838a01612ada565b9450606088013591508082111561316757600080fd5b61317389838a01612b8d565b9350608088013591508082111561318957600080fd5b5061319688828901612f35565b9150509295509295909350565b6000806000606084860312156131b857600080fd5b83356131c3816129e6565b925060208401356131d3816129e6565b915060408401356130d8816129e6565b600081518084526020808501945080840160005b83811015612f17578151875295820195908201906001016131f7565b600081518084526020808501808196508360051b8101915082860160005b8581101561325b578284038952613249848351612d3a565b98850198935090840190600101613231565b5091979650505050505050565b60808152600061327b6080830187612ede565b828103602084015261328d81876131e3565b905082810360408401526132a18186613213565b91505082606083015295945050505050565b6000602082840312156132c557600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610f3257610f326132cc565b84815260ff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f909201601f191601019392505050565b634e487b7160e01b600052603260045260246000fd5b81810381811115610f3257610f326132cc565b60006020828403121561337057600080fd5b8151612e7d816129e6565b6000600019820361338e5761338e6132cc565b5060010190565b6080815260006133a86080830187612ede565b82810360208401526133ba81876131e3565b905082810360408401526133ce8186613213565b90508281036060840152610a448185612d3a565b600181815b8085111561341d578160001904821115613403576134036132cc565b8085161561341057918102915b93841c93908002906133e7565b509250929050565b60008261343457506001610f32565b8161344157506000610f32565b816001811461345757600281146134615761347d565b6001915050610f32565b60ff841115613472576134726132cc565b50506001821b610f32565b5060208310610133831016604e8410600b84101617156134a0575081810a610f32565b6134aa83836133e2565b80600019048211156134be576134be6132cc565b029392505050565b6000610f2f8383613425565b6000602082840312156134e457600080fd5b8151612e7d81612db2565b6000610f2f60ff841683613425565b8082028115828204841417610f3257610f326132cc565b60008261353257634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561354957600080fd5b81518015158114612e7d57600080fd5b6000825161356b818460208701612d16565b919091019291505056fea26469706673582212205e4e3e57c3e450dc3c5dbaa72af4174c82d765c2f19e9edc97cac915efdc1c8964736f6c63430008110033
Deployed Bytecode Sourcemap
1946:15056:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4142:439:15;;;;;;;;;;-1:-1:-1;4142:439:15;;;;;:::i;:::-;;:::i;:::-;;;5044:25:16;;;5032:2;5017:18;4142:439:15;;;;;;;;11534:1037:0;;;;;;:::i;:::-;;:::i;:::-;;3821:94;;;;;;;;;;-1:-1:-1;3886:21:0;;;;;;;;;;;;;;;;3821:94;;;;3886:21;3821:94;:::i;16887:112::-;;;;;;;;;;-1:-1:-1;16969:15:0;:22;16887:112;;756:389:15;;;;;;;;;;-1:-1:-1;756:389:15;;;;;:::i;:::-;;:::i;2892:24:0:-;;;;;;;;;;;;;;;;3582:405:15;;;;;;;;;;-1:-1:-1;3582:405:15;;;;;:::i;:::-;;:::i;7770:153:0:-;;;;;;;;;;-1:-1:-1;7770:153:0;;;;;:::i;:::-;-1:-1:-1;;;;;7880:12:0;7838:22;7880:12;;;:5;:12;;;;;:35;;;;7770:153;16501:119;;;;;;;;;;-1:-1:-1;16501:119:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8549:55:16;;;8531:74;;8519:2;8504:18;16501:119:0;8385:226:16;679:190:13;;;;;;;;;;-1:-1:-1;679:190:13;;;;;:::i;:::-;;:::i;8215:151:0:-;;;;;;;;;;-1:-1:-1;8215:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;8324:12:0;8282:22;8324:12;;;:5;:12;;;;;:34;;;;;;;8215:151;7996:145;;;;;;;;;;-1:-1:-1;7996:145:0;;;;;:::i;:::-;-1:-1:-1;;;;;8101:12:0;8061:20;8101:12;;;:5;:12;;;;;:32;-1:-1:-1;;;8101:32:0;;;;;7996:145;7492:203;;;;;;;;;;-1:-1:-1;7492:203:0;;;;;:::i;:::-;;:::i;14427:188::-;;;;;;;;;;-1:-1:-1;14427:188:0;;;;;:::i;:::-;;:::i;9387:1110::-;;;;;;:::i;:::-;;:::i;2678:52::-;;;;;;;;;;-1:-1:-1;2678:52:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;2678:52:0;;;13963:276;;;;;;;;;;;;;:::i;2737:53::-;;;;;;;;;;-1:-1:-1;2737:53:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;2737:53:0;;;16697:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;1979:172:13:-;;;;;;;;;;-1:-1:-1;1979:172:13;;;;;:::i;:::-;;:::i;1174:87:12:-;;;;;;;;;;-1:-1:-1;1220:7:12;1247:6;-1:-1:-1;;;;;1247:6:12;1174:87;;3568:245:0;;;;;;;;;;-1:-1:-1;3568:245:0;;;;;:::i;:::-;;:::i;5130:1116::-;;;;;;;;;;-1:-1:-1;5130:1116:0;;;;;:::i;:::-;;:::i;15938:203::-;;;;;;;;;;-1:-1:-1;15938:203:0;;;;;:::i;:::-;;:::i;4154:864::-;;;;;;;;;;-1:-1:-1;4154:864:0;;;;;:::i;:::-;;:::i;8438:143::-;;;;;;;;;;-1:-1:-1;8438:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;8542:12:0;8502:20;8542:12;;;:5;:12;;;;;:31;-1:-1:-1;;;8542:31:0;;;;;8438:143;2797:44;;;;;;;;;;-1:-1:-1;2797:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;15438:367;;;;;;;;;;;;;:::i;1368:286:15:-;;;;;;;;;;-1:-1:-1;1368:286:15;;;;;:::i;:::-;;:::i;2635:34:0:-;;;;;;;;;;-1:-1:-1;2635:34:0;;;;-1:-1:-1;;;;;2635:34:0;;;6342:854;;;;;;;;;;-1:-1:-1;6342:854:0;;;;;:::i;:::-;;:::i;3095:344:15:-;;;;;;;;;;-1:-1:-1;3095:344:15;;;;;:::i;:::-;;:::i;1788:452::-;;;;;;;;;;-1:-1:-1;1788:452:15;;;;;:::i;:::-;;:::i;13524:143:0:-;;;;;;;;;;-1:-1:-1;13524:143:0;;;;;:::i;:::-;;:::i;2590:38::-;;;;;;;;;;-1:-1:-1;2590:38:0;;;;-1:-1:-1;;;;;2590:38:0;;;484:46:15;;;;;;;;;;-1:-1:-1;484:46:15;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;484:46:15;;;1307:276:13;;;;;;;;;;-1:-1:-1;1307:276:13;;;;;:::i;:::-;;:::i;1615:144:12:-;;;;;;;;;;-1:-1:-1;1615:144:12;;;;;:::i;:::-;;:::i;8657:551:0:-;;;;;;;;;;-1:-1:-1;8657:551:0;;;;;:::i;:::-;-1:-1:-1;;;;;8979:12:0;8766:31;8979:12;;;:5;:12;;;;;;;;;8955:36;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8955:36:0;;;;;;;;;;-1:-1:-1;;;8955:36:0;;;;;;;;;;;;8657:551;;;;;16296:25:16;;;16352:2;16337:18;;16330:34;;;;16380:18;;;16373:34;16438:2;16423:18;;16416:34;16283:3;16268:19;8657:551:0;16065:391:16;2489:482:15;;;;;;:::i;:::-;;:::i;4142:439::-;4360:7;1061:12:12;:10;:12::i;:::-;-1:-1:-1;;;;;4401:22:15;;::::1;4380:18;4401:22:::0;;;:9:::1;:22;::::0;;;;;::::1;::::0;4434:60:::1;;;::::0;-1:-1:-1;;;4434:60:15;;16663:2:16;4434:60:15::1;::::0;::::1;16645:21:16::0;16702:2;16682:18;;;16675:30;-1:-1:-1;;;16721:18:16;;;16714:46;16777:18;;4434:60:15::1;;;;;;;;;4514:59;::::0;;;;-1:-1:-1;;;;;4514:14:15;::::1;::::0;::::1;::::0;:59:::1;::::0;4529:7;;4538:6;;4546:9;;4557:15;;4514:59:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4507:66:::0;4142:439;-1:-1:-1;;;;;;;4142:439:15:o;11534:1037:0:-;11707:33;11722:17;11707:14;:33::i;:::-;11751:27;11766:11;11751:14;:27::i;:::-;11789:25;11804:9;11789:14;:25::i;:::-;-1:-1:-1;;;;;11955:24:0;;;11827:14;11955:24;;;:12;:24;;;;;;690:10:11;;11955:24:0;;;11999:21;;;11991:63;;;;-1:-1:-1;;;11991:63:0;;19020:2:16;11991:63:0;;;19002:21:16;19059:2;19039:18;;;19032:30;19098:31;19078:18;;;19071:59;19147:18;;11991:63:0;18818:353:16;11991:63:0;-1:-1:-1;;;;;12095:22:0;;12067:25;12095:22;;;:10;:22;;;;;;12160:27;12181:6;12095:22;12160:27;:::i;:::-;;;12223:17;12198:10;:22;12209:10;-1:-1:-1;;;;;12198:22:0;-1:-1:-1;;;;;12198:22:0;;;;;;;;;;;;:42;;;;12280:10;-1:-1:-1;;;;;12280:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12259:17;:45;;12251:80;;;;-1:-1:-1;;;12251:80:0;;19697:2:16;12251:80:0;;;19679:21:16;19736:2;19716:18;;;19709:30;19775:24;19755:18;;;19748:52;19817:18;;12251:80:0;19495:346:16;12251:80:0;12344:72;12353:11;12366:9;12377:17;12396:11;12409:6;12344:8;:72::i;:::-;12481:35;;-1:-1:-1;;;12481:35:0;;12510:4;12481:35;;;8531:74:16;12520:17:0;;-1:-1:-1;;;;;12481:20:0;;;;;8504:18:16;;12481:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;12473:90;;;;-1:-1:-1;;;12473:90:0;;20048:2:16;12473:90:0;;;20030:21:16;20087:2;20067:18;;;20060:30;20126:23;20106:18;;;20099:51;20167:18;;12473:90:0;19846:345:16;12473:90:0;11696:875;;;;11534:1037;;;;:::o;756:389:15:-;1061:12:12;:10;:12::i;:::-;-1:-1:-1;;;;;870:31:15;::::1;862:60;;;::::0;-1:-1:-1;;;862:60:15;;20398:2:16;862:60:15::1;::::0;::::1;20380:21:16::0;20437:2;20417:18;;;20410:30;20476:18;20456;;;20449:46;20512:18;;862:60:15::1;20196:340:16::0;862:60:15::1;-1:-1:-1::0;;;;;941:29:15;::::1;933:58;;;::::0;-1:-1:-1;;;933:58:15;;20398:2:16;933:58:15::1;::::0;::::1;20380:21:16::0;20437:2;20417:18;;;20410:30;20476:18;20456;;;20449:46;20512:18;;933:58:15::1;20196:340:16::0;933:58:15::1;-1:-1:-1::0;;;;;1004:28:15;;::::1;;::::0;;;:9:::1;:28;::::0;;;;;:57;;-1:-1:-1;;1004:57:15::1;::::0;;::::1;::::0;;::::1;::::0;;1079:58;::::1;::::0;1004:28;1079:58:::1;756:389:::0;;:::o;3582:405::-;3761:15;1061:12:12;:10;:12::i;:::-;-1:-1:-1;;;;;3810:22:15;;::::1;3789:18;3810:22:::0;;;:9:::1;:22;::::0;;;;;::::1;::::0;3843:60:::1;;;::::0;-1:-1:-1;;;3843:60:15;;16663:2:16;3843:60:15::1;::::0;::::1;16645:21:16::0;16702:2;16682:18;;;16675:30;-1:-1:-1;;;16721:18:16;;;16714:46;16777:18;;3843:60:15::1;16461:340:16::0;3843:60:15::1;3923:56;::::0;;;;-1:-1:-1;;;;;3923:27:15;::::1;::::0;::::1;::::0;:56:::1;::::0;3951:10;;3963:7;;3972:6;;;;3923:56:::1;;;:::i;16501:119:0:-:0;16563:7;16590:15;16606:5;16590:22;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;16590:22:0;;16501:119;-1:-1:-1;;16501:119:0:o;679:190:13:-;772:12;1061::12;:10;:12::i;:::-;804:57:13::1;::::0;;;;-1:-1:-1;;;;;8549:55:16;;;804:57:13::1;::::0;::::1;8531:74:16::0;804:37:13;::::1;::::0;::::1;::::0;8504:18:16;;804:57:13::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;797:64;;1084:1:12;679:190:13::0;;;;:::o;7492:203:0:-;1061:12:12;:10;:12::i;:::-;7594:24:0::1;7609:8;7594:14;:24::i;:::-;7631:56;::::0;;;;-1:-1:-1;;;;;8549:55:16;;;7631:56:0::1;::::0;::::1;8531:74:16::0;7631:46:0;::::1;::::0;::::1;::::0;8504:18:16;;7631:56:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;7492:203:::0;;:::o;14427:188::-;1061:12:12;:10;:12::i;:::-;14536:18:0::1;14551:2;14536:14;:18::i;:::-;14567:40;14582:12;14596:2;14600:6;14567:14;:40::i;:::-;14427:188:::0;;;:::o;9387:1110::-;9561:33;9576:17;9561:14;:33::i;:::-;9605:27;9620:11;9605:14;:27::i;:::-;9643:25;9658:9;9643:14;:25::i;:::-;-1:-1:-1;;;;;9809:32:0;;;9681:14;9809:32;;;:12;:32;;;;;;690:10:11;;9809:32:0;;;9861:21;;;9853:63;;;;-1:-1:-1;;;9853:63:0;;19020:2:16;9853:63:0;;;19002:21:16;19059:2;19039:18;;;19032:30;19098:31;19078:18;;;19071:59;19147:18;;9853:63:0;18818:353:16;9853:63:0;-1:-1:-1;;;;;9994:22:0;;9966:25;9994:22;;;:10;:22;;;;;;;10045:35;;-1:-1:-1;;;10045:35:0;;10074:4;10045:35;;;8531:74:16;9994:22:0;;;10045:20;;8504:18:16;;10045:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10027:53;;10112:6;10101:7;:17;;:48;;;;10143:6;10122:17;:27;;10101:48;10093:82;;;;-1:-1:-1;;;10093:82:0;;20048:2:16;10093:82:0;;;20030:21:16;20087:2;20067:18;;;20060:30;20126:23;20106:18;;;20099:51;20167:18;;10093:82:0;19846:345:16;10093:82:0;10220:27;10241:6;10220:27;;:::i;:::-;-1:-1:-1;;;;;10258:22:0;;;;;;:10;:22;;;;;:42;;;10220:27;-1:-1:-1;10313:73:0;10323:11;10336:9;10347:17;10366:11;10379:6;10313:9;:73::i;:::-;10407:35;;-1:-1:-1;;;10407:35:0;;10436:4;10407:35;;;8531:74:16;10446:17:0;;-1:-1:-1;;;;;10407:20:0;;;;;8504:18:16;;10407:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;10399:90;;;;-1:-1:-1;;;10399:90:0;;20048:2:16;10399:90:0;;;20030:21:16;20087:2;20067:18;;;20060:30;20126:23;20106:18;;;20099:51;20167:18;;10399:90:0;19846:345:16;10399:90:0;9550:947;;;;;9387:1110;;;;:::o;13963:276::-;1061:12:12;:10;:12::i;:::-;14043:11:0::1;::::0;-1:-1:-1;;;;;14043:11:0::1;14067:24;14043:11:::0;14067:14:::1;:24::i;:::-;14161:30;::::0;14122:21:::1;5044:25:16::0;;;14122:21:0;-1:-1:-1;;;;;14161:30:0;::::1;::::0;::::1;::::0;5032:2:16;5017:18;14161:30:0::1;;;;;;;14204:27;-1:-1:-1::0;;;;;14204:18:0;::::1;14223:7:::0;14204:18:::1;:27::i;:::-;14005:234;;13963:276::o:0;16697:108::-;16746:16;16782:15;16775:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16775:22:0;;;;;;;;;;;;;;;;;;;;;;;16697:108;:::o;1979:172:13:-;2066:12;1061::12;:10;:12::i;:::-;2098:45:13::1;::::0;;;;-1:-1:-1;;;;;2098:39:13;::::1;::::0;::::1;::::0;:45:::1;::::0;2138:4;;2098:45:::1;;;:::i;3568:245:0:-:0;1061:12:12;:10;:12::i;:::-;3654:31:0::1;3669:15;3654:14;:31::i;:::-;3698:8;:50:::0;;-1:-1:-1;;3698:50:0::1;-1:-1:-1::0;;;;;3698:50:0;::::1;::::0;;::::1;::::0;;;3766:39:::1;::::0;::::1;::::0;-1:-1:-1;;3766:39:0::1;3568:245:::0;:::o;5130:1116::-;1061:12:12;:10;:12::i;:::-;-1:-1:-1;;;;;5491:24:0;;::::1;5417:17;5491:24:::0;;;:12:::1;:24;::::0;;;;;5444:17;;5491:24:::1;5483:47:::0;5475:84:::1;;;::::0;-1:-1:-1;;;5475:84:0;;21860:2:16;5475:84:0::1;::::0;::::1;21842:21:16::0;21899:2;21879:18;;;21872:30;21938:26;21918:18;;;21911:54;21982:18;;5475:84:0::1;21658:348:16::0;5475:84:0::1;5572:15;:39:::0;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;5572:39:0;;::::1;-1:-1:-1::0;;5572:39:0;;::::1;::::0;::::1;::::0;;;5700:24;;::::1;-1:-1:-1::0;5700:24:0;;;:12:::1;5572:39;5700:24:::0;;;;;;;:38;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;5749:24;;;:11:::1;:24:::0;;;;;:37;;;;::::1;::::0;;::::1;::::0;;;5826:159;;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;;5799:24;;;:5:::1;:24:::0;;;;;;:186;;;;;;;;;;;::::1;-1:-1:-1::0;;;5799:186:0::1;::::0;;;::::1;-1:-1:-1::0;;;5799:186:0::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;::::1;::::0;;;6003:235;;22271:34:16;;;22321:18;;;22314:43;;;;22373:18;;;22366:43;;;;22425:18;;22418:43;;;;5700:38:0;;;;6003:235:::1;::::0;22206:19:16;6003:235:0::1;;;;;;;5406:840;;5130:1116:::0;;;;;;:::o;15938:203::-;16001:7;16088:12;:44;16108:15;16124:5;16108:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;16108:22:0;;;16088:44;;;;;;;;;;;;;;;;;;15938:203;-1:-1:-1;;15938:203:0:o;4154:864::-;4426:26;1061:12:12;:10;:12::i;:::-;1241:1:0::1;2968:11:::0;::::1;:20:::0;2960:29:::1;;;::::0;::::1;;1241:1;3000:19:::0;;-1:-1:-1;;;;;4539:24:0;;::::2;4465:17;4539:24:::0;;;:12:::2;:24;::::0;;;;;4492:17;;4539:24:::2;4531:47:::0;4523:84:::2;;;::::0;-1:-1:-1;;;4523:84:0;;21860:2:16;4523:84:0::2;::::0;::::2;21842:21:16::0;21899:2;21879:18;;;21872:30;21938:26;21918:18;;;21911:54;21982:18;;4523:84:0::2;21658:348:16::0;4523:84:0::2;4641:8;::::0;;:54:::2;::::0;;;;-1:-1:-1;;;;;8549:55:16;;;4641:54:0;;::::2;8531:74:16::0;;;;4641:8:0;::::2;::::0;:35:::2;::::0;8504:18:16;;4641:54:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4620:75:::0;-1:-1:-1;;;;;;4714:32:0;::::2;4706:58;;;::::0;-1:-1:-1;;;4706:58:0;;22930:2:16;4706:58:0::2;::::0;::::2;22912:21:16::0;22969:2;22949:18;;;22942:30;23008:15;22988:18;;;22981:43;23041:18;;4706:58:0::2;22728:337:16::0;4706:58:0::2;4777:233;4805:17;4837:18;4870:23;4908:22;4945:20;4980:19;4777:13;:233::i;:::-;-1:-1:-1::0;1212:1:0::1;3176:11;:20:::0;4154:864;;-1:-1:-1;;;;;4154:864:0:o;15438:367::-;15541:15;:22;15488:23;;15541:22;15583:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15583:21:0;;15574:30;;15622:9;15617:181;15641:6;15637:1;:10;15617:181;;;15745:12;:40;15765:15;15781:1;15765:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;15765:18:0;;;15745:40;;;;;;;;;;;;;;;;15725:9;;15745:40;;;15725:6;;15732:1;;15725:9;;;;;;:::i;:::-;-1:-1:-1;;;;;15725:61:0;;;:9;;;;;;;;;;;:61;15649:3;;;;:::i;:::-;;;;15617:181;;;;15513:292;15438:367;:::o;1368:286:15:-;1061:12:12;:10;:12::i;:::-;-1:-1:-1;;;;;1456:31:15;::::1;1448:60;;;::::0;-1:-1:-1;;;1448:60:15;;20398:2:16;1448:60:15::1;::::0;::::1;20380:21:16::0;20437:2;20417:18;;;20410:30;20476:18;20456;;;20449:46;20512:18;;1448:60:15::1;20196:340:16::0;1448:60:15::1;-1:-1:-1::0;;;;;1521:28:15;::::1;1570:1;1521:28:::0;;;:9:::1;:28;::::0;;;;;:52;;-1:-1:-1;;1521:52:15::1;::::0;;1591:55;1570:1;;1521:28;1591:55:::1;::::0;1570:1;;1591:55:::1;1368:286:::0;:::o;6342:854:0:-;1061:12:12;:10;:12::i;:::-;-1:-1:-1;;;;;6664:25:0;;::::1;6584:18;6664:25:::0;;;:12:::1;:25;::::0;;;;;6612:10;;6664:25:::1;::::0;6703:58:::1;;;::::0;-1:-1:-1;;;6703:58:0;;23472:2:16;6703:58:0::1;::::0;::::1;23454:21:16::0;23511:2;23491:18;;;23484:30;23550:22;23530:18;;;23523:50;23590:18;;6703:58:0::1;23270:344:16::0;6703:58:0::1;6794:159;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;;::::0;;::::1;::::0;;;;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;-1:-1:-1;;;;;6774:17:0;;::::1;-1:-1:-1::0;6774:17:0;;;:5:::1;:17:::0;;;;;;;:179;;;;;;;;;;;::::1;-1:-1:-1::0;;;6774:179:0::1;::::0;;;::::1;-1:-1:-1::0;;;6774:179:0::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;::::1;::::0;;;6971:217;;;;::::1;::::0;6774:17;6971:217:::1;::::0;::::1;::::0;6813:23;;6851:22;;6888:20;;6923:19;;22244:18:16;22289:15;;;22271:34;;22341:15;;;22336:2;22321:18;;22314:43;22393:15;;;22388:2;22373:18;;22366:43;22445:15;;;22440:2;22425:18;;22418:43;22221:3;22206:19;;22011:456;6971:217:0::1;;;;;;;;6573:623;;6342:854:::0;;;;;:::o;3095:344:15:-;3231:15;1061:12:12;:10;:12::i;:::-;-1:-1:-1;;;;;3280:22:15;;::::1;3259:18;3280:22:::0;;;:9:::1;:22;::::0;;;;;::::1;::::0;3313:60:::1;;;::::0;-1:-1:-1;;;3313:60:15;;16663:2:16;3313:60:15::1;::::0;::::1;16645:21:16::0;16702:2;16682:18;;;16675:30;-1:-1:-1;;;16721:18:16;;;16714:46;16777:18;;3313:60:15::1;16461:340:16::0;3313:60:15::1;3393:38;::::0;;;;::::1;::::0;::::1;23789:25:16::0;;;23862:4;23850:17;;23830:18;;;23823:45;-1:-1:-1;;;;;3393:17:15;::::1;::::0;::::1;::::0;23762:18:16;;3393:38:15::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3386:45:::0;3095:344;-1:-1:-1;;;;;3095:344:15:o;1788:452::-;2010:18;1061:12:12;:10;:12::i;:::-;-1:-1:-1;;;;;2062:22:15;;::::1;2041:18;2062:22:::0;;;:9:::1;:22;::::0;;;;;::::1;::::0;2095:60:::1;;;::::0;-1:-1:-1;;;2095:60:15;;16663:2:16;2095:60:15::1;::::0;::::1;16645:21:16::0;16702:2;16682:18;;;16675:30;-1:-1:-1;;;16721:18:16;;;16714:46;16777:18;;2095:60:15::1;16461:340:16::0;2095:60:15::1;2175:57;::::0;;;;-1:-1:-1;;;;;2175:16:15;::::1;::::0;::::1;::::0;:57:::1;::::0;2192:7;;2201:6;;2209:9;;2220:11;;2175:57:::1;;;:::i;13524:143:0:-:0;1061:12:12;:10;:12::i;:::-;13596:23:0::1;13611:7;13596:14;:23::i;:::-;13632:27;13651:7;13632:18;:27::i;:::-;13524:143:::0;:::o;1307:276:13:-;1464:12;1061::12;:10;:12::i;:::-;1496:79:13::1;::::0;;;;-1:-1:-1;;;;;24987:15:16;;;1496:79:13::1;::::0;::::1;24969:34:16::0;25039:15;;;25019:18;;;25012:43;1496:49:13;::::1;::::0;::::1;::::0;24881:18:16;;1496:79:13::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1489:86:::0;1307:276;-1:-1:-1;;;;1307:276:13:o;1615:144:12:-;1061:12;:10;:12::i;:::-;1688:24:::1;1703:8;1688:14;:24::i;:::-;1723:28;1742:8;1723:18;:28::i;2489:482:15:-:0;2717:18;1061:12:12;:10;:12::i;:::-;-1:-1:-1;;;;;2769:22:15;;::::1;2748:18;2769:22:::0;;;:9:::1;:22;::::0;;;;;::::1;::::0;2802:60:::1;;;::::0;-1:-1:-1;;;2802:60:15;;16663:2:16;2802:60:15::1;::::0;::::1;16645:21:16::0;16702:2;16682:18;;;16675:30;-1:-1:-1;;;16721:18:16;;;16714:46;16777:18;;2802:60:15::1;16461:340:16::0;2802:60:15::1;2882:81;::::0;;;;-1:-1:-1;;;;;2882:16:15;::::1;::::0;::::1;::::0;2907:9:::1;::::0;2882:81:::1;::::0;2919:7;;2928:6;;2936:9;;2947:15;;2882:81:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1339:121:12:-:0;1393:6;;-1:-1:-1;;;;;1393:6:12;690:10:11;1393:22:12;1385:67;;;;-1:-1:-1;;;1385:67:12;;25268:2:16;1385:67:12;;;25250:21:16;;;25287:18;;;25280:30;25346:34;25326:18;;;25319:62;25398:18;;1385:67:12;25066:356:16;1385:67:12;1339:121::o;2110:124::-;-1:-1:-1;;;;;2184:21:12;;2176:50;;;;-1:-1:-1;;;2176:50:12;;20398:2:16;2176:50:12;;;20380:21:16;20437:2;20417:18;;;20410:30;20476:18;20456;;;20449:46;20512:18;;2176:50:12;20196:340:16;12579:793:0;1241:1;2968:11;;:20;2960:29;;;;;;1241:1;3000:19;;-1:-1:-1;;;;;12890:26:0;::::1;12792:25;12890:26:::0;;;:5:::1;:26;::::0;;;;;;;12866:50;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;12866:50:0;::::1;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;12866:50:0;;::::1;::::0;;::::1;::::0;;;;12835:17;;13067:18:::1;1319:1;13067:2;:18;:::i;:::-;13029:10;-1:-1:-1::0;;;;;13029:19:0::1;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13023:27;::::0;:2:::1;:27;:::i;:::-;12984:21;1282:2;12984;:21;:::i;:::-;12953:28;::::0;::::1;::::0;12944:37:::1;::::0;::::1;;:6:::0;:37:::1;:::i;:::-;:61;;;;:::i;:::-;12943:108;;;;:::i;:::-;:142;;;;:::i;:::-;12929:156;;13108:9;:31;;;13102:37;;:3;:37;:77;;13176:3;13102:77;;;13142:9;:31;;;13102:77;;;13096:83;;13213:3;13200:9;:16;;13192:46;;;::::0;-1:-1:-1;;;13192:46:0;;27972:2:16;13192:46:0::1;::::0;::::1;27954:21:16::0;28011:2;27991:18;;;27984:30;28050:19;28030:18;;;28023:47;28087:18;;13192:46:0::1;27770:341:16::0;13192:46:0::1;13262:3;13249:9;;:16;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;13283:81:0::1;::::0;;-1:-1:-1;;;;;28308:55:16;;;28290:74;;28395:2;28380:18;;28373:34;;;13283:81:0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;::::1;::::0;28263:18:16;13283:81:0::1;;;;;;;-1:-1:-1::0;;1212:1:0;3176:11;:20;-1:-1:-1;;;;;;12579:793:0:o;14623:737::-;14782:30;;-1:-1:-1;;;14782:30:0;;14806:4;14782:30;;;8531:74:16;14738:12:0;;14716;;-1:-1:-1;;;;;14782:15:0;;;;;8504:18:16;;14782:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14764:48;;14842:6;14831:7;:17;;14823:49;;;;-1:-1:-1;;;14823:49:0;;28620:2:16;14823:49:0;;;28602:21:16;28659:2;28639:18;;;28632:30;28698:21;28678:18;;;28671:49;28737:18;;14823:49:0;28418:343:16;14823:49:0;14924:2;-1:-1:-1;;;;;14890:45:0;14910:12;-1:-1:-1;;;;;14890:45:0;;14928:6;14890:45;;;;5044:25:16;;5032:2;5017:18;;4898:177;14890:45:0;;;;;;;;14948:30;-1:-1:-1;;;;;14948:18:0;;14967:2;14971:6;14948:18;:30::i;:::-;-1:-1:-1;;;;;15203:19:0;;;15235:1;15203:19;;;:12;:19;;;;;;;15195:42;15191:162;;-1:-1:-1;;;;;15296:17:0;;;;;;:10;:17;;;;;;;;15262:30;;-1:-1:-1;;;15262:30:0;;15286:4;15262:30;;;8531:74:16;15296:17:0;;;15262:15;;8504:18:16;;15262:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;;15254:87;;;;-1:-1:-1;;;15254:87:0;;28968:2:16;15254:87:0;;;28950:21:16;29007:2;28987:18;;;28980:30;29046:25;29026:18;;;29019:53;29089:18;;15254:87:0;28766:347:16;15254:87:0;14705:655;;14623:737;;;:::o;10505:850::-;1241:1;2968:11;;:20;2960:29;;;;;;1241:1;3000:19;;-1:-1:-1;;;;;10817:26:0;::::1;10719:25;10817:26:::0;;;:5:::1;:26;::::0;;;;;;;10793:50;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;10793:50:0;::::1;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;10793:50:0;;::::1;::::0;;::::1;::::0;;;;10762:17;;10993:18:::1;1319:1;10993:2;:18;:::i;:::-;10955:10;-1:-1:-1::0;;;;;10955:19:0::1;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10949:27;::::0;:2:::1;:27;:::i;:::-;10910:21;1282:2;10910;:21;:::i;:::-;10878:29;::::0;::::1;::::0;10869:38:::1;::::0;::::1;;:6:::0;:38:::1;:::i;:::-;:62;;;;:::i;:::-;10868:109;;;;:::i;:::-;:143;;;;:::i;:::-;11034:32:::0;;10854:157;;-1:-1:-1;11028:38:0::1;;::::0;::::1;:79;;11104:3;11028:79;;;11069:32:::0;;11028:79:::1;;;11022:85;;11141:3;11128:9;:16;;11120:46;;;::::0;-1:-1:-1;;;11120:46:0;;27972:2:16;11120:46:0::1;::::0;::::1;27954:21:16::0;28011:2;27991:18;;;27984:30;28050:19;28030:18;;;28023:47;28087:18;;11120:46:0::1;27770:341:16::0;11120:46:0::1;11190:3;11177:9;;:16;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;11211:81:0::1;::::0;;-1:-1:-1;;;;;28308:55:16;;;28290:74;;28395:2;28380:18;;28373:34;;;11211:81:0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;::::1;::::0;28263:18:16;11211:81:0::1;;;;;;;11305:42;-1:-1:-1::0;;;;;11305:23:0;::::1;11329:9:::0;11340:6;11305:23:::1;:42::i;:::-;-1:-1:-1::0;;1212:1:0;3176:11;:20;-1:-1:-1;;;;;;10505:850:0:o;2470:319:10:-;2585:6;2560:21;:31;;2552:73;;;;-1:-1:-1;;;2552:73:10;;29320:2:16;2552:73:10;;;29302:21:16;29359:2;29339:18;;;29332:30;29398:31;29378:18;;;29371:59;29447:18;;2552:73:10;29118:353:16;2552:73:10;2639:12;2657:9;-1:-1:-1;;;;;2657:14:10;2680:6;2657:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2638:54;;;2711:7;2703:78;;;;-1:-1:-1;;;2703:78:10;;29888:2:16;2703:78:10;;;29870:21:16;29927:2;29907:18;;;29900:30;29966:34;29946:18;;;29939:62;30037:28;30017:18;;;30010:56;30083:19;;2703:78:10;29686:422:16;13675:147:0;13739:11;:30;;-1:-1:-1;;13739:30:0;-1:-1:-1;;;;;13739:30:0;;;;;;;;13787:27;;;;-1:-1:-1;;13787:27:0;13675:147;:::o;1919:183:12:-;1985:16;2004:6;;-1:-1:-1;;;;;2021:17:12;;;-1:-1:-1;;2021:17:12;;;;;;2054:40;;2004:6;;;;;;;2054:40;;1985:16;2054:40;1974:128;1919:183;:::o;912:177:14:-;1022:58;;;-1:-1:-1;;;;;28308:55:16;;;1022:58:14;;;28290:74:16;28380:18;;;;28373:34;;;1022:58:14;;;;;;;;;;28263:18:16;;;;1022:58:14;;;;;;;;;;1045:23;1022:58;;;2413:69;;;;;;;;;;;;;;;;995:86;;1015:5;;1022:58;-1:-1:-1;;2413:69:14;;:27;;;1022:58;;2413:27;:69::i;:::-;2497:17;;2387:95;;-1:-1:-1;2497:21:14;2493:179;;2594:10;2583:30;;;;;;;;;;;;:::i;:::-;2575:85;;;;-1:-1:-1;;;2575:85:14;;30597:2:16;2575:85:14;;;30579:21:16;30636:2;30616:18;;;30609:30;30675:34;30655:18;;;30648:62;30746:12;30726:18;;;30719:40;30776:19;;2575:85:14;30395:406:16;3968:229:10;4105:12;4137:52;4159:6;4167:4;4173:1;4176:12;4105;5342;5356:23;5383:6;-1:-1:-1;;;;;5383:11:10;5403:5;5411:4;5383:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5341:75;;;;5434:69;5461:6;5469:7;5478:10;5490:12;7814;7843:7;7839:427;;;7871:10;:17;7892:1;7871:22;7867:290;;-1:-1:-1;;;;;1505:19:10;;;8081:60;;;;-1:-1:-1;;;8081:60:10;;31707:2:16;8081:60:10;;;31689:21:16;31746:2;31726:18;;;31719:30;31785:31;31765:18;;;31758:59;31834:18;;8081:60:10;31505:353:16;8081:60:10;-1:-1:-1;8178:10:10;8171:17;;7839:427;8221:33;8229:10;8241:12;8976:17;;:21;8972:388;;9208:10;9202:17;9265:15;9252:10;9248:2;9244:19;9237:44;8972:388;9335:12;9328:20;;-1:-1:-1;;;9328:20:10;;;;;;;;:::i;14:154:16:-;-1:-1:-1;;;;;93:5:16;89:54;82:5;79:65;69:93;;158:1;155;148:12;173:184;-1:-1:-1;;;222:1:16;215:88;322:4;319:1;312:15;346:4;343:1;336:15;362:334;433:2;427:9;489:2;479:13;;-1:-1:-1;;475:86:16;463:99;;592:18;577:34;;613:22;;;574:62;571:88;;;639:18;;:::i;:::-;675:2;668:22;362:334;;-1:-1:-1;362:334:16:o;701:183::-;761:4;794:18;786:6;783:30;780:56;;;816:18;;:::i;:::-;-1:-1:-1;861:1:16;857:14;873:4;853:25;;701:183::o;889:737::-;943:5;996:3;989:4;981:6;977:17;973:27;963:55;;1014:1;1011;1004:12;963:55;1050:6;1037:20;1076:4;1100:60;1116:43;1156:2;1116:43;:::i;:::-;1100:60;:::i;:::-;1194:15;;;1280:1;1276:10;;;;1264:23;;1260:32;;;1225:12;;;;1304:15;;;1301:35;;;1332:1;1329;1322:12;1301:35;1368:2;1360:6;1356:15;1380:217;1396:6;1391:3;1388:15;1380:217;;;1476:3;1463:17;1493:31;1518:5;1493:31;:::i;:::-;1537:18;;1575:12;;;;1413;;1380:217;;;-1:-1:-1;1615:5:16;889:737;-1:-1:-1;;;;;;889:737:16:o;1631:662::-;1685:5;1738:3;1731:4;1723:6;1719:17;1715:27;1705:55;;1756:1;1753;1746:12;1705:55;1792:6;1779:20;1818:4;1842:60;1858:43;1898:2;1858:43;:::i;1842:60::-;1936:15;;;2022:1;2018:10;;;;2006:23;;2002:32;;;1967:12;;;;2046:15;;;2043:35;;;2074:1;2071;2064:12;2043:35;2110:2;2102:6;2098:15;2122:142;2138:6;2133:3;2130:15;2122:142;;;2204:17;;2192:30;;2242:12;;;;2155;;2122:142;;2298:465;2362:5;2396:18;2388:6;2385:30;2382:56;;;2418:18;;:::i;:::-;2456:116;2566:4;-1:-1:-1;;2492:2:16;2484:6;2480:15;2476:88;2472:99;2456:116;:::i;:::-;2447:125;;2595:6;2588:5;2581:21;2635:3;2626:6;2621:3;2617:16;2614:25;2611:45;;;2652:1;2649;2642:12;2611:45;2701:6;2696:3;2689:4;2682:5;2678:16;2665:43;2755:1;2748:4;2739:6;2732:5;2728:18;2724:29;2717:40;2298:465;;;;;:::o;2768:1087::-;2820:5;2873:3;2866:4;2858:6;2854:17;2850:27;2840:55;;2891:1;2888;2881:12;2840:55;2927:6;2914:20;2953:4;2977:60;2993:43;3033:2;2993:43;:::i;2977:60::-;3071:15;;;3157:1;3153:10;;;;3141:23;;3137:32;;;3102:12;;;;3181:15;;;3178:35;;;3209:1;3206;3199:12;3178:35;3245:2;3237:6;3233:15;3257:569;3273:6;3268:3;3265:15;3257:569;;;3359:3;3346:17;3395:18;3382:11;3379:35;3376:125;;;3455:1;3484:2;3480;3473:14;3376:125;3524:24;;3583:2;3575:11;;3571:21;-1:-1:-1;3561:119:16;;3634:1;3663:2;3659;3652:14;3561:119;3705:78;3779:3;3773:2;3769;3765:11;3752:25;3747:2;3743;3739:11;3705:78;:::i;:::-;3693:91;;-1:-1:-1;3804:12:16;;;;3290;;3257:569;;3860:1033;4039:6;4047;4055;4063;4071;4124:3;4112:9;4103:7;4099:23;4095:33;4092:53;;;4141:1;4138;4131:12;4092:53;4180:9;4167:23;4199:31;4224:5;4199:31;:::i;:::-;4249:5;-1:-1:-1;4305:2:16;4290:18;;4277:32;4328:18;4358:14;;;4355:34;;;4385:1;4382;4375:12;4355:34;4408:61;4461:7;4452:6;4441:9;4437:22;4408:61;:::i;:::-;4398:71;;4522:2;4511:9;4507:18;4494:32;4478:48;;4551:2;4541:8;4538:16;4535:36;;;4567:1;4564;4557:12;4535:36;4590:63;4645:7;4634:8;4623:9;4619:24;4590:63;:::i;:::-;4580:73;;4706:2;4695:9;4691:18;4678:32;4662:48;;4735:2;4725:8;4722:16;4719:36;;;4751:1;4748;4741:12;4719:36;;4774:61;4827:7;4816:8;4805:9;4801:24;4774:61;:::i;:::-;3860:1033;;;;-1:-1:-1;3860:1033:16;;4882:3;4867:19;4854:33;;3860:1033;-1:-1:-1;;;3860:1033:16:o;5080:598::-;5166:6;5174;5182;5190;5243:3;5231:9;5222:7;5218:23;5214:33;5211:53;;;5260:1;5257;5250:12;5211:53;5299:9;5286:23;5318:31;5343:5;5318:31;:::i;:::-;5368:5;-1:-1:-1;5425:2:16;5410:18;;5397:32;5438:33;5397:32;5438:33;:::i;:::-;5490:7;-1:-1:-1;5549:2:16;5534:18;;5521:32;5562:33;5521:32;5562:33;:::i;:::-;5080:598;;;;-1:-1:-1;5614:7:16;;5668:2;5653:18;5640:32;;-1:-1:-1;;5080:598:16:o;5683:250::-;5768:1;5778:113;5792:6;5789:1;5786:13;5778:113;;;5868:11;;;5862:18;5849:11;;;5842:39;5814:2;5807:10;5778:113;;;-1:-1:-1;;5925:1:16;5907:16;;5900:27;5683:250::o;5938:330::-;5980:3;6018:5;6012:12;6045:6;6040:3;6033:19;6061:76;6130:6;6123:4;6118:3;6114:14;6107:4;6100:5;6096:16;6061:76;:::i;:::-;6182:2;6170:15;-1:-1:-1;;6166:88:16;6157:98;;;;6257:4;6153:109;;5938:330;-1:-1:-1;;5938:330:16:o;6273:220::-;6422:2;6411:9;6404:21;6385:4;6442:45;6483:2;6472:9;6468:18;6460:6;6442:45;:::i;6498:388::-;6566:6;6574;6627:2;6615:9;6606:7;6602:23;6598:32;6595:52;;;6643:1;6640;6633:12;6595:52;6682:9;6669:23;6701:31;6726:5;6701:31;:::i;:::-;6751:5;-1:-1:-1;6808:2:16;6793:18;;6780:32;6821:33;6780:32;6821:33;:::i;:::-;6873:7;6863:17;;;6498:388;;;;;:::o;6891:114::-;6975:4;6968:5;6964:16;6957:5;6954:27;6944:55;;6995:1;6992;6985:12;7010:933;7106:6;7114;7122;7130;7138;7191:3;7179:9;7170:7;7166:23;7162:33;7159:53;;;7208:1;7205;7198:12;7159:53;7247:9;7234:23;7266:31;7291:5;7266:31;:::i;:::-;7316:5;-1:-1:-1;7368:2:16;7353:18;;7340:32;;-1:-1:-1;7424:2:16;7409:18;;7396:32;7437:31;7396:32;7437:31;:::i;:::-;7487:7;-1:-1:-1;7545:2:16;7530:18;;7517:32;7568:18;7598:14;;;7595:34;;;7625:1;7622;7615:12;7595:34;7663:6;7652:9;7648:22;7638:32;;7708:7;7701:4;7697:2;7693:13;7689:27;7679:55;;7730:1;7727;7720:12;7679:55;7770:2;7757:16;7796:2;7788:6;7785:14;7782:34;;;7812:1;7809;7802:12;7782:34;7857:7;7852:2;7843:6;7839:2;7835:15;7831:24;7828:37;7825:57;;;7878:1;7875;7868:12;7825:57;7010:933;;;;-1:-1:-1;7010:933:16;;-1:-1:-1;7909:2:16;7901:11;;7931:6;7010:933;-1:-1:-1;;;7010:933:16:o;7948:247::-;8007:6;8060:2;8048:9;8039:7;8035:23;8031:32;8028:52;;;8076:1;8073;8066:12;8028:52;8115:9;8102:23;8134:31;8159:5;8134:31;:::i;:::-;8184:5;7948:247;-1:-1:-1;;;7948:247:16:o;8200:180::-;8259:6;8312:2;8300:9;8291:7;8287:23;8283:32;8280:52;;;8328:1;8325;8318:12;8280:52;-1:-1:-1;8351:23:16;;8200:180;-1:-1:-1;8200:180:16:o;8798:456::-;8875:6;8883;8891;8944:2;8932:9;8923:7;8919:23;8915:32;8912:52;;;8960:1;8957;8950:12;8912:52;8999:9;8986:23;9018:31;9043:5;9018:31;:::i;:::-;9068:5;-1:-1:-1;9125:2:16;9110:18;;9097:32;9138:33;9097:32;9138:33;:::i;:::-;8798:456;;9190:7;;-1:-1:-1;;;9244:2:16;9229:18;;;;9216:32;;8798:456::o;10301:484::-;10354:3;10392:5;10386:12;10419:6;10414:3;10407:19;10445:4;10474:2;10469:3;10465:12;10458:19;;10511:2;10504:5;10500:14;10532:1;10542:218;10556:6;10553:1;10550:13;10542:218;;;10621:13;;-1:-1:-1;;;;;10617:62:16;10605:75;;10700:12;;;;10735:15;;;;10578:1;10571:9;10542:218;;;-1:-1:-1;10776:3:16;;10301:484;-1:-1:-1;;;;;10301:484:16:o;10790:261::-;10969:2;10958:9;10951:21;10932:4;10989:56;11041:2;11030:9;11026:18;11018:6;10989:56;:::i;11056:221::-;11099:5;11152:3;11145:4;11137:6;11133:17;11129:27;11119:55;;11170:1;11167;11160:12;11119:55;11192:79;11267:3;11258:6;11245:20;11238:4;11230:6;11226:17;11192:79;:::i;11282:457::-;11360:6;11368;11421:2;11409:9;11400:7;11396:23;11392:32;11389:52;;;11437:1;11434;11427:12;11389:52;11476:9;11463:23;11495:31;11520:5;11495:31;:::i;:::-;11545:5;-1:-1:-1;11601:2:16;11586:18;;11573:32;11628:18;11617:30;;11614:50;;;11660:1;11657;11650:12;11614:50;11683;11725:7;11716:6;11705:9;11701:22;11683:50;:::i;:::-;11673:60;;;11282:457;;;;;:::o;11744:171::-;11811:20;;11871:18;11860:30;;11850:41;;11840:69;;11905:1;11902;11895:12;11840:69;11744:171;;;:::o;11920:679::-;12020:6;12028;12036;12044;12052;12060;12113:3;12101:9;12092:7;12088:23;12084:33;12081:53;;;12130:1;12127;12120:12;12081:53;12169:9;12156:23;12188:31;12213:5;12188:31;:::i;:::-;12238:5;-1:-1:-1;12295:2:16;12280:18;;12267:32;12308:33;12267:32;12308:33;:::i;:::-;12360:7;-1:-1:-1;12386:37:16;12419:2;12404:18;;12386:37;:::i;:::-;12376:47;;12442:37;12475:2;12464:9;12460:18;12442:37;:::i;:::-;12432:47;;12498:38;12531:3;12520:9;12516:19;12498:38;:::i;:::-;12488:48;;12555:38;12588:3;12577:9;12573:19;12555:38;:::i;:::-;12545:48;;11920:679;;;;;;;;:::o;12604:537::-;12695:6;12703;12711;12719;12727;12780:3;12768:9;12759:7;12755:23;12751:33;12748:53;;;12797:1;12794;12787:12;12748:53;12836:9;12823:23;12855:31;12880:5;12855:31;:::i;:::-;12905:5;-1:-1:-1;12929:37:16;12962:2;12947:18;;12929:37;:::i;:::-;12919:47;;12985:37;13018:2;13007:9;13003:18;12985:37;:::i;:::-;12975:47;;13041:37;13074:2;13063:9;13059:18;13041:37;:::i;:::-;13031:47;;13097:38;13130:3;13119:9;13115:19;13097:38;:::i;:::-;13087:48;;12604:537;;;;;;;;:::o;13393:452::-;13468:6;13476;13484;13537:2;13525:9;13516:7;13512:23;13508:32;13505:52;;;13553:1;13550;13543:12;13505:52;13592:9;13579:23;13611:31;13636:5;13611:31;:::i;:::-;13661:5;-1:-1:-1;13713:2:16;13698:18;;13685:32;;-1:-1:-1;13769:2:16;13754:18;;13741:32;13782:31;13741:32;13782:31;:::i;:::-;13832:7;13822:17;;;13393:452;;;;;:::o;13850:1165::-;14039:6;14047;14055;14063;14071;14124:3;14112:9;14103:7;14099:23;14095:33;14092:53;;;14141:1;14138;14131:12;14092:53;14180:9;14167:23;14199:31;14224:5;14199:31;:::i;:::-;14249:5;-1:-1:-1;14305:2:16;14290:18;;14277:32;14328:18;14358:14;;;14355:34;;;14385:1;14382;14375:12;14355:34;14408:61;14461:7;14452:6;14441:9;14437:22;14408:61;:::i;:::-;14398:71;;14522:2;14511:9;14507:18;14494:32;14478:48;;14551:2;14541:8;14538:16;14535:36;;;14567:1;14564;14557:12;14535:36;14590:63;14645:7;14634:8;14623:9;14619:24;14590:63;:::i;:::-;14580:73;;14706:2;14695:9;14691:18;14678:32;14662:48;;14735:2;14725:8;14722:16;14719:36;;;14751:1;14748;14741:12;14719:36;14774:61;14827:7;14816:8;14805:9;14801:24;14774:61;:::i;:::-;14764:71;;14888:3;14877:9;14873:19;14860:33;14844:49;;14918:2;14908:8;14905:16;14902:36;;;14934:1;14931;14924:12;14902:36;;14957:52;15001:7;14990:8;14979:9;14975:24;14957:52;:::i;:::-;14947:62;;;13850:1165;;;;;;;;:::o;15531:529::-;15608:6;15616;15624;15677:2;15665:9;15656:7;15652:23;15648:32;15645:52;;;15693:1;15690;15683:12;15645:52;15732:9;15719:23;15751:31;15776:5;15751:31;:::i;:::-;15801:5;-1:-1:-1;15858:2:16;15843:18;;15830:32;15871:33;15830:32;15871:33;:::i;:::-;15923:7;-1:-1:-1;15982:2:16;15967:18;;15954:32;15995:33;15954:32;15995:33;:::i;16806:435::-;16859:3;16897:5;16891:12;16924:6;16919:3;16912:19;16950:4;16979:2;16974:3;16970:12;16963:19;;17016:2;17009:5;17005:14;17037:1;17047:169;17061:6;17058:1;17055:13;17047:169;;;17122:13;;17110:26;;17156:12;;;;17191:15;;;;17083:1;17076:9;17047:169;;17246:615;17297:3;17335:5;17329:12;17362:6;17357:3;17350:19;17388:4;17429:2;17424:3;17420:12;17454:11;17481;17474:18;;17531:6;17528:1;17524:14;17517:5;17513:26;17501:38;;17573:2;17566:5;17562:14;17594:1;17604:231;17618:6;17615:1;17612:13;17604:231;;;17689:5;17683:4;17679:16;17674:3;17667:29;17717:38;17750:4;17741:6;17735:13;17717:38;:::i;:::-;17813:12;;;;17709:46;-1:-1:-1;17778:15:16;;;;17640:1;17633:9;17604:231;;;-1:-1:-1;17851:4:16;;17246:615;-1:-1:-1;;;;;;;17246:615:16:o;17866:758::-;18247:3;18236:9;18229:22;18210:4;18274:57;18326:3;18315:9;18311:19;18303:6;18274:57;:::i;:::-;18379:9;18371:6;18367:22;18362:2;18351:9;18347:18;18340:50;18413:44;18450:6;18442;18413:44;:::i;:::-;18399:58;;18505:9;18497:6;18493:22;18488:2;18477:9;18473:18;18466:50;18533:42;18568:6;18560;18533:42;:::i;:::-;18525:50;;;18611:6;18606:2;18595:9;18591:18;18584:34;17866:758;;;;;;;:::o;18629:184::-;18699:6;18752:2;18740:9;18731:7;18727:23;18723:32;18720:52;;;18768:1;18765;18758:12;18720:52;-1:-1:-1;18791:16:16;;18629:184;-1:-1:-1;18629:184:16:o;19176:::-;-1:-1:-1;;;19225:1:16;19218:88;19325:4;19322:1;19315:15;19349:4;19346:1;19339:15;19365:125;19430:9;;;19451:10;;;19448:36;;;19464:18;;:::i;20541:601::-;20752:6;20741:9;20734:25;20807:4;20799:6;20795:17;20790:2;20779:9;20775:18;20768:45;20849:2;20844;20833:9;20829:18;20822:30;20888:6;20883:2;20872:9;20868:18;20861:34;20946:6;20938;20932:3;20921:9;20917:19;20904:49;21003:1;20973:22;;;20997:3;20969:32;;;20962:43;;;;21057:2;21045:15;;;-1:-1:-1;;21041:88:16;21026:104;21022:114;;20541:601;-1:-1:-1;;;20541:601:16:o;21147:184::-;-1:-1:-1;;;21196:1:16;21189:88;21296:4;21293:1;21286:15;21320:4;21317:1;21310:15;21525:128;21592:9;;;21613:11;;;21610:37;;;21627:18;;:::i;22472:251::-;22542:6;22595:2;22583:9;22574:7;22570:23;22566:32;22563:52;;;22611:1;22608;22601:12;22563:52;22643:9;22637:16;22662:31;22687:5;22662:31;:::i;23070:195::-;23109:3;-1:-1:-1;;23133:5:16;23130:77;23127:103;;23210:18;;:::i;:::-;-1:-1:-1;23257:1:16;23246:13;;23070:195::o;23879:850::-;24280:3;24269:9;24262:22;24243:4;24307:57;24359:3;24348:9;24344:19;24336:6;24307:57;:::i;:::-;24412:9;24404:6;24400:22;24395:2;24384:9;24380:18;24373:50;24446:44;24483:6;24475;24446:44;:::i;:::-;24432:58;;24538:9;24530:6;24526:22;24521:2;24510:9;24506:18;24499:50;24572:42;24607:6;24599;24572:42;:::i;:::-;24558:56;;24662:9;24654:6;24650:22;24645:2;24634:9;24630:18;24623:50;24690:33;24716:6;24708;24690:33;:::i;25427:482::-;25516:1;25559:5;25516:1;25573:330;25594:7;25584:8;25581:21;25573:330;;;25713:4;-1:-1:-1;;25641:77:16;25635:4;25632:87;25629:113;;;25722:18;;:::i;:::-;25772:7;25762:8;25758:22;25755:55;;;25792:16;;;;25755:55;25871:22;;;;25831:15;;;;25573:330;;;25577:3;25427:482;;;;;:::o;25914:866::-;25963:5;25993:8;25983:80;;-1:-1:-1;26034:1:16;26048:5;;25983:80;26082:4;26072:76;;-1:-1:-1;26119:1:16;26133:5;;26072:76;26164:4;26182:1;26177:59;;;;26250:1;26245:130;;;;26157:218;;26177:59;26207:1;26198:10;;26221:5;;;26245:130;26282:3;26272:8;26269:17;26266:43;;;26289:18;;:::i;:::-;-1:-1:-1;;26345:1:16;26331:16;;26360:5;;26157:218;;26459:2;26449:8;26446:16;26440:3;26434:4;26431:13;26427:36;26421:2;26411:8;26408:16;26403:2;26397:4;26394:12;26390:35;26387:77;26384:159;;;-1:-1:-1;26496:19:16;;;26528:5;;26384:159;26575:34;26600:8;26594:4;26575:34;:::i;:::-;26705:6;-1:-1:-1;;26633:79:16;26624:7;26621:92;26618:118;;;26716:18;;:::i;:::-;26754:20;;25914:866;-1:-1:-1;;;25914:866:16:o;26785:131::-;26845:5;26874:36;26901:8;26895:4;26874:36;:::i;26921:247::-;26989:6;27042:2;27030:9;27021:7;27017:23;27013:32;27010:52;;;27058:1;27055;27048:12;27010:52;27090:9;27084:16;27109:29;27132:5;27109:29;:::i;27173:140::-;27231:5;27260:47;27301:4;27291:8;27287:19;27281:4;27260:47;:::i;27318:168::-;27391:9;;;27422;;27439:15;;;27433:22;;27419:37;27409:71;;27460:18;;:::i;27491:274::-;27531:1;27557;27547:189;;-1:-1:-1;;;27589:1:16;27582:88;27693:4;27690:1;27683:15;27721:4;27718:1;27711:15;27547:189;-1:-1:-1;27750:9:16;;27491:274::o;30113:277::-;30180:6;30233:2;30221:9;30212:7;30208:23;30204:32;30201:52;;;30249:1;30246;30239:12;30201:52;30281:9;30275:16;30334:5;30327:13;30320:21;30313:5;30310:32;30300:60;;30356:1;30353;30346:12;31213:287;31342:3;31380:6;31374:13;31396:66;31455:6;31450:3;31443:4;31435:6;31431:17;31396:66;:::i;:::-;31478:16;;;;;31213:287;-1:-1:-1;;31213:287:16:o
Swarm Source
ipfs://5e4e3e57c3e450dc3c5dbaa72af4174c82d765c2f19e9edc97cac915efdc1c89
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.