ETH Price: $2,290.81 (-3.46%)

Contract

0x6f38e0f1a73c96cB3f42598613EA3474F09cB200
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer207407102024-09-13 9:10:113 days ago1726218611IN
Aktionariat: DAKS Token
0 ETH0.000137054.01795191
Transfer207356982024-09-12 16:23:234 days ago1726158203IN
Aktionariat: DAKS Token
0 ETH0.000348918.96996436
Approve207349622024-09-12 13:54:594 days ago1726149299IN
Aktionariat: DAKS Token
0 ETH0.000257855.57606636
Approve207187482024-09-10 7:33:116 days ago1725953591IN
Aktionariat: DAKS Token
0 ETH0.000215644.66326722
Approve207062972024-09-08 13:49:598 days ago1725803399IN
Aktionariat: DAKS Token
0 ETH0.000074221.60506215
Approve206115432024-08-26 8:22:1121 days ago1724660531IN
Aktionariat: DAKS Token
0 ETH0.0004539.79610844
Approve205943552024-08-23 22:42:2323 days ago1724452943IN
Aktionariat: DAKS Token
0 ETH0.000175813.80208227
Approve205928272024-08-23 17:35:1124 days ago1724434511IN
Aktionariat: DAKS Token
0 ETH0.000092371.99770217
Approve204829812024-08-08 9:30:2339 days ago1723109423IN
Aktionariat: DAKS Token
0 ETH0.000453479.80642351
Approve204767832024-08-07 12:46:1140 days ago1723034771IN
Aktionariat: DAKS Token
0 ETH0.000245225.30303069
Approve204183862024-07-30 9:09:2348 days ago1722330563IN
Aktionariat: DAKS Token
0 ETH0.000230684.98860333
Approve204120112024-07-29 11:46:2349 days ago1722253583IN
Aktionariat: DAKS Token
0 ETH0.000194454.20499257
Transfer204113522024-07-29 9:34:3549 days ago1722245675IN
Aktionariat: DAKS Token
0 ETH0.000172655.05989969
Approve204110942024-07-29 8:42:2349 days ago1722242543IN
Aktionariat: DAKS Token
0 ETH0.000196744.25450713
Approve204109852024-07-29 8:20:3549 days ago1722241235IN
Aktionariat: DAKS Token
0 ETH0.000206374.46294452
Approve203916252024-07-26 15:29:3552 days ago1722007775IN
Aktionariat: DAKS Token
0 ETH0.000327617.08468248
Transfer203831672024-07-25 11:08:4753 days ago1721905727IN
Aktionariat: DAKS Token
0 ETH0.000183064.70620219
Transfer202904052024-07-12 12:25:2366 days ago1720787123IN
Aktionariat: DAKS Token
0 ETH0.000294375.25457579
Approve202179702024-07-02 9:34:5976 days ago1719912899IN
Aktionariat: DAKS Token
0 ETH0.000296626.36334574
Transfer And Cal...201389162024-06-21 8:31:3587 days ago1718958695IN
Aktionariat: DAKS Token
0 ETH0.000723639.36858049
Transfer And Cal...201386592024-06-21 7:39:4787 days ago1718955587IN
Aktionariat: DAKS Token
0 ETH0.000545716.09379808
Transfer And Cal...200925272024-06-14 20:46:4793 days ago1718398007IN
Aktionariat: DAKS Token
0 ETH0.000623178.60246686
Transfer And Cal...200924942024-06-14 20:40:1193 days ago1718397611IN
Aktionariat: DAKS Token
0 ETH0.000831878.81772857
Transfer And Cal...200242412024-06-05 7:49:47103 days ago1717573787IN
Aktionariat: DAKS Token
0 ETH0.0010176211.36488866
Transfer And Cal...200151442024-06-04 1:22:23104 days ago1717464143IN
Aktionariat: DAKS Token
0 ETH0.000600177.77013827
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DraggableShares

Compiler Version
v0.8.1+commit.df193b15

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 1 of 6: DraggableShares.sol
/**
* SPDX-License-Identifier: LicenseRef-Aktionariat
*
* MIT License with Automated License Fee Payments
*
* Copyright (c) 2020 Aktionariat AG (aktionariat.com)
*
* Permission is hereby granted to any person obtaining a copy of this software
* and associated documentation files (the "Software"), to deal in the Software
* without restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* - The above copyright notice and this permission notice shall be included in
*   all copies or substantial portions of the Software.
* - All automated license fee payments integrated into this and related Software
*   are preserved.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity >=0.8;

import "./ERC20Recoverable.sol";
import "./ERC20Draggable.sol";

/**
 * @title Draggable CompanyName AG Shares
 * @author Luzius Meisser, [email protected]
 *
 * This is an ERC-20 token representing shares of CompanyName AG that are bound to
 * a shareholder agreement that can be found at the URL defined in the constant 'terms'.
 * The shareholder agreement is partially enforced through this smart contract. The agreement
 * is designed to facilitate a complete acquisition of the firm even if a minority of shareholders
 * disagree with the acquisition, to protect the interest of the minority shareholders by requiring
 * the acquirer to offer the same conditions to everyone when acquiring the company, and to
 * facilitate an update of the shareholder agreement even if a minority of the shareholders that
 * are bound to this agreement disagree. The name "draggable" stems from the convention of calling
 * the right to drag a minority along with a sale of the company "drag-along" rights. The name is
 * chosen to ensure that token holders are aware that they are bound to such an agreement.
 *
 * The percentage of token holders that must agree with an update of the terms is defined by the
 * constant UPDATE_QUORUM. The percentage of yes-votes that is needed to successfully complete an
 * acquisition is defined in the constant ACQUISITION_QUORUM. Note that the update quorum is based
 * on the total number of tokens in circulation. In contrast, the acquisition quorum is based on the
 * number of votes cast during the voting period, not taking into account those who did not bother
 * to vote.
 */

contract DraggableShares is ERC20Recoverable, ERC20Draggable {

    string public terms;

    /**
     * Designed to be used with the Crypto Franc as currency token. See also parent constructor.
     */
    constructor(string memory _terms, address offerFactory, address wrappedToken, uint256 quorum, uint256 votePeriod)
        ERC20Draggable(offerFactory, wrappedToken, quorum, votePeriod) {
        IRecoverable(wrappedToken).setRecoverable(false);
        terms = _terms; // to update the terms, migrate to a new contract. That way it is ensured that the terms can only be updated when the quorom agrees.
    }

    function transfer(address to, uint256 value) override(ERC20Recoverable, ERC20) public returns (bool) {
        return super.transfer(to, value);
    }

    function getClaimDeleter() public view override returns (address) {
        return IRecoverable(address(wrapped)).getClaimDeleter();
    }

    function getCollateralRate(address collateralType) public view override returns (uint256) {
        uint256 rate = super.getCollateralRate(collateralType);
        if (rate > 0) {
            return rate;
        } else if (collateralType == address(wrapped)) {
            return unwrapConversionFactor;
        } else {
            // If the wrapped contract allows for a specific collateral, we should too.
            // If the wrapped contract is not IRecoverable, we will fail here, but would fail anyway.
            return IRecoverable(address(wrapped)).getCollateralRate(collateralType) * unwrapConversionFactor;
        }
    }

}

abstract contract IRecoverable {
    function setRecoverable(bool) public virtual;
    function getCollateralRate(address) public virtual view returns (uint256);
    function getClaimDeleter() public virtual view returns (address);
}

File 2 of 6: ERC20.sol
// SPDX-License-Identifier: MIT
// Copied and adjusted from OpenZeppelin
// Adjustments:
// - modifications to support ERC-677
// - removed require messages to save space
// - removed unnecessary require statements
// - removed GSN Context
// - upgraded to 0.8 to drop SafeMath
// - let name() and symbol() be implemented by subclass

pragma solidity >=0.8;

import "./IERC20.sol";
import "./IERC677Receiver.sol";

/**
 * @dev Implementation of the `IERC20` interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using `_mint`.
 * For a generic mechanism see `ERC20Mintable`.
 *
 * *For a detailed writeup see our guide [How to implement supply
 * mechanisms](https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226).*
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an `Approval` event is emitted on calls to `transferFrom`.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard `decreaseAllowance` and `increaseAllowance`
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See `IERC20.approve`.
 */

abstract contract ERC20 is IERC20 {

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;

    uint8 public override decimals;

    constructor(uint8 _decimals) {
        decimals = _decimals;
    }

    /**
     * @dev See `IERC20.totalSupply`.
     */
    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See `IERC20.balanceOf`.
     */
    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See `IERC20.transfer`.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

    /**
     * @dev See `IERC20.allowance`.
     */
    function allowance(address owner, address spender) public view override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See `IERC20.approve`.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 value) public override returns (bool) {
        _approve(msg.sender, spender, value);
        return true;
    }

    /**
     * @dev See `IERC20.transferFrom`.
     *
     * Emits an `Approval` event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of `ERC20`;
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `value`.
     * - the caller must have allowance for `sender`'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, msg.sender, _allowances[sender][msg.sender] - amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to `approve` that can be used as a mitigation for
     * problems described in `IERC20.approve`.
     *
     * Emits an `Approval` event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to `approve` that can be used as a mitigation for
     * problems described in `IERC20.approve`.
     *
     * Emits an `Approval` event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender] - subtractedValue);
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to `transfer`, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a `Transfer` event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(recipient != address(0));

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] -= amount;
        _balances[recipient] += amount;
        emit Transfer(sender, recipient, amount);
    }

    // ERC-677 functionality, can be useful for swapping and wrapping tokens
    function transferAndCall(address recipient, uint amount, bytes calldata data) public returns (bool) {
        bool success = transfer(recipient, amount);
        if (success){
            IERC677Receiver(recipient).onTokenTransfer(msg.sender, amount, data);
        }
        return success;
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a `Transfer` event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address recipient, uint256 amount) internal virtual {
        require(recipient != address(0));

        _beforeTokenTransfer(address(0), recipient, amount);

        _totalSupply += amount;
        _balances[recipient] += amount;
        emit Transfer(address(0), recipient, amount);
    }

     /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a `Transfer` event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        _beforeTokenTransfer(account, address(0), amount);

        _totalSupply -= amount;
        _balances[account] -= amount;
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
     *
     * This is internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an `Approval` event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        _allowances[owner][spender] = value;
        emit Approval(owner, spender, value);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) virtual internal;
}

File 3 of 6: ERC20Draggable.sol
/**
* SPDX-License-Identifier: LicenseRef-Aktionariat
*
* MIT License with Automated License Fee Payments
*
* Copyright (c) 2020 Aktionariat AG (aktionariat.com)
*
* Permission is hereby granted to any person obtaining a copy of this software
* and associated documentation files (the "Software"), to deal in the Software
* without restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* - The above copyright notice and this permission notice shall be included in
*   all copies or substantial portions of the Software.
* - All automated license fee payments integrated into this and related Software
*   are preserved.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity >=0.8;

/**
 * @title CompanyName Shareholder Agreement
 * @author Luzius Meisser, [email protected]
 * @dev These tokens are based on the ERC20 standard and the open-zeppelin library.
 *
 * This is an ERC-20 token representing shares of CompanyName AG that are bound to
 * a shareholder agreement that can be found at the URL defined in the constant 'terms'
 * of the 'DraggableCompanyNameShares' contract. The agreement is partially enforced
 * through the Swiss legal system, and partially enforced through this smart contract.
 * In particular, this smart contract implements a drag-along clause which allows the
 * majority of token holders to force the minority sell their shares along with them in
 * case of an acquisition. That's why the tokens are called "Draggable CompanyName AG Shares."
 */

import "./ERC20.sol";
import "./IERC20.sol";
import "./IERC677Receiver.sol";

