ETH Price: $3,381.82 (+1.02%)

Contract

0x2fd61567c29E7ADB4Ca17e60E1f4a3Fcfe68aCb8
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer208896542024-10-04 4:06:1180 days ago1728014771IN
SymVerse: Old Token
0 ETH0.000195353.97828781
Transfer204534602024-08-04 6:41:23141 days ago1722753683IN
SymVerse: Old Token
0 ETH0.000049091
Transfer197644172024-04-30 0:03:23238 days ago1714435403IN
SymVerse: Old Token
0 ETH0.000441959
Transfer189620682024-01-08 11:42:11350 days ago1704714131IN
SymVerse: Old Token
0 ETH0.000834817
Transfer169318482023-03-29 8:45:23635 days ago1680079523IN
SymVerse: Old Token
0 ETH0.0013883429.49273588
Transfer132993932021-09-26 4:49:301184 days ago1632631770IN
SymVerse: Old Token
0 ETH0.0026502953.95773544
Transfer125785162021-06-06 3:32:011297 days ago1622950321IN
SymVerse: Old Token
0 ETH0.0003968410.2
Charge116317352021-01-11 5:38:531442 days ago1610343533IN
SymVerse: Old Token
0 ETH0.0048963280
Charge116317352021-01-11 5:38:531442 days ago1610343533IN
SymVerse: Old Token
0 ETH0.0036963280
Transfer113938392020-12-05 16:59:341479 days ago1607187574IN
SymVerse: Old Token
0 ETH0.0008089121.8
Transfer113519022020-11-29 6:08:401485 days ago1606630120IN
SymVerse: Old Token
0 ETH0.0006303312.1
Transfer113423222020-11-27 19:09:091487 days ago1606504149IN
SymVerse: Old Token
0 ETH0.0003315915
Unlock Amount Al...113381782020-11-27 3:42:071488 days ago1606448527IN
SymVerse: Old Token
0 ETH0.001441521
Transfer113380852020-11-27 3:23:071488 days ago1606447387IN
SymVerse: Old Token
0 ETH0.000375817
Transfer113013952020-11-21 12:07:011493 days ago1605960421IN
SymVerse: Old Token
0 ETH0.0008163322
Approve109624982020-09-30 7:45:491545 days ago1601451949IN
SymVerse: Old Token
0 ETH0.00530957117
Charge109092442020-09-22 1:06:581554 days ago1600736818IN
SymVerse: Old Token
0 ETH0.0048972880
Transfer109031092020-09-21 2:37:201555 days ago1600655840IN
SymVerse: Old Token
0 ETH0.0020779694
Transfer109031072020-09-21 2:36:341555 days ago1600655794IN
SymVerse: Old Token
0 ETH0.0034879694
Charge108900872020-09-19 3:00:361557 days ago1600484436IN
SymVerse: Old Token
0 ETH0.004591275
Charge108720372020-09-16 8:22:401559 days ago1600244560IN
SymVerse: Old Token
0 ETH0.0061204100
Charge108250422020-09-09 3:13:471567 days ago1599621227IN
SymVerse: Old Token
0 ETH0.0034199874
Charge108244802020-09-09 1:15:171567 days ago1599614117IN
SymVerse: Old Token
0 ETH0.0043454871
Charge108186642020-09-08 3:53:261567 days ago1599537206IN
SymVerse: Old Token
0 ETH0.0048360679
Charge108128982020-09-07 6:33:081568 days ago1599460388IN
SymVerse: Old Token
0 ETH0.0036972880
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:
SymToken

Compiler Version
v0.5.8+commit.23d335f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-07-16
*/

/**
 *Submitted for verification at Etherscan.io on 2019-06-25
*/

/*
 * 컨트랙트 개요
 * 1. 목적
 *  메인넷 운영이 시작되기 전까지 한시적인 운영을 목적으로 하고 있다.
 *  메인넷이 운영되면 컨트랙트의 거래는 모두 중단되며, 메인넷 코인트로 전환을 시작하며,
 *  전환 절차를 간단하게 수행할 수 있으며, 블록체인 내 기록을 통해 신뢰도를 얻을 수 있도록 설계 되었다.
 * 2. 용어 설명
 *  Owner : 컨트랙트를 생성한 컨트랙트의 주인
 *  Delegator : Owner의 Private Key를 매번 사용하기에는 보안적인 이슈가 발생할 수 있기 때문에 도입된
 *              일부 Owner 권한을 실행할 수 있도록 임명한 대행자
 *              특히, 컨트랙트의 거래가 중단된 상태에서 Delegator만 실행할 수 있는 전용 함수를 실행하여
 *              컨트랙트의 토큰을 회수하고, 메인넷의 코인으로 전환해주는 핵심적인 기능을 수행
 *  Holder : 토큰을 보유할 수 있는 Address를 가지고 있는 계정
 * 3. 운용
 *  3.1. TokenContainer Structure
 *   3.1.1 Charge Amount
 *    Charge Amount는 Holder가 구매하여 충전한 토큰량입니다.
 *    Owner의 경우에는 컨트랙트 전체에 충전된 토큰량. 즉, Total Supply와 같습니다.
 *   3.1.2 Unlock Amount
 *    기본적으로 모든 토큰은 Lock 상태인 것이 기본 상태이며, Owner 또는 Delegator가 Unlock 해준 만큼 Balance로 전환됩니다.
 *    Unlock Amount는 Charge Amount 중 Unlock 된 만큼만 표시합니다.
 *    Unlock Amount는 Charge Amount 보다 커질 수 없습니다.
 *   3.1.3 Balance
 *    ERC20의 Balance와 같으며, 기본적으로는 Charge Amount - Unlock Amount 값에서 부터 시작합니다.
 *    자유롭게 거래가 가능하므로 Balance는 더 크거나 작아질 수 있습니다.
 * 4. 토큰 -> 코인 전환 절차
 *  4.1. Owner 권한으로 컨트랙트의 거래를 완전히 중단 시킴(lock())
 *  4.2. 교환을 실행하기 위한 ExchangeContract를 생성
 *  4.3. ExchangeContract의 Address를 Owner의 권한으로 Delegator로 지정
 *  4.4. Holder가 ExchangeContract의 exchangeSYM()을 실행하여 잔액을 ExchangeHolder에게 모두 전달
 *  4.5. ExchangeHolder로의 입금을 확인
 *  4.6. 요청에 대응되는 메인넷의 계정으로 해당되는 양만큼 송금
 *  4.7. ExchangeContract의 withdraw()를 사용하여 Owner가 최종적으로 회수하는 것으로 전환절차 완료
 */
 /*
  *  * Contract Overview 
 * 1. Purpose
 *  It is intended to operate for a limited time until mainnet launch.
 *  When the mainnet is launched, all transactions of the contract will be suspended from that day on forward and will initiate the token swap to the mainnet.
 * 2. Key Definitions
 *  Owner : An entity from which smart contract is created
 *  Delegator : The appointed agent is created to prevent from using the contract owner's private key for every transaction made, since it can cause a serious security issue.  
 *              In particular, it performs core functons at the time of the token swap event, such as executing a dedicated, Delegator-specific function while contract transaction is under suspension and
 *              withdraw contract's tokens. 
 *  Holder : An account in which tokens can be stored (also referrs to all users of the contract: Owner, Delegator, Spender, ICO buyers, ect.)
 * 3. Operation
 *  3.1. TokenContainer Structure
 *   3.1.1 Charge Amount
 *    Charge Amount is the charged token amount purcahsed by Holder.
 *    In case for the Owner, the total charged amount in the contract equates to the Total Supply.
 *   3.1.2 Unlock Amount
 *    Generally, all tokens are under a locked state by default and balance appears according to the amount that Owner or Delegator Unlocks.
 *    Unlock Amount only displays tokens that are unlocked from the Charge Amount.
 *    Unlock Amount cannot be greater than the Charge Amount.
 *   3.1.3 Balance
 *     Similiar to the ERC20 Balance; It starts from Charged Amount - Unlock Amount value.
 *     You can send & receive tokens at will and it will offset the Balance amount accordingly.
 * 4. Token Swap Process
 *  4.1. Completely suspend trading operations from the contract address with owner privileges (lock ()).
 *  4.2. Create an ExchangeContract contract to execute the exchange.
 *  4.3. Owner appoints the ExchangeContract address to the Delegator.
 *  4.4. The Holder executes an exchangeSYM() embedded in the ExchangeContract to transfer all the Balance to ExchangeHolder
 *  4.5. Verify ExchangeHolder's deposit amount. 
 *  4.6. Remit an appropriate amount into the mainnet account that corresponds to the request.  
 *  4.7. By using the ExchangeContract's withdraw(), the token swap process completes as the Owner makes the final withdrawal.
  */

library SafeMath {
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b);

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a);
        uint256 c = a - b;

        return c;
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a);

        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0);
        return a % b;
    }
}

