ETH Price: $3,213.86 (-2.93%)

Token

SymVerse (SYM)
 

Overview

Max Total Supply

1,000,000,000 SYM

Holders

3,976 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
15 SYM

Value
$0.00
0xf95Dbf3c1446de57DaF0085761cE3E01d70407Eb
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

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
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.