contract ERC20Draggable is ERC20, IERC677Receiver {

    IERC20 public wrapped;                              // The wrapped contract
    IOfferFactory public factory;

    // If the wrapped tokens got replaced in an acquisition, unwrapping might yield many currency tokens
    uint256 public unwrapConversionFactor = 0;

    // The current acquisition attempt, if any. See initiateAcquisition to see the requirements to make a public offer.
    IOffer public offer;

    uint256 public quorum;
    uint256 public votePeriod;

    event MigrationSucceeded(address newContractAddress);

    constructor(
        address offerFactory,
        address wrappedToken,
        uint256 quorum_,
        uint256 votePeriod_
    ) ERC20(0) {
        factory = IOfferFactory(offerFactory);
        wrapped = IERC20(wrappedToken);
        quorum = quorum_;
        votePeriod = votePeriod_;
    }

    function name() public override view returns (string memory){
        if (isBinding()){
            return string(abi.encodePacked("Draggable ", wrapped.name()));
        } else {
            return string(abi.encodePacked("Wrapped ", wrapped.name()));
        }
    }

    function symbol() public override view returns (string memory){
        if (isBinding()){
            return string(abi.encodePacked("D", wrapped.symbol()));
        } else {
            return string(abi.encodePacked("W", wrapped.symbol()));
        }
    }

    function onTokenTransfer(address from, uint256 amount, bytes calldata) override public {
        require(msg.sender == address(wrapped));
        _mint(from, amount);
    }

    /** Increases the number of drag-along tokens. Requires minter to deposit an equal amount of share tokens */
    function wrap(address shareholder, uint256 amount) public {
        require(wrapped.transferFrom(msg.sender, address(this), amount));
        _mint(shareholder, amount);
    }

    /**
     * Indicates that the token holders are bound to the token terms and that:
     * - Conversions back to the wrapped token (unwrap) are not allowed
     * - The drag-along can be performed by making an according offer
     * - They can be migrated to a new version of this contract in accordance with the terms
     */
    function isBinding() public view returns (bool) {
        return unwrapConversionFactor == 0;
    }

    /**
     * Deactivates the drag-along mechanism and enables the unwrap function.
     */
    function deactivate(uint256 factor) internal {
        require(factor >= 1);
        unwrapConversionFactor = factor;
    }

    /** Decrease the number of drag-along tokens. The user gets back their shares in return */
    function unwrap(uint256 amount) public {
        require(!isBinding());
        unwrap(msg.sender, amount, unwrapConversionFactor);
    }
    
    function unwrap(address owner, uint256 amount, uint256 factor) internal {
        _burn(owner, amount);
        require(wrapped.transfer(owner, amount * factor));
    }

    /**
     * Burns both the token itself as well as the wrapped token!
     * If you want to get out of the shareholder agreement, use unwrap after it has been
     * deactivated by a majority vote or acquisition.
     *
     * Burning only works if wrapped token supports burning. Also, the exact meaning of this
     * operation might depend on the circumstances. Burning and reussing the wrapped token
     * does not free the sender from the legal obligations of the shareholder agreement.
     */
    function burn(uint256 amount) public {
        _burn(msg.sender, amount);
        uint256 factor = isBinding() ? 1 : unwrapConversionFactor;
        IBurnable(address(wrapped)).burn(amount * factor);
    }

    function makeAcquisitionOffer(bytes32 salt, uint256 pricePerShare, address currency) public payable {
        require(isBinding());
        address newOffer = factory.create{value: msg.value}(salt, msg.sender, pricePerShare, currency, quorum, votePeriod);
        if (offerExists()) {
            require(IOffer(newOffer).isWellFunded());
            offer.contest(newOffer);
        }
        offer = IOffer(newOffer);
    }

    function drag(address buyer, address currency) public {
        require(msg.sender == address(offer));
        unwrap(buyer, balanceOf(buyer), 1);
        replaceWrapped(currency, buyer);
    }

    function notifyOfferEnded() public {
        if (msg.sender == address(offer)){
            offer = IOffer(address(0));
        }
    }

    function replaceWrapped(address newWrapped, address oldWrappedDestination) internal {
        require(isBinding());
        // Free all old wrapped tokens we have
        require(wrapped.transfer(oldWrappedDestination, wrapped.balanceOf(address(this))));
        // Count the new wrapped tokens
        wrapped = IERC20(newWrapped);
        deactivate(wrapped.balanceOf(address(this)) / totalSupply());
    }

    function migrate() public {
        address successor = msg.sender;
        require(!offerExists()); // if you have 80%, you can easily cancel the offer first if necessary
        require(balanceOf(successor) * 10000 >= totalSupply() * 8000, "Quorum not reached");
        replaceWrapped(successor, successor);
        emit MigrationSucceeded(successor);
    }

    function _beforeTokenTransfer(address from, address to, uint256 amount) override internal {
        if (offerExists()) {
            offer.notifyMoved(from, to, amount);
        }
    }

    function offerExists() internal view returns (bool) {
        return address(offer) != address(0);
    }

}

abstract contract IBurnable {
    function burn(uint256) virtual public;
}

abstract contract IOffer {
    function isWellFunded() virtual public returns (bool);
    function contest(address newOffer) virtual public;
    function notifyMoved(address from, address to, uint256 value) virtual public;
}

abstract contract IOfferFactory {
    function create(bytes32 salt, address buyer, uint256 pricePerShare, address currency, uint256 quorum, uint256 votePeriod) virtual public payable returns (address);
}

File 4 of 6: ERC20Recoverable.sol
/**
* SPDX-License-Identifier: LicenseRef-Aktionariat
*
* MIT License with Automated License Fee Payments
*
* Copyright (c) 2020 Aktionariat AG (aktionariat.com)
*
* Permission is hereby granted to any person obtaining a copy of this software
* and associated documentation files (the "Software"), to deal in the Software
* without restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* - The above copyright notice and this permission notice shall be included in
*   all copies or substantial portions of the Software.
* - All automated license fee payments integrated into this and related Software
*   are preserved.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity >=0.8;

import "./ERC20.sol";
import "./IERC20.sol";

/**
 * @title Recoverable
 * In case of tokens that represent real-world assets such as shares of a company, one needs a way
 * to handle lost private keys. With physical certificates, courts can declare share certificates as
 * invalid so the company can issue replacements. Here, we want a solution that does not depend on
 * third parties to resolve such cases. Instead, when someone has lost a private key, he can use the
 * declareLost function to post a deposit and claim that the shares assigned to a specific address are
 * lost. To prevent front running, a commit reveal scheme is used. If he actually is the owner of the shares,
 * he needs to wait for a certain period and can then reclaim the lost shares as well as the deposit.
 * If he is an attacker trying to claim shares belonging to someone else, he risks losing the deposit
 * as it can be claimed at anytime by the rightful owner.
 * Furthermore, if "getClaimDeleter" is defined in the subclass, the returned address is allowed to
 * delete claims, returning the collateral. This can help to prevent obvious cases of abuse of the claim
 * function.
 */

abstract contract ERC20Recoverable is ERC20 {

    // A struct that represents a claim made
    struct Claim {
        address claimant; // the person who created the claim
        uint256 collateral; // the amount of collateral deposited
        uint256 timestamp;  // the timestamp of the block in which the claim was made
        address currencyUsed; // The currency (XCHF) can be updated, we record the currency used for every request
    }

    uint256 public claimPeriod = 180 days; // Default of 180 days;

    mapping(address => Claim) public claims; // there can be at most one claim per address, here address is claimed address
    mapping(address => bool) public recoveryDisabled; // disable claimability (e.g. for long term storage)

    // ERC-20 token that can be used as collateral or 0x0 if disabled
    address public customCollateralAddress;
    uint256 public customCollateralRate;

    /**
     * Returns the collateral rate for the given collateral type and 0 if that type
     * of collateral is not accepted. By default, only the token itself is accepted at
     * a rate of 1:1.
     *
     * Subclasses should override this method if they want to add additional types of
     * collateral.
     */
    function getCollateralRate(address collateralType) public virtual view returns (uint256) {
        if (collateralType == address(this)) {
            return 1;
        } else if (collateralType == customCollateralAddress) {
            return customCollateralRate;
        } else {
            return 0;
        }
    }

    /**
     * Allows subclasses to set a custom collateral besides the token itself.
     * The collateral must be an ERC-20 token that returns true on successful transfers and
     * throws an exception or returns false on failure.
     * Also, do not forget to multiply the rate in accordance with the number of decimals of the collateral.
     * For example, rate should be 7*10**18 for 7 units of a collateral with 18 decimals.
     */
    function _setCustomClaimCollateral(address collateral, uint256 rate) internal {
        customCollateralAddress = collateral;
        if (customCollateralAddress == address(0)) {
            customCollateralRate = 0; // disabled
        } else {
            require(rate > 0, "Collateral rate can't be zero");
            customCollateralRate = rate;
        }
        emit CustomClaimCollateralChanged(collateral, rate);
    }

    function getClaimDeleter() virtual public view returns (address);

    /**
     * Allows subclasses to change the claim period, but not to fewer than 90 days.
     */
    function _setClaimPeriod(uint256 claimPeriodInDays) internal {
        require(claimPeriodInDays > 90, "Claim period must be at least 90 days"); // must be at least 90 days
        uint256 claimPeriodInSeconds = claimPeriodInDays * (1 days);
        claimPeriod = claimPeriodInSeconds;
        emit ClaimPeriodChanged(claimPeriod);
    }

    function setRecoverable(bool enabled) public {
        recoveryDisabled[msg.sender] = !enabled;
    }

    /**
     * Some users might want to disable claims for their address completely.
     * For example if they use a deep cold storage solution or paper wallet.
     */
    function isRecoveryEnabled(address target) public view returns (bool) {
        return !recoveryDisabled[target];
    }

    event ClaimMade(address indexed lostAddress, address indexed claimant, uint256 balance);
    event ClaimCleared(address indexed lostAddress, uint256 collateral);
    event ClaimDeleted(address indexed lostAddress, address indexed claimant, uint256 collateral);
    event ClaimResolved(address indexed lostAddress, address indexed claimant, uint256 collateral);
    event ClaimPeriodChanged(uint256 newClaimPeriodInDays);
    event CustomClaimCollateralChanged(address newCustomCollateralAddress, uint256 newCustomCollareralRate);

  /** Anyone can declare that the private key to a certain address was lost by calling declareLost
    * providing a deposit/collateral. There are three possibilities of what can happen with the claim:
    * 1) The claim period expires and the claimant can get the deposit and the shares back by calling recover
    * 2) The "lost" private key is used at any time to call clearClaim. In that case, the claim is deleted and
    *    the deposit sent to the shareholder (the owner of the private key). It is recommended to call recover
    *    whenever someone transfers funds to let claims be resolved automatically when the "lost" private key is
    *    used again.
    * 3) The owner deletes the claim and assigns the deposit to the claimant. This is intended to be used to resolve
    *    disputes. Generally, using this function implies that you have to trust the issuer of the tokens to handle
    *    the situation well. As a rule of thumb, the contract owner should assume the owner of the lost address to be the
    *    rightful owner of the deposit.
    * It is highly recommended that the owner observes the claims made and informs the owners of the claimed addresses
    * whenever a claim is made for their address (this of course is only possible if they are known to the owner, e.g.
    * through a shareholder register).
    */
    function declareLost(address collateralType, address lostAddress) public {
        require(isRecoveryEnabled(lostAddress), "Claims disabled for this address");
        uint256 collateralRate = getCollateralRate(collateralType);
        require(collateralRate > 0, "Unsupported collateral");
        address claimant = msg.sender;
        uint256 balance = balanceOf(lostAddress);
        uint256 collateral = balance * collateralRate;
        IERC20 currency = IERC20(collateralType);
        require(balance > 0, "Claimed address holds no shares");
        require(claims[lostAddress].collateral == 0, "Address already claimed");
        require(currency.transferFrom(claimant, address(this), collateral), "Collateral transfer failed");

        claims[lostAddress] = Claim({
            claimant: claimant,
            collateral: collateral,
            timestamp: block.timestamp,
            currencyUsed: collateralType
        });

        emit ClaimMade(lostAddress, claimant, balance);
    }

    function getClaimant(address lostAddress) public view returns (address) {
        return claims[lostAddress].claimant;
    }

    function getCollateral(address lostAddress) public view returns (uint256) {
        return claims[lostAddress].collateral;
    }

    function getCollateralType(address lostAddress) public view returns (address) {
        return claims[lostAddress].currencyUsed;
    }

    function getTimeStamp(address lostAddress) public view returns (uint256) {
        return claims[lostAddress].timestamp;
    }

    function transfer(address recipient, uint256 amount) override virtual public returns (bool) {
        require(super.transfer(recipient, amount), "Transfer failed");
        clearClaim();
        return true;
    }

    /**
     * Clears a claim after the key has been found again and assigns the collateral to the "lost" address.
     * This is the price an adverse claimer pays for filing a false claim and makes it risky to do so.
     */
    function clearClaim() public {
        if (claims[msg.sender].collateral != 0) {
            uint256 collateral = claims[msg.sender].collateral;
            IERC20 currency = IERC20(claims[msg.sender].currencyUsed);
            delete claims[msg.sender];
            require(currency.transfer(msg.sender, collateral), "Collateral transfer failed");
            emit ClaimCleared(msg.sender, collateral);
        }
    }

   /**
    * After the claim period has passed, the claimant can call this function to send the
    * tokens on the lost address as well as the collateral to himself.
    */
    function recover(address lostAddress) public {
        Claim memory claim = claims[lostAddress];
        uint256 collateral = claim.collateral;
        IERC20 currency = IERC20(claim.currencyUsed);
        require(collateral != 0, "No claim found");
        require(claim.claimant == msg.sender, "Only claimant can resolve claim");
        require(claim.timestamp + claimPeriod <= block.timestamp, "Claim period not over yet");
        address claimant = claim.claimant;
        delete claims[lostAddress];
        require(currency.transfer(claimant, collateral), "Collateral transfer failed");
        _transfer(lostAddress, claimant, balanceOf(lostAddress));
        emit ClaimResolved(lostAddress, claimant, collateral);
    }

    /**
     * This function is to be executed by the claim deleter only in case a dispute needs to be resolved manually.
     */
    function deleteClaim(address lostAddress) public {
        require(msg.sender == getClaimDeleter(), "You cannot delete claims");
        Claim memory claim = claims[lostAddress];
        IERC20 currency = IERC20(claim.currencyUsed);
        require(claim.collateral != 0, "No claim found");
        delete claims[lostAddress];
        require(currency.transfer(claim.claimant, claim.collateral), "Collateral transfer failed");
        emit ClaimDeleted(lostAddress, claim.claimant, claim.collateral);
    }

}

File 5 of 6: IERC20.sol
/**
* SPDX-License-Identifier: MIT
*
* Copyright (c) 2016-2019 zOS Global Limited
*
*/
pragma solidity >=0.8;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see `ERC20Detailed`.
 */

interface IERC20 {

    // Optional functions
    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a `Transfer` event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through `transferFrom`. This is
     * zero by default.
     *
     * This value changes when `approve` or `transferFrom` are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * > Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an `Approval` event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a `Transfer` event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to `approve`. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 6 of 6: IERC677Receiver.sol
// SPDX-License-Identifier: MIT
// Copied from https://github.com/Uniswap/uniswap-v2-periphery/blob/master/contracts/UniswapV2Router02.sol
pragma solidity >=0.8;

interface IERC677Receiver {