interface IERC20 {
    function transfer(address to, uint256 value) external returns (bool);
    function approve(address spender, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
    function totalSupply() external view returns (uint256);
    function balanceOf(address who) external view returns (uint256);
    function allowance(address owner, address spender) external view returns (uint256);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

contract Ownable {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor () internal {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(isOwner());
        _;
    }

    function isOwner() public view returns (bool) {
        return msg.sender == _owner;
    }

    /*
     * 운용상 Owner 변경은 사용하지 않으므로 권한 변경 함수 제거하였다.
     */
    /*
     * The privilege change function is removed since the Owner change isn't used during the operation.
     */
    /* not used
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0));
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
    */
}

/*
 * Owner의 권한 중 일부를 대신 행사할 수 있도록 대행자를 지정/해제 할 수 있는 인터페이스를 정의하고 있다.
 */
 /*
 * It defines an interface where the Owner can appoint / dismiss an agent that can partially excercize privileges in lieu of the Owner's 
 */
contract Delegable is Ownable {
    address private _delegator;
    
    event DelegateAppointed(address indexed previousDelegator, address indexed newDelegator);
    
    constructor () internal {
        _delegator = address(0);
    }
    
    /*
     * delegator를 가져옴
     */
    /*
     * Call-up Delegator
     */
    function delegator() public view returns (address) {
        return _delegator;
    }
    
    /*
     * delegator만 실행 가능하도록 지정하는 접근 제한
     */
    /*
     * Access restriction in which only appointed delegator is executable
     */
    modifier onlyDelegator() {
        require(isDelegator());
        _;
    }
    
    /*
     * owner 또는 delegator가 실행 가능하도록 지정하는 접근 제한
     */
    /*
     * Access restriction in which only appointed delegator or Owner are executable
     */
    modifier ownerOrDelegator() {
        require(isOwner() || isDelegator());
        _;
    }
    
    function isDelegator() public view returns (bool) {
        return msg.sender == _delegator;
    }
    
    /*
     * delegator를 임명
     */
    /*
     * Appoint the delegator
     */
    function appointDelegator(address delegator) public onlyOwner returns (bool) {
        require(delegator != address(0));
        require(delegator != owner());
        return _appointDelegator(delegator);
    }
    
    /*
     * 지정된 delegator를 해임
     */
    /*
     * Dimiss the appointed delegator
     */
    function dissmissDelegator() public onlyOwner returns (bool) {
        require(_delegator != address(0));
        return _appointDelegator(address(0));
    }
    
    /*
     * delegator를 변경하는 내부 함수
     */
    /*
     * An internal function that allows delegator changes 
     */
    function _appointDelegator(address delegator) private returns (bool) {
        require(_delegator != delegator);
        emit DelegateAppointed(_delegator, delegator);
        _delegator = delegator;
        return true;
    }
}

/*
 * ERC20의 기본 인터페이스는 유지하여 일반적인 토큰 전송이 가능하면서,
 * 일부 추가 관리 기능을 구현하기 위한 Struct 및 함수가 추가되어 있습니다.
 * 특히, 토큰 -> 코인 교환을 위한 Delegator 임명은 Owner가 직접 수행할 컨트랙트의 주소를 임명하기 때문에
 * 외부에서 임의로 권한을 획득하기 매우 어려운 구조를 가집니다.
 * 또한, exchange() 함수의 실행은 ExchangeContract에서 Holder가 직접 exchangeSYM() 함수를
 * 실행한 것이 트리거가 되기 때문에 임의의 사용자가 다른 사람의 토큰을 탈취할 수 없습니다.
 */
 /*
 * The basic interface of ERC20 is remained untouched therefore basic functions like token transactions will be available. 
 * On top of that, Structs and functions have been added to implement some additional management functions.
 * In particular, we created an additional Delegator agent to initiate the token swap so that the swap is performed by the delegator but directly from the Owner's contract address.
 * By implementing an additional agent, it has built a difficult structure to acquire rights arbitrarily from the outside.
 * In addition, the execution of exchange() cannot be taken by any other Holders' because the exchangeSYM() is triggered directly by the Holder's execution 
 */
contract ERC20Like is IERC20, Delegable {
    using SafeMath for uint256;

    uint256 internal _totalSupply;  // 총 발행량 // Total Supply
    bool isLock = false;  // 계약 잠금 플래그 // Contract Lock Flag

    /*
     * 토큰 정보(충전량, 해금량, 가용잔액) 및 Spender 정보를 저장하는 구조체
     */
    /*
     * Structure that stores token information (charge, unlock, balance) as well as Spender information
     */
    struct TokenContainer {
        uint256 chargeAmount; // 충전량 // charge amount
        uint256 unlockAmount; // 해금량 // unlock amount
        uint256 balance;  // 가용잔액 // available balance
        mapping (address => uint256) allowed; // Spender
    }

    mapping (address => TokenContainer) internal _tokenContainers;
    
    event ChangeCirculation(uint256 circulationAmount);
    event Charge(address indexed holder, uint256 chargeAmount, uint256 unlockAmount);
    event IncreaseUnlockAmount(address indexed holder, uint256 unlockAmount);
    event DecreaseUnlockAmount(address indexed holder, uint256 unlockAmount);
    event Exchange(address indexed holder, address indexed exchangeHolder, uint256 amount);
    event Withdraw(address indexed holder, uint256 amount);

    // 총 발행량 
    // Total token supply 
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    // 가용잔액 가져오기
    // Call-up available balance
    function balanceOf(address holder) public view returns (uint256) {
        return _tokenContainers[holder].balance;
    }

    // Spender의 남은 잔액 가져오기
    // Call-up Spender's remaining balance
    function allowance(address holder, address spender) public view returns (uint256) {
        return _tokenContainers[holder].allowed[spender];
    }

    // 토큰송금
    // Transfer token
    function transfer(address to, uint256 value) public returns (bool) {
        _transfer(msg.sender, to, value);
        return true;
    }

    // Spender 지정 및 금액 지정
    // Appoint a Spender and set an amount 
    function approve(address spender, uint256 value) public returns (bool) {
        _approve(msg.sender, spender, value);
        return true;
    }

    // Spender 토큰송금
    // Transfer token via Spender 
    function transferFrom(address from, address to, uint256 value) public returns (bool) {
        _transfer(from, to, value);
        _approve(from, msg.sender, _tokenContainers[from].allowed[msg.sender].sub(value));
        return true;
    }

    // Spender가 할당 받은 양 증가
    // Increase a Spender amount alloted by the Owner/Delegator
    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        require(!isLock);
        uint256 value = _tokenContainers[msg.sender].allowed[spender].add(addedValue);
        if (msg.sender == owner()) {  // Sender가 계약 소유자인 경우 전체 발행량 조절
            require(_tokenContainers[msg.sender].chargeAmount >= _tokenContainers[msg.sender].unlockAmount.add(addedValue));
            _tokenContainers[msg.sender].unlockAmount = _tokenContainers[msg.sender].unlockAmount.add(addedValue);
            _tokenContainers[msg.sender].balance = _tokenContainers[msg.sender].balance.add(addedValue);
        }
        _approve(msg.sender, spender, value);
        return true;
    }

    // Spender가 할당 받은 양 감소
    // Decrease a Spender amount alloted by the Owner/Delegator
    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        require(!isLock);
        // 기존에 할당된 금액의 잔액보다 더 많은 금액을 줄이려고 하는 경우 할당액이 0이 되도록 처리
        //// If you reduce more than the alloted amount in the balance, we made sure the alloted amount is set to zero instead of minus
        if (_tokenContainers[msg.sender].allowed[spender] < subtractedValue) {
            subtractedValue = _tokenContainers[msg.sender].allowed[spender];
        }
        
        uint256 value = _tokenContainers[msg.sender].allowed[spender].sub(subtractedValue);
        if (msg.sender == owner()) {  // Sender가 계약 소유자인 경우 전체 발행량 조절 // // Adjust the total circulation amount if the Sender equals the contract owner
            _tokenContainers[msg.sender].unlockAmount = _tokenContainers[msg.sender].unlockAmount.sub(subtractedValue);
            _tokenContainers[msg.sender].balance = _tokenContainers[msg.sender].balance.sub(subtractedValue);
        }
        _approve(msg.sender, spender, value);
        return true;
    }

    // 토큰송금 내부 실행 함수 
    // An internal execution function for troken transfer
    function _transfer(address from, address to, uint256 value) private {
        require(!isLock);
        // 3.1. Known vulnerabilities of ERC-20 token
        // 현재 컨트랙트로는 송금할 수 없도록 예외 처리 // Exceptions were added to not allow deposits to be made in the current contract . 
        require(to != address(this));
        require(to != address(0));

        _tokenContainers[from].balance = _tokenContainers[from].balance.sub(value);
        _tokenContainers[to].balance = _tokenContainers[to].balance.add(value);
        emit Transfer(from, to, value);
    }

    // Spender 지정 내부 실행 함수
    // Internal execution function for assigning a Spender
    function _approve(address holder, address spender, uint256 value) private {
        require(!isLock);
        require(spender != address(0));
        require(holder != address(0));

        _tokenContainers[holder].allowed[spender] = value;
        emit Approval(holder, spender, value);
    }

    /* extension */
    /**
     * 충전량 
     */
    /**
     * Charge Amount 
     */
    function chargeAmountOf(address holder) external view returns (uint256) {
        return _tokenContainers[holder].chargeAmount;
    }

    /**
     * 해금량
     */
    /**
     * Unlock Amount
     */
    function unlockAmountOf(address holder) external view returns (uint256) {
        return _tokenContainers[holder].unlockAmount;
    }

    /**
     * 가용잔액
     */
    /**
     * Available amount in the balance
     */
    function availableBalanceOf(address holder) external view returns (uint256) {
        return _tokenContainers[holder].balance;
    }

    /**
     * Holder의 계정 잔액 요약 출력(JSON 포맷)
     */
    /**
     * An output of Holder's account balance summary (JSON format)
     */
    function receiptAccountOf(address holder) external view returns (string memory) {
        bytes memory blockStart = bytes("{");
        bytes memory chargeLabel = bytes("\"chargeAmount\" : \"");
        bytes memory charge = bytes(uint2str(_tokenContainers[holder].chargeAmount));
        bytes memory unlockLabel = bytes("\", \"unlockAmount\" : \"");
        bytes memory unlock = bytes(uint2str(_tokenContainers[holder].unlockAmount));
        bytes memory balanceLabel = bytes("\", \"availableBalance\" : \"");
        bytes memory balance = bytes(uint2str(_tokenContainers[holder].balance));
        bytes memory blockEnd = bytes("\"}");

        string memory receipt = new string(blockStart.length + chargeLabel.length + charge.length + unlockLabel.length + unlock.length + balanceLabel.length + balance.length + blockEnd.length);
        bytes memory receiptBytes = bytes(receipt);

        uint readIndex = 0;
        uint writeIndex = 0;

        for (readIndex = 0; readIndex < blockStart.length; readIndex++) {
            receiptBytes[writeIndex++] = blockStart[readIndex];
        }
        for (readIndex = 0; readIndex < chargeLabel.length; readIndex++) {
            receiptBytes[writeIndex++] = chargeLabel[readIndex];
        }
        for (readIndex = 0; readIndex < charge.length; readIndex++) {
            receiptBytes[writeIndex++] = charge[readIndex];
        }
        for (readIndex = 0; readIndex < unlockLabel.length; readIndex++) {
            receiptBytes[writeIndex++] = unlockLabel[readIndex];
        }
        for (readIndex = 0; readIndex < unlock.length; readIndex++) {
            receiptBytes[writeIndex++] = unlock[readIndex];
        }
        for (readIndex = 0; readIndex < balanceLabel.length; readIndex++) {
            receiptBytes[writeIndex++] = balanceLabel[readIndex];
        }
        for (readIndex = 0; readIndex < balance.length; readIndex++) {
            receiptBytes[writeIndex++] = balance[readIndex];
        }
        for (readIndex = 0; readIndex < blockEnd.length; readIndex++) {
            receiptBytes[writeIndex++] = blockEnd[readIndex];
        }

        return string(receiptBytes);
    }

    // uint 값을 string 으로 변환하는 내부 함수
    // An internal function that converts an uint value to a string
    function uint2str(uint _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len - 1;
        while (_i != 0) {
            bstr[k--] = byte(uint8(48 + _i % 10));
            _i /= 10;
        }
        return string(bstr);
    }

    // 전체 유통량 - Owner의 unlockAmount
    // Total circulation supply, or the unlockAmount of the Owner's
    function circulationAmount() external view returns (uint256) {
        return _tokenContainers[owner()].unlockAmount;
    }

