contract StandardToken is Token {
    
    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: burn from the zero address");

        balances[account] = SafeMath.sub(balances[account], amount, "ERC20: burn amount exceeds balance");
        totalSupply = SafeMath.sub(totalSupply, amount);
        circulatingSupply = SafeMath.sub(circulatingSupply, amount);
        emit Transfer(account, address(0), amount);
    }

    function transfer(address _to, uint256 _value) public returns (bool success) {
        //Default assumes totalSupply can't be over max (2^256 - 1).
        if (balances[msg.sender] >= _value && _value > 0) {
            
            uint256 burnVal = _value / BurnRateDenominator;
            
            _burn(msg.sender, burnVal);
            
            balances[msg.sender] -= (_value - burnVal);
            balances[_to] += (_value - burnVal);
            emit Transfer(msg.sender, _to, (_value - burnVal));
            
            
            return true;
        } else { return false; }
    }

    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
        
        if (balances[_from] >= _value && allowed[_from][msg.sender] >= _value && _value > 0) {
            
            uint256 burnVal = _value / BurnRateDenominator;
            
            _burn(_from, burnVal);
            
            balances[_to] += (_value - burnVal);
            balances[_from] -= (_value - burnVal);
            allowed[_from][msg.sender] -= (_value - burnVal);
            emit Transfer(_from, _to, (_value - burnVal));
            return true;
        } else { return false; }
    }

    function balanceOf(address _owner) view public returns (uint256 balance) {
        return balances[_owner];
    }

    function approve(address _spender, uint256 _value) public returns (bool success) {
        allowed[msg.sender][_spender] = _value;
        emit Approval(msg.sender, _spender, _value);
        return true;
    }

    function allowance(address _owner, address _spender) view public returns (uint256 remaining) {
      return allowed[_owner][_spender];
    }


    mapping (address => uint256) balances;
    mapping (address => mapping (address => uint256)) allowed;
    uint256 public circulatingSupply;
    uint256 public totalSupply;
    uint256 public BurnRateDenominator = 100;
}
function _burn(address account, uint256 amount) internal {
    require(account != address(0), "ERC20: burn from the zero address");

    balances[account] = SafeMath.sub(balances[account], amount, "ERC20: burn amount exceeds balance");
    totalSupply = SafeMath.sub(totalSupply, amount);
    circulatingSupply = SafeMath.sub(circulatingSupply, amount);
    emit Transfer(account, address(0), amount);
}

/**
 * @dev Destroys `amount` tokens from `account`, reducing the
 * total supply.
 *
 * Emits a {Transfer} event with `to` set to the zero address.
 *
 * Requirements
 *
 * - `account` cannot be the zero address.
 * - `account` must have at least `amount` tokens.
 */