    function onTokenTransfer(address from, uint256 amount, bytes calldata data) external;

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_terms","type":"string"},{"internalType":"address","name":"offerFactory","type":"address"},{"internalType":"address","name":"wrappedToken","type":"address"},{"internalType":"uint256","name":"quorum","type":"uint256"},{"internalType":"uint256","name":"votePeriod","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lostAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"collateral","type":"uint256"}],"name":"ClaimCleared","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lostAddress","type":"address"},{"indexed":true,"internalType":"address","name":"claimant","type":"address"},{"indexed":false,"internalType":"uint256","name":"collateral","type":"uint256"}],"name":"ClaimDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lostAddress","type":"address"},{"indexed":true,"internalType":"address","name":"claimant","type":"address"},{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"}],"name":"ClaimMade","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newClaimPeriodInDays","type":"uint256"}],"name":"ClaimPeriodChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lostAddress","type":"address"},{"indexed":true,"internalType":"address","name":"claimant","type":"address"},{"indexed":false,"internalType":"uint256","name":"collateral","type":"uint256"}],"name":"ClaimResolved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newCustomCollateralAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"newCustomCollareralRate","type":"uint256"}],"name":"CustomClaimCollateralChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newContractAddress","type":"address"}],"name":"MigrationSucceeded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claims","outputs":[{"internalType":"address","name":"claimant","type":"address"},{"internalType":"uint256","name":"collateral","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"address","name":"currencyUsed","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clearClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"customCollateralAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"customCollateralRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collateralType","type":"address"},{"internalType":"address","name":"lostAddress","type":"address"}],"name":"declareLost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lostAddress","type":"address"}],"name":"deleteClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"buyer","type":"address"},{"internalType":"address","name":"currency","type":"address"}],"name":"drag","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"contract IOfferFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimDeleter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lostAddress","type":"address"}],"name":"getClaimant","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lostAddress","type":"address"}],"name":"getCollateral","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collateralType","type":"address"}],"name":"getCollateralRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lostAddress","type":"address"}],"name":"getCollateralType","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lostAddress","type":"address"}],"name":"getTimeStamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isBinding","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"isRecoveryEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256","name":"pricePerShare","type":"uint256"},{"internalType":"address","name":"currency","type":"address"}],"name":"makeAcquisitionOffer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notifyOfferEnded","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"offer","outputs":[{"internalType":"contract IOffer","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onTokenTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"quorum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lostAddress","type":"address"}],"name":"recover","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"recoveryDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setRecoverable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"terms","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"transferAndCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unwrap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unwrapConversionFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"votePeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"shareholder","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"wrap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wrapped","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

608060405262ed4e006004556000600b553480156200001d57600080fd5b5060405162002bdf38038062002bdf8339810160408190526200004091620001be565b6003805460ff19169055600a80546001600160a01b038087166001600160a01b031992831617909255600980549286169290911682179055600d839055600e829055604051636427ed9760e01b8152636427ed9790620000a690600090600401620002ce565b600060405180830381600087803b158015620000c157600080fd5b505af1158015620000d6573d6000803e3d6000fd5b50508651620000ef9250600f91506020880190620000fb565b5050505050506200032c565b8280546200010990620002d9565b90600052602060002090601f0160209004810192826200012d576000855562000178565b82601f106200014857805160ff191683800117855562000178565b8280016001018555821562000178579182015b82811115620001785782518255916020019190600101906200015b565b50620001869291506200018a565b5090565b5b808211156200018657600081556001016200018b565b80516001600160a01b0381168114620001b957600080fd5b919050565b600080600080600060a08688031215620001d6578081fd5b85516001600160401b0380821115620001ed578283fd5b818801915088601f83011262000201578283fd5b81518181111562000216576200021662000316565b604051601f8201601f19908116603f0116810190838211818310171562000241576200024162000316565b81604052828152602093508b848487010111156200025d578586fd5b8591505b8282101562000280578482018401518183018501529083019062000261565b828211156200029157858484830101525b9850620002a3915050888201620001a1565b95505050620002b560408701620001a1565b6060870151608090970151959894975095949392505050565b901515815260200190565b600281046001821680620002ee57607f821691505b602082108114156200031057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b6128a3806200033c6000396000f3fe6080604052600436106102725760003560e01c806370a082311161014f578063a9059cbb116100c1578063d50256251161007a578063d5025625146106ed578063dcc7d4ad14610702578063dd62ed3e14610715578063de0e9a3e14610735578063eb470ebf14610755578063fcb79a7e1461077557610272565b8063a9059cbb14610633578063b40e80d114610653578063bf376c7a14610673578063c028df0614610693578063c45a0155146106a8578063c6788bdd146106bd57610272565b80639b56d6c9116101135780639b56d6c9146105895780639e4b5745146105a9578063a3ec1883146105be578063a457c2d7146105de578063a4c0ed36146105fe578063a78135871461061e57610272565b806370a082311461050a57806377e071ad1461052a5780637dc2cd981461054a5780638fd3ab801461055f57806395d89b411461057457610272565b8063313ce567116101e85780634000aea0116101ac5780634000aea01461046b57806342966c681461048b57806350e70d48146104ab57806360918117146104c05780636427ed97146104d55780636b03ed5f146104f557610272565b8063313ce567146103d457806332a7ae95146103f657806332bc320b14610416578063395093511461042b5780633bcc45ba1461044b57610272565b80631703a0181161023a5780631703a0181461033557806318160ddd1461034a5780631e3b9de51461035f57806323b872dd1461037f57806326773ddd1461039f5780632a0a4ed5146103bf57610272565b806306fdde03146102775780630832e470146102a2578063095ea7b3146102c45780630c6f0e5d146102f15780630cd865ec14610313575b600080fd5b34801561028357600080fd5b5061028c610795565b60405161029991906124d9565b60405180910390f35b3480156102ae57600080fd5b506102b76108f1565b6040516102999190612738565b3480156102d057600080fd5b506102e46102df366004612136565b6108f7565b6040516102999190612499565b3480156102fd57600080fd5b5061030661090d565b60405161029991906123d5565b34801561031f57600080fd5b5061033361032e366004612086565b61091c565b005b34801561034157600080fd5b506102b7610b2d565b34801561035657600080fd5b506102b7610b33565b34801561036b57600080fd5b5061030661037a366004612086565b610b39565b34801561038b57600080fd5b506102e461039a3660046120f6565b610b5a565b3480156103ab57600080fd5b506103336103ba3660046120be565b610bac565b3480156103cb57600080fd5b50610306610dca565b3480156103e057600080fd5b506103e9610e4c565b6040516102999190612741565b34801561040257600080fd5b50610333610411366004612086565b610e55565b34801561042257600080fd5b50610333611030565b34801561043757600080fd5b506102e4610446366004612136565b611056565b34801561045757600080fd5b50610306610466366004612086565b61108d565b34801561047757600080fd5b506102e4610486366004612161565b6110ae565b34801561049757600080fd5b506103336104a63660046122fe565b611131565b3480156104b757600080fd5b506103066111c4565b3480156104cc57600080fd5b506102b76111d3565b3480156104e157600080fd5b506103336104f03660046121e5565b6111d9565b34801561050157600080fd5b506103336111f8565b34801561051657600080fd5b506102b7610525366004612086565b611333565b34801561053657600080fd5b506102b7610545366004612086565b61134e565b34801561055657600080fd5b506102b7611424565b34801561056b57600080fd5b5061033361142a565b34801561058057600080fd5b5061028c6114c8565b34801561059557600080fd5b506102b76105a4366004612086565b61160b565b3480156105b557600080fd5b506102e4611629565b3480156105ca57600080fd5b506102e46105d9366004612086565b611630565b3480156105ea57600080fd5b506102e46105f9366004612136565b61164f565b34801561060a57600080fd5b50610333610619366004612161565b611686565b34801561062a57600080fd5b506102b76116ad565b34801561063f57600080fd5b506102e461064e366004612136565b6116b3565b34801561065f57600080fd5b506102e461066e366004612086565b6116c6565b34801561067f57600080fd5b5061033361068e366004612136565b6116db565b34801561069f57600080fd5b50610306611778565b3480156106b457600080fd5b50610306611787565b3480156106c957600080fd5b506106dd6106d8366004612086565b611796565b604051610299949392919061246e565b3480156106f957600080fd5b5061028c6117c8565b61033361071036600461221d565b611856565b34801561072157600080fd5b506102b76107303660046120be565b611a0d565b34801561074157600080fd5b506103336107503660046122fe565b611a38565b34801561076157600080fd5b506102b7610770366004612086565b611a5a565b34801561078157600080fd5b506103336107903660046120be565b611a78565b606061079f611629565b1561085457600960009054906101000a90046001600160a01b03166001600160a01b03166306fdde036040518163ffffffff1660e01b815260040160006040518083038186803b1580156107f257600080fd5b505afa158015610806573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261082e9190810190612255565b60405160200161083e9190612373565b60405160208183030381529060405290506108ee565b600960009054906101000a90046001600160a01b03166001600160a01b03166306fdde036040518163ffffffff1660e01b815260040160006040518083038186803b1580156108a257600080fd5b505afa1580156108b6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108de9190810190612255565b60405160200161083e91906123a5565b90565b600b5481565b6000610904338484611aad565b50600192915050565b6007546001600160a01b031681565b6001600160a01b03808216600090815260056020908152604091829020825160808101845281548516815260018201549281018390526002820154938101939093526003015490921660608201819052909190816109955760405162461bcd60e51b815260040161098c906125d3565b60405180910390fd5b82516001600160a01b031633146109be5760405162461bcd60e51b815260040161098c9061250c565b4260045484604001516109d1919061274f565b11156109ef5760405162461bcd60e51b815260040161098c90612543565b82516001600160a01b0380861660009081526005602052604080822080546001600160a01b0319908116825560018201849055600282019390935560030180549092169091555163a9059cbb60e01b81529083169063a9059cbb90610a5a908490879060040161240d565b602060405180830381600087803b158015610a7457600080fd5b505af1158015610a88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aac9190612201565b610ac85760405162461bcd60e51b815260040161098c906125fb565b610adb8582610ad688611333565b611b08565b806001600160a01b0316856001600160a01b03167f52a5c2b28bc6eb9712d0ced43463103b486b13ccc9cda499fd3b2d7b6a74a8ee85604051610b1e9190612738565b60405180910390a35050505050565b600d5481565b60025490565b6001600160a01b03808216600090815260056020526040902054165b919050565b6000610b67848484611b08565b6001600160a01b038416600090815260016020908152604080832033808552925290912054610ba2918691610b9d9086906127a6565b611aad565b5060019392505050565b610bb581611630565b610bd15760405162461bcd60e51b815260040161098c90612632565b6000610bdc8361134e565b905060008111610bfe5760405162461bcd60e51b815260040161098c906125a3565b336000610c0a84611333565b90506000610c188483612787565b90508582610c385760405162461bcd60e51b815260040161098c906126ca565b6001600160a01b03861660009081526005602052604090206001015415610c715760405162461bcd60e51b815260040161098c90612667565b6040516323b872dd60e01b81526001600160a01b038216906323b872dd90610ca1908790309087906004016123e9565b602060405180830381600087803b158015610cbb57600080fd5b505af1158015610ccf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf39190612201565b610d0f5760405162461bcd60e51b815260040161098c906125fb565b604080516080810182526001600160a01b038087168083526020808401878152428587019081528d8516606087019081528d86166000818152600590955293889020965187549087166001600160a01b0319918216178855925160018801559051600287015551600390950180549590941694169390931790915591517f1982ca8958fc8a8176cb52be509260f4bc5af7ce04e1533711793f1c56dd535990610db9908790612738565b60405180910390a350505050505050565b60095460408051632a0a4ed560e01b815290516000926001600160a01b031691632a0a4ed5916004808301926020929190829003018186803b158015610e0f57600080fd5b505afa158015610e23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4791906120a2565b905090565b60035460ff1681565b610e5d610dca565b6001600160a01b0316336001600160a01b031614610e8d5760405162461bcd60e51b815260040161098c90612701565b6001600160a01b038082166000908152600560209081526040918290208251608081018452815485168152600182015492810183905260028201549381019390935260030154909216606082018190529091610efb5760405162461bcd60e51b815260040161098c906125d3565b6001600160a01b03808416600090815260056020908152604080832080546001600160a01b031990811682556001820185905560028201949094556003018054909316909255845190850151915163a9059cbb60e01b81529284169263a9059cbb92610f6a929160040161240d565b602060405180830381600087803b158015610f8457600080fd5b505af1158015610f98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbc9190612201565b610fd85760405162461bcd60e51b815260040161098c906125fb565b81600001516001600160a01b0316836001600160a01b03167fbb036e629a9f4c0897ee5d48440dfdb36f7e772117723a2ed603a6514244c2d584602001516040516110239190612738565b60405180910390a3505050565b600c546001600160a01b031633141561105457600c80546001600160a01b03191690555b565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610904918590610b9d90869061274f565b6001600160a01b039081166000908152600560205260409020600301541690565b6000806110bb86866116b3565b9050801561112857604051635260769b60e11b81526001600160a01b0387169063a4c0ed36906110f5903390899089908990600401612426565b600060405180830381600087803b15801561110f57600080fd5b505af1158015611123573d6000803e3d6000fd5b505050505b95945050505050565b61113b3382611bc5565b6000611145611629565b61115157600b54611154565b60015b6009549091506001600160a01b03166342966c686111728385612787565b6040518263ffffffff1660e01b815260040161118e9190612738565b600060405180830381600087803b1580156111a857600080fd5b505af11580156111bc573d6000803e3d6000fd5b505050505050565b6009546001600160a01b031681565b60085481565b336000908152600660205260409020805460ff19169115919091179055565b3360009081526005602052604090206001015415611054573360008181526005602052604080822060018101805460038301805484546001600160a01b0319908116865593879055600290940195909555908216909355905163a9059cbb60e01b815291926001600160a01b0390911691829163a9059cbb916112809190869060040161240d565b602060405180830381600087803b15801561129a57600080fd5b505af11580156112ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d29190612201565b6112ee5760405162461bcd60e51b815260040161098c906125fb565b336001600160a01b03167f203627483d943880619f4b7e0cca21dbefd6204b4d85b124eb99540e17ba86dd836040516113279190612738565b60405180910390a25050565b6001600160a01b031660009081526020819052604090205490565b60008061135a83611c5f565b90508015611369579050610b55565b6009546001600160a01b0384811691161415611389575050600b54610b55565b600b546009546040516377e071ad60e01b81526001600160a01b03909116906377e071ad906113bc9087906004016123d5565b60206040518083038186803b1580156113d457600080fd5b505afa1580156113e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140c9190612316565b6114169190612787565b915050610b55565b50919050565b60045481565b33611433611ca1565b1561143d57600080fd5b611445610b33565b61145190611f40612787565b61145a82611333565b61146690612710612787565b10156114845760405162461bcd60e51b815260040161098c9061269e565b61148e8182611cb2565b7f3b6b79a09e9fd230e8591b65c97236bf7df7a604edf733db0658e66b0e6eb2a9816040516114bd91906123d5565b60405180910390a150565b60606114d2611629565b1561157157600960009054906101000a90046001600160a01b03166001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b15801561152557600080fd5b505afa158015611539573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115619190810190612255565b60405160200161083e919061232e565b600960009054906101000a90046001600160a01b03166001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b1580156115bf57600080fd5b505afa1580156115d3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115fb9190810190612255565b60405160200161083e9190612357565b6001600160a01b031660009081526005602052604090206001015490565b600b541590565b6001600160a01b031660009081526006602052604090205460ff161590565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610904918590610b9d9086906127a6565b6009546001600160a01b0316331461169d57600080fd5b6116a78484611e7a565b50505050565b600e5481565b60006116bf8383611f1b565b9392505050565b60066020526000908152604090205460ff1681565b6009546040516323b872dd60e01b81526001600160a01b03909116906323b872dd9061170f903390309086906004016123e9565b602060405180830381600087803b15801561172957600080fd5b505af115801561173d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117619190612201565b61176a57600080fd5b6117748282611e7a565b5050565b600c546001600160a01b031681565b600a546001600160a01b031681565b60056020526000908152604090208054600182015460028301546003909301546001600160a01b039283169391921684565b600f80546117d5906127e9565b80601f0160208091040260200160405190810160405280929190818152602001828054611801906127e9565b801561184e5780601f106118235761010080835404028352916020019161184e565b820191906000526020600020905b81548152906001019060200180831161183157829003601f168201915b505050505081565b61185e611629565b61186757600080fd5b600a54600d54600e54604051634dc5e43160e01b81526000936001600160a01b031692634dc5e4319234926118a8928a9233928b928b9290916004016124a4565b6020604051808303818588803b1580156118c157600080fd5b505af11580156118d5573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906118fa91906120a2565b9050611904611ca1565b156119e857806001600160a01b0316633f5e3e7f6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561194457600080fd5b505af1158015611958573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197c9190612201565b61198557600080fd5b600c546040516306a169ed60e01b81526001600160a01b03909116906306a169ed906119b59084906004016123d5565b600060405180830381600087803b1580156119cf57600080fd5b505af11580156119e3573d6000803e3d6000fd5b505050505b600c80546001600160a01b0319166001600160a01b0392909216919091179055505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b611a40611629565b15611a4a57600080fd5b611a573382600b54611f4b565b50565b6001600160a01b031660009081526005602052604090206002015490565b600c546001600160a01b03163314611a8f57600080fd5b611aa382611a9c84611333565b6001611f4b565b6117748183611cb2565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611023908590612738565b6001600160a01b038216611b1b57600080fd5b611b26838383611fee565b6001600160a01b03831660009081526020819052604081208054839290611b4e9084906127a6565b90915550506001600160a01b03821660009081526020819052604081208054839290611b7b90849061274f565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516110239190612738565b611bd182600083611fee565b8060026000828254611be391906127a6565b90915550506001600160a01b03821660009081526020819052604081208054839290611c109084906127a6565b90915550506040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611c53908590612738565b60405180910390a35050565b60006001600160a01b038216301415611c7a57506001610b55565b6007546001600160a01b0383811691161415611c995750600854610b55565b506000610b55565b600c546001600160a01b0316151590565b611cba611629565b611cc357600080fd5b6009546040516370a0823160e01b81526001600160a01b039091169063a9059cbb90839083906370a0823190611cfd9030906004016123d5565b60206040518083038186803b158015611d1557600080fd5b505afa158015611d29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4d9190612316565b6040518363ffffffff1660e01b8152600401611d6a92919061240d565b602060405180830381600087803b158015611d8457600080fd5b505af1158015611d98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dbc9190612201565b611dc557600080fd5b600980546001600160a01b0319166001600160a01b038416179055611774611deb610b33565b6009546040516370a0823160e01b81526001600160a01b03909116906370a0823190611e1b9030906004016123d5565b60206040518083038186803b158015611e3357600080fd5b505afa158015611e47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6b9190612316565b611e759190612767565b612066565b6001600160a01b038216611e8d57600080fd5b611e9960008383611fee565b8060026000828254611eab919061274f565b90915550506001600160a01b03821660009081526020819052604081208054839290611ed890849061274f565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611c53908590612738565b6000611f278383612079565b611f435760405162461bcd60e51b815260040161098c9061257a565b6109046111f8565b611f558383611bc5565b6009546001600160a01b031663a9059cbb84611f718486612787565b6040518363ffffffff1660e01b8152600401611f8e92919061240d565b602060405180830381600087803b158015611fa857600080fd5b505af1158015611fbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fe09190612201565b611fe957600080fd5b505050565b611ff6611ca1565b15611fe957600c5460405163e1a1810f60e01b81526001600160a01b039091169063e1a1810f9061202f908690869086906004016123e9565b600060405180830381600087803b15801561204957600080fd5b505af115801561205d573d6000803e3d6000fd5b50505050505050565b600181101561207457600080fd5b600b55565b6000610904338484611b08565b600060208284031215612097578081fd5b81356116bf8161284a565b6000602082840312156120b3578081fd5b81516116bf8161284a565b600080604083850312156120d0578081fd5b82356120db8161284a565b915060208301356120eb8161284a565b809150509250929050565b60008060006060848603121561210a578081fd5b83356121158161284a565b925060208401356121258161284a565b929592945050506040919091013590565b60008060408385031215612148578182fd5b82356121538161284a565b946020939093013593505050565b60008060008060608587031215612176578081fd5b84356121818161284a565b935060208501359250604085013567ffffffffffffffff808211156121a4578283fd5b818701915087601f8301126121b7578283fd5b8135818111156121c5578384fd5b8860208285010111156121d6578384fd5b95989497505060200194505050565b6000602082840312156121f6578081fd5b81356116bf8161285f565b600060208284031215612212578081fd5b81516116bf8161285f565b600080600060608486031215612231578283fd5b8335925060208401359150604084013561224a8161284a565b809150509250925092565b600060208284031215612266578081fd5b815167ffffffffffffffff8082111561227d578283fd5b818401915084601f830112612290578283fd5b8151818111156122a2576122a2612834565b604051601f8201601f19908116603f011681019083821181831017156122ca576122ca612834565b816040528281528760208487010111156122e2578586fd5b6122f38360208301602088016127bd565b979650505050505050565b60006020828403121561230f578081fd5b5035919050565b600060208284031215612327578081fd5b5051919050565b6000601160fa1b8252825161234a8160018501602087016127bd565b9190910160010192915050565b6000605760f81b8252825161234a8160018501602087016127bd565b6000690223930b3b3b0b13632960b51b8252825161239881600a8501602087016127bd565b91909101600a0192915050565b60006702bb930b83832b2160c51b825282516123c88160088501602087016127bd565b9190910160080192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0385168152602081018490526060604082018190528101829052600082846080840137818301608090810191909152601f909201601f191601019392505050565b6001600160a01b03948516815260208101939093526040830191909152909116606082015260800190565b901515815260200190565b9586526001600160a01b039485166020870152604086019390935292166060840152608083019190915260a082015260c00190565b60006020825282518060208401526124f88160408501602087016127bd565b601f01601f19169190910160400192915050565b6020808252601f908201527f4f6e6c7920636c61696d616e742063616e207265736f6c766520636c61696d00604082015260600190565b60208082526019908201527f436c61696d20706572696f64206e6f74206f7665722079657400000000000000604082015260600190565b6020808252600f908201526e151c985b9cd9995c8819985a5b1959608a1b604082015260600190565b602080825260169082015275155b9cdd5c1c1bdc9d19590818dbdb1b185d195c985b60521b604082015260600190565b6020808252600e908201526d139bc818db185a5b48199bdd5b9960921b604082015260600190565b6020808252601a908201527f436f6c6c61746572616c207472616e73666572206661696c6564000000000000604082015260600190565b6020808252818101527f436c61696d732064697361626c656420666f7220746869732061646472657373604082015260600190565b60208082526017908201527f4164647265737320616c726561647920636c61696d6564000000000000000000604082015260600190565b602080825260129082015271145d5bdc9d5b481b9bdd081c995858da195960721b604082015260600190565b6020808252601f908201527f436c61696d6564206164647265737320686f6c6473206e6f2073686172657300604082015260600190565b60208082526018908201527f596f752063616e6e6f742064656c65746520636c61696d730000000000000000604082015260600190565b90815260200190565b60ff91909116815260200190565b600082198211156127625761276261281e565b500190565b60008261278257634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156127a1576127a161281e565b500290565b6000828210156127b8576127b861281e565b500390565b60005b838110156127d85781810151838201526020016127c0565b838111156116a75750506000910152565b6002810460018216806127fd57607f821691505b6020821081141561141e57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611a5757600080fd5b8015158114611a5757600080fdfea2646970667358221220d0f14521c293fe962159c01fb4a60e9f1b718f0e199f1b629f370472c2098d9664736f6c6343000801003300000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000f9f92751f272f0872e2edb6a280b0990f3e2b8a3000000000000000000000000cb58ec733ab0d96216b048bf7c3209d6c184d7c30000000000000000000000000000000000000000000000000000000000001d4c00000000000000000000000000000000000000000000000000000000004f1a00000000000000000000000000000000000000000000000000000000000000005c647261672e616b74696f6e61726961742e636f6d3f7368613235363d3363323535326364333231623964666632623731376264303264383235303631306639313439613461336561653735633465343463356361643035323332623800000000