    // 전체 유통량 증가
    // Increase the token's total circulation supply 
    /*
     * 컨트랙트 상에 유통되는 토큰량을 증가 시킵니다.
     * Owner가 보유한 전체 토큰량에서 Unlock 된 양 만큼이 현재 유통량이므로,
     * Unlock Amount와 Balance 가 증가하며, Charge Amount는 변동되지 않습니다.
     */
    /*
     * This function increases the amount of circulated tokens that are distributed on the contract.
     * The circulated token is referring to the Unlock tokens out of the contract Owner's total supply, so the Charge Amount is not affected (refer back to the Balance definition above).
     * This function increases in the Unlock Amount as well as in the Balance.
     */
    function increaseCirculation(uint256 amount) external onlyOwner returns (uint256) {
        require(!isLock);
        require(_tokenContainers[msg.sender].chargeAmount >= _tokenContainers[msg.sender].unlockAmount.add(amount));
        _tokenContainers[msg.sender].unlockAmount = _tokenContainers[msg.sender].unlockAmount.add(amount);
        _tokenContainers[msg.sender].balance = _tokenContainers[msg.sender].balance.add(amount);
        emit ChangeCirculation(_tokenContainers[msg.sender].unlockAmount);
        return _tokenContainers[msg.sender].unlockAmount;
    }

    // 전체 유통량 감소
    // Reduction of the token's total supply
    /*
     * 컨트랙트 상에 유통되는 토큰량을 감소 시킵니다.
     * Owner가 보유한 전체 토큰량에서 Unlock 된 양 만큼이 현재 유통량이므로,
     * Unlock Amount와 Balance 가 감소하며, Charge Amount는 변동되지 않습니다.
     * Owner만 실행할 수 있으며, 정책적인 계획에 맞추어 실행되어야하므로 0보다 작아지는 값이 입력되는 경우 실행을 중단합니다.
     */
    /*
     * This function decreases the amount of circulated tokens that are distributed on the contract.
     * The circulated token is referring to the Unlock tokens out of the contract Owner's total supply, so the Charge Amount is not affected (refer back to the Balance definition above).
     * This function decreases in the Unlock Amount as well as in the Balance.
     */
    function decreaseCirculation(uint256 amount) external onlyOwner returns (uint256) {
        require(!isLock);
        _tokenContainers[msg.sender].unlockAmount = _tokenContainers[msg.sender].unlockAmount.sub(amount);
        _tokenContainers[msg.sender].balance = _tokenContainers[msg.sender].balance.sub(amount);
        emit ChangeCirculation(_tokenContainers[msg.sender].unlockAmount);
        return _tokenContainers[msg.sender].unlockAmount;
    }

    /*
     * 특정 사용자(ICO, PreSale 구매자)가 구매한 금액 만큼의 충전량을 직접 입력할 때 사용합니다.
     * 컨트랙트 내 토큰의 유통량에 맞추어 동작하므로, Owner의 Balance가 부족하면 실행을 중단힙니다.
     * 충전한 토큰은 lock인 상태로 시작되며, charge() 함수는 충전과 동시에 Unlock하는 양을 지정하여
     * increaseUnlockAmount() 함수의 실행 횟수를 줄일 수 있다.
     */
    /*
     * This function is used to directly input the token amount that is purchased by particular Holders (ICO, Pre-sale buyers). It can be performed by the Owner or the Delegator.
     * Since the contract operates in concurrent to the tokens in circulation, the function will fail to execute when Owner's balance is insuffient. 
     * All charged tokens are locked amount. 
     */
    function charge(address holder, uint256 chargeAmount, uint256 unlockAmount) external ownerOrDelegator {
        require(!isLock);
        require(holder != address(0));
        require(holder != owner());
        require(chargeAmount > 0);
        require(chargeAmount >= unlockAmount);
        require(_tokenContainers[owner()].balance >= chargeAmount);

        _tokenContainers[owner()].balance = _tokenContainers[owner()].balance.sub(chargeAmount);

        _tokenContainers[holder].chargeAmount = _tokenContainers[holder].chargeAmount.add(chargeAmount);
        _tokenContainers[holder].unlockAmount = _tokenContainers[holder].unlockAmount.add(unlockAmount);
        _tokenContainers[holder].balance = _tokenContainers[holder].balance.add(unlockAmount);
        
        emit Charge(holder, chargeAmount, unlockAmount);
    }
    
    /*
     * 특정 사용자(ICO, PreSale 구매자)가 구매한 금액 안에서 해금량을 변경할 때 사용합니다.
     * 총 충전량 안에서 변화가 일어나므로 Unlock Amount가 Charge Amount보다 커질 수 없습니다.
     */
    /*
     * This function is used to change the Unlock Amount of tokens that is purchased by particular Holders (ICO, Pre-sale buyers).
     * Unlock Amount cannot be larger than Charge Amount because changes occur within the total charge amount.
     */
    function increaseUnlockAmount(address holder, uint256 unlockAmount) external ownerOrDelegator {
        require(!isLock);
        require(holder != address(0));
        require(holder != owner());
        require(_tokenContainers[holder].chargeAmount >= _tokenContainers[holder].unlockAmount.add(unlockAmount));

        _tokenContainers[holder].unlockAmount = _tokenContainers[holder].unlockAmount.add(unlockAmount);
        _tokenContainers[holder].balance = _tokenContainers[holder].balance.add(unlockAmount);
        
        emit IncreaseUnlockAmount(holder, unlockAmount);
    }
    
    /*
     * 특정 사용자(ICO, PreSale 구매자)가 구매한 금액 안에서 해금량을 변경할 때 사용합니다.
     * Balance를 Lock 상태로 전환하는 것이므로 Lock Amount의 값은 Balance보다 커질 수 없습니다.
     */
    /*
     * This function is used to change the Unlock Amount of tokens that is purchased by particular Holders (ICO, Pre-sale buyers).
     * Since the Balance starts from a locked state, the number of locked tokens cannot be greater than the Balance.
     */
    function decreaseUnlockAmount(address holder, uint256 lockAmount) external ownerOrDelegator {
        require(!isLock);
        require(holder != address(0));
        require(holder != owner());
        require(_tokenContainers[holder].balance >= lockAmount);

        _tokenContainers[holder].unlockAmount = _tokenContainers[holder].unlockAmount.sub(lockAmount);
        _tokenContainers[holder].balance = _tokenContainers[holder].balance.sub(lockAmount);
        
        emit DecreaseUnlockAmount(holder, lockAmount);
    }

    /*
     * 특정 사용자(ICO, PreSale 구매자)가 구매한 금액 안에서 전체를 해금할 때 사용합니다.
     * Charge Amount 중 Unlock Amount 량을 제외한 나머지 만큼을 일괄적으로 해제합니다.
     */
    /*
     * This function is used to change the Unlock Amount of tokens that is purchased by particular Holders (ICO, Pre-sale buyers).
     * It unlocks all locked tokens in the Charge Amount, other than tokens already unlocked. 
     */
    function unlockAmountAll(address holder) external ownerOrDelegator {
        require(!isLock);
        require(holder != address(0));
        require(holder != owner());

        uint256 unlockAmount = _tokenContainers[holder].chargeAmount.sub(_tokenContainers[holder].unlockAmount);

        require(unlockAmount > 0);
        
        _tokenContainers[holder].unlockAmount = _tokenContainers[holder].unlockAmount.add(unlockAmount);
        _tokenContainers[holder].balance = _tokenContainers[holder].balance.add(unlockAmount);
    }

    /*
     * 계약 잠금
     * 계약이 잠기면 컨트랙트의 거래가 중단된 상태가 되며,
     * 거래가 중단된 상태에서는 Owner와 Delegator를 포함한 모든 Holder는 거래를 할 수 없게 된다.
     * 모든 거래가 중단된 상태에서 모든 Holder의 상태가 변경되지 않게 만든 후에
     * 토큰 -> 코인 전환 절차를 진행하기 위함이다.
     * 단, 이 상태에서는 Exchange Contract를 Owner가 직접 Delegator로 임명하여
     * Holder의 요청을 처리하도록 하며, 이때는 토큰 -> 코인 교환회수를 위한 exchange(), withdraw() 함수 실행만 허용이 된다.
     */
    /*
     * Contract lock
     * If the contract is locked, all transactions will be suspended.
     * All Holders including Owner and Delegator will not be able to make transaction during suspension.
     * After all transactions have been stopped and all Holders have not changed their status
     * This function is created primarily for the token swap event. 
     * In this process, it's important to note that the Owner of the Exchange contract should directly appoint a delegator when handling Holders' requests.
     * Only the exchange () and withdraw () are allowed to be executed for token swap.
     */
    function lock() external onlyOwner returns (bool) {
        isLock = true;
        return isLock;
    }

    /*
     * 계약 잠금 해제
     * 잠긴 계약을 해제할 때 사용된다.
     */
    /*
     * Release contract lock
     * The function is used to revert a locked contract to a normal state. 
     */
    function unlock() external onlyOwner returns (bool) {
        isLock = false;
        return isLock;
    }
    
    /*
     * 토큰 교환 처리용 외부 호출 함수
     * 계약 전체가 잠긴 상태일 때(교환 처리 중 계약 중단),
     * 외부에서만 호출 가능하며, Delegator이면서 Contract인 경우에만 호출 가능하다.
     */
    /*
     * It is an external call function for token exchange processing
     * This function is used when the entire contract is locked (contract lock during the token swap),
     * It can be called only externally. Also, it can be only called when the agent is both Delegator and Contract.
     */
    function exchange(address holder) external onlyDelegator returns (bool) {
        require(isLock);    // lock state only
        require((delegator() == msg.sender) && isContract(msg.sender));    // contract delegator only
        
        uint256 balance = _tokenContainers[holder].balance;
        _tokenContainers[holder].balance = 0;
        _tokenContainers[msg.sender].balance = _tokenContainers[msg.sender].balance.add(balance);
        
        emit Exchange(holder, msg.sender, balance);
        return true;
    }
    
    /*
     * 토큰 교환 처리 후 회수된 토큰을 Owner한테 돌려주는 함수
     * 계약 전체가 잠긴 상태일 때(교환 처리 중 계약 중단),
     * 외부에서만 호출 가능하며, Delegator이면서 Contract인 경우에만 호출 가능하다.
     */
    /*
     * This is a function in which the Delegator returns tokens to the Owner after the token swap process
     * This function is used when the entire contract is locked (contract lock during the token swap),
     * It can be called only externally. Also, it can be only called when the agent is both Delegator and Contract Owner.
     */
    function withdraw() external onlyDelegator returns (bool) {
        require(isLock);    // lock state only
        require((delegator() == msg.sender) && isContract(msg.sender));    // contract delegator only
        
        uint256 balance = _tokenContainers[msg.sender].balance;
        _tokenContainers[msg.sender].balance = 0;
        _tokenContainers[owner()].balance = _tokenContainers[owner()].balance.add(balance);
        
        emit Withdraw(msg.sender, balance);
    }
    
