org.planetcrypto.bitcoin.PlanetCryptoBitcoinUI.java Source code

Java tutorial

Introduction

Here is the source code for org.planetcrypto.bitcoin.PlanetCryptoBitcoinUI.java

Source

/* 
 * The MIT License
 *
 * Copyright 2014 Halcyon <support@planetcrypto.com A2A1A088>.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */
package org.planetcrypto.bitcoin;

import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.*;
import java.io.IOException;
import java.net.InetAddress;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.UnknownHostException;
import java.text.DecimalFormat;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JCheckBox;
import javax.swing.JOptionPane;
import javax.swing.text.*;
import org.json.prettyprint.JsonWriter;
import javax.swing.Timer;

/**
 *
 * @author halcyon
 */
public class PlanetCryptoBitcoinUI extends javax.swing.JFrame {

    private static final long serialVersionUID = 1L;

    /**
     * Creates new form BFGMinerUI
     */
    public PlanetCryptoBitcoinUI() {
        initComponents();
        setIcon();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {
        bindingGroup = new org.jdesktop.beansbinding.BindingGroup();

        MainTabbedPane = new javax.swing.JTabbedPane();
        MinerInformationPanel = new javax.swing.JPanel();
        MinerInformationTabbedPane = new javax.swing.JTabbedPane();
        InformationPanel = new javax.swing.JPanel();
        MinerSelectionBox = new javax.swing.JComboBox();
        MinerSelectionBoxLabel = new javax.swing.JLabel();
        InformationMinerIPLabel = new javax.swing.JLabel();
        InformationMinerIPTextField = new javax.swing.JTextField();
        InformationMinerPortLabel = new javax.swing.JLabel();
        InformationMinerPortTextField = new javax.swing.JTextField();
        PrivilegedLabel = new javax.swing.JLabel();
        ASICsLabel = new javax.swing.JLabel();
        PrivilegedTextField = new javax.swing.JTextField();
        ASICsTextField = new javax.swing.JTextField();
        PGAsLabel = new javax.swing.JLabel();
        PGAsTextField = new javax.swing.JTextField();
        PoolCountLabel = new javax.swing.JLabel();
        PoolCountTextField = new javax.swing.JTextField();
        MinerVersionLabel = new javax.swing.JLabel();
        MinerVersionTextField = new javax.swing.JTextField();
        MinerStrategyLabel = new javax.swing.JLabel();
        MinerStrategyTextField = new javax.swing.JTextField();
        ACSChain1Label = new javax.swing.JLabel();
        ACSChain1TextField = new javax.swing.JTextField();
        ACSChain2Label = new javax.swing.JLabel();
        ACSChain3Label = new javax.swing.JLabel();
        ACSChain4Label = new javax.swing.JLabel();
        ACSChain2TextField = new javax.swing.JTextField();
        ACSChain3TextField = new javax.swing.JTextField();
        ACSChain4TextField = new javax.swing.JTextField();
        BytesSentLabel = new javax.swing.JLabel();
        BytesRecvLabel = new javax.swing.JLabel();
        BytesSentTextField = new javax.swing.JTextField();
        BytesRecvTextField = new javax.swing.JTextField();
        HWErrorPercentLabel = new javax.swing.JLabel();
        HWErrorPercentageTextField = new javax.swing.JTextField();
        HWErrorsLabel = new javax.swing.JLabel();
        HWErrorsTextField = new javax.swing.JTextField();
        ACSChainInformationLabel = new javax.swing.JLabel();
        MinerGenericInformationRefreshButton = new javax.swing.JButton();
        MinerHashRatesPanel = new javax.swing.JPanel();
        HashRatesCurrentMiner = new javax.swing.JLabel();
        MinerCurrentHashLabel = new javax.swing.JLabel();
        MinerCurrentHashTextField = new javax.swing.JTextField();
        MinerAverageHashLabel = new javax.swing.JLabel();
        MinerAverageHashTextField = new javax.swing.JTextField();
        MinerFoundBlocksLabel = new javax.swing.JLabel();
        MinerAcceptedLabel = new javax.swing.JLabel();
        MinerRejectedLabel = new javax.swing.JLabel();
        MinerBestShareLabel = new javax.swing.JLabel();
        MinerNetworkBlocksLabel = new javax.swing.JLabel();
        MinerFoundBlocksTextField = new javax.swing.JTextField();
        MinerAcceptedTextField = new javax.swing.JTextField();
        MinerRejectedTextField = new javax.swing.JTextField();
        MinerBestShareTextField = new javax.swing.JTextField();
        MinerNetworkBlocksTextField = new javax.swing.JTextField();
        MinerSelectionBox1 = new javax.swing.JComboBox();
        MinerHashRatesRefreshButton = new javax.swing.JButton();
        MinerTemperaturePanel = new javax.swing.JPanel();
        TemperatureCurrentMinerLabel = new javax.swing.JLabel();
        MinerTemp1Label = new javax.swing.JLabel();
        MinerTemp2Label = new javax.swing.JLabel();
        MinerTemp3Label = new javax.swing.JLabel();
        MinerTemp4Label = new javax.swing.JLabel();
        MinerTempAvgLabel = new javax.swing.JLabel();
        MinerTempMaxLabel = new javax.swing.JLabel();
        MinerTemp1TextField = new javax.swing.JTextField();
        MinerTemp2TextField = new javax.swing.JTextField();
        MinerTemp3TextField = new javax.swing.JTextField();
        MinerTemp4TextField = new javax.swing.JTextField();
        MinerTempAvgTextField = new javax.swing.JTextField();
        MinerTextMaxTextField = new javax.swing.JTextField();
        MinerSelectionBox2 = new javax.swing.JComboBox();
        MinerTemperaturesRefreshButton = new javax.swing.JButton();
        MinerFansPanel = new javax.swing.JPanel();
        FansCurrentMinerLabel = new javax.swing.JLabel();
        MinerFan1Label = new javax.swing.JLabel();
        MinerFan2Label = new javax.swing.JLabel();
        MinerFan3Label = new javax.swing.JLabel();
        MinerFan4Label = new javax.swing.JLabel();
        MinerFan1TextField = new javax.swing.JTextField();
        MinerFan2TextField = new javax.swing.JTextField();
        MinerFan3TextField = new javax.swing.JTextField();
        MinerFan4TextField = new javax.swing.JTextField();
        MinerSelectionBox3 = new javax.swing.JComboBox();
        MinerFanSpeedsRefreshButton = new javax.swing.JButton();
        CustomAPICommandPanel = new javax.swing.JPanel();
        CustomAPICommandCurrentMiner = new javax.swing.JLabel();
        CustomCommandEntryLabel = new javax.swing.JLabel();
        CustomCommandEntryTextField = new javax.swing.JTextField();
        CustomCommandOutputScrollPane = new javax.swing.JScrollPane();
        CustomCommandOutputTextArea = new javax.swing.JTextArea();
        CustomCommandOutputLabel = new javax.swing.JLabel();
        CustomCommandSubmitButton = new javax.swing.JButton();
        CustomCommandJsonCheckBox = new javax.swing.JCheckBox();
        CustomCommandMinerSelectionBox = new javax.swing.JComboBox();
        MinerVitalsPanel = new javax.swing.JPanel();
        jScrollPane2 = new javax.swing.JScrollPane();
        MinerVitalStatsTextPane = new javax.swing.JTextPane();
        jLabel1 = new javax.swing.JLabel();
        VitalStatsRefreshButton = new javax.swing.JButton();
        BTCInformationPane = new javax.swing.JPanel();
        BitcoinInformationTabbedPane = new javax.swing.JTabbedPane();
        BTCGenericInformationPanel = new javax.swing.JPanel();
        BTCConversionRateLabel = new javax.swing.JLabel();
        NetworkDifficultyLabel = new javax.swing.JLabel();
        EstimatedPayoutLabel = new javax.swing.JLabel();
        NetworkDifficultyTextField = new javax.swing.JTextField();
        BTCConversionRateTextField = new javax.swing.JTextField();
        EstimatedPayoutTextField = new javax.swing.JTextField();
        CurrentBlockHashLabel = new javax.swing.JLabel();
        CurrentBlockHashTextField = new javax.swing.JTextField();
        CurrentBlockTimeLabel = new javax.swing.JLabel();
        CurrentBlockTimeTextField = new javax.swing.JTextField();
        GenericInformationCurrentMinerLabel = new javax.swing.JLabel();
        MinerSelectionBox5 = new javax.swing.JComboBox();
        BitcoinInformationRefreshButton = new javax.swing.JButton();
        GenericInformationCoinbaseUserLabel = new javax.swing.JLabel();
        GenericInformationCoinbaseUserSelectionBox = new javax.swing.JComboBox();
        GenericInformationAbbreviatedPreferredCurrencyLabel = new javax.swing.JLabel();
        GenericInformationAbbreviatedPreferredCurrencyLabel2 = new javax.swing.JLabel();
        CoinbaseAPIPanel = new javax.swing.JPanel();
        CoinbaseAPILabel = new javax.swing.JLabel();
        CoinbaseAPICurrentUserLabel = new javax.swing.JLabel();
        CoinbaseAPIUserSelectionBox = new javax.swing.JComboBox();
        EligiusPoolInformationPanel = new javax.swing.JPanel();
        EligiusStatusLabel = new javax.swing.JLabel();
        EligiusHashRateInformationScrollPane = new javax.swing.JScrollPane();
        EligiusHashRateInformationTable = new javax.swing.JTable();
        EligiusPayoutInformationPayoutScrollPane = new javax.swing.JScrollPane();
        EligiusPayoutInformationTable = new javax.swing.JTable();
        EligiusPoolInformationRefreshButton = new javax.swing.JButton();
        EligiusPayoutKeyInformationScrollPane = new javax.swing.JScrollPane();
        EligiousPayoutKeyInformationTextPane = new javax.swing.JTextPane();
        EligiusUsernameSelectionBox = new javax.swing.JComboBox();
        EligiusUsernameClipboardCopyButton = new javax.swing.JButton();
        EligiusPoolCurrentUsernameLabel = new javax.swing.JLabel();
        EligiusOpenBrowserButton = new javax.swing.JButton();
        ConfigurationPanel = new javax.swing.JPanel();
        ConfigurationTabbedPane = new javax.swing.JTabbedPane();
        MinerConfigurationPanel = new javax.swing.JPanel();
        ConfigurationPromptLabel = new javax.swing.JLabel();
        ConfigurationRemoveMinerButton = new javax.swing.JButton();
        ConfigurationAddMinerButton = new javax.swing.JButton();
        ConfigurationAddMinerNameLabel = new javax.swing.JLabel();
        ConfigurationAddMinerNameTextField = new javax.swing.JTextField();
        ConfigurationAddMinerIPLabel = new javax.swing.JLabel();
        ConfigurationAddMinerIPTextField = new javax.swing.JTextField();
        ConfigurationMinerPortLabel = new javax.swing.JLabel();
        ConfigurationMinerPortTextField = new javax.swing.JTextField();
        ConfigurationAddMinersLabel = new javax.swing.JLabel();
        ConfigurationRemoveMinersLabel = new javax.swing.JLabel();
        ConfigurationRemoveMinerNameLabel = new javax.swing.JLabel();
        ConfigurationRemoveMinerNameTextField = new javax.swing.JTextField();
        ConfigurationCurrentMinersLabel = new javax.swing.JLabel();
        ConfigurationRemoveMinerIPLabel = new javax.swing.JLabel();
        ConfigurationRemoveMinerIPTextField = new javax.swing.JTextField();
        ConfigurationResolveHostAddressLabel = new javax.swing.JLabel();
        ConfigurationResolveHostAddressTextField = new javax.swing.JTextField();
        ConfigurationResolveHostAddressButton = new javax.swing.JButton();
        ConfigurationCurrentMinersScrollPane = new javax.swing.JScrollPane();
        ConfigurationCurrentMinersTextPane = new javax.swing.JTextPane();
        ConfigurationAlarmPanel = new javax.swing.JPanel();
        ConfigurationAlarmSettingsPromptLabel = new javax.swing.JLabel();
        ConfigurationMinerTemperatureAlarmLabel = new javax.swing.JLabel();
        ConfigurationMinerFanSpeedAlarmLabel = new javax.swing.JLabel();
        ConfigurationMinerHashRateAlarmLabel = new javax.swing.JLabel();
        MinerSelectionForAlarmsBox = new javax.swing.JComboBox();
        AlarmsCurrentMinerLabel = new javax.swing.JLabel();
        ConfigurationAlarmsHWErrPercentLabel = new javax.swing.JLabel();
        ConfigurationMinerTempAlarmTextField = new javax.swing.JTextField();
        ConfigurationFanSpeedAlarmTextField = new javax.swing.JTextField();
        ConfigurationMinerHashRateAlarmTextField = new javax.swing.JTextField();
        ConfigurationMinerHardwareErrPercentAlarmTextField = new javax.swing.JTextField();
        ConfigurationDegreesCelsiusLabel = new javax.swing.JLabel();
        ConfigurationFanRPMLabel = new javax.swing.JLabel();
        ConfigurationHashRatePostfixComboBox = new javax.swing.JComboBox();
        ConfigurationHWErrorPercentLabel = new javax.swing.JLabel();
        ConfigurationMinerTempAlarmUpdateButton = new javax.swing.JButton();
        ConfigurationMinerFanSpeedAlarmUpdateButton = new javax.swing.JButton();
        ConfigurationMinerHashRateAlarmUpdateButton = new javax.swing.JButton();
        ConfigurationMinerHardwareErrPercentAlarmUpdateButton = new javax.swing.JButton();
        ConfigurationCurrentMinerAlarmsScrollPane = new javax.swing.JScrollPane();
        ConfigurationCurrentMinerAlarmsTextPane = new javax.swing.JTextPane();
        ConfigurationCurrentMinerAlarmsLabel = new javax.swing.JLabel();
        ConfigurationEligiusPoolsPanel = new javax.swing.JPanel();
        ConfigurationEligiusLabel = new javax.swing.JLabel();
        ConfigurationMiningPoolPromptLabel = new javax.swing.JLabel();
        ConfigurationEligiusUsernameLabel = new javax.swing.JLabel();
        ConfigurationEligiusUsernameTextField = new javax.swing.JTextField();
        ConfigurationEligiusHelpPromptLabel = new javax.swing.JLabel();
        ConfigurationEligiusUsernameAddButton = new javax.swing.JButton();
        ConfigurationEligiusUsernameRemoveButton = new javax.swing.JButton();
        ConfigurationEligiusExampleLabel = new javax.swing.JLabel();
        ConfigurationCoinExchangePanel = new javax.swing.JPanel();
        ConfigurationCoinbaseLabel = new javax.swing.JLabel();
        ConfigurationCoinbaseCurrencyLabel = new javax.swing.JLabel();
        ConfigurationCoinbaseCurrencyComboBox = new javax.swing.JComboBox();
        CoinbaseConfigurationSeparator = new javax.swing.JSeparator();
        CoinbaseInformationLabel = new javax.swing.JLabel();
        CoinbaseUsernameLabel = new javax.swing.JLabel();
        CoinbaseAPIUsernameTextField = new javax.swing.JTextField();
        CoinbaseAPIKeyLabel = new javax.swing.JLabel();
        CoinbaseAPIKeyTextField = new javax.swing.JTextField();
        CoinbaseAPISecretKeyLabel = new javax.swing.JLabel();
        CoinbaseAPISecretKeyTextField = new javax.swing.JTextField();
        AddCoinbaseUsernameButton = new javax.swing.JButton();
        RemoveCoinbaseUsernameButton = new javax.swing.JButton();
        CurrentCoinbaseConfigurationLabel = new javax.swing.JLabel();
        CoinbaseConfigurationSeparator1 = new javax.swing.JSeparator();
        CurrentCoinbaseConfigurationScrollPane = new javax.swing.JScrollPane();
        CurrentCoinbaseConfigurationTextPane = new javax.swing.JTextPane();
        CoinbaseConfigurationVerticalSeparator = new javax.swing.JSeparator();
        CoinbaseConfigurationInstructionsScrollPane = new javax.swing.JScrollPane();
        CoinbaseConfigurationInstructionsTextPane = new javax.swing.JTextPane();
        CoinbaseConfigurationInstructionsLabel = new javax.swing.JLabel();
        BFGMInerUIMenuBar = new javax.swing.JMenuBar();
        FileMenu = new javax.swing.JMenu();
        FileExitMenuItem = new javax.swing.JMenuItem();
        EditMenu = new javax.swing.JMenu("Edit");
        CopyMenuItem = new javax.swing.JMenuItem(new DefaultEditorKit.CopyAction());
        PasteMenuItem = new javax.swing.JMenuItem(new DefaultEditorKit.PasteAction());
        HelpMenu = new javax.swing.JMenu();
        AppHelpMenuItem = new javax.swing.JMenuItem();
        AboutMenuItem = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("PlanetCrypto Bitcoin");
        setBackground(new java.awt.Color(204, 255, 255));

        MainTabbedPane.setToolTipText("");
        MainTabbedPane.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        MainTabbedPane.setName(""); // NOI18N

        MinerInformationTabbedPane.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N

        ArrayList<String> miners = new ArrayList<>();
        existing_miners = currentMiners();
        //jComboBox1.
        if (existing_miners.get(0) == null) {
            miners.add("No Miners");
        } else {
            for (int i = 0; i < existing_miners.size(); i++) {
                miners.add(existing_miners.get(i).get("name"));
            }
        }
        MinerSelectionBox.setModel(new javax.swing.DefaultComboBoxModel(miners.toArray()));
        MinerSelectionBox.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                MinerSelectionBoxActionPerformed(evt);
            }
        });
        MinerSelectionBoxActionPerformed(null);

        MinerSelectionBoxLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        MinerSelectionBoxLabel.setText("Current Miner:");

        InformationMinerIPLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        InformationMinerIPLabel.setText("Miner IP:");

        /*
        if (existing_miners.get(MinerSelectionBox.getSelectedIndex()).get("name").equals("None")) {
        InformationMinerIPTextField.setText("None");
        } else {
        InformationMinerIPTextField.setText(existing_miners.get(MinerSelectionBox.getSelectedIndex()).get("ip"));
        }
        */
        InformationMinerIPTextField.setEditable(false);

        InformationMinerPortLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        InformationMinerPortLabel.setText("Miner Port:");

        InformationMinerPortTextField.setEditable(false);
        /*
        if (existing_miners.get(MinerSelectionBox.getSelectedIndex()) == null) {
        InformationMinerPortTextField.setText("None");
        } else {
        InformationMinerPortTextField.setText(existing_miners.get(MinerSelectionBox.getSelectedIndex()).get("port"));
        }
        */

        PrivilegedLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        PrivilegedLabel.setText("Privileged: ");

        ASICsLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        ASICsLabel.setText("ASICs:");

        PrivilegedTextField.setEditable(false);
        /*
        if (existing_miners.get(MinerSelectionBox.getSelectedIndex()) ==null) {
        PrivilegedTextField.setText("None");
        } else {
        String privileged = api_Commands.parseArgs(existing_miners.get(MinerSelectionBox.getSelectedIndex()).get("ip"), existing_miners.get(MinerSelectionBox.getSelectedIndex()).get("port"), "privileged");
        String status = api_Commands.getKeys(privileged, "STATUS");
        if (status.equals("E")) {
            PrivilegedTextField.setText("False");
        } else {
            PrivilegedTextField.setText("True");
        }
        }
        */

        ASICsTextField.setEditable(false);

        PGAsLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        PGAsLabel.setText("PGAs:");

        PGAsTextField.setEditable(false);

        PoolCountLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        PoolCountLabel.setText("Pool Count:");

        PoolCountTextField.setEditable(false);

        MinerVersionLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        MinerVersionLabel.setText("Version:");

        MinerVersionTextField.setEditable(false);

        MinerStrategyLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        MinerStrategyLabel.setText("Strategy:");

        MinerStrategyTextField.setEditable(false);

        ACSChain1Label.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        ACSChain1Label.setText("ACS Chain 1:");

        ACSChain1TextField.setEditable(false);

        ACSChain2Label.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        ACSChain2Label.setText("ACS Chain 2:");

        ACSChain3Label.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        ACSChain3Label.setText("ACS Chain 3:");

        ACSChain4Label.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        ACSChain4Label.setText("ACS Chain 4:");

        ACSChain2TextField.setEditable(false);

        ACSChain3TextField.setEditable(false);

        ACSChain4TextField.setEditable(false);

        BytesSentLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        BytesSentLabel.setText("Bytes Sent:");

        BytesRecvLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        BytesRecvLabel.setText("Bytes Recv:");

        BytesSentTextField.setEditable(false);

        BytesRecvTextField.setEditable(false);

        HWErrorPercentLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        HWErrorPercentLabel.setText("HW Error  %:");

        HWErrorPercentageTextField.setEditable(false);

        HWErrorsLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        HWErrorsLabel.setText("HW Errors:");

        HWErrorsTextField.setEditable(false);

        ACSChainInformationLabel.setText("For ACS chains: x = Not Well; o = Well");

        MinerGenericInformationRefreshButton.setText("Refresh");
        MinerGenericInformationRefreshButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                MinerGenericInformationRefreshButtonActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout InformationPanelLayout = new javax.swing.GroupLayout(InformationPanel);
        InformationPanel.setLayout(InformationPanelLayout);
        InformationPanelLayout.setHorizontalGroup(InformationPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(InformationPanelLayout.createSequentialGroup().addContainerGap()
                        .addGroup(InformationPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(InformationPanelLayout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                        .addGroup(InformationPanelLayout.createSequentialGroup()
                                                .addComponent(ACSChainInformationLabel).addGap(51, 51, 51))
                                        .addGroup(InformationPanelLayout.createSequentialGroup()
                                                .addGroup(InformationPanelLayout
                                                        .createParallelGroup(
                                                                javax.swing.GroupLayout.Alignment.TRAILING)
                                                        .addGroup(InformationPanelLayout
                                                                .createParallelGroup(
                                                                        javax.swing.GroupLayout.Alignment.LEADING)
                                                                .addComponent(MinerSelectionBoxLabel)
                                                                .addComponent(InformationMinerIPLabel)
                                                                .addComponent(ASICsLabel,
                                                                        javax.swing.GroupLayout.PREFERRED_SIZE, 53,
                                                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                                                .addComponent(PGAsLabel)
                                                                .addComponent(PoolCountLabel)
                                                                .addComponent(MinerVersionLabel))
                                                        .addComponent(PrivilegedLabel,
                                                                javax.swing.GroupLayout.Alignment.LEADING))
                                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                                .addGroup(InformationPanelLayout
                                                        .createParallelGroup(
                                                                javax.swing.GroupLayout.Alignment.TRAILING, false)
                                                        .addComponent(ACSChain3TextField,
                                                                javax.swing.GroupLayout.Alignment.LEADING)
                                                        .addComponent(ACSChain2TextField,
                                                                javax.swing.GroupLayout.Alignment.LEADING)
                                                        .addComponent(ACSChain4TextField)
                                                        .addGroup(javax.swing.GroupLayout.Alignment.LEADING,
                                                                InformationPanelLayout.createSequentialGroup()
                                                                        .addGroup(InformationPanelLayout
                                                                                .createParallelGroup(
                                                                                        javax.swing.GroupLayout.Alignment.TRAILING,
                                                                                        false)
                                                                                .addComponent(MinerVersionTextField,
                                                                                        javax.swing.GroupLayout.Alignment.LEADING)
                                                                                .addComponent(
                                                                                        InformationMinerIPTextField,
                                                                                        javax.swing.GroupLayout.Alignment.LEADING)
                                                                                .addComponent(PrivilegedTextField,
                                                                                        javax.swing.GroupLayout.Alignment.LEADING,
                                                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                                        173, Short.MAX_VALUE)
                                                                                .addComponent(ASICsTextField,
                                                                                        javax.swing.GroupLayout.Alignment.LEADING)
                                                                                .addComponent(PGAsTextField,
                                                                                        javax.swing.GroupLayout.Alignment.LEADING)
                                                                                .addComponent(PoolCountTextField,
                                                                                        javax.swing.GroupLayout.Alignment.LEADING)
                                                                                .addComponent(MinerSelectionBox,
                                                                                        javax.swing.GroupLayout.Alignment.LEADING,
                                                                                        0,
                                                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                                        Short.MAX_VALUE))
                                                                        .addGroup(InformationPanelLayout
                                                                                .createParallelGroup(
                                                                                        javax.swing.GroupLayout.Alignment.LEADING)
                                                                                .addGroup(InformationPanelLayout
                                                                                        .createSequentialGroup()
                                                                                        .addPreferredGap(
                                                                                                javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                                                                        .addGroup(
                                                                                                InformationPanelLayout
                                                                                                        .createParallelGroup(
                                                                                                                javax.swing.GroupLayout.Alignment.LEADING,
                                                                                                                false)
                                                                                                        .addGroup(
                                                                                                                InformationPanelLayout
                                                                                                                        .createSequentialGroup()
                                                                                                                        .addGroup(
                                                                                                                                InformationPanelLayout
                                                                                                                                        .createParallelGroup(
                                                                                                                                                javax.swing.GroupLayout.Alignment.LEADING)
                                                                                                                                        .addComponent(
                                                                                                                                                BytesRecvLabel)
                                                                                                                                        .addComponent(
                                                                                                                                                HWErrorPercentLabel)
                                                                                                                                        .addComponent(
                                                                                                                                                HWErrorsLabel)
                                                                                                                                        .addComponent(
                                                                                                                                                MinerStrategyLabel))
                                                                                                                        .addGap(18,
                                                                                                                                18,
                                                                                                                                18)
                                                                                                                        .addGroup(
                                                                                                                                InformationPanelLayout
                                                                                                                                        .createParallelGroup(
                                                                                                                                                javax.swing.GroupLayout.Alignment.LEADING,
                                                                                                                                                false)
                                                                                                                                        .addComponent(
                                                                                                                                                HWErrorsTextField,
                                                                                                                                                javax.swing.GroupLayout.Alignment.TRAILING)
                                                                                                                                        .addComponent(
                                                                                                                                                HWErrorPercentageTextField)
                                                                                                                                        .addComponent(
                                                                                                                                                BytesRecvTextField)
                                                                                                                                        .addComponent(
                                                                                                                                                MinerStrategyTextField,
                                                                                                                                                javax.swing.GroupLayout.PREFERRED_SIZE,
                                                                                                                                                172,
                                                                                                                                                javax.swing.GroupLayout.PREFERRED_SIZE)))
                                                                                                        .addGroup(
                                                                                                                InformationPanelLayout
                                                                                                                        .createSequentialGroup()
                                                                                                                        .addGroup(
                                                                                                                                InformationPanelLayout
                                                                                                                                        .createParallelGroup(
                                                                                                                                                javax.swing.GroupLayout.Alignment.LEADING,
                                                                                                                                                false)
                                                                                                                                        .addComponent(
                                                                                                                                                InformationMinerPortLabel,
                                                                                                                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                                                                                                89,
                                                                                                                                                Short.MAX_VALUE)
                                                                                                                                        .addComponent(
                                                                                                                                                BytesSentLabel,
                                                                                                                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                                                                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                                                                                                Short.MAX_VALUE))
                                                                                                                        .addGap(18,
                                                                                                                                18,
                                                                                                                                18)
                                                                                                                        .addGroup(
                                                                                                                                InformationPanelLayout
                                                                                                                                        .createParallelGroup(
                                                                                                                                                javax.swing.GroupLayout.Alignment.LEADING)
                                                                                                                                        .addComponent(
                                                                                                                                                BytesSentTextField)
                                                                                                                                        .addComponent(
                                                                                                                                                InformationMinerPortTextField)))))
                                                                                .addGroup(InformationPanelLayout
                                                                                        .createSequentialGroup()
                                                                                        .addGap(31, 31, 31)
                                                                                        .addComponent(
                                                                                                MinerGenericInformationRefreshButton))))
                                                        .addComponent(ACSChain1TextField,
                                                                javax.swing.GroupLayout.Alignment.LEADING,
                                                                javax.swing.GroupLayout.PREFERRED_SIZE, 458,
                                                                javax.swing.GroupLayout.PREFERRED_SIZE))
                                                .addGap(41, 41, 41)))
                                .addComponent(ACSChain1Label).addComponent(ACSChain2Label)
                                .addComponent(ACSChain3Label).addComponent(ACSChain4Label))));
        InformationPanelLayout.setVerticalGroup(InformationPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(InformationPanelLayout.createSequentialGroup().addContainerGap()
                        .addGroup(InformationPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(MinerSelectionBox, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(MinerSelectionBoxLabel)
                                .addComponent(MinerGenericInformationRefreshButton))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(InformationPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(InformationMinerIPLabel)
                                .addComponent(InformationMinerIPTextField, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(InformationMinerPortLabel).addComponent(InformationMinerPortTextField,
                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(InformationPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(PrivilegedLabel).addComponent(BytesSentLabel)
                                .addComponent(BytesSentTextField, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(PrivilegedTextField, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(InformationPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(ASICsLabel)
                                .addComponent(ASICsTextField, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(BytesRecvLabel)
                                .addComponent(BytesRecvTextField, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(InformationPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(PGAsLabel)
                                .addComponent(PGAsTextField, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(HWErrorsLabel)
                                .addComponent(HWErrorsTextField, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(InformationPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(PoolCountLabel)
                                .addComponent(PoolCountTextField, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(HWErrorPercentLabel).addComponent(HWErrorPercentageTextField,
                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(InformationPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(MinerVersionLabel)
                                .addComponent(MinerVersionTextField, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(MinerStrategyLabel).addComponent(MinerStrategyTextField,
                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(InformationPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(ACSChain1Label).addComponent(ACSChain1TextField,
                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(InformationPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(ACSChain2Label).addComponent(ACSChain2TextField,
                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(InformationPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(ACSChain3Label).addComponent(ACSChain3TextField,
                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(InformationPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(ACSChain4Label).addComponent(ACSChain4TextField,
                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(18, 18, 18).addComponent(ACSChainInformationLabel).addGap(41, 41, 41)));

        MinerInformationTabbedPane.addTab("Information", InformationPanel);

        MinerHashRatesPanel.add(MinerSelectionBox);

        HashRatesCurrentMiner.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        HashRatesCurrentMiner.setText("Current Miner:");

        MinerCurrentHashLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        MinerCurrentHashLabel.setText("Current Hash:");

        MinerCurrentHashTextField.setEditable(false);

        MinerAverageHashLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        MinerAverageHashLabel.setText("Average Hash:");

        MinerAverageHashTextField.setEditable(false);

        MinerFoundBlocksLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        MinerFoundBlocksLabel.setText("Found Blocks:");

        MinerAcceptedLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        MinerAcceptedLabel.setText("Accepted:");

        MinerRejectedLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        MinerRejectedLabel.setText("Rejected:");

        MinerBestShareLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        MinerBestShareLabel.setText("Best Share:");

        MinerNetworkBlocksLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        MinerNetworkBlocksLabel.setText("Network Blocks:");

        MinerFoundBlocksTextField.setEditable(false);

        MinerAcceptedTextField.setEditable(false);

        MinerRejectedTextField.setEditable(false);

        MinerBestShareTextField.setEditable(false);

        MinerNetworkBlocksTextField.setEditable(false);

        MinerSelectionBox1.setModel(new javax.swing.DefaultComboBoxModel(miners.toArray()));

        org.jdesktop.beansbinding.Binding binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(
                org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, MinerSelectionBox,
                org.jdesktop.beansbinding.ELProperty.create("${selectedItem}"), MinerSelectionBox1,
                org.jdesktop.beansbinding.BeanProperty.create("selectedItem"));
        bindingGroup.addBinding(binding);

        MinerHashRatesRefreshButton.setText("Refresh");
        MinerHashRatesRefreshButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                MinerHashRatesRefreshButtonActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout MinerHashRatesPanelLayout = new javax.swing.GroupLayout(MinerHashRatesPanel);
        MinerHashRatesPanel.setLayout(MinerHashRatesPanelLayout);
        MinerHashRatesPanelLayout.setHorizontalGroup(MinerHashRatesPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(MinerHashRatesPanelLayout.createSequentialGroup().addContainerGap()
                        .addGroup(MinerHashRatesPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(HashRatesCurrentMiner).addComponent(MinerCurrentHashLabel)
                                .addComponent(MinerAverageHashLabel).addComponent(MinerFoundBlocksLabel)
                                .addComponent(MinerAcceptedLabel).addComponent(MinerRejectedLabel)
                                .addComponent(MinerBestShareLabel).addComponent(MinerNetworkBlocksLabel))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(MinerHashRatesPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(MinerHashRatesPanelLayout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                        .addComponent(MinerCurrentHashTextField)
                                        .addComponent(MinerAverageHashTextField)
                                        .addComponent(MinerFoundBlocksTextField)
                                        .addComponent(MinerAcceptedTextField).addComponent(MinerRejectedTextField)
                                        .addComponent(MinerBestShareTextField)
                                        .addComponent(MinerNetworkBlocksTextField,
                                                javax.swing.GroupLayout.DEFAULT_SIZE, 100, Short.MAX_VALUE))
                                .addGroup(MinerHashRatesPanelLayout.createSequentialGroup()
                                        .addComponent(MinerSelectionBox1, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                173, javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(MinerHashRatesRefreshButton)))
                        .addContainerGap(440, Short.MAX_VALUE)));
        MinerHashRatesPanelLayout.setVerticalGroup(MinerHashRatesPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(MinerHashRatesPanelLayout.createSequentialGroup().addContainerGap()
                        .addGroup(MinerHashRatesPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(HashRatesCurrentMiner)
                                .addComponent(MinerSelectionBox1, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(MinerHashRatesRefreshButton))
                        .addGap(21, 21, 21)
                        .addGroup(MinerHashRatesPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(MinerCurrentHashLabel).addComponent(MinerCurrentHashTextField,
                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(MinerHashRatesPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(MinerAverageHashLabel).addComponent(MinerAverageHashTextField,
                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(MinerHashRatesPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(MinerFoundBlocksLabel).addComponent(MinerFoundBlocksTextField,
                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(MinerHashRatesPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(MinerAcceptedLabel).addComponent(MinerAcceptedTextField,
                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(MinerHashRatesPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(MinerRejectedLabel).addComponent(MinerRejectedTextField,
                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(MinerHashRatesPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(MinerBestShareLabel).addComponent(MinerBestShareTextField,
                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(MinerHashRatesPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(MinerNetworkBlocksLabel).addComponent(MinerNetworkBlocksTextField,
                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)));

        MinerInformationTabbedPane.addTab("Hash Rates", MinerHashRatesPanel);

        TemperatureCurrentMinerLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        TemperatureCurrentMinerLabel.setText("Current Miner:");

        MinerTemp1Label.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        MinerTemp1Label.setText("Temp 1:");

        MinerTemp2Label.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        MinerTemp2Label.setText("Temp 2:");

        MinerTemp3Label.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        MinerTemp3Label.setText("Temp 3:");

        MinerTemp4Label.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        MinerTemp4Label.setText("Temp 4:");

        MinerTempAvgLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        MinerTempAvgLabel.setText("Temp Avg:");

        MinerTempMaxLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        MinerTempMaxLabel.setText("Temp Max");

        MinerTemp1TextField.setEditable(false);

        MinerTemp2TextField.setEditable(false);

        MinerTemp3TextField.setEditable(false);

        MinerTemp4TextField.setEditable(false);

        MinerTempAvgTextField.setEditable(false);

        MinerTextMaxTextField.setEditable(false);

        MinerSelectionBox2.setModel(new javax.swing.DefaultComboBoxModel(miners.toArray()));

        binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(
                org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, MinerSelectionBox1,
                org.jdesktop.beansbinding.ELProperty.create("${selectedItem}"), MinerSelectionBox2,
                org.jdesktop.beansbinding.BeanProperty.create("selectedItem"));
        bindingGroup.addBinding(binding);

        MinerTemperaturesRefreshButton.setText("Refresh");
        MinerTemperaturesRefreshButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                MinerTemperaturesRefreshButtonActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout MinerTemperaturePanelLayout = new javax.swing.GroupLayout(MinerTemperaturePanel);
        MinerTemperaturePanel.setLayout(MinerTemperaturePanelLayout);
        MinerTemperaturePanelLayout.setHorizontalGroup(MinerTemperaturePanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(MinerTemperaturePanelLayout.createSequentialGroup().addContainerGap()
                        .addGroup(MinerTemperaturePanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(TemperatureCurrentMinerLabel).addComponent(MinerTemp1Label)
                                .addComponent(MinerTemp2Label).addComponent(MinerTemp3Label)
                                .addComponent(MinerTemp4Label).addComponent(MinerTempAvgLabel)
                                .addComponent(MinerTempMaxLabel))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(MinerTemperaturePanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(MinerTemperaturePanelLayout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                        .addComponent(MinerTemp1TextField).addComponent(MinerTemp2TextField)
                                        .addComponent(MinerTemp3TextField).addComponent(MinerTemp4TextField)
                                        .addComponent(MinerTempAvgTextField).addComponent(MinerTextMaxTextField,
                                                javax.swing.GroupLayout.DEFAULT_SIZE, 100, Short.MAX_VALUE))
                                .addGroup(MinerTemperaturePanelLayout.createSequentialGroup()
                                        .addComponent(MinerSelectionBox2, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                173, javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(MinerTemperaturesRefreshButton)))
                        .addContainerGap(448, Short.MAX_VALUE)));
        MinerTemperaturePanelLayout.setVerticalGroup(
                MinerTemperaturePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(MinerTemperaturePanelLayout.createSequentialGroup().addContainerGap()
                                .addGroup(MinerTemperaturePanelLayout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                        .addComponent(TemperatureCurrentMinerLabel)
                                        .addComponent(MinerSelectionBox2, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addComponent(MinerTemperaturesRefreshButton))
                                .addGap(21, 21, 21)
                                .addGroup(MinerTemperaturePanelLayout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                        .addComponent(MinerTemp1Label).addComponent(MinerTemp1TextField,
                                                javax.swing.GroupLayout.PREFERRED_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.PREFERRED_SIZE))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addGroup(MinerTemperaturePanelLayout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                        .addComponent(MinerTemp2Label).addComponent(MinerTemp2TextField,
                                                javax.swing.GroupLayout.PREFERRED_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.PREFERRED_SIZE))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addGroup(MinerTemperaturePanelLayout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                        .addComponent(MinerTemp3Label).addComponent(MinerTemp3TextField,
                                                javax.swing.GroupLayout.PREFERRED_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.PREFERRED_SIZE))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addGroup(MinerTemperaturePanelLayout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                        .addComponent(MinerTemp4Label).addComponent(MinerTemp4TextField,
                                                javax.swing.GroupLayout.PREFERRED_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.PREFERRED_SIZE))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addGroup(MinerTemperaturePanelLayout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                        .addComponent(MinerTempAvgLabel).addComponent(MinerTempAvgTextField,
                                                javax.swing.GroupLayout.PREFERRED_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.PREFERRED_SIZE))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addGroup(MinerTemperaturePanelLayout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                        .addComponent(MinerTempMaxLabel).addComponent(MinerTextMaxTextField,
                                                javax.swing.GroupLayout.PREFERRED_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.PREFERRED_SIZE))
                                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)));

        MinerInformationTabbedPane.addTab("Temperatures", MinerTemperaturePanel);

        FansCurrentMinerLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        FansCurrentMinerLabel.setText("Current Miner:");

        MinerFan1Label.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        MinerFan1Label.setText("Fan 1:");

        MinerFan2Label.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        MinerFan2Label.setText("Fan 2:");

        MinerFan3Label.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        MinerFan3Label.setText("Fan 3:");

        MinerFan4Label.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        MinerFan4Label.setText("Fan 4:");

        MinerFan1TextField.setEditable(false);

        MinerFan2TextField.setEditable(false);

        MinerFan3TextField.setEditable(false);

        MinerFan4TextField.setEditable(false);

        MinerSelectionBox3.setModel(new javax.swing.DefaultComboBoxModel(miners.toArray()));

        binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(
                org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, MinerSelectionBox2,
                org.jdesktop.beansbinding.ELProperty.create("${selectedItem}"), MinerSelectionBox3,
                org.jdesktop.beansbinding.BeanProperty.create("selectedItem"));
        bindingGroup.addBinding(binding);

        MinerFanSpeedsRefreshButton.setText("Refresh");
        MinerFanSpeedsRefreshButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                MinerFanSpeedsRefreshButtonActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout MinerFansPanelLayout = new javax.swing.GroupLayout(MinerFansPanel);
        MinerFansPanel.setLayout(MinerFansPanelLayout);
        MinerFansPanelLayout.setHorizontalGroup(MinerFansPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(MinerFansPanelLayout.createSequentialGroup().addContainerGap()
                        .addGroup(MinerFansPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(MinerFansPanelLayout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                        .addComponent(MinerFan3Label, javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                        .addComponent(MinerFan2Label, javax.swing.GroupLayout.Alignment.TRAILING,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                        .addComponent(MinerFan1Label, javax.swing.GroupLayout.Alignment.TRAILING,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                        .addComponent(MinerFan4Label, javax.swing.GroupLayout.Alignment.TRAILING,
                                                javax.swing.GroupLayout.DEFAULT_SIZE, 103, Short.MAX_VALUE))
                                .addComponent(FansCurrentMinerLabel))
                        .addGap(18, 18, 18)
                        .addGroup(MinerFansPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(MinerFansPanelLayout.createSequentialGroup()
                                        .addComponent(MinerSelectionBox3, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                173, javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(MinerFanSpeedsRefreshButton))
                                .addGroup(MinerFansPanelLayout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                        .addComponent(MinerFan4TextField, javax.swing.GroupLayout.Alignment.LEADING)
                                        .addComponent(MinerFan3TextField, javax.swing.GroupLayout.Alignment.LEADING)
                                        .addComponent(MinerFan2TextField, javax.swing.GroupLayout.Alignment.LEADING)
                                        .addComponent(MinerFan1TextField, javax.swing.GroupLayout.Alignment.LEADING,
                                                javax.swing.GroupLayout.DEFAULT_SIZE, 100, Short.MAX_VALUE)))
                        .addContainerGap(442, Short.MAX_VALUE)));
        MinerFansPanelLayout.setVerticalGroup(
                MinerFansPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(MinerFansPanelLayout.createSequentialGroup().addContainerGap()
                                .addGroup(MinerFansPanelLayout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                        .addComponent(FansCurrentMinerLabel)
                                        .addComponent(MinerSelectionBox3, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addComponent(MinerFanSpeedsRefreshButton))
                                .addGap(21, 21, 21)
                                .addGroup(MinerFansPanelLayout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                        .addComponent(MinerFan1Label)
                                        .addComponent(MinerFan1TextField, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.PREFERRED_SIZE))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addGroup(MinerFansPanelLayout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                        .addComponent(MinerFan2TextField, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addComponent(MinerFan2Label))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addGroup(MinerFansPanelLayout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                        .addComponent(MinerFan3Label).addComponent(MinerFan3TextField,
                                                javax.swing.GroupLayout.PREFERRED_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.PREFERRED_SIZE))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addGroup(MinerFansPanelLayout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                        .addComponent(MinerFan4Label).addComponent(MinerFan4TextField,
                                                javax.swing.GroupLayout.PREFERRED_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.PREFERRED_SIZE))
                                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)));

        MinerInformationTabbedPane.addTab("Fans", MinerFansPanel);

        CustomAPICommandCurrentMiner.setText("Current Miner:");

        CustomCommandEntryLabel.setText("Enter Custom Command:");

        CustomCommandOutputTextArea.setEditable(false);
        CustomCommandOutputTextArea.setColumns(20);
        CustomCommandOutputTextArea.setRows(5);
        CustomCommandOutputScrollPane.setViewportView(CustomCommandOutputTextArea);

        CustomCommandOutputLabel.setText("Output:");

        CustomCommandSubmitButton.setText("Submit");
        CustomCommandSubmitButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                CustomCommandSubmitButtonActionPerformed(evt);
            }
        });

        CustomCommandJsonCheckBox.setText("Check for JSON Output");
        CustomCommandJsonCheckBox.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                CustomCommandJsonCheckBoxKeyPressed(evt);
            }
        });

        CustomCommandMinerSelectionBox.setModel(new javax.swing.DefaultComboBoxModel(miners.toArray()));

        binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(
                org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, MinerSelectionBox3,
                org.jdesktop.beansbinding.ELProperty.create("${selectedItem}"), CustomCommandMinerSelectionBox,
                org.jdesktop.beansbinding.BeanProperty.create("selectedItem"));
        bindingGroup.addBinding(binding);

        javax.swing.GroupLayout CustomAPICommandPanelLayout = new javax.swing.GroupLayout(CustomAPICommandPanel);
        CustomAPICommandPanel.setLayout(CustomAPICommandPanelLayout);
        CustomAPICommandPanelLayout.setHorizontalGroup(CustomAPICommandPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(CustomAPICommandPanelLayout.createSequentialGroup().addGap(22, 22, 22)
                        .addGroup(CustomAPICommandPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                .addComponent(CustomCommandOutputScrollPane).addComponent(CustomCommandOutputLabel)
                                .addGroup(CustomAPICommandPanelLayout.createSequentialGroup()
                                        .addComponent(CustomCommandEntryLabel)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                        .addComponent(CustomCommandEntryTextField,
                                                javax.swing.GroupLayout.PREFERRED_SIZE, 121,
                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addGap(18, 18, 18).addComponent(CustomCommandJsonCheckBox)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(CustomCommandSubmitButton))
                                .addGroup(CustomAPICommandPanelLayout.createSequentialGroup()
                                        .addComponent(CustomAPICommandCurrentMiner)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(CustomCommandMinerSelectionBox,
                                                javax.swing.GroupLayout.PREFERRED_SIZE, 173,
                                                javax.swing.GroupLayout.PREFERRED_SIZE)))
                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)));
        CustomAPICommandPanelLayout.setVerticalGroup(CustomAPICommandPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(CustomAPICommandPanelLayout.createSequentialGroup().addContainerGap()
                        .addGroup(CustomAPICommandPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(CustomAPICommandCurrentMiner).addComponent(
                                        CustomCommandMinerSelectionBox, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(20, 20, 20)
                        .addGroup(CustomAPICommandPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(CustomCommandEntryLabel)
                                .addComponent(CustomCommandEntryTextField, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(CustomCommandSubmitButton).addComponent(CustomCommandJsonCheckBox))
                        .addGap(18, 18, 18).addComponent(CustomCommandOutputLabel).addGap(7, 7, 7)
                        .addComponent(CustomCommandOutputScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 234,
                                javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)));

        MinerInformationTabbedPane.addTab("Custom Command", CustomAPICommandPanel);

        //System.out.println(existing_miners.toString());
        MinerVitalStatsTextPane.setContentType("text/html");
        MinerVitalStatsTextPane.setEditable(false);
        MinerVitalStatsTextPane.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
            public void propertyChange(java.beans.PropertyChangeEvent evt) {
                MinerVitalStatsTextPanePropertyChange(evt);
            }
        });
        jScrollPane2.setViewportView(MinerVitalStatsTextPane);

        jLabel1.setFont(new java.awt.Font("DejaVu Sans", 3, 14)); // NOI18N
        jLabel1.setText("Vital Miner Statistics");

        VitalStatsRefreshButton.setText("Refresh");
        VitalStatsRefreshButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                VitalStatsRefreshButtonActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout MinerVitalsPanelLayout = new javax.swing.GroupLayout(MinerVitalsPanel);
        MinerVitalsPanel.setLayout(MinerVitalsPanelLayout);
        MinerVitalsPanelLayout.setHorizontalGroup(
                MinerVitalsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(MinerVitalsPanelLayout.createSequentialGroup().addContainerGap()
                                .addGroup(MinerVitalsPanelLayout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                        .addGroup(MinerVitalsPanelLayout.createSequentialGroup()
                                                .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                        645, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                                .addComponent(VitalStatsRefreshButton))
                                        .addComponent(jLabel1))
                                .addContainerGap(93, Short.MAX_VALUE)));
        MinerVitalsPanelLayout.setVerticalGroup(MinerVitalsPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(MinerVitalsPanelLayout.createSequentialGroup().addGap(16, 16, 16).addComponent(jLabel1)
                        .addGap(18, 18, 18)
                        .addGroup(MinerVitalsPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 306,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(VitalStatsRefreshButton))
                        .addContainerGap(229, Short.MAX_VALUE)));

        MinerInformationTabbedPane.addTab("Vitals", MinerVitalsPanel);

        javax.swing.GroupLayout MinerInformationPanelLayout = new javax.swing.GroupLayout(MinerInformationPanel);
        MinerInformationPanel.setLayout(MinerInformationPanelLayout);
        MinerInformationPanelLayout.setHorizontalGroup(
                MinerInformationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(MinerInformationTabbedPane));
        MinerInformationPanelLayout.setVerticalGroup(
                MinerInformationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(MinerInformationPanelLayout.createSequentialGroup().addContainerGap()
                                .addComponent(MinerInformationTabbedPane, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        615, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)));

        MainTabbedPane.addTab("Miners", MinerInformationPanel);

        BTCConversionRateLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        BTCConversionRateLabel.setText("BTC Conversion Rate:");

        NetworkDifficultyLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        NetworkDifficultyLabel.setText("Network Difficulty:");

        EstimatedPayoutLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        EstimatedPayoutLabel.setText("Estimated Payout:");

        NetworkDifficultyTextField.setEditable(false);

        BTCConversionRateTextField.setEditable(false);
        BTCConversionRateTextField.setText("Not configured yet");

        EstimatedPayoutTextField.setEditable(false);

        CurrentBlockHashLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        CurrentBlockHashLabel.setText("Current Block Hash:");

        CurrentBlockHashTextField.setEditable(false);

        CurrentBlockTimeLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        CurrentBlockTimeLabel.setText("Current Block Time:");

        CurrentBlockTimeTextField.setEditable(false);

        GenericInformationCurrentMinerLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        GenericInformationCurrentMinerLabel.setText("Current Miner:");

        MinerSelectionBox5.setModel(new javax.swing.DefaultComboBoxModel(miners.toArray()));

        binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(
                org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, CustomCommandMinerSelectionBox,
                org.jdesktop.beansbinding.ELProperty.create("${selectedItem}"), MinerSelectionBox5,
                org.jdesktop.beansbinding.BeanProperty.create("selectedItem"));
        bindingGroup.addBinding(binding);

        BitcoinInformationRefreshButton.setText("Refresh");
        BitcoinInformationRefreshButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                BitcoinInformationRefreshButtonActionPerformed(evt);
            }
        });

        GenericInformationCoinbaseUserLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        GenericInformationCoinbaseUserLabel.setText("Current Coinbase User:");

        existing_coinbase = currentCoinbase();
        ;
        ArrayList<String> coinbase_users = new ArrayList<>();
        if (existing_coinbase == null) {
            coinbase_users.add("No Users");
        } else {
            for (int i = 0; i < existing_coinbase.size(); i++) {
                coinbase_users.add(existing_coinbase.get(i).get("email"));
            }
        }
        GenericInformationCoinbaseUserSelectionBox
                .setModel(new javax.swing.DefaultComboBoxModel(coinbase_users.toArray()));
        GenericInformationCoinbaseUserSelectionBox.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                GenericInformationCoinbaseUserSelectionBoxActionPerformed(evt);
            }
        });

        GenericInformationAbbreviatedPreferredCurrencyLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        GenericInformationAbbreviatedPreferredCurrencyLabel
                .addPropertyChangeListener(new java.beans.PropertyChangeListener() {
                    public void propertyChange(java.beans.PropertyChangeEvent evt) {
                        GenericInformationAbbreviatedPreferredCurrencyLabelPropertyChange(evt);
                    }
                });

        GenericInformationAbbreviatedPreferredCurrencyLabel2.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N

        binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(
                org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE,
                GenericInformationAbbreviatedPreferredCurrencyLabel,
                org.jdesktop.beansbinding.ELProperty.create("${text}"),
                GenericInformationAbbreviatedPreferredCurrencyLabel2,
                org.jdesktop.beansbinding.BeanProperty.create("text"));
        bindingGroup.addBinding(binding);

        javax.swing.GroupLayout BTCGenericInformationPanelLayout = new javax.swing.GroupLayout(
                BTCGenericInformationPanel);
        BTCGenericInformationPanel.setLayout(BTCGenericInformationPanelLayout);
        BTCGenericInformationPanelLayout.setHorizontalGroup(BTCGenericInformationPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(BTCGenericInformationPanelLayout.createSequentialGroup().addContainerGap()
                        .addGroup(BTCGenericInformationPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(EstimatedPayoutLabel).addComponent(BTCConversionRateLabel)
                                .addComponent(NetworkDifficultyLabel).addComponent(CurrentBlockHashLabel)
                                .addComponent(GenericInformationCurrentMinerLabel)
                                .addComponent(CurrentBlockTimeLabel)
                                .addComponent(GenericInformationCoinbaseUserLabel))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(BTCGenericInformationPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(BTCGenericInformationPanelLayout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                        .addComponent(CurrentBlockHashTextField,
                                                javax.swing.GroupLayout.PREFERRED_SIZE, 559,
                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addGroup(BTCGenericInformationPanelLayout.createSequentialGroup()
                                                .addComponent(MinerSelectionBox5,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE, 173,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                                .addComponent(BitcoinInformationRefreshButton))
                                        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING,
                                                BTCGenericInformationPanelLayout.createSequentialGroup()
                                                        .addGroup(BTCGenericInformationPanelLayout
                                                                .createParallelGroup(
                                                                        javax.swing.GroupLayout.Alignment.TRAILING)
                                                                .addComponent(EstimatedPayoutTextField,
                                                                        javax.swing.GroupLayout.Alignment.LEADING)
                                                                .addComponent(BTCConversionRateTextField))
                                                        .addPreferredGap(
                                                                javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                                        .addGroup(BTCGenericInformationPanelLayout
                                                                .createParallelGroup(
                                                                        javax.swing.GroupLayout.Alignment.LEADING,
                                                                        false)
                                                                .addComponent(
                                                                        GenericInformationAbbreviatedPreferredCurrencyLabel,
                                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                        Short.MAX_VALUE)
                                                                .addComponent(
                                                                        GenericInformationAbbreviatedPreferredCurrencyLabel2,
                                                                        javax.swing.GroupLayout.DEFAULT_SIZE, 89,
                                                                        Short.MAX_VALUE))
                                                        .addGap(184, 184, 184))
                                        .addComponent(NetworkDifficultyTextField,
                                                javax.swing.GroupLayout.PREFERRED_SIZE, 280,
                                                javax.swing.GroupLayout.PREFERRED_SIZE))
                                .addComponent(CurrentBlockTimeTextField, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        280, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(GenericInformationCoinbaseUserSelectionBox,
                                        javax.swing.GroupLayout.PREFERRED_SIZE, 255,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addContainerGap()));
        BTCGenericInformationPanelLayout.setVerticalGroup(BTCGenericInformationPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(BTCGenericInformationPanelLayout.createSequentialGroup().addGap(3, 3, 3)
                        .addGroup(BTCGenericInformationPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(GenericInformationCurrentMinerLabel)
                                .addComponent(MinerSelectionBox5, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(BitcoinInformationRefreshButton))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(BTCGenericInformationPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(GenericInformationCoinbaseUserLabel)
                                .addComponent(GenericInformationCoinbaseUserSelectionBox,
                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(7, 7, 7)
                        .addGroup(BTCGenericInformationPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(NetworkDifficultyTextField, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(NetworkDifficultyLabel))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(BTCGenericInformationPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(CurrentBlockHashTextField, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(CurrentBlockHashLabel))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(BTCGenericInformationPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(CurrentBlockTimeTextField, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(CurrentBlockTimeLabel))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(BTCGenericInformationPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(BTCConversionRateTextField, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(BTCConversionRateLabel)
                                .addComponent(GenericInformationAbbreviatedPreferredCurrencyLabel,
                                        javax.swing.GroupLayout.PREFERRED_SIZE, 27,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(BTCGenericInformationPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(GenericInformationAbbreviatedPreferredCurrencyLabel2,
                                        javax.swing.GroupLayout.Alignment.TRAILING,
                                        javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE,
                                        Short.MAX_VALUE)
                                .addGroup(BTCGenericInformationPanelLayout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                        .addComponent(EstimatedPayoutLabel).addComponent(EstimatedPayoutTextField,
                                                javax.swing.GroupLayout.PREFERRED_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.PREFERRED_SIZE)))
                        .addGap(372, 372, 372)));

        BitcoinInformationTabbedPane.addTab("Generic Information", BTCGenericInformationPanel);

        CoinbaseAPILabel.setFont(new java.awt.Font("DejaVu Serif", 3, 14)); // NOI18N
        CoinbaseAPILabel.setText("Buy, Sell, Trade BTC Here");

        CoinbaseAPICurrentUserLabel.setText("Current Coinbase User");

        CoinbaseAPIUserSelectionBox.setModel(new javax.swing.DefaultComboBoxModel(existingCoinbase().toArray()));

        binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(
                org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE,
                GenericInformationCoinbaseUserSelectionBox,
                org.jdesktop.beansbinding.ELProperty.create("${selectedItem}"), CoinbaseAPIUserSelectionBox,
                org.jdesktop.beansbinding.BeanProperty.create("selectedItem"));
        bindingGroup.addBinding(binding);

        javax.swing.GroupLayout CoinbaseAPIPanelLayout = new javax.swing.GroupLayout(CoinbaseAPIPanel);
        CoinbaseAPIPanel.setLayout(CoinbaseAPIPanelLayout);
        CoinbaseAPIPanelLayout.setHorizontalGroup(
                CoinbaseAPIPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(CoinbaseAPIPanelLayout.createSequentialGroup().addContainerGap()
                                .addGroup(CoinbaseAPIPanelLayout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                        .addComponent(CoinbaseAPILabel, javax.swing.GroupLayout.PREFERRED_SIZE, 351,
                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addGroup(CoinbaseAPIPanelLayout.createSequentialGroup()
                                                .addComponent(CoinbaseAPICurrentUserLabel)
                                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                                .addComponent(CoinbaseAPIUserSelectionBox, 0,
                                                        javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                                .addContainerGap(469, Short.MAX_VALUE)));
        CoinbaseAPIPanelLayout.setVerticalGroup(CoinbaseAPIPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(CoinbaseAPIPanelLayout.createSequentialGroup().addGap(18, 18, 18)
                        .addComponent(CoinbaseAPILabel)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(CoinbaseAPIPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(CoinbaseAPICurrentUserLabel).addComponent(CoinbaseAPIUserSelectionBox,
                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addContainerGap(526, Short.MAX_VALUE)));

        BitcoinInformationTabbedPane.addTab("Coinbase API", CoinbaseAPIPanel);

        EligiusStatusLabel.setFont(new java.awt.Font("DejaVu Serif", 3, 14)); // NOI18N

        binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(
                org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, EligiusUsernameSelectionBox,
                org.jdesktop.beansbinding.ELProperty.create("${selectedItem}"), EligiusStatusLabel,
                org.jdesktop.beansbinding.BeanProperty.create("text"));
        bindingGroup.addBinding(binding);

        /*
        org.planetcrypto.bitcoin.PlanetCryptoNetworkMethods parser = new org.planetcrypto.bitcoin.PlanetCryptoNetworkMethods();
        ArrayList<String> eligius_names = cfg.getEligius();
        //System.out.println(eligius_names);
        EligiusUsernameSelectionBox.setModel(new javax.swing.DefaultComboBoxModel(eligius_names.toArray()));
        String eligius_name = EligiusUsernameSelectionBox.getSelectedItem().toString();
            
        if (eligius_name.startsWith("Eligius not configured")) {
        EligiusHashRateInformationTable.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {"12 Hours", null, null},
                {"3 Hours", null, null},
                {"22.5 Minutes", null, null},
                {"256 Seconds", null, null},
                {"128 Seconds", null, null}
            },
            new String [] {
                "Interval", "Hashrate", "Weighted Shares"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.String.class, java.lang.String.class, java.lang.Integer.class
            };
            boolean[] canEdit = new boolean [] {
                false, false, false
            };
            
            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }
            
            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        } else {
        String hashrates = parser.getHashRate("&username=" + eligius_name);
        EligiusHashRateInformationTable.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {"12 Hours", parser.getHashRateIntervals(hashrates, "av43200").get(0), parser.getHashRateIntervals(hashrates, "av43200").get(1)},
                {"3 Hours", parser.getHashRateIntervals(hashrates, "av10800").get(0), parser.getHashRateIntervals(hashrates, "av10800").get(1)},
                {"22.5 Minutes", parser.getHashRateIntervals(hashrates, "av1350").get(0), parser.getHashRateIntervals(hashrates, "av1350").get(1)},
                {"256 Seconds", parser.getHashRateIntervals(hashrates, "av256").get(0), parser.getHashRateIntervals(hashrates, "av256").get(1)},
                {"128 Seconds", parser.getHashRateIntervals(hashrates, "av128").get(0), parser.getHashRateIntervals(hashrates, "av128").get(1)}
            },
            new String [] {
                "Interval", "Hashrate", "Weighted Shares"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.String.class, java.lang.String.class, java.lang.Integer.class
            };
            boolean[] canEdit = new boolean [] {
                false, false, false
            };
            
            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }
            
            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        }
        cfg.closeAll();
        EligiusHashRateInformationScrollPane.setViewportView(EligiusHashRateInformationTable);
        */
        EligiusPoolInformationRefreshButtonActionPerformed(null);

        /*
        Thread t = new Thread(new Runnable() {
        @Override
        public void run() {
            eligius_name = EligiusUsernameSelectionBox.getSelectedItem().toString();
            if (eligius_name.startsWith("Eligius not configured")) {
                EligiusPayoutInformationTable.setModel(new javax.swing.table.DefaultTableModel(
                    new Object [][] {
                        {"bal", null},
                        {"ec", null},
                        {"everpaid", null},
                        {"lbal", null},
                        {"lec", null}
                    },
                    new String [] {
                        "", "Amount"
                    }
                ) {
                    Class[] types = new Class [] {
                        java.lang.String.class, java.lang.String.class, java.lang.Integer.class
                    };
                    boolean[] canEdit = new boolean [] {
                        false, false, false
                    };
            
                    public Class getColumnClass(int columnIndex) {
                        return types [columnIndex];
                    }
            
                    public boolean isCellEditable(int rowIndex, int columnIndex) {
                        return canEdit [columnIndex];
                    }}
                );
            } else {
                String stats = parser.getUserStat("&username=" + eligius_name);
                EligiusPayoutInformationTable.setModel(new javax.swing.table.DefaultTableModel(
                    new Object [][] {
                        {"bal", parser.getUserStats(stats, "bal")},
                        {"ec", parser.getUserStats(stats, "ec")},
                        {"everpaid", parser.getUserStats(stats, "everpaid")},
                        {"lbal", parser.getUserStats(stats, "lbal")},
                        {"lec", parser.getUserStats(stats, "lec")}
                    },
                    new String [] {
                        "", "Amount"
                    }
                ) {
                    Class[] types = new Class [] {
                        java.lang.String.class, java.lang.String.class, java.lang.Integer.class
                    };
                    boolean[] canEdit = new boolean [] {
                        false, false, false
                    };
            
                    public Class getColumnClass(int columnIndex) {
                        return types [columnIndex];
                    }
            
                    public boolean isCellEditable(int rowIndex, int columnIndex) {
                        return canEdit [columnIndex];
                    }}
                );
                BFGMinerAPICoinbase coinbase = new BFGMinerAPICoinbase();
                String rate = coinbase.getContent("https://coinbase.com/api/v1/currencies/exchange_rates", "btc_to_usd");
                String payout = EligiusPayoutInformationTable.getValueAt(0, 1).toString().replace(" BTC", "");
                BTCConversionRateTextField.setText(rate);
                EstimatedPayoutTextField.setText(String.valueOf(Float.parseFloat(rate)* Float.parseFloat(payout)));
            
            }
            //BFGMinerAPICoinbase coinbase = new BFGMinerAPICoinbase();
            //BTCConversionRateTextField.setText(coinbase.getContent("https://coinbase.com/api/v1/currencies/exchange_rates", "btc_to_usd"));
            //if (EligiusPayoutInformationTable.getValueAt(0, 1) != null) {
                //    System.out.println(EligiusPayoutInformationTable.getValueAt(0, 1).toString());
                //} else {
                //    System.out.println("No Value yet");
                //}
            EligiusPayoutInformationTable.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
                public void propertyChange(java.beans.PropertyChangeEvent evt) {
                    EligiusPayoutInformationTablePropertyChange(evt);
                }
            });
            EligiusPayoutInformationPayoutScrollPane.setViewportView(EligiusPayoutInformationTable);
        }
        });
        t.start();
        */
        //EligiusPayoutInformationTableAncestorRemoved(null);

        EligiusPoolInformationRefreshButton.setText("Refresh");
        EligiusPoolInformationRefreshButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                EligiusPoolInformationRefreshButtonActionPerformed(evt);
            }
        });

        EligiousPayoutKeyInformationTextPane.setFont(new Font("Dialog", Font.PLAIN, 14));
        EligiousPayoutKeyInformationTextPane.setContentType("text/html");
        EligiousPayoutKeyInformationTextPane.setText(
                "<html><ul><li><em><b>bal</b></em> - Current unpaid balance including estimates for the current round</li>"
                        + "<li><em><b>ec</b></em> - Sum of CPPSRB shelved shares and SMPPS extra credit (if applicable) including estimates for the current round</li>"
                        + "<li><em><b>everpaid</b></em> - Total actually paid (and verifyable in the blockchain) to this miner</li>"
                        + "<li><em><b>lbal</b></em> - Unpaid balance as of the last block (no estimates)</li>"
                        + "<li><em><b>lec</b></em> - Sum of CPPSRB shelved shares and SMPPS extra credit (if applicable) as of the last block (no estimates)</li></ul></html>");
        EligiousPayoutKeyInformationTextPane.setEditable(false);
        EligiusPayoutKeyInformationScrollPane.setViewportView(EligiousPayoutKeyInformationTextPane);

        existing_eligius = currentEligius();
        EligiusUsernameSelectionBox.setModel(new javax.swing.DefaultComboBoxModel(existing_eligius.toArray()));
        EligiusUsernameSelectionBox.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                EligiusUsernameSelectionBoxActionPerformed(evt);
            }
        });

        EligiusUsernameClipboardCopyButton.setText("Copy To Clipboard");
        EligiusUsernameClipboardCopyButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                EligiusUsernameClipboardCopyButtonActionPerformed(evt);
            }
        });

        EligiusPoolCurrentUsernameLabel.setFont(new java.awt.Font("DejaVu Serif", 3, 12)); // NOI18N
        EligiusPoolCurrentUsernameLabel.setText("Eligius Username:");

        EligiusOpenBrowserButton.setText("Open Eligius in Browser");
        EligiusOpenBrowserButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                EligiusOpenBrowserButtonActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout EligiusPoolInformationPanelLayout = new javax.swing.GroupLayout(
                EligiusPoolInformationPanel);
        EligiusPoolInformationPanel.setLayout(EligiusPoolInformationPanelLayout);
        EligiusPoolInformationPanelLayout.setHorizontalGroup(EligiusPoolInformationPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(EligiusPoolInformationPanelLayout.createSequentialGroup().addContainerGap()
                        .addGroup(EligiusPoolInformationPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(EligiusPayoutKeyInformationScrollPane,
                                        javax.swing.GroupLayout.PREFERRED_SIZE, 695,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGroup(EligiusPoolInformationPanelLayout.createSequentialGroup()
                                        .addComponent(EligiusPayoutInformationPayoutScrollPane,
                                                javax.swing.GroupLayout.PREFERRED_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(EligiusPoolInformationRefreshButton))
                                .addComponent(EligiusHashRateInformationScrollPane,
                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGroup(EligiusPoolInformationPanelLayout.createSequentialGroup()
                                        .addGroup(EligiusPoolInformationPanelLayout
                                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING,
                                                        false)
                                                .addGroup(EligiusPoolInformationPanelLayout.createSequentialGroup()
                                                        .addComponent(EligiusStatusLabel,
                                                                javax.swing.GroupLayout.PREFERRED_SIZE, 408,
                                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                                        .addPreferredGap(
                                                                javax.swing.LayoutStyle.ComponentPlacement.RELATED,
                                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                Short.MAX_VALUE)
                                                        .addComponent(EligiusUsernameClipboardCopyButton))
                                                .addGroup(EligiusPoolInformationPanelLayout.createSequentialGroup()
                                                        .addComponent(EligiusPoolCurrentUsernameLabel)
                                                        .addGap(3, 3, 3).addComponent(EligiusUsernameSelectionBox,
                                                                javax.swing.GroupLayout.PREFERRED_SIZE, 459,
                                                                javax.swing.GroupLayout.PREFERRED_SIZE)))
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(EligiusOpenBrowserButton)))
                        .addGap(14, 14, 14)));
        EligiusPoolInformationPanelLayout.setVerticalGroup(EligiusPoolInformationPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(EligiusPoolInformationPanelLayout.createSequentialGroup().addGap(13, 13, 13)
                        .addGroup(EligiusPoolInformationPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(EligiusUsernameSelectionBox, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(EligiusPoolCurrentUsernameLabel))
                        .addGap(16, 16, 16)
                        .addGroup(EligiusPoolInformationPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(EligiusStatusLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 18,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(EligiusUsernameClipboardCopyButton)
                                .addComponent(EligiusOpenBrowserButton))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(EligiusHashRateInformationScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE,
                                113, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(18, 18, 18)
                        .addGroup(EligiusPoolInformationPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                .addComponent(EligiusPayoutInformationPayoutScrollPane,
                                        javax.swing.GroupLayout.PREFERRED_SIZE, 126,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(EligiusPoolInformationRefreshButton))
                        .addGap(18, 18, 18).addComponent(EligiusPayoutKeyInformationScrollPane,
                                javax.swing.GroupLayout.PREFERRED_SIZE, 159, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addContainerGap()));

        BitcoinInformationTabbedPane.addTab("Pool Information", EligiusPoolInformationPanel);

        javax.swing.GroupLayout BTCInformationPaneLayout = new javax.swing.GroupLayout(BTCInformationPane);
        BTCInformationPane.setLayout(BTCInformationPaneLayout);
        BTCInformationPaneLayout.setHorizontalGroup(
                BTCInformationPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(BitcoinInformationTabbedPane));
        BTCInformationPaneLayout.setVerticalGroup(
                BTCInformationPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(BitcoinInformationTabbedPane));

        MainTabbedPane.addTab("Bitcoin Information", BTCInformationPane);

        MinerConfigurationPanel.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                MinerConfigurationPanelFocusGained(evt);
            }
        });

        ConfigurationPromptLabel.setFont(new java.awt.Font("DejaVu Serif", 3, 14)); // NOI18N
        ConfigurationPromptLabel
                .setText("Please fill in the following form to configure this interface. Changes are persistent.");

        ConfigurationRemoveMinerButton.setText("Remove Miner");
        ConfigurationRemoveMinerButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                ConfigurationRemoveMinerButtonActionPerformed(evt);
            }
        });

        ConfigurationAddMinerButton.setText("Add Miner");
        ConfigurationAddMinerButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                ConfigurationAddMinerButtonActionPerformed(evt);
            }
        });

        ConfigurationAddMinerNameLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        ConfigurationAddMinerNameLabel.setText("Miner Name:");

        ConfigurationAddMinerIPLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        ConfigurationAddMinerIPLabel.setText("Miner IP:");

        ConfigurationMinerPortLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        ConfigurationMinerPortLabel.setText("Miner Port:");

        ConfigurationAddMinersLabel.setFont(new java.awt.Font("DejaVu Serif", 3, 14)); // NOI18N
        ConfigurationAddMinersLabel.setText("Add Miners");

        ConfigurationRemoveMinersLabel.setFont(new java.awt.Font("DejaVu Serif", 3, 14)); // NOI18N
        ConfigurationRemoveMinersLabel.setText("Remove Miners");

        ConfigurationRemoveMinerNameLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        ConfigurationRemoveMinerNameLabel.setText("Miner Name:");

        ConfigurationCurrentMinersLabel.setFont(new java.awt.Font("DejaVu Serif", 3, 14)); // NOI18N
        ConfigurationCurrentMinersLabel.setText("Current Miners:");

        ConfigurationRemoveMinerIPLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        ConfigurationRemoveMinerIPLabel.setText("or Miner IP:");

        ConfigurationResolveHostAddressLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        ConfigurationResolveHostAddressLabel.setText("Resolve host address:");

        ConfigurationResolveHostAddressButton.setText("Get IP");
        ConfigurationResolveHostAddressButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                ConfigurationResolveHostAddressButtonActionPerformed(evt);
            }
        });

        ConfigurationCurrentMinersTextPane.setEditable(false);
        ConfigurationCurrentMinersTextPane.setFont(new Font("Monospaced", 0, 12)); // NOI18N
        ConfigurationCurrentMinersTextPane.setContentType("text/html");
        org.planetcrypto.bitcoin.PlanetCryptoBitcoinUserConfiguration current_miners_configuration = new org.planetcrypto.bitcoin.PlanetCryptoBitcoinUserConfiguration();
        ConfigurationCurrentMinersTextPane.setText(current_miners_configuration.currentMiners());
        current_miners_configuration.closeAll();
        ConfigurationCurrentMinersTextPane.setEditable(false);
        ConfigurationCurrentMinersScrollPane.setViewportView(ConfigurationCurrentMinersTextPane);

        javax.swing.GroupLayout MinerConfigurationPanelLayout = new javax.swing.GroupLayout(
                MinerConfigurationPanel);
        MinerConfigurationPanel.setLayout(MinerConfigurationPanelLayout);
        MinerConfigurationPanelLayout.setHorizontalGroup(MinerConfigurationPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(MinerConfigurationPanelLayout.createSequentialGroup().addContainerGap()
                        .addGroup(MinerConfigurationPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(MinerConfigurationPanelLayout.createSequentialGroup()
                                        .addComponent(ConfigurationRemoveMinerNameLabel)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(ConfigurationRemoveMinerNameTextField,
                                                javax.swing.GroupLayout.PREFERRED_SIZE, 123,
                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                        .addComponent(ConfigurationRemoveMinerIPLabel)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                        .addComponent(ConfigurationRemoveMinerIPTextField,
                                                javax.swing.GroupLayout.PREFERRED_SIZE, 129,
                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                        .addComponent(ConfigurationRemoveMinerButton))
                                .addComponent(ConfigurationPromptLabel).addComponent(ConfigurationAddMinersLabel)
                                .addComponent(ConfigurationRemoveMinersLabel)
                                .addComponent(ConfigurationCurrentMinersLabel)
                                .addGroup(MinerConfigurationPanelLayout.createSequentialGroup()
                                        .addGroup(MinerConfigurationPanelLayout
                                                .createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                                .addGroup(javax.swing.GroupLayout.Alignment.LEADING,
                                                        MinerConfigurationPanelLayout.createSequentialGroup()
                                                                .addComponent(ConfigurationResolveHostAddressLabel)
                                                                .addPreferredGap(
                                                                        javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                                                .addComponent(
                                                                        ConfigurationResolveHostAddressTextField,
                                                                        javax.swing.GroupLayout.PREFERRED_SIZE, 168,
                                                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                                                .addPreferredGap(
                                                                        javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                                                .addComponent(
                                                                        ConfigurationResolveHostAddressButton))
                                                .addGroup(MinerConfigurationPanelLayout.createSequentialGroup()
                                                        .addComponent(ConfigurationAddMinerNameLabel)
                                                        .addPreferredGap(
                                                                javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                                        .addComponent(ConfigurationAddMinerNameTextField,
                                                                javax.swing.GroupLayout.PREFERRED_SIZE, 126,
                                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                                        .addGap(21, 21, 21)
                                                        .addComponent(ConfigurationAddMinerIPLabel)
                                                        .addPreferredGap(
                                                                javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                                        .addComponent(ConfigurationAddMinerIPTextField,
                                                                javax.swing.GroupLayout.PREFERRED_SIZE, 129,
                                                                javax.swing.GroupLayout.PREFERRED_SIZE)))
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(ConfigurationMinerPortLabel)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(ConfigurationMinerPortTextField,
                                                javax.swing.GroupLayout.PREFERRED_SIZE, 61,
                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addGap(43, 43, 43).addComponent(ConfigurationAddMinerButton))
                                .addComponent(ConfigurationCurrentMinersScrollPane,
                                        javax.swing.GroupLayout.PREFERRED_SIZE, 333,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)));
        MinerConfigurationPanelLayout.setVerticalGroup(MinerConfigurationPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(MinerConfigurationPanelLayout.createSequentialGroup().addGap(16, 16, 16)
                        .addComponent(ConfigurationPromptLabel)
                        .addGroup(MinerConfigurationPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(MinerConfigurationPanelLayout.createSequentialGroup().addGap(16, 16, 16)
                                        .addComponent(ConfigurationAddMinersLabel)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addGroup(MinerConfigurationPanelLayout
                                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                                .addComponent(ConfigurationAddMinerNameLabel)
                                                .addComponent(ConfigurationAddMinerNameTextField,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(ConfigurationAddMinerIPLabel)
                                                .addComponent(ConfigurationAddMinerIPTextField,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(ConfigurationMinerPortLabel)
                                                .addComponent(ConfigurationMinerPortTextField,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE)))
                                .addGroup(MinerConfigurationPanelLayout.createSequentialGroup().addGap(37, 37, 37)
                                        .addComponent(ConfigurationAddMinerButton)))
                        .addGap(35, 35, 35)
                        .addGroup(MinerConfigurationPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(ConfigurationResolveHostAddressLabel)
                                .addComponent(ConfigurationResolveHostAddressTextField,
                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(ConfigurationResolveHostAddressButton))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(ConfigurationRemoveMinersLabel)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(MinerConfigurationPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(ConfigurationRemoveMinerNameLabel)
                                .addComponent(ConfigurationRemoveMinerNameTextField,
                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(ConfigurationRemoveMinerIPLabel)
                                .addComponent(ConfigurationRemoveMinerIPTextField,
                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(ConfigurationRemoveMinerButton))
                        .addGap(25, 25, 25).addComponent(ConfigurationCurrentMinersLabel).addGap(33, 33, 33)
                        .addComponent(ConfigurationCurrentMinersScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE,
                                209, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)));

        ConfigurationTabbedPane.addTab("Miners", MinerConfigurationPanel);

        ConfigurationAlarmSettingsPromptLabel.setFont(new java.awt.Font("DejaVu Serif", 3, 14)); // NOI18N
        ConfigurationAlarmSettingsPromptLabel.setText("Configure Alarm Settings Here.");

        ConfigurationMinerTemperatureAlarmLabel.setText("Temperature:");

        ConfigurationMinerFanSpeedAlarmLabel.setText("Fan Speed:");

        ConfigurationMinerHashRateAlarmLabel.setText("Hash Rate:");

        MinerSelectionForAlarmsBox.setModel(new javax.swing.DefaultComboBoxModel(miners.toArray()));

        binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(
                org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, MinerSelectionBox5,
                org.jdesktop.beansbinding.ELProperty.create("${selectedItem}"), MinerSelectionForAlarmsBox,
                org.jdesktop.beansbinding.BeanProperty.create("selectedItem"));
        bindingGroup.addBinding(binding);

        AlarmsCurrentMinerLabel.setText("Current Miner:");

        ConfigurationAlarmsHWErrPercentLabel.setText("Hardware Errors:");

        ConfigurationMinerTempAlarmTextField.setHorizontalAlignment(javax.swing.JTextField.RIGHT);

        ConfigurationFanSpeedAlarmTextField.setHorizontalAlignment(javax.swing.JTextField.RIGHT);

        ConfigurationMinerHashRateAlarmTextField.setHorizontalAlignment(javax.swing.JTextField.RIGHT);

        ConfigurationMinerHardwareErrPercentAlarmTextField.setHorizontalAlignment(javax.swing.JTextField.RIGHT);

        ConfigurationDegreesCelsiusLabel.setText("C");

        ConfigurationFanRPMLabel.setText("RPM");

        ConfigurationHashRatePostfixComboBox
                .setModel(new javax.swing.DefaultComboBoxModel(new String[] { "TH/s", "GH/s", "MH/s" }));
        ConfigurationHashRatePostfixComboBox.setSelectedIndex(1);

        ConfigurationHWErrorPercentLabel.setText("%");

        ConfigurationMinerTempAlarmUpdateButton.setText("Update");
        ConfigurationMinerTempAlarmUpdateButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                ConfigurationMinerTempAlarmUpdateButtonActionPerformed(evt);
            }
        });

        ConfigurationMinerFanSpeedAlarmUpdateButton.setText("Update");
        ConfigurationMinerFanSpeedAlarmUpdateButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                ConfigurationMinerFanSpeedAlarmUpdateButtonActionPerformed(evt);
            }
        });

        ConfigurationMinerHashRateAlarmUpdateButton.setText("Update");
        ConfigurationMinerHashRateAlarmUpdateButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                ConfigurationMinerHashRateAlarmUpdateButtonActionPerformed(evt);
            }
        });

        ConfigurationMinerHardwareErrPercentAlarmUpdateButton.setText("Update");
        ConfigurationMinerHardwareErrPercentAlarmUpdateButton
                .addActionListener(new java.awt.event.ActionListener() {
                    public void actionPerformed(java.awt.event.ActionEvent evt) {
                        ConfigurationMinerHardwareErrPercentAlarmUpdateButtonActionPerformed(evt);
                    }
                });

        ConfigurationCurrentMinerAlarmsTextPane.setContentType(("text/html"));
        /*StringBuffer current_alarms = new StringBuffer();
        String temp = new String();
        Object temp_type = new Object();
        HashMap<String, Object> temp_alarms = new HashMap<>();
        current_alarms.append(CurrentAlarmsHeader);
        System.out.println(existing_miners.toString());
        for (int i = 0; i < existing_miners.size(); i++) {
        temp = existing_miners.get(i).get("name");
        if (temp.equals("No Miners")) {
            current_alarms.append(newrow);
            for (int j = 0; j < 5; j++) {
                current_alarms.append("None");
                if (j == 4) {
                    break;
                }
                current_alarms.append(newcolumn);
            }
            current_alarms.append(closerow);
            current_alarms.append(VitalStatsFooter);
            System.out.println(current_alarms.toString());
            break;
        }
        temp_alarms = cfg.getAlarms(temp);
        if (temp_alarms == null) {
            current_alarms.append(newrow);
            current_alarms.append(temp);
            current_alarms.append(newcolumn);
            for (int j = 0; j < 4; j++) {
                current_alarms.append("None");
                if (j == 3) {
                    break;
                }
                current_alarms.append(newcolumn);
            }
            current_alarms.append(closerow);
            current_alarms.append(VitalStatsFooter);
            System.out.println(current_alarms.toString());
            break;
        }
        current_alarms.append(newrow);
        current_alarms.append(temp);
        current_alarms.append(newcolumn);
        current_alarms.append(temp_alarms.get("fan"));
        current_alarms.append(newcolumn);
        current_alarms.append(temp_alarms.get("temp"));
        current_alarms.append(newcolumn);
        temp_type = temp_alarms.get("hash_rate_type");
        temp_type = (temp_type == null) ? "GH/s" : temp_type.toString();
        current_alarms.append(temp_alarms.get("hash_rate") + " " + temp_type);
        current_alarms.append(newcolumn);
        current_alarms.append(temp_alarms.get("hw_err"));
        current_alarms.append(closerow);
        current_alarms.append(VitalStatsFooter);
        }
        ConfigurationCurrentMinerAlarmsTextPane.setText(current_alarms.toString());
        */
        ConfigurationCurrentMinerAlarmsTextPanePropertyChange(null);
        ConfigurationCurrentMinerAlarmsTextPane.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
            public void propertyChange(java.beans.PropertyChangeEvent evt) {
                ConfigurationCurrentMinerAlarmsTextPanePropertyChange(evt);
            }
        });
        ConfigurationCurrentMinerAlarmsScrollPane.setViewportView(ConfigurationCurrentMinerAlarmsTextPane);

        ConfigurationCurrentMinerAlarmsLabel.setFont(new java.awt.Font("DejaVu Serif", 3, 12)); // NOI18N
        ConfigurationCurrentMinerAlarmsLabel.setText("Current alarms:");

        javax.swing.GroupLayout ConfigurationAlarmPanelLayout = new javax.swing.GroupLayout(
                ConfigurationAlarmPanel);
        ConfigurationAlarmPanel.setLayout(ConfigurationAlarmPanelLayout);
        ConfigurationAlarmPanelLayout.setHorizontalGroup(ConfigurationAlarmPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(ConfigurationAlarmPanelLayout.createSequentialGroup().addContainerGap()
                        .addGroup(ConfigurationAlarmPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(ConfigurationCurrentMinerAlarmsScrollPane,
                                        javax.swing.GroupLayout.PREFERRED_SIZE, 371,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGroup(ConfigurationAlarmPanelLayout.createSequentialGroup()
                                        .addGroup(ConfigurationAlarmPanelLayout
                                                .createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                                .addComponent(ConfigurationAlarmSettingsPromptLabel,
                                                        javax.swing.GroupLayout.Alignment.LEADING)
                                                .addGroup(ConfigurationAlarmPanelLayout.createSequentialGroup()
                                                        .addGroup(ConfigurationAlarmPanelLayout
                                                                .createParallelGroup(
                                                                        javax.swing.GroupLayout.Alignment.TRAILING,
                                                                        false)
                                                                .addComponent(ConfigurationAlarmsHWErrPercentLabel,
                                                                        javax.swing.GroupLayout.Alignment.LEADING,
                                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                        Short.MAX_VALUE)
                                                                .addComponent(
                                                                        ConfigurationMinerTemperatureAlarmLabel,
                                                                        javax.swing.GroupLayout.Alignment.LEADING,
                                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                        Short.MAX_VALUE)
                                                                .addComponent(ConfigurationMinerFanSpeedAlarmLabel,
                                                                        javax.swing.GroupLayout.Alignment.LEADING,
                                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                        Short.MAX_VALUE)
                                                                .addComponent(ConfigurationMinerHashRateAlarmLabel,
                                                                        javax.swing.GroupLayout.Alignment.LEADING,
                                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                        Short.MAX_VALUE)
                                                                .addComponent(AlarmsCurrentMinerLabel,
                                                                        javax.swing.GroupLayout.Alignment.LEADING,
                                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                        Short.MAX_VALUE))
                                                        .addPreferredGap(
                                                                javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                                        .addGroup(ConfigurationAlarmPanelLayout
                                                                .createParallelGroup(
                                                                        javax.swing.GroupLayout.Alignment.LEADING)
                                                                .addComponent(MinerSelectionForAlarmsBox,
                                                                        javax.swing.GroupLayout.PREFERRED_SIZE, 173,
                                                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                                                .addGroup(ConfigurationAlarmPanelLayout
                                                                        .createSequentialGroup()
                                                                        .addGroup(ConfigurationAlarmPanelLayout
                                                                                .createParallelGroup(
                                                                                        javax.swing.GroupLayout.Alignment.TRAILING,
                                                                                        false)
                                                                                .addComponent(
                                                                                        ConfigurationMinerHardwareErrPercentAlarmTextField,
                                                                                        javax.swing.GroupLayout.Alignment.LEADING,
                                                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                                        129, Short.MAX_VALUE)
                                                                                .addComponent(
                                                                                        ConfigurationMinerHashRateAlarmTextField,
                                                                                        javax.swing.GroupLayout.Alignment.LEADING)
                                                                                .addComponent(
                                                                                        ConfigurationFanSpeedAlarmTextField,
                                                                                        javax.swing.GroupLayout.Alignment.LEADING)
                                                                                .addComponent(
                                                                                        ConfigurationMinerTempAlarmTextField,
                                                                                        javax.swing.GroupLayout.Alignment.LEADING))
                                                                        .addPreferredGap(
                                                                                javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                                                        .addGroup(ConfigurationAlarmPanelLayout
                                                                                .createParallelGroup(
                                                                                        javax.swing.GroupLayout.Alignment.LEADING)
                                                                                .addComponent(
                                                                                        ConfigurationDegreesCelsiusLabel)
                                                                                .addComponent(
                                                                                        ConfigurationFanRPMLabel)
                                                                                .addComponent(
                                                                                        ConfigurationHashRatePostfixComboBox,
                                                                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                                                                .addComponent(
                                                                                        ConfigurationHWErrorPercentLabel))))))
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                        .addGroup(ConfigurationAlarmPanelLayout
                                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                                .addComponent(ConfigurationMinerHashRateAlarmUpdateButton)
                                                .addComponent(ConfigurationMinerHardwareErrPercentAlarmUpdateButton)
                                                .addComponent(ConfigurationMinerTempAlarmUpdateButton)
                                                .addComponent(ConfigurationMinerFanSpeedAlarmUpdateButton)))
                                .addComponent(ConfigurationCurrentMinerAlarmsLabel))
                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)));
        ConfigurationAlarmPanelLayout.setVerticalGroup(ConfigurationAlarmPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(ConfigurationAlarmPanelLayout.createSequentialGroup().addContainerGap()
                        .addComponent(ConfigurationAlarmSettingsPromptLabel)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(ConfigurationAlarmPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(AlarmsCurrentMinerLabel).addComponent(MinerSelectionForAlarmsBox,
                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(ConfigurationAlarmPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(ConfigurationMinerTemperatureAlarmLabel)
                                .addComponent(ConfigurationMinerTempAlarmTextField,
                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(ConfigurationDegreesCelsiusLabel)
                                .addComponent(ConfigurationMinerTempAlarmUpdateButton))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(ConfigurationAlarmPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(ConfigurationMinerFanSpeedAlarmLabel)
                                .addComponent(ConfigurationFanSpeedAlarmTextField,
                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(ConfigurationFanRPMLabel)
                                .addComponent(ConfigurationMinerFanSpeedAlarmUpdateButton))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(ConfigurationAlarmPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(ConfigurationMinerHashRateAlarmLabel)
                                .addComponent(ConfigurationMinerHashRateAlarmTextField,
                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(ConfigurationHashRatePostfixComboBox,
                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(ConfigurationMinerHashRateAlarmUpdateButton))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(ConfigurationAlarmPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(ConfigurationAlarmsHWErrPercentLabel)
                                .addComponent(ConfigurationMinerHardwareErrPercentAlarmTextField,
                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(ConfigurationHWErrorPercentLabel)
                                .addComponent(ConfigurationMinerHardwareErrPercentAlarmUpdateButton))
                        .addGap(18, 18, 18).addComponent(ConfigurationCurrentMinerAlarmsLabel).addGap(18, 18, 18)
                        .addComponent(ConfigurationCurrentMinerAlarmsScrollPane,
                                javax.swing.GroupLayout.PREFERRED_SIZE, 140, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)));

        ConfigurationTabbedPane.addTab("Alarms", ConfigurationAlarmPanel);

        ConfigurationEligiusLabel.setFont(new java.awt.Font("DejaVu Serif", 3, 14)); // NOI18N
        ConfigurationEligiusLabel.setText("Eligius");

        ConfigurationMiningPoolPromptLabel.setFont(new java.awt.Font("DejaVu Serif", 3, 18)); // NOI18N
        ConfigurationMiningPoolPromptLabel.setText("Use this tab to configure mining pools");

        ConfigurationEligiusUsernameLabel.setText("Eligius Username*:");

        ConfigurationEligiusHelpPromptLabel.setFont(new java.awt.Font("Monospaced", 0, 10)); // NOI18N
        ConfigurationEligiusHelpPromptLabel.setText("*For more information about these fields, please see help*");

        ConfigurationEligiusUsernameAddButton.setText("Add");
        ConfigurationEligiusUsernameAddButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                ConfigurationEligiusUsernameAddButtonActionPerformed(evt);
            }
        });

        ConfigurationEligiusUsernameRemoveButton.setText("Remove");
        ConfigurationEligiusUsernameRemoveButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                ConfigurationEligiusUsernameRemoveButtonActionPerformed(evt);
            }
        });

        ConfigurationEligiusExampleLabel.setFont(new java.awt.Font("DejaVu Serif", 0, 10)); // NOI18N
        ConfigurationEligiusExampleLabel.setText(
                "*User name is the same as Mining Address for example: \"1EXfBqvLTyFbL6Dr5CG1fjxNKEPSezg7yF\"");

        javax.swing.GroupLayout ConfigurationEligiusPoolsPanelLayout = new javax.swing.GroupLayout(
                ConfigurationEligiusPoolsPanel);
        ConfigurationEligiusPoolsPanel.setLayout(ConfigurationEligiusPoolsPanelLayout);
        ConfigurationEligiusPoolsPanelLayout.setHorizontalGroup(ConfigurationEligiusPoolsPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(ConfigurationEligiusPoolsPanelLayout.createSequentialGroup().addContainerGap()
                        .addGroup(ConfigurationEligiusPoolsPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(ConfigurationEligiusPoolsPanelLayout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                        .addGroup(ConfigurationEligiusPoolsPanelLayout.createSequentialGroup()
                                                .addComponent(ConfigurationMiningPoolPromptLabel)
                                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                                .addComponent(ConfigurationEligiusHelpPromptLabel))
                                        .addGroup(javax.swing.GroupLayout.Alignment.LEADING,
                                                ConfigurationEligiusPoolsPanelLayout.createSequentialGroup()
                                                        .addComponent(ConfigurationEligiusUsernameLabel)
                                                        .addPreferredGap(
                                                                javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                                        .addComponent(ConfigurationEligiusUsernameTextField,
                                                                javax.swing.GroupLayout.PREFERRED_SIZE, 256,
                                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                                        .addGap(18, 18, 18)
                                                        .addComponent(ConfigurationEligiusUsernameAddButton)
                                                        .addPreferredGap(
                                                                javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                                        .addComponent(ConfigurationEligiusUsernameRemoveButton)))
                                .addComponent(ConfigurationEligiusLabel)
                                .addGroup(ConfigurationEligiusPoolsPanelLayout.createSequentialGroup()
                                        .addGap(12, 12, 12).addComponent(ConfigurationEligiusExampleLabel,
                                                javax.swing.GroupLayout.PREFERRED_SIZE, 527,
                                                javax.swing.GroupLayout.PREFERRED_SIZE)))
                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)));
        ConfigurationEligiusPoolsPanelLayout.setVerticalGroup(
                ConfigurationEligiusPoolsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(ConfigurationEligiusPoolsPanelLayout.createSequentialGroup().addContainerGap()
                                .addGroup(ConfigurationEligiusPoolsPanelLayout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                        .addComponent(ConfigurationEligiusHelpPromptLabel)
                                        .addComponent(ConfigurationMiningPoolPromptLabel))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(ConfigurationEligiusLabel)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addGroup(ConfigurationEligiusPoolsPanelLayout
                                        .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                        .addComponent(ConfigurationEligiusUsernameLabel)
                                        .addComponent(ConfigurationEligiusUsernameTextField,
                                                javax.swing.GroupLayout.PREFERRED_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addComponent(ConfigurationEligiusUsernameAddButton)
                                        .addComponent(ConfigurationEligiusUsernameRemoveButton))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(ConfigurationEligiusExampleLabel)
                                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)));

        ConfigurationTabbedPane.addTab("Pools", ConfigurationEligiusPoolsPanel);

        ConfigurationCoinExchangePanel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N

        ConfigurationCoinbaseLabel.setFont(new java.awt.Font("DejaVu Serif", 3, 14)); // NOI18N
        ConfigurationCoinbaseLabel.setText("Configure Coinbase Here");

        ConfigurationCoinbaseCurrencyLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        ConfigurationCoinbaseCurrencyLabel.setText("Preferred Exchange Currency:");

        ConfigurationCoinbaseCurrencyComboBox.setModel(
                new javax.swing.DefaultComboBoxModel(PlanetCryptoBitcoinCoinbaseCurrency.coinbaseCurrencies()));
        /*
        new javax.swing.DefaultComboBoxModel(
        new String[]{ "Select", "AED", "AFN", "ALL", "AMD", "ANG", "AOA", "ARS", "AUD", "AWG", "AZN", "BAM", "BBD",
            "BDT", "BGN", "BHD", "BIF", "BMD", "BND", "BOB", "BRL", "BSD", "BTC", "BTN", "BWP",
            "BYR", "BZD", "CAD", "CDF", "CHF", "CLP", "CNY", "COP", "CRC", "CUP", "CVE", "CZK",
            "DJF", "DKK", "DOP", "DZD", "EEK", "EGP", "ERN", "ETB", "EUR", "FJD", "FKP", "GBP", "GEL",
            "GHS", "GIP", "GMD", "GNF", "GTQ", "GYD", "HKD", "HNL", "HRK", "HTG", "HUF", "IDR",
            "ILS", "INR", "IQD", "IRR", "ISK", "JMD", "JOD", "JPY", "KES", "KGS", "KHR", "KMF", "KPW",
            "KRW", "KWD", "KYD", "KZT", "LAK", "LBP", "LKR", "LRD", "LSL", "LTL", "LVL", "LYD", "MAD",
            "MDL", "MGA", "MKD", "MMK", "MNT", "MOP", "MRO", "MUR", "MVR", "MWK", "MXN", "MYR",
            "MZN", "NAD", "NGN", "NIO", "NOK", "NPR", "NZD", "OMR", "PAB", "PEN", "PGK", "PHP", "PKR",
            "PLN", "PYG", "QAR", "RON", "RSD", "RUB", "RWF", "SAR", "SBD", "SCR", "SDG", "SEK", "SGD",
            "SHP", "SLL", "SOS", "SRD", "STD", "SVC", "SYP", "SZL", "THB", "TJS", "TMM", "TND", "TOP",
            "TRY", "TTD", "TWD", "TZS", "UAH", "UGX", "USD", "UY", "UZS", "VEF", "VND", "VUV", "WST",
            "XAF", "XCD", "XOF", "XPF", "YER", "ZAR", "ZMK", "ZWL" }
        */

        CoinbaseInformationLabel.setFont(new java.awt.Font("DejaVu Serif", 3, 14)); // NOI18N
        CoinbaseInformationLabel.setText("Coinbase User API Information");

        CoinbaseUsernameLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        CoinbaseUsernameLabel.setText("Coinbase Username:");

        CoinbaseAPIKeyLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        CoinbaseAPIKeyLabel.setText("Coinbase API Key:");

        CoinbaseAPISecretKeyLabel.setFont(new java.awt.Font("DejaVu Serif", 1, 12)); // NOI18N
        CoinbaseAPISecretKeyLabel.setText("Coinbase API Secret:");

        AddCoinbaseUsernameButton.setText("Add/Update");
        AddCoinbaseUsernameButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                AddCoinbaseUsernameButtonActionPerformed(evt);
            }
        });

        RemoveCoinbaseUsernameButton.setText("Remove");
        RemoveCoinbaseUsernameButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                RemoveCoinbaseUsernameButtonActionPerformed(evt);
            }
        });

        CurrentCoinbaseConfigurationLabel.setFont(new java.awt.Font("DejaVu Serif", 3, 14)); // NOI18N
        CurrentCoinbaseConfigurationLabel.setText("Current Coinbase Configuration:");

        CurrentCoinbaseConfigurationTextPane.setEditable(false);
        CurrentCoinbaseConfigurationTextPane.setContentType("text/html"); // NOI18N
        /*
        existing_coinbase = currentCoinbase();
        if (existing_coinbase == null) {
            CurrentCoinbaseConfigurationTextPane.setText("<html><body><p><b>No Configuration</b></p></body></html>");
        } else {
            CurrentCoinbaseConfigurationTextPane.setText(existing_coinbase.toString());
        }
        */
        CurrentCoinbaseConfigurationTextPane.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
            public void propertyChange(java.beans.PropertyChangeEvent evt) {
                CurrentCoinbaseConfigurationTextPanePropertyChange(evt);
            }
        });
        CurrentCoinbaseConfigurationScrollPane.setViewportView(CurrentCoinbaseConfigurationTextPane);

        CoinbaseConfigurationVerticalSeparator.setOrientation(javax.swing.SwingConstants.VERTICAL);

        CoinbaseConfigurationInstructionsTextPane.setEditable(false);
        CoinbaseConfigurationInstructionsTextPane.setContentType("text/html"); // NOI18N
        CoinbaseConfigurationInstructionsTextPane.setFont(new java.awt.Font("DejaVu Serif", 0, 12)); // NOI18N
        CoinbaseConfigurationInstructionsTextPane.setText(
                "<html>\n  <head>\n    <style>\n    body {background:#D6D9DF }\n   </style>\n  </head>\n  <body>\n    <ul>\n      <li>At a minimum <b>Coinbase Username</b> and <b>Preferred Exchange Currency</b> are required.</li>\n      <li>To add the minimum required parameters: \n           <ol>\n              <li>Enter the <b>Coinbase Username</b> to add</li>\n              <li>Select your <b>Preferred Exchange Currency</b></li>\n              <li>Click <b>Add/Update</b></li>\n           </ol>\n         </li>\n      <li>To add an API Key:\n           <ol>\n            <li>Enter the <b>Coinbase Username</b> to associate with key</li>\n            <li>Enter <b>Coinbase API Key</b> value</li>\n            <li>Enter <b>Coinbase API Secret</b> Value</li>\n            <li>Select your <b>Preferred Exchange Currency</b></li>\n            <li>Click <b>Add/Update</b></li>\n           </ol>\n         </li>\n      <li>To update/remove configuration associated with a <b>Coinbase Username</b></li>\n         <ol>\n           <li>Enter the <b>Coinbase Username</b> to update</li>\n           <li><b>If removing this configuration, simply click \"Remove\"</b></li>\n           <ul><li><b>Warning: This will remove ALL information from this app associated with this Coinbase Username</b></li></ul>\n           <li><b>If updating this configuration:</b></li>\n           <ul><li>Enter/Select the field to update, and click <b>Add/Update</b></li></ul>\n         </ol>\n    </ul>\n  </body>\n</html>\n");
        CoinbaseConfigurationInstructionsTextPane.setCaretPosition(0);
        CoinbaseConfigurationInstructionsScrollPane.setViewportView(CoinbaseConfigurationInstructionsTextPane);

        CoinbaseConfigurationInstructionsLabel.setFont(new java.awt.Font("DejaVu Serif", 3, 14)); // NOI18N
        CoinbaseConfigurationInstructionsLabel.setText("Configuration Instructions:");

        javax.swing.GroupLayout ConfigurationCoinExchangePanelLayout = new javax.swing.GroupLayout(
                ConfigurationCoinExchangePanel);
        ConfigurationCoinExchangePanel.setLayout(ConfigurationCoinExchangePanelLayout);
        ConfigurationCoinExchangePanelLayout.setHorizontalGroup(ConfigurationCoinExchangePanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(ConfigurationCoinExchangePanelLayout.createSequentialGroup().addContainerGap()
                        .addGroup(ConfigurationCoinExchangePanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                .addComponent(CurrentCoinbaseConfigurationScrollPane)
                                .addComponent(ConfigurationCoinbaseLabel)
                                .addGroup(ConfigurationCoinExchangePanelLayout.createSequentialGroup()
                                        .addGroup(ConfigurationCoinExchangePanelLayout
                                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                                .addGroup(ConfigurationCoinExchangePanelLayout
                                                        .createSequentialGroup()
                                                        .addGroup(ConfigurationCoinExchangePanelLayout
                                                                .createParallelGroup(
                                                                        javax.swing.GroupLayout.Alignment.LEADING)
                                                                .addGroup(
                                                                        javax.swing.GroupLayout.Alignment.TRAILING,
                                                                        ConfigurationCoinExchangePanelLayout
                                                                                .createSequentialGroup()
                                                                                .addComponent(
                                                                                        ConfigurationCoinbaseCurrencyLabel)
                                                                                .addGap(18, 18, 18).addComponent(
                                                                                        ConfigurationCoinbaseCurrencyComboBox,
                                                                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                                                                        263,
                                                                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                                                                .addGroup(ConfigurationCoinExchangePanelLayout
                                                                        .createParallelGroup(
                                                                                javax.swing.GroupLayout.Alignment.TRAILING,
                                                                                false)
                                                                        .addComponent(
                                                                                CoinbaseConfigurationSeparator1,
                                                                                javax.swing.GroupLayout.Alignment.LEADING)
                                                                        .addComponent(CoinbaseInformationLabel,
                                                                                javax.swing.GroupLayout.Alignment.LEADING)
                                                                        .addGroup(
                                                                                javax.swing.GroupLayout.Alignment.LEADING,
                                                                                ConfigurationCoinExchangePanelLayout
                                                                                        .createSequentialGroup()
                                                                                        .addGroup(
                                                                                                ConfigurationCoinExchangePanelLayout
                                                                                                        .createParallelGroup(
                                                                                                                javax.swing.GroupLayout.Alignment.LEADING,
                                                                                                                false)
                                                                                                        .addComponent(
                                                                                                                CoinbaseUsernameLabel,
                                                                                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                                                                Short.MAX_VALUE)
                                                                                                        .addComponent(
                                                                                                                CoinbaseAPISecretKeyLabel,
                                                                                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                                                                Short.MAX_VALUE)
                                                                                                        .addComponent(
                                                                                                                CoinbaseAPIKeyLabel,
                                                                                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                                                                Short.MAX_VALUE))
                                                                                        .addGap(18, 18, 18)
                                                                                        .addGroup(
                                                                                                ConfigurationCoinExchangePanelLayout
                                                                                                        .createParallelGroup(
                                                                                                                javax.swing.GroupLayout.Alignment.LEADING)
                                                                                                        .addComponent(
                                                                                                                CoinbaseAPIUsernameTextField)
                                                                                                        .addComponent(
                                                                                                                CoinbaseAPIKeyTextField)
                                                                                                        .addComponent(
                                                                                                                CoinbaseAPISecretKeyTextField,
                                                                                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                                                                                330,
                                                                                                                Short.MAX_VALUE)))
                                                                        .addComponent(
                                                                                CoinbaseConfigurationSeparator,
                                                                                javax.swing.GroupLayout.Alignment.LEADING)))
                                                        .addGap(0, 0, 0)
                                                        .addComponent(CoinbaseConfigurationVerticalSeparator,
                                                                javax.swing.GroupLayout.PREFERRED_SIZE, 12,
                                                                javax.swing.GroupLayout.PREFERRED_SIZE))
                                                .addComponent(CurrentCoinbaseConfigurationLabel,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE, 266,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                                        .addGap(32, 32, 32).addComponent(AddCoinbaseUsernameButton)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(RemoveCoinbaseUsernameButton))
                                .addComponent(CoinbaseConfigurationInstructionsLabel)
                                .addComponent(CoinbaseConfigurationInstructionsScrollPane,
                                        javax.swing.GroupLayout.DEFAULT_SIZE, 791, Short.MAX_VALUE))
                        .addContainerGap(17, Short.MAX_VALUE)));
        ConfigurationCoinExchangePanelLayout.setVerticalGroup(ConfigurationCoinExchangePanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(ConfigurationCoinExchangePanelLayout.createSequentialGroup().addContainerGap()
                        .addComponent(ConfigurationCoinbaseLabel)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(ConfigurationCoinExchangePanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(ConfigurationCoinExchangePanelLayout.createSequentialGroup()
                                        .addComponent(CoinbaseConfigurationSeparator,
                                                javax.swing.GroupLayout.PREFERRED_SIZE, 10,
                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(CoinbaseInformationLabel)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addGroup(ConfigurationCoinExchangePanelLayout
                                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                                .addComponent(CoinbaseUsernameLabel)
                                                .addComponent(CoinbaseAPIUsernameTextField,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addGroup(ConfigurationCoinExchangePanelLayout
                                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                                .addComponent(CoinbaseAPIKeyLabel)
                                                .addComponent(CoinbaseAPIKeyTextField,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(AddCoinbaseUsernameButton)
                                                .addComponent(RemoveCoinbaseUsernameButton))
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addGroup(ConfigurationCoinExchangePanelLayout
                                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                                .addComponent(CoinbaseAPISecretKeyTextField,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(CoinbaseAPISecretKeyLabel))
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addGroup(ConfigurationCoinExchangePanelLayout
                                                .createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                                .addComponent(ConfigurationCoinbaseCurrencyLabel)
                                                .addComponent(ConfigurationCoinbaseCurrencyComboBox,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(CoinbaseConfigurationSeparator1,
                                                javax.swing.GroupLayout.PREFERRED_SIZE, 10,
                                                javax.swing.GroupLayout.PREFERRED_SIZE))
                                .addGroup(ConfigurationCoinExchangePanelLayout.createSequentialGroup()
                                        .addComponent(CoinbaseConfigurationVerticalSeparator,
                                                javax.swing.GroupLayout.PREFERRED_SIZE, 172,
                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(CurrentCoinbaseConfigurationLabel)))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(CurrentCoinbaseConfigurationScrollPane,
                                javax.swing.GroupLayout.PREFERRED_SIZE, 169, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED,
                                javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(CoinbaseConfigurationInstructionsLabel)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(CoinbaseConfigurationInstructionsScrollPane,
                                javax.swing.GroupLayout.PREFERRED_SIZE, 147, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(21, 21, 21)));

        ConfigurationTabbedPane.addTab("Coin Exchange", ConfigurationCoinExchangePanel);

        javax.swing.GroupLayout ConfigurationPanelLayout = new javax.swing.GroupLayout(ConfigurationPanel);
        ConfigurationPanel.setLayout(ConfigurationPanelLayout);
        ConfigurationPanelLayout.setHorizontalGroup(
                ConfigurationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(
                        javax.swing.GroupLayout.Alignment.TRAILING, ConfigurationPanelLayout.createSequentialGroup()
                                .addContainerGap().addComponent(ConfigurationTabbedPane).addContainerGap()));
        ConfigurationPanelLayout.setVerticalGroup(
                ConfigurationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(ConfigurationTabbedPane));

        MainTabbedPane.addTab("Configuration", ConfigurationPanel);

        FileMenu.setText("File");

        FileExitMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_Q,
                java.awt.event.InputEvent.ALT_MASK));
        FileExitMenuItem.setText("Quit");
        FileExitMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                FileExitMenuItemActionPerformed(evt);
            }
        });
        FileMenu.add(FileExitMenuItem);

        BFGMInerUIMenuBar.add(FileMenu);

        EditMenu.setText("Edit");
        EditMenu.setMnemonic(KeyEvent.VK_E);

        CopyMenuItem.setText("Copy");
        CopyMenuItem.setMnemonic(KeyEvent.VK_C);
        EditMenu.add(CopyMenuItem);

        PasteMenuItem.setText("Paste");
        PasteMenuItem.setMnemonic(KeyEvent.VK_P);
        EditMenu.add(PasteMenuItem);

        BFGMInerUIMenuBar.add(EditMenu);

        HelpMenu.setText("Help");

        AppHelpMenuItem.setText("App Help");
        AppHelpMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                AppHelpMenuItemActionPerformed(evt);
            }
        });
        HelpMenu.add(AppHelpMenuItem);

        AboutMenuItem.setText("About BFGMinerAPI");
        AboutMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                AboutMenuItemActionPerformed(evt);
            }
        });
        HelpMenu.add(AboutMenuItem);

        BFGMInerUIMenuBar.add(HelpMenu);

        setJMenuBar(BFGMInerUIMenuBar);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(MainTabbedPane, javax.swing.GroupLayout.Alignment.TRAILING));
        layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(MainTabbedPane));

        MainTabbedPane.getAccessibleContext().setAccessibleName("");

        bindingGroup.bind();

        pack();
    }// </editor-fold>//GEN-END:initComponents

    public PlanetCryptoBitcoinUI(JCheckBox jCheckBox1) {
        this.CustomCommandJsonCheckBox = jCheckBox1;
    }

    private void FileExitMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_FileExitMenuItemActionPerformed
        System.exit(0);
    }//GEN-LAST:event_FileExitMenuItemActionPerformed

    private void AppHelpMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_AppHelpMenuItemActionPerformed
        PlanetCryptoBitcoinHelp.main();
    }//GEN-LAST:event_AppHelpMenuItemActionPerformed

    private void AboutMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_AboutMenuItemActionPerformed
        JOptionPane.showMessageDialog(null,
                "Copyright: 2014 PlanetCrypto, LLC\n" + "Author: support@planetcrypto.com\n", "About BFGMinerAPI",
                JOptionPane.INFORMATION_MESSAGE);
    }//GEN-LAST:event_AboutMenuItemActionPerformed

    private void MinerConfigurationPanelFocusGained(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_MinerConfigurationPanelFocusGained
        // TODO add your handling code here:
    }//GEN-LAST:event_MinerConfigurationPanelFocusGained

    @SuppressWarnings("unchecked")
    private void ConfigurationAddMinerButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ConfigurationAddMinerButtonActionPerformed
        PlanetCryptoBitcoinUserConfiguration cfg = new PlanetCryptoBitcoinUserConfiguration();
        while (true) {
            if (ConfigurationAddMinerNameTextField.getText().isEmpty()) {
                JOptionPane.showMessageDialog(null, "Please enter a value for Miner Name", "ERROR: NO MINER NAME",
                        JOptionPane.WARNING_MESSAGE);
                break;
            }
            if (!cfg.validate(ConfigurationAddMinerIPTextField.getText())) {
                JOptionPane.showMessageDialog(null, "Not a valid IP address", "ERROR: INVALID IP ADDRESS",
                        JOptionPane.WARNING_MESSAGE);
                break;
            }
            if (!cfg.isPort(ConfigurationMinerPortTextField.getText())) {
                JOptionPane.showMessageDialog(null, "Please enter a valid port number between 1 and 65535",
                        "ERROR: INVALID PORT", JOptionPane.WARNING_MESSAGE);
                break;
            }
            Map<String, String> miner = new HashMap<>();
            miner.put("name", ConfigurationAddMinerNameTextField.getText());
            miner.put("ip", ConfigurationAddMinerIPTextField.getText());
            miner.put("port", ConfigurationMinerPortTextField.getText());
            JOptionPane.showMessageDialog(null, cfg.addMiners(miner));
            ConfigurationCurrentMinersTextPane.setText(cfg.currentMiners());
            ConfigurationAddMinerNameTextField.setText("");
            ConfigurationAddMinerIPTextField.setText("");
            ConfigurationMinerPortTextField.setText("");
            existing_miners = currentMiners();
            ArrayList<String> miners = new ArrayList<>();
            Map<Integer, HashMap<String, String>> current_miners = cfg.getMiners();
            if (current_miners.get(0) == null) {
                miners.add("No Miners");
            } else {
                for (int i = 0; i < current_miners.size(); i++) {
                    miners.add(current_miners.get(i).get("name"));
                }
            }
            //System.out.println(miners.toString());
            MinerSelectionBox.setModel(new javax.swing.DefaultComboBoxModel(miners.toArray()));
            MinerSelectionBox1.setModel(new javax.swing.DefaultComboBoxModel(miners.toArray()));
            MinerSelectionBox2.setModel(new javax.swing.DefaultComboBoxModel(miners.toArray()));
            MinerSelectionBox3.setModel(new javax.swing.DefaultComboBoxModel(miners.toArray()));
            CustomCommandMinerSelectionBox.setModel(new javax.swing.DefaultComboBoxModel(miners.toArray()));
            MinerSelectionBox5.setModel(new javax.swing.DefaultComboBoxModel(miners.toArray()));
            MinerSelectionForAlarmsBox.setModel(new javax.swing.DefaultComboBoxModel(miners.toArray()));
            MinerVitalStatsTextPanePropertyChange(null);
            cfg.closeAll();
            break;
        }
    }//GEN-LAST:event_ConfigurationAddMinerButtonActionPerformed

    @SuppressWarnings("unchecked")
    private void ConfigurationRemoveMinerButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ConfigurationRemoveMinerButtonActionPerformed
        PlanetCryptoBitcoinUserConfiguration cfg = new PlanetCryptoBitcoinUserConfiguration();
        String miner = ConfigurationRemoveMinerNameTextField.getText();
        String ip = ConfigurationRemoveMinerIPTextField.getText();
        int response;
        if (miner.isEmpty() & ip.isEmpty()) {
            JOptionPane.showMessageDialog(null, "Enter Miner Name or Miner IP!", "ERROR: NO PARAMETERS",
                    JOptionPane.WARNING_MESSAGE);
        } else if (!miner.isEmpty()) {
            response = JOptionPane.showConfirmDialog(null, "Are you sure you want to delete " + miner + "?",
                    "Confirm", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
            if (response == JOptionPane.NO_OPTION) {
                return;
                //System.out.println("User opted out of deleting " + miner + ".");
            } else if (response == JOptionPane.CLOSED_OPTION) {
                return;
                //System.out.println("Dialog box was closed");
            } else if (response == JOptionPane.YES_OPTION) {
                JOptionPane.showMessageDialog(null, cfg.removeMiner(miner, "name"));
                ConfigurationCurrentMinersTextPane.setText(cfg.currentMiners());
                ConfigurationRemoveMinerNameTextField.setText("");
                cfg.closeAll();
            }
        } else if (!ip.isEmpty()) {
            response = JOptionPane.showConfirmDialog(null, "Are you sure you want to delete " + ip + "?", "Confirm",
                    JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
            if (response == JOptionPane.NO_OPTION) {
                return;
                //System.out.println("User opted out of deleting " + ip + ".");
            } else if (response == JOptionPane.CLOSED_OPTION) {
                return;
                //System.out.println("Dialog box was closed");
            } else if (response == JOptionPane.YES_OPTION) {
                JOptionPane.showMessageDialog(null, cfg.removeMiner(ip, "ip"), "SUCCESS!",
                        JOptionPane.INFORMATION_MESSAGE);
                ConfigurationCurrentMinersTextPane.setText(cfg.currentMiners());
                ConfigurationRemoveMinerIPTextField.setText("");
                cfg.closeAll();
            }
        }
        existing_miners = currentMiners();
        ArrayList<String> miners = new ArrayList<>();
        Map<Integer, HashMap<String, String>> current_miners = cfg.getMiners();
        //jComboBox1.
        if (current_miners.get(0) == null) {
            miners.add("No Miners");
        } else {
            for (int i = 0; i < current_miners.size(); i++) {
                miners.add(current_miners.get(i).get("name"));
            }
        }
        MinerSelectionBox.setModel(new javax.swing.DefaultComboBoxModel(miners.toArray()));
        MinerSelectionBox1.setModel(new javax.swing.DefaultComboBoxModel(miners.toArray()));
        MinerSelectionBox2.setModel(new javax.swing.DefaultComboBoxModel(miners.toArray()));
        MinerSelectionBox3.setModel(new javax.swing.DefaultComboBoxModel(miners.toArray()));
        CustomCommandMinerSelectionBox.setModel(new javax.swing.DefaultComboBoxModel(miners.toArray()));
        MinerSelectionBox5.setModel(new javax.swing.DefaultComboBoxModel(miners.toArray()));
        MinerSelectionForAlarmsBox.setModel(new javax.swing.DefaultComboBoxModel(miners.toArray()));
        MinerVitalStatsTextPanePropertyChange(null);

    }//GEN-LAST:event_ConfigurationRemoveMinerButtonActionPerformed

    private void CustomCommandSubmitButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_CustomCommandSubmitButtonActionPerformed
        String command = CustomCommandEntryTextField.getText();
        String miner = MinerSelectionBox.getSelectedItem().toString();
        Boolean json = CustomCommandJsonCheckBox.isSelected();
        if (command.equals("")) {
            JOptionPane.showMessageDialog(null, "Please enter a command.", "ERROR: NO COMMAND",
                    JOptionPane.WARNING_MESSAGE);
        } else {
            for (int i = 0; i < existing_miners.size(); i++) {
                if (existing_miners.get(i).get("name").equals(miner)) {
                    //System.out.println("Found compatible miner");
                    String response = api_Commands.parseArgs(existing_miners.get(i).get("ip"),
                            existing_miners.get(i).get("port"), command, json);
                    if (!json) {
                        try {
                            response = api_Commands.prettyPrint(response);
                            CustomCommandOutputTextArea.setText(response);
                            return;
                        } catch (IOException ex) {
                            Logger.getLogger(PlanetCryptoBitcoinUI.class.getName()).log(Level.SEVERE, null, ex);
                            CustomCommandOutputTextArea.setText("Error");
                            return;
                        }
                    } else {
                        try {
                            String niceJSON = JsonWriter.formatJson(response);
                            CustomCommandOutputTextArea.setLineWrap(true);
                            CustomCommandOutputTextArea
                                    .setText("Command: " + command + "\n" + "Response: \n" + niceJSON);
                            CustomCommandEntryTextField.setText("");
                            CustomCommandJsonCheckBox.setSelected(false);
                        } catch (IOException ex) {
                            Logger.getLogger(PlanetCryptoBitcoinUI.class.getName()).log(Level.SEVERE, null, ex);
                            CustomCommandOutputTextArea.setText("Command: " + command + "\nResponse: Error \n");
                            CustomCommandEntryTextField.setText("");
                            CustomCommandJsonCheckBox.setSelected(false);
                        }
                    }
                }
            }
        }
    }//GEN-LAST:event_CustomCommandSubmitButtonActionPerformed

    private void MinerSelectionBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_MinerSelectionBoxActionPerformed
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                if (MinerSelectionBox.getSelectedItem() == null
                        | MinerSelectionBox.getSelectedItem().equals("No Miners")) {
                    InformationMinerIPTextField.setText("None");
                    InformationMinerPortTextField.setText("None");
                } else {
                    String miner = MinerSelectionBox.getSelectedItem().toString();
                    for (int i = 0; i < existing_miners.size(); i++) {
                        if (existing_miners.get(i).get("name").equals(miner)) {
                            //System.out.println("Found compatible miner");
                            InformationMinerIPTextField.setText(existing_miners.get(i).get("ip"));
                            InformationMinerPortTextField.setText(existing_miners.get(i).get("port"));
                            String response = api_Commands.parseArgs(existing_miners.get(i).get("ip"),
                                    existing_miners.get(i).get("port"), "privileged", true);
                            //System.out.println(response);
                            if (response.startsWith("Fail")) {//|| response.contains("\"STATUS\":\"E\"")) {
                                //Network Difficulty
                                NetworkDifficultyTextField.setText("Miner Not Reachable");
                                // privileged
                                PrivilegedTextField.setText("Miner Not Reachable");
                                // ASICs
                                ASICsTextField.setText("Miner Not Reachable");
                                // PGAs
                                PGAsTextField.setText("Miner Not Reachable");
                                // Pool Count
                                PoolCountTextField.setText("Miner Not Reachable");
                                // Version
                                MinerVersionTextField.setText("Miner Not Reachable");
                                // Strategy
                                MinerStrategyTextField.setText("Miner Not Reachable");
                                // ACS Chains
                                ACSChain1TextField.setText("Miner Not Reachable");
                                ACSChain2TextField.setText("Miner Not Reachable");
                                ACSChain3TextField.setText("Miner Not Reachable");
                                ACSChain4TextField.setText("Miner Not Reachable");
                                // Current Hash
                                MinerCurrentHashTextField.setText("Miner Not Reachable");
                                // Average Hash
                                MinerAverageHashTextField.setText("Miner Not Reachable");
                                // Bytes Recv
                                BytesSentTextField.setText("Miner Not Reachable");
                                // Bytes Sent
                                BytesRecvTextField.setText("Miner Not Reachable");
                                // HW Error Count
                                HWErrorsTextField.setText("Miner Not Reachable");
                                // HW Error %
                                HWErrorPercentageTextField.setText("Miner Not Reachable");
                                // Found blocks
                                MinerFoundBlocksTextField.setText("Miner Not Reachable");
                                // Accepted
                                MinerAcceptedTextField.setText("Miner not Reachable");
                                // Rejected
                                MinerRejectedTextField.setText("Miner not Reachable");
                                // Best Share
                                MinerBestShareTextField.setText("Miner Not Reachable");
                                MinerNetworkBlocksTextField.setText("Miner Not Reachable");
                                // 37-40 temps
                                MinerTemp1TextField.setText("Miner Not Reachable");
                                MinerTemp2TextField.setText("Miner Not Reachable");
                                MinerTemp3TextField.setText("Miner Not Reachable");
                                MinerTemp4TextField.setText("Miner Not Reachable");
                                // Temp avg
                                MinerTempAvgTextField.setText("Miner Not Reachable");
                                // Temp max
                                MinerTextMaxTextField.setText("Miner Not Reachable");
                                // fans
                                MinerFan1TextField.setText("Miner Not Reachable");
                                MinerFan2TextField.setText("Miner Not Reachable");
                                MinerFan3TextField.setText("Miner Not Reachable");
                                MinerFan4TextField.setText("Miner Not Reachable");
                                // BTC stuff
                                CurrentBlockHashTextField.setText("Miner Not Reachable");
                                CurrentBlockTimeTextField.setText("Miner Not Reachable");
                            } else if (!response.startsWith("Fail")) {
                                String status = api_Commands.getKeys(response, "STATUS");
                                //System.out.println(status);
                                if (status.equals("E") | status.equals("Fail")) {
                                    PrivilegedTextField.setText("False");
                                } else {
                                    PrivilegedTextField.setText("True");
                                }
                                response = api_Commands.parseArgs(existing_miners.get(i).get("ip"),
                                        existing_miners.get(i).get("port"), "config", true);
                                ASICsTextField.setText(api_Commands.getKeys(response, "ASC Count"));
                                PGAsTextField.setText(api_Commands.getKeys(response, "PGA Count"));
                                PoolCountTextField.setText(api_Commands.getKeys(response, "Pool Count"));
                                MinerVersionTextField.setText(api_Commands.getKeys(response, "Description"));
                                MinerStrategyTextField.setText(api_Commands.getKeys(response, "Strategy"));
                                response = api_Commands.parseArgs(existing_miners.get(i).get("ip"),
                                        existing_miners.get(i).get("port"), "stats", true);
                                ACSChain1TextField.setText(api_Commands.getKeys(response, "chain_acs1"));
                                ACSChain2TextField.setText(api_Commands.getKeys(response, "chain_acs2"));
                                ACSChain3TextField.setText(api_Commands.getKeys(response, "chain_acs3"));
                                ACSChain4TextField.setText(api_Commands.getKeys(response, "chain_acs4"));
                                BytesSentTextField.setText(api_Commands.getKeys(response, "Net Bytes Recv"));
                                BytesRecvTextField.setText(api_Commands.getKeys(response, "Net Bytes Sent"));
                                MinerTemp1TextField.setText(api_Commands.getKeys(response, "temp1"));
                                MinerTemp2TextField.setText(api_Commands.getKeys(response, "temp2"));
                                MinerTemp3TextField.setText(api_Commands.getKeys(response, "temp3"));
                                MinerTemp4TextField.setText(api_Commands.getKeys(response, "temp4"));
                                MinerTempAvgTextField.setText(api_Commands.getKeys(response, "temp_avg"));
                                MinerTextMaxTextField.setText(api_Commands.getKeys(response, "temp_max"));
                                MinerFan1TextField.setText(api_Commands.getKeys(response, "fan1"));
                                MinerFan2TextField.setText(api_Commands.getKeys(response, "fan2"));
                                MinerFan3TextField.setText(api_Commands.getKeys(response, "fan3"));
                                MinerFan4TextField.setText(api_Commands.getKeys(response, "fan4"));
                                response = api_Commands.parseArgs(existing_miners.get(i).get("ip"),
                                        existing_miners.get(i).get("port"), "summary", true);
                                HWErrorPercentageTextField
                                        .setText(api_Commands.getKeys(response, "Device Hardware%"));
                                HWErrorsTextField.setText(api_Commands.getKeys(response, "Hardware Errors"));
                                MinerCurrentHashTextField.setText(api_Commands.getKeys(response, "GHS 5s"));
                                MinerAverageHashTextField.setText(api_Commands.getKeys(response, "GHS av"));
                                MinerFoundBlocksTextField.setText(api_Commands.getKeys(response, "Found Blocks"));
                                MinerAcceptedTextField.setText(api_Commands.getKeys(response, "Accepted"));
                                MinerRejectedTextField.setText(api_Commands.getKeys(response, "Rejected"));
                                MinerBestShareTextField.setText(api_Commands.getKeys(response, "Best Share"));
                                MinerNetworkBlocksTextField
                                        .setText(api_Commands.getKeys(response, "Network Blocks"));
                                response = api_Commands.parseArgs(existing_miners.get(i).get("ip"),
                                        existing_miners.get(i).get("port"), "coin", true);
                                DecimalFormat df = new DecimalFormat("#.##");
                                double difficulty = Double
                                        .parseDouble(api_Commands.getKeys(response, "Network Difficulty"));
                                NetworkDifficultyTextField.setText(df.format(difficulty));
                                double block_time = Double
                                        .parseDouble(api_Commands.getKeys(response, "Current Block Time"));
                                CurrentBlockHashTextField
                                        .setText(api_Commands.getKeys(response, "Current Block Hash"));
                                CurrentBlockTimeTextField.setText(df.format(block_time));
                            }
                        }
                    }
                }
                ConfigurationCurrentMinerAlarmsTextPanePropertyChange(null);
            }
        });
        t.start();
        try {
            t.join();
        } catch (InterruptedException ex) {
            Logger.getLogger(PlanetCryptoBitcoinUI.class.getName()).log(Level.SEVERE, null, ex);
        }
    }//GEN-LAST:event_MinerSelectionBoxActionPerformed

    private void ConfigurationEligiusUsernameAddButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ConfigurationEligiusUsernameAddButtonActionPerformed
        PlanetCryptoBitcoinUserConfiguration cfg = new PlanetCryptoBitcoinUserConfiguration();
        String eligius_name = ConfigurationEligiusUsernameTextField.getText();
        if (eligius_name.equals("")) {
            JOptionPane.showMessageDialog(null, "Please enter a username.", "ERROR: NO USERNAME",
                    JOptionPane.WARNING_MESSAGE);
            return;
        }
        JOptionPane.showMessageDialog(null, cfg.addEligius(eligius_name));
        ArrayList<String> eligius_names = cfg.getEligius();
        EligiusUsernameSelectionBox.setModel(new javax.swing.DefaultComboBoxModel(eligius_names.toArray()));
        ConfigurationEligiusUsernameTextField.setText("");
        EligiusPoolInformationRefreshButtonActionPerformed(null);
        cfg.closeAll();
    }//GEN-LAST:event_ConfigurationEligiusUsernameAddButtonActionPerformed

    private void ConfigurationEligiusUsernameRemoveButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ConfigurationEligiusUsernameRemoveButtonActionPerformed
        PlanetCryptoBitcoinUserConfiguration cfg = new PlanetCryptoBitcoinUserConfiguration();
        String eligius_name = ConfigurationEligiusUsernameTextField.getText();
        if (eligius_name.equals("")) {
            JOptionPane.showMessageDialog(null, "Please enter a username.", "ERROR: NO USERNAME",
                    JOptionPane.WARNING_MESSAGE);
            return;
        }
        //System.out.println("Removing " + eligius_name);
        final String temp = cfg.removeEligius(eligius_name);
        if (temp.startsWith("Error")) {
            Thread t = new Thread(new Runnable() {
                @Override
                public void run() {
                    //System.out.println(temp);
                    JOptionPane.showMessageDialog(null, temp, "Error", JOptionPane.WARNING_MESSAGE);
                    EligiousPayoutKeyInformationTextPane.setText(temp);
                }
            });
            t.start();
            try {
                t.join();
            } catch (InterruptedException ex) {
                Logger.getLogger(PlanetCryptoBitcoinUI.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        ArrayList<String> eligius_names = cfg.getEligius();
        cfg.closeAll();
        EligiusUsernameSelectionBox.setModel(new javax.swing.DefaultComboBoxModel(eligius_names.toArray()));
        EligiusPoolInformationRefreshButtonActionPerformed(null);
        ConfigurationEligiusUsernameTextField.setText("");
    }//GEN-LAST:event_ConfigurationEligiusUsernameRemoveButtonActionPerformed

    private void ConfigurationResolveHostAddressButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ConfigurationResolveHostAddressButtonActionPerformed
        try {
            InetAddress address = InetAddress.getByName(ConfigurationResolveHostAddressTextField.getText());
            ConfigurationAddMinerIPTextField.setText(address.getHostAddress());
            ConfigurationResolveHostAddressTextField.setText("");
        } catch (UnknownHostException e) {
            JOptionPane.showMessageDialog(null,
                    "Unknown host: " + ConfigurationResolveHostAddressTextField.getText(), "ERROR: Unknown Host",
                    JOptionPane.WARNING_MESSAGE);
        }

    }//GEN-LAST:event_ConfigurationResolveHostAddressButtonActionPerformed

    private void EligiusPoolInformationRefreshButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_EligiusPoolInformationRefreshButtonActionPerformed

        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                PlanetCryptoNetworkMethods parser = new PlanetCryptoNetworkMethods();
                Object eligius_selected = EligiusUsernameSelectionBox.getSelectedItem();
                existing_eligius = currentEligius();
                if (null == eligius_selected || existing_eligius.get(0).startsWith("Eligius not configured")) {
                    EligiusHashRateInformationTable.setModel(new javax.swing.table.DefaultTableModel(
                            new Object[][] { { "12 Hours", null, null }, { "3 Hours", null, null },
                                    { "22.5 Minutes", null, null }, { "256 Seconds", null, null },
                                    { "128 Seconds", null, null } },
                            new String[] { "Interval", "Hashrate", "Weighted Shares" }) {
                        Class[] types = new Class[] { java.lang.String.class, java.lang.String.class,
                                java.lang.Integer.class };
                        boolean[] canEdit = new boolean[] { false, false, false };

                        @Override
                        public Class getColumnClass(int columnIndex) {
                            return types[columnIndex];
                        }

                        @Override
                        public boolean isCellEditable(int rowIndex, int columnIndex) {
                            return canEdit[columnIndex];
                        }
                    });
                } else {
                    String eligius_name = "&username=" + eligius_selected.toString();
                    String hashrates = parser.getHashRate(eligius_name.toString());
                    //System.out.println(eligius_name.toString());
                    EligiusHashRateInformationTable.setModel(new javax.swing.table.DefaultTableModel(
                            new Object[][] {
                                    { "12 Hours", parser.getHashRateIntervals(hashrates, "av43200").get(0),
                                            parser.getHashRateIntervals(hashrates, "av43200").get(1) },
                                    { "3 Hours", parser.getHashRateIntervals(hashrates, "av10800").get(0),
                                            parser.getHashRateIntervals(hashrates, "av10800").get(1) },
                                    { "22.5 Minutes", parser.getHashRateIntervals(hashrates, "av1350").get(0),
                                            parser.getHashRateIntervals(hashrates, "av1350").get(1) },
                                    { "256 Seconds", parser.getHashRateIntervals(hashrates, "av256").get(0),
                                            parser.getHashRateIntervals(hashrates, "av256").get(1) },
                                    { "128 Seconds", parser.getHashRateIntervals(hashrates, "av128").get(0),
                                            parser.getHashRateIntervals(hashrates, "av128").get(1) } },
                            new String[] { "Interval", "Hashrate", "Weighted Shares" }) {
                        Class[] types = new Class[] { java.lang.String.class, java.lang.String.class,
                                java.lang.Integer.class };
                        boolean[] canEdit = new boolean[] { false, false, false };

                        @Override
                        public Class getColumnClass(int columnIndex) {
                            return types[columnIndex];
                        }

                        @Override
                        public boolean isCellEditable(int rowIndex, int columnIndex) {
                            return canEdit[columnIndex];
                        }
                    });
                }
                EligiusHashRateInformationScrollPane.setViewportView(EligiusHashRateInformationTable);

                if (null == eligius_selected || existing_eligius.get(0).startsWith("Eligius not configured")) {
                    EligiusPayoutInformationTable
                            .setModel(
                                    new javax.swing.table.DefaultTableModel(
                                            new Object[][] { { "bal", null }, { "ec", null }, { "everpaid", null },
                                                    { "lbal", null }, { "lec", null } },
                                            new String[] { "", "Amount" }) {
                                        Class[] types = new Class[] { java.lang.String.class,
                                                java.lang.String.class, java.lang.Integer.class };
                                        boolean[] canEdit = new boolean[] { false, false, false };

                                        @Override
                                        public Class getColumnClass(int columnIndex) {
                                            return types[columnIndex];
                                        }

                                        @Override
                                        public boolean isCellEditable(int rowIndex, int columnIndex) {
                                            return canEdit[columnIndex];
                                        }
                                    });
                } else {
                    String eligius_name = "&username=" + eligius_selected.toString();
                    String stats = parser.getUserStat(eligius_name);
                    EligiusPayoutInformationTable
                            .setModel(new javax.swing.table.DefaultTableModel(
                                    new Object[][] { { "bal", parser.getUserStats(stats, "bal") },
                                            { "ec", parser.getUserStats(stats, "ec") },
                                            { "everpaid", parser.getUserStats(stats, "everpaid") },
                                            { "lbal", parser.getUserStats(stats, "lbal") },
                                            { "lec", parser.getUserStats(stats, "lec") } },
                                    new String[] { "", "Amount" }) {
                                Class[] types = new Class[] { java.lang.String.class, java.lang.String.class,
                                        java.lang.Integer.class };
                                boolean[] canEdit = new boolean[] { false, false, false };

                                @Override
                                public Class getColumnClass(int columnIndex) {
                                    return types[columnIndex];
                                }

                                @Override
                                public boolean isCellEditable(int rowIndex, int columnIndex) {
                                    return canEdit[columnIndex];
                                }
                            });
                }
                EligiusPayoutInformationPayoutScrollPane.setViewportView(EligiusPayoutInformationTable);
                PlanetCryptoBitcoinCoinbase coinbase = new PlanetCryptoBitcoinCoinbase();
                String rate = coinbase.getContent("https://coinbase.com/api/v1/currencies/exchange_rates",
                        "btc_to_" + GenericInformationAbbreviatedPreferredCurrencyLabel.getText().toLowerCase());
                if (EligiusPayoutInformationTable.contains(0, 1)
                        && null != EligiusPayoutInformationTable.getValueAt(0, 1)) {
                    String payout = EligiusPayoutInformationTable.getValueAt(0, 1).toString().replace(" BTC", "");
                    EstimatedPayoutTextField
                            .setText(String.valueOf(Float.parseFloat(rate) * Float.parseFloat(payout)));
                    BTCConversionRateTextField.setText(rate);
                    EstimatedPayoutTextField
                            .setText(String.valueOf(Float.parseFloat(rate) * Float.parseFloat(payout)));
                } else {
                    //String payout = EligiusPayoutInformationTable.getValueAt(0, 1).toString().replace(" BTC", "");

                    BTCConversionRateTextField.setText("Click the refresh button");
                    EstimatedPayoutTextField.setText("Click the refresh button");
                }
            }
        });
        t.start();
        try {
            t.join();
        } catch (InterruptedException ex) {
            Logger.getLogger(PlanetCryptoBitcoinUI.class.getName()).log(Level.SEVERE, null, ex);
        }

    }//GEN-LAST:event_EligiusPoolInformationRefreshButtonActionPerformed

    private void ConfigurationMinerTempAlarmUpdateButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ConfigurationMinerTempAlarmUpdateButtonActionPerformed
        // TODO add your handling code here:
        float alarm_temp = 0;
        String miner = MinerSelectionForAlarmsBox.getSelectedItem().toString();
        if (miner.startsWith("No Miners")) {
            JOptionPane.showMessageDialog(null, "Please add miners under the miners tab first.", "ERROR: NO MINERS",
                    JOptionPane.WARNING_MESSAGE);
            return;
        }
        try {
            alarm_temp = Float.parseFloat(ConfigurationMinerTempAlarmTextField.getText());
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(null, "Please enter a valid number", "ERROR: INVALID NUMBER",
                    JOptionPane.INFORMATION_MESSAGE);
            ConfigurationMinerTempAlarmTextField.setText("");
            return;
        }
        PlanetCryptoBitcoinUserConfiguration cfg = new PlanetCryptoBitcoinUserConfiguration();
        String rvalue = cfg.updateAlarms("temp", miner, alarm_temp);
        ConfigurationMinerTempAlarmTextField.setText("");
        if (rvalue.startsWith("Error")) {
            JOptionPane.showMessageDialog(null, rvalue, "ERROR!", JOptionPane.WARNING_MESSAGE);
        } else {
            JOptionPane.showMessageDialog(null, rvalue, "SUCCESS!", JOptionPane.INFORMATION_MESSAGE);
        }
        cfg.closeAll();
        ConfigurationCurrentMinerAlarmsTextPanePropertyChange(null);
    }//GEN-LAST:event_ConfigurationMinerTempAlarmUpdateButtonActionPerformed

    private void EligiusUsernameSelectionBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_EligiusUsernameSelectionBoxActionPerformed
        // TODO add your handling code here:
        EligiusPoolInformationRefreshButtonActionPerformed(null);
        //GenericInformationCoinbaseUserSelectionBoxActionPerformed(null);
    }//GEN-LAST:event_EligiusUsernameSelectionBoxActionPerformed

    private void EligiusUsernameClipboardCopyButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_EligiusUsernameClipboardCopyButtonActionPerformed
        // TODO add your handling code here:
        String temp = EligiusStatusLabel.getText();
        if (temp.startsWith(("Eligius not configured"))) {
            JOptionPane.showMessageDialog(null, "Please configure Eligius before using this feature",
                    "NOTIFICATION", JOptionPane.WARNING_MESSAGE);
        } else {
            PlanetCryptoBitcoinClipBoardFunctions textTransfer = new PlanetCryptoBitcoinClipBoardFunctions();
            textTransfer.setClipboardContents(EligiusStatusLabel.getText());
        }
    }//GEN-LAST:event_EligiusUsernameClipboardCopyButtonActionPerformed

    private void CustomCommandJsonCheckBoxKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_CustomCommandJsonCheckBoxKeyPressed
        // TODO add your handling code here:
        if (CustomCommandJsonCheckBox.isSelected()) {
            CustomCommandJsonCheckBox.setSelected(false);
        } else {
            CustomCommandJsonCheckBox.setSelected(true);
        }
    }//GEN-LAST:event_CustomCommandJsonCheckBoxKeyPressed

    private void EligiusOpenBrowserButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_EligiusOpenBrowserButtonActionPerformed
        // TODO add your handling code here:
        //TextTransfer textTransfer = new TextTransfer();
        try {
            String username = EligiusStatusLabel.getText();
            if (username.equals("Eligius not configured at this time")) {
                JOptionPane.showMessageDialog(null, "Please configure Eligius before using this feature",
                        "NOTIFICATION", JOptionPane.WARNING_MESSAGE);
                return;
            }
            URI temp = new URI("http://eligius.st/~wizkid057/newstats/userstats.php/" + username);
            PlanetCryptoNetworkMethods.openWebpage(temp);
        } catch (URISyntaxException e) {
            JOptionPane.showMessageDialog(null, e, "ERROR: Invalid URI", JOptionPane.WARNING_MESSAGE);
        }
        //textTransfer.setClipboardContents("http://eligius.st/~wizkid057/newstats/userstats.php/"+EligiusStatusLabel.getText());
    }//GEN-LAST:event_EligiusOpenBrowserButtonActionPerformed

    private void MinerVitalStatsTextPanePropertyChange(java.beans.PropertyChangeEvent evt) {//GEN-FIRST:event_MinerVitalStatsTextPanePropertyChange
        // TODO add your handling code here:
        existing_miners = currentMiners();
        StringBuffer body = new StringBuffer();
        String temp = new String();
        String response = new String();
        if (MinerSelectionBox.getSelectedItem() == null | MinerSelectionBox.getSelectedItem().equals("No Miners")) {
            body.append("<tr>");
            for (int i = 0; i < 11; ++i) {
                body.append("<td>None</td>");
            }
            body.append("</tr>");
            MinerVitalStatsTextPane.setText(VitalStatsHeader + body.toString() + VitalStatsFooter);
        } else {
            Thread t;
            t = new Thread(new Runnable() {
                @Override
                public void run() {
                    Double temp_value;
                    String alarm_string;
                    Double alarm_value;
                    StringBuffer body = new StringBuffer();
                    String response_stats;
                    String response_summary;
                    String newcolumn = "</td><td>";
                    String newrow = "<tr><td>";
                    String closerow = "</td></tr>";
                    body.append(VitalStatsHeader);
                    for (int i = 0; i < existing_miners.size(); i++) {
                        response_stats = api_Commands.parseArgs(existing_miners.get(i).get("ip"),
                                existing_miners.get(i).get("port"), "stats", true);
                        existing_alarms = currentAlarms(existing_miners.get(i).get("name"));
                        if (existing_alarms == null) {
                            body.append(newrow);
                            body.append(existing_miners.get(i).get("name"));
                            body.append(newcolumn);
                            body.append(api_Commands.getKeys(response_stats, "temp1"));
                            body.append(newcolumn);
                            body.append(api_Commands.getKeys(response_stats, "temp2"));
                            body.append(newcolumn);
                            body.append(api_Commands.getKeys(response_stats, "temp3"));
                            body.append(newcolumn);
                            body.append(api_Commands.getKeys(response_stats, "temp4"));
                            body.append(newcolumn);
                            body.append(api_Commands.getKeys(response_stats, "fan1"));
                            body.append(newcolumn);
                            body.append(api_Commands.getKeys(response_stats, "fan2"));
                            body.append(newcolumn);
                            body.append(api_Commands.getKeys(response_stats, "fan3"));
                            body.append(newcolumn);
                            body.append(api_Commands.getKeys(response_stats, "fan4"));
                            body.append(newcolumn);
                            response_summary = api_Commands.parseArgs(existing_miners.get(i).get("ip"),
                                    existing_miners.get(i).get("port"), "summary", true);
                            body.append(api_Commands.getKeys(response_summary, "GHS 5s"));
                            body.append(newcolumn);
                            body.append(api_Commands.getKeys(response_stats, "Device Hardware%"));
                            body.append(closerow);
                        } else {
                            body.append(newrow);
                            body.append(existing_miners.get(i).get("name"));
                            body.append(newcolumn);
                            alarm_string = existing_alarms.get("temp").toString();
                            alarm_value = (alarm_string == null) ? 0 : Double.parseDouble(alarm_string);
                            for (int j = 1; j < 5; j++) {
                                temp_value = Double.parseDouble(
                                        api_Commands.getKeys(response_stats, "temp" + String.valueOf(j)));
                                if (alarm_value == 0 | alarm_value > temp_value) {
                                    body.append(temp_value);
                                    body.append(newcolumn);
                                } else {
                                    body.append(
                                            "<span style=\"color:red;font-weight:bold\">" + temp_value + "</span>");
                                    body.append(newcolumn);
                                }
                            }
                            alarm_string = existing_alarms.get("fan").toString();
                            alarm_value = (alarm_string == null) ? 0 : Double.parseDouble(alarm_string);
                            for (int j = 1; j < 5; j++) {
                                temp_value = Double.parseDouble(
                                        api_Commands.getKeys(response_stats, "fan" + String.valueOf(j)));
                                if (alarm_value >= temp_value) {
                                    body.append(temp_value);
                                    body.append(newcolumn);
                                } else {
                                    body.append(
                                            "<span style=\"color:red;font-weight:bold\">" + temp_value + "</span>");
                                    body.append(newcolumn);
                                }
                            }
                            alarm_string = existing_alarms.get("hash_rate").toString();
                            alarm_value = (alarm_string == null) ? 0 : Double.parseDouble(alarm_string);
                            String hash_rate_type = (existing_alarms.get("hash_rate_type") == null) ? "GH/s"
                                    : existing_alarms.get("hash_rate_type").toString();
                            response_summary = api_Commands.parseArgs(existing_miners.get(i).get("ip"),
                                    existing_miners.get(i).get("port"), "summary", true);
                            temp_value = Double.parseDouble(api_Commands.getKeys(response_summary, "GHS 5s"));
                            if (alarm_value == 0) {
                                body.append(temp_value);
                                body.append(newcolumn);
                            } else {
                                if (hash_rate_type.startsWith("M")) { // Mega hash resolution 
                                    if (alarm_value * 0.0009765625 > temp_value) {
                                        body.append(temp_value);
                                        body.append(newcolumn);
                                    } else {
                                        body.append("<span style=\"color:red;font-weight:bold\">" + temp_value
                                                + "</span>");
                                        body.append(newcolumn);
                                    }
                                } else if (hash_rate_type.startsWith("G")) { // giga hash resolution
                                    if (alarm_value > temp_value) {
                                        body.append(temp_value);
                                        body.append(newcolumn);
                                    } else {
                                        body.append("<span style=\"color:red;font-weight:bold\">" + temp_value
                                                + "</span>");
                                        body.append(newcolumn);
                                    }
                                } else {
                                    if (alarm_value > temp_value * 0.0009765625) {
                                        body.append(temp_value);
                                        body.append(newcolumn);
                                    } else {
                                        body.append("<span style=\"color:red;font-weight:bold\">" + temp_value
                                                + "</span>");
                                        body.append(newcolumn);
                                    }
                                }
                            }
                            alarm_string = existing_alarms.get("hw_err").toString();
                            alarm_value = (alarm_string == null) ? 0 : Double.parseDouble(alarm_string);
                            temp_value = Double
                                    .parseDouble(api_Commands.getKeys(response_stats, "Device Hardware%"));
                            if (alarm_value == 0) {
                                body.append(temp_value);
                                body.append(closerow);
                            } else {
                                body.append("<span style=\"color:red;font-weight:bold\">" + temp_value + "</span>");
                                body.append(closerow);
                            }
                        }
                    }
                    body.append(VitalStatsFooter);
                    MinerVitalStatsTextPane.setText(body.toString());
                }
            });
            t.start();
            try {
                t.join();
            } catch (InterruptedException ex) {
                Logger.getLogger(PlanetCryptoBitcoinUI.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }//GEN-LAST:event_MinerVitalStatsTextPanePropertyChange

    private void VitalStatsRefreshButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_VitalStatsRefreshButtonActionPerformed
        // TODO add your handling code here:
        MinerVitalStatsTextPanePropertyChange(null);
    }//GEN-LAST:event_VitalStatsRefreshButtonActionPerformed

    private void ConfigurationMinerFanSpeedAlarmUpdateButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ConfigurationMinerFanSpeedAlarmUpdateButtonActionPerformed
        // TODO add your handling code here:
        float alarm_temp = 0;
        String miner = MinerSelectionForAlarmsBox.getSelectedItem().toString();
        if (miner.startsWith("No Miners")) {
            JOptionPane.showMessageDialog(null, "Please add miners under the miners tab first.", "ERROR: NO MINERS",
                    JOptionPane.WARNING_MESSAGE);
            return;
        }
        try {
            alarm_temp = Float.parseFloat(ConfigurationFanSpeedAlarmTextField.getText());
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(null, "Please enter a valid number", "ERROR: INVALID FAN SPEED",
                    JOptionPane.WARNING_MESSAGE);
            ConfigurationFanSpeedAlarmTextField.setText("");
            return;
        }
        PlanetCryptoBitcoinUserConfiguration cfg = new PlanetCryptoBitcoinUserConfiguration();
        String rvalue = cfg.updateAlarms("fan", miner, alarm_temp);
        if (rvalue.startsWith("Error")) {
            JOptionPane.showMessageDialog(null, rvalue, "ERROR!", JOptionPane.WARNING_MESSAGE);
        } else {
            JOptionPane.showMessageDialog(null, rvalue, "SUCCESS!", JOptionPane.INFORMATION_MESSAGE);
        }
        cfg.closeAll();
        ConfigurationFanSpeedAlarmTextField.setText("");
        ConfigurationCurrentMinerAlarmsTextPanePropertyChange(null);
    }//GEN-LAST:event_ConfigurationMinerFanSpeedAlarmUpdateButtonActionPerformed

    private void ConfigurationMinerHashRateAlarmUpdateButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ConfigurationMinerHashRateAlarmUpdateButtonActionPerformed
        // TODO add your handling code here:
        float alarm_hashrate = 0;
        String alarm_hashratetype = new String();
        String miner = MinerSelectionForAlarmsBox.getSelectedItem().toString();
        if (miner.startsWith("No Miners")) {
            JOptionPane.showMessageDialog(null, "Please add miners under the miners tab first.", "ERROR: NO MINERS",
                    JOptionPane.WARNING_MESSAGE);
            return;
        }
        try {
            alarm_hashrate = Float.parseFloat(ConfigurationMinerHashRateAlarmTextField.getText());
            alarm_hashratetype = ConfigurationHashRatePostfixComboBox.getSelectedItem().toString();
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(null, "Please enter a valid number", "ERROR: INVALID FAN SPEED",
                    JOptionPane.WARNING_MESSAGE);
            ConfigurationFanSpeedAlarmTextField.setText("");
            return;
        }
        PlanetCryptoBitcoinUserConfiguration cfg = new PlanetCryptoBitcoinUserConfiguration();
        String rvalue = cfg.updateAlarms("hash_rate", miner, alarm_hashrate);
        rvalue = cfg.updateAlarms("hash_rate_type", miner, alarm_hashratetype);
        ConfigurationMinerTempAlarmTextField.setText("");
        if (rvalue.startsWith("Error")) {
            JOptionPane.showMessageDialog(null, rvalue, "ERROR!", JOptionPane.WARNING_MESSAGE);
        } else {
            JOptionPane.showMessageDialog(null, rvalue, "SUCCESS!", JOptionPane.INFORMATION_MESSAGE);
        }
        cfg.closeAll();
        ConfigurationMinerHashRateAlarmTextField.setText("");
        ConfigurationHashRatePostfixComboBox.setSelectedIndex(1);
        ConfigurationCurrentMinerAlarmsTextPanePropertyChange(null);
    }//GEN-LAST:event_ConfigurationMinerHashRateAlarmUpdateButtonActionPerformed

    private void ConfigurationMinerHardwareErrPercentAlarmUpdateButtonActionPerformed(
            java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ConfigurationMinerHardwareErrPercentAlarmUpdateButtonActionPerformed
        // TODO add your handling code here:
        float alarm_hardware = 0;
        String miner = MinerSelectionForAlarmsBox.getSelectedItem().toString();
        if (miner.startsWith("No Miners")) {
            JOptionPane.showMessageDialog(null, "Please add miners under the miners tab first.", "ERROR: NO MINERS",
                    JOptionPane.WARNING_MESSAGE);
            return;
        }
        try {
            alarm_hardware = Float.parseFloat(ConfigurationMinerHardwareErrPercentAlarmTextField.getText());
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(null, "Please enter a valid number", "ERROR: INVALID FAN SPEED",
                    JOptionPane.WARNING_MESSAGE);
            ConfigurationFanSpeedAlarmTextField.setText("");
            return;
        }
        PlanetCryptoBitcoinUserConfiguration cfg = new PlanetCryptoBitcoinUserConfiguration();
        String rvalue = cfg.updateAlarms("hw_err", miner, alarm_hardware);
        if (rvalue.startsWith("Error")) {
            JOptionPane.showMessageDialog(null, rvalue, "ERROR!", JOptionPane.WARNING_MESSAGE);
        } else {
            JOptionPane.showMessageDialog(null, rvalue, "SUCCESS!", JOptionPane.INFORMATION_MESSAGE);
        }
        cfg.closeAll();
        ConfigurationMinerHardwareErrPercentAlarmTextField.setText("");
        ConfigurationCurrentMinerAlarmsTextPanePropertyChange(null);
    }//GEN-LAST:event_ConfigurationMinerHardwareErrPercentAlarmUpdateButtonActionPerformed

    private void ConfigurationCurrentMinerAlarmsTextPanePropertyChange(java.beans.PropertyChangeEvent evt) {//GEN-FIRST:event_ConfigurationCurrentMinerAlarmsTextPanePropertyChange
        // TODO add your handling code here:
        PlanetCryptoBitcoinUserConfiguration cfg = new PlanetCryptoBitcoinUserConfiguration();
        StringBuffer current_alarms = new StringBuffer();
        String temp = new String();
        Object temp_type = new Object();
        HashMap<String, Object> temp_alarms = new HashMap<>();
        current_alarms.append(CurrentAlarmsHeader);
        //System.out.println(existing_miners.toString());
        for (int i = 0; i < existing_miners.size(); ++i) {
            temp = existing_miners.get(i).get("name");
            if (temp.equals("No Miners")) {
                current_alarms.append(newrow);
                for (int j = 0; j < 5; j++) {
                    current_alarms.append("None");
                    if (j == 4) {
                        break;
                    }
                    current_alarms.append(newcolumn);
                }
                current_alarms.append(closerow);
                current_alarms.append(VitalStatsFooter);
                //System.out.println(current_alarms.toString());
                break;
            }
            temp_alarms = cfg.getAlarms(temp);
            if (temp_alarms == null) {
                current_alarms.append(newrow);
                current_alarms.append(temp);
                current_alarms.append(newcolumn);
                for (int j = 0; j < 4; j++) {
                    current_alarms.append("None");
                    if (j == 3) {
                        break;
                    }
                    current_alarms.append(newcolumn);
                }
                current_alarms.append(closerow);
                //System.out.println(current_alarms.toString());
                continue;
            } else {
                current_alarms.append(newrow);
                current_alarms.append(temp);
                current_alarms.append(newcolumn);
                current_alarms.append(temp_alarms.get("fan"));
                current_alarms.append(newcolumn);
                current_alarms.append(temp_alarms.get("temp"));
                current_alarms.append(newcolumn);
                temp_type = temp_alarms.get("hash_rate_type");
                temp_type = (temp_type == null) ? "GH/s" : temp_type.toString();
                current_alarms.append(temp_alarms.get("hash_rate") + " " + temp_type);
                current_alarms.append(newcolumn);
                current_alarms.append(temp_alarms.get("hw_err"));
                current_alarms.append(closerow);
            }
        }
        current_alarms.append(VitalStatsFooter);
        ConfigurationCurrentMinerAlarmsTextPane.setText(current_alarms.toString());
    }//GEN-LAST:event_ConfigurationCurrentMinerAlarmsTextPanePropertyChange

    private void BitcoinInformationRefreshButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_BitcoinInformationRefreshButtonActionPerformed
        // TODO add your handling code here:
        MinerSelectionBoxActionPerformed(null);
        EligiusPoolInformationRefreshButtonActionPerformed(null);
    }//GEN-LAST:event_BitcoinInformationRefreshButtonActionPerformed

    private void MinerGenericInformationRefreshButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_MinerGenericInformationRefreshButtonActionPerformed
        // TODO add your handling code here:
        MinerSelectionBoxActionPerformed(null);
    }//GEN-LAST:event_MinerGenericInformationRefreshButtonActionPerformed

    private void MinerTemperaturesRefreshButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_MinerTemperaturesRefreshButtonActionPerformed
        // TODO add your handling code here:
        MinerSelectionBoxActionPerformed(null);
    }//GEN-LAST:event_MinerTemperaturesRefreshButtonActionPerformed

    private void MinerFanSpeedsRefreshButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_MinerFanSpeedsRefreshButtonActionPerformed
        // TODO add your handling code here:
        MinerSelectionBoxActionPerformed(null);
    }//GEN-LAST:event_MinerFanSpeedsRefreshButtonActionPerformed

    private void MinerHashRatesRefreshButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_MinerHashRatesRefreshButtonActionPerformed
        // TODO add your handling code here:
        MinerSelectionBoxActionPerformed(null);
    }//GEN-LAST:event_MinerHashRatesRefreshButtonActionPerformed

    private void AddCoinbaseUsernameButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_AddCoinbaseUsernameButtonActionPerformed
        // TODO add your handling code here:

        //System.out.println(existing_coinbase.toString() == null ? existing_coinbase.toString() : "No users");
        PlanetCryptoBitcoinUserConfiguration cfg = new PlanetCryptoBitcoinUserConfiguration();
        LinkedHashMap<String, String> coinbase_update = new LinkedHashMap<>();
        boolean currencyRequired = true;
        boolean exists = false;
        boolean api_key_set = false;
        boolean api_secret_set = false;
        boolean currency_set = false;
        String email = CoinbaseAPIUsernameTextField.getText();
        String API_key = CoinbaseAPIKeyTextField.getText();
        String API_secret = CoinbaseAPISecretKeyTextField.getText();
        String preferred_currency = ConfigurationCoinbaseCurrencyComboBox.getSelectedItem().toString();

        if (email.isEmpty()) {
            JOptionPane.showMessageDialog(null, "Enter Username", "ERROR: NO USERNAME",
                    JOptionPane.WARNING_MESSAGE);
            return;
        }
        if (existing_coinbase == null) {
            exists = false;
            currencyRequired = true;
        } else {
            for (int i = 0; i < existing_coinbase.size(); ++i) {
                exists = existing_coinbase.get(i).get("email").equals(email);
                currencyRequired = false;
                api_key_set = existing_coinbase.get(i).get("api_key").isEmpty();
                api_secret_set = existing_coinbase.get(i).get("api_secret").isEmpty();
                currency_set = existing_coinbase.get(i).get("currency").isEmpty();
                if (exists)
                    break;
            }
        }
        if (exists && !API_key.isEmpty())
            coinbase_update.put("api_key", API_key);
        if (exists && !API_secret.isEmpty())
            coinbase_update.put("api_secret", API_secret);
        if (exists && !preferred_currency.equals("Select"))
            coinbase_update.put("currency", preferred_currency);
        if (!exists && preferred_currency.equals("Select")) {
            JOptionPane.showMessageDialog(null, "Please select preferred currency", "ERROR: NO CURRENCY SELECTED",
                    JOptionPane.WARNING_MESSAGE);
            return;
        } else if (!exists && !preferred_currency.equals("Select")) {
            coinbase_update.put("email", email);
            coinbase_update.put("api_key", API_key);
            coinbase_update.put("api_secret", API_secret);
            coinbase_update.put("currency", preferred_currency);
            String result = cfg.addCoinBase(coinbase_update, email, exists);
            JOptionPane.showMessageDialog(null, result);
            CoinbaseAPIUsernameTextField.setText("");
            CoinbaseAPIKeyTextField.setText("");
            CoinbaseAPISecretKeyTextField.setText("");
            ConfigurationCoinbaseCurrencyComboBox.setSelectedIndex((0));
            cfg.closeAll();
            GenericInformationCoinbaseUserSelectionBox
                    .setModel(new DefaultComboBoxModel(existingCoinbase().toArray()));
            CurrentCoinbaseConfigurationTextPanePropertyChange(null);
            GenericInformationCoinbaseUserSelectionBoxActionPerformed(null);
            return;
        } else if (exists) {
            String result = cfg.addCoinBase(coinbase_update, email, exists);
            JOptionPane.showMessageDialog(null, result);
            CoinbaseAPIUsernameTextField.setText("");
            CoinbaseAPIKeyTextField.setText("");
            CoinbaseAPISecretKeyTextField.setText("");
            ConfigurationCoinbaseCurrencyComboBox.setSelectedIndex((0));
            cfg.closeAll();
            GenericInformationCoinbaseUserSelectionBox
                    .setModel(new DefaultComboBoxModel(existingCoinbase().toArray()));
            CurrentCoinbaseConfigurationTextPanePropertyChange(null);
            GenericInformationCoinbaseUserSelectionBoxActionPerformed(null);
            return;
        }
    }//GEN-LAST:event_AddCoinbaseUsernameButtonActionPerformed

    private void RemoveCoinbaseUsernameButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_RemoveCoinbaseUsernameButtonActionPerformed
        // TODO add your handling code here:
        PlanetCryptoBitcoinUserConfiguration cfg = new PlanetCryptoBitcoinUserConfiguration();
        existing_coinbase = cfg.getCoinbase();
        if (existing_coinbase == null) {
            JOptionPane.showInternalMessageDialog(null, "No Users to delete", "ERROR!",
                    JOptionPane.WARNING_MESSAGE);
            return;
        }
        String email = CoinbaseAPIUsernameTextField.getText();
        int response;
        if (email.isEmpty()) {
            JOptionPane.showMessageDialog(null, "Please enter Coinbase Username", "ERROR: NO PARAMETERS",
                    JOptionPane.WARNING_MESSAGE);
        } else if (!existing_coinbase.toString().contains(email)) {
            JOptionPane.showMessageDialog(null, "No such Coinbase Username: " + email + ".",
                    "ERROR: NO SUCH USERNAME", JOptionPane.WARNING_MESSAGE);
        } else if (!email.isEmpty()) {
            response = JOptionPane.showConfirmDialog(null, "Are you sure you want to delete " + email + "?",
                    "Confirm", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
            if (response == JOptionPane.NO_OPTION) {
                return;
                //System.out.println("User opted out of deleting " + miner + ".");
            } else if (response == JOptionPane.CLOSED_OPTION) {
                return;
                //System.out.println("Dialog box was closed");
            } else if (response == JOptionPane.YES_OPTION) {
                JOptionPane.showMessageDialog(null, cfg.removeCoinbase(email));
                CoinbaseAPIUsernameTextField.setText("");
                GenericInformationCoinbaseUserSelectionBox
                        .setModel(new DefaultComboBoxModel(existingCoinbase().toArray()));
                CurrentCoinbaseConfigurationTextPanePropertyChange(null);
                cfg.closeAll();
            }
        }
    }//GEN-LAST:event_RemoveCoinbaseUsernameButtonActionPerformed

    private void CurrentCoinbaseConfigurationTextPanePropertyChange(java.beans.PropertyChangeEvent evt) {//GEN-FIRST:event_CurrentCoinbaseConfigurationTextPanePropertyChange
        // TODO add your handling code here:
        existing_coinbase = currentCoinbase();
        StringBuffer html = new StringBuffer();
        if (existing_coinbase == null) {
            CurrentCoinbaseConfigurationTextPane
                    .setText("<html><body><p><b>No Configuration</b></p></body></html>");
        } else {
            html.append(CurrentCoinbaseHeader + newrow);
            for (int i = 0; i < existing_coinbase.size(); ++i) {
                html.append(existing_coinbase.get(i).get("email"));
                html.append(newcolumn);
                html.append(existing_coinbase.get(i).get("api_key"));
                html.append(newcolumn);
                String temp = existing_coinbase.get(i).get("api_secret");
                html.append(temp.replace(temp.substring(temp.length() / 3, temp.length()), "..."));
                html.append(newcolumn);
                html.append(existing_coinbase.get(i).get("currency"));
                html.append(closerow);
            }
            html.append(VitalStatsFooter);
            CurrentCoinbaseConfigurationTextPane.setText(html.toString());
        }
    }//GEN-LAST:event_CurrentCoinbaseConfigurationTextPanePropertyChange

    private void EligiusPayoutInformationTablePropertyChange(java.beans.PropertyChangeEvent evt) {//GEN-FIRST:event_EligiusPayoutInformationTablePropertyChange
        // TODO add your handling code here:    
    }//GEN-LAST:event_EligiusPayoutInformationTablePropertyChange

    private void GenericInformationAbbreviatedPreferredCurrencyLabelPropertyChange(
            java.beans.PropertyChangeEvent evt) {//GEN-FIRST:event_GenericInformationAbbreviatedPreferredCurrencyLabelPropertyChange
        // TODO add your handling code here:
        String temp = getAbbreviatedPreferredCurrency();
        if (temp == null) {
            GenericInformationAbbreviatedPreferredCurrencyLabel.setText("USD");
            return;
        }
        GenericInformationAbbreviatedPreferredCurrencyLabel.setText(temp);
    }//GEN-LAST:event_GenericInformationAbbreviatedPreferredCurrencyLabelPropertyChange

    private void GenericInformationCoinbaseUserSelectionBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_GenericInformationCoinbaseUserSelectionBoxActionPerformed
        // TODO add your handling code here:
        //EligiusPoolInformationRefreshButtonActionPerformed(null);
        GenericInformationAbbreviatedPreferredCurrencyLabelPropertyChange(null);
        EligiusUsernameSelectionBoxActionPerformed(null);
        BitcoinInformationRefreshButtonActionPerformed(null);
    }//GEN-LAST:event_GenericInformationCoinbaseUserSelectionBoxActionPerformed

    /**
     */
    private static PlanetCryptoBitcoinMinerAPICommands api_Commands = new PlanetCryptoBitcoinMinerAPICommands();
    private static ArrayList<String> existing_eligius;
    private static HashMap<String, Object> existing_alarms;
    private static Map<Integer, HashMap<String, String>> existing_miners;
    private static HashMap<Integer, HashMap<String, String>> existing_coinbase;
    private static final String CurrentCoinbaseHeader = "<html><table width=\"100%\" border=\"1\"<tr>"
            + "<td>Username</td>" + "<td>API Key</td>" + "<td>API Secret</td>" + "<td>Preferred Currency</td></tr>";
    private static final String CurrentAlarmsHeader = "<html><table border=\"1\"><tr>" + "<td>Miner</td>"
            + "<td>Fan Speed</td>" + "<td>Temperature &deg;C</td>" + "<td>Hash Rate</td>"
            + "<td>HW Error %</td></tr>";
    private static final String VitalStatsHeader = "<html><table border=\"1\"><tr bgcolor=\"#D8D8D8\">"
            + "<td>Miner</td>" + "<td>Temp 1</td>" + "<td>Temp 2</td>" + "<td>Temp 3</td>" + "<td>Temp 4</td>"
            + "<td>Fan 1</td>" + "<td>Fan 2</td>" + "<td>Fan 3</td>" + "<td>Fan 4</td>" + "<td>Hash Rate</td>"
            + "<td>HW Err %</td>" + "</tr>";
    private static final String VitalStatsFooter = "</table></html>";
    private static final String newcolumn = "</td><td>";
    private static final String newrow = "<tr><td>";
    private static final String closerow = "</td></tr>";

    protected ArrayList<String> existingCoinbase() {
        existing_coinbase = currentCoinbase();
        ArrayList<String> coinbase_users = new ArrayList<>();
        if (existing_coinbase == null) {
            coinbase_users.add("No Users");
        } else {
            for (int i = 0; i < existing_coinbase.size(); i++) {
                coinbase_users.add(existing_coinbase.get(i).get("email"));
            }
        }
        return coinbase_users;
    }

    protected String getAbbreviatedPreferredCurrency() {
        String preferred_currency;
        String current_coinbase_user = GenericInformationCoinbaseUserSelectionBox.getSelectedItem().toString();
        existing_coinbase = currentCoinbase();

        if (existing_coinbase == null) {
            return null;
        }
        for (int i = 0; i < existing_coinbase.size(); ++i) {
            if (existing_coinbase.get(i).get("email").equals(current_coinbase_user)) {
                preferred_currency = existing_coinbase.get(i).get("currency");
                preferred_currency = preferred_currency.substring(preferred_currency.indexOf("(") + 1,
                        preferred_currency.indexOf(")"));
                return preferred_currency;
            }
        }
        return null;
    }

    protected static ArrayList<String> currentEligius() {
        PlanetCryptoBitcoinUserConfiguration current_eligius = new PlanetCryptoBitcoinUserConfiguration();
        ArrayList<String> eligius = current_eligius.getEligius();
        current_eligius.closeAll();
        return eligius;
    }

    protected static HashMap<Integer, HashMap<String, String>> currentCoinbase() {
        PlanetCryptoBitcoinUserConfiguration current_coinbase = new PlanetCryptoBitcoinUserConfiguration();
        HashMap<Integer, HashMap<String, String>> coinbase = current_coinbase.getCoinbase();
        current_coinbase.closeAll();
        return coinbase;
    }

    protected static Map<Integer, HashMap<String, String>> currentMiners() {
        PlanetCryptoBitcoinUserConfiguration current_miners = new PlanetCryptoBitcoinUserConfiguration();
        Map<Integer, HashMap<String, String>> miners = current_miners.getMiners();
        current_miners.closeAll();
        return miners;
    }

    protected static HashMap<String, Object> currentAlarms(String miner) {
        PlanetCryptoBitcoinUserConfiguration current_alarms = new PlanetCryptoBitcoinUserConfiguration();
        HashMap<String, Object> alarms = current_alarms.getAlarms(miner);
        current_alarms.closeAll();
        return alarms;
    }

    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException
                | javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(PlanetCryptoBitcoinUI.class.getName())
                    .log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        existing_miners = currentMiners();
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new PlanetCryptoBitcoinUI().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JLabel ACSChain1Label;
    private javax.swing.JTextField ACSChain1TextField;
    private javax.swing.JLabel ACSChain2Label;
    private javax.swing.JTextField ACSChain2TextField;
    private javax.swing.JLabel ACSChain3Label;
    private javax.swing.JTextField ACSChain3TextField;
    private javax.swing.JLabel ACSChain4Label;
    private javax.swing.JTextField ACSChain4TextField;
    private javax.swing.JLabel ACSChainInformationLabel;
    private javax.swing.JLabel ASICsLabel;
    private javax.swing.JTextField ASICsTextField;
    private javax.swing.JMenuItem AboutMenuItem;
    private javax.swing.JButton AddCoinbaseUsernameButton;
    private javax.swing.JLabel AlarmsCurrentMinerLabel;
    private javax.swing.JMenuItem AppHelpMenuItem;
    private javax.swing.JMenuBar BFGMInerUIMenuBar;
    private javax.swing.JLabel BTCConversionRateLabel;
    private javax.swing.JTextField BTCConversionRateTextField;
    private javax.swing.JPanel BTCGenericInformationPanel;
    private javax.swing.JPanel BTCInformationPane;
    private javax.swing.JButton BitcoinInformationRefreshButton;
    private javax.swing.JTabbedPane BitcoinInformationTabbedPane;
    private javax.swing.JLabel BytesRecvLabel;
    private javax.swing.JTextField BytesRecvTextField;
    private javax.swing.JLabel BytesSentLabel;
    private javax.swing.JTextField BytesSentTextField;
    private javax.swing.JLabel CoinbaseAPICurrentUserLabel;
    private javax.swing.JLabel CoinbaseAPIKeyLabel;
    private javax.swing.JTextField CoinbaseAPIKeyTextField;
    private javax.swing.JLabel CoinbaseAPILabel;
    private javax.swing.JPanel CoinbaseAPIPanel;
    private javax.swing.JLabel CoinbaseAPISecretKeyLabel;
    private javax.swing.JTextField CoinbaseAPISecretKeyTextField;
    private javax.swing.JComboBox CoinbaseAPIUserSelectionBox;
    private javax.swing.JTextField CoinbaseAPIUsernameTextField;
    private javax.swing.JLabel CoinbaseConfigurationInstructionsLabel;
    private javax.swing.JScrollPane CoinbaseConfigurationInstructionsScrollPane;
    private javax.swing.JTextPane CoinbaseConfigurationInstructionsTextPane;
    private javax.swing.JSeparator CoinbaseConfigurationSeparator;
    private javax.swing.JSeparator CoinbaseConfigurationSeparator1;
    private javax.swing.JSeparator CoinbaseConfigurationVerticalSeparator;
    private javax.swing.JLabel CoinbaseInformationLabel;
    private javax.swing.JLabel CoinbaseUsernameLabel;
    private javax.swing.JButton ConfigurationAddMinerButton;
    private javax.swing.JLabel ConfigurationAddMinerIPLabel;
    private javax.swing.JTextField ConfigurationAddMinerIPTextField;
    private javax.swing.JLabel ConfigurationAddMinerNameLabel;
    private javax.swing.JTextField ConfigurationAddMinerNameTextField;
    private javax.swing.JLabel ConfigurationAddMinersLabel;
    private javax.swing.JPanel ConfigurationAlarmPanel;
    private javax.swing.JLabel ConfigurationAlarmSettingsPromptLabel;
    private javax.swing.JLabel ConfigurationAlarmsHWErrPercentLabel;
    private javax.swing.JPanel ConfigurationCoinExchangePanel;
    private javax.swing.JComboBox ConfigurationCoinbaseCurrencyComboBox;
    private javax.swing.JLabel ConfigurationCoinbaseCurrencyLabel;
    private javax.swing.JLabel ConfigurationCoinbaseLabel;
    private javax.swing.JLabel ConfigurationCurrentMinerAlarmsLabel;
    private javax.swing.JScrollPane ConfigurationCurrentMinerAlarmsScrollPane;
    private javax.swing.JTextPane ConfigurationCurrentMinerAlarmsTextPane;
    private javax.swing.JLabel ConfigurationCurrentMinersLabel;
    private javax.swing.JScrollPane ConfigurationCurrentMinersScrollPane;
    private javax.swing.JTextPane ConfigurationCurrentMinersTextPane;
    private javax.swing.JLabel ConfigurationDegreesCelsiusLabel;
    private javax.swing.JLabel ConfigurationEligiusExampleLabel;
    private javax.swing.JLabel ConfigurationEligiusHelpPromptLabel;
    private javax.swing.JLabel ConfigurationEligiusLabel;
    private javax.swing.JPanel ConfigurationEligiusPoolsPanel;
    private javax.swing.JButton ConfigurationEligiusUsernameAddButton;
    private javax.swing.JLabel ConfigurationEligiusUsernameLabel;
    private javax.swing.JButton ConfigurationEligiusUsernameRemoveButton;
    private javax.swing.JTextField ConfigurationEligiusUsernameTextField;
    private javax.swing.JLabel ConfigurationFanRPMLabel;
    private javax.swing.JTextField ConfigurationFanSpeedAlarmTextField;
    private javax.swing.JLabel ConfigurationHWErrorPercentLabel;
    private javax.swing.JComboBox ConfigurationHashRatePostfixComboBox;
    private javax.swing.JLabel ConfigurationMinerFanSpeedAlarmLabel;
    private javax.swing.JButton ConfigurationMinerFanSpeedAlarmUpdateButton;
    private javax.swing.JTextField ConfigurationMinerHardwareErrPercentAlarmTextField;
    private javax.swing.JButton ConfigurationMinerHardwareErrPercentAlarmUpdateButton;
    private javax.swing.JLabel ConfigurationMinerHashRateAlarmLabel;
    private javax.swing.JTextField ConfigurationMinerHashRateAlarmTextField;
    private javax.swing.JButton ConfigurationMinerHashRateAlarmUpdateButton;
    private javax.swing.JLabel ConfigurationMinerPortLabel;
    private javax.swing.JTextField ConfigurationMinerPortTextField;
    private javax.swing.JTextField ConfigurationMinerTempAlarmTextField;
    private javax.swing.JButton ConfigurationMinerTempAlarmUpdateButton;
    private javax.swing.JLabel ConfigurationMinerTemperatureAlarmLabel;
    private javax.swing.JLabel ConfigurationMiningPoolPromptLabel;
    private javax.swing.JPanel ConfigurationPanel;
    private javax.swing.JLabel ConfigurationPromptLabel;
    private javax.swing.JButton ConfigurationRemoveMinerButton;
    private javax.swing.JLabel ConfigurationRemoveMinerIPLabel;
    private javax.swing.JTextField ConfigurationRemoveMinerIPTextField;
    private javax.swing.JLabel ConfigurationRemoveMinerNameLabel;
    private javax.swing.JTextField ConfigurationRemoveMinerNameTextField;
    private javax.swing.JLabel ConfigurationRemoveMinersLabel;
    private javax.swing.JButton ConfigurationResolveHostAddressButton;
    private javax.swing.JLabel ConfigurationResolveHostAddressLabel;
    private javax.swing.JTextField ConfigurationResolveHostAddressTextField;
    private javax.swing.JTabbedPane ConfigurationTabbedPane;
    private javax.swing.JMenuItem CopyMenuItem;
    private javax.swing.JLabel CurrentBlockHashLabel;
    private javax.swing.JTextField CurrentBlockHashTextField;
    private javax.swing.JLabel CurrentBlockTimeLabel;
    private javax.swing.JTextField CurrentBlockTimeTextField;
    private javax.swing.JLabel CurrentCoinbaseConfigurationLabel;
    private javax.swing.JScrollPane CurrentCoinbaseConfigurationScrollPane;
    private javax.swing.JTextPane CurrentCoinbaseConfigurationTextPane;
    private javax.swing.JLabel CustomAPICommandCurrentMiner;
    private javax.swing.JPanel CustomAPICommandPanel;
    private javax.swing.JLabel CustomCommandEntryLabel;
    private javax.swing.JTextField CustomCommandEntryTextField;
    private javax.swing.JCheckBox CustomCommandJsonCheckBox;
    private javax.swing.JComboBox CustomCommandMinerSelectionBox;
    private javax.swing.JLabel CustomCommandOutputLabel;
    private javax.swing.JScrollPane CustomCommandOutputScrollPane;
    private javax.swing.JTextArea CustomCommandOutputTextArea;
    private javax.swing.JButton CustomCommandSubmitButton;
    private javax.swing.JMenu EditMenu;
    private javax.swing.JTextPane EligiousPayoutKeyInformationTextPane;
    private javax.swing.JScrollPane EligiusHashRateInformationScrollPane;
    private javax.swing.JTable EligiusHashRateInformationTable;
    private javax.swing.JButton EligiusOpenBrowserButton;
    private javax.swing.JScrollPane EligiusPayoutInformationPayoutScrollPane;
    private javax.swing.JTable EligiusPayoutInformationTable;
    private javax.swing.JScrollPane EligiusPayoutKeyInformationScrollPane;
    private javax.swing.JLabel EligiusPoolCurrentUsernameLabel;
    private javax.swing.JPanel EligiusPoolInformationPanel;
    private javax.swing.JButton EligiusPoolInformationRefreshButton;
    private javax.swing.JLabel EligiusStatusLabel;
    private javax.swing.JButton EligiusUsernameClipboardCopyButton;
    private javax.swing.JComboBox EligiusUsernameSelectionBox;
    private javax.swing.JLabel EstimatedPayoutLabel;
    private javax.swing.JTextField EstimatedPayoutTextField;
    private javax.swing.JLabel FansCurrentMinerLabel;
    private javax.swing.JMenuItem FileExitMenuItem;
    private javax.swing.JMenu FileMenu;
    private javax.swing.JLabel GenericInformationAbbreviatedPreferredCurrencyLabel;
    private javax.swing.JLabel GenericInformationAbbreviatedPreferredCurrencyLabel2;
    private javax.swing.JLabel GenericInformationCoinbaseUserLabel;
    private javax.swing.JComboBox GenericInformationCoinbaseUserSelectionBox;
    private javax.swing.JLabel GenericInformationCurrentMinerLabel;
    private javax.swing.JLabel HWErrorPercentLabel;
    private javax.swing.JTextField HWErrorPercentageTextField;
    private javax.swing.JLabel HWErrorsLabel;
    private javax.swing.JTextField HWErrorsTextField;
    private javax.swing.JLabel HashRatesCurrentMiner;
    private javax.swing.JMenu HelpMenu;
    private javax.swing.JLabel InformationMinerIPLabel;
    private javax.swing.JTextField InformationMinerIPTextField;
    private javax.swing.JLabel InformationMinerPortLabel;
    private javax.swing.JTextField InformationMinerPortTextField;
    private javax.swing.JPanel InformationPanel;
    private javax.swing.JTabbedPane MainTabbedPane;
    private javax.swing.JLabel MinerAcceptedLabel;
    private javax.swing.JTextField MinerAcceptedTextField;
    private javax.swing.JLabel MinerAverageHashLabel;
    private javax.swing.JTextField MinerAverageHashTextField;
    private javax.swing.JLabel MinerBestShareLabel;
    private javax.swing.JTextField MinerBestShareTextField;
    private javax.swing.JPanel MinerConfigurationPanel;
    private javax.swing.JLabel MinerCurrentHashLabel;
    private javax.swing.JTextField MinerCurrentHashTextField;
    private javax.swing.JLabel MinerFan1Label;
    private javax.swing.JTextField MinerFan1TextField;
    private javax.swing.JLabel MinerFan2Label;
    private javax.swing.JTextField MinerFan2TextField;
    private javax.swing.JLabel MinerFan3Label;
    private javax.swing.JTextField MinerFan3TextField;
    private javax.swing.JLabel MinerFan4Label;
    private javax.swing.JTextField MinerFan4TextField;
    private javax.swing.JButton MinerFanSpeedsRefreshButton;
    private javax.swing.JPanel MinerFansPanel;
    private javax.swing.JLabel MinerFoundBlocksLabel;
    private javax.swing.JTextField MinerFoundBlocksTextField;
    private javax.swing.JButton MinerGenericInformationRefreshButton;
    private javax.swing.JPanel MinerHashRatesPanel;
    private javax.swing.JButton MinerHashRatesRefreshButton;
    private javax.swing.JPanel MinerInformationPanel;
    private javax.swing.JTabbedPane MinerInformationTabbedPane;
    private javax.swing.JLabel MinerNetworkBlocksLabel;
    private javax.swing.JTextField MinerNetworkBlocksTextField;
    private javax.swing.JLabel MinerRejectedLabel;
    private javax.swing.JTextField MinerRejectedTextField;
    private javax.swing.JComboBox MinerSelectionBox;
    private javax.swing.JComboBox MinerSelectionBox1;
    private javax.swing.JComboBox MinerSelectionBox2;
    private javax.swing.JComboBox MinerSelectionBox3;
    private javax.swing.JComboBox MinerSelectionBox5;
    private javax.swing.JLabel MinerSelectionBoxLabel;
    private javax.swing.JComboBox MinerSelectionForAlarmsBox;
    private javax.swing.JLabel MinerStrategyLabel;
    private javax.swing.JTextField MinerStrategyTextField;
    private javax.swing.JLabel MinerTemp1Label;
    private javax.swing.JTextField MinerTemp1TextField;
    private javax.swing.JLabel MinerTemp2Label;
    private javax.swing.JTextField MinerTemp2TextField;
    private javax.swing.JLabel MinerTemp3Label;
    private javax.swing.JTextField MinerTemp3TextField;
    private javax.swing.JLabel MinerTemp4Label;
    private javax.swing.JTextField MinerTemp4TextField;
    private javax.swing.JLabel MinerTempAvgLabel;
    private javax.swing.JTextField MinerTempAvgTextField;
    private javax.swing.JLabel MinerTempMaxLabel;
    private javax.swing.JPanel MinerTemperaturePanel;
    private javax.swing.JButton MinerTemperaturesRefreshButton;
    private javax.swing.JTextField MinerTextMaxTextField;
    private javax.swing.JLabel MinerVersionLabel;
    private javax.swing.JTextField MinerVersionTextField;
    private javax.swing.JTextPane MinerVitalStatsTextPane;
    private javax.swing.JPanel MinerVitalsPanel;
    private javax.swing.JLabel NetworkDifficultyLabel;
    private javax.swing.JTextField NetworkDifficultyTextField;
    private javax.swing.JLabel PGAsLabel;
    private javax.swing.JTextField PGAsTextField;
    private javax.swing.JMenuItem PasteMenuItem;
    private javax.swing.JLabel PoolCountLabel;
    private javax.swing.JTextField PoolCountTextField;
    private javax.swing.JLabel PrivilegedLabel;
    private javax.swing.JTextField PrivilegedTextField;
    private javax.swing.JButton RemoveCoinbaseUsernameButton;
    private javax.swing.JLabel TemperatureCurrentMinerLabel;
    private javax.swing.JButton VitalStatsRefreshButton;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JScrollPane jScrollPane2;
    private org.jdesktop.beansbinding.BindingGroup bindingGroup;
    // End of variables declaration//GEN-END:variables

    private void setIcon() {
        setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("favicon.png")));
    }
}