Deployed Bytecode

0x6080604052600436106102725760003560e01c806370a082311161014f578063a9059cbb116100c1578063d50256251161007a578063d5025625146106ed578063dcc7d4ad14610702578063dd62ed3e14610715578063de0e9a3e14610735578063eb470ebf14610755578063fcb79a7e1461077557610272565b8063a9059cbb14610633578063b40e80d114610653578063bf376c7a14610673578063c028df0614610693578063c45a0155146106a8578063c6788bdd146106bd57610272565b80639b56d6c9116101135780639b56d6c9146105895780639e4b5745146105a9578063a3ec1883146105be578063a457c2d7146105de578063a4c0ed36146105fe578063a78135871461061e57610272565b806370a082311461050a57806377e071ad1461052a5780637dc2cd981461054a5780638fd3ab801461055f57806395d89b411461057457610272565b8063313ce567116101e85780634000aea0116101ac5780634000aea01461046b57806342966c681461048b57806350e70d48146104ab57806360918117146104c05780636427ed97146104d55780636b03ed5f146104f557610272565b8063313ce567146103d457806332a7ae95146103f657806332bc320b14610416578063395093511461042b5780633bcc45ba1461044b57610272565b80631703a0181161023a5780631703a0181461033557806318160ddd1461034a5780631e3b9de51461035f57806323b872dd1461037f57806326773ddd1461039f5780632a0a4ed5146103bf57610272565b806306fdde03146102775780630832e470146102a2578063095ea7b3146102c45780630c6f0e5d146102f15780630cd865ec14610313575b600080fd5b34801561028357600080fd5b5061028c610795565b60405161029991906124d9565b60405180910390f35b3480156102ae57600080fd5b506102b76108f1565b6040516102999190612738565b3480156102d057600080fd5b506102e46102df366004612136565b6108f7565b6040516102999190612499565b3480156102fd57600080fd5b5061030661090d565b60405161029991906123d5565b34801561031f57600080fd5b5061033361032e366004612086565b61091c565b005b34801561034157600080fd5b506102b7610b2d565b34801561035657600080fd5b506102b7610b33565b34801561036b57600080fd5b5061030661037a366004612086565b610b39565b34801561038b57600080fd5b506102e461039a3660046120f6565b610b5a565b3480156103ab57600080fd5b506103336103ba3660046120be565b610bac565b3480156103cb57600080fd5b50610306610dca565b3480156103e057600080fd5b506103e9610e4c565b6040516102999190612741565b34801561040257600080fd5b50610333610411366004612086565b610e55565b34801561042257600080fd5b50610333611030565b34801561043757600080fd5b506102e4610446366004612136565b611056565b34801561045757600080fd5b50610306610466366004612086565b61108d565b34801561047757600080fd5b506102e4610486366004612161565b6110ae565b34801561049757600080fd5b506103336104a63660046122fe565b611131565b3480156104b757600080fd5b506103066111c4565b3480156104cc57600080fd5b506102b76111d3565b3480156104e157600080fd5b506103336104f03660046121e5565b6111d9565b34801561050157600080fd5b506103336111f8565b34801561051657600080fd5b506102b7610525366004612086565b611333565b34801561053657600080fd5b506102b7610545366004612086565b61134e565b34801561055657600080fd5b506102b7611424565b34801561056b57600080fd5b5061033361142a565b34801561058057600080fd5b5061028c6114c8565b34801561059557600080fd5b506102b76105a4366004612086565b61160b565b3480156105b557600080fd5b506102e4611629565b3480156105ca57600080fd5b506102e46105d9366004612086565b611630565b3480156105ea57600080fd5b506102e46105f9366004612136565b61164f565b34801561060a57600080fd5b50610333610619366004612161565b611686565b34801561062a57600080fd5b506102b76116ad565b34801561063f57600080fd5b506102e461064e366004612136565b6116b3565b34801561065f57600080fd5b506102e461066e366004612086565b6116c6565b34801561067f57600080fd5b5061033361068e366004612136565b6116db565b34801561069f57600080fd5b50610306611778565b3480156106b457600080fd5b50610306611787565b3480156106c957600080fd5b506106dd6106d8366004612086565b611796565b604051610299949392919061246e565b3480156106f957600080fd5b5061028c6117c8565b61033361071036600461221d565b611856565b34801561072157600080fd5b506102b76107303660046120be565b611a0d565b34801561074157600080fd5b506103336107503660046122fe565b611a38565b34801561076157600080fd5b506102b7610770366004612086565b611a5a565b34801561078157600080fd5b506103336107903660046120be565b611a78565b606061079f611629565b1561085457600960009054906101000a90046001600160a01b03166001600160a01b03166306fdde036040518163ffffffff1660e01b815260040160006040518083038186803b1580156107f257600080fd5b505afa158015610806573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261082e9190810190612255565b60405160200161083e9190612373565b60405160208183030381529060405290506108ee565b600960009054906101000a90046001600160a01b03166001600160a01b03166306fdde036040518163ffffffff1660e01b815260040160006040518083038186803b1580156108a257600080fd5b505afa1580156108b6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108de9190810190612255565b60405160200161083e91906123a5565b90565b600b5481565b6000610904338484611aad565b50600192915050565b6007546001600160a01b031681565b6001600160a01b03808216600090815260056020908152604091829020825160808101845281548516815260018201549281018390526002820154938101939093526003015490921660608201819052909190816109955760405162461bcd60e51b815260040161098c906125d3565b60405180910390fd5b82516001600160a01b031633146109be5760405162461bcd60e51b815260040161098c9061250c565b4260045484604001516109d1919061274f565b11156109ef5760405162461bcd60e51b815260040161098c90612543565b82516001600160a01b0380861660009081526005602052604080822080546001600160a01b0319908116825560018201849055600282019390935560030180549092169091555163a9059cbb60e01b81529083169063a9059cbb90610a5a908490879060040161240d565b602060405180830381600087803b158015610a7457600080fd5b505af1158015610a88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aac9190612201565b610ac85760405162461bcd60e51b815260040161098c906125fb565b610adb8582610ad688611333565b611b08565b806001600160a01b0316856001600160a01b03167f52a5c2b28bc6eb9712d0ced43463103b486b13ccc9cda499fd3b2d7b6a74a8ee85604051610b1e9190612738565b60405180910390a35050505050565b600d5481565b60025490565b6001600160a01b03808216600090815260056020526040902054165b919050565b6000610b67848484611b08565b6001600160a01b038416600090815260016020908152604080832033808552925290912054610ba2918691610b9d9086906127a6565b611aad565b5060019392505050565b610bb581611630565b610bd15760405162461bcd60e51b815260040161098c90612632565b6000610bdc8361134e565b905060008111610bfe5760405162461bcd60e51b815260040161098c906125a3565b336000610c0a84611333565b90506000610c188483612787565b90508582610c385760405162461bcd60e51b815260040161098c906126ca565b6001600160a01b03861660009081526005602052604090206001015415610c715760405162461bcd60e51b815260040161098c90612667565b6040516323b872dd60e01b81526001600160a01b038216906323b872dd90610ca1908790309087906004016123e9565b602060405180830381600087803b158015610cbb57600080fd5b505af1158015610ccf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf39190612201565b610d0f5760405162461bcd60e51b815260040161098c906125fb565b604080516080810182526001600160a01b038087168083526020808401878152428587019081528d8516606087019081528d86166000818152600590955293889020965187549087166001600160a01b0319918216178855925160018801559051600287015551600390950180549590941694169390931790915591517f1982ca8958fc8a8176cb52be509260f4bc5af7ce04e1533711793f1c56dd535990610db9908790612738565b60405180910390a350505050505050565b60095460408051632a0a4ed560e01b815290516000926001600160a01b031691632a0a4ed5916004808301926020929190829003018186803b158015610e0f57600080fd5b505afa158015610e23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4791906120a2565b905090565b60035460ff1681565b610e5d610dca565b6001600160a01b0316336001600160a01b031614610e8d5760405162461bcd60e51b815260040161098c90612701565b6001600160a01b038082166000908152600560209081526040918290208251608081018452815485168152600182015492810183905260028201549381019390935260030154909216606082018190529091610efb5760405162461bcd60e51b815260040161098c906125d3565b6001600160a01b03808416600090815260056020908152604080832080546001600160a01b031990811682556001820185905560028201949094556003018054909316909255845190850151915163a9059cbb60e01b81529284169263a9059cbb92610f6a929160040161240d565b602060405180830381600087803b158015610f8457600080fd5b505af1158015610f98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbc9190612201565b610fd85760405162461bcd60e51b815260040161098c906125fb565b81600001516001600160a01b0316836001600160a01b03167fbb036e629a9f4c0897ee5d48440dfdb36f7e772117723a2ed603a6514244c2d584602001516040516110239190612738565b60405180910390a3505050565b600c546001600160a01b031633141561105457600c80546001600160a01b03191690555b565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610904918590610b9d90869061274f565b6001600160a01b039081166000908152600560205260409020600301541690565b6000806110bb86866116b3565b9050801561112857604051635260769b60e11b81526001600160a01b0387169063a4c0ed36906110f5903390899089908990600401612426565b600060405180830381600087803b15801561110f57600080fd5b505af1158015611123573d6000803e3d6000fd5b505050505b95945050505050565b61113b3382611bc5565b6000611145611629565b61115157600b54611154565b60015b6009549091506001600160a01b03166342966c686111728385612787565b6040518263ffffffff1660e01b815260040161118e9190612738565b600060405180830381600087803b1580156111a857600080fd5b505af11580156111bc573d6000803e3d6000fd5b505050505050565b6009546001600160a01b031681565b60085481565b336000908152600660205260409020805460ff19169115919091179055565b3360009081526005602052604090206001015415611054573360008181526005602052604080822060018101805460038301805484546001600160a01b0319908116865593879055600290940195909555908216909355905163a9059cbb60e01b815291926001600160a01b0390911691829163a9059cbb916112809190869060040161240d565b602060405180830381600087803b15801561129a57600080fd5b505af11580156112ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d29190612201565b6112ee5760405162461bcd60e51b815260040161098c906125fb565b336001600160a01b03167f203627483d943880619f4b7e0cca21dbefd6204b4d85b124eb99540e17ba86dd836040516113279190612738565b60405180910390a25050565b6001600160a01b031660009081526020819052604090205490565b60008061135a83611c5f565b90508015611369579050610b55565b6009546001600160a01b0384811691161415611389575050600b54610b55565b600b546009546040516377e071ad60e01b81526001600160a01b03909116906377e071ad906113bc9087906004016123d5565b60206040518083038186803b1580156113d457600080fd5b505afa1580156113e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140c9190612316565b6114169190612787565b915050610b55565b50919050565b60045481565b33611433611ca1565b1561143d57600080fd5b611445610b33565b61145190611f40612787565b61145a82611333565b61146690612710612787565b10156114845760405162461bcd60e51b815260040161098c9061269e565b61148e8182611cb2565b7f3b6b79a09e9fd230e8591b65c97236bf7df7a604edf733db0658e66b0e6eb2a9816040516114bd91906123d5565b60405180910390a150565b60606114d2611629565b1561157157600960009054906101000a90046001600160a01b03166001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b15801561152557600080fd5b505afa158015611539573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115619190810190612255565b60405160200161083e919061232e565b600960009054906101000a90046001600160a01b03166001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b1580156115bf57600080fd5b505afa1580156115d3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115fb9190810190612255565b60405160200161083e9190612357565b6001600160a01b031660009081526005602052604090206001015490565b600b541590565b6001600160a01b031660009081526006602052604090205460ff161590565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610904918590610b9d9086906127a6565b6009546001600160a01b0316331461169d57600080fd5b6116a78484611e7a565b50505050565b600e5481565b60006116bf8383611f1b565b9392505050565b60066020526000908152604090205460ff1681565b6009546040516323b872dd60e01b81526001600160a01b03909116906323b872dd9061170f903390309086906004016123e9565b602060405180830381600087803b15801561172957600080fd5b505af115801561173d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117619190612201565b61176a57600080fd5b6117748282611e7a565b5050565b600c546001600160a01b031681565b600a546001600160a01b031681565b60056020526000908152604090208054600182015460028301546003909301546001600160a01b039283169391921684565b600f80546117d5906127e9565b80601f0160208091040260200160405190810160405280929190818152602001828054611801906127e9565b801561184e5780601f106118235761010080835404028352916020019161184e565b820191906000526020600020905b81548152906001019060200180831161183157829003601f168201915b505050505081565b61185e611629565b61186757600080fd5b600a54600d54600e54604051634dc5e43160e01b81526000936001600160a01b031692634dc5e4319234926118a8928a9233928b928b9290916004016124a4565b6020604051808303818588803b1580156118c157600080fd5b505af11580156118d5573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906118fa91906120a2565b9050611904611ca1565b156119e857806001600160a01b0316633f5e3e7f6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561194457600080fd5b505af1158015611958573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197c9190612201565b61198557600080fd5b600c546040516306a169ed60e01b81526001600160a01b03909116906306a169ed906119b59084906004016123d5565b600060405180830381600087803b1580156119cf57600080fd5b505af11580156119e3573d6000803e3d6000fd5b505050505b600c80546001600160a01b0319166001600160a01b0392909216919091179055505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b611a40611629565b15611a4a57600080fd5b611a573382600b54611f4b565b50565b6001600160a01b031660009081526005602052604090206002015490565b600c546001600160a01b03163314611a8f57600080fd5b611aa382611a9c84611333565b6001611f4b565b6117748183611cb2565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611023908590612738565b6001600160a01b038216611b1b57600080fd5b611b26838383611fee565b6001600160a01b03831660009081526020819052604081208054839290611b4e9084906127a6565b90915550506001600160a01b03821660009081526020819052604081208054839290611b7b90849061274f565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516110239190612738565b611bd182600083611fee565b8060026000828254611be391906127a6565b90915550506001600160a01b03821660009081526020819052604081208054839290611c109084906127a6565b90915550506040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611c53908590612738565b60405180910390a35050565b60006001600160a01b038216301415611c7a57506001610b55565b6007546001600160a01b0383811691161415611c995750600854610b55565b506000610b55565b600c546001600160a01b0316151590565b611cba611629565b611cc357600080fd5b6009546040516370a0823160e01b81526001600160a01b039091169063a9059cbb90839083906370a0823190611cfd9030906004016123d5565b60206040518083038186803b158015611d1557600080fd5b505afa158015611d29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4d9190612316565b6040518363ffffffff1660e01b8152600401611d6a92919061240d565b602060405180830381600087803b158015611d8457600080fd5b505af1158015611d98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dbc9190612201565b611dc557600080fd5b600980546001600160a01b0319166001600160a01b038416179055611774611deb610b33565b6009546040516370a0823160e01b81526001600160a01b03909116906370a0823190611e1b9030906004016123d5565b60206040518083038186803b158015611e3357600080fd5b505afa158015611e47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6b9190612316565b611e759190612767565b612066565b6001600160a01b038216611e8d57600080fd5b611e9960008383611fee565b8060026000828254611eab919061274f565b90915550506001600160a01b03821660009081526020819052604081208054839290611ed890849061274f565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611c53908590612738565b6000611f278383612079565b611f435760405162461bcd60e51b815260040161098c9061257a565b6109046111f8565b611f558383611bc5565b6009546001600160a01b031663a9059cbb84611f718486612787565b6040518363ffffffff1660e01b8152600401611f8e92919061240d565b602060405180830381600087803b158015611fa857600080fd5b505af1158015611fbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fe09190612201565b611fe957600080fd5b505050565b611ff6611ca1565b15611fe957600c5460405163e1a1810f60e01b81526001600160a01b039091169063e1a1810f9061202f908690869086906004016123e9565b600060405180830381600087803b15801561204957600080fd5b505af115801561205d573d6000803e3d6000fd5b50505050505050565b600181101561207457600080fd5b600b55565b6000610904338484611b08565b600060208284031215612097578081fd5b81356116bf8161284a565b6000602082840312156120b3578081fd5b81516116bf8161284a565b600080604083850312156120d0578081fd5b82356120db8161284a565b915060208301356120eb8161284a565b809150509250929050565b60008060006060848603121561210a578081fd5b83356121158161284a565b925060208401356121258161284a565b929592945050506040919091013590565b60008060408385031215612148578182fd5b82356121538161284a565b946020939093013593505050565b60008060008060608587031215612176578081fd5b84356121818161284a565b935060208501359250604085013567ffffffffffffffff808211156121a4578283fd5b818701915087601f8301126121b7578283fd5b8135818111156121c5578384fd5b8860208285010111156121d6578384fd5b95989497505060200194505050565b6000602082840312156121f6578081fd5b81356116bf8161285f565b600060208284031215612212578081fd5b81516116bf8161285f565b600080600060608486031215612231578283fd5b8335925060208401359150604084013561224a8161284a565b809150509250925092565b600060208284031215612266578081fd5b815167ffffffffffffffff8082111561227d578283fd5b818401915084601f830112612290578283fd5b8151818111156122a2576122a2612834565b604051601f8201601f19908116603f011681019083821181831017156122ca576122ca612834565b816040528281528760208487010111156122e2578586fd5b6122f38360208301602088016127bd565b979650505050505050565b60006020828403121561230f578081fd5b5035919050565b600060208284031215612327578081fd5b5051919050565b6000601160fa1b8252825161234a8160018501602087016127bd565b9190910160010192915050565b6000605760f81b8252825161234a8160018501602087016127bd565b6000690223930b3b3b0b13632960b51b8252825161239881600a8501602087016127bd565b91909101600a0192915050565b60006702bb930b83832b2160c51b825282516123c88160088501602087016127bd565b9190910160080192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0385168152602081018490526060604082018190528101829052600082846080840137818301608090810191909152601f909201601f191601019392505050565b6001600160a01b03948516815260208101939093526040830191909152909116606082015260800190565b901515815260200190565b9586526001600160a01b039485166020870152604086019390935292166060840152608083019190915260a082015260c00190565b60006020825282518060208401526124f88160408501602087016127bd565b601f01601f19169190910160400192915050565b6020808252601f908201527f4f6e6c7920636c61696d616e742063616e207265736f6c766520636c61696d00604082015260600190565b60208082526019908201527f436c61696d20706572696f64206e6f74206f7665722079657400000000000000604082015260600190565b6020808252600f908201526e151c985b9cd9995c8819985a5b1959608a1b604082015260600190565b602080825260169082015275155b9cdd5c1c1bdc9d19590818dbdb1b185d195c985b60521b604082015260600190565b6020808252600e908201526d139bc818db185a5b48199bdd5b9960921b604082015260600190565b6020808252601a908201527f436f6c6c61746572616c207472616e73666572206661696c6564000000000000604082015260600190565b6020808252818101527f436c61696d732064697361626c656420666f7220746869732061646472657373604082015260600190565b60208082526017908201527f4164647265737320616c726561647920636c61696d6564000000000000000000604082015260600190565b602080825260129082015271145d5bdc9d5b481b9bdd081c995858da195960721b604082015260600190565b6020808252601f908201527f436c61696d6564206164647265737320686f6c6473206e6f2073686172657300604082015260600190565b60208082526018908201527f596f752063616e6e6f742064656c65746520636c61696d730000000000000000604082015260600190565b90815260200190565b60ff91909116815260200190565b600082198211156127625761276261281e565b500190565b60008261278257634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156127a1576127a161281e565b500290565b6000828210156127b8576127b861281e565b500390565b60005b838110156127d85781810151838201526020016127c0565b838111156116a75750506000910152565b6002810460018216806127fd57607f821691505b6020821081141561141e57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611a5757600080fd5b8015158114611a5757600080fdfea2646970667358221220d0f14521c293fe962159c01fb4a60e9f1b718f0e199f1b629f370472c2098d9664736f6c63430008010033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000f9f92751f272f0872e2edb6a280b0990f3e2b8a3000000000000000000000000cb58ec733ab0d96216b048bf7c3209d6c184d7c30000000000000000000000000000000000000000000000000000000000001d4c00000000000000000000000000000000000000000000000000000000004f1a00000000000000000000000000000000000000000000000000000000000000005c647261672e616b74696f6e61726961742e636f6d3f7368613235363d3363323535326364333231623964666632623731376264303264383235303631306639313439613461336561653735633465343463356361643035323332623800000000