    /*
     * 현재의 주소가 엔진내에 차지하고 있는 코드의 크기를 계산하여 컨트랙트인지 확인하는 도구
     * 컨트랙트인 경우에만 저장된 코드의 크기가 존재하므로 코드의 크기가 존재한다면
     * 컨트랙트로 판단할 수있다.
     */
    /*
     * This is a tool used for confirming a contract. It determines the size of code that the current address occupies within the blockchain network.
     * Since the size of a stored code exists only in the case of a contract, it is can be used as a validation tool.
     */
    function isContract(address addr) private returns (bool) {
      uint size;
      assembly { size := extcodesize(addr) }
      return size > 0;
    }
}

contract SymToken is ERC20Like {
    string public name = "SymVerse";
    string public symbol = "SYM";
    uint256 public decimals = 18;

    constructor () public {
        _totalSupply = 1000000000 * (10 ** decimals);
        _tokenContainers[msg.sender].chargeAmount = _totalSupply;
        emit Charge(msg.sender, _tokenContainers[msg.sender].chargeAmount, _tokenContainers[msg.sender].unlockAmount);
    }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"increaseCirculation","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"holder","type":"address"}],"name":"receiptAccountOf","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isDelegator","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"holder","type":"address"}],"name":"exchange","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"holder","type":"address"}],"name":"availableBalanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"holder","type":"address"},{"name":"chargeAmount","type":"uint256"},{"name":"unlockAmount","type":"uint256"}],"name":"charge","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"holder","type":"address"}],"name":"chargeAmountOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"holder","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"circulationAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"dissmissDelegator","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unlock","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"holder","type":"address"},{"name":"unlockAmount","type":"uint256"}],"name":"increaseUnlockAmount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"holder","type":"address"}],"name":"unlockAmountOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"delegator","type":"address"}],"name":"appointDelegator","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"decreaseCirculation","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"delegator","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"holder","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"holder","type":"address"},{"name":"lockAmount","type":"uint256"}],"name":"decreaseUnlockAmount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"holder","type":"address"}],"name":"unlockAmountAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"lock","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"circulationAmount","type":"uint256"}],"name":"ChangeCirculation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"holder","type":"address"},{"indexed":false,"name":"chargeAmount","type":"uint256"},{"indexed":false,"name":"unlockAmount","type":"uint256"}],"name":"Charge","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"holder","type":"address"},{"indexed":false,"name":"unlockAmount","type":"uint256"}],"name":"IncreaseUnlockAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"holder","type":"address"},{"indexed":false,"name":"unlockAmount","type":"uint256"}],"name":"DecreaseUnlockAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"holder","type":"address"},{"indexed":true,"name":"exchangeHolder","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Exchange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"holder","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousDelegator","type":"address"},{"indexed":true,"name":"newDelegator","type":"address"}],"name":"DelegateAppointed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}]

60806040526000600360006101000a81548160ff0219169083151502179055506040518060400160405280600881526020017f53796d5665727365000000000000000000000000000000000000000000000000815250600590805190602001906200006c92919062000307565b506040518060400160405280600381526020017f53594d000000000000000000000000000000000000000000000000000000000081525060069080519060200190620000ba92919062000307565b506012600755348015620000cd57600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600754600a0a633b9aca0002600281905550600254600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055503373ffffffffffffffffffffffffffffffffffffffff167f720e2015c6c49aa255ac152528ef75a8d12b40300a289e74c701a97c42865485600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154604051808381526020018281526020019250505060405180910390a2620003b6565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200034a57805160ff19168380011785556200037b565b828001600101855582156200037b579182015b828111156200037a5782518255916020019190600101906200035d565b5b5090506200038a91906200038e565b5090565b620003b391905b80821115620003af57600081600090555060010162000395565b5090565b90565b613a6c80620003c66000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80638da5cb5b1161010f578063b473b70d116100a2578063dd62ed3e11610071578063dd62ed3e14610ab0578063ea4ca47c14610b28578063f65decc614610b76578063f83d08ba14610bba576101f0565b8063b473b70d14610970578063ba9ae895146109c8578063c0e22f9714610a24578063ce9b793014610a66576101f0565b8063a457c2d7116100de578063a457c2d714610834578063a69df4b51461089a578063a9059cbb146108bc578063b1c1feb714610922576101f0565b80638da5cb5b146107235780638f32d59b1461076d57806395d89b411461078f5780639a94325014610812576101f0565b806325d998bb1161018757806354a9409e1161015657806354a9409e146105fd5780636803f6121461065557806370a08231146106ad5780637f6ab84114610705576101f0565b806325d998bb146104ff578063313ce5671461055757806339509351146105755780633ccfd60b146105db576101f0565b806318160ddd116101c357806318160ddd146103dd578063185ed831146103fb57806323b872dd1461041d5780632412bdb8146104a3576101f0565b806305259891146101f557806306fdde0314610237578063095ea7b3146102ba578063120cb15c14610320575b600080fd5b6102216004803603602081101561020b57600080fd5b8101908080359060200190929190505050610bdc565b6040518082815260200191505060405180910390f35b61023f610ea5565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561027f578082015181840152602081019050610264565b50505050905090810190601f1680156102ac5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610306600480360360408110156102d057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610f43565b604051808215151515815260200191505060405180910390f35b6103626004803603602081101561033657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f5a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103a2578082015181840152602081019050610387565b50505050905090810190601f1680156103cf5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103e5611573565b6040518082815260200191505060405180910390f35b61040361157d565b604051808215151515815260200191505060405180910390f35b6104896004803603606081101561043357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115d5565b604051808215151515815260200191505060405180910390f35b6104e5600480360360208110156104b957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611689565b604051808215151515815260200191505060405180910390f35b6105416004803603602081101561051557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061189e565b6040518082815260200191505060405180910390f35b61055f6118ea565b6040518082815260200191505060405180910390f35b6105c16004803603604081101561058b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506118f0565b604051808215151515815260200191505060405180910390f35b6105e3611bcd565b604051808215151515815260200191505060405180910390f35b6106536004803603606081101561061357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050611dd3565b005b6106976004803603602081101561066b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121cc565b6040518082815260200191505060405180910390f35b6106ef600480360360208110156106c357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612218565b6040518082815260200191505060405180910390f35b61070d612264565b6040518082815260200191505060405180910390f35b61072b6122b5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107756122de565b604051808215151515815260200191505060405180910390f35b610797612335565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156107d75780820151818401526020810190506107bc565b50505050905090810190601f1680156108045780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61081a6123d3565b604051808215151515815260200191505060405180910390f35b6108806004803603604081101561084a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612451565b604051808215151515815260200191505060405180910390f35b6108a2612795565b604051808215151515815260200191505060405180910390f35b610908600480360360408110156108d257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506127d8565b604051808215151515815260200191505060405180910390f35b61096e6004803603604081101561093857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506127ef565b005b6109b26004803603602081101561098657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612ace565b6040518082815260200191505060405180910390f35b610a0a600480360360208110156109de57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b1a565b604051808215151515815260200191505060405180910390f35b610a5060048036036020811015610a3a57600080fd5b8101908080359060200190929190505050612bb7565b6040518082815260200191505060405180910390f35b610a6e612ddd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610b1260048036036040811015610ac657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612e07565b6040518082815260200191505060405180910390f35b610b7460048036036040811015610b3e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612e91565b005b610bb860048036036020811015610b8c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061311c565b005b610bc26133b2565b604051808215151515815260200191505060405180910390f35b6000610be66122de565b610bef57600080fd5b600360009054906101000a900460ff1615610c0957600080fd5b610c5e82600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546133f590919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541015610cac57600080fd5b610d0182600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546133f590919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550610d9c82600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546133f590919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055507fff8ec5d2b7f799353c995f253a6beef49d9d48b7526099e872af2cfe7a888b1d600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546040518082815260200191505060405180910390a1600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050919050565b60058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f3b5780601f10610f1057610100808354040283529160200191610f3b565b820191906000526020600020905b815481529060010190602001808311610f1e57829003601f168201915b505050505081565b6000610f50338484613414565b6001905092915050565b6060806040518060400160405280600181526020017f7b00000000000000000000000000000000000000000000000000000000000000815250905060606040518060400160405280601281526020017f22636861726765416d6f756e7422203a202200000000000000000000000000008152509050606061101c600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154613590565b905060606040518060400160405280601581526020017f222c2022756e6c6f636b416d6f756e7422203a20220000000000000000000000815250905060606110a5600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154613590565b905060606040518060400160405280601981526020017f222c2022617661696c61626c6542616c616e636522203a2022000000000000008152509050606061112e600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154613590565b905060606040518060400160405280600281526020017f227d00000000000000000000000000000000000000000000000000000000000081525090506060815183518551875189518b518d518f51010101010101016040519080825280601f01601f1916602001820160405280156111b55781602001600182028038833980820191505090505b509050606081905060008090506000809050600091505b8b5182101561123a578b82815181106111e157fe5b602001015160f81c60f81b8382806001019350815181106111fe57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081806001019250506111cc565b600091505b8a518210156112ad578a828151811061125457fe5b602001015160f81c60f81b83828060010193508151811061127157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350818060010192505061123f565b600091505b8951821015611320578982815181106112c757fe5b602001015160f81c60f81b8382806001019350815181106112e457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081806001019250506112b2565b600091505b88518210156113935788828151811061133a57fe5b602001015160f81c60f81b83828060010193508151811061135757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508180600101925050611325565b600091505b8751821015611406578782815181106113ad57fe5b602001015160f81c60f81b8382806001019350815181106113ca57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508180600101925050611398565b600091505b86518210156114795786828151811061142057fe5b602001015160f81c60f81b83828060010193508151811061143d57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350818060010192505061140b565b600091505b85518210156114ec5785828151811061149357fe5b602001015160f81c60f81b8382806001019350815181106114b057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350818060010192505061147e565b600091505b845182101561155f5784828151811061150657fe5b602001015160f81c60f81b83828060010193508151811061152357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081806001019250506114f1565b829c50505050505050505050505050919050565b6000600254905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b60006115e28484846136bd565b61167e843361167985600460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138ea90919063ffffffff16565b613414565b600190509392505050565b600061169361157d565b61169c57600080fd5b600360009054906101000a900460ff166116b557600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166116d4612ddd565b73ffffffffffffffffffffffffffffffffffffffff161480156116fc57506116fb3361390a565b5b61170557600080fd5b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015490506000600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055506117e981600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546133f590919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f477b65cf658c5207a9d60bb5ebe4f60a504af024949bdffa6efc396d01ced3f6836040518082815260200191505060405180910390a36001915050919050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201549050919050565b60075481565b6000600360009054906101000a900460ff161561190c57600080fd5b60006119a083600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133f590919063ffffffff16565b90506119aa6122b5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611bb757611a3283600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546133f590919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541015611a8057600080fd5b611ad583600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546133f590919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550611b7083600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546133f590919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055505b611bc2338583613414565b600191505092915050565b6000611bd761157d565b611be057600080fd5b600360009054906101000a900460ff16611bf957600080fd5b3373ffffffffffffffffffffffffffffffffffffffff16611c18612ddd565b73ffffffffffffffffffffffffffffffffffffffff16148015611c405750611c3f3361390a565b5b611c4957600080fd5b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015490506000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550611d348160046000611ce86122b5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546133f590919063ffffffff16565b60046000611d406122b5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055503373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364826040518082815260200191505060405180910390a25090565b611ddb6122de565b80611dea5750611de961157d565b5b611df357600080fd5b600360009054906101000a900460ff1615611e0d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e4757600080fd5b611e4f6122b5565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e8757600080fd5b60008211611e9457600080fd5b80821015611ea157600080fd5b8160046000611eae6122b5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201541015611ef757600080fd5b611f538260046000611f076122b5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546138ea90919063ffffffff16565b60046000611f5f6122b5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550611ff582600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546133f590919063ffffffff16565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555061209081600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546133f590919063ffffffff16565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555061212b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546133f590919063ffffffff16565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055508273ffffffffffffffffffffffffffffffffffffffff167f720e2015c6c49aa255ac152528ef75a8d12b40300a289e74c701a97c428654858383604051808381526020018281526020019250505060405180910390a2505050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201549050919050565b6000600460006122726122b5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b60068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123cb5780601f106123a0576101008083540402835291602001916123cb565b820191906000526020600020905b8154815290600101906020018083116123ae57829003601f168201915b505050505081565b60006123dd6122de565b6123e657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561244257600080fd5b61244c600061391d565b905090565b6000600360009054906101000a900460ff161561246d57600080fd5b81600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561257757600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205491505b600061260b83600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138ea90919063ffffffff16565b90506126156122b5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561277f5761269d83600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546138ea90919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555061273883600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546138ea90919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055505b61278a338583613414565b600191505092915050565b600061279f6122de565b6127a857600080fd5b6000600360006101000a81548160ff021916908315150217905550600360009054906101000a900460ff16905090565b60006127e53384846136bd565b6001905092915050565b6127f76122de565b80612806575061280561157d565b5b61280f57600080fd5b600360009054906101000a900460ff161561282957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561286357600080fd5b61286b6122b5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128a357600080fd5b6128f881600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546133f590919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154101561294657600080fd5b61299b81600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546133f590919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550612a3681600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546133f590919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055508173ffffffffffffffffffffffffffffffffffffffff167f84a2be98ade81115c3a7fc4e3f8f8b7d2ce22bb482f7270108a03034579aedad826040518082815260200191505060405180910390a25050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050919050565b6000612b246122de565b612b2d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b6757600080fd5b612b6f6122b5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ba757600080fd5b612bb08261391d565b9050919050565b6000612bc16122de565b612bca57600080fd5b600360009054906101000a900460ff1615612be457600080fd5b612c3982600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546138ea90919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550612cd482600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546138ea90919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055507fff8ec5d2b7f799353c995f253a6beef49d9d48b7526099e872af2cfe7a888b1d600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546040518082815260200191505060405180910390a1600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050919050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612e996122de565b80612ea85750612ea761157d565b5b612eb157600080fd5b600360009054906101000a900460ff1615612ecb57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f0557600080fd5b612f0d6122b5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f4557600080fd5b80600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201541015612f9457600080fd5b612fe981600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546138ea90919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555061308481600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546138ea90919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055508173ffffffffffffffffffffffffffffffffffffffff167fd85f893defab26c8b95a9d1a6aec387c0f5f6fb6581d53df79b83ef7b2061873826040518082815260200191505060405180910390a25050565b6131246122de565b80613133575061313261157d565b5b61313c57600080fd5b600360009054906101000a900460ff161561315657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561319057600080fd5b6131986122b5565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156131d057600080fd5b6000613269600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546138ea90919063ffffffff16565b90506000811161327857600080fd5b6132cd81600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546133f590919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555061336881600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546133f590919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055505050565b60006133bc6122de565b6133c557600080fd5b6001600360006101000a81548160ff021916908315150217905550600360009054906101000a900460ff16905090565b60008082840190508381101561340a57600080fd5b8091505092915050565b600360009054906101000a900460ff161561342e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561346857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156134a257600080fd5b80600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b606060008214156135d8576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506136b8565b600082905060005b60008214613602578080600101915050600a82816135fa57fe5b0491506135e0565b6060816040519080825280601f01601f1916602001820160405280156136375781602001600182028038833980820191505090505b50905060006001830390505b600086146136b057600a868161365557fe5b0660300160f81b8282806001900393508151811061366f57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a86816136a857fe5b049550613643565b819450505050505b919050565b600360009054906101000a900460ff16156136d757600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561371057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561374a57600080fd5b61379f81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546138ea90919063ffffffff16565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002018190555061383a81600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546133f590919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000828211156138f957600080fd5b600082840390508091505092915050565b600080823b905060008111915050919050565b60008173ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561397a57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f7ae02edfa8fcf8e6ab0735af4a8724ca06b091b99194712358a6da6146107a8f60405160405180910390a381600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001905091905056fea165627a7a723058202f9b1b5659027d24ec3c0ec6ce4d7c392bd13be6fa516d86b711da6337b4e7130029

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101f05760003560e01c80638da5cb5b1161010f578063b473b70d116100a2578063dd62ed3e11610071578063dd62ed3e14610ab0578063ea4ca47c14610b28578063f65decc614610b76578063f83d08ba14610bba576101f0565b8063b473b70d14610970578063ba9ae895146109c8578063c0e22f9714610a24578063ce9b793014610a66576101f0565b8063a457c2d7116100de578063a457c2d714610834578063a69df4b51461089a578063a9059cbb146108bc578063b1c1feb714610922576101f0565b80638da5cb5b146107235780638f32d59b1461076d57806395d89b411461078f5780639a94325014610812576101f0565b806325d998bb1161018757806354a9409e1161015657806354a9409e146105fd5780636803f6121461065557806370a08231146106ad5780637f6ab84114610705576101f0565b806325d998bb146104ff578063313ce5671461055757806339509351146105755780633ccfd60b146105db576101f0565b806318160ddd116101c357806318160ddd146103dd578063185ed831146103fb57806323b872dd1461041d5780632412bdb8146104a3576101f0565b806305259891146101f557806306fdde0314610237578063095ea7b3146102ba578063120cb15c14610320575b600080fd5b6102216004803603602081101561020b57600080fd5b8101908080359060200190929190505050610bdc565b6040518082815260200191505060405180910390f35b61023f610ea5565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561027f578082015181840152602081019050610264565b50505050905090810190601f1680156102ac5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610306600480360360408110156102d057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610f43565b604051808215151515815260200191505060405180910390f35b6103626004803603602081101561033657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f5a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103a2578082015181840152602081019050610387565b50505050905090810190601f1680156103cf5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103e5611573565b6040518082815260200191505060405180910390f35b61040361157d565b604051808215151515815260200191505060405180910390f35b6104896004803603606081101561043357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115d5565b604051808215151515815260200191505060405180910390f35b6104e5600480360360208110156104b957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611689565b604051808215151515815260200191505060405180910390f35b6105416004803603602081101561051557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061189e565b6040518082815260200191505060405180910390f35b61055f6118ea565b6040518082815260200191505060405180910390f35b6105c16004803603604081101561058b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506118f0565b604051808215151515815260200191505060405180910390f35b6105e3611bcd565b604051808215151515815260200191505060405180910390f35b6106536004803603606081101561061357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050611dd3565b005b6106976004803603602081101561066b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121cc565b6040518082815260200191505060405180910390f35b6106ef600480360360208110156106c357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612218565b6040518082815260200191505060405180910390f35b61070d612264565b6040518082815260200191505060405180910390f35b61072b6122b5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107756122de565b604051808215151515815260200191505060405180910390f35b610797612335565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156107d75780820151818401526020810190506107bc565b50505050905090810190601f1680156108045780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61081a6123d3565b604051808215151515815260200191505060405180910390f35b6108806004803603604081101561084a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612451565b604051808215151515815260200191505060405180910390f35b6108a2612795565b604051808215151515815260200191505060405180910390f35b610908600480360360408110156108d257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506127d8565b604051808215151515815260200191505060405180910390f35b61096e6004803603604081101561093857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506127ef565b005b6109b26004803603602081101561098657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612ace565b6040518082815260200191505060405180910390f35b610a0a600480360360208110156109de57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b1a565b604051808215151515815260200191505060405180910390f35b610a5060048036036020811015610a3a57600080fd5b8101908080359060200190929190505050612bb7565b6040518082815260200191505060405180910390f35b610a6e612ddd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610b1260048036036040811015610ac657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612e07565b6040518082815260200191505060405180910390f35b610b7460048036036040811015610b3e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612e91565b005b610bb860048036036020811015610b8c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061311c565b005b610bc26133b2565b604051808215151515815260200191505060405180910390f35b6000610be66122de565b610bef57600080fd5b600360009054906101000a900460ff1615610c0957600080fd5b610c5e82600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546133f590919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541015610cac57600080fd5b610d0182600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546133f590919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550610d9c82600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546133f590919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055507fff8ec5d2b7f799353c995f253a6beef49d9d48b7526099e872af2cfe7a888b1d600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546040518082815260200191505060405180910390a1600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050919050565b60058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f3b5780601f10610f1057610100808354040283529160200191610f3b565b820191906000526020600020905b815481529060010190602001808311610f1e57829003601f168201915b505050505081565b6000610f50338484613414565b6001905092915050565b6060806040518060400160405280600181526020017f7b00000000000000000000000000000000000000000000000000000000000000815250905060606040518060400160405280601281526020017f22636861726765416d6f756e7422203a202200000000000000000000000000008152509050606061101c600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154613590565b905060606040518060400160405280601581526020017f222c2022756e6c6f636b416d6f756e7422203a20220000000000000000000000815250905060606110a5600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154613590565b905060606040518060400160405280601981526020017f222c2022617661696c61626c6542616c616e636522203a2022000000000000008152509050606061112e600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154613590565b905060606040518060400160405280600281526020017f227d00000000000000000000000000000000000000000000000000000000000081525090506060815183518551875189518b518d518f51010101010101016040519080825280601f01601f1916602001820160405280156111b55781602001600182028038833980820191505090505b509050606081905060008090506000809050600091505b8b5182101561123a578b82815181106111e157fe5b602001015160f81c60f81b8382806001019350815181106111fe57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081806001019250506111cc565b600091505b8a518210156112ad578a828151811061125457fe5b602001015160f81c60f81b83828060010193508151811061127157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350818060010192505061123f565b600091505b8951821015611320578982815181106112c757fe5b602001015160f81c60f81b8382806001019350815181106112e457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081806001019250506112b2565b600091505b88518210156113935788828151811061133a57fe5b602001015160f81c60f81b83828060010193508151811061135757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508180600101925050611325565b600091505b8751821015611406578782815181106113ad57fe5b602001015160f81c60f81b8382806001019350815181106113ca57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508180600101925050611398565b600091505b86518210156114795786828151811061142057fe5b602001015160f81c60f81b83828060010193508151811061143d57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350818060010192505061140b565b600091505b85518210156114ec5785828151811061149357fe5b602001015160f81c60f81b8382806001019350815181106114b057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350818060010192505061147e565b600091505b845182101561155f5784828151811061150657fe5b602001015160f81c60f81b83828060010193508151811061152357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081806001019250506114f1565b829c50505050505050505050505050919050565b6000600254905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b60006115e28484846136bd565b61167e843361167985600460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138ea90919063ffffffff16565b613414565b600190509392505050565b600061169361157d565b61169c57600080fd5b600360009054906101000a900460ff166116b557600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166116d4612ddd565b73ffffffffffffffffffffffffffffffffffffffff161480156116fc57506116fb3361390a565b5b61170557600080fd5b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015490506000600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055506117e981600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546133f590919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f477b65cf658c5207a9d60bb5ebe4f60a504af024949bdffa6efc396d01ced3f6836040518082815260200191505060405180910390a36001915050919050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201549050919050565b60075481565b6000600360009054906101000a900460ff161561190c57600080fd5b60006119a083600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133f590919063ffffffff16565b90506119aa6122b5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611bb757611a3283600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546133f590919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541015611a8057600080fd5b611ad583600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546133f590919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550611b7083600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546133f590919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055505b611bc2338583613414565b600191505092915050565b6000611bd761157d565b611be057600080fd5b600360009054906101000a900460ff16611bf957600080fd5b3373ffffffffffffffffffffffffffffffffffffffff16611c18612ddd565b73ffffffffffffffffffffffffffffffffffffffff16148015611c405750611c3f3361390a565b5b611c4957600080fd5b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015490506000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550611d348160046000611ce86122b5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546133f590919063ffffffff16565b60046000611d406122b5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055503373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364826040518082815260200191505060405180910390a25090565b611ddb6122de565b80611dea5750611de961157d565b5b611df357600080fd5b600360009054906101000a900460ff1615611e0d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e4757600080fd5b611e4f6122b5565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e8757600080fd5b60008211611e9457600080fd5b80821015611ea157600080fd5b8160046000611eae6122b5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201541015611ef757600080fd5b611f538260046000611f076122b5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546138ea90919063ffffffff16565b60046000611f5f6122b5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550611ff582600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546133f590919063ffffffff16565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555061209081600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546133f590919063ffffffff16565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555061212b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546133f590919063ffffffff16565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055508273ffffffffffffffffffffffffffffffffffffffff167f720e2015c6c49aa255ac152528ef75a8d12b40300a289e74c701a97c428654858383604051808381526020018281526020019250505060405180910390a2505050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201549050919050565b6000600460006122726122b5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b60068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123cb5780601f106123a0576101008083540402835291602001916123cb565b820191906000526020600020905b8154815290600101906020018083116123ae57829003601f168201915b505050505081565b60006123dd6122de565b6123e657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561244257600080fd5b61244c600061391d565b905090565b6000600360009054906101000a900460ff161561246d57600080fd5b81600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561257757600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205491505b600061260b83600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138ea90919063ffffffff16565b90506126156122b5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561277f5761269d83600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546138ea90919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555061273883600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546138ea90919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055505b61278a338583613414565b600191505092915050565b600061279f6122de565b6127a857600080fd5b6000600360006101000a81548160ff021916908315150217905550600360009054906101000a900460ff16905090565b60006127e53384846136bd565b6001905092915050565b6127f76122de565b80612806575061280561157d565b5b61280f57600080fd5b600360009054906101000a900460ff161561282957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561286357600080fd5b61286b6122b5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128a357600080fd5b6128f881600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546133f590919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154101561294657600080fd5b61299b81600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546133f590919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550612a3681600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546133f590919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055508173ffffffffffffffffffffffffffffffffffffffff167f84a2be98ade81115c3a7fc4e3f8f8b7d2ce22bb482f7270108a03034579aedad826040518082815260200191505060405180910390a25050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050919050565b6000612b246122de565b612b2d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b6757600080fd5b612b6f6122b5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ba757600080fd5b612bb08261391d565b9050919050565b6000612bc16122de565b612bca57600080fd5b600360009054906101000a900460ff1615612be457600080fd5b612c3982600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546138ea90919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550612cd482600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546138ea90919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055507fff8ec5d2b7f799353c995f253a6beef49d9d48b7526099e872af2cfe7a888b1d600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546040518082815260200191505060405180910390a1600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050919050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612e996122de565b80612ea85750612ea761157d565b5b612eb157600080fd5b600360009054906101000a900460ff1615612ecb57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f0557600080fd5b612f0d6122b5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f4557600080fd5b80600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201541015612f9457600080fd5b612fe981600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546138ea90919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555061308481600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546138ea90919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055508173ffffffffffffffffffffffffffffffffffffffff167fd85f893defab26c8b95a9d1a6aec387c0f5f6fb6581d53df79b83ef7b2061873826040518082815260200191505060405180910390a25050565b6131246122de565b80613133575061313261157d565b5b61313c57600080fd5b600360009054906101000a900460ff161561315657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561319057600080fd5b6131986122b5565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156131d057600080fd5b6000613269600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546138ea90919063ffffffff16565b90506000811161327857600080fd5b6132cd81600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546133f590919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555061336881600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546133f590919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055505050565b60006133bc6122de565b6133c557600080fd5b6001600360006101000a81548160ff021916908315150217905550600360009054906101000a900460ff16905090565b60008082840190508381101561340a57600080fd5b8091505092915050565b600360009054906101000a900460ff161561342e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561346857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156134a257600080fd5b80600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b606060008214156135d8576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506136b8565b600082905060005b60008214613602578080600101915050600a82816135fa57fe5b0491506135e0565b6060816040519080825280601f01601f1916602001820160405280156136375781602001600182028038833980820191505090505b50905060006001830390505b600086146136b057600a868161365557fe5b0660300160f81b8282806001900393508151811061366f57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a86816136a857fe5b049550613643565b819450505050505b919050565b600360009054906101000a900460ff16156136d757600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561371057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561374a57600080fd5b61379f81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546138ea90919063ffffffff16565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002018190555061383a81600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546133f590919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000828211156138f957600080fd5b600082840390508091505092915050565b600080823b905060008111915050919050565b60008173ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561397a57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f7ae02edfa8fcf8e6ab0735af4a8724ca06b091b99194712358a6da6146107a8f60405160405180910390a381600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001905091905056fea165627a7a723058202f9b1b5659027d24ec3c0ec6ce4d7c392bd13be6fa516d86b711da6337b4e7130029