-----Decoded View---------------
Arg [0] : _terms (string): drag.aktionariat.com?sha256=3c2552cd321b9dff2b717bd02d8250610f9149a4a3eae75c4e44c5cad05232b8
Arg [1] : offerFactory (address): 0xf9f92751F272f0872e2EDb6a280b0990F3e2b8A3
Arg [2] : wrappedToken (address): 0xcB58EC733Ab0d96216B048bf7C3209d6c184D7c3
Arg [3] : quorum (uint256): 7500
Arg [4] : votePeriod (uint256): 5184000

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 000000000000000000000000f9f92751f272f0872e2edb6a280b0990f3e2b8a3
Arg [2] : 000000000000000000000000cb58ec733ab0d96216b048bf7c3209d6c184d7c3
Arg [3] : 0000000000000000000000000000000000000000000000000000000000001d4c
Arg [4] : 00000000000000000000000000000000000000000000000000000000004f1a00
Arg [5] : 000000000000000000000000000000000000000000000000000000000000005c
Arg [6] : 647261672e616b74696f6e61726961742e636f6d3f7368613235363d33633235
Arg [7] : 3532636433323162396466663262373137626430326438323530363130663931
Arg [8] : 3439613461336561653735633465343463356361643035323332623800000000


Deployed Bytecode Sourcemap