Deployed Bytecode Sourcemap

34095:423:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34095:423:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22344:576;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22344:576:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34133:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;34133:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13898:148;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13898:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;18503:2199;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18503:2199:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;18503:2199:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13075:91;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9258:100;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;14119:244;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14119:244:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;31643:533;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31643:533:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;18198:134;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18198:134:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34206:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14480:740;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14480:740:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;32831:491;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;25209:845;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25209:845:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;17739:135;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17739:135:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13242:123;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13242:123:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21448:125;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6943:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;7108:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;34171:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;34171:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9799:160;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;15337:1170;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15337:1170:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;30954:109;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;13664:140;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13664:140:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;26587:594;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26587:594:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;17958:135;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17958:135:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9462:214;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;9462:214:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;23857:458;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23857:458:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;8580:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;13463:149;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13463:149:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27721:536;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27721:536:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28757:545;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28757:545:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;30617:106;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;22344:576;22417:7;7070:9;:7;:9::i;:::-;7062:18;;;;;;22446:6;;;;;;;;;;;22445:7;22437:16;;;;;;22517:53;22563:6;22517:16;:28;22534:10;22517:28;;;;;;;;;;;;;;;:41;;;:45;;:53;;;;:::i;:::-;22472:16;:28;22489:10;22472:28;;;;;;;;;;;;;;;:41;;;:98;;22464:107;;;;;;22626:53;22672:6;22626:16;:28;22643:10;22626:28;;;;;;;;;;;;;;;:41;;;:45;;:53;;;;:::i;:::-;22582:16;:28;22599:10;22582:28;;;;;;;;;;;;;;;:41;;:97;;;;22729:48;22770:6;22729:16;:28;22746:10;22729:28;;;;;;;;;;;;;;;:36;;;:40;;:48;;;;:::i;:::-;22690:16;:28;22707:10;22690:28;;;;;;;;;;;;;;;:36;;:87;;;;22793:60;22811:16;:28;22828:10;22811:28;;;;;;;;;;;;;;;:41;;;22793:60;;;;;;;;;;;;;;;;;;22871:16;:28;22888:10;22871:28;;;;;;;;;;;;;;;:41;;;22864:48;;22344:576;;;:::o;34133:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;13898:148::-;13963:4;13980:36;13989:10;14001:7;14010:5;13980:8;:36::i;:::-;14034:4;14027:11;;13898:148;;;;:::o;18503:2199::-;18568:13;18594:23;18620:10;;;;;;;;;;;;;;;;;18594:36;;18641:24;18668:30;;;;;;;;;;;;;;;;;18641:57;;18709:19;18737:47;18746:16;:24;18763:6;18746:24;;;;;;;;;;;;;;;:37;;;18737:8;:47::i;:::-;18709:76;;18796:24;18823:34;;;;;;;;;;;;;;;;;18796:61;;18868:19;18896:47;18905:16;:24;18922:6;18905:24;;;;;;;;;;;;;;;:37;;;18896:8;:47::i;:::-;18868:76;;18955:25;18983:38;;;;;;;;;;;;;;;;;18955:66;;19032:20;19061:42;19070:16;:24;19087:6;19070:24;;;;;;;;;;;;;;;:32;;;19061:8;:42::i;:::-;19032:72;;19115:21;19139:12;;;;;;;;;;;;;;;;;19115:36;;19164:21;19332:8;:15;19315:7;:14;19293:12;:19;19277:6;:13;19256:11;:18;19240:6;:13;19219:11;:18;19199:10;:17;:38;:54;:75;:91;:113;:130;:148;19188:160;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;116:4;104:10;96:6;87:34;147:4;139:6;135:17;125:27;;0:156;19188:160:0;;;;19164:184;;19359:25;19393:7;19359:42;;19414:14;19431:1;19414:18;;19443:15;19461:1;19443:19;;19492:1;19480:13;;19475:141;19507:10;:17;19495:9;:29;19475:141;;;19583:10;19594:9;19583:21;;;;;;;;;;;;;;;;19554:12;19567;;;;;;19554:26;;;;;;;;;;;:50;;;;;;;;;;;19526:11;;;;;;;19475:141;;;19643:1;19631:13;;19626:143;19658:11;:18;19646:9;:30;19626:143;;;19735:11;19747:9;19735:22;;;;;;;;;;;;;;;;19706:12;19719;;;;;;19706:26;;;;;;;;;;;:51;;;;;;;;;;;19678:11;;;;;;;19626:143;;;19796:1;19784:13;;19779:133;19811:6;:13;19799:9;:25;19779:133;;;19883:6;19890:9;19883:17;;;;;;;;;;;;;;;;19854:12;19867;;;;;;19854:26;;;;;;;;;;;:46;;;;;;;;;;;19826:11;;;;;;;19779:133;;;19939:1;19927:13;;19922:143;19954:11;:18;19942:9;:30;19922:143;;;20031:11;20043:9;20031:22;;;;;;;;;;;;;;;;20002:12;20015;;;;;;20002:26;;;;;;;;;;;:51;;;;;;;;;;;19974:11;;;;;;;19922:143;;;20092:1;20080:13;;20075:133;20107:6;:13;20095:9;:25;20075:133;;;20179:6;20186:9;20179:17;;;;;;;;;;;;;;;;20150:12;20163;;;;;;20150:26;;;;;;;;;;;:46;;;;;;;;;;;20122:11;;;;;;;20075:133;;;20235:1;20223:13;;20218:145;20250:12;:19;20238:9;:31;20218:145;;;20328:12;20341:9;20328:23;;;;;;;;;;;;;;;;20299:12;20312;;;;;;20299:26;;;;;;;;;;;:52;;;;;;;;;;;20271:11;;;;;;;20218:145;;;20390:1;20378:13;;20373:135;20405:7;:14;20393:9;:26;20373:135;;;20478:7;20486:9;20478:18;;;;;;;;;;;;;;;;20449:12;20462;;;;;;20449:26;;;;;;;;;;;:47;;;;;;;;;;;20421:11;;;;;;;20373:135;;;20535:1;20523:13;;20518:137;20550:8;:15;20538:9;:27;20518:137;;;20624:8;20633:9;20624:19;;;;;;;;;;;;;;;;20595:12;20608;;;;;;20595:26;;;;;;;;;;;:48;;;;;;;;;;;20567:11;;;;;;;20518:137;;;20681:12;20667:27;;;;;;;;;;;;;;18503:2199;;;:::o;13075:91::-;13119:7;13146:12;;13139:19;;13075:91;:::o;9258:100::-;9302:4;9340:10;;;;;;;;;;;9326:24;;:10;:24;;;9319:31;;9258:100;:::o;14119:244::-;14198:4;14215:26;14225:4;14231:2;14235:5;14215:9;:26::i;:::-;14252:81;14261:4;14267:10;14279:53;14326:5;14279:16;:22;14296:4;14279:22;;;;;;;;;;;;;;;:30;;:42;14310:10;14279:42;;;;;;;;;;;;;;;;:46;;:53;;;;:::i;:::-;14252:8;:81::i;:::-;14351:4;14344:11;;14119:244;;;;;:::o;31643:533::-;31709:4;8903:13;:11;:13::i;:::-;8895:22;;;;;;31734:6;;;;;;;;;;;31726:15;;;;;;31798:10;31783:25;;:11;:9;:11::i;:::-;:25;;;31782:53;;;;;31813:22;31824:10;31813;:22::i;:::-;31782:53;31774:62;;;;;;31887:15;31905:16;:24;31922:6;31905:24;;;;;;;;;;;;;;;:32;;;31887:50;;31983:1;31948:16;:24;31965:6;31948:24;;;;;;;;;;;;;;;:32;;:36;;;;32034:49;32075:7;32034:16;:28;32051:10;32034:28;;;;;;;;;;;;;;;:36;;;:40;;:49;;;;:::i;:::-;31995:16;:28;32012:10;31995:28;;;;;;;;;;;;;;;:36;;:88;;;;32126:10;32109:37;;32118:6;32109:37;;;32138:7;32109:37;;;;;;;;;;;;;;;;;;32164:4;32157:11;;;31643:533;;;:::o;18198:134::-;18265:7;18292:16;:24;18309:6;18292:24;;;;;;;;;;;;;;;:32;;;18285:39;;18198:134;;;:::o;34206:28::-;;;;:::o;14480:740::-;14560:4;14586:6;;;;;;;;;;;14585:7;14577:16;;;;;;14604:13;14620:61;14670:10;14620:16;:28;14637:10;14620:28;;;;;;;;;;;;;;;:36;;:45;14657:7;14620:45;;;;;;;;;;;;;;;;:49;;:61;;;;:::i;:::-;14604:77;;14710:7;:5;:7::i;:::-;14696:21;;:10;:21;;;14692:452;;;14852:57;14898:10;14852:16;:28;14869:10;14852:28;;;;;;;;;;;;;;;:41;;;:45;;:57;;;;:::i;:::-;14807:16;:28;14824:10;14807:28;;;;;;;;;;;;;;;:41;;;:102;;14799:111;;;;;;14969:57;15015:10;14969:16;:28;14986:10;14969:28;;;;;;;;;;;;;;;:41;;;:45;;:57;;;;:::i;:::-;14925:16;:28;14942:10;14925:28;;;;;;;;;;;;;;;:41;;:101;;;;15080:52;15121:10;15080:16;:28;15097:10;15080:28;;;;;;;;;;;;;;;:36;;;:40;;:52;;;;:::i;:::-;15041:16;:28;15058:10;15041:28;;;;;;;;;;;;;;;:36;;:91;;;;14692:452;15154:36;15163:10;15175:7;15184:5;15154:8;:36::i;:::-;15208:4;15201:11;;;14480:740;;;;:::o;32831:491::-;32883:4;8903:13;:11;:13::i;:::-;8895:22;;;;;;32908:6;;;;;;;;;;;32900:15;;;;;;32972:10;32957:25;;:11;:9;:11::i;:::-;:25;;;32956:53;;;;;32987:22;32998:10;32987;:22::i;:::-;32956:53;32948:62;;;;;;33061:15;33079:16;:28;33096:10;33079:28;;;;;;;;;;;;;;;:36;;;33061:54;;33165:1;33126:16;:28;33143:10;33126:28;;;;;;;;;;;;;;;:36;;:40;;;;33213:46;33251:7;33213:16;:25;33230:7;:5;:7::i;:::-;33213:25;;;;;;;;;;;;;;;:33;;;:37;;:46;;;;:::i;:::-;33177:16;:25;33194:7;:5;:7::i;:::-;33177:25;;;;;;;;;;;;;;;:33;;:82;;;;33294:10;33285:29;;;33306:7;33285:29;;;;;;;;;;;;;;;;;;8928:1;32831:491;:::o;25209:845::-;9199:9;:7;:9::i;:::-;:26;;;;9212:13;:11;:13::i;:::-;9199:26;9191:35;;;;;;25331:6;;;;;;;;;;;25330:7;25322:16;;;;;;25375:1;25357:20;;:6;:20;;;;25349:29;;;;;;25407:7;:5;:7::i;:::-;25397:17;;:6;:17;;;;25389:26;;;;;;25449:1;25434:12;:16;25426:25;;;;;;25486:12;25470;:28;;25462:37;;;;;;25555:12;25518:16;:25;25535:7;:5;:7::i;:::-;25518:25;;;;;;;;;;;;;;;:33;;;:49;;25510:58;;;;;;25617:51;25655:12;25617:16;:25;25634:7;:5;:7::i;:::-;25617:25;;;;;;;;;;;;;;;:33;;;:37;;:51;;;;:::i;:::-;25581:16;:25;25598:7;:5;:7::i;:::-;25581:25;;;;;;;;;;;;;;;:33;;:87;;;;25721:55;25763:12;25721:16;:24;25738:6;25721:24;;;;;;;;;;;;;;;:37;;;:41;;:55;;;;:::i;:::-;25681:16;:24;25698:6;25681:24;;;;;;;;;;;;;;;:37;;:95;;;;25827:55;25869:12;25827:16;:24;25844:6;25827:24;;;;;;;;;;;;;;;:37;;;:41;;:55;;;;:::i;:::-;25787:16;:24;25804:6;25787:24;;;;;;;;;;;;;;;:37;;:95;;;;25928:50;25965:12;25928:16;:24;25945:6;25928:24;;;;;;;;;;;;;;;:32;;;:36;;:50;;;;:::i;:::-;25893:16;:24;25910:6;25893:24;;;;;;;;;;;;;;;:32;;:85;;;;26011:6;26004:42;;;26019:12;26033;26004:42;;;;;;;;;;;;;;;;;;;;;;;;25209:845;;;:::o;17739:135::-;17802:7;17829:16;:24;17846:6;17829:24;;;;;;;;;;;;;;;:37;;;17822:44;;17739:135;;;:::o;13242:123::-;13298:7;13325:16;:24;13342:6;13325:24;;;;;;;;;;;;;;;:32;;;13318:39;;13242:123;;;:::o;21448:125::-;21500:7;21527:16;:25;21544:7;:5;:7::i;:::-;21527:25;;;;;;;;;;;;;;;:38;;;21520:45;;21448:125;:::o;6943:79::-;6981:7;7008:6;;;;;;;;;;;7001:13;;6943:79;:::o;7108:92::-;7148:4;7186:6;;;;;;;;;;;7172:20;;:10;:20;;;7165:27;;7108:92;:::o;34171:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9799:160::-;9854:4;7070:9;:7;:9::i;:::-;7062:18;;;;;;9901:1;9879:24;;:10;;;;;;;;;;;:24;;;;9871:33;;;;;;9922:29;9948:1;9922:17;:29::i;:::-;9915:36;;9799:160;:::o;15337:1170::-;15422:4;15448:6;;;;;;;;;;;15447:7;15439:16;;;;;;15793:15;15745:16;:28;15762:10;15745:28;;;;;;;;;;;;;;;:36;;:45;15782:7;15745:45;;;;;;;;;;;;;;;;:63;15741:159;;;15843:16;:28;15860:10;15843:28;;;;;;;;;;;;;;;:36;;:45;15880:7;15843:45;;;;;;;;;;;;;;;;15825:63;;15741:159;15920:13;15936:66;15986:15;15936:16;:28;15953:10;15936:28;;;;;;;;;;;;;;;:36;;:45;15973:7;15936:45;;;;;;;;;;;;;;;;:49;;:66;;;;:::i;:::-;15920:82;;16031:7;:5;:7::i;:::-;16017:21;;:10;:21;;;16013:418;;;16246:62;16292:15;16246:16;:28;16263:10;16246:28;;;;;;;;;;;;;;;:41;;;:45;;:62;;;;:::i;:::-;16202:16;:28;16219:10;16202:28;;;;;;;;;;;;;;;:41;;:106;;;;16362:57;16403:15;16362:16;:28;16379:10;16362:28;;;;;;;;;;;;;;;:36;;;:40;;:57;;;;:::i;:::-;16323:16;:28;16340:10;16323:28;;;;;;;;;;;;;;;:36;;:96;;;;16013:418;16441:36;16450:10;16462:7;16471:5;16441:8;:36::i;:::-;16495:4;16488:11;;;15337:1170;;;;:::o;30954:109::-;31000:4;7070:9;:7;:9::i;:::-;7062:18;;;;;;31026:5;31017:6;;:14;;;;;;;;;;;;;;;;;;31049:6;;;;;;;;;;;31042:13;;30954:109;:::o;13664:140::-;13725:4;13742:32;13752:10;13764:2;13768:5;13742:9;:32::i;:::-;13792:4;13785:11;;13664:140;;;;:::o;26587:594::-;9199:9;:7;:9::i;:::-;:26;;;;9212:13;:11;:13::i;:::-;9199:26;9191:35;;;;;;26701:6;;;;;;;;;;;26700:7;26692:16;;;;;;26745:1;26727:20;;:6;:20;;;;26719:29;;;;;;26777:7;:5;:7::i;:::-;26767:17;;:6;:17;;;;26759:26;;;;;;26845:55;26887:12;26845:16;:24;26862:6;26845:24;;;;;;;;;;;;;;;:37;;;:41;;:55;;;;:::i;:::-;26804:16;:24;26821:6;26804:24;;;;;;;;;;;;;;;:37;;;:96;;26796:105;;;;;;26954:55;26996:12;26954:16;:24;26971:6;26954:24;;;;;;;;;;;;;;;:37;;;:41;;:55;;;;:::i;:::-;26914:16;:24;26931:6;26914:24;;;;;;;;;;;;;;;:37;;:95;;;;27055:50;27092:12;27055:16;:24;27072:6;27055:24;;;;;;;;;;;;;;;:32;;;:36;;:50;;;;:::i;:::-;27020:16;:24;27037:6;27020:24;;;;;;;;;;;;;;;:32;;:85;;;;27152:6;27131:42;;;27160:12;27131:42;;;;;;;;;;;;;;;;;;26587:594;;:::o;17958:135::-;18021:7;18048:16;:24;18065:6;18048:24;;;;;;;;;;;;;;;:37;;;18041:44;;17958:135;;;:::o;9462:214::-;9533:4;7070:9;:7;:9::i;:::-;7062:18;;;;;;9579:1;9558:23;;:9;:23;;;;9550:32;;;;;;9614:7;:5;:7::i;:::-;9601:20;;:9;:20;;;;9593:29;;;;;;9640:28;9658:9;9640:17;:28::i;:::-;9633:35;;9462:214;;;:::o;23857:458::-;23930:7;7070:9;:7;:9::i;:::-;7062:18;;;;;;23959:6;;;;;;;;;;;23958:7;23950:16;;;;;;24021:53;24067:6;24021:16;:28;24038:10;24021:28;;;;;;;;;;;;;;;:41;;;:45;;:53;;;;:::i;:::-;23977:16;:28;23994:10;23977:28;;;;;;;;;;;;;;;:41;;:97;;;;24124:48;24165:6;24124:16;:28;24141:10;24124:28;;;;;;;;;;;;;;;:36;;;:40;;:48;;;;:::i;:::-;24085:16;:28;24102:10;24085:28;;;;;;;;;;;;;;;:36;;:87;;;;24188:60;24206:16;:28;24223:10;24206:28;;;;;;;;;;;;;;;:41;;;24188:60;;;;;;;;;;;;;;;;;;24266:16;:28;24283:10;24266:28;;;;;;;;;;;;;;;:41;;;24259:48;;23857:458;;;:::o;8580:87::-;8622:7;8649:10;;;;;;;;;;;8642:17;;8580:87;:::o;13463:149::-;13536:7;13563:16;:24;13580:6;13563:24;;;;;;;;;;;;;;;:32;;:41;13596:7;13563:41;;;;;;;;;;;;;;;;13556:48;;13463:149;;;;:::o;27721:536::-;9199:9;:7;:9::i;:::-;:26;;;;9212:13;:11;:13::i;:::-;9199:26;9191:35;;;;;;27833:6;;;;;;;;;;;27832:7;27824:16;;;;;;27877:1;27859:20;;:6;:20;;;;27851:29;;;;;;27909:7;:5;:7::i;:::-;27899:17;;:6;:17;;;;27891:26;;;;;;27972:10;27936:16;:24;27953:6;27936:24;;;;;;;;;;;;;;;:32;;;:46;;27928:55;;;;;;28036:53;28078:10;28036:16;:24;28053:6;28036:24;;;;;;;;;;;;;;;:37;;;:41;;:53;;;;:::i;:::-;27996:16;:24;28013:6;27996:24;;;;;;;;;;;;;;;:37;;:93;;;;28135:48;28172:10;28135:16;:24;28152:6;28135:24;;;;;;;;;;;;;;;:32;;;:36;;:48;;;;:::i;:::-;28100:16;:24;28117:6;28100:24;;;;;;;;;;;;;;;:32;;:83;;;;28230:6;28209:40;;;28238:10;28209:40;;;;;;;;;;;;;;;;;;27721:536;;:::o;28757:545::-;9199:9;:7;:9::i;:::-;:26;;;;9212:13;:11;:13::i;:::-;9199:26;9191:35;;;;;;28844:6;;;;;;;;;;;28843:7;28835:16;;;;;;28888:1;28870:20;;:6;:20;;;;28862:29;;;;;;28920:7;:5;:7::i;:::-;28910:17;;:6;:17;;;;28902:26;;;;;;28941:20;28964:80;29006:16;:24;29023:6;29006:24;;;;;;;;;;;;;;;:37;;;28964:16;:24;28981:6;28964:24;;;;;;;;;;;;;;;:37;;;:41;;:80;;;;:::i;:::-;28941:103;;29080:1;29065:12;:16;29057:25;;;;;;29143:55;29185:12;29143:16;:24;29160:6;29143:24;;;;;;;;;;;;;;;:37;;;:41;;:55;;;;:::i;:::-;29103:16;:24;29120:6;29103:24;;;;;;;;;;;;;;;:37;;:95;;;;29244:50;29281:12;29244:16;:24;29261:6;29244:24;;;;;;;;;;;;;;;:32;;;:36;;:50;;;;:::i;:::-;29209:16;:24;29226:6;29209:24;;;;;;;;;;;;;;;:32;;:85;;;;9237:1;28757:545;:::o;30617:106::-;30661:4;7070:9;:7;:9::i;:::-;7062:18;;;;;;30687:4;30678:6;;:13;;;;;;;;;;;;;;;;;;30709:6;;;;;;;;;;;30702:13;;30617:106;:::o;5727:150::-;5785:7;5805:9;5821:1;5817;:5;5805:17;;5846:1;5841;:6;;5833:15;;;;;;5868:1;5861:8;;;5727:150;;;;:::o;17332:300::-;17426:6;;;;;;;;;;;17425:7;17417:16;;;;;;17471:1;17452:21;;:7;:21;;;;17444:30;;;;;;17511:1;17493:20;;:6;:20;;;;17485:29;;;;;;17571:5;17527:16;:24;17544:6;17527:24;;;;;;;;;;;;;;;:32;;:41;17560:7;17527:41;;;;;;;;;;;;;;;:49;;;;17609:7;17592:32;;17601:6;17592:32;;;17618:5;17592:32;;;;;;;;;;;;;;;;;;17332:300;;;:::o;20840:482::-;20890:27;20940:1;20934:2;:7;20930:50;;;20958:10;;;;;;;;;;;;;;;;;;;;;20930:50;20990:6;20999:2;20990:11;;21012:8;21031:69;21043:1;21038;:6;21031:69;;21061:5;;;;;;;21086:2;21081:7;;;;;;;;;21031:69;;;21110:17;21140:3;21130:14;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;116:4;104:10;96:6;87:34;147:4;139:6;135:17;125:27;;0:156;21130:14:0;;;;21110:34;;21155:6;21170:1;21164:3;:7;21155:16;;21182:103;21195:1;21189:2;:7;21182:103;;21246:2;21241;:7;;;;;;21236:2;:12;21225:25;;21213:4;21218:3;;;;;;;21213:9;;;;;;;;;;;:37;;;;;;;;;;;21271:2;21265:8;;;;;;;;;21182:103;;;21309:4;21295:19;;;;;;20840:482;;;;:::o;16617:603::-;16705:6;;;;;;;;;;;16704:7;16696:16;;;;;;16961:4;16947:19;;:2;:19;;;;16939:28;;;;;;17000:1;16986:16;;:2;:16;;;;16978:25;;;;;;17049:41;17084:5;17049:16;:22;17066:4;17049:22;;;;;;;;;;;;;;;:30;;;:34;;:41;;;;:::i;:::-;17016:16;:22;17033:4;17016:22;;;;;;;;;;;;;;;:30;;:74;;;;17132:39;17165:5;17132:16;:20;17149:2;17132:20;;;;;;;;;;;;;;;:28;;;:32;;:39;;;;:::i;:::-;17101:16;:20;17118:2;17101:20;;;;;;;;;;;;;;;:28;;:70;;;;17202:2;17187:25;;17196:4;17187:25;;;17206:5;17187:25;;;;;;;;;;;;;;;;;;16617:603;;;:::o;5569:150::-;5627:7;5660:1;5655;:6;;5647:15;;;;;;5673:9;5689:1;5685;:5;5673:17;;5710:1;5703:8;;;5569:150;;;;:::o;33935:153::-;33986:4;34001:9;34050:4;34038:17;34030:25;;34079:1;34072:4;:8;34065:15;;;33935:153;;;:::o;10113:231::-;10176:4;10215:9;10201:23;;:10;;;;;;;;;;;:23;;;;10193:32;;;;;;10271:9;10241:40;;10259:10;;;;;;;;;;;10241:40;;;;;;;;;;;;10305:9;10292:10;;:22;;;;;;;;;;;;;;;;;;10332:4;10325:11;;10113:231;;;:::o

Swarm Source

bzzr://2f9b1b5659027d24ec3c0ec6ce4d7c392bd13be6fa516d86b711da6337b4e713

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

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.