3008:1594:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3178:274:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2543:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3010:157:1:-;;;;;;;;;;-1:-1:-1;3010:157:1;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3388:38:3:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;10525:741::-;;;;;;;;;;-1:-1:-1;10525:741:3;;;;;:::i;:::-;;:::i;:::-;;2742:21:2;;;;;;;;;;;;;:::i;1989:100:1:-;;;;;;;;;;;;;:::i;8905:126:3:-;;;;;;;;;;-1:-1:-1;8905:126:3;;;;;:::i;:::-;;:::i;3638:262:1:-;;;;;;;;;;-1:-1:-1;3638:262:1;;;;;:::i;:::-;;:::i;7877:1020:3:-;;;;;;;;;;-1:-1:-1;7877:1020:3;;;;;:::i;:::-;;:::i;3801:140:0:-;;;;;;;;;;;;;:::i;1817:30:1:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;11407:514:3:-;;;;;;;;;;-1:-1:-1;11407:514:3;;;;;:::i;:::-;;:::i;6693:139:2:-;;;;;;;;;;;;;:::i;4309:203:1:-;;;;;;;;;;-1:-1:-1;4309:203:1;;;;;:::i;:::-;;:::i;9177:136:3:-;;;;;;;;;;-1:-1:-1;9177:136:3;;;;;:::i;:::-;;:::i;6134:303:1:-;;;;;;;;;;-1:-1:-1;6134:303:1;;;;;:::i;:::-;;:::i;5830:209:2:-;;;;;;;;;;-1:-1:-1;5830:209:2;;;;;:::i;:::-;;:::i;2319:21::-;;;;;;;;;;;;;:::i;3433:35:3:-;;;;;;;;;;;;;:::i;5559:103::-;;;;;;;;;;-1:-1:-1;5559:103:3;;;;;:::i;:::-;;:::i;9912:427::-;;;;;;;;;;;;;:::i;2152:119:1:-;;;;;;;;;;-1:-1:-1;2152:119:1;;;;;:::i;:::-;;:::i;3949:648:0:-;;;;;;;;;;-1:-1:-1;3949:648:0;;;;;:::i;:::-;;:::i;3012:37:3:-;;;;;;;;;;;;;:::i;7263:366:2:-;;;;;;;;;;;;;:::i;3460:264::-;;;;;;;;;;;;;:::i;9039:130:3:-;;;;;;;;;;-1:-1:-1;9039:130:3;;;;;:::i;:::-;;:::i;4551:101:2:-;;;;;;;;;;;;;:::i;5844:121:3:-;;;;;;;;;;-1:-1:-1;5844:121:3;;;;;:::i;:::-;;:::i;5015:213:1:-;;;;;;;;;;-1:-1:-1;5015:213:1;;;;;:::i;:::-;;:::i;3732:175:2:-;;;;;;;;;;-1:-1:-1;3732:175:2;;;;;:::i;:::-;;:::i;2770:25::-;;;;;;;;;;;;;:::i;3641:152:0:-;;;;;;;;;;-1:-1:-1;3641:152:0;;;;;:::i;:::-;;:::i;3207:48:3:-;;;;;;;;;;-1:-1:-1;3207:48:3;;;;;:::i;:::-;;:::i;4029:178:2:-;;;;;;;;;;-1:-1:-1;4029:178:2;;;;;:::i;:::-;;:::i;2714:19::-;;;;;;;;;;;;;:::i;2400:28::-;;;;;;;;;;;;;:::i;3082:39:3:-;;;;;;;;;;-1:-1:-1;3082:39:3;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;3078:19:0:-;;;;;;;;;;;;;:::i;6047:433:2:-;;;;;;:::i;:::-;;:::i;2720:143:1:-;;;;;;;;;;-1:-1:-1;2720:143:1;;;;;:::i;:::-;;:::i;4986:140:2:-;;;;;;;;;;-1:-1:-1;4986:140:2;;;;;:::i;:::-;;:::i;9321:128:3:-;;;;;;;;;;-1:-1:-1;9321:128:3;;;;;:::i;:::-;;:::i;6488:197:2:-;;;;;;;;;;-1:-1:-1;6488:197:2;;;;;:::i;:::-;;:::i;3178:274::-;3224:13;3253:11;:9;:11::i;:::-;3249:196;;;3325:7;;;;;;;;;-1:-1:-1;;;;;3325:7:2;-1:-1:-1;;;;;3325:12:2;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3325:14:2;;;;;;;;;;;;:::i;:::-;3294:46;;;;;;;;:::i;:::-;;;;;;;;;;;;;3280:61;;;;3249:196;3417:7;;;;;;;;;-1:-1:-1;;;;;3417:7:2;-1:-1:-1;;;;;3417:12:2;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3417:14:2;;;;;;;;;;;;:::i;:::-;3388:44;;;;;;;;:::i;3249:196::-;3178:274;:::o;2543:41::-;;;;:::o;3010:157:1:-;3084:4;3101:36;3110:10;3122:7;3131:5;3101:8;:36::i;:::-;-1:-1:-1;3155:4:1;3010:157;;;;:::o;3388:38:3:-;;;-1:-1:-1;;;;;3388:38:3;;:::o;10525:741::-;-1:-1:-1;;;;;10602:19:3;;;10581:18;10602:19;;;:6;:19;;;;;;;;;10581:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10743:15;10735:42;;;;-1:-1:-1;;;10735:42:3;;;;;;;:::i;:::-;;;;;;;;;10796:14;;-1:-1:-1;;;;;10796:28:3;10814:10;10796:28;10788:72;;;;-1:-1:-1;;;10788:72:3;;;;;;;:::i;:::-;10912:15;10897:11;;10879:5;:15;;;:29;;;;:::i;:::-;:48;;10871:86;;;;-1:-1:-1;;;10871:86:3;;;;;;;:::i;:::-;10987:14;;-1:-1:-1;;;;;11019:19:3;;;10968:16;11019:19;;;:6;:19;;;;;;11012:26;;-1:-1:-1;;;;;;11012:26:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;11057:39;-1:-1:-1;;;11057:39:3;;:17;;;;;;:39;;10987:14;;11085:10;;11057:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11049:78;;;;-1:-1:-1;;;11049:78:3;;;;;;;:::i;:::-;11138:56;11148:11;11161:8;11171:22;11181:11;11171:9;:22::i;:::-;11138:9;:56::i;:::-;11237:8;-1:-1:-1;;;;;11210:48:3;11224:11;-1:-1:-1;;;;;11210:48:3;;11247:10;11210:48;;;;;;:::i;:::-;;;;;;;;10525:741;;;;;:::o;2742:21:2:-;;;;:::o;1989:100:1:-;2069:12;;1989:100;:::o;8905:126:3:-;-1:-1:-1;;;;;8995:19:3;;;8968:7;8995:19;;;:6;:19;;;;;:28;;8905:126;;;;:::o;3638:262:1:-;3736:4;3753:36;3763:6;3771:9;3782:6;3753:9;:36::i;:::-;-1:-1:-1;;;;;3829:19:1;;;;;;:11;:19;;;;;;;;3817:10;3829:31;;;;;;;;;3800:70;;3809:6;;3829:40;;3863:6;;3829:40;:::i;:::-;3800:8;:70::i;:::-;-1:-1:-1;3888:4:1;3638:262;;;;;:::o;7877:1020:3:-;7969:30;7987:11;7969:17;:30::i;:::-;7961:75;;;;-1:-1:-1;;;7961:75:3;;;;;;;:::i;:::-;8047:22;8072:33;8090:14;8072:17;:33::i;:::-;8047:58;;8141:1;8124:14;:18;8116:53;;;;-1:-1:-1;;;8116:53:3;;;;;;;:::i;:::-;8199:10;8180:16;8238:22;8248:11;8238:9;:22::i;:::-;8220:40;-1:-1:-1;8271:18:3;8292:24;8302:14;8220:40;8292:24;:::i;:::-;8271:45;-1:-1:-1;8352:14:3;8386:11;8378:55;;;;-1:-1:-1;;;8378:55:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;8452:19:3;;;;;;:6;:19;;;;;:30;;;:35;8444:71;;;;-1:-1:-1;;;8444:71:3;;;;;;;:::i;:::-;8534:58;;-1:-1:-1;;;8534:58:3;;-1:-1:-1;;;;;8534:21:3;;;;;:58;;8556:8;;8574:4;;8581:10;;8534:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8526:97;;;;-1:-1:-1;;;8526:97:3;;;;;;;:::i;:::-;8658:172;;;;;;;;-1:-1:-1;;;;;8658:172:3;;;;;;;;;;;;;8760:15;8658:172;;;;;;;;;;;;;;;8636:19;;;-1:-1:-1;8636:19:3;;;:6;:19;;;;;;;:194;;;;;;;-1:-1:-1;;;;;;8636:194:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8848:41;;;;;;8881:7;;8848:41;:::i;:::-;;;;;;;;7877:1020;;;;;;;:::o;3801:140:0:-;3906:7;;3885:48;;;-1:-1:-1;;;3885:48:0;;;;3858:7;;-1:-1:-1;;;;;3906:7:0;;3885:46;;:48;;;;;;;;;;;;;;3906:7;3885:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3878:55;;3801:140;:::o;1817:30:1:-;;;;;;:::o;11407:514:3:-;11489:17;:15;:17::i;:::-;-1:-1:-1;;;;;11475:31:3;:10;-1:-1:-1;;;;;11475:31:3;;11467:68;;;;-1:-1:-1;;;11467:68:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;11567:19:3;;;11546:18;11567:19;;;:6;:19;;;;;;;;;11546:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11652:48;;;;-1:-1:-1;;;11652:48:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;11718:19:3;;;;;;;:6;:19;;;;;;;;11711:26;;-1:-1:-1;;;;;;11711:26:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;11774:14;;11790:16;;;;11756:51;;-1:-1:-1;;;11756:51:3;;:17;;;;;;:51;;11774:14;11756:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11748:90;;;;-1:-1:-1;;;11748:90:3;;;;;;;:::i;:::-;11880:5;:14;;;-1:-1:-1;;;;;11854:59:3;11867:11;-1:-1:-1;;;;;11854:59:3;;11896:5;:16;;;11854:59;;;;;;:::i;:::-;;;;;;;;11407:514;;;:::o;6693:139:2:-;6765:5;;-1:-1:-1;;;;;6765:5:2;6743:10;:28;6739:86;;;6787:5;:26;;-1:-1:-1;;;;;;6787:26:2;;;6739:86;6693:139::o;4309:203:1:-;4415:10;4389:4;4436:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;4436:32:1;;;;;;;;;;4389:4;;4406:76;;4427:7;;4436:45;;4471:10;;4436:45;:::i;9177:136:3:-;-1:-1:-1;;;;;9273:19:3;;;9246:7;9273:19;;;:6;:19;;;;;:32;;;;;9177:136::o;6134:303:1:-;6228:4;6245:12;6260:27;6269:9;6280:6;6260:8;:27::i;:::-;6245:42;;6302:7;6298:107;;;6325:68;;-1:-1:-1;;;6325:68:1;;-1:-1:-1;;;;;6325:42:1;;;;;:68;;6368:10;;6380:6;;6388:4;;;;6325:68;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6298:107;6422:7;6134:303;-1:-1:-1;;;;;6134:303:1:o;5830:209:2:-;5878:25;5884:10;5896:6;5878:5;:25::i;:::-;5914:14;5931:11;:9;:11::i;:::-;:40;;5949:22;;5931:40;;;5945:1;5931:40;6000:7;;5914:57;;-1:-1:-1;;;;;;6000:7:2;5982:32;6015:15;5914:57;6015:6;:15;:::i;:::-;5982:49;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5830:209;;:::o;2319:21::-;;;-1:-1:-1;;;;;2319:21:2;;:::o;3433:35:3:-;;;;:::o;5559:103::-;5632:10;5615:28;;;;:16;:28;;;;;:39;;-1:-1:-1;;5615:39:3;5646:8;;5615:39;;;;;;5559:103::o;9912:427::-;9963:10;9956:18;;;;:6;:18;;;;;:29;;;:34;9952:380;;10035:10;10007:18;10028;;;:6;:18;;;;;;:29;;;;;10097:31;;;;;10144:25;;-1:-1:-1;;;;;;10144:25:3;;;;;;;;;-1:-1:-1;10144:25:3;;;;;;;;;;;;;10192:41;;-1:-1:-1;;;10192:41:3;;10028:29;;-1:-1:-1;;;;;10097:31:3;;;;;;10192:17;;:41;;10035:10;10028:29;;10192:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10184:80;;;;-1:-1:-1;;;10184:80:3;;;;;;;:::i;:::-;10297:10;-1:-1:-1;;;;;10284:36:3;;10309:10;10284:36;;;;;;:::i;:::-;;;;;;;;9952:380;;9912:427::o;2152:119:1:-;-1:-1:-1;;;;;2245:18:1;2218:7;2245:18;;;;;;;;;;;;2152:119::o;3949:648:0:-;4030:7;4050:12;4065:39;4089:14;4065:23;:39::i;:::-;4050:54;-1:-1:-1;4119:8:0;;4115:475;;4151:4;-1:-1:-1;4144:11:0;;4115:475;4203:7;;-1:-1:-1;;;;;4177:34:0;;;4203:7;;4177:34;4173:417;;;-1:-1:-1;;4235:22:0;;4228:29;;4173:417;4556:22;;4510:7;;4489:64;;-1:-1:-1;;;4489:64:0;;-1:-1:-1;;;;;4510:7:0;;;;4489:48;;:64;;4538:14;;4489:64;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:89;;;;:::i;:::-;4482:96;;;;;4173:417;3949:648;;;;:::o;3012:37:3:-;;;;:::o;7263:366:2:-;7320:10;7350:13;:11;:13::i;:::-;7349:14;7341:23;;;;;;7486:13;:11;:13::i;:::-;:20;;7502:4;7486:20;:::i;:::-;7454;7464:9;7454;:20::i;:::-;:28;;7477:5;7454:28;:::i;:::-;:52;;7446:83;;;;-1:-1:-1;;;7446:83:2;;;;;;;:::i;:::-;7540:36;7555:9;7566;7540:14;:36::i;:::-;7592:29;7611:9;7592:29;;;;;;:::i;:::-;;;;;;;;7263:366;:::o;3460:264::-;3508:13;3537:11;:9;:11::i;:::-;3533:184;;;3600:7;;;;;;;;;-1:-1:-1;;;;;3600:7:2;-1:-1:-1;;;;;3600:14:2;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3600:16:2;;;;;;;;;;;;:::i;:::-;3578:39;;;;;;;;:::i;3533:184::-;3687:7;;;;;;;;;-1:-1:-1;;;;;3687:7:2;-1:-1:-1;;;;;3687:14:2;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3687:16:2;;;;;;;;;;;;:::i;:::-;3665:39;;;;;;;;:::i;9039:130:3:-;-1:-1:-1;;;;;9131:19:3;9104:7;9131:19;;;:6;:19;;;;;:30;;;;9039:130::o;4551:101:2:-;4617:22;;:27;4551:101;:::o;5844:121:3:-;-1:-1:-1;;;;;5933:24:3;5908:4;5933:24;;;:16;:24;;;;;;;;5932:25;;5844:121::o;5015:213:1:-;5126:10;5100:4;5147:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;5147:32:1;;;;;;;;;;5100:4;;5117:81;;5138:7;;5147:50;;5182:15;;5147:50;:::i;3732:175:2:-;3860:7;;-1:-1:-1;;;;;3860:7:2;3838:10;:30;3830:39;;;;;;3880:19;3886:4;3892:6;3880:5;:19::i;:::-;3732:175;;;;:::o;2770:25::-;;;;:::o;3641:152:0:-;3736:4;3760:25;3775:2;3779:5;3760:14;:25::i;:::-;3753:32;3641:152;-1:-1:-1;;;3641:152:0:o;3207:48:3:-;;;;;;;;;;;;;;;:::o;4029:178:2:-;4106:7;;:55;;-1:-1:-1;;;4106:55:2;;-1:-1:-1;;;;;4106:7:2;;;;:20;;:55;;4127:10;;4147:4;;4154:6;;4106:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4098:64;;;;;;4173:26;4179:11;4192:6;4173:5;:26::i;:::-;4029:178;;:::o;2714:19::-;;;-1:-1:-1;;;;;2714:19:2;;:::o;2400:28::-;;;-1:-1:-1;;;;;2400:28:2;;:::o;3082:39:3:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3082:39:3;;;;;;;;:::o;3078:19:0:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6047:433:2:-;6166:11;:9;:11::i;:::-;6158:20;;;;;;6208:7;;6284:6;;6292:10;;6208:95;;-1:-1:-1;;;6208:95:2;;6189:16;;-1:-1:-1;;;;;6208:7:2;;:14;;6230:9;;6208:95;;6241:4;;6247:10;;6259:13;;6274:8;;6284:6;;6208:95;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6189:114;;6318:13;:11;:13::i;:::-;6314:124;;;6363:8;-1:-1:-1;;;;;6356:29:2;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6348:40;;;;;;6403:5;;:23;;-1:-1:-1;;;6403:23:2;;-1:-1:-1;;;;;6403:5:2;;;;:13;;:23;;6417:8;;6403:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6314:124;6448:5;:24;;-1:-1:-1;;;;;;6448:24:2;-1:-1:-1;;;;;6448:24:2;;;;;;;;;;-1:-1:-1;;;6047:433:2:o;2720:143:1:-;-1:-1:-1;;;;;2828:18:1;;;2801:7;2828:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;2720:143::o;4986:140:2:-;5045:11;:9;:11::i;:::-;5044:12;5036:21;;;;;;5068:50;5075:10;5087:6;5095:22;;5068:6;:50::i;:::-;4986:140;:::o;9321:128:3:-;-1:-1:-1;;;;;9412:19:3;9385:7;9412:19;;;:6;:19;;;;;:29;;;;9321:128::o;6488:197:2:-;6583:5;;-1:-1:-1;;;;;6583:5:2;6561:10;:28;6553:37;;;;;;6601:34;6608:5;6615:16;6625:5;6615:9;:16::i;:::-;6633:1;6601:6;:34::i;:::-;6646:31;6661:8;6671:5;6646:14;:31::i;8064:175:1:-;-1:-1:-1;;;;;8149:18:1;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;;:35;;;8200:31;;;;;8179:5;;8200:31;:::i;5718:330::-;-1:-1:-1;;;;;5824:23:1;;5816:32;;;;;;5861:47;5882:6;5890:9;5901:6;5861:20;:47::i;:::-;-1:-1:-1;;;;;5921:17:1;;:9;:17;;;;;;;;;;:27;;5942:6;;5921:9;:27;;5942:6;;5921:27;:::i;:::-;;;;-1:-1:-1;;;;;;;5959:20:1;;:9;:20;;;;;;;;;;:30;;5983:6;;5959:9;:30;;5983:6;;5959:30;:::i;:::-;;;;;;;;6022:9;-1:-1:-1;;;;;6005:35:1;6014:6;-1:-1:-1;;;;;6005:35:1;;6033:6;6005:35;;;;;;:::i;7364:260::-;7440:49;7461:7;7478:1;7482:6;7440:20;:49::i;:::-;7518:6;7502:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;7535:18:1;;:9;:18;;;;;;;;;;:28;;7557:6;;7535:9;:28;;7557:6;;7535:28;:::i;:::-;;;;-1:-1:-1;;7579:37:1;;7605:1;;-1:-1:-1;;;;;7579:37:1;;;;;;;7609:6;;7579:37;:::i;:::-;;;;;;;;7364:260;;:::o;3806:327:3:-;3886:7;-1:-1:-1;;;;;3910:31:3;;3936:4;3910:31;3906:220;;;-1:-1:-1;3965:1:3;3958:8;;3906:220;4006:23;;-1:-1:-1;;;;;3988:41:3;;;4006:23;;3988:41;3984:142;;;-1:-1:-1;4053:20:3;;4046:27;;3984:142;-1:-1:-1;4113:1:3;4106:8;;7834:106:2;7912:5;;-1:-1:-1;;;;;7912:5:2;7904:28;;7834:106;:::o;6840:415::-;6943:11;:9;:11::i;:::-;6935:20;;;;;;7022:7;;7062:32;;-1:-1:-1;;;7062:32:2;;-1:-1:-1;;;;;7022:7:2;;;;:16;;7039:21;;7022:7;;7062:17;;:32;;7088:4;;7062:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7022:73;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7014:82;;;;;;7148:7;:28;;-1:-1:-1;;;;;;7148:28:2;-1:-1:-1;;;;;7148:28:2;;;;;7187:60;7233:13;:11;:13::i;:::-;7198:7;;:32;;-1:-1:-1;;;7198:32:2;;-1:-1:-1;;;;;7198:7:2;;;;:17;;:32;;7224:4;;7198:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;;;;:::i;:::-;7187:10;:60::i;6718:313:1:-;-1:-1:-1;;;;;6804:23:1;;6796:32;;;;;;6841:51;6870:1;6874:9;6885:6;6841:20;:51::i;:::-;6921:6;6905:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;6938:20:1;;:9;:20;;;;;;;;;;:30;;6962:6;;6938:9;:30;;6962:6;;6938:30;:::i;:::-;;;;-1:-1:-1;;6984:39:1;;-1:-1:-1;;;;;6984:39:1;;;7001:1;;6984:39;;;;7016:6;;6984:39;:::i;9457:217:3:-;9543:4;9568:33;9583:9;9594:6;9568:14;:33::i;:::-;9560:61;;;;-1:-1:-1;;;9560:61:3;;;;;;;:::i;:::-;9632:12;:10;:12::i;5138:171:2:-;5221:20;5227:5;5234:6;5221:5;:20::i;:::-;5260:7;;-1:-1:-1;;;;;5260:7:2;:16;5277:5;5284:15;5293:6;5284;:15;:::i;:::-;5260:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5252:49;;;;;;5138:171;;;:::o;7637:189::-;7742:13;:11;:13::i;:::-;7738:81;;;7772:5;;:35;;-1:-1:-1;;;7772:35:2;;-1:-1:-1;;;;;7772:5:2;;;;:17;;:35;;7790:4;;7796:2;;7800:6;;7772:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7637:189;;;:::o;4756:126::-;4830:1;4820:6;:11;;4812:20;;;;;;4843:22;:31;4756:126::o;2484:173:1:-;2570:4;2587:40;2597:10;2609:9;2620:6;2587:9;:40::i;14:259:6:-;;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:33;237:5;210:33;:::i;278:263::-;;401:2;389:9;380:7;376:23;372:32;369:2;;;422:6;414;407:22;369:2;459:9;453:16;478:33;505:5;478:33;:::i;546:402::-;;;675:2;663:9;654:7;650:23;646:32;643:2;;;696:6;688;681:22;643:2;740:9;727:23;759:33;786:5;759:33;:::i;:::-;811:5;-1:-1:-1;868:2:6;853:18;;840:32;881:35;840:32;881:35;:::i;:::-;935:7;925:17;;;633:315;;;;;:::o;953:470::-;;;;1099:2;1087:9;1078:7;1074:23;1070:32;1067:2;;;1120:6;1112;1105:22;1067:2;1164:9;1151:23;1183:33;1210:5;1183:33;:::i;:::-;1235:5;-1:-1:-1;1292:2:6;1277:18;;1264:32;1305:35;1264:32;1305:35;:::i;:::-;1057:366;;1359:7;;-1:-1:-1;;;1413:2:6;1398:18;;;;1385:32;;1057:366::o;1428:327::-;;;1557:2;1545:9;1536:7;1532:23;1528:32;1525:2;;;1578:6;1570;1563:22;1525:2;1622:9;1609:23;1641:33;1668:5;1641:33;:::i;:::-;1693:5;1745:2;1730:18;;;;1717:32;;-1:-1:-1;;;1515:240:6:o;1760:846::-;;;;;1925:2;1913:9;1904:7;1900:23;1896:32;1893:2;;;1946:6;1938;1931:22;1893:2;1990:9;1977:23;2009:33;2036:5;2009:33;:::i;:::-;2061:5;-1:-1:-1;2113:2:6;2098:18;;2085:32;;-1:-1:-1;2168:2:6;2153:18;;2140:32;2191:18;2221:14;;;2218:2;;;2253:6;2245;2238:22;2218:2;2296:6;2285:9;2281:22;2271:32;;2341:7;2334:4;2330:2;2326:13;2322:27;2312:2;;2368:6;2360;2353:22;2312:2;2413;2400:16;2439:2;2431:6;2428:14;2425:2;;;2460:6;2452;2445:22;2425:2;2510:7;2505:2;2496:6;2492:2;2488:15;2484:24;2481:37;2478:2;;;2536:6;2528;2521:22;2478:2;1883:723;;;;-1:-1:-1;;2572:2:6;2564:11;;-1:-1:-1;;;1883:723:6:o;2611:253::-;;2720:2;2708:9;2699:7;2695:23;2691:32;2688:2;;;2741:6;2733;2726:22;2688:2;2785:9;2772:23;2804:30;2828:5;2804:30;:::i;2869:257::-;;2989:2;2977:9;2968:7;2964:23;2960:32;2957:2;;;3010:6;3002;2995:22;2957:2;3047:9;3041:16;3066:30;3090:5;3066:30;:::i;3131:395::-;;;;3277:2;3265:9;3256:7;3252:23;3248:32;3245:2;;;3298:6;3290;3283:22;3245:2;3339:9;3326:23;3316:33;;3396:2;3385:9;3381:18;3368:32;3358:42;;3450:2;3439:9;3435:18;3422:32;3463:33;3490:5;3463:33;:::i;:::-;3515:5;3505:15;;;3235:291;;;;;:::o;3531:924::-;;3664:2;3652:9;3643:7;3639:23;3635:32;3632:2;;;3685:6;3677;3670:22;3632:2;3723:9;3717:16;3752:18;3793:2;3785:6;3782:14;3779:2;;;3814:6;3806;3799:22;3779:2;3857:6;3846:9;3842:22;3832:32;;3902:7;3895:4;3891:2;3887:13;3883:27;3873:2;;3929:6;3921;3914:22;3873:2;3963;3957:9;3985:2;3981;3978:10;3975:2;;;3991:18;;:::i;:::-;4066:2;4060:9;4034:2;4120:13;;-1:-1:-1;;4116:22:6;;;4140:2;4112:31;4108:40;4096:53;;;4164:18;;;4184:22;;;4161:46;4158:2;;;4210:18;;:::i;:::-;4250:10;4246:2;4239:22;4285:2;4277:6;4270:18;4325:7;4320:2;4315;4311;4307:11;4303:20;4300:33;4297:2;;;4351:6;4343;4336:22;4297:2;4369:55;4421:2;4416;4408:6;4404:15;4399:2;4395;4391:11;4369:55;:::i;:::-;4443:6;3622:833;-1:-1:-1;;;;;;;3622:833:6:o;4460:190::-;;4572:2;4560:9;4551:7;4547:23;4543:32;4540:2;;;4593:6;4585;4578:22;4540:2;-1:-1:-1;4621:23:6;;4530:120;-1:-1:-1;4530:120:6:o;4655:194::-;;4778:2;4766:9;4757:7;4753:23;4749:32;4746:2;;;4799:6;4791;4784:22;4746:2;-1:-1:-1;4827:16:6;;4736:113;-1:-1:-1;4736:113:6:o;4854:418::-;;-1:-1:-1;;;5111:3:6;5104:16;5149:6;5143:13;5165:61;5219:6;5215:1;5210:3;5206:11;5199:4;5191:6;5187:17;5165:61;:::i;:::-;5246:16;;;;5264:1;5242:24;;5094:178;-1:-1:-1;;5094:178:6:o;5277:418::-;;-1:-1:-1;;;5534:3:6;5527:16;5572:6;5566:13;5588:61;5642:6;5638:1;5633:3;5629:11;5622:4;5614:6;5610:17;5588:61;:::i;5700:429::-;;-1:-1:-1;;;5957:3:6;5950:25;6004:6;5998:13;6020:62;6075:6;6070:2;6065:3;6061:12;6054:4;6046:6;6042:17;6020:62;:::i;:::-;6102:16;;;;6120:2;6098:25;;5940:189;-1:-1:-1;;5940:189:6:o;6134:425::-;;-1:-1:-1;;;6391:3:6;6384:23;6436:6;6430:13;6452:61;6506:6;6502:1;6497:3;6493:11;6486:4;6478:6;6474:17;6452:61;:::i;:::-;6533:16;;;;6551:1;6529:24;;6374:185;-1:-1:-1;;6374:185:6:o;6564:203::-;-1:-1:-1;;;;;6728:32:6;;;;6710:51;;6698:2;6683:18;;6665:102::o;6772:375::-;-1:-1:-1;;;;;7030:15:6;;;7012:34;;7082:15;;;;7077:2;7062:18;;7055:43;7129:2;7114:18;;7107:34;;;;6962:2;6947:18;;6929:218::o;7152:274::-;-1:-1:-1;;;;;7344:32:6;;;;7326:51;;7408:2;7393:18;;7386:34;7314:2;7299:18;;7281:145::o;7431:562::-;-1:-1:-1;;;;;7644:32:6;;7626:51;;7708:2;7693:18;;7686:34;;;7756:2;7751;7736:18;;7729:30;;;7775:18;;7768:34;;;7431:562;7795:6;7845;7839:3;7824:19;;7811:49;7880:22;;;7904:3;7876:32;;;7869:46;;;;7976:2;7955:15;;;-1:-1:-1;;7951:29:6;7936:45;7932:55;;7616:377;-1:-1:-1;;;7616:377:6:o;7998:447::-;-1:-1:-1;;;;;8285:15:6;;;8267:34;;8332:2;8317:18;;8310:34;;;;8375:2;8360:18;;8353:34;;;;8423:15;;;8418:2;8403:18;;8396:43;8216:3;8201:19;;8183:262::o;8450:187::-;8615:14;;8608:22;8590:41;;8578:2;8563:18;;8545:92::o;8642:591::-;8929:25;;;-1:-1:-1;;;;;9028:15:6;;;9023:2;9008:18;;9001:43;9075:2;9060:18;;9053:34;;;;9123:15;;9118:2;9103:18;;9096:43;9170:3;9155:19;;9148:35;;;;8981:3;9199:19;;9192:35;8916:3;8901:19;;8883:350::o;9914:383::-;;10063:2;10052:9;10045:21;10095:6;10089:13;10138:6;10133:2;10122:9;10118:18;10111:34;10154:66;10213:6;10208:2;10197:9;10193:18;10188:2;10180:6;10176:15;10154:66;:::i;:::-;10281:2;10260:15;-1:-1:-1;;10256:29:6;10241:45;;;;10288:2;10237:54;;10035:262;-1:-1:-1;;10035:262:6:o;10302:355::-;10504:2;10486:21;;;10543:2;10523:18;;;10516:30;10582:33;10577:2;10562:18;;10555:61;10648:2;10633:18;;10476:181::o;10662:349::-;10864:2;10846:21;;;10903:2;10883:18;;;10876:30;10942:27;10937:2;10922:18;;10915:55;11002:2;10987:18;;10836:175::o;11016:339::-;11218:2;11200:21;;;11257:2;11237:18;;;11230:30;-1:-1:-1;;;11291:2:6;11276:18;;11269:45;11346:2;11331:18;;11190:165::o;11360:346::-;11562:2;11544:21;;;11601:2;11581:18;;;11574:30;-1:-1:-1;;;11635:2:6;11620:18;;11613:52;11697:2;11682:18;;11534:172::o;11711:338::-;11913:2;11895:21;;;11952:2;11932:18;;;11925:30;-1:-1:-1;;;11986:2:6;11971:18;;11964:44;12040:2;12025:18;;11885:164::o;12054:350::-;12256:2;12238:21;;;12295:2;12275:18;;;12268:30;12334:28;12329:2;12314:18;;12307:56;12395:2;12380:18;;12228:176::o;12409:356::-;12611:2;12593:21;;;12630:18;;;12623:30;12689:34;12684:2;12669:18;;12662:62;12756:2;12741:18;;12583:182::o;12770:347::-;12972:2;12954:21;;;13011:2;12991:18;;;12984:30;13050:25;13045:2;13030:18;;13023:53;13108:2;13093:18;;12944:173::o;13122:342::-;13324:2;13306:21;;;13363:2;13343:18;;;13336:30;-1:-1:-1;;;13397:2:6;13382:18;;13375:48;13455:2;13440:18;;13296:168::o;13469:355::-;13671:2;13653:21;;;13710:2;13690:18;;;13683:30;13749:33;13744:2;13729:18;;13722:61;13815:2;13800:18;;13643:181::o;13829:348::-;14031:2;14013:21;;;14070:2;14050:18;;;14043:30;14109:26;14104:2;14089:18;;14082:54;14168:2;14153:18;;14003:174::o;14182:177::-;14328:25;;;14316:2;14301:18;;14283:76::o;14364:184::-;14536:4;14524:17;;;;14506:36;;14494:2;14479:18;;14461:87::o;14553:128::-;;14624:1;14620:6;14617:1;14614:13;14611:2;;;14630:18;;:::i;:::-;-1:-1:-1;14666:9:6;;14601:80::o;14686:217::-;;14752:1;14742:2;;-1:-1:-1;;;14777:31:6;;14831:4;14828:1;14821:15;14859:4;14784:1;14849:15;14742:2;-1:-1:-1;14888:9:6;;14732:171::o;14908:168::-;;15014:1;15010;15006:6;15002:14;14999:1;14996:21;14991:1;14984:9;14977:17;14973:45;14970:2;;;15021:18;;:::i;:::-;-1:-1:-1;15061:9:6;;14960:116::o;15081:125::-;;15149:1;15146;15143:8;15140:2;;;15154:18;;:::i;:::-;-1:-1:-1;15191:9:6;;15130:76::o;15211:258::-;15283:1;15293:113;15307:6;15304:1;15301:13;15293:113;;;15383:11;;;15377:18;15364:11;;;15357:39;15329:2;15322:10;15293:113;;;15424:6;15421:1;15418:13;15415:2;;;-1:-1:-1;;15459:1:6;15441:16;;15434:27;15264:205::o;15474:380::-;15559:1;15549:12;;15606:1;15596:12;;;15617:2;;15671:4;15663:6;15659:17;15649:27;;15617:2;15724;15716:6;15713:14;15693:18;15690:38;15687:2;;;15770:10;15765:3;15761:20;15758:1;15751:31;15805:4;15802:1;15795:15;15833:4;15830:1;15823:15;15859:127;15920:10;15915:3;15911:20;15908:1;15901:31;15951:4;15948:1;15941:15;15975:4;15972:1;15965:15;15991:127;16052:10;16047:3;16043:20;16040:1;16033:31;16083:4;16080:1;16073:15;16107:4;16104:1;16097:15;16123:133;-1:-1:-1;;;;;16200:31:6;;16190:42;;16180:2;;16246:1;16243;16236:12;16261:120;16349:5;16342:13;16335:21;16328:5;16325:32;16315:2;;16371:1;16368;16361:12

Swarm Source

ipfs://d0f14521c293fe962159c01fb4a60e9f1b718f0e199f1b629f370472c2098d96

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

OVERVIEW

Aktionariat offers technical services to create, manage and trade security tokens in accordance with Swiss law.

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ 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.