Logo Search packages:      
Sourcecode: wireshark version File versions  Download package

packet-assa_r3.c

/* packet-assa_r3.c
 * Routines for R3 packet dissection
 * Copyright (c) 2009 Assa Abloy USA <jcwren@assaabloyusa.com>
 *
 * $Id: packet-assa_r3.c 32414 2010-04-07 00:41:44Z guy $
 *
 * Wireshark - Network traffic analyzer
 * By Gerald Combs <gerald@wireshark.org>
 * Copyright 1998 Gerald Combs
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */

#ifdef HAVE_CONFIG_H
# include "config.h"
#endif

#include <glib.h>
#include <epan/packet.h>
#include <epan/expert.h>
#include <epan/dissectors/packet-tcp.h>

#include "packet-assa_r3_public.h"

/*
 *  Wireshark ID of the R3 protocol 
 */ 
static gint proto_r3 = -1;

/*
 *  Packet variables
 */
static gint hf_r3_tildex3ds = -1;          /* Got ~~~ds */

static gint hf_r3_header = -1;             /* Packet header */
static gint hf_r3_payload = -1;            /* Packet payload */
static gint hf_r3_tail = -1;               /* Packet tail */

static gint hf_r3_sigil = -1;              /* Packet sigil */
static gint hf_r3_address = -1;            /* Packet address */
static gint hf_r3_packetnumber = -1;       /* Packet number */
static gint hf_r3_packetlength = -1;       /* Packet length */
static gint hf_r3_encryption = -1;         /* Packet encryption scheme */
static gint hf_r3_crc = -1;                /* Packet CRC */
static gint hf_r3_crc_bad = -1;            /* Packet CRC bad (for filtering) */
static gint hf_r3_xor = -1;                /* Packet Xor */
static gint hf_r3_xor_bad = -1;            /* Packet Xor bad (for filtering) */

static gint hf_r3_commandlength = -1;      /* Command length */
static gint hf_r3_command = -1;            /* Command (cmdCommand_e) */
static gint hf_r3_commanddata = -1;        /* Command data (not always present) */

static gint hf_r3_commandmfglength = -1;   /* Mfg Command length */
static gint hf_r3_commandmfg = -1;         /* Mfg Command (cmdCommand_e) */
static gint hf_r3_commandmfgdata = -1;     /* Mfg Command data (not always present) */

static gint hf_r3_responselength = -1;     /* Response length */
static gint hf_r3_responsecommand = -1;    /* Response command */
static gint hf_r3_responsetype = -1;       /* Response type (responseType_e) */
static gint hf_r3_responsetocommand = -1;  /* Response to command (cmdCommand_e) */
static gint hf_r3_responsedata = -1;       /* Response data (not always present) */

static gint hf_r3_upstreamcommand = -1;

static gint hf_r3_upstreamfield = -1;                /* Upstream field (length + type + data) */
static gint hf_r3_upstreamfieldlength = -1;          /* Upstream field length */
static gint hf_r3_upstreamfieldtype = -1;            /* Upstream field type (upstreamField_e) */
static gint hf_r3_upstreamfielddatalen = -1;         /* Upstream field data length */
static gint hf_r3_upstreamfielderror = -1;           /* Upstream field is unknown type */
static gint hf_r3_upstreamfieldarray [UPSTREAMFIELD_LAST];

static gint hf_r3_configitems = -1;
static gint hf_r3_configitem = -1;
static gint hf_r3_configfield = -1;
static gint hf_r3_configitemlength = -1;
static gint hf_r3_configitemtype = -1;
static gint hf_r3_configitemdata = -1;
static gint hf_r3_configitemdata_bool = -1;
static gint hf_r3_configitemdata_8 = -1;
static gint hf_r3_configitemdata_16 = -1;
static gint hf_r3_configitemdata_32 = -1;
static gint hf_r3_configitemdata_string = -1;

static gint hf_r3_timezonearray [32];

static gint hf_r3_expireon_year = -1;
static gint hf_r3_expireon_month = -1;
static gint hf_r3_expireon_day = -1;

static gint hf_r3_datetime_year = -1;
static gint hf_r3_datetime_month = -1;
static gint hf_r3_datetime_day = -1;
static gint hf_r3_datetime_dow = -1;
static gint hf_r3_datetime_hours = -1;
static gint hf_r3_datetime_minutes = -1;
static gint hf_r3_datetime_seconds = -1;
static gint hf_r3_datetime_dst = -1;

static gint hf_r3_eventlog_recordnumber = -1;
static gint hf_r3_eventlog_year = -1;
static gint hf_r3_eventlog_month = -1;
static gint hf_r3_eventlog_day = -1;
static gint hf_r3_eventlog_hour = -1;
static gint hf_r3_eventlog_minute = -1;
static gint hf_r3_eventlog_second = -1;
static gint hf_r3_eventlog_usernumber = -1;
static gint hf_r3_eventlog_event = -1;

static gint hf_r3_declinedlog_recordnumber = -1;
static gint hf_r3_declinedlog_year = -1;
static gint hf_r3_declinedlog_month = -1;
static gint hf_r3_declinedlog_day = -1;
static gint hf_r3_declinedlog_hour = -1;
static gint hf_r3_declinedlog_minute = -1;
static gint hf_r3_declinedlog_second = -1;
static gint hf_r3_declinedlog_usernumber = -1;
static gint hf_r3_declinedlog_cred1type = -1;
static gint hf_r3_declinedlog_cred2type = -1;
static gint hf_r3_declinedlog_cred1 = -1;
static gint hf_r3_declinedlog_cred2 = -1;

static gint hf_r3_alarmlog_recordnumber = -1;
static gint hf_r3_alarmlog_year = -1;
static gint hf_r3_alarmlog_month = -1;
static gint hf_r3_alarmlog_day = -1;
static gint hf_r3_alarmlog_hour = -1;
static gint hf_r3_alarmlog_minute = -1;
static gint hf_r3_alarmlog_second = -1;
static gint hf_r3_alarmlog_id = -1;
static gint hf_r3_alarmlog_usernumber = -1;

static gint hf_r3_debugmsg = -1;

static gint hf_r3_setdate_year = -1;
static gint hf_r3_setdate_month = -1;
static gint hf_r3_setdate_day = -1;
static gint hf_r3_setdate_dow = -1;
static gint hf_r3_setdate_hours = -1;
static gint hf_r3_setdate_minutes = -1;
static gint hf_r3_setdate_seconds = -1;

static gint hf_r3_deleteusers = -1;

static gint hf_r3_defineexception_number = -1;          
static gint hf_r3_defineexception_startdate_month = -1; 
static gint hf_r3_defineexception_startdate_day = -1;   
static gint hf_r3_defineexception_startdate_hours = -1; 
static gint hf_r3_defineexception_startdate_minutes = -1;
static gint hf_r3_defineexception_enddate_month = -1;   
static gint hf_r3_defineexception_enddate_day = -1;     
static gint hf_r3_defineexception_enddate_hours = -1;   
static gint hf_r3_defineexception_enddate_minutes = -1; 

static gint hf_r3_defineexceptiongroup_number = -1;          
static gint hf_r3_defineexceptiongroup_bits = -1;          

static gint hf_r3_definecalendar_number = -1;
static gint hf_r3_definecalendar_bits = -1;

static gint hf_r3_definetimezone_number = -1;
static gint hf_r3_definetimezone_starttime_hours = -1;
static gint hf_r3_definetimezone_starttime_minutes = -1;
static gint hf_r3_definetimezone_endtime_hours = -1;
static gint hf_r3_definetimezone_endtime_minutes = -1;
static gint hf_r3_definetimezone_daymap [7];
static gint hf_r3_definetimezone_exceptiongroup = -1;
static gint hf_r3_definetimezone_mode = -1;
static gint hf_r3_definetimezone_calendar = -1;

static gint hf_r3_rmtauthretry_sequence = -1;
static gint hf_r3_rmtauthretry_retry = -1;

static gint hf_r3_eventlogdump_starttime_year = -1;
static gint hf_r3_eventlogdump_starttime_month = -1;
static gint hf_r3_eventlogdump_starttime_day = -1;
static gint hf_r3_eventlogdump_starttime_hours = -1;
static gint hf_r3_eventlogdump_starttime_minutes = -1;
static gint hf_r3_eventlogdump_endtime_year = -1;
static gint hf_r3_eventlogdump_endtime_month = -1;
static gint hf_r3_eventlogdump_endtime_day = -1;
static gint hf_r3_eventlogdump_endtime_hours = -1;
static gint hf_r3_eventlogdump_endtime_minutes = -1;
static gint hf_r3_eventlogdump_user = -1;

static gint hf_r3_declinedlogdump_starttime_year = -1;
static gint hf_r3_declinedlogdump_starttime_month = -1;
static gint hf_r3_declinedlogdump_starttime_day = -1;
static gint hf_r3_declinedlogdump_starttime_hours = -1;
static gint hf_r3_declinedlogdump_starttime_minutes = -1;
static gint hf_r3_declinedlogdump_endtime_year = -1;
static gint hf_r3_declinedlogdump_endtime_month = -1;
static gint hf_r3_declinedlogdump_endtime_day = -1;
static gint hf_r3_declinedlogdump_endtime_hours = -1;
static gint hf_r3_declinedlogdump_endtime_minutes = -1;

static gint hf_r3_alarmlogdump_starttime_year = -1;
static gint hf_r3_alarmlogdump_starttime_month = -1;
static gint hf_r3_alarmlogdump_starttime_day = -1;
static gint hf_r3_alarmlogdump_starttime_hours = -1;
static gint hf_r3_alarmlogdump_starttime_minutes = -1;
static gint hf_r3_alarmlogdump_endtime_year = -1;
static gint hf_r3_alarmlogdump_endtime_month = -1;
static gint hf_r3_alarmlogdump_endtime_day = -1;
static gint hf_r3_alarmlogdump_endtime_hours = -1;
static gint hf_r3_alarmlogdump_endtime_minutes = -1;

static gint hf_r3_nvramclearoptions [16];

static gint hf_r3_writeeventlog_user = -1;
static gint hf_r3_writeeventlog_event = -1;

static gint hf_r3_powertableselection = -1;

static gint hf_r3_filter_type = -1;
static gint hf_r3_filter_list = -1;

static gint hf_r3_alarm_length = -1;
static gint hf_r3_alarm_id = -1;
static gint hf_r3_alarm_state = -1;

static gint hf_r3_dpac_action = -1;
static gint hf_r3_dpac_waittime = -1;
static gint hf_r3_dpac_command = -1;

static gint hf_r3_dpacreply_stuff = -1;
static gint hf_r3_dpacreply_length = -1;
static gint hf_r3_dpacreply_reply = -1;

static gint hf_r3_mfgfield_length = -1;
static gint hf_r3_mfgfield = -1;
static gint hf_r3_mfgfield_data = -1;

static gint hf_r3_mfgsetserialnumber = -1;
static gint hf_r3_mfgsetcryptkey = -1;
static gint hf_r3_mfgdumpnvram = -1;
static gint hf_r3_mfgremoteunlock = -1;
static gint hf_r3_mfgtestpreserve = -1;

static gint hf_r3_adc [8];

static gint hf_r3_hardwareid_board = -1;
static gint hf_r3_hardwareid_cpuid = -1;
static gint hf_r3_hardwareid_cpurev = -1;

static gint hf_r3_testkeypad = -1;
static gint hf_r3_testmagcard = -1;
static gint hf_r3_testproxcard = -1;

static gint hf_r3_nvramdump_record = -1;
static gint hf_r3_nvramdump_length = -1;
static gint hf_r3_nvramdump_data = -1;

static gint hf_r3_nvramdumprle_record = -1;
static gint hf_r3_nvramdumprle_length = -1;
static gint hf_r3_nvramdumprle_data = -1;

static gint hf_r3_iopins_lat = -1;
static gint hf_r3_iopins_port = -1;
static gint hf_r3_iopins_tris = -1;

static gint hf_r3_mortisepins_s1 = -1;
static gint hf_r3_mortisepins_s2 = -1;
static gint hf_r3_mortisepins_s3 = -1;
static gint hf_r3_mortisepins_s4 = -1;

static gint hf_r3_checksumresults = -1;
static gint hf_r3_checksumresults_field = -1;
static gint hf_r3_checksumresults_length = -1;
static gint hf_r3_checksumresults_state = -1;

static gint hf_r3_forceoptions_length = -1;
static gint hf_r3_forceoptions_item = -1;
static gint hf_r3_forceoptions_state_8= -1;
static gint hf_r3_forceoptions_state_16 = -1;
static gint hf_r3_forceoptions_state_24 = -1;
static gint hf_r3_forceoptions_state_32 = -1;

static gint hf_r3_peekpoke_operation = -1;
static gint hf_r3_peekpoke_address = -1;
static gint hf_r3_peekpoke_length = -1;
static gint hf_r3_peekpoke_poke8 = -1;
static gint hf_r3_peekpoke_poke16 = -1;
static gint hf_r3_peekpoke_poke24 = -1;
static gint hf_r3_peekpoke_poke32 = -1;
static gint hf_r3_peekpoke_pokestring = -1;

static gint hf_r3_firmwaredownload_length = -1;
static gint hf_r3_firmwaredownload_record = -1;
static gint hf_r3_firmwaredownload_action = -1;
static gint hf_r3_firmwaredownload_timeout = -1;
static gint hf_r3_firmwaredownload_nvram = -1;
static gint hf_r3_firmwaredownload_address = -1;
static gint hf_r3_firmwaredownload_bytes = -1;
static gint hf_r3_firmwaredownload_data = -1;
static gint hf_r3_firmwaredownload_crc = -1;
static gint hf_r3_firmwaredownload_crc_bad = -1;

static gint hf_r3_nvramchecksumvalue = -1;
static gint hf_r3_nvramchecksumvalue_fixup = -1;

static gint hf_r3_capabilities = -1;
static gint hf_r3_capabilities_length = -1;
static gint hf_r3_capabilities_type = -1;
static gint hf_r3_capabilities_value = -1;

static gint hf_r3_lockstate_passage = -1;
static gint hf_r3_lockstate_panic = -1;
static gint hf_r3_lockstate_lockout = -1;
static gint hf_r3_lockstate_relock = -1;
static gint hf_r3_lockstate_autoopen = -1;
static gint hf_r3_lockstate_nextauto = -1;
static gint hf_r3_lockstate_lockstate = -1;
static gint hf_r3_lockstate_wantstate = -1;
static gint hf_r3_lockstate_remote = -1;
static gint hf_r3_lockstate_update = -1;
static gint hf_r3_lockstate_exceptionspresent = -1;
static gint hf_r3_lockstate_exceptionsactive = -1;
static gint hf_r3_lockstate_timezonespresent = -1;
static gint hf_r3_lockstate_timezonesactive = -1;
static gint hf_r3_lockstate_autounlockspresent = -1;
static gint hf_r3_lockstate_autounlocksactive = -1;
static gint hf_r3_lockstate_uapmspresent = -1;
static gint hf_r3_lockstate_uapmsactive = -1;
static gint hf_r3_lockstate_uapmrelockspresent = -1;
static gint hf_r3_lockstate_uapmreslocksactive = -1;
static gint hf_r3_lockstate_nvramprotect = -1;
static gint hf_r3_lockstate_nvramchecksum = -1;

static gint hf_r3_mortisestatelog = -1;
static gint hf_r3_mortisestatelog_pointer = -1;
static gint hf_r3_mortisestatelog_mortisetype = -1;
static gint hf_r3_mortisestatelog_waiting = -1;
static gint hf_r3_mortisestatelog_state = -1;
static gint hf_r3_mortisestatelog_last = -1;
static gint hf_r3_mortisestatelog_event = -1;

static gint hf_r3_timerchain_newtick = -1;
static gint hf_r3_timerchain_currentboundary = -1;
static gint hf_r3_timerchain_tasktag = -1;
static gint hf_r3_timerchain_address = -1;
static gint hf_r3_timerchain_reload = -1;
static gint hf_r3_timerchain_boundary = -1;
static gint hf_r3_timerchain_count = -1;
static gint hf_r3_timerchain_flags = -1;

static gint hf_r3_taskflags_taskid = -1;
static gint hf_r3_taskflags_flags = -1;

static gint hf_r3_checkpointlog_entryptr = -1;
static gint hf_r3_checkpointlog_rcon = -1;
static gint hf_r3_checkpointlog_checkpoint = -1;

static gint hf_r3_cpuregisters_intcon = -1;
static gint hf_r3_cpuregisters_intcon2 = -1;
static gint hf_r3_cpuregisters_intcon3 = -1;
static gint hf_r3_cpuregisters_pir1 = -1;
static gint hf_r3_cpuregisters_pir2 = -1;
static gint hf_r3_cpuregisters_pir3 = -1;
static gint hf_r3_cpuregisters_pie1 = -1;
static gint hf_r3_cpuregisters_pie2 = -1;
static gint hf_r3_cpuregisters_pie3 = -1;
static gint hf_r3_cpuregisters_ipr1 = -1;
static gint hf_r3_cpuregisters_ipr2 = -1;
static gint hf_r3_cpuregisters_ipr3 = -1;
static gint hf_r3_cpuregisters_rcon = -1;
static gint hf_r3_cpuregisters_osccon = -1;
static gint hf_r3_cpuregisters_rcsta = -1;
static gint hf_r3_cpuregisters_txsta = -1;
static gint hf_r3_cpuregisters_rcsta2 = -1;
static gint hf_r3_cpuregisters_txsta2 = -1;
static gint hf_r3_cpuregisters_wdtcon = -1;

static gint hf_r3_cpuregisters_intcon_rbif = -1;
static gint hf_r3_cpuregisters_intcon_int0if = -1;
static gint hf_r3_cpuregisters_intcon_tmr0if = -1;
static gint hf_r3_cpuregisters_intcon_rbie = -1;
static gint hf_r3_cpuregisters_intcon_int0ie = -1;
static gint hf_r3_cpuregisters_intcon_tmr0ie = -1;
static gint hf_r3_cpuregisters_intcon_giel = -1;
static gint hf_r3_cpuregisters_intcon_gieh = -1;
static gint hf_r3_cpuregisters_intcon2_rbip = -1;
static gint hf_r3_cpuregisters_intcon2_int3ip = -1;
static gint hf_r3_cpuregisters_intcon2_tmr0ip = -1;
static gint hf_r3_cpuregisters_intcon2_intedg3 = -1;
static gint hf_r3_cpuregisters_intcon2_intedg2 = -1;
static gint hf_r3_cpuregisters_intcon2_intedg1 = -1;
static gint hf_r3_cpuregisters_intcon2_intedg0 = -1;
static gint hf_r3_cpuregisters_intcon2_rbpu = -1;
static gint hf_r3_cpuregisters_intcon3_int1if = -1;
static gint hf_r3_cpuregisters_intcon3_int2if = -1;
static gint hf_r3_cpuregisters_intcon3_int3if = -1;
static gint hf_r3_cpuregisters_intcon3_int1ie = -1;
static gint hf_r3_cpuregisters_intcon3_int2ie = -1;
static gint hf_r3_cpuregisters_intcon3_int3ie = -1;
static gint hf_r3_cpuregisters_intcon3_int1ip = -1;
static gint hf_r3_cpuregisters_intcon3_int2ip = -1;
static gint hf_r3_cpuregisters_pir1_tmr1if = -1;
static gint hf_r3_cpuregisters_pir1_tmr2if = -1;
static gint hf_r3_cpuregisters_pir1_ccp1if = -1;
static gint hf_r3_cpuregisters_pir1_ssp1if = -1;
static gint hf_r3_cpuregisters_pir1_tx1if = -1;
static gint hf_r3_cpuregisters_pir1_rc1if = -1;
static gint hf_r3_cpuregisters_pir1_adif = -1;
static gint hf_r3_cpuregisters_pir1_pspif = -1;
static gint hf_r3_cpuregisters_pir2_ccp2if = -1;
static gint hf_r3_cpuregisters_pir2_tmr3if = -1;
static gint hf_r3_cpuregisters_pir2_hlvdif = -1;
static gint hf_r3_cpuregisters_pir2_bcl1if = -1;
static gint hf_r3_cpuregisters_pir2_eeif = -1;
static gint hf_r3_cpuregisters_pir2_unused5 = -1;
static gint hf_r3_cpuregisters_pir2_cmif = -1;
static gint hf_r3_cpuregisters_pir2_oscfif = -1;
static gint hf_r3_cpuregisters_pir3_ccp3if = -1;
static gint hf_r3_cpuregisters_pir3_ccp4if = -1;
static gint hf_r3_cpuregisters_pir3_ccp5if = -1;
static gint hf_r3_cpuregisters_pir3_tmr4if = -1;
static gint hf_r3_cpuregisters_pir3_tx2if = -1;
static gint hf_r3_cpuregisters_pir3_rc2if = -1;
static gint hf_r3_cpuregisters_pir3_bcl2if = -1;
static gint hf_r3_cpuregisters_pir3_ssp2if = -1;
static gint hf_r3_cpuregisters_pie1_tmr1ie = -1;
static gint hf_r3_cpuregisters_pie1_tmr2ie = -1;
static gint hf_r3_cpuregisters_pie1_ccp1ie = -1;
static gint hf_r3_cpuregisters_pie1_ssp1ie = -1;
static gint hf_r3_cpuregisters_pie1_tx1ie = -1;
static gint hf_r3_cpuregisters_pie1_rc1ie = -1;
static gint hf_r3_cpuregisters_pie1_adie = -1;
static gint hf_r3_cpuregisters_pie1_pspie = -1;
static gint hf_r3_cpuregisters_pie2_oscfie = -1;
static gint hf_r3_cpuregisters_pie2_cmie = -1;
static gint hf_r3_cpuregisters_pie2_unused2 = -1;
static gint hf_r3_cpuregisters_pie2_eeie = -1;
static gint hf_r3_cpuregisters_pie2_bcl1ie = -1;
static gint hf_r3_cpuregisters_pie2_hlvdie = -1;
static gint hf_r3_cpuregisters_pie2_tmr3ie = -1;
static gint hf_r3_cpuregisters_pie2_ccp2ie = -1;
static gint hf_r3_cpuregisters_pie3_ccp3ie = -1;
static gint hf_r3_cpuregisters_pie3_ccp4ie = -1;
static gint hf_r3_cpuregisters_pie3_ccp5ie = -1;
static gint hf_r3_cpuregisters_pie3_tmr4ie = -1;
static gint hf_r3_cpuregisters_pie3_tx2ie = -1;
static gint hf_r3_cpuregisters_pie3_rc2ie = -1;
static gint hf_r3_cpuregisters_pie3_bcl2ie = -1;
static gint hf_r3_cpuregisters_pie3_ssp2ie = -1;
static gint hf_r3_cpuregisters_ipr1_tmr1ip = -1;
static gint hf_r3_cpuregisters_ipr1_tmr2ip = -1;
static gint hf_r3_cpuregisters_ipr1_ccp1ip = -1;
static gint hf_r3_cpuregisters_ipr1_ssp1ip = -1;
static gint hf_r3_cpuregisters_ipr1_tx1ip = -1;
static gint hf_r3_cpuregisters_ipr1_rc1ip = -1;
static gint hf_r3_cpuregisters_ipr1_adip = -1;
static gint hf_r3_cpuregisters_ipr1_pspip = -1;
static gint hf_r3_cpuregisters_ipr2_ccp2ip = -1;
static gint hf_r3_cpuregisters_ipr2_tmr3ip = -1;
static gint hf_r3_cpuregisters_ipr2_hlvdip = -1;
static gint hf_r3_cpuregisters_ipr2_bcl1ip = -1;
static gint hf_r3_cpuregisters_ipr2_eeip = -1;
static gint hf_r3_cpuregisters_ipr2_unused5 = -1;
static gint hf_r3_cpuregisters_ipr2_cmip = -1;
static gint hf_r3_cpuregisters_ipr2_oscfip = -1;
static gint hf_r3_cpuregisters_ipr3_ccp2ip = -1;
static gint hf_r3_cpuregisters_ipr3_ccp4ip = -1;
static gint hf_r3_cpuregisters_ipr3_ccp5ip = -1;
static gint hf_r3_cpuregisters_ipr3_tmr4ip = -1;
static gint hf_r3_cpuregisters_ipr3_tx2ip = -1;
static gint hf_r3_cpuregisters_ipr3_rc2ip = -1;
static gint hf_r3_cpuregisters_ipr3_bcl2ip = -1;
static gint hf_r3_cpuregisters_ipr3_ssp2ip = -1;
static gint hf_r3_cpuregisters_rcon_bor = -1;
static gint hf_r3_cpuregisters_rcon_por = -1;
static gint hf_r3_cpuregisters_rcon_pd = -1;
static gint hf_r3_cpuregisters_rcon_to = -1;
static gint hf_r3_cpuregisters_rcon_unused4 = -1;
static gint hf_r3_cpuregisters_rcon_ri = -1;
static gint hf_r3_cpuregisters_rcon_sboren = -1;
static gint hf_r3_cpuregisters_rcon_ipen = -1;
static gint hf_r3_cpuregisters_osccon_scs0 = -1;
static gint hf_r3_cpuregisters_osccon_scs1 = -1;
static gint hf_r3_cpuregisters_osccon_iofs = -1;
static gint hf_r3_cpuregisters_osccon_osts = -1;
static gint hf_r3_cpuregisters_osccon_ircf0 = -1;
static gint hf_r3_cpuregisters_osccon_ircf1 = -1;
static gint hf_r3_cpuregisters_osccon_ircf2 = -1;
static gint hf_r3_cpuregisters_osccon_idlen = -1;
static gint hf_r3_cpuregisters_rcsta_rx9d = -1;
static gint hf_r3_cpuregisters_rcsta_oerr = -1;
static gint hf_r3_cpuregisters_rcsta_ferr = -1;
static gint hf_r3_cpuregisters_rcsta_adden = -1;
static gint hf_r3_cpuregisters_rcsta_cren = -1;
static gint hf_r3_cpuregisters_rcsta_sren = -1;
static gint hf_r3_cpuregisters_rcsta_rx9 = -1;
static gint hf_r3_cpuregisters_rcsta_spen = -1;
static gint hf_r3_cpuregisters_txsta_tx9d = -1;
static gint hf_r3_cpuregisters_txsta_trmt = -1;
static gint hf_r3_cpuregisters_txsta_brgh = -1;
static gint hf_r3_cpuregisters_txsta_sendb = -1;
static gint hf_r3_cpuregisters_txsta_sync = -1;
static gint hf_r3_cpuregisters_txsta_txen = -1;
static gint hf_r3_cpuregisters_txsta_tx9 = -1;
static gint hf_r3_cpuregisters_txsta_csrc = -1;
static gint hf_r3_cpuregisters_rcsta2_rx9d = -1;
static gint hf_r3_cpuregisters_rcsta2_oerr = -1;
static gint hf_r3_cpuregisters_rcsta2_ferr = -1;
static gint hf_r3_cpuregisters_rcsta2_adden = -1;
static gint hf_r3_cpuregisters_rcsta2_cren = -1;
static gint hf_r3_cpuregisters_rcsta2_sren = -1;
static gint hf_r3_cpuregisters_rcsta2_rx9 = -1;
static gint hf_r3_cpuregisters_rcsta2_spen = -1;
static gint hf_r3_cpuregisters_txsta2_tx9d = -1;
static gint hf_r3_cpuregisters_txsta2_trmt = -1;
static gint hf_r3_cpuregisters_txsta2_brgh = -1;
static gint hf_r3_cpuregisters_txsta2_sendb = -1;
static gint hf_r3_cpuregisters_txsta2_sync = -1;
static gint hf_r3_cpuregisters_txsta2_txen = -1;
static gint hf_r3_cpuregisters_txsta2_tx9 = -1;
static gint hf_r3_cpuregisters_txsta2_csrc = -1;
static gint hf_r3_cpuregisters_wdtcon_swdten = -1;
static gint hf_r3_cpuregisters_wdtcon_unused1 = -1;
static gint hf_r3_cpuregisters_wdtcon_unused2 = -1;
static gint hf_r3_cpuregisters_wdtcon_unused3 = -1;
static gint hf_r3_cpuregisters_wdtcon_unused4 = -1;
static gint hf_r3_cpuregisters_wdtcon_unused5 = -1;
static gint hf_r3_cpuregisters_wdtcon_unused6 = -1;
static gint hf_r3_cpuregisters_wdtcon_unused7 = -1;

static gint hf_r3_dumpm41t81_reg00 = -1;
static gint hf_r3_dumpm41t81_reg01 = -1;
static gint hf_r3_dumpm41t81_reg02 = -1;
static gint hf_r3_dumpm41t81_reg03 = -1;
static gint hf_r3_dumpm41t81_reg04 = -1;
static gint hf_r3_dumpm41t81_reg05 = -1;
static gint hf_r3_dumpm41t81_reg06 = -1;
static gint hf_r3_dumpm41t81_reg07 = -1;
static gint hf_r3_dumpm41t81_reg08 = -1;
static gint hf_r3_dumpm41t81_reg09 = -1;
static gint hf_r3_dumpm41t81_reg0a = -1;
static gint hf_r3_dumpm41t81_reg0b = -1;
static gint hf_r3_dumpm41t81_reg0c = -1;
static gint hf_r3_dumpm41t81_reg0d = -1;
static gint hf_r3_dumpm41t81_reg0e = -1;
static gint hf_r3_dumpm41t81_reg0f = -1;
static gint hf_r3_dumpm41t81_reg10 = -1;
static gint hf_r3_dumpm41t81_reg11 = -1;
static gint hf_r3_dumpm41t81_reg12 = -1;
static gint hf_r3_dumpm41t81_reg13 = -1;

static gint hf_r3_dumpm41t81_reg00_sec1 = -1;
static gint hf_r3_dumpm41t81_reg00_sec01 = -1;
static gint hf_r3_dumpm41t81_reg01_st = -1;
static gint hf_r3_dumpm41t81_reg01_10sec = -1;
static gint hf_r3_dumpm41t81_reg01_1sec = -1;
static gint hf_r3_dumpm41t81_reg02_notused = -1;
static gint hf_r3_dumpm41t81_reg02_10min = -1;
static gint hf_r3_dumpm41t81_reg02_1min = -1;
static gint hf_r3_dumpm41t81_reg03_cbe = -1;
static gint hf_r3_dumpm41t81_reg03_cb = -1;
static gint hf_r3_dumpm41t81_reg03_10hour = -1;
static gint hf_r3_dumpm41t81_reg03_1hour = -1;
static gint hf_r3_dumpm41t81_reg04_notused = -1;
static gint hf_r3_dumpm41t81_reg04_dow = -1;
static gint hf_r3_dumpm41t81_reg05_notused = -1;
static gint hf_r3_dumpm41t81_reg05_10day = -1;
static gint hf_r3_dumpm41t81_reg05_1day = -1;
static gint hf_r3_dumpm41t81_reg06_notused = -1;
static gint hf_r3_dumpm41t81_reg06_10month = -1;
static gint hf_r3_dumpm41t81_reg06_1month = -1;
static gint hf_r3_dumpm41t81_reg07_10year = -1;
static gint hf_r3_dumpm41t81_reg07_1year = -1;
static gint hf_r3_dumpm41t81_reg08_out = -1;
static gint hf_r3_dumpm41t81_reg08_ft = -1;
static gint hf_r3_dumpm41t81_reg08_s = -1;
static gint hf_r3_dumpm41t81_reg08_cal = -1;
static gint hf_r3_dumpm41t81_reg09_notused = -1;
static gint hf_r3_dumpm41t81_reg09_bmb = -1;
static gint hf_r3_dumpm41t81_reg09_rb = -1;
static gint hf_r3_dumpm41t81_reg0a_afe = -1;
static gint hf_r3_dumpm41t81_reg0a_sqwe = -1;
static gint hf_r3_dumpm41t81_reg0a_abe = -1;
static gint hf_r3_dumpm41t81_reg0a_10monthalm = -1;
static gint hf_r3_dumpm41t81_reg0a_1monthalm = -1;
static gint hf_r3_dumpm41t81_reg0b_rpt5 = -1;
static gint hf_r3_dumpm41t81_reg0b_rpt4 = -1;
static gint hf_r3_dumpm41t81_reg0b_10dayalm = -1;
static gint hf_r3_dumpm41t81_reg0b_1dayalm = -1;
static gint hf_r3_dumpm41t81_reg0c_rpt3 = -1;
static gint hf_r3_dumpm41t81_reg0c_ht = -1;
static gint hf_r3_dumpm41t81_reg0c_10houralm = -1;
static gint hf_r3_dumpm41t81_reg0c_1houralm = -1;
static gint hf_r3_dumpm41t81_reg0d_rpt2 = -1;
static gint hf_r3_dumpm41t81_reg0d_10minalm = -1;
static gint hf_r3_dumpm41t81_reg0d_1minalm = -1;
static gint hf_r3_dumpm41t81_reg0e_rpt1 = -1;
static gint hf_r3_dumpm41t81_reg0e_10secalm = -1;
static gint hf_r3_dumpm41t81_reg0e_1secalm = -1;
static gint hf_r3_dumpm41t81_reg0f_wdf = -1;
static gint hf_r3_dumpm41t81_reg0f_af = -1;
static gint hf_r3_dumpm41t81_reg0f_notused = -1;
static gint hf_r3_dumpm41t81_reg10_notused = -1;
static gint hf_r3_dumpm41t81_reg11_notused = -1;
static gint hf_r3_dumpm41t81_reg12_notused = -1;
static gint hf_r3_dumpm41t81_reg13_rs = -1;
static gint hf_r3_dumpm41t81_reg13_notused = -1;

static gint hf_r3_debuglog_recordnumber = -1;
static gint hf_r3_debuglog_flags = -1;
static gint hf_r3_debuglog_tick = -1;

static gint hf_r3_adduserparamtype = -1;
static gint hf_r3_adduserparamtypelength = -1;
static gint hf_r3_adduserparamtypetype = -1;
static gint hf_r3_adduserparamtypedatalen = -1;
static gint hf_r3_adduserparamtypeerror = -1;
static gint hf_r3_adduserparamtypearray [ADDUSERPARAMTYPE_LAST];

/*
 *  These control the expansion of proto_item_add_subtree() added items
 */
static gint ett_r3 = -1;
static gint ett_r3header = -1;
static gint ett_r3tail = -1;
static gint ett_r3payload = -1;
static gint ett_r3cmd = -1;
static gint ett_r3configitem = -1;
static gint ett_r3upstreamcommand = -1;
static gint ett_r3upstreamfield = -1;
static gint ett_r3timezone = -1;
static gint ett_r3expireon = -1;
static gint ett_r3datetime = -1;
static gint ett_r3eventlogrecord = -1;
static gint ett_r3declinedlogrecord = -1;
static gint ett_r3alarmlogrecord = -1;
static gint ett_r3debugmsg = -1;
static gint ett_r3defineexceptionstartdate = -1;
static gint ett_r3defineexceptionenddate = -1;
static gint ett_r3defineexceptiongroupbits = -1;
static gint ett_r3definecalendarmonth [13] = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
static gint ett_r3definetimezonestarttime = -1;
static gint ett_r3definetimezoneendtime = -1;
static gint ett_r3definetimezonedaymap = -1;
static gint ett_r3eventlogdumpstarttime = -1;
static gint ett_r3eventlogdumpendtime = -1;
static gint ett_r3declinedlogdumpstarttime = -1;
static gint ett_r3declinedlogdumpendtime = -1;
static gint ett_r3alarmlogdumpstarttime = -1;
static gint ett_r3alarmlogdumpendtime = -1;
static gint ett_r3clearnvram = -1;
static gint ett_r3filters = -1;
static gint ett_r3alarmlist = -1;
static gint ett_r3alarmcfg = -1;
static gint ett_r3commandmfg = -1;
static gint ett_r3serialnumber = -1;
static gint ett_r3iopins = -1;
static gint ett_r3checksumresults = -1;
static gint ett_r3checksumresultsfield = -1;
static gint ett_r3forceoptions = -1;
static gint ett_r3peekpoke = -1;
static gint ett_r3downloadfirmware = -1;
static gint ett_r3capabilities = -1;
static gint ett_r3lockstate = -1;
static gint ett_r3mortisestatelog = -1;
static gint ett_r3timerchain = -1;
static gint ett_r3taskflags = -1;
static gint ett_r3taskflagsentry = -1;
static gint ett_r3checkpointlog = -1;
static gint ett_r3checkpointlogentry = -1;
static gint ett_r3cpuregisters = -1;
static gint ett_r3cpuregister = -1;
static gint ett_r3m41t81registers = -1;
static gint ett_r3m41t81register = -1;
static gint ett_r3debuglogrecord = -1;
static gint ett_r3setdatetime = -1;
static gint ett_r3manageuser = -1;

/*
 *  Setup protocol subtree array 
 */
static gint *ett [] = 
{
  &ett_r3,
  &ett_r3header,
  &ett_r3tail,
  &ett_r3payload,
  &ett_r3cmd,
  &ett_r3configitem,
  &ett_r3upstreamcommand,
  &ett_r3upstreamfield,
  &ett_r3timezone,
  &ett_r3expireon,
  &ett_r3datetime,
  &ett_r3eventlogrecord,
  &ett_r3declinedlogrecord,
  &ett_r3alarmlogrecord,
  &ett_r3debugmsg,
  &ett_r3defineexceptionstartdate,
  &ett_r3defineexceptionenddate,
  &ett_r3defineexceptiongroupbits,
  &ett_r3definecalendarmonth [1],
  &ett_r3definecalendarmonth [2],
  &ett_r3definecalendarmonth [3],
  &ett_r3definecalendarmonth [4],
  &ett_r3definecalendarmonth [5],
  &ett_r3definecalendarmonth [6],
  &ett_r3definecalendarmonth [7],
  &ett_r3definecalendarmonth [8],
  &ett_r3definecalendarmonth [9],
  &ett_r3definecalendarmonth [10],
  &ett_r3definecalendarmonth [11],
  &ett_r3definecalendarmonth [12],
  &ett_r3definetimezonestarttime,
  &ett_r3definetimezoneendtime,
  &ett_r3definetimezonedaymap,
  &ett_r3eventlogdumpstarttime,
  &ett_r3eventlogdumpendtime,
  &ett_r3declinedlogdumpstarttime,
  &ett_r3declinedlogdumpendtime,
  &ett_r3alarmlogdumpstarttime,
  &ett_r3alarmlogdumpendtime,
  &ett_r3clearnvram,
  &ett_r3filters,
  &ett_r3alarmlist,
  &ett_r3alarmcfg,
  &ett_r3commandmfg,
  &ett_r3serialnumber,
  &ett_r3iopins,
  &ett_r3checksumresults,
  &ett_r3checksumresultsfield,
  &ett_r3forceoptions,
  &ett_r3peekpoke,
  &ett_r3downloadfirmware,
  &ett_r3capabilities,
  &ett_r3lockstate,
  &ett_r3mortisestatelog,
  &ett_r3timerchain,
  &ett_r3taskflags,
  &ett_r3taskflagsentry,
  &ett_r3checkpointlog,
  &ett_r3checkpointlogentry,
  &ett_r3cpuregisters,
  &ett_r3cpuregister,
  &ett_r3m41t81registers,
  &ett_r3m41t81register,
  &ett_r3debuglogrecord,
  &ett_r3setdatetime,
  &ett_r3manageuser
};

/*
 *  Indicates next command to be processed as a manufacturing command
 */
static gint mfgCommandFlag = FALSE;

/*
 *  Some enums that don't exist in public.h and should
 */
typedef enum
{
  CHECKPOINT_NONE = 0,
  CHECKPOINT_ADC,
  CHECKPOINT_DPAC1,
  CHECKPOINT_DPAC2,
  CHECKPOINT_I2C1,
  CHECKPOINT_I2C2,
  CHECKPOINT_I2C3,
  CHECKPOINT_I2C4,
  CHECKPOINT_I2C5,
  CHECKPOINT_I2C6,
  CHECKPOINT_I2C7,
  CHECKPOINT_I2C8,
  CHECKPOINT_I2C9,
  CHECKPOINT_I2C10,
  CHECKPOINT_I2C11,
  CHECKPOINT_I2C12,
  CHECKPOINT_I2C13,
  CHECKPOINT_I2C14,
  CHECKPOINT_I2C15,
  CHECKPOINT_I2C16,
  CHECKPOINT_I2C17,
  CHECKPOINT_I2C18,
  CHECKPOINT_I2C19,
  CHECKPOINT_I2C20,
  CHECKPOINT_I2C21,
  CHECKPOINT_I2C22,
  CHECKPOINT_I2C23,
  CHECKPOINT_I2C24,
  CHECKPOINT_I2C25,
  CHECKPOINT_I2C26,
  CHECKPOINT_I2C27,
  CHECKPOINT_I2C28,
  CHECKPOINT_I2C29,
  CHECKPOINT_I2C30,
  CHECKPOINT_I2C31,
  CHECKPOINT_I2C32,
  CHECKPOINT_I2C33,
  CHECKPOINT_I2C34,
  CHECKPOINT_I2C35,
  CHECKPOINT_I2C36,
  CHECKPOINT_I2C37,
  CHECKPOINT_I2C38,
  CHECKPOINT_I2C39,
  CHECKPOINT_I2C40,
  CHECKPOINT_I2C41,
  CHECKPOINT_I2C42,
  CHECKPOINT_I2C43,
  CHECKPOINT_I2C44,
  CHECKPOINT_I2C45,
  CHECKPOINT_NVRAM,
  CHECKPOINT_SERIAL1,
  CHECKPOINT_SERIAL2,
  CHECKPOINT_SERIAL3,
  CHECKPOINT_WANDERING,
  CHECKPOINT_STRAYHPINT,
  CHECKPOINT_STRAYLPINT,
  CHECKPOINT_TESTWDT,
  CHECKPOINT_DPACDEBUG,
  CHECKPOINT_LAST
}
checkPoint_e;

typedef enum
{
  CONFIGTYPE_NONE = 0,
  CONFIGTYPE_BOOL,
  CONFIGTYPE_8,
  CONFIGTYPE_16,
  CONFIGTYPE_32,
  CONFIGTYPE_STRING,
  CONFIGTYPE_LAST
}
configType_e;

typedef enum
{
  DOWNLOADFIRMWARE_START = 0,
  DOWNLOADFIRMWARE_DATA,
  DOWNLOADFIRMWARE_COMPLETE,
  DOWNLOADFIRMWARE_ABORT,
  DOWNLOADFIRMWARE_RESET,
  DOWNLOADFIRMWARE_LAST
}
downloadFirmware_e;

typedef enum
{
  MORTISEEVENT_DX_THROWN = 0,
  MORTISEEVENT_DX_RETRACTED,
  MORTISEEVENT_LX_RETRACTED,
  MORTISEEVENT_LX_EXTENDED,
  MORTISEEVENT_AX_EXTENDED,
  MORTISEEVENT_AX_RETRACTED,
  MORTISEEVENT_RX_DEPRESSED,
  MORTISEEVENT_RX_RELEASED,
  MORTISEEVENT_PX_OPEN,
  MORTISEEVENT_PX_CLOSED,
  MORTISEEVENT_MX_UNLOCKED,
  MORTISEEVENT_MX_LOCKED,
  MORTISEEVENT_LAST,
  MORTISEEVENT_IGNORE
}
mortiseEvent_e;

/*
 *  Print things with nice textual names
 */
static const value_string r3_accessmodenames [] = 
{
  { ACCESSMODE_NONE,            "ACCESMODE_NONE" },
  { ACCESSMODE_PRIMARYONLY,     "ACCESSMODE_PRIMARYONLY" },
  { ACCESSMODE_PRIMARYORAUX,    "ACCESSMODE_PRIMARYORAUX" },
  { ACCESSMODE_PRIMARYANDAUX,   "ACCESSMODE_PRIMARYANDAUX" },
  { ACCESSMODE_PRIMARYTHENAUX,  "ACCESSMODE_PRIMARYTHENAUX" },
  { 0,                          NULL }
};

static const value_string r3_adduserparamtypenames [] = 
{
  { ADDUSERPARAMTYPE_DISPOSITION,      "ADDUSERPARAMTYPE_DISPOSITION" },
  { ADDUSERPARAMTYPE_USERNO,           "ADDUSERPARAMTYPE_USERNO" },
  { ADDUSERPARAMTYPE_ACCESSALWAYS,     "ADDUSERPARAMTYPE_ACCESSALWAYS" },
  { ADDUSERPARAMTYPE_ACCESSMODE,       "ADDUSERPARAMTYPE_ACCESSMODE" },
  { ADDUSERPARAMTYPE_CACHED,           "ADDUSERPARAMTYPE_CACHED" },
  { ADDUSERPARAMTYPE_USERTYPE,         "ADDUSERPARAMTYPE_USERTYPE" },
  { ADDUSERPARAMTYPE_PRIMARYFIELD,     "ADDUSERPARAMTYPE_PRIMARYFIELD" },
  { ADDUSERPARAMTYPE_PRIMARYFIELDTYPE, "ADDUSERPARAMTYPE_PRIMARYFIELDTYPE" },
  { ADDUSERPARAMTYPE_AUXFIELD,         "ADDUSERPARAMTYPE_AUXFIELD" },
  { ADDUSERPARAMTYPE_AUXFIELDTYPE,     "ADDUSERPARAMTYPE_AUXFIELDTYPE" },
  { ADDUSERPARAMTYPE_TIMEZONE,         "ADDUSERPARAMTYPE_TIMEZONE" },
  { ADDUSERPARAMTYPE_EXPIREON,         "ADDUSERPARAMTYPE_EXPIREON" },
  { ADDUSERPARAMTYPE_USECOUNT,         "ADDUSERPARAMTYPE_USECOUNT" },
  { ADDUSERPARAMTYPE_EXCEPTIONGROUP,   "ADDUSERPARAMTYPE_EXCEPTIONGROUP" },
  { 0,                                 NULL }
};

static const value_string r3_alarmidnames [] = 
{
  { ALARMID_NONE,         "ALARMID_NONE" },
  { ALARMID_VALIDIN,      "ALARMID_VALIDIN" },
  { ALARMID_DENIEDACCESS, "ALARMID_DENIEDACCESS" },
  { ALARMID_SECURED,      "ALARMID_SECURED" },
  { ALARMID_DOORFORCED,   "ALARMID_DOORFORCED" },
  { ALARMID_KEYOVERRIDE,  "ALARMID_KEYOVERRIDE" },
  { ALARMID_INVALIDENTRY, "ALARMID_INVALIDENTRY" },
  { ALARMID_DOORAJAR,     "ALARMID_DOORAJAR" },
  { ALARMID_LOWBATTERY,   "ALARMID_LOWBATTERY" },
  { ALARMID_RXHELD,       "ALARMID_RXHELD" },
  { 0,                    NULL }
};

static const value_string r3_capabilitiesnames [] = 
{
  { CAPABILITIES_USERS,           "CAPABILITIES_USERS" },
  { CAPABILITIES_TIMEZONES,       "CAPABILITIES_TIMEZONES" },
  { CAPABILITIES_EXCEPTIONS,      "CAPABILITIES_EXCEPTIONS" },
  { CAPABILITIES_EXCEPTIONGROUPS, "CAPABILITIES_EXCEPTIONGROUPS" },
  { CAPABILITIES_EVENTLOG,        "CAPABILITIES_EVENTLOG" },
  { CAPABILITIES_DECLINEDLOG,     "CAPABILITIES_DECLINEDLOG" },
  { CAPABILITIES_ALARMLOG,        "CAPABILITIES_ALARMLOG" },
  { CAPABILITIES_TOTALEVENTS,     "CAPABILITIES_TOTALEVENTS" },
  { 0,                            NULL }
};

static const value_string r3_checkpointnames [] = 
{
  { CHECKPOINT_NONE,       "CHECKPOINT_NONE" },
  { CHECKPOINT_ADC,        "CHECKPOINT_ADC" },
  { CHECKPOINT_DPAC1,      "CHECKPOINT_DPAC1" },
  { CHECKPOINT_DPAC2,      "CHECKPOINT_DPAC2" },
  { CHECKPOINT_I2C1,       "CHECKPOINT_I2C1" },
  { CHECKPOINT_I2C2,       "CHECKPOINT_I2C2" },
  { CHECKPOINT_I2C3,       "CHECKPOINT_I2C3" },
  { CHECKPOINT_I2C4,       "CHECKPOINT_I2C4" },
  { CHECKPOINT_I2C5,       "CHECKPOINT_I2C5" },
  { CHECKPOINT_I2C6,       "CHECKPOINT_I2C6" },
  { CHECKPOINT_I2C7,       "CHECKPOINT_I2C7" },
  { CHECKPOINT_I2C8,       "CHECKPOINT_I2C8" },
  { CHECKPOINT_I2C9,       "CHECKPOINT_I2C9" },
  { CHECKPOINT_I2C10,      "CHECKPOINT_I2C10" },
  { CHECKPOINT_I2C11,      "CHECKPOINT_I2C11" },
  { CHECKPOINT_I2C12,      "CHECKPOINT_I2C12" },
  { CHECKPOINT_I2C13,      "CHECKPOINT_I2C13" },
  { CHECKPOINT_I2C14,      "CHECKPOINT_I2C14" },
  { CHECKPOINT_I2C15,      "CHECKPOINT_I2C15" },
  { CHECKPOINT_I2C16,      "CHECKPOINT_I2C16" },
  { CHECKPOINT_I2C17,      "CHECKPOINT_I2C17" },
  { CHECKPOINT_I2C18,      "CHECKPOINT_I2C18" },
  { CHECKPOINT_I2C19,      "CHECKPOINT_I2C19" },
  { CHECKPOINT_I2C20,      "CHECKPOINT_I2C20" },
  { CHECKPOINT_I2C21,      "CHECKPOINT_I2C21" },
  { CHECKPOINT_I2C22,      "CHECKPOINT_I2C22" },
  { CHECKPOINT_I2C23,      "CHECKPOINT_I2C23" },
  { CHECKPOINT_I2C24,      "CHECKPOINT_I2C24" },
  { CHECKPOINT_I2C25,      "CHECKPOINT_I2C25" },
  { CHECKPOINT_I2C26,      "CHECKPOINT_I2C26" },
  { CHECKPOINT_I2C27,      "CHECKPOINT_I2C27" },
  { CHECKPOINT_I2C28,      "CHECKPOINT_I2C28" },
  { CHECKPOINT_I2C29,      "CHECKPOINT_I2C29" },
  { CHECKPOINT_I2C30,      "CHECKPOINT_I2C30" },
  { CHECKPOINT_I2C31,      "CHECKPOINT_I2C31" },
  { CHECKPOINT_I2C32,      "CHECKPOINT_I2C32" },
  { CHECKPOINT_I2C33,      "CHECKPOINT_I2C33" },
  { CHECKPOINT_I2C34,      "CHECKPOINT_I2C34" },
  { CHECKPOINT_I2C35,      "CHECKPOINT_I2C35" },
  { CHECKPOINT_I2C36,      "CHECKPOINT_I2C36" },
  { CHECKPOINT_I2C37,      "CHECKPOINT_I2C37" },
  { CHECKPOINT_I2C38,      "CHECKPOINT_I2C38" },
  { CHECKPOINT_I2C39,      "CHECKPOINT_I2C39" },
  { CHECKPOINT_I2C40,      "CHECKPOINT_I2C40" },
  { CHECKPOINT_I2C41,      "CHECKPOINT_I2C41" },
  { CHECKPOINT_I2C42,      "CHECKPOINT_I2C42" },
  { CHECKPOINT_I2C43,      "CHECKPOINT_I2C43" },
  { CHECKPOINT_I2C44,      "CHECKPOINT_I2C44" },
  { CHECKPOINT_I2C45,      "CHECKPOINT_I2C45" },
  { CHECKPOINT_NVRAM,      "CHECKPOINT_NVRAM" },
  { CHECKPOINT_SERIAL1,    "CHECKPOINT_SERIAL1" },
  { CHECKPOINT_SERIAL2,    "CHECKPOINT_SERIAL2" },
  { CHECKPOINT_SERIAL3,    "CHECKPOINT_SERIAL3" },
  { CHECKPOINT_WANDERING,  "CHECKPOINT_WANDERING" },
  { CHECKPOINT_STRAYHPINT, "CHECKPOINT_STRAYHPINT" },
  { CHECKPOINT_STRAYLPINT, "CHECKPOINT_STRAYLPINT" },
  { CHECKPOINT_TESTWDT,    "CHECKPOINT_TESTWDT" },
  { CHECKPOINT_DPACDEBUG,  "CHECKPOINT_DPACDEBUG" },
  { 0,                     NULL }
};

static const value_string r3_checksumresultnames [] = 
{
  { CHECKSUMRESULT_CONFIGURATIONNVRAM,  "CHECKSUMRESULT_CONFIGURATIONNVRAM" },
  { CHECKSUMRESULT_EXCEPTIONS,          "CHECKSUMRESULT_EXCEPTIONS" },
  { CHECKSUMRESULT_EXCEPTIONGROUPS,     "CHECKSUMRESULT_EXCEPTIONGROUPS" },
  { CHECKSUMRESULT_TZCALENDARS,         "CHECKSUMRESULT_TZCALENDARS" },
  { CHECKSUMRESULT_TIMEZONES,           "CHECKSUMRESULT_TIMEZONES" },
  { CHECKSUMRESULT_USERS,               "CHECKSUMRESULT_USERS" },
  { CHECKSUMRESULT_CACHELRU,            "CHECKSUMRESULT_CACHELRU" },
  { 0,                                  NULL }
};

static const value_string r3_cmdnames [] = 
{
  { CMD_RESPONSE,                  "CMD_RESPONSE" },
  { CMD_HANDSHAKE,                 "CMD_HANDSHAKE" },
  { CMD_KILLSESSION,               "CMD_KILLSESSION" },
  { CMD_QUERYSERIALNUMBER,         "CMD_QUERYSERIALNUMBER" },
  { CMD_QUERYVERSION,              "CMD_QUERYVERSION" },
  { CMD_SETDATETIME,               "CMD_SETDATETIME" },
  { CMD_QUERYDATETIME,             "CMD_QUERYDATETIME" },
  { CMD_SETCONFIG,                 "CMD_SETCONFIG" },
  { CMD_GETCONFIG,                 "CMD_GETCONFIG" },
  { CMD_MANAGEUSER,                "CMD_MANAGEUSER" },
  { CMD_DELETEUSERS,               "CMD_DELETEUSERS" },
  { CMD_DEFINEEXCEPTION,           "CMD_DEFINEEXCEPTION" },
  { CMD_DEFINEEXCEPTIONGROUP,      "CMD_DEFINEEXCEPTIONGROUP" },
  { CMD_DEFINECALENDAR,            "CMD_DEFINECALENDAR" },
  { CMD_DEFINETIMEZONE,            "CMD_DEFINETIMEZONE" },
  { CMD_RMTAUTHRETRY,              "CMD_RMTAUTHRETRY" },
  { CMD_FILTERS,                   "CMD_FILTERS" },
  { CMD_ALARMCONFIGURE,            "CMD_ALARMCONFIGURE" },
  { CMD_EVENTLOGDUMP,              "CMD_EVENTLOGDUMP" },
  { CMD_DECLINEDLOGDUMP,           "CMD_DECLINEDLOGDUMP" },
  { CMD_ALARMLOGDUMP,              "CMD_ALARMLOGDUMP" },
  { CMD_DOWNLOADFIRMWARE,          "CMD_DOWNLOADFIRMWARE" },
  { CMD_DOWNLOADFIRMWARETIMEOUT,   "CMD_DOWNLOADFIRMWARETIMEOUT" },
  { CMD_POWERTABLESELECTION,       "CMD_POWERTABLESELECTION" },
  { CMD_CLEARNVRAM,                "CMD_CLEARNVRAM" },
  { CMD_DPAC,                      "CMD_DPAC" },
  { CMD_SELFTEST,                  "CMD_SELFTEST" },
  { CMD_RESET,                     "CMD_RESET" },
  { CMD_LOGWRITE,                  "CMD_LOGWRITE" },
  { CMD_MFGCOMMAND,                "CMD_MFGCOMMAND" },
  { CMD_NVRAMBACKUP,               "CMD_NVRAMBACKUP" },
  { CMD_EXTENDEDRESPONSE,          "CMD_EXTENDEDRESPONSE" },
  { 0,                             NULL }
};

static const value_string r3_cmdmfgnames [] = 
{
  { CMDMFG_SETSERIALNUMBER,       "CMDMFG_SETSERIALNUMBER" },
  { CMDMFG_SETCRYPTKEY,           "CMDMFG_SETCRYPTKEY" },
  { CMDMFG_DUMPNVRAM,             "CMDMFG_DUMPNVRAM" },
  { CMDMFG_TERMINAL,              "CMDMFG_TERMINAL" },
  { CMDMFG_REMOTEUNLOCK,          "CMDMFG_REMOTEUNLOCK" },
  { CMDMFG_AUXCTLRVERSION,        "CMDMFG_AUXCTLRVERSION" },
  { CMDMFG_IOPINS,                "CMDMFG_IOPINS" },
  { CMDMFG_ADCS,                  "CMDMFG_ADCS" },
  { CMDMFG_HARDWAREID,            "CMDMFG_HARDWAREID" },
  { CMDMFG_CHECKPOINTLOGDUMP,     "CMDMFG_CHECKPOINTLOGDUMP" },
  { CMDMFG_CHECKPOINTLOGCLEAR,    "CMDMFG_CHECKPOINTLOGCLEAR" },
  { CMDMFG_READREGISTERS,         "CMDMFG_READREGISTERS" },
  { CMDMFG_FORCEOPTIONS,          "CMDMFG_FORCEOPTIONS" },
  { CMDMFG_COMMUSER,              "CMDMFG_COMMUSER" },
  { CMDMFG_DUMPKEYPAD,            "CMDMFG_DUMPKEYPAD" },
  { CMDMFG_BATTERYCHECK,          "CMDMFG_BATTERYCHECK" },
  { CMDMFG_RAMREFRESH,            "CMDMFG_RAMREFRESH" },
  { CMDMFG_TASKFLAGS,             "CMDMFG_TASKFLAGS" },
  { CMDMFG_TIMERCHAIN,            "CMDMFG_TIMERCHAIN" },
  { CMDMFG_PEEKPOKE,              "CMDMFG_PEEKPOKE" },
  { CMDMFG_LOCKSTATE,             "CMDMFG_LOCKSTATE" },
  { CMDMFG_CAPABILITIES,          "CMDMFG_CAPABILITIES" },
  { CMDMFG_DUMPM41T81,            "CMDMFG_DUMPM41T81" },
  { CMDMFG_DEBUGLOGDUMP,          "CMDMFG_DEBUGLOGDUMP" },
  { CMDMFG_DEBUGLOGCLEAR,         "CMDMFG_DEBUGLOGCLEAR" },
  { CMDMFG_TESTWDT,               "CMDMFG_TESTWDT" },
  { CMDMFG_QUERYCKSUM,            "CMDMFG_QUERYCKSUM" },
  { CMDMFG_VALIDATECHECKSUMS,     "CMDMFG_VALIDATECHECKSUMS" },
  { CMDMFG_REBUILDLRUCACHE,       "CMDMFG_REBUILDLRUCACHE" },
  { CMDMFG_TZUPDATE,              "CMDMFG_TZUPDATE" },
  { CMDMFG_TESTPRESERVE,          "CMDMFG_TESTPRESERVE" },
  { CMDMFG_MORTISESTATELOGDUMP,   "CMDMFG_MORTISESTATELOGDUMP" },
  { CMDMFG_MORTISESTATELOGCLEAR,  "CMDMFG_MORTISESTATELOGCLEAR" },
  { CMDMFG_MORTISEPINS,           "CMDMFG_MORTISEPINS" },
  { CMDMFG_HALTANDCATCHFIRE,      "CMDMFG_HALTANDCATCHFIRE" },
  { 0,                            NULL }
};

static const value_string r3_configitemnames [] = 
{
  { CONFIGITEM_SERIAL_NUMBER,               "CONFIGITEM_SERIAL_NUMBER" },
  { CONFIGITEM_CRYPT_KEY,                   "CONFIGITEM_CRYPT_KEY" },
  { CONFIGITEM_HARDWARE_OPTIONS_MFG,        "CONFIGITEM_HARDWARE_OPTIONS_MFG" },
  { CONFIGITEM_HARDWARE_OPTIONS,            "CONFIGITEM_HARDWARE_OPTIONS" },
  { CONFIGITEM_NVRAM_CHANGES,               "CONFIGITEM_NVRAM_CHANGES" },
  { CONFIGITEM_NVRAMDIRTY,                  "CONFIGITEM_NVRAMDIRTY" },
  { CONFIGITEM_NVRAM_WV,                    "CONFIGITEM_NVRAM_WV" },
  { CONFIGITEM_ENABLE_WDT,                  "CONFIGITEM_ENABLE_WDT" },
  { CONFIGITEM_EARLY_ACK,                   "CONFIGITEM_EARLY_ACK" },
  { CONFIGITEM_CONSOLE_AES_ONLY,            "CONFIGITEM_CONSOLE_AES_ONLY" },
  { CONFIGITEM_RADIO_AES_ONLY,              "CONFIGITEM_RADIO_AES_ONLY" },
  { CONFIGITEM_NDRLE,                       "CONFIGITEM_NDRLE" },
  { CONFIGITEM_SOMF,                        "CONFIGITEM_SOMF" },
  { CONFIGITEM_NOGAF,                       "CONFIGITEM_NOGAF" },
  { CONFIGITEM_CARD_READER_POWER,           "CONFIGITEM_CARD_READER_POWER" },
  { CONFIGITEM_PROX_ENABLE,                 "CONFIGITEM_PROX_ENABLE" },
  { CONFIGITEM_CKSUMCONFIG,                 "CONFIGITEM_CKSUMCONFIG" },
  { CONFIGITEM_DAILY_BATTERY_CHECK,         "CONFIGITEM_DAILY_BATTERY_CHECK" },
  { CONFIGITEM_DAILY_BATTERY_CHECK_HOUR,    "CONFIGITEM_DAILY_BATTERY_CHECK_HOUR" },
  { CONFIGITEM_BATTERY_LOW,                 "CONFIGITEM_BATTERY_LOW" },
  { CONFIGITEM_LRU_HEAD,                    "CONFIGITEM_LRU_HEAD" },
  { CONFIGITEM_LRU_TAIL,                    "CONFIGITEM_LRU_TAIL" },
  { CONFIGITEM_RTC_CALIBRATION,             "CONFIGITEM_RTC_CALIBRATION" },
  { CONFIGITEM_ACVREQUESTER,                "CONFIGITEM_ACVREQUESTER" },
  { CONFIGITEM_LOCAL_LED,                   "CONFIGITEM_LOCAL_LED" },
  { CONFIGITEM_ERRCNT_XORLEN,               "CONFIGITEM_ERRCNT_XORLEN" },
  { CONFIGITEM_ERRCNT_CRC,                  "CONFIGITEM_ERRCNT_CRC" },
  { CONFIGITEM_ERRCNT_NOTSIGIL,             "CONFIGITEM_ERRCNT_NOTSIGIL" },
  { CONFIGITEM_ERRCNT_TIMEOUT,              "CONFIGITEM_ERRCNT_TIMEOUT" },
  { CONFIGITEM_ERRCNT_TOOLONG,              "CONFIGITEM_ERRCNT_TOOLONG" },
  { CONFIGITEM_ERRCNT_TOOSHORT,             "CONFIGITEM_ERRCNT_TOOSHORT" },
  { CONFIGITEM_ERRCNT_HITDEFAULT,           "CONFIGITEM_ERRCNT_HITDEFAULT" },
  { CONFIGITEM_ERRCNT_OVERRUN,              "CONFIGITEM_ERRCNT_OVERRUN" },
  { CONFIGITEM_ERRCNT_UARTFE,               "CONFIGITEM_ERRCNT_UARTFE" },
  { CONFIGITEM_ERRCNT_UARTOE,               "CONFIGITEM_ERRCNT_UARTOE" },
  { CONFIGITEM_DST_SET,                     "CONFIGITEM_DST_SET" },
  { CONFIGITEM_DST_MODE,                    "CONFIGITEM_DST_MODE" },
  { CONFIGITEM_DST_FORWARD_MONTH,           "CONFIGITEM_DST_FORWARD_MONTH" },
  { CONFIGITEM_DST_FORWARD_DOM,             "CONFIGITEM_DST_FORWARD_DOM" },
  { CONFIGITEM_DST_FORWARD_OOD,             "CONFIGITEM_DST_FORWARD_OOD" },
  { CONFIGITEM_DST_FORWARD_DOW,             "CONFIGITEM_DST_FORWARD_DOW" },
  { CONFIGITEM_DST_FORWARD_HOUR,            "CONFIGITEM_DST_FORWARD_HOUR" },
  { CONFIGITEM_DST_FORWARD_MINUTE,          "CONFIGITEM_DST_FORWARD_MINUTE" },
  { CONFIGITEM_DST_FORWARD_ADJUST,          "CONFIGITEM_DST_FORWARD_ADJUST" },
  { CONFIGITEM_DST_BACK_MONTH,              "CONFIGITEM_DST_BACK_MONTH" },
  { CONFIGITEM_DST_BACK_DOM,                "CONFIGITEM_DST_BACK_DOM" },
  { CONFIGITEM_DST_BACK_OOD,                "CONFIGITEM_DST_BACK_OOD" },
  { CONFIGITEM_DST_BACK_DOW,                "CONFIGITEM_DST_BACK_DOW" },
  { CONFIGITEM_DST_BACK_HOUR,               "CONFIGITEM_DST_BACK_HOUR" },
  { CONFIGITEM_DST_BACK_MINUTE,             "CONFIGITEM_DST_BACK_MINUTE" },
  { CONFIGITEM_DST_BACK_ADJUST,             "CONFIGITEM_DST_BACK_ADJUST" },
  { CONFIGITEM_EVENTLOG_ZEROMEM,            "CONFIGITEM_EVENTLOG_ZEROMEM" },
  { CONFIGITEM_EVENTLOG_BEGIN,              "CONFIGITEM_EVENTLOG_BEGIN" },
  { CONFIGITEM_EVENTLOG_RECORD,             "CONFIGITEM_EVENTLOG_RECORD" },
  { CONFIGITEM_EVENTLOG_ENTRIES,            "CONFIGITEM_EVENTLOG_ENTRIES" },
  { CONFIGITEM_EVENTLOG_WARNDEVICE,         "CONFIGITEM_EVENTLOG_WARNDEVICE" },
  { CONFIGITEM_EVENTLOG_WARNEVERY,          "CONFIGITEM_EVENTLOG_WARNEVERY" },
  { CONFIGITEM_EVENTLOG_RMTDEVICE,          "CONFIGITEM_EVENTLOG_RMTDEVICE" },
  { CONFIGITEM_DECLINEDLOG_ZEROMEM,         "CONFIGITEM_DECLINEDLOG_ZEROMEM" },
  { CONFIGITEM_DECLINEDLOG_BEGIN,           "CONFIGITEM_DECLINEDLOG_BEGIN" },
  { CONFIGITEM_DECLINEDLOG_RECORD,          "CONFIGITEM_DECLINEDLOG_RECORD" },
  { CONFIGITEM_DECLINEDLOG_ENTRIES,         "CONFIGITEM_DECLINEDLOG_ENTRIES" },
  { CONFIGITEM_DECLINEDLOG_WARNDEVICE,      "CONFIGITEM_DECLINEDLOG_WARNDEVICE" },
  { CONFIGITEM_DECLINEDLOG_WARNEVERY,       "CONFIGITEM_DECLINEDLOG_WARNEVERY" },
  { CONFIGITEM_DECLINEDLOG_RMTDEVICE,       "CONFIGITEM_DECLINEDLOG_RMTDEVICE" },
  { CONFIGITEM_ALARMLOG_ZEROMEM,            "CONFIGITEM_ALARMLOG_ZEROMEM" },
  { CONFIGITEM_ALARMLOG_BEGIN,              "CONFIGITEM_ALARMLOG_BEGIN" },
  { CONFIGITEM_ALARMLOG_RECORD,             "CONFIGITEM_ALARMLOG_RECORD" },
  { CONFIGITEM_ALARMLOG_ENTRIES,            "CONFIGITEM_ALARMLOG_ENTRIES" },
  { CONFIGITEM_ALARMLOG_WARNDEVICE,         "CONFIGITEM_ALARMLOG_WARNDEVICE" },
  { CONFIGITEM_ALARMLOG_WARNEVERY,          "CONFIGITEM_ALARMLOG_WARNEVERY" },
  { CONFIGITEM_ALARMLOG_RMTDEVICE,          "CONFIGITEM_ALARMLOG_RMTDEVICE" },
  { CONFIGITEM_VISIBLE_FEEDBACK,            "CONFIGITEM_VISIBLE_FEEDBACK" },
  { CONFIGITEM_AUDIBLE_FEEDBACK,            "CONFIGITEM_AUDIBLE_FEEDBACK" },
  { CONFIGITEM_VISIBLE_INDICATORS,          "CONFIGITEM_VISIBLE_INDICATORS" },
  { CONFIGITEM_AUDIBLE_INDICATORS,          "CONFIGITEM_AUDIBLE_INDICATORS" },
  { CONFIGITEM_2NDPINDURATION,              "CONFIGITEM_2NDPINDURATION" },
  { CONFIGITEM_LOCKOUT_ATTEMPTS,            "CONFIGITEM_LOCKOUT_ATTEMPTS" },
  { CONFIGITEM_LOCKOUT_DURATION,            "CONFIGITEM_LOCKOUT_DURATION" },
  { CONFIGITEM_KEYPAD_INACTIVITY,           "CONFIGITEM_KEYPAD_INACTIVITY" },
  { CONFIGITEM_ICIDLE_DURATION,             "CONFIGITEM_ICIDLE_DURATION" },
  { CONFIGITEM_WRITE_DECLINED_LOG,          "CONFIGITEM_WRITE_DECLINED_LOG" },
  { CONFIGITEM_LOW_BATTERY_INDICATOR,       "CONFIGITEM_LOW_BATTERY_INDICATOR" },
  { CONFIGITEM_PANIC_MODE,                  "CONFIGITEM_PANIC_MODE" },
  { CONFIGITEM_TIMEZONE_ENABLE,             "CONFIGITEM_TIMEZONE_ENABLE" },
  { CONFIGITEM_EXCEPTION_ENABLE,            "CONFIGITEM_EXCEPTION_ENABLE" },
  { CONFIGITEM_AUTOUNLOCK_ENABLE,           "CONFIGITEM_AUTOUNLOCK_ENABLE" },
  { CONFIGITEM_LOCK_PRIORITY_EMERGENCY,     "CONFIGITEM_LOCK_PRIORITY_EMERGENCY" },
  { CONFIGITEM_LOCK_PRIORITY_SUPERVISOR,    "CONFIGITEM_LOCK_PRIORITY_SUPERVISOR" },
  { CONFIGITEM_LOCK_PRIORITY_USER,          "CONFIGITEM_LOCK_PRIORITY_USER" },
  { CONFIGITEM_LOCK_PRIORITY_PASSAGE,       "CONFIGITEM_LOCK_PRIORITY_PASSAGE" },
  { CONFIGITEM_LOCK_PRIORITY_PANIC,         "CONFIGITEM_LOCK_PRIORITY_PANIC" },
  { CONFIGITEM_LOCK_PRIORITY_LOCKOUT,       "CONFIGITEM_LOCK_PRIORITY_LOCKOUT" },
  { CONFIGITEM_LOCK_PRIORITY_RELOCK,        "CONFIGITEM_LOCK_PRIORITY_RELOCK" },
  { CONFIGITEM_LOCK_PRIORITY_BOLTTHROWN,    "CONFIGITEM_LOCK_PRIORITY_BOLTTHROWN" },
  { CONFIGITEM_LOCK_PRIORITY_CONFIGCHANGE,  "CONFIGITEM_LOCK_PRIORITY_CONFIGCHANGE" },
  { CONFIGITEM_LOCK_PRIORITY_REMOTE,        "CONFIGITEM_LOCK_PRIORITY_REMOTE" },
  { CONFIGITEM_LOCK_TYPE,                   "CONFIGITEM_LOCK_TYPE" },
  { CONFIGITEM_DOUBLE_PULSE,                "CONFIGITEM_DOUBLE_PULSE" },
  { CONFIGITEM_DOUBLE_DELAY,                "CONFIGITEM_DOUBLE_DELAY" },
  { CONFIGITEM_MOTOR_DURATION,              "CONFIGITEM_MOTOR_DURATION" },
  { CONFIGITEM_MORTISE_TYPE,                "CONFIGITEM_MORTISE_TYPE" },
  { CONFIGITEM_UNLOCK_TIME,                 "CONFIGITEM_UNLOCK_TIME" },
  { CONFIGITEM_EXT_UNLOCK_TIME,             "CONFIGITEM_EXT_UNLOCK_TIME" },
  { CONFIGITEM_DOOR_AJAR_TIME,              "CONFIGITEM_DOOR_AJAR_TIME" },
  { CONFIGITEM_SESSION_TIMEOUT,             "CONFIGITEM_SESSION_TIMEOUT" },
  { CONFIGITEM_RETRY_ON_TIMEOUT,            "CONFIGITEM_RETRY_ON_TIMEOUT" },
  { CONFIGITEM_UNSOLICITED_ENCRYPT,         "CONFIGITEM_UNSOLICITED_ENCRYPT" },
  { CONFIGITEM_RMT_AUTH_TIMEOUT,            "CONFIGITEM_RMT_AUTH_TIMEOUT" },
  { CONFIGITEM_RMT_AUTH_DEVICE,             "CONFIGITEM_RMT_AUTH_DEVICE" },
  { CONFIGITEM_ALARM_DEVICE,                "CONFIGITEM_ALARM_DEVICE" },
  { CONFIGITEM_NOTIFY_DEVICE,               "CONFIGITEM_NOTIFY_DEVICE" },
  { CONFIGITEM_COMMUSER_DEVICE,             "CONFIGITEM_COMMUSER_DEVICE" },
  { CONFIGITEM_SCHEDULER_DEVICE,            "CONFIGITEM_SCHEDULER_DEVICE" },
  { CONFIGITEM_SCHEDULER_TYPE,              "CONFIGITEM_SCHEDULER_TYPE" },
  { CONFIGITEM_SCHEDULER_AWAKE,             "CONFIGITEM_SCHEDULER_AWAKE" },
  { CONFIGITEM_SCHEDULER_PERIOD,            "CONFIGITEM_SCHEDULER_PERIOD" },
  { CONFIGITEM_SCHEDULER_HOD,               "CONFIGITEM_SCHEDULER_HOD" },
  { CONFIGITEM_SCHEDULER_DOW,               "CONFIGITEM_SCHEDULER_DOW" },
  { CONFIGITEM_SCHEDULER_DOM,               "CONFIGITEM_SCHEDULER_DOM" },
  { CONFIGITEM_SCHEDULER_HM1,               "CONFIGITEM_SCHEDULER_HM1" },
  { CONFIGITEM_SCHEDULER_HM2,               "CONFIGITEM_SCHEDULER_HM2" },
  { CONFIGITEM_SCHEDULER_HM3,               "CONFIGITEM_SCHEDULER_HM3" },
  { CONFIGITEM_SCHEDULER_HM4,               "CONFIGITEM_SCHEDULER_HM4" },
  { CONFIGITEM_RADIO_TYPE,                  "CONFIGITEM_RADIO_TYPE" },
  { CONFIGITEM_RADIO_MODE,                  "CONFIGITEM_RADIO_MODE" },
  { CONFIGITEM_RADIO_TIMEOUT,               "CONFIGITEM_RADIO_TIMEOUT" },
  { CONFIGITEM_RADIO_ATTEMPTS,              "CONFIGITEM_RADIO_ATTEMPTS" },
  { CONFIGITEM_RADIO_HOUSEKEEPING,          "CONFIGITEM_RADIO_HOUSEKEEPING" },
  { CONFIGITEM_RADIO_LEAPUSERNAME,          "CONFIGITEM_RADIO_LEAPUSERNAME" },
  { CONFIGITEM_RADIO_LEAPPASSWORD,          "CONFIGITEM_RADIO_LEAPPASSWORD" },
  { CONFIGITEM_INHIBIT_VOLTAGE,             "CONFIGITEM_INHIBIT_VOLTAGE" },
  { CONFIGITEM_LOW_VOLTAGE,                 "CONFIGITEM_LOW_VOLTAGE" },
  { CONFIGITEM_PT_RANGE_1,                  "CONFIGITEM_PT_RANGE_1" },
  { CONFIGITEM_PT_RANGE_2,                  "CONFIGITEM_PT_RANGE_2" },
  { CONFIGITEM_PT_RANGE_3,                  "CONFIGITEM_PT_RANGE_3" },
  { CONFIGITEM_PT_RANGE_4,                  "CONFIGITEM_PT_RANGE_4" },
  { CONFIGITEM_PT_RANGE_5,                  "CONFIGITEM_PT_RANGE_5" },
  { CONFIGITEM_PT_RANGE_6,                  "CONFIGITEM_PT_RANGE_6" },
  { CONFIGITEM_PT_RANGE_7,                  "CONFIGITEM_PT_RANGE_7" },
  { CONFIGITEM_PT_RANGE_8,                  "CONFIGITEM_PT_RANGE_8" },
  { CONFIGITEM_MAGCARD_IFS,                 "CONFIGITEM_MAGCARD_IFS" },
  { CONFIGITEM_MAGCARD_FIELDS,              "CONFIGITEM_MAGCARD_FIELDS" },
  { CONFIGITEM_MAGCARD_OFFSET,              "CONFIGITEM_MAGCARD_OFFSET" },
  { CONFIGITEM_MAGCARD_DIGITS,              "CONFIGITEM_MAGCARD_DIGITS" },
  { CONFIGITEM_ALARMS,                      "CONFIGITEM_ALARMS" },
  { CONFIGITEM_FILTERS,                     "CONFIGITEM_FILTERS" },
  { CONFIGITEM_ALARMSTATE,                  "CONFIGITEM_ALARMSTATE" },
  { CONFIGITEM_DOORSTATE,                   "CONFIGITEM_DOORSTATE" },
  { CONFIGITEM_DPACDEBUG,                   "CONFIGITEM_DPACDEBUG" },
  { CONFIGITEM_FAILOPENSECURE,              "CONFIGITEM_FAILOPENSECURE" },
  { CONFIGITEM_REPLACED_VOLTAGE,            "CONFIGITEM_REPLACED_VOLTAGE" },
  { CONFIGITEM_RX_HELD_TIME,                "CONFIGITEM_RX_HELD_TIME" },
  { CONFIGITEM_PACKET_TIMEOUT,              "CONFIGITEM_PACKET_TIMEOUT" },
  { CONFIGITEM_EXTENDEDRESPONSE,            "CONFIGITEM_EXTENDEDRESPONSE" },
  { CONFIGITEM_PASSAGEMODEINDICATOR,        "CONFIGITEM_PASSAGEMODEINDICATOR" },
  { CONFIGITEM_PFMRETURNTIME,               "CONFIGITEM_PFMRETURNTIME" },
  { 0,                                      NULL }
};

static const value_string r3_configtypenames [] = 
{
  { CONFIGTYPE_NONE,    "CONFIGTYPE_NONE" },
  { CONFIGTYPE_BOOL,    "CONFIGTYPE_BOOL" },
  { CONFIGTYPE_8,       "CONFIGTYPE_8" },
  { CONFIGTYPE_16,      "CONFIGTYPE_16" },
  { CONFIGTYPE_32,      "CONFIGTYPE_32" },
  { CONFIGTYPE_STRING,  "CONFIGTYPE_STRING" },
  { 0,                  NULL }
};

static const value_string r3_dispositionnames [] = 
{
  { DISPOSITION_ADD,      "DISPOSITION_ADD" },
  { DISPOSITION_REPLACE,  "DISPOSITION_REPLACE" },
  { DISPOSITION_UPDATE,   "DISPOSITION_UPDATE" },
  { DISPOSITION_DELETE,   "DISPOSITION_DELETE" },
  { DISPOSITION_RETRIEVE, "DISPOSITION_RETRIEVE" },
  { 0,                    NULL }
};

static const value_string r3_deleteusersnames [] = 
{
  { DELETEUSERS_ALL,    "DELETEUSER_ALL" },
  { DELETEUSERS_CACHED, "DELETEUSER_CACHED" },
  { 0,                  NULL }
};

static const value_string r3_downloadfirmwarenames [] = 
{
  { DOWNLOADFIRMWARE_START,    "DOWNLOADFIRMWARE_START" },
  { DOWNLOADFIRMWARE_DATA,     "DOWNLOADFIRMWARE_DATA" },
  { DOWNLOADFIRMWARE_COMPLETE, "DOWNLOADFIRMWARE_COMPLETE" },
  { DOWNLOADFIRMWARE_ABORT,    "DOWNLOADFIRMWARE_ABORT" },
  { DOWNLOADFIRMWARE_RESET,    "DOWNLOADFIRMWARE_RESET" },
  { 0,                         NULL }
};

static const value_string r3_encryptionschemenames [] = 
{
  { ENCRYPTIONSCHEME_NONE,    "ENCRYPTIONSCHEME_NONE" },
  { ENCRYPTIONSCHEME_ROLLING, "ENCRYPTIONSCHEME_ROLLING" },
  { ENCRYPTIONSCHEME_SN,      "ENCRYPTIONSCHEME_SN" },
  { ENCRYPTIONSCHEME_AESIV,   "ENCRYPTIONSCHEME_AESIV" },
  { ENCRYPTIONSCHEME_AES,     "ENCRYPTIONSCHEME_AES" },
  { 0,                        NULL }
};

static const value_string r3_eventnames [] = 
{
  { EVENT_INVALIDPIN,           "EVENT_INVALIDPIN" },
  { EVENT_USER,                 "EVENT_USER" },
  { EVENT_ONETIME,              "EVENT_ONETIME" },
  { EVENT_PASSAGEBEGIN,         "EVENT_PASSAGEBEGIN" },
  { EVENT_PASSAGEEND,           "EVENT_PASSAGEEND" },
  { EVENT_BADTIME,              "EVENT_BADTIME" },
  { EVENT_LOCKEDOUT,            "EVENT_LOCKEDOUT" },
  { EVENT_LOWBATTERY,           "EVENT_LOWBATTERY" },
  { EVENT_DEADBATTERY,          "EVENT_DEADBATTERY" },
  { EVENT_BATTERYREPLACED,      "EVENT_BATTERYREPLACED" },
  { EVENT_USERADDED,            "EVENT_USERADDED" },
  { EVENT_USERDELETED,          "EVENT_USERDELETED" },
  { EVENT_EMERGENCY,            "EVENT_EMERGENCY" },
  { EVENT_PANIC,                "EVENT_PANIC" },
  { EVENT_RELOCK,               "EVENT_RELOCK" },
  { EVENT_LOCKOUTBEGIN,         "EVENT_LOCKOUTBEGIN" },
  { EVENT_LOCKOUTEND,           "EVENT_LOCKOUTEND" },
  { EVENT_RESET,                "EVENT_RESET" },
  { EVENT_DATETIMESET,          "EVENT_DATETIMESET" },
  { EVENT_LOGCLEARED,           "EVENT_LOGCLEARED" },
  { EVENT_DBRESET,              "EVENT_DBRESET" },
  { EVENT_COMMSTARTED,          "EVENT_COMMSTARTED" },
  { EVENT_COMMENDED,            "EVENT_COMMENDED" },
  { EVENT_FIRMWAREABORT,        "EVENT_FIRMWAREABORT" },
  { EVENT_FIRMWAREERROR,        "EVENT_FIRMWAREERROR" },
  { EVENT_FIRMWARETIMEOUT,      "EVENT_FIRMWARETIMEOUT" },
  { EVENT_DSTFALLBACK,          "EVENT_DSTFALLBACK" },
  { EVENT_DSTSPRINGFORWARD,     "EVENT_DSTSPRINGFORWARD" },
  { EVENT_BOLTTHROWN,           "EVENT_BOLTTHROWN" },
  { EVENT_BOLTRETRACTED,        "EVENT_BOLTRETRACTED" },
  { EVENT_MASTERCODE,           "EVENT_MASTERCODE" },
  { EVENT_COMMUSER,             "EVENT_COMMUSER" },
  { EVENT_DPACDISABLED,         "EVENT_DPACDISABLED" },
  { EVENT_NOTIFY,               "EVENT_NOTIFY" },
  { EVENT_EXPIRED,              "EVENT_EXPIRED" },
  { EVENT_SUPERVISOR,           "EVENT_SUPERVISOR" },
  { EVENT_MCCENTER,             "EVENT_MCCENTER" },
  { EVENT_MCCEXIT,              "EVENT_MCCEXIT" },
  { EVENT_SERIALRXOVERRUN,      "EVENT_SERIALRXOVERRUN" },
  { EVENT_DPACRXOVERRUN,        "EVENT_DPACRXOVERRUN" },
  { EVENT_NVRAMPBCLEAR,         "EVENT_NVRAMPBCLEAR" },
  { EVENT_NVRAMLAYOUTCHANGE,    "EVENT_NVRAMLAYOUTCHANGE" },
  { EVENT_NVRAMOK,              "EVENT_NVRAMOK" },
  { EVENT_USERREPLACED,         "EVENT_USERREPLACED" },
  { EVENT_RADIOTIMEOUT,         "EVENT_RADIOTIMEOUT" },
  { EVENT_SUSPENDEDUSER,        "EVENT_SUSPENDEDUSER" },
  { EVENT_USERUPDATED,          "EVENT_USERUPDATED" },
  { EVENT_DOORBOLTED,           "EVENT_DOORBOLTED" },
  { EVENT_PANICACTIVE,          "EVENT_PANICACTIVE" },
  { EVENT_PASSAGEACTIVE,        "EVENT_PASSAGEACTIVE" },
  { EVENT_PASSAGEINACTIVE,      "EVENT_PASSAGEINACTIVE" },
  { EVENT_BADACCESSMODE,        "EVENT_BADACCESSMODE" },
  { EVENT_CLOCKERR,             "EVENT_CLOCKERR" },
  { EVENT_REMOTEUNLOCK,         "EVENT_REMOTEUNLOCK" },
  { EVENT_TZHAUDISABLED,        "EVENT_TZHAUDISABLED" },
  { EVENT_EVENTLOGWRAPPED,      "EVENT_EVENTLOGWRAPPED" },
  { EVENT_DECLINEDLOGWRAPPED,   "EVENT_DECLINEDLOGWRAPPED" },
  { EVENT_ALARMLOGWRAPPED,      "EVENT_ALARMLOGWRAPPED" },
  { EVENT_RADIOBUSYEMERGENCY,   "EVENT_RADIOBUSYEMERGENCY" },
  { EVENT_RADIOBUSYSUPERVISOR,  "EVENT_RADIOBUSYSUPERVISOR" },
  { EVENT_RADIOBUSYONETIME,     "EVENT_RADIOBUSYONETIME" },   
  { EVENT_RADIOBUSYUSER,        "EVENT_RADIOBUSYUSER" },      
  { EVENT_RADIOBUSYPANIC,       "EVENT_RADIOBUSYPANIC" },     
  { EVENT_RADIOBUSYREX,         "EVENT_RADIOBUSYREX" },       
  { EVENT_RADIOBUSYLOCKOUT,     "EVENT_RADIOBUSYLOCKOUT" },       
  { EVENT_RADIOBUSYRELOCK,      "EVENT_RADIOBUSYRELOCK" },       
  { EVENT_BATTERYCHECKHELDOFF,  "EVENT_BATTERYCHECKHELDOFF" },       
  { EVENT_RMTAUTHREQUEST,       "EVENT_RMTAUTHREQUEST" },
  { EVENT_FIRMWAREUPDATE,       "EVENT_FIRMWAREUPDATE" },
  { EVENT_FIRMWAREUPDATEFAILED, "EVENT_FIRMWAREUPDATEFAILED" },
  { EVENT_MSMFAILURE,           "EVENT_MSMFAILURE" },
  { EVENT_CLOCKRESET,           "EVENT_CLOCKRESET" },
  { EVENT_POWERFAIL,            "EVENT_POWERFAIL" },
  { EVENT_DPAC501WENTSTUPID,    "EVENT_DPAC501WENTSTUPID" },
  { EVENT_CHECKSUMCONFIG,       "EVENT_CHECKSUMCONFIG" },
  { EVENT_CHECKSUMTZ,           "EVENT_CHECKSUMTZ" },
  { EVENT_DEBUG,                "EVENT_DEBUG" },
  { 0,                          NULL }
};

static const value_string r3_fieldtypenames [] = 
{
  { FIELDTYPE_NONE,     "FIELDTYPE_NONE" },
  { FIELDTYPE_PIN,      "FIELDTYPE_PIN" },
  { FIELDTYPE_PROX,     "FIELDTYPE_PROX" },
  { FIELDTYPE_MAGCARD,  "FIELDTYPE_MAGCARD" },
  { 0,                  NULL }
};

static const value_string r3_filtereventnames [] = 
{
  { EVENT_INVALIDPIN,           "EVENT_INVALIDPIN" },
  { EVENT_USER,                 "EVENT_USER" },
  { EVENT_ONETIME,              "EVENT_ONETIME" },
  { EVENT_PASSAGEBEGIN,         "EVENT_PASSAGEBEGIN" },
  { EVENT_PASSAGEEND,           "EVENT_PASSAGEEND" },
  { EVENT_BADTIME,              "EVENT_BADTIME" },
  { EVENT_LOCKEDOUT,            "EVENT_LOCKEDOUT" },
  { EVENT_LOWBATTERY,           "EVENT_LOWBATTERY" },
  { EVENT_DEADBATTERY,          "EVENT_DEADBATTERY" },
  { EVENT_BATTERYREPLACED,      "EVENT_BATTERYREPLACED" },
  { EVENT_USERADDED,            "EVENT_USERADDED" },
  { EVENT_USERDELETED,          "EVENT_USERDELETED" },
  { EVENT_EMERGENCY,            "EVENT_EMERGENCY" },
  { EVENT_PANIC,                "EVENT_PANIC" },
  { EVENT_RELOCK,               "EVENT_RELOCK" },
  { EVENT_LOCKOUTBEGIN,         "EVENT_LOCKOUTBEGIN" },
  { EVENT_LOCKOUTEND,           "EVENT_LOCKOUTEND" },
  { EVENT_RESET,                "EVENT_RESET" },
  { EVENT_DATETIMESET,          "EVENT_DATETIMESET" },
  { EVENT_LOGCLEARED,           "EVENT_LOGCLEARED" },
  { EVENT_DBRESET,              "EVENT_DBRESET" },
  { EVENT_COMMSTARTED,          "EVENT_COMMSTARTED" },
  { EVENT_COMMENDED,            "EVENT_COMMENDED" },
  { EVENT_FIRMWAREABORT,        "EVENT_FIRMWAREABORT" },
  { EVENT_FIRMWAREERROR,        "EVENT_FIRMWAREERROR" },
  { EVENT_FIRMWARETIMEOUT,      "EVENT_FIRMWARETIMEOUT" },
  { EVENT_DSTFALLBACK,          "EVENT_DSTFALLBACK" },
  { EVENT_DSTSPRINGFORWARD,     "EVENT_DSTSPRINGFORWARD" },
  { EVENT_BOLTTHROWN,           "EVENT_BOLTTHROWN" },
  { EVENT_BOLTRETRACTED,        "EVENT_BOLTRETRACTED" },
  { EVENT_MASTERCODE,           "EVENT_MASTERCODE" },
  { EVENT_COMMUSER,             "EVENT_COMMUSER" },
  { EVENT_DPACDISABLED,         "EVENT_DPACDISABLED" },
  { EVENT_NOTIFY,               "EVENT_NOTIFY" },
  { EVENT_EXPIRED,              "EVENT_EXPIRED" },
  { EVENT_SUPERVISOR,           "EVENT_SUPERVISOR" },
  { EVENT_MCCENTER,             "EVENT_MCCENTER" },
  { EVENT_MCCEXIT,              "EVENT_MCCEXIT" },
  { EVENT_SERIALRXOVERRUN,      "EVENT_SERIALRXOVERRUN" },
  { EVENT_DPACRXOVERRUN,        "EVENT_DPACRXOVERRUN" },
  { EVENT_NVRAMPBCLEAR,         "EVENT_NVRAMPBCLEAR" },
  { EVENT_NVRAMLAYOUTCHANGE,    "EVENT_NVRAMLAYOUTCHANGE" },
  { EVENT_NVRAMOK,              "EVENT_NVRAMOK" },
  { EVENT_USERREPLACED,         "EVENT_USERREPLACED" },
  { EVENT_RADIOTIMEOUT,         "EVENT_RADIOTIMEOUT" },
  { EVENT_SUSPENDEDUSER,        "EVENT_SUSPENDEDUSER" },
  { EVENT_USERUPDATED,          "EVENT_USERUPDATED" },
  { EVENT_DOORBOLTED,           "EVENT_DOORBOLTED" },
  { EVENT_PANICACTIVE,          "EVENT_PANICACTIVE" },
  { EVENT_PASSAGEACTIVE,        "EVENT_PASSAGEACTIVE" },
  { EVENT_PASSAGEINACTIVE,      "EVENT_PASSAGEINACTIVE" },
  { EVENT_BADACCESSMODE,        "EVENT_BADACCESSMODE" },
  { EVENT_CLOCKERR,             "EVENT_CLOCKERR" },
  { EVENT_REMOTEUNLOCK,         "EVENT_REMOTEUNLOCK" },
  { EVENT_TZHAUDISABLED,        "EVENT_TZHAUDISABLED" },
  { EVENT_EVENTLOGWRAPPED,      "EVENT_EVENTLOGWRAPPED" },
  { EVENT_DECLINEDLOGWRAPPED,   "EVENT_DECLINEDLOGWRAPPED" },
  { EVENT_ALARMLOGWRAPPED,      "EVENT_ALARMLOGWRAPPED" },
  { EVENT_RADIOBUSYEMERGENCY,   "EVENT_RADIOBUSYEMERGENCY" },
  { EVENT_RADIOBUSYSUPERVISOR,  "EVENT_RADIOBUSYSUPERVISOR" },
  { EVENT_RADIOBUSYONETIME,     "EVENT_RADIOBUSYONETIME" },   
  { EVENT_RADIOBUSYUSER,        "EVENT_RADIOBUSYUSER" },      
  { EVENT_RADIOBUSYPANIC,       "EVENT_RADIOBUSYPANIC" },     
  { EVENT_RADIOBUSYREX,         "EVENT_RADIOBUSYREX" },       
  { EVENT_RADIOBUSYLOCKOUT,     "EVENT_RADIOBUSYLOCKOUT" },       
  { EVENT_RADIOBUSYRELOCK,      "EVENT_RADIOBUSYRELOCK" },       
  { EVENT_BATTERYCHECKHELDOFF,  "EVENT_BATTERYCHECKHELDOFF" },       
  { EVENT_RMTAUTHREQUEST,       "EVENT_RMTAUTHREQUEST" },
  { EVENT_FIRMWAREUPDATE,       "EVENT_FIRMWAREUPDATE" },
  { EVENT_FIRMWAREUPDATEFAILED, "EVENT_FIRMWAREUPDATEFAILED" },
  { EVENT_MSMFAILURE,           "EVENT_MSMFAILURE" },
  { EVENT_CLOCKRESET,           "EVENT_CLOCKRESET" },
  { EVENT_POWERFAIL,            "EVENT_POWERFAIL" },
  { EVENT_DPAC501WENTSTUPID,    "EVENT_DPAC501WENTSTUPID" },
  { EVENT_CHECKSUMCONFIG,       "EVENT_CHECKSUMCONFIG" },
  { EVENT_CHECKSUMTZ,           "EVENT_CHECKSUMTZ" },
  { EVENT_DEBUG,                "EVENT_DEBUG" },
  { 0xfe,                       "(Enable All Filters)" },
  { 0xff,                       "(Disable All Filters)" },
  { 0,                          NULL }
};

static const value_string r3_filtertypenames [] = 
{
  { FILTERSELECT_RECORDING, "FILTERSELECT_RECORDING" },
  { FILTERSELECT_REPORTING, "FILTERSELECT_REPORTING" },
  { 0,                      NULL }
};

static const value_string r3_forceitemnames [] = 
{
  { FORCEITEM_RADIOPOWER,  "FORCEITEM_RADIOPOWER" },  
  { FORCEITEM_RADIOENABLE, "FORCEITEM_RADIOENABLE" }, 
  { FORCEITEM_LEDRED,      "FORCEITEM_LEDRED" },      
  { FORCEITEM_LEDGREEN,    "FORCEITEM_LEDGREEN" },    
  { FORCEITEM_LEDYELLOW,   "FORCEITEM_LEDYELLOW" },   
  { FORCEITEM_PIEZO,       "FORCEITEM_PIEZO" },       
  { FORCEITEM_MAGPOWER,    "FORCEITEM_MAGPOWER" },    
  { FORCEITEM_MAGLEDA,     "FORCEITEM_MAGLEDA" },     
  { FORCEITEM_MAGLEDB,     "FORCEITEM_MAGLEDB" },     
  { FORCEITEM_PROXPOWER,   "FORCEITEM_PROXPOWER" },   
  { FORCEITEM_PROXPING,    "FORCEITEM_PROXPING" },    
  { FORCEITEM_PROXMODE,    "FORCEITEM_PROXMODE" },    
  { FORCEITEM_I2CPOWER,    "FORCEITEM_I2CPOWER" },    
  { FORCEITEM_MOTORARUN,   "FORCEITEM_MOTORARUN" },   
  { FORCEITEM_MOTORBRUN,   "FORCEITEM_MOTORBRUN" },   
  { FORCEITEM_VMON,        "FORCEITEM_VMON" },        
  { FORCEITEM_PROX,        "FORCEITEM_PROX" },        
  { FORCEITEM_MORTISETEST, "FORCEITEM_MORTISETEST" }, 
  { FORCEITEM_KEYPADTEST,  "FORCEITEM_KEYPADTEST" },  
  { FORCEITEM_MAGTEST,     "FORCEITEM_MAGTEST" },     
  { FORCEITEM_PROXTEST,    "FORCEITEM_PROXTEST" },    
  { 0,                     NULL }
};

static const value_string r3_mfgfieldnames [] = 
{
  { MFGFIELD_IOPINS,              "MFGFIELD_IOPINS" },              
  { MFGFIELD_ADCS,                "MFGFIELD_ADCS" },                
  { MFGFIELD_HARDWAREID,          "MFGFIELD_HARDWAREID" },          
  { MFGFIELD_CHECKPOINTLOG,       "MFGFIELD_CHECKPOINTLOG" },       
  { MFGFIELD_CPUREGISTERS,        "MFGFIELD_CPUREGISTERS" },        
  { MFGFIELD_TASKFLAGS,           "MFGFIELD_TASKFLAGS" },           
  { MFGFIELD_TIMERCHAIN,          "MFGFIELD_TIMERCHAIN" },          
  { MFGFIELD_PEEKPOKE,            "MFGFIELD_PEEKPOKE" },            
  { MFGFIELD_LOCKSTATE,           "MFGFIELD_LOCKSTATE" },           
  { MFGFIELD_CAPABILITIES,        "MFGFIELD_CAPABILITIES" },        
  { MFGFIELD_DUMPM41T81,          "MFGFIELD_DUMPM41T81" },          
  { MFGFIELD_NVRAMCHECKSUMVALUE,  "MFGFIELD_NVRAMCHECKSUMVALUE" },  
  { MFGFIELD_CHECKSUMRESULTS,     "MFGFIELD_CHECKSUMRESULTS" },     
  { MFGFIELD_MORTISESTATELOG,     "MFGFIELD_MORTISESTATELOG" },     
  { MFGFIELD_MORTISEPINS,         "MFGFIELD_MORTISEPINS" },         
  { MFGFIELD_KEYPADCHAR,          "MFGFIELD_KEYPADCHAR" },          
  { MFGFIELD_MAGCARD,             "MFGFIELD_MAGCARD" },             
  { MFGFIELD_PROXCARD,            "MFGFIELD_PROXCARD" },            
  { 0,                            NULL }
};

static const value_string r3_mortiseeventnames [] = 
{
  { MORTISEEVENT_DX_THROWN,    "MORTISEEVENT_DX_THROWN" },
  { MORTISEEVENT_DX_RETRACTED, "MORTISEEVENT_DX_RETRACTED" },
  { MORTISEEVENT_LX_RETRACTED, "MORTISEEVENT_LX_RETRACTED" },
  { MORTISEEVENT_LX_EXTENDED,  "MORTISEEVENT_LX_EXTENDED" },
  { MORTISEEVENT_AX_EXTENDED,  "MORTISEEVENT_AX_EXTENDED" },
  { MORTISEEVENT_AX_RETRACTED, "MORTISEEVENT_AX_RETRACTED" },
  { MORTISEEVENT_RX_DEPRESSED, "MORTISEEVENT_RX_DEPRESSED" },
  { MORTISEEVENT_RX_RELEASED,  "MORTISEEVENT_RX_RELEASED" },
  { MORTISEEVENT_PX_OPEN,      "MORTISEEVENT_PX_OPEN" },
  { MORTISEEVENT_PX_CLOSED,    "MORTISEEVENT_PX_CLOSED" },
  { MORTISEEVENT_MX_UNLOCKED,  "MORTISEEVENT_MX_UNLOCKED" },
  { MORTISEEVENT_MX_LOCKED,    "MORTISEEVENT_MX_LOCKED" },
  { MORTISEEVENT_LAST,         "MORTISEEVENT_LAST" },
  { MORTISEEVENT_IGNORE,       "MORTISEEVENT_IGNORE" },
  { 0,                         NULL }
};

static const value_string r3_mortisetypenames [] = 
{
  { MORTISETYPE_NONE,      "MORTISETYPE_NONE" },
  { MORTISETYPE_S82276,    "MORTISETYPE_S82276" },
  { MORTISETYPE_S82277,    "MORTISETYPE_S82277" },
  { MORTISETYPE_S82278,    "MORTISETYPE_S82278" },
  { MORTISETYPE_S82279,    "MORTISETYPE_S82279" },
  { MORTISETYPE_S10G77,    "MORTISETYPE_S10G77" },
  { MORTISETYPE_S8877,     "MORTISETYPE_S8877" },
  { MORTISETYPE_S8878,     "MORTISETYPE_S8878" },
  { MORTISETYPE_S8977,     "MORTISETYPE_S8977" },
  { MORTISETYPE_S8978,     "MORTISETYPE_S8978" },
  { MORTISETYPE_CRML20x36, "MORTISETYPE_CRML20x36" },
  { MORTISETYPE_CRML20x35, "MORTISETYPE_CRML20x35" },
  { MORTISETYPE_CRML20x34, "MORTISETYPE_CRML20x34" },
  { MORTISETYPE_CRML20x33, "MORTISETYPE_CRML20x33" },
  { MORTISETYPE_CRCL33x34, "MORTISETYPE_CRCL33x34" },
  { MORTISETYPE_CR9X34,    "MORTISETYPE_CR9X34" },
  { MORTISETYPE_CR9X33,    "MORTISETYPE_CR9X33" },
  { MORTISETYPE_CR9MX34,   "MORTISETYPE_CR9MX34" },
  { MORTISETYPE_CR9MX33,   "MORTISETYPE_CR9MX33" },
  { 0,                     NULL }
};

static const value_string r3_peekpokenames [] = 
{
  { PEEKPOKE_READU8,      "PEEKPOKE_READU8" },
  { PEEKPOKE_READU16,     "PEEKPOKE_READU16" },
  { PEEKPOKE_READU24,     "PEEKPOKE_READU24" },
  { PEEKPOKE_READU32,     "PEEKPOKE_READU32" },
  { PEEKPOKE_READSTRING,  "PEEKPOKE_READSTRING" },
  { PEEKPOKE_WRITEU8,     "PEEKPOKE_WRITEU8" },
  { PEEKPOKE_WRITEU16,    "PEEKPOKE_WRITEU16" },
  { PEEKPOKE_WRITEU24,    "PEEKPOKE_WRITEU24" },
  { PEEKPOKE_WRITEU32,    "PEEKPOKE_WRITEU32" },
  { PEEKPOKE_WRITESTRING, "PEEKPOKE_WRITESTRING" },
  { 0,                    NULL }
};

static const value_string r3_ppmisourcenames [] = 
{
  { PPMISOURCE_NONE,    "PPMISOURCE_NONE" },
  { PPMISOURCE_PIN,     "PPMISOURCE_PIN" },
  { PPMISOURCE_PROX,    "PPMISOURCE_PROX" },
  { PPMISOURCE_MAGCARD, "PPMISOURCE_MAGCARD" },
  { 0,                  NULL }
};

static const value_string r3_responsetypenames [] = 
{
  { RESPONSETYPE_OK,                  "RESPONSETYPE_OK" },
  { RESPONSETYPE_ERROR,               "RESPONSETYPE_ERROR" },
  { RESPONSETYPE_HASDATA,             "RESPONSETYPE_HASDATA" },
  { RESPONSETYPE_NOHANDLER,           "RESPONSETYPE_NOHANDLER" },
  { RESPONSETYPE_NOSESSION,           "RESPONSETYPE_NOSESSION" },
  { RESPONSETYPE_BADCOMMAND,          "RESPONSETYPE_BADCOMMAND" },
  { RESPONSETYPE_BADPARAMETER,        "RESPONSETYPE_BADPARAMETER" },
  { RESPONSETYPE_BADPARAMETERLEN,     "RESPONSETYPE_BADPARAMETERLEN" },
  { RESPONSETYPE_MISSINGPARAMETER,    "RESPONSETYPE_MISSINGPARAMETER" },
  { RESPONSETYPE_DUPLICATEPARAMETER,  "RESPONSETYPE_DUPLICATEPARAMETER" },
  { RESPONSETYPE_PARAMETERCONFLICT,   "RESPONSETYPE_PARAMETERCONFLICT" },
  { RESPONSETYPE_BADDEVICE,           "RESPONSETYPE_BADDEVICE" },
  { RESPONSETYPE_NVRAMERROR,          "RESPONSETYPE_NVRAMERROR" },
  { RESPONSETYPE_NVRAMERRORNOACK,     "RESPONSETYPE_NVRAMERRORNOACK" },
  { RESPONSETYPE_NVRAMERRORNOACK32,   "RESPONSETYPE_NVRAMERRORNOACK32" },
  { RESPONSETYPE_NOTI2CADDRESS,       "RESPONSETYPE_NOTI2CADDRESS" },
  { RESPONSETYPE_FIRMWAREERROR,       "RESPONSETYPE_FIRMWAREERROR" },
  { RESPONSETYPE_DUMPINPROGRESS,      "RESPONSETYPE_DUMPINPROGRESS" },
  { RESPONSETYPE_INTERNALERROR,       "RESPONSETYPE_INTERNALERROR" },
  { RESPONSETYPE_NOTIMPLEMENTED,      "RESPONSETYPE_NOTIMPLEMENTED" },
  { RESPONSETYPE_PINFORMATERROR,      "RESPONSETYPE_PINFORMATERROR" },
  { RESPONSETYPE_PINEXISTS,           "RESPONSETYPE_PINEXISTS" },
  { RESPONSETYPE_PINNOTFOUND,         "RESPONSETYPE_PINNOTFOUND" },
  { RESPONSETYPE_USERACTIVE,          "RESPONSETYPE_USERACTIVE" },
  { RESPONSETYPE_USERINACTIVE,        "RESPONSETYPE_USERINACTIVE" },
  { RESPONSETYPE_PARENTNOTFOUND,      "RESPONSETYPE_PARENTNOTFOUND" },
  { RESPONSETYPE_NOCHAIN,             "RESPONSETYPE_NOCHAIN" },
  { RESPONSETYPE_CAUGHTINLOOP,        "RESPONSETYPE_CAUGHTINLOOP" },
  { RESPONSETYPE_EVENTFILTERED,       "RESPONSETYPE_EVENTFILTERED" },
  { RESPONSETYPE_PAYLOADTOOLARGE,     "RESPONSETYPE_PAYLOADTOOLARGE" },
  { RESPONSETYPE_ENDOFDATA,           "RESPONSETYPE_ENDOFDATA" },
  { RESPONSETYPE_RMTAUTHREJECTED,     "RESPONSETYPE_RMTAUTHREJECTED" },
  { RESPONSETYPE_NVRAMVERSIONERROR,   "RESPONSETYPE_NVRAMVERSIONERROR" },
  { RESPONSETYPE_NOHARDWARE,          "RESPONSETYPE_NOHARDWARE" },
  { RESPONSETYPE_SCHEDULERCONFLICT,   "RESPONSETYPE_SCHEDULERCONFLICT" },
  { RESPONSETYPE_NVRAMWRITEERROR,     "RESPONSETYPE_NVRAMWRITEERROR" },
  { RESPONSETYPE_DECLINEDFILTERED,    "RESPONSETYPE_DECLINEDFILTERED" },
  { RESPONSETYPE_NECONFIGPARM,        "RESPONSETYPE_NECONFIGPARM" },
  { RESPONSETYPE_FLASHERASEERROR,     "RESPONSETYPE_FLASHERASEERROR" },
  { RESPONSETYPE_FLASHWRITEERROR,     "RESPONSETYPE_FLASHWRITEERROR" },
  { RESPONSETYPE_BADNVBACKUP,         "RESPONSETYPE_BADNVBACKUP" },
  { RESPONSETYPE_EARLYACK,            "RESPONSETYPE_EARLYACK" },
  { RESPONSETYPE_ALARMFILTERED,       "RESPONSETYPE_ALARMFILTERED" },
  { RESPONSETYPE_ACVFAILURE,          "RESPONSETYPE_ACVFAILURE" },
  { RESPONSETYPE_USERCHECKSUMERROR,   "RESPONSETYPE_USERCHECKSUMERROR" },
  { RESPONSETYPE_CHECKSUMERROR,       "RESPONSETYPE_CHECKSUMERROR" },
  { RESPONSETYPE_RTCSQWFAILURE,       "RESPONSETYPE_RTCSQWFAILURE" },
  { RESPONSETYPE_PRIORITYSHUTDOWN,    "RESPONSETYPE_PRIORITYSHUTDOWN" },
  { RESPONSETYPE_NOTMODIFIABLE,       "RESPONSETYPE_NOTMODIFIABLE" },
  { RESPONSETYPE_CANTPRESERVE,        "RESPONSETYPE_CANTPRESERVE" },
  { RESPONSETYPE_INPASSAGEMODE,       "RESPONSETYPE_INPASSAGEMODE" },
  { 0,                                NULL }
};

static const value_string r3_timezonemodenames [] = 
{
  { TIMEZONEMODE_NORMAL,    "TIMEZONEMODE_NORMAL" },
  { TIMEZONEMODE_EXCLUSION, "TIMEZONEMODE_EXCLUSION" },
  { TIMEZONEMODE_AUTOTIME,  "TIMEZONEMODE_AUTOTIME" },
  { TIMEZONEMODE_AUTOFPT,   "TIMEZONEMODE_AUTOFPT" },
  { TIMEZONEMODE_UAPM,      "TIMEZONEMODE_UAPM" },
  { 0,                      NULL }
};

static const value_string r3_upstreamcommandnames [] = 
{
  { UPSTREAMCOMMAND_RESERVED,           "UPSTREAMCOMMAND_RESERVED" },
  { UPSTREAMCOMMAND_DEBUGMSG,           "UPSTREAMCOMMAND_DEBUGMSG" },
  { UPSTREAMCOMMAND_QUERYVERSION,       "UPSTREAMCOMMAND_QUERYVERSION" },
  { UPSTREAMCOMMAND_QUERYDATETIME,      "UPSTREAMCOMMAND_QUERYDATETIME" },
  { UPSTREAMCOMMAND_QUERYSERIALNUMBER,  "UPSTREAMCOMMAND_QUERYSERIALNUMBER" },
  { UPSTREAMCOMMAND_DUMPEVENTLOG,       "UPSTREAMCOMMAND_DUMPEVENTLOG" },
  { UPSTREAMCOMMAND_DUMPNVRAM,          "UPSTREAMCOMMAND_DUMPNVRAM" },
  { UPSTREAMCOMMAND_RMTAUTHREQUEST,     "UPSTREAMCOMMAND_RMTAUTHREQUEST" },
  { UPSTREAMCOMMAND_RETRIEVEUSER,       "UPSTREAMCOMMAND_RETRIEVEUSER" },
  { UPSTREAMCOMMAND_QUERYCONFIG,        "UPSTREAMCOMMAND_QUERYCONFIG" },
  { UPSTREAMCOMMAND_RMTEVENTLOGRECORD,  "UPSTREAMCOMMAND_RMTEVENTLOGRECORD" },
  { UPSTREAMCOMMAND_DPAC,               "UPSTREAMCOMMAND_DPAC" },
  { UPSTREAMCOMMAND_NOTIFY,             "UPSTREAMCOMMAND_NOTIFY" },
  { UPSTREAMCOMMAND_MFG,                "UPSTREAMCOMMAND_MFG" },
  { UPSTREAMCOMMAND_EVENTLOGWARNING,    "UPSTREAMCOMMAND_EVENTLOGWARNING" },
  { UPSTREAMCOMMAND_DUMPNVRAMRLE,       "UPSTREAMCOMMAND_DUMPNVRAMRLE" },
  { UPSTREAMCOMMAND_RMTDECLINEDRECORD,  "UPSTREAMCOMMAND_RMTDECLINEDRECORD" },
  { UPSTREAMCOMMAND_DECLINEDWARNING,    "UPSTREAMCOMMAND_DECLINEDWARNING" },
  { UPSTREAMCOMMAND_DUMPDECLINEDLOG,    "UPSTREAMCOMMAND_DUMPDECLINEDLOG" },
  { UPSTREAMCOMMAND_RMTALARMRECORD,     "UPSTREAMCOMMAND_RMTALARMRECORD" },
  { UPSTREAMCOMMAND_ALARMWARNING,       "UPSTREAMCOMMAND_ALARMWARNING" },
  { UPSTREAMCOMMAND_DUMPALARMLOG,       "UPSTREAMCOMMAND_DUMPALARMLOG" },
  { UPSTREAMCOMMAND_CONNECTSCHEDULER,   "UPSTREAMCOMMAND_CONNECTSCHEDULER" },
  { UPSTREAMCOMMAND_CONNECTCOMMUSER,    "UPSTREAMCOMMAND_CONNECTCOMMUSER" },
  { UPSTREAMCOMMAND_CONNECTALARM,       "UPSTREAMCOMMAND_CONNECTALARM" },
  { UPSTREAMCOMMAND_DUMPDEBUGLOG,       "UPSTREAMCOMMAND_DUMPDEBUGLOG" },
  { 0,                                  NULL }
};

static const value_string r3_upstreamfieldnames [] = 
{
  { UPSTREAMFIELD_NOTUSED,              "UPSTREAMFIELD_NOTUSED" },
  { UPSTREAMFIELD_SERIALNUMBER,         "UPSTREAMFIELD_SERIALNUMBER" },
  { UPSTREAMFIELD_NAR,                  "UPSTREAMFIELD_NAR" },
  { UPSTREAMFIELD_ENTRYDEVICE,          "UPSTREAMFIELD_ENTRYDEVICE" },
  { UPSTREAMFIELD_PPMIFIELDTYPE,        "UPSTREAMFIELD_PPMIFIELDTYPE" },
  { UPSTREAMFIELD_PIN,                  "UPSTREAMFIELD_PIN" },
  { UPSTREAMFIELD_SEQUENCENUMBER,       "UPSTREAMFIELD_SEQUENCENUMBER" },
  { UPSTREAMFIELD_RESPONSEWINDOW,       "UPSTREAMFIELD_RESPONSEWINDOW" },
  { UPSTREAMFIELD_USERNUMBER,           "UPSTREAMFIELD_USERNUMBER" },
  { UPSTREAMFIELD_VERSION,              "UPSTREAMFIELD_VERSION" },
  { UPSTREAMFIELD_EVENTLOGRECORD,       "UPSTREAMFIELD_EVENTLOGRECORD" },
  { UPSTREAMFIELD_DATETIME,             "UPSTREAMFIELD_DATETIME" },
  { UPSTREAMFIELD_EVENTLOGRECORDCOUNT,  "UPSTREAMFIELD_EVENTLOGRECORDCOUNT" },
  { UPSTREAMFIELD_DECLINEDRECORDCOUNT,  "UPSTREAMFIELD_DECLINEDRECORDCOUNT" },
  { UPSTREAMFIELD_DECLINEDRECORD,       "UPSTREAMFIELD_DECLINEDRECORD" },
  { UPSTREAMFIELD_USERTYPE,             "UPSTREAMFIELD_USERTYPE" },
  { UPSTREAMFIELD_ACCESSALWAYS,         "UPSTREAMFIELD_ACCESSALWAYS" },
  { UPSTREAMFIELD_CACHED,               "UPSTREAMFIELD_CACHED" },
  { UPSTREAMFIELD_PRIMARYFIELDTYPE,     "UPSTREAMFIELD_PRIMARYFIELDTYPE" },
  { UPSTREAMFIELD_AUXFIELDTYPE,         "UPSTREAMFIELD_AUXFIELDTYPE" },
  { UPSTREAMFIELD_ACCESSMODE,           "UPSTREAMFIELD_ACCESSMODE" },
  { UPSTREAMFIELD_EXPIREON,             "UPSTREAMFIELD_EXPIREON" },
  { UPSTREAMFIELD_USECOUNT,             "UPSTREAMFIELD_USECOUNT" },
  { UPSTREAMFIELD_TIMEZONE,             "UPSTREAMFIELD_TIMEZONE" },
  { UPSTREAMFIELD_EXCEPTIONGROUP,       "UPSTREAMFIELD_EXCEPTIONGROUP" },
  { UPSTREAMFIELD_PRIMARYPIN,           "UPSTREAMFIELD_PRIMARYPIN" },
  { UPSTREAMFIELD_AUXPIN,               "UPSTREAMFIELD_AUXPIN" },
  { UPSTREAMFIELD_ALARMRECORDCOUNT,     "UPSTREAMFIELD_ALARMRECORDCOUNT" },
  { UPSTREAMFIELD_ALARMRECORD,          "UPSTREAMFIELD_ALARMRECORD" },
  { UPSTREAMFIELD_AUXCTLRVERSION,       "UPSTREAMFIELD_AUXCTLRVERSION" },
  { 0,                                  NULL }
};

static const value_string r3_usertypenames [] = 
{
  { USERTYPE_NONE,        "USERTYPE_NONE" },
  { USERTYPE_MASTER,      "USERTYPE_MASTER" },
  { USERTYPE_EMERGENCY,   "USERTYPE_EMERGENCY" },
  { USERTYPE_SUPERVISOR,  "USERTYPE_SUPERVISOR" },
  { USERTYPE_USER,        "USERTYPE_USER" },
  { USERTYPE_EXTENDED,    "USERTYPE_EXTENDED" },
  { USERTYPE_PASSAGE,     "USERTYPE_PASSAGE" },
  { USERTYPE_ONETIME,     "USERTYPE_ONETIME" },
  { USERTYPE_PANIC,       "USERTYPE_PANIC" },
  { USERTYPE_LOCKOUT,     "USERTYPE_LOCKOUT" },
  { USERTYPE_RELOCK,      "USERTYPE_RELOCK" },
  { USERTYPE_NOTIFY,      "USERTYPE_NOTIFY" },
  { USERTYPE_COMM,        "USERTYPE_COMM" },
  { USERTYPE_SUSPENDED,   "USERTYPE_SUSPENDED" },
  { 0,                    NULL }
};

static const value_string r3_mfgnvramdumpnames [] = 
{
  {  0, "All" },
  {  1, "PIC" },
  {  2, "User" },
  {  3, "Event" },
  {  0, NULL }
};

static const value_string r3_mfgremoteunlocknames [] = 
{
  {  0, "Normal" },
  {  1, "Unlock" },
  {  2, "Lock" },
  {  0, NULL }
};

static const value_string r3_mfgtestpreservenames [] = 
{
  {  0, "Save" },
  {  1, "Restore" },
  {  0, NULL }
};

static const value_string r3_daynames [] = 
{
  { 0,  "Sunday" },
  { 1,  "Monday" },
  { 2,  "Tueday" },
  { 3,  "Wednesday" },
  { 4,  "Thursday" },
  { 5,  "Friday" },
  { 6,  "Saturday" },
  { 0,  NULL }
};

static const value_string r3_monthnames [] =
{
  {  0, "ERROR!" },
  {  1, "January" },
  {  2, "February" },
  {  3, "March" },
  {  4, "April" },
  {  5, "May" },
  {  6, "June" },
  {  7, "July" },
  {  8, "August" },
  {  9, "September" },
  { 10, "October" },
  { 11, "November" },
  { 12, "December" },
  {  0, NULL }
};

static const value_string r3_monthdaynames [] =
{
  {  0, "ERROR!" },
  {  1, " 1st" },
  {  2, " 2nd" },
  {  3, " 3rd" },
  {  4, " 4th" },
  {  5, " 5th" },
  {  6, " 6th" },
  {  7, " 7th" },
  {  8, " 8th" },
  {  9, " 9th" },
  { 10, "10th" },
  { 11, "11th" },
  { 12, "12th" },
  { 13, "13th" },
  { 14, "14th" },
  { 15, "15th" },
  { 16, "16th" },
  { 17, "17th" },
  { 18, "18th" },
  { 19, "19th" },
  { 20, "20th" },
  { 21, "21st" },
  { 22, "22nd" },
  { 23, "23rd" },
  { 24, "24th" },
  { 25, "25th" },
  { 26, "26th" },
  { 27, "27th" },
  { 28, "28th" },
  { 29, "29th" },
  { 30, "30th" },
  { 31, "31st" },
  {  0, NULL   }
};

static const value_string r3_powertablenames [] =
{
  {  1, "CONFIGITEM_PT_RANGE_1..CONFIGITEM_PT_RANGE_8 = {12, 11, 11, 10, 10,  9,  9,  8}" },
  {  2, "CONFIGITEM_PT_RANGE_1..CONFIGITEM_PT_RANGE_8 = {12, 11, 11, 10, 10,  9,  9,  8}" },
  {  3, "CONFIGITEM_PT_RANGE_1..CONFIGITEM_PT_RANGE_8 = {12, 11, 11, 10, 10,  9,  9,  8}" },
  {  4, "CONFIGITEM_PT_RANGE_1..CONFIGITEM_PT_RANGE_8 = {12, 11, 11, 10, 10,  9,  9,  8}" },
  {  5, "CONFIGITEM_PT_RANGE_1..CONFIGITEM_PT_RANGE_8 = {13, 12, 12, 11, 11, 10, 10,  9}" },
  {  6, "CONFIGITEM_PT_RANGE_1..CONFIGITEM_PT_RANGE_8 = {14, 13, 13, 12, 12, 11, 11, 10}" },
  {  7, "CONFIGITEM_PT_RANGE_1..CONFIGITEM_PT_RANGE_8 = {15, 14, 14, 13, 13, 12, 12, 11}" },
  {  8, "CONFIGITEM_PT_RANGE_1..CONFIGITEM_PT_RANGE_8 = {16, 15, 15, 14, 14, 13, 13, 12}" },
  {  0, NULL }
};

static const true_false_string tfs_rmtauthretry_flags = 
{
  "Retry",
  "Deny"
};

static const true_false_string tfs_mortisepins_flags = 
{
  "High",
  "Low"
};

static const true_false_string tfs_errornoerror_flags = 
{
  "Error",
  "No Error"
};

static const string_string r3_snmanufacturernames [] =
{
  { "IT", "ITS" },
  { "KC", "Kimchuk" },
  { NULL, NULL }
};

static const string_string r3_snyearnames [] =
{
  { "5",  "2005" },
  { "6",  "2006" },
  { "7",  "2007" },
  { "8",  "2008" },
  { "9",  "2009" },
  { "0",  "2010" },
  { "1",  "2011" },
  { "2",  "2012" },
  { "3",  "2013" },
  { "4",  "2014" },
  { NULL, NULL }
};

static const string_string r3_snmodelnames [] =
{
  { "H",  "Sx controller" },
  { "J",  "Px controller" },
  { "D",  "PG offline interface board" },
  { "E",  "Px online interface board" },
  { "N",  "Ethernet-PD board" },
  { "O",  "CAM board" },
  { NULL, NULL }
};

static const string_string r3_sngroupnames [] =
{
  { "S",  "Sargent" },
  { "P",  "Persona" },
  { "C",  "Corbin-Russwin" },
  { NULL, NULL }
};

static const string_string r3_snnidnames [] =
{
  { "A",  "Ethernet" },
  { "B",  "DPAC 802.11b" },
  { "C",  "DPAC 802.11bg" },
  { "D",  "Zigbee" },
  { "E",  "GPRS" },
  { NULL, NULL }
};

static const string_string r3_snhidnames [] =
{
  { "00", "[None]" },
  { "01", "Keypad" },
  { "02", "eProx" },
  { "03", "eProx, Keypad" },
  { "04", "iProx" },
  { "05", "iProx, Keypad" },
  { "06", "iProx, eProx" },
  { "07", "iProx, eProx, Keypad" },
  { "08", "Mag Card" },
  { "09", "Mag Card, Keypad" },
  { "0a", "Mag Card, eProx" },
  { "0b", "Mag Card, eProx, Keypad" },
  { "0c", "Mag Card, iProx" },
  { "0d", "Mag Card, iProx, Keypad" },
  { "0e", "Mag Card, iProx, eProx" },
  { "0f", "Mag Card, iProx, eProx, Keypad" },
  { "10", "Biometric" },
  { "11", "Biometric, Keypad" },
  { "12", "Biometric, eProx" },
  { "13", "Biometric, eProx, Keypad" },
  { "14", "Biometric, iProx" },
  { "15", "Biometric, iProx, Keypad" },
  { "16", "Biometric, iProx, eProx" },
  { "17", "Biometric, iProx, eProx, Keypad" },
  { "18", "Biometric, Mag Card" },
  { "19", "Biometric, Mag Card, Keypad" },
  { "1a", "Biometric, Mag Card, eProx" },
  { "1b", "Biometric, Mag Card, eProx, Keypad" },
  { "1c", "Biometric, Mag Card, iProx" },
  { "1d", "Biometric, Mag Card, iProx, Keypad" },
  { "1e", "Biometric, Mag Card, iProx, eProx" },
  { "1f", "Biometric, Mag Card, iProx, eProx, Keypad" },
  { NULL, NULL }
};

static const string_string r3_snpowersupplynames [] =
{
  { "A",  "Batteries" },
  { "B",  "External power" },
  { "C",  "Power over Ethernet" },
  { "D",  "External power w/ backup" },
  { "E",  "Power over Ethernet w/ backup" },
  { NULL, NULL }
};

static const string_string r3_snmortisenames [] =
{
  { "A",  "Sargent 82276 mortise" },
  { "B",  "Sargent 82277 mortise" },
  { "C",  "Sargent 82278 mortise" },
  { "D",  "Sargent 82279 mortise" },
  { "E",  "Sargent 10G77 bored" },
  { "F",  "Sargent 8877 exit" },
  { "G",  "Sargent 8878 exit" },
  { "H",  "Sargent 8977 exit" },
  { "I",  "Sargent 8878 exit" },
  { "J",  "Corbin-Russwin ML20736/ML20836 mortise" },
  { "K",  "Corbin-Russwin ML20735/ML20835 mortise" },
  { "L",  "Corbin-Russwin ML20734/ML20834 mortise" },
  { "M",  "Corbin-Russwin ML20733/ML20833 mortise" },
  { "N",  "Corbin-Russwin CL33734/CL33834 bored" },
  { "O",  "Corbin-Russwin 9734/9834 exit" },
  { "P",  "Corbin-Russwin 9733/9833 exit" },
  { "Q",  "Corbin-Russwin 9M734/9M834 exit" },
  { "R",  "Corbin-Russwin 9M733/9M833 exit" },
  { NULL, NULL }
};

/*
 *  Mapping table so dissect_r3_cmd_setconfig() knows what the configuration item type is
 */
typedef struct
{
  configItem_e configItem;
  configType_e configType;
}
configMap_t;

configMap_t configMap [] = 
{
  { CONFIGITEM_SERIAL_NUMBER,               CONFIGTYPE_STRING },
  { CONFIGITEM_CRYPT_KEY,                   CONFIGTYPE_STRING },
  { CONFIGITEM_HARDWARE_OPTIONS_MFG,        CONFIGTYPE_16 },
  { CONFIGITEM_HARDWARE_OPTIONS,            CONFIGTYPE_16 },
  { CONFIGITEM_NVRAM_CHANGES,               CONFIGTYPE_16 },
  { CONFIGITEM_NVRAMDIRTY,                  CONFIGTYPE_BOOL },
  { CONFIGITEM_NVRAM_WV,                    CONFIGTYPE_BOOL },
  { CONFIGITEM_ENABLE_WDT,                  CONFIGTYPE_BOOL },
  { CONFIGITEM_EARLY_ACK,                   CONFIGTYPE_BOOL },
  { CONFIGITEM_CONSOLE_AES_ONLY,            CONFIGTYPE_BOOL },
  { CONFIGITEM_RADIO_AES_ONLY,              CONFIGTYPE_BOOL },
  { CONFIGITEM_NDRLE,                       CONFIGTYPE_BOOL },
  { CONFIGITEM_SOMF,                        CONFIGTYPE_BOOL },
  { CONFIGITEM_NOGAF,                       CONFIGTYPE_BOOL },
  { CONFIGITEM_CARD_READER_POWER,           CONFIGTYPE_BOOL },
  { CONFIGITEM_PROX_ENABLE,                 CONFIGTYPE_BOOL },
  { CONFIGITEM_CKSUMCONFIG,                 CONFIGTYPE_BOOL },
  { CONFIGITEM_DAILY_BATTERY_CHECK,         CONFIGTYPE_BOOL },
  { CONFIGITEM_DAILY_BATTERY_CHECK_HOUR,    CONFIGTYPE_8 },
  { CONFIGITEM_BATTERY_LOW,                 CONFIGTYPE_BOOL },
  { CONFIGITEM_LRU_HEAD,                    CONFIGTYPE_16 },
  { CONFIGITEM_LRU_TAIL,                    CONFIGTYPE_16 },
  { CONFIGITEM_RTC_CALIBRATION,             CONFIGTYPE_8 },
  { CONFIGITEM_ACVREQUESTER,                CONFIGTYPE_8 },
  { CONFIGITEM_LOCAL_LED,                   CONFIGTYPE_8 },
  { CONFIGITEM_ERRCNT_XORLEN,               CONFIGTYPE_16 },
  { CONFIGITEM_ERRCNT_CRC,                  CONFIGTYPE_16 },
  { CONFIGITEM_ERRCNT_NOTSIGIL,             CONFIGTYPE_16 },
  { CONFIGITEM_ERRCNT_TIMEOUT,              CONFIGTYPE_16 },
  { CONFIGITEM_ERRCNT_TOOLONG,              CONFIGTYPE_16 },
  { CONFIGITEM_ERRCNT_TOOSHORT,             CONFIGTYPE_16 },
  { CONFIGITEM_ERRCNT_HITDEFAULT,           CONFIGTYPE_16 },
  { CONFIGITEM_ERRCNT_OVERRUN,              CONFIGTYPE_16 },
  { CONFIGITEM_ERRCNT_UARTFE,               CONFIGTYPE_16 },
  { CONFIGITEM_ERRCNT_UARTOE,               CONFIGTYPE_16 },
  { CONFIGITEM_DST_SET,                     CONFIGTYPE_BOOL },
  { CONFIGITEM_DST_MODE,                    CONFIGTYPE_8 },
  { CONFIGITEM_DST_FORWARD_MONTH,           CONFIGTYPE_8 },
  { CONFIGITEM_DST_FORWARD_DOM,             CONFIGTYPE_8 },
  { CONFIGITEM_DST_FORWARD_OOD,             CONFIGTYPE_8 },
  { CONFIGITEM_DST_FORWARD_DOW,             CONFIGTYPE_8 },
  { CONFIGITEM_DST_FORWARD_HOUR,            CONFIGTYPE_8 },
  { CONFIGITEM_DST_FORWARD_MINUTE,          CONFIGTYPE_8 },
  { CONFIGITEM_DST_FORWARD_ADJUST,          CONFIGTYPE_8 },
  { CONFIGITEM_DST_BACK_MONTH,              CONFIGTYPE_8 },
  { CONFIGITEM_DST_BACK_DOM,                CONFIGTYPE_8 },
  { CONFIGITEM_DST_BACK_OOD,                CONFIGTYPE_8 },
  { CONFIGITEM_DST_BACK_DOW,                CONFIGTYPE_8 },
  { CONFIGITEM_DST_BACK_HOUR,               CONFIGTYPE_8 },
  { CONFIGITEM_DST_BACK_MINUTE,             CONFIGTYPE_8 },
  { CONFIGITEM_DST_BACK_ADJUST,             CONFIGTYPE_8 },
  { CONFIGITEM_EVENTLOG_ZEROMEM,            CONFIGTYPE_BOOL },
  { CONFIGITEM_EVENTLOG_BEGIN,              CONFIGTYPE_16 },
  { CONFIGITEM_EVENTLOG_RECORD,             CONFIGTYPE_16 },
  { CONFIGITEM_EVENTLOG_ENTRIES,            CONFIGTYPE_16 },
  { CONFIGITEM_EVENTLOG_WARNDEVICE,         CONFIGTYPE_8 },
  { CONFIGITEM_EVENTLOG_WARNEVERY,          CONFIGTYPE_16 },
  { CONFIGITEM_EVENTLOG_RMTDEVICE,          CONFIGTYPE_8 },
  { CONFIGITEM_DECLINEDLOG_ZEROMEM,         CONFIGTYPE_BOOL },
  { CONFIGITEM_DECLINEDLOG_BEGIN,           CONFIGTYPE_16 },
  { CONFIGITEM_DECLINEDLOG_RECORD,          CONFIGTYPE_16 },
  { CONFIGITEM_DECLINEDLOG_ENTRIES,         CONFIGTYPE_16 },
  { CONFIGITEM_DECLINEDLOG_WARNDEVICE,      CONFIGTYPE_8 },
  { CONFIGITEM_DECLINEDLOG_WARNEVERY,       CONFIGTYPE_16 },
  { CONFIGITEM_DECLINEDLOG_RMTDEVICE,       CONFIGTYPE_8 },
  { CONFIGITEM_ALARMLOG_ZEROMEM,            CONFIGTYPE_BOOL },
  { CONFIGITEM_ALARMLOG_BEGIN,              CONFIGTYPE_16 },
  { CONFIGITEM_ALARMLOG_RECORD,             CONFIGTYPE_16 },
  { CONFIGITEM_ALARMLOG_ENTRIES,            CONFIGTYPE_16 },
  { CONFIGITEM_ALARMLOG_WARNDEVICE,         CONFIGTYPE_8 },
  { CONFIGITEM_ALARMLOG_WARNEVERY,          CONFIGTYPE_16 },
  { CONFIGITEM_ALARMLOG_RMTDEVICE,          CONFIGTYPE_8 },
  { CONFIGITEM_VISIBLE_FEEDBACK,            CONFIGTYPE_BOOL },
  { CONFIGITEM_AUDIBLE_FEEDBACK,            CONFIGTYPE_BOOL },
  { CONFIGITEM_VISIBLE_INDICATORS,          CONFIGTYPE_BOOL },
  { CONFIGITEM_AUDIBLE_INDICATORS,          CONFIGTYPE_BOOL },
  { CONFIGITEM_2NDPINDURATION,              CONFIGTYPE_8 },
  { CONFIGITEM_LOCKOUT_ATTEMPTS,            CONFIGTYPE_8 },
  { CONFIGITEM_LOCKOUT_DURATION,            CONFIGTYPE_8 },
  { CONFIGITEM_KEYPAD_INACTIVITY,           CONFIGTYPE_8 },
  { CONFIGITEM_ICIDLE_DURATION,             CONFIGTYPE_8 },
  { CONFIGITEM_WRITE_DECLINED_LOG,          CONFIGTYPE_BOOL },
  { CONFIGITEM_LOW_BATTERY_INDICATOR,       CONFIGTYPE_BOOL },
  { CONFIGITEM_PANIC_MODE,                  CONFIGTYPE_BOOL },
  { CONFIGITEM_TIMEZONE_ENABLE,             CONFIGTYPE_BOOL },
  { CONFIGITEM_EXCEPTION_ENABLE,            CONFIGTYPE_BOOL },
  { CONFIGITEM_AUTOUNLOCK_ENABLE,           CONFIGTYPE_BOOL },
  { CONFIGITEM_LOCK_PRIORITY_EMERGENCY,     CONFIGTYPE_8 },
  { CONFIGITEM_LOCK_PRIORITY_SUPERVISOR,    CONFIGTYPE_8 },
  { CONFIGITEM_LOCK_PRIORITY_USER,          CONFIGTYPE_8 },
  { CONFIGITEM_LOCK_PRIORITY_PASSAGE,       CONFIGTYPE_8 },
  { CONFIGITEM_LOCK_PRIORITY_PANIC,         CONFIGTYPE_8 },
  { CONFIGITEM_LOCK_PRIORITY_LOCKOUT,       CONFIGTYPE_8 },
  { CONFIGITEM_LOCK_PRIORITY_RELOCK,        CONFIGTYPE_8 },
  { CONFIGITEM_LOCK_PRIORITY_BOLTTHROWN,    CONFIGTYPE_8 },
  { CONFIGITEM_LOCK_PRIORITY_CONFIGCHANGE,  CONFIGTYPE_8 },
  { CONFIGITEM_LOCK_PRIORITY_REMOTE,        CONFIGTYPE_8 },
  { CONFIGITEM_LOCK_TYPE,                   CONFIGTYPE_8 },
  { CONFIGITEM_DOUBLE_PULSE,                CONFIGTYPE_BOOL },
  { CONFIGITEM_DOUBLE_DELAY,                CONFIGTYPE_8 },
  { CONFIGITEM_MOTOR_DURATION,              CONFIGTYPE_8 },
  { CONFIGITEM_MORTISE_TYPE,                CONFIGTYPE_8 },
  { CONFIGITEM_UNLOCK_TIME,                 CONFIGTYPE_8 },
  { CONFIGITEM_EXT_UNLOCK_TIME,             CONFIGTYPE_8 },
  { CONFIGITEM_DOOR_AJAR_TIME,              CONFIGTYPE_8 },
  { CONFIGITEM_SESSION_TIMEOUT,             CONFIGTYPE_8 },
  { CONFIGITEM_RETRY_ON_TIMEOUT,            CONFIGTYPE_BOOL },
  { CONFIGITEM_UNSOLICITED_ENCRYPT,         CONFIGTYPE_8 },
  { CONFIGITEM_RMT_AUTH_TIMEOUT,            CONFIGTYPE_8 },
  { CONFIGITEM_RMT_AUTH_DEVICE,             CONFIGTYPE_8 },
  { CONFIGITEM_ALARM_DEVICE,                CONFIGTYPE_8 },
  { CONFIGITEM_NOTIFY_DEVICE,               CONFIGTYPE_8 },
  { CONFIGITEM_COMMUSER_DEVICE,             CONFIGTYPE_8 },
  { CONFIGITEM_SCHEDULER_DEVICE,            CONFIGTYPE_8 },
  { CONFIGITEM_SCHEDULER_TYPE,              CONFIGTYPE_8 },
  { CONFIGITEM_SCHEDULER_AWAKE,             CONFIGTYPE_8 },
  { CONFIGITEM_SCHEDULER_PERIOD,            CONFIGTYPE_16 },
  { CONFIGITEM_SCHEDULER_HOD,               CONFIGTYPE_STRING },
  { CONFIGITEM_SCHEDULER_DOW,               CONFIGTYPE_8 },
  { CONFIGITEM_SCHEDULER_DOM,               CONFIGTYPE_32 },
  { CONFIGITEM_SCHEDULER_HM1,               CONFIGTYPE_16 },
  { CONFIGITEM_SCHEDULER_HM2,               CONFIGTYPE_16 },
  { CONFIGITEM_SCHEDULER_HM3,               CONFIGTYPE_16 },
  { CONFIGITEM_SCHEDULER_HM4,               CONFIGTYPE_16 },
  { CONFIGITEM_RADIO_TYPE,                  CONFIGTYPE_8 },
  { CONFIGITEM_RADIO_MODE,                  CONFIGTYPE_8 },
  { CONFIGITEM_RADIO_TIMEOUT,               CONFIGTYPE_8 },
  { CONFIGITEM_RADIO_ATTEMPTS,              CONFIGTYPE_8 },
  { CONFIGITEM_RADIO_HOUSEKEEPING,          CONFIGTYPE_8 },
  { CONFIGITEM_RADIO_LEAPUSERNAME,          CONFIGTYPE_STRING },
  { CONFIGITEM_RADIO_LEAPPASSWORD,          CONFIGTYPE_STRING },
  { CONFIGITEM_INHIBIT_VOLTAGE,             CONFIGTYPE_8 },
  { CONFIGITEM_LOW_VOLTAGE,                 CONFIGTYPE_8 },
  { CONFIGITEM_PT_RANGE_1,                  CONFIGTYPE_8 },
  { CONFIGITEM_PT_RANGE_2,                  CONFIGTYPE_8 },
  { CONFIGITEM_PT_RANGE_3,                  CONFIGTYPE_8 },
  { CONFIGITEM_PT_RANGE_4,                  CONFIGTYPE_8 },
  { CONFIGITEM_PT_RANGE_5,                  CONFIGTYPE_8 },
  { CONFIGITEM_PT_RANGE_6,                  CONFIGTYPE_8 },
  { CONFIGITEM_PT_RANGE_7,                  CONFIGTYPE_8 },
  { CONFIGITEM_PT_RANGE_8,                  CONFIGTYPE_8 },
  { CONFIGITEM_MAGCARD_IFS,                 CONFIGTYPE_BOOL },
  { CONFIGITEM_MAGCARD_FIELDS,              CONFIGTYPE_8 },
  { CONFIGITEM_MAGCARD_OFFSET,              CONFIGTYPE_8 },
  { CONFIGITEM_MAGCARD_DIGITS,              CONFIGTYPE_8 },
  { CONFIGITEM_ALARMS,                      CONFIGTYPE_STRING },
  { CONFIGITEM_FILTERS,                     CONFIGTYPE_STRING },
  { CONFIGITEM_ALARMSTATE,                  CONFIGTYPE_8 },
  { CONFIGITEM_DOORSTATE,                   CONFIGTYPE_8 },
  { CONFIGITEM_DPACDEBUG,                   CONFIGTYPE_BOOL },
  { CONFIGITEM_FAILOPENSECURE,              CONFIGTYPE_BOOL },
  { CONFIGITEM_REPLACED_VOLTAGE,            CONFIGTYPE_8 },
  { CONFIGITEM_RX_HELD_TIME,                CONFIGTYPE_8 },
  { CONFIGITEM_PACKET_TIMEOUT,              CONFIGTYPE_8 },
  { CONFIGITEM_EXTENDEDRESPONSE,            CONFIGTYPE_BOOL },
  { CONFIGITEM_PASSAGEMODEINDICATOR,        CONFIGTYPE_BOOL },
  { CONFIGITEM_PFMRETURNTIME,               CONFIGTYPE_8 }
};

/*
 *
 */
static hf_register_info hf [] = 
{
  { &hf_r3_tildex3ds, { "DPAC Attention", "r3.dpac_attention", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},

  { &hf_r3_header,  { "Header",   "r3.header",  FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_payload, { "Payload",  "r3.payload", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_tail,    { "Tail",     "r3.tail",    FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL }},

  { &hf_r3_sigil,        { "Sigil",         "r3.sigil",        FT_UINT8,   BASE_HEX,     NULL, 0x0, NULL, HFILL }},
  { &hf_r3_address,      { "Address",       "r3.address",      FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_packetnumber, { "Packet Number", "r3.packetnumber", FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_packetlength, { "Packet Length", "r3.packetlength", FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_encryption,   { "Crypt Type",    "r3.encryption",   FT_UINT8,   BASE_DEC_HEX, VALS (r3_encryptionschemenames), 0x0, NULL, HFILL }},
  { &hf_r3_crc,          { "CRC",           "r3.crc",          FT_UINT16,  BASE_HEX,     NULL, 0x0, NULL, HFILL }},
  { &hf_r3_crc_bad,      { "Bad CRC",       "r3.crc_bad",      FT_BOOLEAN, BASE_NONE,    NULL, 0x0, NULL, HFILL }},
  { &hf_r3_xor,          { "XOR",           "r3.xor",          FT_UINT8,   BASE_HEX,     NULL, 0x0, NULL, HFILL }},
  { &hf_r3_xor_bad,      { "Bad XOR",       "r3.xor_bad",      FT_BOOLEAN, BASE_NONE,    NULL, 0x0, NULL, HFILL }},

  { &hf_r3_commandlength, { "Command Length", "r3.command.length",  FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_command,       { "Command",        "r3.command.command", FT_UINT8, BASE_DEC_HEX, VALS (r3_cmdnames), 0x0, NULL, HFILL }},
  { &hf_r3_commanddata,   { "Command Data",   "r3.command.data",    FT_NONE,  BASE_NONE,    NULL, 0x0, NULL, HFILL }},

  { &hf_r3_commandmfglength, { "Mfg Command Length", "r3.commandmfg.length",  FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_commandmfg,       { "Mfg Command",        "r3.commandmfg.command", FT_UINT8, BASE_DEC_HEX, VALS (r3_cmdmfgnames), 0x0, NULL, HFILL }},
  { &hf_r3_commandmfgdata,   { "Mfg Command Data",   "r3.commandmfg.data",    FT_NONE,  BASE_NONE,    NULL, 0x0, NULL, HFILL }},

  { &hf_r3_responselength,    { "Response Length",      "r3.response.length",       FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_responsecommand,   { "Response Command",     "r3.response.command",      FT_UINT8, BASE_DEC_HEX, VALS (r3_cmdnames), 0x0, NULL, HFILL }},
  { &hf_r3_responsetype,      { "Response Type",        "r3.response.responsetype", FT_UINT8, BASE_DEC_HEX, VALS (r3_responsetypenames), 0x0, NULL, HFILL }},
  { &hf_r3_responsetocommand, { "Response To Command",  "r3.response.to_command",   FT_UINT8, BASE_DEC_HEX, VALS (r3_cmdnames), 0x0, NULL, HFILL }},
  { &hf_r3_responsedata,      { "Response Data",        "r3.response.data",         FT_NONE,  BASE_NONE,    NULL, 0x0, NULL, HFILL }},

  { &hf_r3_upstreamcommand, { "Upstream Command", "r3.upstreamcommand.command", FT_UINT8, BASE_DEC_HEX, VALS (r3_upstreamcommandnames), 0x0, NULL, HFILL }},

  { &hf_r3_upstreamfield,                                           { "Upstream Field",         "r3.upstreamfield",                     FT_NONE,    BASE_NONE,    NULL, 0x0, NULL, HFILL }},
  { &hf_r3_upstreamfieldlength,                                     { "Field Length",           "r3.upstreamfield.length",              FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_upstreamfieldtype,                                       { "Field Type",             "r3.upstreamfield.type",                FT_UINT8,   BASE_DEC_HEX, VALS (r3_upstreamfieldnames), 0x0, NULL, HFILL }},
  { &hf_r3_upstreamfielddatalen,                                    { "Data Length",            "r3.upstreamfield.datalen",             FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_upstreamfielderror,                                      { "Error",                  "r3.upstreamfield.error",               FT_STRING,  BASE_NONE,    NULL, 0x0, NULL, HFILL }},
  { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_SERIALNUMBER],         { "Serial Number",          "r3.upstreamfield.serialnumber",        FT_STRING,  BASE_NONE,    NULL, 0x0, NULL, HFILL }},
  { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_NAR],                  { "Next Available Record",  "r3.upstreamfield.nar",                 FT_UINT16,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_ENTRYDEVICE],          { "Entry Device",           "r3.upstreamfield.entrydevice",         FT_UINT8,   BASE_DEC_HEX, VALS (r3_ppmisourcenames), 0x0, NULL, HFILL }},
  { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_PPMIFIELDTYPE],        { "PPMI Field Type",        "r3.upstreamfield.ppmifieldtype",       FT_UINT8,   BASE_HEX_DEC, VALS (r3_ppmisourcenames), 0x0, NULL, HFILL }},
  { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_PIN],                  { "PIN",                    "r3.upstreamfield.pin",                 FT_STRING,  BASE_NONE,    NULL, 0x0, NULL, HFILL }},
  { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_SEQUENCENUMBER],       { "Sequence Number",        "r3.upstreamfield.sequencenumber",      FT_UINT16,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_RESPONSEWINDOW],       { "Response Window",        "r3.upstreamfield.responsewindow",      FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_USERNUMBER],           { "User Number",            "r3.upstreamfield.usernumber",          FT_UINT16,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_VERSION],              { "Version",                "r3.upstreamfield.version",             FT_STRING,  BASE_NONE,    NULL, 0x0, NULL, HFILL }},
  { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_EVENTLOGRECORD],       { "Event Log Record",       "r3.upstreamfield.eventlogrecord",      FT_BYTES,   BASE_NONE,    NULL, 0x0, NULL, HFILL }},
  { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_DATETIME],             { "Date/Time",              "r3.upstreamfield.datetime",            FT_BYTES,   BASE_NONE,    NULL, 0x0, NULL, HFILL }},
  { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_EVENTLOGRECORDCOUNT],  { "Event Log Record Count", "r3.upstreamfield.eventlogrecordcount", FT_UINT16,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_DECLINEDRECORDCOUNT],  { "Declined Log Record",    "r3.upstreamfield.declinedlogrecord",   FT_UINT16,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_DECLINEDRECORD],       { "Declined Log",           "r3.upstreamfield.declinedlog",         FT_BYTES,   BASE_NONE,    NULL, 0x0, NULL, HFILL }},
  { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_USERTYPE],             { "User Type",              "r3.upstreamfield.usertype",            FT_UINT8,   BASE_DEC_HEX, VALS (r3_usertypenames), 0x0, NULL, HFILL }},
  { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_ACCESSALWAYS],         { "Access Always",          "r3.upstreamfield.accessalways",        FT_BOOLEAN, BASE_NONE,    NULL, 0x0, NULL, HFILL }},
  { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_CACHED],               { "Cached",                 "r3.upstreamfield.cached",              FT_BOOLEAN, BASE_NONE,    NULL, 0x0, NULL, HFILL }},
  { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_PRIMARYFIELDTYPE],     { "Primary Field Type",     "r3.upstreamfield.primaryfieldtype",    FT_UINT8,   BASE_DEC_HEX, VALS (r3_ppmisourcenames), 0x0, NULL, HFILL }},
  { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_AUXFIELDTYPE],         { "Aux Field Type",         "r3.upstreamfield.auxfieldtype",        FT_UINT8,   BASE_DEC_HEX, VALS (r3_ppmisourcenames), 0x0, NULL, HFILL }},
  { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_ACCESSMODE],           { "Access Mode",            "r3.upstreamfield.accessmode",          FT_UINT8,   BASE_DEC_HEX, VALS (r3_accessmodenames), 0x0, NULL, HFILL }},
  { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_EXPIREON],             { "Expire On",              "r3.upstreamfield.expireon",            FT_UINT24,  BASE_HEX,     NULL, 0x0, NULL, HFILL }},
  { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_USECOUNT],             { "Use Count",              "r3.upstreamfield.usecount",            FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_TIMEZONE],             { "Timezone",               "r3.upstreamfield.timezone",            FT_UINT32,  BASE_HEX,     NULL, 0x0, NULL, HFILL }},
  { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_EXCEPTIONGROUP],       { "Exception Group",        "r3.upstreamfield.exceptiongroup",      FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_PRIMARYPIN],           { "Primary PIN",            "r3.upstreamfield.primarypin",          FT_BYTES,   BASE_NONE,    NULL, 0x0, NULL, HFILL }},
  { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_AUXPIN],               { "Aux PIN",                "r3.upstreamfield.auxpin",              FT_BYTES,   BASE_NONE,    NULL, 0x0, NULL, HFILL }},
  { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_ALARMRECORDCOUNT],     { "Alarm Record Count",     "r3.upstreamfield.alarmrecordcount",    FT_UINT16,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_ALARMRECORD],          { "Alarm Record",           "r3.upstreamfield.alarmrecord",         FT_BYTES,   BASE_NONE,    NULL, 0x0, NULL, HFILL }},
  { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_AUXCTLRVERSION],       { "Aux Controller Version", "r3.upstreamfield.auxctlrversion",      FT_STRING,  BASE_NONE,    NULL, 0x0, NULL, HFILL }},

  { &hf_r3_configitems,           { "Configuration Item List",    "r3.configitems",             FT_NONE,    BASE_NONE,    NULL, 0x0, NULL, HFILL }},
  { &hf_r3_configitem,            { "Configuration Item",         "r3.configitem",              FT_UINT8,   BASE_DEC_HEX, VALS (r3_configitemnames), 0x0, NULL, HFILL }},
  { &hf_r3_configfield,           { "Config Field",               "r3.configfield",             FT_NONE,    BASE_NONE,    NULL, 0x0, NULL, HFILL }},
  { &hf_r3_configitemlength,      { "Configuration Item Length",  "r3.configitem.length",       FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_configitemtype,        { "Configuration Item Type",    "r3.configitem.type",         FT_UINT8,   BASE_DEC_HEX, VALS (r3_configtypenames), 0x0, NULL, HFILL }},
  { &hf_r3_configitemdata,        { "Configuration Item Data",    "r3.configitem.data",         FT_NONE,    BASE_NONE,    NULL, 0x0, NULL, HFILL }},
  { &hf_r3_configitemdata_bool,   { "Configuration Item Boolean", "r3.configitem.data_boolean", FT_BOOLEAN, BASE_NONE,    NULL, 0x0, NULL, HFILL }},
  { &hf_r3_configitemdata_8,      { "Configuration Item 8-bit",   "r3.configitem.data_8",       FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_configitemdata_16,     { "Configuration Item 16-bit",  "r3.configitem.data_16",      FT_UINT16,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_configitemdata_32,     { "Configuration Item 32-bit",  "r3.configitem.data_32",      FT_UINT32,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_configitemdata_string, { "Configuration Item String",  "r3.configitem.data_string",  FT_STRING,  BASE_NONE,    NULL, 0x0, NULL, HFILL }},

  { &hf_r3_timezonearray [ 0], { "Timezone  0", "r3.timezone.0",  FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00000001, NULL, HFILL }},
  { &hf_r3_timezonearray [ 1], { "Timezone  1", "r3.timezone.1",  FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00000002, NULL, HFILL }},
  { &hf_r3_timezonearray [ 2], { "Timezone  2", "r3.timezone.2",  FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00000004, NULL, HFILL }},
  { &hf_r3_timezonearray [ 3], { "Timezone  3", "r3.timezone.3",  FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00000008, NULL, HFILL }},
  { &hf_r3_timezonearray [ 4], { "Timezone  4", "r3.timezone.4",  FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00000010, NULL, HFILL }},
  { &hf_r3_timezonearray [ 5], { "Timezone  5", "r3.timezone.5",  FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00000020, NULL, HFILL }},
  { &hf_r3_timezonearray [ 6], { "Timezone  6", "r3.timezone.6",  FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00000040, NULL, HFILL }},
  { &hf_r3_timezonearray [ 7], { "Timezone  7", "r3.timezone.7",  FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00000080, NULL, HFILL }},
  { &hf_r3_timezonearray [ 8], { "Timezone  8", "r3.timezone.8",  FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00000100, NULL, HFILL }},
  { &hf_r3_timezonearray [ 9], { "Timezone  9", "r3.timezone.9",  FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00000200, NULL, HFILL }},
  { &hf_r3_timezonearray [10], { "Timezone 10", "r3.timezone.10", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00000400, NULL, HFILL }},
  { &hf_r3_timezonearray [11], { "Timezone 11", "r3.timezone.11", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00000800, NULL, HFILL }},
  { &hf_r3_timezonearray [12], { "Timezone 12", "r3.timezone.12", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00001000, NULL, HFILL }},
  { &hf_r3_timezonearray [13], { "Timezone 13", "r3.timezone.13", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00002000, NULL, HFILL }},
  { &hf_r3_timezonearray [14], { "Timezone 14", "r3.timezone.14", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00004000, NULL, HFILL }},
  { &hf_r3_timezonearray [15], { "Timezone 15", "r3.timezone.15", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00008000, NULL, HFILL }},
  { &hf_r3_timezonearray [16], { "Timezone 16", "r3.timezone.16", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00010000, NULL, HFILL }},
  { &hf_r3_timezonearray [17], { "Timezone 17", "r3.timezone.17", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00020000, NULL, HFILL }},
  { &hf_r3_timezonearray [18], { "Timezone 18", "r3.timezone.18", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00040000, NULL, HFILL }},
  { &hf_r3_timezonearray [19], { "Timezone 19", "r3.timezone.19", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00080000, NULL, HFILL }},
  { &hf_r3_timezonearray [20], { "Timezone 20", "r3.timezone.20", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00100000, NULL, HFILL }},
  { &hf_r3_timezonearray [21], { "Timezone 21", "r3.timezone.21", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00200000, NULL, HFILL }},
  { &hf_r3_timezonearray [22], { "Timezone 22", "r3.timezone.22", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00400000, NULL, HFILL }},
  { &hf_r3_timezonearray [23], { "Timezone 23", "r3.timezone.23", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00800000, NULL, HFILL }},
  { &hf_r3_timezonearray [24], { "Timezone 24", "r3.timezone.24", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x01000000, NULL, HFILL }},
  { &hf_r3_timezonearray [25], { "Timezone 25", "r3.timezone.25", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x02000000, NULL, HFILL }},
  { &hf_r3_timezonearray [26], { "Timezone 26", "r3.timezone.26", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x04000000, NULL, HFILL }},
  { &hf_r3_timezonearray [27], { "Timezone 27", "r3.timezone.27", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x08000000, NULL, HFILL }},
  { &hf_r3_timezonearray [28], { "Timezone 28", "r3.timezone.28", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x10000000, NULL, HFILL }},
  { &hf_r3_timezonearray [29], { "Timezone 29", "r3.timezone.29", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x20000000, NULL, HFILL }},
  { &hf_r3_timezonearray [30], { "Timezone 30", "r3.timezone.30", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x40000000, NULL, HFILL }},
  { &hf_r3_timezonearray [31], { "Timezone 31", "r3.timezone.31", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x80000000, NULL, HFILL }},

  { &hf_r3_expireon_year,  { "Expiration Year",  "r3.expireon.year",  FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_expireon_month, { "Expiration Month", "r3.expireon.month", FT_UINT8, BASE_DEC_HEX, VALS (r3_monthnames), 0x0, NULL, HFILL }},
  { &hf_r3_expireon_day,   { "Expiration Day",   "r3.expireon.day",   FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},

  { &hf_r3_datetime_year,    { "Date/Time Year",    "r3.datetime.year",    FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_datetime_month,   { "Date/Time Month",   "r3.datetime.month",   FT_UINT8,   BASE_DEC_HEX, VALS (r3_monthnames), 0x0, NULL, HFILL }},
  { &hf_r3_datetime_day,     { "Date/Time Day",     "r3.datetime.day",     FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_datetime_dow,     { "Date/Time DOW",     "r3.datetime.dow",     FT_UINT8,   BASE_DEC_HEX, VALS (r3_daynames), 0x0, NULL, HFILL }},
  { &hf_r3_datetime_hours,   { "Date/Time Hours",   "r3.datetime.hours",   FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_datetime_minutes, { "Date/Time Minutes", "r3.datetime.minutes", FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_datetime_seconds, { "Date/Time Seconds", "r3.datetime.seconds", FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_datetime_dst,     { "Date/Time DST",     "r3.datetime.dst",     FT_BOOLEAN, BASE_NONE,    NULL, 0x0, NULL, HFILL }},

  { &hf_r3_eventlog_recordnumber, { "Record Number", "r3.eventlog.recordnumber", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_eventlog_year,         { "Year",          "r3.eventlog.year",         FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_eventlog_month,        { "Month",         "r3.eventlog.month",        FT_UINT8,  BASE_DEC_HEX, VALS (r3_monthnames), 0x0, NULL, HFILL }},
  { &hf_r3_eventlog_day,          { "Day",           "r3.eventlog.day",          FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_eventlog_hour,         { "Hours",         "r3.eventlog.hours",        FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_eventlog_minute,       { "Minutes",       "r3.eventlog.minutes",      FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_eventlog_second,       { "Seconds",       "r3.eventlog.seconds",      FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_eventlog_usernumber,   { "User Number",   "r3.eventlog.usernumber",   FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_eventlog_event,        { "ID",            "r3.eventlog.id",           FT_UINT8,  BASE_DEC_HEX, VALS (r3_eventnames), 0x0, NULL, HFILL }},

  { &hf_r3_declinedlog_recordnumber, { "Record Number",     "r3.declinedlog.recordnumber", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_declinedlog_year,         { "Year",              "r3.declinedlog.year",         FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_declinedlog_month,        { "Month",             "r3.declinedlog.month",        FT_UINT8,  BASE_DEC_HEX, VALS (r3_monthnames), 0x0, NULL, HFILL }},
  { &hf_r3_declinedlog_day,          { "Day",               "r3.declinedlog.day",          FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_declinedlog_hour,         { "Hours",             "r3.declinedlog.hours",        FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_declinedlog_minute,       { "Minutes",           "r3.declinedlog.minutes",      FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_declinedlog_second,       { "Seconds",           "r3.declinedlog.seconds",      FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_declinedlog_usernumber,   { "User Number",       "r3.declinedlog.usernumber",   FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_declinedlog_cred1type,    { "Credential 1 Type", "r3.declinedlog.cred1type",    FT_UINT8,  BASE_DEC_HEX, VALS (r3_fieldtypenames), 0x0, NULL, HFILL }},
  { &hf_r3_declinedlog_cred2type,    { "Credential 2 Type", "r3.declinedlog.cred2type",    FT_UINT8,  BASE_DEC_HEX, VALS (r3_fieldtypenames), 0x0, NULL, HFILL }},
  { &hf_r3_declinedlog_cred1,        { "Credential 1",      "r3.declinedlog.cred1",        FT_BYTES,  BASE_NONE,    NULL, 0x0, NULL, HFILL }},
  { &hf_r3_declinedlog_cred2,        { "Credential 2",      "r3.declinedlog.cred2",        FT_BYTES,  BASE_NONE,    NULL, 0x0, NULL, HFILL }},

  { &hf_r3_alarmlog_recordnumber, { "Record Number", "r3.alarmlog.recordnumber", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_alarmlog_year,         { "Year",          "r3.alarmlog.year",         FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_alarmlog_month,        { "Month",         "r3.alarmlog.month",        FT_UINT8,  BASE_DEC_HEX, VALS (r3_monthnames), 0x0, NULL, HFILL }},
  { &hf_r3_alarmlog_day,          { "Day",           "r3.alarmlog.day",          FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_alarmlog_hour,         { "Hours",         "r3.alarmlog.hours",        FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_alarmlog_minute,       { "Minutes",       "r3.alarmlog.minutes",      FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_alarmlog_second,       { "Seconds",       "r3.alarmlog.seconds",      FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_alarmlog_id,           { "ID",            "r3.alarmlog.id",           FT_UINT8,  BASE_DEC_HEX, VALS (r3_alarmidnames), 0x0, NULL, HFILL }},
  { &hf_r3_alarmlog_usernumber,   { "User Number",   "r3.alarmlog.usernumber",   FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},

  { &hf_r3_debugmsg, { "Debug Message", "r3.debug", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},

  { &hf_r3_setdate_year,    { "Year",        "r3.setdate.year",    FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_setdate_month,   { "Month",       "r3.setdate.month",   FT_UINT8, BASE_DEC_HEX, VALS (r3_monthnames), 0x0, NULL, HFILL }},
  { &hf_r3_setdate_day,     { "Day",         "r3.setdate.day",     FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_setdate_dow,     { "Day-Of-Week", "r3.setdate.dow",     FT_UINT8, BASE_DEC_HEX, VALS (r3_daynames), 0x0, NULL, HFILL }},
  { &hf_r3_setdate_hours,   { "Hours",       "r3.setdate.hours",   FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_setdate_minutes, { "Minutes",     "r3.setdate.minutes", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_setdate_seconds, { "Seconds",     "r3.setdate.seconds", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},

  { &hf_r3_deleteusers, { "Delete Users", "r3.deleteusers", FT_UINT8, BASE_DEC_HEX, VALS (r3_deleteusersnames), 0x0, NULL, HFILL }},

  { &hf_r3_defineexception_number,            { "Exception Number", "r3.defineexception.number",        FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_defineexception_startdate_month,   { "Start Month",      "r3.defineexception.start.month",   FT_UINT8, BASE_DEC_HEX, VALS (r3_monthnames), 0x0, NULL, HFILL }},
  { &hf_r3_defineexception_startdate_day,     { "Start Day",        "r3.defineexception.start.day",     FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_defineexception_startdate_hours,   { "Start Hours",      "r3.defineexception.start.hours",   FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_defineexception_startdate_minutes, { "Start Minutes",    "r3.defineexception.start.minutes", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_defineexception_enddate_month,     { "End Month",        "r3.defineexception.end.month",     FT_UINT8, BASE_DEC_HEX, VALS (r3_monthnames), 0x0, NULL, HFILL }},
  { &hf_r3_defineexception_enddate_day,       { "End Day",          "r3.defineexception.end.day",       FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_defineexception_enddate_hours,     { "End Hours",        "r3.defineexception.end.hours",     FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_defineexception_enddate_minutes,   { "End Minutes",      "r3.defineexception.end.minutes",   FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},

  { &hf_r3_defineexceptiongroup_number, { "Define Exception Group Number",    "r3.defineexceptiongroup.number", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_defineexceptiongroup_bits,   { "Define Exception Group Bit Field", "r3.defineexceptiongroup.field",  FT_NONE,  BASE_NONE,    NULL, 0x0, NULL, HFILL }},

  { &hf_r3_definecalendar_number, { "Define Calendar Number",    "r3.definecalendar.number", FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_definecalendar_bits,   { "Define Calendar Bit Field", "r3.definecalendar.field",  FT_NONE,   BASE_NONE,    NULL, 0x0, NULL, HFILL }},

  { &hf_r3_definetimezone_number,            { "Timezone Number",  "r3.definetimezone.number",           FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_definetimezone_starttime_hours,   { "Start Hours",      "r3.definetimezone.start.hours",      FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_definetimezone_starttime_minutes, { "Start Minutes",    "r3.definetimezone.start.minutes",    FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_definetimezone_endtime_hours,     { "End Hours",        "r3.definetimezone.end.hours",        FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_definetimezone_endtime_minutes,   { "End Minutes",      "r3.definetimezone.end.minutes",      FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_definetimezone_daymap [0],        { "Sunday",           "r3.definetimezone.daymap.sunday",    FT_BOOLEAN, 8,            TFS (&tfs_enabled_disabled), 0x00000001, NULL, HFILL }},
  { &hf_r3_definetimezone_daymap [1],        { "Monday",           "r3.definetimezone.daymap.monday",    FT_BOOLEAN, 8,            TFS (&tfs_enabled_disabled), 0x00000002, NULL, HFILL }},
  { &hf_r3_definetimezone_daymap [2],        { "Tuesday",          "r3.definetimezone.daymap.tuesday",   FT_BOOLEAN, 8,            TFS (&tfs_enabled_disabled), 0x00000004, NULL, HFILL }},
  { &hf_r3_definetimezone_daymap [3],        { "Wednesday",        "r3.definetimezone.daymap.wednesday", FT_BOOLEAN, 8,            TFS (&tfs_enabled_disabled), 0x00000008, NULL, HFILL }},
  { &hf_r3_definetimezone_daymap [4],        { "Thursday",         "r3.definetimezone.daymap.thursday",  FT_BOOLEAN, 8,            TFS (&tfs_enabled_disabled), 0x00000010, NULL, HFILL }},
  { &hf_r3_definetimezone_daymap [5],        { "Friday",           "r3.definetimezone.daymap.friday",    FT_BOOLEAN, 8,            TFS (&tfs_enabled_disabled), 0x00000020, NULL, HFILL }},
  { &hf_r3_definetimezone_daymap [6],        { "Saturday",         "r3.definetimezone.daymap.saturday",  FT_BOOLEAN, 8,            TFS (&tfs_enabled_disabled), 0x00000040, NULL, HFILL }},
  { &hf_r3_definetimezone_exceptiongroup,    { "Exception Group",  "r3.definetimezone.exceptiongroup",   FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_definetimezone_mode,              { "Mode",             "r3.definetimezone.mode",             FT_UINT8,   BASE_DEC_HEX, VALS (r3_timezonemodenames), 0x0, NULL, HFILL }},
  { &hf_r3_definetimezone_calendar,          { "Calendar",         "r3.definetimezone.calendar",         FT_NONE,    BASE_NONE,    NULL, 0x0, NULL, HFILL }},

  { &hf_r3_rmtauthretry_sequence, { "Remote Auth Retry Sequence",  "r3.rmtauthretry.sequence",  FT_UINT16,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_rmtauthretry_retry,    { "Remote Auth Retry Mode",      "r3.rmtauthretry.mode",      FT_BOOLEAN, 8, TFS (&tfs_rmtauthretry_flags), 0x0, NULL, HFILL }},

  { &hf_r3_eventlogdump_starttime_year,    { "Start Year",    "r3.eventlogdump.start.year",     FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_eventlogdump_starttime_month,   { "Start Month",   "r3.eventlogdump.start.month",    FT_UINT8,  BASE_DEC_HEX, VALS (r3_monthnames), 0x0, NULL, HFILL }},
  { &hf_r3_eventlogdump_starttime_day,     { "Start Day",     "r3.eventlogdump.start.day",      FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_eventlogdump_starttime_hours,   { "Start Hours",   "r3.eventlogdump.start.hours",    FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_eventlogdump_starttime_minutes, { "Start Minutes", "r3.eventlogdump.start.minutes",  FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_eventlogdump_endtime_year,      { "End Year",      "r3.eventlogdump.end.year",       FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_eventlogdump_endtime_month,     { "End Month",     "r3.eventlogdump.end.month",      FT_UINT8,  BASE_DEC_HEX, VALS (r3_monthnames), 0x0, NULL, HFILL }},
  { &hf_r3_eventlogdump_endtime_day,       { "End Day",       "r3.eventlogdump.end.day",        FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_eventlogdump_endtime_hours,     { "End Hours",     "r3.eventlogdump.end.hours",      FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_eventlogdump_endtime_minutes,   { "End Minutes",   "r3.eventlogdump.end.minutes",    FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_eventlogdump_user,              { "Filter User",   "r3.eventlogdump.user",           FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},

  { &hf_r3_declinedlogdump_starttime_year,    { "Start Year",    "r3.declinedlogdump.start.year",    FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_declinedlogdump_starttime_month,   { "Start Month",   "r3.declinedlogdump.start.month",   FT_UINT8, BASE_DEC_HEX, VALS (r3_monthnames), 0x0, NULL, HFILL }},
  { &hf_r3_declinedlogdump_starttime_day,     { "Start Day",     "r3.declinedlogdump.start.day",     FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_declinedlogdump_starttime_hours,   { "Start Hours",   "r3.declinedlogdump.start.hours",   FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_declinedlogdump_starttime_minutes, { "Start Minutes", "r3.declinedlogdump.start.minutes", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_declinedlogdump_endtime_year,      { "End Year",      "r3.declinedlogdump.end.year",      FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_declinedlogdump_endtime_month,     { "End Month",     "r3.declinedlogdump.end.month",     FT_UINT8, BASE_DEC_HEX, VALS (r3_monthnames), 0x0, NULL, HFILL }},
  { &hf_r3_declinedlogdump_endtime_day,       { "End Day",       "r3.declinedlogdump.end.day",       FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_declinedlogdump_endtime_hours,     { "End Hours",     "r3.declinedlogdump.end.hours",     FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_declinedlogdump_endtime_minutes,   { "End Minutes",   "r3.declinedlogdump.end.minutes",   FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},

  { &hf_r3_alarmlogdump_starttime_year,    { "Start Year",    "r3.alarmlogdump.start.year",    FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_alarmlogdump_starttime_month,   { "Start Month",   "r3.alarmlogdump.start.month",   FT_UINT8, BASE_DEC_HEX, VALS (r3_monthnames), 0x0, NULL, HFILL }},
  { &hf_r3_alarmlogdump_starttime_day,     { "Start Day",     "r3.alarmlogdump.start.day",     FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_alarmlogdump_starttime_hours,   { "Start Hours",   "r3.alarmlogdump.start.hours",   FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_alarmlogdump_starttime_minutes, { "Start Minutes", "r3.alarmlogdump.start.minutes", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_alarmlogdump_endtime_year,      { "End Year",      "r3.alarmlogdump.end.year",      FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_alarmlogdump_endtime_month,     { "End Month",     "r3.alarmlogdump.end.month",     FT_UINT8, BASE_DEC_HEX, VALS (r3_monthnames), 0x0, NULL, HFILL }},
  { &hf_r3_alarmlogdump_endtime_day,       { "End Day",       "r3.alarmlogdump.end.day",       FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_alarmlogdump_endtime_hours,     { "End Hours",     "r3.alarmlogdump.end.hours",     FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_alarmlogdump_endtime_minutes,   { "End Minutes",   "r3.alarmlogdump.end.minutes",   FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},

  { &hf_r3_nvramclearoptions [ 0], { "NVRAMCLEAROPTIONS_CFGINSTALLER",    "r3.nvramclear.cfginstaller",    FT_BOOLEAN, 16, TFS (&tfs_enabled_disabled), 0x00000001, NULL, HFILL }},
  { &hf_r3_nvramclearoptions [ 1], { "NVRAMCLEAROPTIONS_CFGADMIN",        "r3.nvramclear.cfgadmin",        FT_BOOLEAN, 16, TFS (&tfs_enabled_disabled), 0x00000002, NULL, HFILL }},
  { &hf_r3_nvramclearoptions [ 2], { "NVRAMCLEAROPTIONS_EXCEPTIONS",      "r3.nvramclear.exceptions",      FT_BOOLEAN, 16, TFS (&tfs_enabled_disabled), 0x00000004, NULL, HFILL }},
  { &hf_r3_nvramclearoptions [ 3], { "NVRAMCLEAROPTIONS_EXCEPTIONGROUPS", "r3.nvramclear.exceptiongroups", FT_BOOLEAN, 16, TFS (&tfs_enabled_disabled), 0x00000008, NULL, HFILL }},
  { &hf_r3_nvramclearoptions [ 4], { "NVRAMCLEAROPTIONS_CALENDARS",       "r3.nvramclear.calendars",       FT_BOOLEAN, 16, TFS (&tfs_enabled_disabled), 0x00000010, NULL, HFILL }},
  { &hf_r3_nvramclearoptions [ 5], { "NVRAMCLEAROPTIONS_TIMEZONES",       "r3.nvramclear.timezones",       FT_BOOLEAN, 16, TFS (&tfs_enabled_disabled), 0x00000020, NULL, HFILL }},
  { &hf_r3_nvramclearoptions [ 6], { "NVRAMCLEAROPTIONS_FILTERS",         "r3.nvramclear.filters",         FT_BOOLEAN, 16, TFS (&tfs_enabled_disabled), 0x00000040, NULL, HFILL }},
  { &hf_r3_nvramclearoptions [ 7], { "NVRAMCLEAROPTIONS_EVENTLOG",        "r3.nvramclear.eventlog",        FT_BOOLEAN, 16, TFS (&tfs_enabled_disabled), 0x00000080, NULL, HFILL }},
  { &hf_r3_nvramclearoptions [ 8], { "NVRAMCLEAROPTIONS_USERDATA",        "r3.nvramclear.userdata",        FT_BOOLEAN, 16, TFS (&tfs_enabled_disabled), 0x00000100, NULL, HFILL }},
  { &hf_r3_nvramclearoptions [ 9], { "NVRAMCLEAROPTIONS_DECLINEDLOG",     "r3.nvramclear.declinedlog",     FT_BOOLEAN, 16, TFS (&tfs_enabled_disabled), 0x00000200, NULL, HFILL }},
  { &hf_r3_nvramclearoptions [10], { "NVRAMCLEAROPTIONS_ALARMLOG",        "r3.nvramclear.alarmlog",        FT_BOOLEAN, 16, TFS (&tfs_enabled_disabled), 0x00000400, NULL, HFILL }},
  { &hf_r3_nvramclearoptions [11], { "NVRAMCLEAROPTIONS_LRUCACHE",        "r3.nvramclear.lrucache",        FT_BOOLEAN, 16, TFS (&tfs_enabled_disabled), 0x00000800, NULL, HFILL }},
  { &hf_r3_nvramclearoptions [12], { "NVRAMCLEAROPTIONS_DBHASH",          "r3.nvramclear.dbhash",          FT_BOOLEAN, 16, TFS (&tfs_enabled_disabled), 0x00001000, NULL, HFILL }},
  { &hf_r3_nvramclearoptions [13], { "NVRAMCLEAROPTIONS_CFGSYSTEM",       "r3.nvramclear.cfgsystem",       FT_BOOLEAN, 16, TFS (&tfs_enabled_disabled), 0x00002000, NULL, HFILL }},
  { &hf_r3_nvramclearoptions [14], { "NVRAMCLEAROPTIONS_UNUSED",          "r3.nvramclear.unused",          FT_BOOLEAN, 16, TFS (&tfs_enabled_disabled), 0x00004000, NULL, HFILL }},
  { &hf_r3_nvramclearoptions [15], { "NVRAMCLEAROPTIONS_USEBACKUP",       "r3.nvramclear.usebackup",       FT_BOOLEAN, 16, TFS (&tfs_enabled_disabled), 0x00008000, NULL, HFILL }},

  { &hf_r3_writeeventlog_user,  { "User",  "r3.writeeventlog.user",  FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_writeeventlog_event, { "Event", "r3.writeeventlog.event", FT_UINT8,  BASE_DEC_HEX, VALS (r3_eventnames), 0x0, NULL, HFILL }},

  { &hf_r3_powertableselection, { "Table", "r3.powertableselection", FT_UINT8, BASE_DEC_HEX, VALS (r3_powertablenames), 0x0, NULL, HFILL }},

  { &hf_r3_filter_type, { "Type",  "r3.filter.type",  FT_UINT8, BASE_DEC_HEX, VALS (r3_filtertypenames), 0x0, NULL, HFILL }},
  { &hf_r3_filter_list, { "Event", "r3.filter.event", FT_UINT8, BASE_DEC_HEX, VALS (r3_filtereventnames), 0x0, NULL, HFILL }},

  { &hf_r3_alarm_length, { "Length", "r3.alarm.length", FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_alarm_id,     { "ID",     "r3.alarm.id",     FT_UINT8,   BASE_DEC_HEX, VALS (r3_alarmidnames), 0x0, NULL, HFILL }},
  { &hf_r3_alarm_state,  { "State",  "r3.alarm.state",  FT_BOOLEAN, 8,            TFS (&tfs_enabled_disabled), 0x0, NULL, HFILL }},

  { &hf_r3_mfgfield_length, { "Field Length", "r3.mfgfield.length",  FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_mfgfield,        { "Field",        "r3.mfgfield.field",   FT_UINT8, BASE_DEC_HEX, VALS (r3_mfgfieldnames), 0x0, NULL, HFILL }},
  { &hf_r3_mfgfield_data,   { "Field Data",   "r3.mfgfield.data",    FT_NONE,  BASE_NONE,    NULL, 0x0, NULL, HFILL }},

  { &hf_r3_mfgsetserialnumber, { "Serial Number", "r3.mfgsetserialnumber", FT_STRING, BASE_NONE,    NULL, 0x0, NULL, HFILL }},
  { &hf_r3_mfgsetcryptkey,     { "Crypt Key",     "r3.mfgsetcryptkey",     FT_BYTES,  BASE_NONE,    NULL, 0x0, NULL, HFILL }},
  { &hf_r3_mfgdumpnvram,       { "NVRAM Section", "r3.mfgnvramdump",       FT_UINT8,  BASE_DEC_HEX, VALS (r3_mfgnvramdumpnames), 0x0, NULL, HFILL }},
  { &hf_r3_mfgremoteunlock,    { "Remote Unlock", "r3.mfgremoteunlock",    FT_UINT8,  BASE_DEC_HEX, VALS (r3_mfgremoteunlocknames), 0x0, NULL, HFILL }},
  { &hf_r3_mfgtestpreserve,    { "Preserve Mode", "r3.mfgtestpreserve",    FT_UINT8,  BASE_DEC_HEX, VALS (r3_mfgtestpreservenames), 0x0, NULL, HFILL }},

  { &hf_r3_adc [0], { "ADC 0", "r3.adc.0", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_adc [1], { "ADC 1", "r3.adc.1", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_adc [2], { "ADC 2", "r3.adc.2", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_adc [3], { "ADC 3", "r3.adc.3", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_adc [4], { "ADC 4", "r3.adc.4", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_adc [5], { "ADC 5", "r3.adc.5", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_adc [6], { "ADC 6", "r3.adc.6", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_adc [7], { "ADC 7", "r3.adc.7", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},

  { &hf_r3_hardwareid_board,  { "Board ID", "r3.hardwareid.board",  FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_hardwareid_cpuid,  { "CPU ID",   "r3.hardwareid.cpuid",  FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_hardwareid_cpurev, { "CPU Rev",  "r3.hardwareid.cpurev", FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},

  { &hf_r3_testkeypad,   { "Keypad Char",  "r3.test.keypad",   FT_UINT8,  BASE_HEX,  NULL, 0x0, NULL, HFILL }},
  { &hf_r3_testmagcard,  { "Mag Card",     "r3.test.magcard",  FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_testproxcard, { "Prox Card",    "r3.test.proxcard", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},

  { &hf_r3_nvramdump_record, { "Record Number", "r3.nvramdump.record",  FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_nvramdump_length, { "Record Length", "r3.nvramdump.length",  FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_nvramdump_data,   { "Record Data",   "r3.nvramdump.data",    FT_NONE,   BASE_NONE,    NULL, 0x0, NULL, HFILL }},

  { &hf_r3_nvramdumprle_record, { "Record Number", "r3.nvramdumprle.record",  FT_UINT24, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_nvramdumprle_length, { "Record Length", "r3.nvramdumprle.length",  FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_nvramdumprle_data,   { "Record Data",   "r3.nvramdumprle.data",    FT_NONE,   BASE_NONE,    NULL, 0x0, NULL, HFILL }},

  { &hf_r3_iopins_lat,  { "LAT",  "r3.iopins.lat",   FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_iopins_port, { "PORT", "r3.iopins.port",  FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_iopins_tris, { "TRIS", "r3.iopins.tris",  FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},

  { &hf_r3_mortisepins_s1, { "Mortise Pin S1", "r3.mortisepins.s1", FT_BOOLEAN, 8, TFS (&tfs_mortisepins_flags), 0x00000001, NULL, HFILL }},
  { &hf_r3_mortisepins_s2, { "Mortise Pin S2", "r3.mortisepins.s2", FT_BOOLEAN, 8, TFS (&tfs_mortisepins_flags), 0x00000002, NULL, HFILL }},
  { &hf_r3_mortisepins_s3, { "Mortise Pin S3", "r3.mortisepins.s3", FT_BOOLEAN, 8, TFS (&tfs_mortisepins_flags), 0x00000004, NULL, HFILL }},
  { &hf_r3_mortisepins_s4, { "Mortise Pin S4", "r3.mortisepins.s4", FT_BOOLEAN, 8, TFS (&tfs_mortisepins_flags), 0x00000008, NULL, HFILL }},

  { &hf_r3_checksumresults ,       { "Checksum Results", "r3.checksumresults",        FT_NONE,    BASE_NONE, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_checksumresults_field,  { "Field",            "r3.checksumresults.field",  FT_UINT8,   BASE_HEX,  VALS (r3_checksumresultnames), 0x0, NULL, HFILL }},
  { &hf_r3_checksumresults_length, { "Length",           "r3.checksumresults.length", FT_UINT8,   BASE_HEX,  NULL, 0x0, NULL, HFILL }},
  { &hf_r3_checksumresults_state,  { "State",            "r3.checksumresults.state",  FT_BOOLEAN, 8,         TFS (&tfs_errornoerror_flags), 0x0, NULL, HFILL }},

  { &hf_r3_forceoptions_item,      { "Item",   "r3.forceoptions.item",   FT_UINT8,   BASE_HEX_DEC, VALS (r3_forceitemnames), 0x0, NULL, HFILL }},
  { &hf_r3_forceoptions_length,    { "Length", "r3.forceoptions.length", FT_UINT8,   BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_forceoptions_state_8,   { "State",  "r3.forceoptions.state",  FT_BOOLEAN, 8,            TFS (&tfs_enabled_disabled), 0x0, NULL, HFILL }},
  { &hf_r3_forceoptions_state_16,  { "State",  "r3.forceoptions.state",  FT_UINT16,  BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_forceoptions_state_24,  { "State",  "r3.forceoptions.state",  FT_UINT24,  BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_forceoptions_state_32,  { "State",  "r3.forceoptions.state",  FT_UINT32,  BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},

  { &hf_r3_peekpoke_operation,  { "Operation",    "r3.peekpoke.operation",  FT_UINT8,  BASE_HEX_DEC, VALS (r3_peekpokenames), 0x0, NULL, HFILL }},
  { &hf_r3_peekpoke_address,    { "Address",      "r3.peekpoke.address",    FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_peekpoke_length,     { "Length",       "r3.peekpoke.length",     FT_UINT8,  BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_peekpoke_poke8,      { "8 Bit Value",  "r3.peekpoke.poke8",      FT_UINT8,  BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_peekpoke_poke16,     { "16 Bit Value", "r3.peekpoke.poke16",     FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_peekpoke_poke24,     { "24 Bit Value", "r3.peekpoke.poke24",     FT_UINT24, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_peekpoke_poke32,     { "32 Bit Value", "r3.peekpoke.poke32",     FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_peekpoke_pokestring, { "String Value", "r3.peekpoke.pokestring", FT_BYTES,  BASE_NONE,    NULL, 0x0, NULL, HFILL }},

  { &hf_r3_firmwaredownload_length,  { "Length",        "r3.firmwaredownload.length",  FT_UINT8,   BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_firmwaredownload_record,  { "Record Number", "r3.firmwaredownload.record",  FT_UINT16,  BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_firmwaredownload_action,  { "Action",        "r3.firmwaredownload.action",  FT_UINT8,   BASE_HEX_DEC, VALS (r3_downloadfirmwarenames), 0x0, NULL, HFILL }},
  { &hf_r3_firmwaredownload_timeout, { "Timeout",       "r3.firmwaredownload.timeout", FT_UINT8,   BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_firmwaredownload_nvram,   { "NVRAM",         "r3.firmwaredownload.nvram",   FT_UINT8,   BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_firmwaredownload_address, { "Address",       "r3.firmwaredownload.address", FT_UINT32,  BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_firmwaredownload_bytes,   { "Bytes",         "r3.firmwaredownload.bytes",   FT_UINT8,   BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_firmwaredownload_data,    { "Data",          "r3.firmwaredownload.data",    FT_NONE,    BASE_NONE,    NULL, 0x0, NULL, HFILL }},
  { &hf_r3_firmwaredownload_crc,     { "CRC",           "r3.firmwaredownload.crc",     FT_UINT16,  BASE_HEX,     NULL, 0x0, NULL, HFILL }},
  { &hf_r3_firmwaredownload_crc_bad, { "Bad CRC",       "r3.firmwaredownload.crc_bad", FT_BOOLEAN, BASE_NONE,    NULL, 0x0, NULL, HFILL }},

  { &hf_r3_nvramchecksumvalue,       { "Value", "r3.nvramchecksum.value", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_nvramchecksumvalue_fixup, { "Fixup", "r3.nvramchecksum.fixup", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }},

  { &hf_r3_capabilities,        { "Capability", "r3.capabilities",      FT_NONE,   BASE_NONE,    NULL, 0x0, NULL, HFILL }},
  { &hf_r3_capabilities_length, { "Length",     "r3.capabilies.length", FT_UINT8,  BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_capabilities_type,   { "Type",       "r3.capabilies.type",   FT_UINT8,  BASE_HEX_DEC, VALS (r3_capabilitiesnames), 0x0, NULL, HFILL }},
  { &hf_r3_capabilities_value,  { "Value",      "r3.capabilies.value",  FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},

  { &hf_r3_lockstate_passage,            { "Passage",              "r3.lockstate.passage",            FT_BOOLEAN, 24, NULL, 0x00000001, NULL, HFILL }},
  { &hf_r3_lockstate_panic,              { "Panic",                "r3.lockstate.panic",              FT_BOOLEAN, 24, NULL, 0x00000002, NULL, HFILL }},
  { &hf_r3_lockstate_lockout,            { "Lockout",              "r3.lockstate.lockout",            FT_BOOLEAN, 24, NULL, 0x00000004, NULL, HFILL }},
  { &hf_r3_lockstate_relock,             { "Relock",               "r3.lockstate.relock",             FT_BOOLEAN, 24, NULL, 0x00000008, NULL, HFILL }},
  { &hf_r3_lockstate_autoopen,           { "Auto Open",            "r3.lockstate.autoopen",           FT_BOOLEAN, 24, NULL, 0x00000010, NULL, HFILL }},
  { &hf_r3_lockstate_nextauto,           { "Next Auto",            "r3.lockstate.nextauto",           FT_BOOLEAN, 24, NULL, 0x00000020, NULL, HFILL }},
  { &hf_r3_lockstate_lockstate,          { "Lock State",           "r3.lockstate.lockstate",          FT_BOOLEAN, 24, NULL, 0x00000040, NULL, HFILL }},
  { &hf_r3_lockstate_wantstate,          { "Want State",           "r3.lockstate.wantstate",          FT_BOOLEAN, 24, NULL, 0x00000080, NULL, HFILL }},
  { &hf_r3_lockstate_remote,             { "Remote",               "r3.lockstate.remote",             FT_BOOLEAN, 24, NULL, 0x00000100, NULL, HFILL }},
  { &hf_r3_lockstate_update,             { "Update",               "r3.lockstate.update",             FT_BOOLEAN, 24, NULL, 0x00000200, NULL, HFILL }},
  { &hf_r3_lockstate_exceptionspresent,  { "Exceptions Present",   "r3.lockstate.exceptionspresent",  FT_BOOLEAN, 24, NULL, 0x00000400, NULL, HFILL }},
  { &hf_r3_lockstate_exceptionsactive,   { "Exceptions Active",    "r3.lockstate.exceptionsactive",   FT_BOOLEAN, 24, NULL, 0x00000800, NULL, HFILL }},
  { &hf_r3_lockstate_timezonespresent,   { "Timezones Presents",   "r3.lockstate.timezonespresent",   FT_BOOLEAN, 24, NULL, 0x00001000, NULL, HFILL }},
  { &hf_r3_lockstate_timezonesactive,    { "Timezones Active",     "r3.lockstate.timezonesactive",    FT_BOOLEAN, 24, NULL, 0x00002000, NULL, HFILL }},
  { &hf_r3_lockstate_autounlockspresent, { "Auto Unlocks Present", "r3.lockstate.autounlockspresent", FT_BOOLEAN, 24, NULL, 0x00004000, NULL, HFILL }},
  { &hf_r3_lockstate_autounlocksactive,  { "Auto Unlocks Active",  "r3.lockstate.autounlocksactive",  FT_BOOLEAN, 24, NULL, 0x00008000, NULL, HFILL }},
  { &hf_r3_lockstate_uapmspresent,       { "UAPMs Present",        "r3.lockstate.uapmspresent",       FT_BOOLEAN, 24, NULL, 0x00010000, NULL, HFILL }},
  { &hf_r3_lockstate_uapmsactive,        { "UAPMs Active",         "r3.lockstate.uapmsactive",        FT_BOOLEAN, 24, NULL, 0x00020000, NULL, HFILL }},
  { &hf_r3_lockstate_uapmrelockspresent, { "UAPM Relocks Present", "r3.lockstate.uapmrelockspresent", FT_BOOLEAN, 24, NULL, 0x00040000, NULL, HFILL }},
  { &hf_r3_lockstate_uapmreslocksactive, { "UAPM Relocks Active",  "r3.lockstate.uapmreslocksactive", FT_BOOLEAN, 24, NULL, 0x00080000, NULL, HFILL }},
  { &hf_r3_lockstate_nvramprotect,       { "NVRAM Protect",        "r3.lockstate.nvramprotect",       FT_BOOLEAN, 24, NULL, 0x00100000, NULL, HFILL }},
  { &hf_r3_lockstate_nvramchecksum,      { "MVRAM Checksum",       "r3.lockstate.nvramchecksum",      FT_BOOLEAN, 24, NULL, 0x00200000, NULL, HFILL }},

  { &hf_r3_mortisestatelog,             { "Mortise State Log",       "r3.mortisestatelog",             FT_NONE,    BASE_NONE,    NULL, 0x0, NULL, HFILL }},
  { &hf_r3_mortisestatelog_pointer,     { "Event Pointer",           "r3.mortisestatelog.pointer",     FT_UINT8,   BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_mortisestatelog_mortisetype, { "Mortise Type",            "r3.mortisestatelog.mortisetype", FT_UINT8,   BASE_HEX_DEC, VALS (r3_mortisetypenames), 0x0, NULL, HFILL }},
  { &hf_r3_mortisestatelog_waiting,     { "Waiting For Door Closed", "r3.mortisestatelog.waiting",     FT_BOOLEAN, 8,            TFS (&tfs_true_false ), 0x00, NULL, HFILL }},
  { &hf_r3_mortisestatelog_state,       { "State",                   "r3.mortisestatelog.state",       FT_UINT8,   BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_mortisestatelog_last,        { "Last State",              "r3.mortisestatelog.laststate",   FT_UINT8,   BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_mortisestatelog_event,       { "Event",                   "r3.mortisestatelog.event",       FT_UINT8,   BASE_HEX_DEC, VALS (r3_mortiseeventnames), 0x0, NULL, HFILL }},

  { &hf_r3_timerchain_newtick,         { "New Tick",         "r3.timerchain.newtick",         FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_timerchain_currentboundary, { "Current Boundary", "r3.timerchain.currentboundary", FT_UINT8,  BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_timerchain_tasktag,         { "Task Tag",         "r3.timerchain.tasktag",         FT_UINT8,  BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_timerchain_address,         { "Address",          "r3.timerchain.address",         FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_timerchain_reload,          { "Reload",           "r3.timerchain.reload",          FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_timerchain_boundary,        { "Boundary",         "r3.timerchain.boundary",        FT_UINT8,  BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_timerchain_count,           { "Count",            "r3.timerchain.count",           FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_timerchain_flags,           { "Flags",            "r3.timerchain.flags",           FT_UINT32, BASE_HEX,     NULL, 0x0, NULL, HFILL }},

  { &hf_r3_taskflags_taskid, { "Task ID", "r3.taskflags.taskid", FT_UINT8,  BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_taskflags_flags,  { "Flags",   "r3.taskflags.flags",  FT_UINT32, BASE_HEX,     NULL, 0x0, NULL, HFILL }},

  { &hf_r3_checkpointlog_entryptr,   { "Entry Pointer", "r3.checkpointlog.entrypointer",  FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_checkpointlog_rcon,       { "RCON",          "r3.checkpointlog.rcon",          FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_checkpointlog_checkpoint, { "Checkpoint",    "r3.checkpointlog.checkpoint",    FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},

  { &hf_r3_cpuregisters_intcon,  { "INTCON",  "r3.cpuregisters.intcon",  FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_cpuregisters_intcon2, { "INTCON2", "r3.cpuregisters.intcon2", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_cpuregisters_intcon3, { "INTCON3", "r3.cpuregisters.intcon3", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_cpuregisters_pir1,    { "PIR1",    "r3.cpuregisters.pir1",    FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_cpuregisters_pir2,    { "PIR2",    "r3.cpuregisters.pir2",    FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_cpuregisters_pir3,    { "PIR3",    "r3.cpuregisters.pir3",    FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_cpuregisters_pie1,    { "PIE1",    "r3.cpuregisters.pie1",    FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_cpuregisters_pie2,    { "PIE2",    "r3.cpuregisters.pie2",    FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_cpuregisters_pie3,    { "PIE3",    "r3.cpuregisters.pie3",    FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_cpuregisters_ipr1,    { "IPR1",    "r3.cpuregisters.ipr1",    FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_cpuregisters_ipr2,    { "IPR2",    "r3.cpuregisters.ipr2",    FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_cpuregisters_ipr3,    { "IPR3",    "r3.cpuregisters.ipr3",    FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_cpuregisters_rcon,    { "RCON",    "r3.cpuregisters.rcon",    FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_cpuregisters_osccon,  { "OSCCON",  "r3.cpuregisters.osccon",  FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_cpuregisters_rcsta,   { "RCSTA",   "r3.cpuregisters.rcsta",   FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_cpuregisters_txsta,   { "TXSTA",   "r3.cpuregisters.txsta",   FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_cpuregisters_rcsta2,  { "RCSTA2",  "r3.cpuregisters.rcsta2",  FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_cpuregisters_txsta2,  { "TXSTA2",  "r3.cpuregisters.txsta2",  FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_cpuregisters_wdtcon,  { "WDTCON",  "r3.cpuregisters.wdtcon",  FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},

  { &hf_r3_cpuregisters_intcon_rbif,     { "INTCON.RBIF",     "r3.cpuregisters.intcon.rbif",     FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
  { &hf_r3_cpuregisters_intcon_int0if,   { "INTCON.INT0IF",   "r3.cpuregisters.intcon.int0if",   FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
  { &hf_r3_cpuregisters_intcon_tmr0if,   { "INTCON.TMR0IF",   "r3.cpuregisters.intcon.tmr0if",   FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
  { &hf_r3_cpuregisters_intcon_rbie,     { "INTCON.RBIE",     "r3.cpuregisters.intcon.rbie",     FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
  { &hf_r3_cpuregisters_intcon_int0ie,   { "INTCON.INT0IE",   "r3.cpuregisters.intcon.int0ie",   FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
  { &hf_r3_cpuregisters_intcon_tmr0ie,   { "INTCON.TMR0IE",   "r3.cpuregisters.intcon.tmr0ie",   FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
  { &hf_r3_cpuregisters_intcon_giel,     { "INTCON.GIEL",     "r3.cpuregisters.intcon.giel",     FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
  { &hf_r3_cpuregisters_intcon_gieh,     { "INTCON.GIEH",     "r3.cpuregisters.intcon.gieh",     FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
  { &hf_r3_cpuregisters_intcon2_rbip,    { "INTCON2.RBIP",    "r3_cpuregisters_intcon2_rbip",    FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
  { &hf_r3_cpuregisters_intcon2_int3ip,  { "INTCON2.INT3IP",  "r3_cpuregisters_intcon2_int3ip",  FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
  { &hf_r3_cpuregisters_intcon2_tmr0ip,  { "INTCON2.TMR0IP",  "r3_cpuregisters_intcon2_tmr0ip",  FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
  { &hf_r3_cpuregisters_intcon2_intedg3, { "INTCON2.INTEDG3", "r3_cpuregisters_intcon2_intedg3", FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
  { &hf_r3_cpuregisters_intcon2_intedg2, { "INTCON2.INTEDG2", "r3_cpuregisters_intcon2_intedg2", FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
  { &hf_r3_cpuregisters_intcon2_intedg1, { "INTCON2.INTEDG1", "r3_cpuregisters_intcon2_intedg1", FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
  { &hf_r3_cpuregisters_intcon2_intedg0, { "INTCON2.INTEDG0", "r3_cpuregisters_intcon2_intedg0", FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
  { &hf_r3_cpuregisters_intcon2_rbpu,    { "INTCON2.RBPU",    "r3_cpuregisters_intcon2_rbpu",    FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
  { &hf_r3_cpuregisters_intcon3_int1if,  { "INTCON3.INT1IF",  "r3.cpuregisters.intcon3.int1if",  FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
  { &hf_r3_cpuregisters_intcon3_int2if,  { "INTCON3.INT2IF",  "r3.cpuregisters.intcon3.int2if",  FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
  { &hf_r3_cpuregisters_intcon3_int3if,  { "INTCON3.INT3IF",  "r3.cpuregisters.intcon3.int3if",  FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
  { &hf_r3_cpuregisters_intcon3_int1ie,  { "INTCON3.INT1IE",  "r3.cpuregisters.intcon3.int1ie",  FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
  { &hf_r3_cpuregisters_intcon3_int2ie,  { "INTCON3.INT2IE",  "r3.cpuregisters.intcon3.int2ie",  FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
  { &hf_r3_cpuregisters_intcon3_int3ie,  { "INTCON3.INT3IE",  "r3.cpuregisters.intcon3.int3ie",  FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
  { &hf_r3_cpuregisters_intcon3_int1ip,  { "INTCON3.INT1IP",  "r3.cpuregisters.intcon3.int1ip",  FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
  { &hf_r3_cpuregisters_intcon3_int2ip,  { "INTCON3.INT2IP",  "r3.cpuregisters.intcon3.int2ip",  FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
  { &hf_r3_cpuregisters_pir1_tmr1if,     { "PIR1.TMR1IF",     "r3.cpuregisters.pir1.tmr1if",     FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
  { &hf_r3_cpuregisters_pir1_tmr2if,     { "PIR1.TMR2IF",     "r3.cpuregisters.pir1.tmr2if",     FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
  { &hf_r3_cpuregisters_pir1_ccp1if,     { "PIR1.CCP1IF",     "r3.cpuregisters.pir1.ccp1if",     FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
  { &hf_r3_cpuregisters_pir1_ssp1if,     { "PIR1.SSP1IF",     "r3.cpuregisters.pir1.ssp1if",     FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
  { &hf_r3_cpuregisters_pir1_tx1if,      { "PIR1.TX1IF",      "r3.cpuregisters.pir1.tx1if",      FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
  { &hf_r3_cpuregisters_pir1_rc1if,      { "PIR1.RC1IF",      "r3.cpuregisters.pir1.rc1if",      FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
  { &hf_r3_cpuregisters_pir1_adif,       { "PIR1.ADIF",       "r3.cpuregisters.pir1.adif",       FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
  { &hf_r3_cpuregisters_pir1_pspif,      { "PIR1.PSPIF",      "r3.cpuregisters.pir1.pspif",      FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
  { &hf_r3_cpuregisters_pir2_ccp2if,     { "PIR2.CCP2IF",     "r3.cpuregisters.pir2.ccp2if",     FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
  { &hf_r3_cpuregisters_pir2_tmr3if,     { "PIR2.TMR3IF",     "r3.cpuregisters.pir2.tmr3if",     FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
  { &hf_r3_cpuregisters_pir2_hlvdif,     { "PIR2.HLVDIF",     "r3.cpuregisters.pir2.hlvdif",     FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
  { &hf_r3_cpuregisters_pir2_bcl1if,     { "PIR2.BCL1IF",     "r3.cpuregisters.pir2.bcl1if",     FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
  { &hf_r3_cpuregisters_pir2_eeif,       { "PIR2.EEIF",       "r3.cpuregisters.pir2.eeif",       FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
  { &hf_r3_cpuregisters_pir2_unused5,    { "PIR2.UNUSED5",    "r3.cpuregisters.pir2.unused5",    FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
  { &hf_r3_cpuregisters_pir2_cmif,       { "PIR2.CMIF",       "r3.cpuregisters.pir2.cmif",       FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
  { &hf_r3_cpuregisters_pir2_oscfif,     { "PIR2.OSCFIF",     "r3.cpuregisters.pir2.oscfif",     FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
  { &hf_r3_cpuregisters_pir3_ccp3if,     { "PIR3.CCP3IF",     "r3.cpuregisters.pir3.ccp3if",     FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
  { &hf_r3_cpuregisters_pir3_ccp4if,     { "PIR3.CCP4IF",     "r3.cpuregisters.pir3.ccp4if",     FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
  { &hf_r3_cpuregisters_pir3_ccp5if,     { "PIR3.CCP5IF",     "r3.cpuregisters.pir3.ccp5if",     FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
  { &hf_r3_cpuregisters_pir3_tmr4if,     { "PIR3.TMR4IF",     "r3.cpuregisters.pir3.tmr4if",     FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
  { &hf_r3_cpuregisters_pir3_tx2if,      { "PIR3.TX2IF",      "r3.cpuregisters.pir3.tx2if",      FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
  { &hf_r3_cpuregisters_pir3_rc2if,      { "PIR3.RC2IF",      "r3.cpuregisters.pir3.rc2if",      FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
  { &hf_r3_cpuregisters_pir3_bcl2if,     { "PIR3.BCL2IF",     "r3.cpuregisters.pir3.bcl2if",     FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
  { &hf_r3_cpuregisters_pir3_ssp2if,     { "PIR3.SSP2IF",     "r3.cpuregisters.pir3.ssp2if",     FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
  { &hf_r3_cpuregisters_pie1_tmr1ie,     { "PIE1.TMR1IE",     "r3.cpuregisters.pie1.tmr1ie",     FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
  { &hf_r3_cpuregisters_pie1_tmr2ie,     { "PIE1.TMR2IE",     "r3.cpuregisters.pie1.tmr2ie",     FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
  { &hf_r3_cpuregisters_pie1_ccp1ie,     { "PIE1.CCP1IE",     "r3.cpuregisters.pie1.ccp1ie",     FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
  { &hf_r3_cpuregisters_pie1_ssp1ie,     { "PIE1.SSP1IE",     "r3.cpuregisters.pie1.ssp1ie",     FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
  { &hf_r3_cpuregisters_pie1_tx1ie,      { "PIE1.TX1IE",      "r3.cpuregisters.pie1.tx1ie",      FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
  { &hf_r3_cpuregisters_pie1_rc1ie,      { "PIE1.RC1IE",      "r3.cpuregisters.pie1.rc1ie",      FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
  { &hf_r3_cpuregisters_pie1_adie,       { "PIE1.ADIE",       "r3.cpuregisters.pie1.adie",       FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
  { &hf_r3_cpuregisters_pie1_pspie,      { "PIE1.PSPIE",      "r3.cpuregisters.pie1.pspie",      FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
  { &hf_r3_cpuregisters_pie2_oscfie,     { "PIE2.OSCFIE",     "r3.cpuregisters.pie2.oscfie",     FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
  { &hf_r3_cpuregisters_pie2_cmie,       { "PIE2.CMIE",       "r3.cpuregisters.pie2.cmie",       FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
  { &hf_r3_cpuregisters_pie2_unused2,    { "PIE2.UNUSED2",    "r3.cpuregisters.pie2.unused2",    FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
  { &hf_r3_cpuregisters_pie2_eeie,       { "PIE2.EEIE",       "r3.cpuregisters.pie2.eeie",       FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
  { &hf_r3_cpuregisters_pie2_bcl1ie,     { "PIE2.BCL1IE",     "r3.cpuregisters.pie2.bcl1ie",     FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
  { &hf_r3_cpuregisters_pie2_hlvdie,     { "PIE2.HLVDIE",     "r3.cpuregisters.pie2.hlvdie",     FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
  { &hf_r3_cpuregisters_pie2_tmr3ie,     { "PIE2.TMR3IE",     "r3.cpuregisters.pie2.tmr3ie",     FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
  { &hf_r3_cpuregisters_pie2_ccp2ie,     { "PIE2.CCP2IE",     "r3.cpuregisters.pie2.ccp2ie",     FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
  { &hf_r3_cpuregisters_pie3_ccp3ie,     { "PIE3.CCP3IE",     "r3.cpuregisters.pie3.ccp3ie",     FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
  { &hf_r3_cpuregisters_pie3_ccp4ie,     { "PIE3.CCP4IE",     "r3.cpuregisters.pie3.ccp4ie",     FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
  { &hf_r3_cpuregisters_pie3_ccp5ie,     { "PIE3.CCP5IE",     "r3.cpuregisters.pie3.ccp5ie",     FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
  { &hf_r3_cpuregisters_pie3_tmr4ie,     { "PIE3.TMR4IE",     "r3.cpuregisters.pie3.tmr4ie",     FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
  { &hf_r3_cpuregisters_pie3_tx2ie,      { "PIE3.TX2IE",      "r3.cpuregisters.pie3.tx2ie",      FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
  { &hf_r3_cpuregisters_pie3_rc2ie,      { "PIE3.RC2IE",      "r3.cpuregisters.pie3.rc2ie",      FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
  { &hf_r3_cpuregisters_pie3_bcl2ie,     { "PIE3.BCL2IE",     "r3.cpuregisters.pie3.bcl2ie",     FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
  { &hf_r3_cpuregisters_pie3_ssp2ie,     { "PIE3.SSP2IE",     "r3.cpuregisters.pie3.ssp2ie",     FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
  { &hf_r3_cpuregisters_ipr1_tmr1ip,     { "IPR1.TMR1IP",     "r3.cpuregisters.ipr1.tmr1ip",     FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
  { &hf_r3_cpuregisters_ipr1_tmr2ip,     { "IPR1.TMR2IP",     "r3.cpuregisters.ipr1.tmr2ip",     FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
  { &hf_r3_cpuregisters_ipr1_ccp1ip,     { "IPR1.CCP1IP",     "r3.cpuregisters.ipr1.ccp1ip",     FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
  { &hf_r3_cpuregisters_ipr1_ssp1ip,     { "IPR1.SSP1IP",     "r3.cpuregisters.ipr1.ssp1ip",     FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
  { &hf_r3_cpuregisters_ipr1_tx1ip,      { "IPR1.TX1IP",      "r3.cpuregisters.ipr1.tx1ip",      FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
  { &hf_r3_cpuregisters_ipr1_rc1ip,      { "IPR1.RC1IP",      "r3.cpuregisters.ipr1.rc1ip",      FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
  { &hf_r3_cpuregisters_ipr1_adip,       { "IPR1.ADIP",       "r3.cpuregisters.ipr1.adip",       FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
  { &hf_r3_cpuregisters_ipr1_pspip,      { "IPR1.PSPIP",      "r3.cpuregisters.ipr1.pspip",      FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
  { &hf_r3_cpuregisters_ipr2_ccp2ip,     { "IPR2.CCP2IP",     "r3.cpuregisters.ipr2.ccp2ip",     FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
  { &hf_r3_cpuregisters_ipr2_tmr3ip,     { "IPR2.TMR3IP",     "r3.cpuregisters.ipr2.tmr3ip",     FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
  { &hf_r3_cpuregisters_ipr2_hlvdip,     { "IPR2.HLVDIP",     "r3.cpuregisters.ipr2.hlvdip",     FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
  { &hf_r3_cpuregisters_ipr2_bcl1ip,     { "IPR2.BCL1IP",     "r3.cpuregisters.ipr2.bcl1ip",     FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
  { &hf_r3_cpuregisters_ipr2_eeip,       { "IPR2.EEIP",       "r3.cpuregisters.ipr2.eeip",       FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
  { &hf_r3_cpuregisters_ipr2_unused5,    { "IPR2.UNUSED5",    "r3.cpuregisters.ipr2.unused5",    FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
  { &hf_r3_cpuregisters_ipr2_cmip,       { "IPR2.CMIP",       "r3.cpuregisters.ipr2.cmip",       FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
  { &hf_r3_cpuregisters_ipr2_oscfip,     { "IPR2.OSCFIP",     "r3.cpuregisters.ipr2.oscfip",     FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
  { &hf_r3_cpuregisters_ipr3_ccp2ip,     { "IPR3.CCP2IP",     "r3.cpuregisters.ipr3.ccp2ip",     FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
  { &hf_r3_cpuregisters_ipr3_ccp4ip,     { "IPR3.CCP4IP",     "r3.cpuregisters.ipr3.ccp4ip",     FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
  { &hf_r3_cpuregisters_ipr3_ccp5ip,     { "IPR3.CCP5IP",     "r3.cpuregisters.ipr3.ccp5ip",     FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
  { &hf_r3_cpuregisters_ipr3_tmr4ip,     { "IPR3.TMR4IP",     "r3.cpuregisters.ipr3.tmr4ip",     FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
  { &hf_r3_cpuregisters_ipr3_tx2ip,      { "IPR3.TX2IP",      "r3.cpuregisters.ipr3.tx2ip",      FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
  { &hf_r3_cpuregisters_ipr3_rc2ip,      { "IPR3.RC2IP",      "r3.cpuregisters.ipr3.rc2ip",      FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
  { &hf_r3_cpuregisters_ipr3_bcl2ip,     { "IPR3.BCL2IP",     "r3.cpuregisters.ipr3.bcl2ip",     FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
  { &hf_r3_cpuregisters_ipr3_ssp2ip,     { "IPR3.SSP2IP",     "r3.cpuregisters.ipr3.ssp2ip",     FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
  { &hf_r3_cpuregisters_rcon_bor,        { "RCON./BOR",       "r3.cpuregisters.rcon.bor",        FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
  { &hf_r3_cpuregisters_rcon_por,        { "RCON./POR",       "r3.cpuregisters.rcon.por",        FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
  { &hf_r3_cpuregisters_rcon_pd,         { "RCON./PD",        "r3.cpuregisters.rcon.pd",         FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
  { &hf_r3_cpuregisters_rcon_to,         { "RCON./TO",        "r3.cpuregisters.rcon.to",         FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
  { &hf_r3_cpuregisters_rcon_unused4,    { "RCON.UNUSED4",    "r3.cpuregisters.rcon.unused4",    FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
  { &hf_r3_cpuregisters_rcon_ri,         { "RCON./RI",        "r3.cpuregisters.rcon.ri",         FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
  { &hf_r3_cpuregisters_rcon_sboren,     { "RCON.SBOREN",     "r3.cpuregisters.rcon.sboren",     FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
  { &hf_r3_cpuregisters_rcon_ipen,       { "RCON.IPEN",       "r3.cpuregisters.rcon.ipen",       FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
  { &hf_r3_cpuregisters_osccon_scs0,     { "OSCCON.SCS0",     "r3.cpuregisters.osccon.scs0",     FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
  { &hf_r3_cpuregisters_osccon_scs1,     { "OSCCON.SCS1",     "r3.cpuregisters.osccon.scs1",     FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
  { &hf_r3_cpuregisters_osccon_iofs,     { "OSCCON.IOFS",     "r3.cpuregisters.osccon.iofs",     FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
  { &hf_r3_cpuregisters_osccon_osts,     { "OSCCON.OSTS",     "r3.cpuregisters.osccon.osts",     FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
  { &hf_r3_cpuregisters_osccon_ircf0,    { "OSCCON.IRCF0",    "r3.cpuregisters.osccon.ircf0",    FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
  { &hf_r3_cpuregisters_osccon_ircf1,    { "OSCCON.IRCF1",    "r3.cpuregisters.osccon.ircf1",    FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
  { &hf_r3_cpuregisters_osccon_ircf2,    { "OSCCON.IRCF2",    "r3.cpuregisters.osccon.ircf2",    FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
  { &hf_r3_cpuregisters_osccon_idlen,    { "OSCCON.IDLEN",    "r3.cpuregisters.osccon.idlen",    FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
  { &hf_r3_cpuregisters_rcsta_rx9d,      { "RCSTA.RX9D",      "r3.cpuregisters.rcsta.rx9d",      FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
  { &hf_r3_cpuregisters_rcsta_oerr,      { "RCSTA.OERR",      "r3.cpuregisters.rcsta.oerr",      FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
  { &hf_r3_cpuregisters_rcsta_ferr,      { "RCSTA.FERR",      "r3.cpuregisters.rcsta.ferr",      FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
  { &hf_r3_cpuregisters_rcsta_adden,     { "RCSTA.ADDEN",     "r3.cpuregisters.rcsta.adden",     FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
  { &hf_r3_cpuregisters_rcsta_cren,      { "RCSTA.CREN",      "r3.cpuregisters.rcsta.cren",      FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
  { &hf_r3_cpuregisters_rcsta_sren,      { "RCSTA.SREN",      "r3.cpuregisters.rcsta.sren",      FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
  { &hf_r3_cpuregisters_rcsta_rx9,       { "RCSTA.RX9",       "r3.cpuregisters.rcsta.rx9",       FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
  { &hf_r3_cpuregisters_rcsta_spen,      { "RCSTA.SPEN",      "r3.cpuregisters.rcsta.spen",      FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
  { &hf_r3_cpuregisters_txsta_tx9d,      { "TXSTA.TX9D",      "r3.cpuregisters.txsta.tx9d",      FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
  { &hf_r3_cpuregisters_txsta_trmt,      { "TXSTA.TRMT",      "r3.cpuregisters.txsta.trmt",      FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
  { &hf_r3_cpuregisters_txsta_brgh,      { "TXSTA.BRGH",      "r3.cpuregisters.txsta.brgh",      FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
  { &hf_r3_cpuregisters_txsta_sendb,     { "TXSTA.SENDB",     "r3.cpuregisters.txsta.sendb",     FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
  { &hf_r3_cpuregisters_txsta_sync,      { "TXSTA.SYNC",      "r3.cpuregisters.txsta.sync",      FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
  { &hf_r3_cpuregisters_txsta_txen,      { "TXSTA.TXEN",      "r3.cpuregisters.txsta.txen",      FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
  { &hf_r3_cpuregisters_txsta_tx9,       { "TXSTA.TX9",       "r3.cpuregisters.txsta.tx9",       FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
  { &hf_r3_cpuregisters_txsta_csrc,      { "TXSTA.CSRC",      "r3.cpuregisters.txsta.csrc",      FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
  { &hf_r3_cpuregisters_rcsta2_rx9d,     { "RCSTA2.RX9D",     "r3.cpuregisters.rcsta2.rx9d",     FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
  { &hf_r3_cpuregisters_rcsta2_oerr,     { "RCSTA2.OERR",     "r3.cpuregisters.rcsta2.oerr",     FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
  { &hf_r3_cpuregisters_rcsta2_ferr,     { "RCSTA2.FERR",     "r3.cpuregisters.rcsta2.ferr",     FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
  { &hf_r3_cpuregisters_rcsta2_adden,    { "RCSTA2.ADDEN",    "r3.cpuregisters.rcsta2.adden",    FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
  { &hf_r3_cpuregisters_rcsta2_cren,     { "RCSTA2.CREN",     "r3.cpuregisters.rcsta2.cren",     FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
  { &hf_r3_cpuregisters_rcsta2_sren,     { "RCSTA2.SREN",     "r3.cpuregisters.rcsta2.sren",     FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
  { &hf_r3_cpuregisters_rcsta2_rx9,      { "RCSTA2.RX9",      "r3.cpuregisters.rcsta2.rx9",      FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
  { &hf_r3_cpuregisters_rcsta2_spen,     { "RCSTA2.SPEN",     "r3.cpuregisters.rcsta2.spen",     FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
  { &hf_r3_cpuregisters_txsta2_tx9d,     { "TXSTA2.TX9D",     "r3.cpuregisters.txsta2.tx9d",     FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
  { &hf_r3_cpuregisters_txsta2_trmt,     { "TXSTA2.TRMT",     "r3.cpuregisters.txsta2.trmt",     FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
  { &hf_r3_cpuregisters_txsta2_brgh,     { "TXSTA2.BRGH",     "r3.cpuregisters.txsta2.brgh",     FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
  { &hf_r3_cpuregisters_txsta2_sendb,    { "TXSTA2.SENDB",    "r3.cpuregisters.txsta2.sendb",    FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
  { &hf_r3_cpuregisters_txsta2_sync,     { "TXSTA2.SYNC",     "r3.cpuregisters.txsta2.sync",     FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
  { &hf_r3_cpuregisters_txsta2_txen,     { "TXSTA2.TXEN",     "r3.cpuregisters.txsta2.txen",     FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
  { &hf_r3_cpuregisters_txsta2_tx9,      { "TXSTA2.TX9",      "r3.cpuregisters.txsta2.tx9",      FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
  { &hf_r3_cpuregisters_txsta2_csrc,     { "TXSTA2.CSRC",     "r3.cpuregisters.txsta2.csrc",     FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
  { &hf_r3_cpuregisters_wdtcon_swdten,   { "WDTCON.SWDTEN",   "r3.cpuregisters.wdtcon.swdten",   FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
  { &hf_r3_cpuregisters_wdtcon_unused1,  { "WDTCON.UNUSED1",  "r3.cpuregisters.wdtcon.unused1",  FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
  { &hf_r3_cpuregisters_wdtcon_unused2,  { "WDTCON.UNUSED2",  "r3.cpuregisters.wdtcon.unused2",  FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
  { &hf_r3_cpuregisters_wdtcon_unused3,  { "WDTCON.UNUSED3",  "r3.cpuregisters.wdtcon.unused3",  FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
  { &hf_r3_cpuregisters_wdtcon_unused4,  { "WDTCON.UNUSED4",  "r3.cpuregisters.wdtcon.unused4",  FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
  { &hf_r3_cpuregisters_wdtcon_unused5,  { "WDTCON.UNUSED5",  "r3.cpuregisters.wdtcon.unused5",  FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
  { &hf_r3_cpuregisters_wdtcon_unused6,  { "WDTCON.UNUSED6",  "r3.cpuregisters.wdtcon.unused6",  FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
  { &hf_r3_cpuregisters_wdtcon_unused7,  { "WDTCON.UNUSED7",  "r3.cpuregisters.wdtcon.unused7",  FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},

  { &hf_r3_dumpm41t81_reg00, { "REG 0x00", "r3.m41t81.reg00", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg01, { "REG 0x01", "r3.m41t81.reg01", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg02, { "REG 0x02", "r3.m41t81.reg02", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg03, { "REG 0x03", "r3.m41t81.reg03", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg04, { "REG 0x04", "r3.m41t81.reg04", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg05, { "REG 0x05", "r3.m41t81.reg05", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg06, { "REG 0x06", "r3.m41t81.reg06", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg07, { "REG 0x07", "r3.m41t81.reg07", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg08, { "REG 0x08", "r3.m41t81.reg08", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg09, { "REG 0x09", "r3.m41t81.reg09", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg0a, { "REG 0x0a", "r3.m41t81.reg0a", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg0b, { "REG 0x0b", "r3.m41t81.reg0b", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg0c, { "REG 0x0c", "r3.m41t81.reg0c", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg0d, { "REG 0x0d", "r3.m41t81.reg0d", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg0e, { "REG 0x0e", "r3.m41t81.reg0e", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg0f, { "REG 0x0f", "r3.m41t81.reg0f", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg10, { "REG 0x10", "r3.m41t81.reg10", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg11, { "REG 0x11", "r3.m41t81.reg11", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg12, { "REG 0x12", "r3.m41t81.reg12", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg13, { "REG 0x13", "r3.m41t81.reg13", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},

  { &hf_r3_dumpm41t81_reg00_sec1,       { ".1 Seconds",     "r3.m41t81.reg00.sec1",       FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg00_sec01,      { ".01 Seconds",    "r3.m41t81.reg00.sec01",      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg01_st,         { "ST",             "r3.m41t81.reg01.st",         FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg01_10sec,      { "10 Seconds",     "r3.m41t81.reg01.10sec",      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg01_1sec,       { "1 Seconds",      "r3.m41t81.reg01.1sec",       FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg02_notused,    { "(not used)",     "r3.m41t81.reg02.notused",    FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg02_10min,      { "10 Minutes",     "r3.m41t81.reg02.10min",      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg02_1min,       { "1 Minutes",      "r3.m41t81.reg02.1min",       FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg03_cbe,        { "CBE",            "r3.m41t81.reg03.cbe",        FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg03_cb,         { "CB",             "r3.m41t81.reg03.cb",         FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg03_10hour,     { "10 Hours",       "r3.m41t81.reg03.10hour",     FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg03_1hour,      { "1 Hours",        "r3.m41t81.reg03.1hour",      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg04_notused,    { "(not used)",     "r3.m41t81.reg04.notused",    FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg04_dow,        { "DOW",            "r3.m41t81.reg04.dow",        FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg05_notused,    { "(not used)",     "r3.m41t81.reg05.notused",    FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg05_10day,      { "10 Day",         "r3.m41t81.reg05.10day",      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg05_1day,       { "1 Day",          "r3.m41t81.reg05.1day",       FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg06_notused,    { "(not used)",     "r3.m41t81.reg06.notused",    FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg06_10month,    { "10 Month",       "r3.m41t81.reg06.10month",    FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg06_1month,     { "1 Month",        "r3.m41t81.reg06.1month",     FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg07_10year,     { "10 Year",        "r3.m41t81.reg07.10year",     FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg07_1year,      { "1 Year",         "r3.m41t81.reg07.1year",      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg08_out,        { "OUT",            "r3.m41t81.reg08.out",        FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg08_ft,         { "FT",             "r3.m41t81.reg08.ft",         FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg08_s,          { "S",              "r3.m41t81.reg08.s",          FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg08_cal,        { "CAL",            "r3.m41t81.reg08.cal",        FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg09_notused,    { "(not used)",     "r3.m41t81.reg09.notused",    FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg09_bmb,        { "BMB",            "r3.m41t81.reg09.bmb",        FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg09_rb,         { "RB",             "r3.m41t81.reg09.rb",         FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg0a_afe,        { "AFE",            "r3.m41t81.reg0a.afe",        FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg0a_sqwe,       { "SQWE",           "r3.m41t81.reg0a.sqwe",       FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg0a_abe,        { "ABE",            "r3.m41t81.reg0a.abe",        FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg0a_10monthalm, { "10 Month Alarm", "r3.m41t81.reg0a.10monthalm", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg0a_1monthalm,  { "1 Month Alarm",  "r3.m41t81.reg0a.1monthalm",  FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg0b_rpt5,       { "RPT5",           "r3.m41t81.reg0b.rpt5",       FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg0b_rpt4,       { "RPT4",           "r3.m41t81.reg0b.rpt4",       FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg0b_10dayalm,   { "10 Day Alarm",   "r3.m41t81.reg0b.10dayalm",   FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg0b_1dayalm,    { "1 Day Alarm",    "r3.m41t81.reg0b.1dayalm",    FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg0c_rpt3,       { "RPT3",           "r3.m41t81.reg0c.rpt3",       FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg0c_ht,         { "HT",             "r3.m41t81.reg0c.ht",         FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg0c_10houralm,  { "10 Hour Alarm",  "r3.m41t81.reg0c.10houralm",  FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg0c_1houralm,   { "1 Hour Alarm",   "r3.m41t81.reg0c.1houralm",   FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg0d_rpt2,       { "RPT2",           "r3.m41t81.reg0d.rpt2",       FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg0d_10minalm,   { "10 Min Alarm",   "r3.m41t81.reg0d.10minalm",   FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg0d_1minalm,    { "1 Min Alarm",    "r3.m41t81.reg0d.1minalm",    FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg0e_rpt1,       { "RPT1",           "r3.m41t81.reg0e.rpt1",       FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg0e_10secalm,   { "10 Sec Alarm",   "r3.m41t81.reg0e.10secalm",   FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg0e_1secalm,    { "1 Sec Alarm",    "r3.m41t81.reg0e.1secalm",    FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg0f_wdf,        { "WDF",            "r3.m41t81.reg0f.wdf",        FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg0f_af,         { "AF",             "r3.m41t81.reg0f.af",         FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg0f_notused,    { "(not used)",     "r3.m41t81.reg0f.notused",    FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg10_notused,    { "(not used)",     "r3.m41t81.reg10.notused",    FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg11_notused,    { "(not used)",     "r3.m41t81.reg11.notused",    FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg12_notused,    { "(not used)",     "r3.m41t81.reg12.notused",    FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg13_rs,         { "RS",             "r3.m41t81.reg13.rs",         FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_dumpm41t81_reg13_notused,    { "(not used)",     "r3.m41t81.reg13.notused",    FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},

  { &hf_r3_debuglog_recordnumber, { "Record Number", "r3.debuglog.recordnumber", FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_debuglog_flags,        { "Flags",         "r3.debuglog.flags",        FT_UINT32, BASE_HEX,     NULL, 0x0, NULL, HFILL }},
  { &hf_r3_debuglog_tick,         { "Tick",          "r3.debuglog.tick",         FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},

  { &hf_r3_adduserparamtype,                                          { "Upstream Field",     "r3.manageuser",                  FT_NONE,    BASE_NONE,    NULL, 0x0, NULL, HFILL }},
  { &hf_r3_adduserparamtypelength,                                    { "Field Length",       "r3.manageuser.length",           FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_adduserparamtypetype,                                      { "Field Type",         "r3.manageuser.type",             FT_UINT8,   BASE_DEC_HEX, VALS (r3_adduserparamtypenames), 0x0, NULL, HFILL }},
  { &hf_r3_adduserparamtypedatalen,                                   { "Data Length",        "r3.manageuser.datalen",          FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_adduserparamtypeerror,                                     { "Error",              "r3.manageuser.error",            FT_STRING,  BASE_NONE,    NULL, 0x0, NULL, HFILL }},
  { &hf_r3_adduserparamtypearray [ADDUSERPARAMTYPE_DISPOSITION],      { "Disposition",        "r3.manageuser.disposition",      FT_UINT8,   BASE_DEC_HEX, VALS (r3_dispositionnames), 0x0, NULL, HFILL }},
  { &hf_r3_adduserparamtypearray [ADDUSERPARAMTYPE_USERNO],           { "User Number",        "r3.manageuser.usernumber",       FT_UINT16,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_adduserparamtypearray [ADDUSERPARAMTYPE_ACCESSALWAYS],     { "Access Always",      "r3.manageuser.accessalways",     FT_BOOLEAN, BASE_NONE,    NULL, 0x0, NULL, HFILL }},
  { &hf_r3_adduserparamtypearray [ADDUSERPARAMTYPE_ACCESSMODE],       { "Access Mode",        "r3.manageuser.accessmode",       FT_UINT8,   BASE_DEC_HEX, VALS (r3_accessmodenames), 0x0, NULL, HFILL }},
  { &hf_r3_adduserparamtypearray [ADDUSERPARAMTYPE_CACHED],           { "Cached",             "r3.manageuser.cached",           FT_BOOLEAN, BASE_NONE,    NULL, 0x0, NULL, HFILL }},
  { &hf_r3_adduserparamtypearray [ADDUSERPARAMTYPE_USERTYPE],         { "User Type",          "r3.manageuser.usertype",         FT_UINT8,   BASE_DEC_HEX, VALS (r3_usertypenames), 0x0, NULL, HFILL }},
  { &hf_r3_adduserparamtypearray [ADDUSERPARAMTYPE_PRIMARYFIELD],     { "Primary Field",      "r3.manageuser.primaryfield",     FT_BYTES,   BASE_NONE,    NULL, 0x0, NULL, HFILL }},
  { &hf_r3_adduserparamtypearray [ADDUSERPARAMTYPE_PRIMARYFIELDTYPE], { "Primary Field Type", "r3.manageuser.primaryfieldtype", FT_UINT8,   BASE_DEC_HEX, VALS (r3_ppmisourcenames), 0x0, NULL, HFILL }},
  { &hf_r3_adduserparamtypearray [ADDUSERPARAMTYPE_AUXFIELD],         { "Aux Field",          "r3.manageuser.auxfield",         FT_BYTES,   BASE_NONE,    NULL, 0x0, NULL, HFILL }},
  { &hf_r3_adduserparamtypearray [ADDUSERPARAMTYPE_AUXFIELDTYPE],     { "Aux Field Type",     "r3.manageuser.auxfieldtype",     FT_UINT8,   BASE_DEC_HEX, VALS (r3_ppmisourcenames), 0x0, NULL, HFILL }},
  { &hf_r3_adduserparamtypearray [ADDUSERPARAMTYPE_USECOUNT],         { "Use Count",          "r3.manageuser.usecount",         FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_adduserparamtypearray [ADDUSERPARAMTYPE_EXCEPTIONGROUP],   { "Exception Group",    "r3.manageuser.exceptiongroup",   FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
  { &hf_r3_adduserparamtypearray [ADDUSERPARAMTYPE_EXPIREON],         { "Expire On",          "r3.manageuser.expireon",         FT_UINT24,  BASE_HEX,     NULL, 0x0, NULL, HFILL }},
  { &hf_r3_adduserparamtypearray [ADDUSERPARAMTYPE_TIMEZONE],         { "Timezone",           "r3.manageuser.timezone",         FT_UINT32,  BASE_HEX,     NULL, 0x0, NULL, HFILL }}
};

typedef struct dissectorParser_s
{
  cmdCommand_e command;
  void (*dissector) (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *r3_tree);
}
dissectorParser_t;

/*
 *  Dissectors for each command
 */
static void dissect_r3_cmd_response (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmd_handshake (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmd_killsession (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmd_queryserialnumber (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmd_queryversion (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmd_setdatetime (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmd_querydatetime (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmd_setconfig (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmd_getconfig (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmd_manageuser (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmd_deleteusers (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmd_defineexception (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmd_defineexceptiongroup (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmd_definecalendar (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmd_definetimezone (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmd_rmtauthretry (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmd_filters (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmd_alarmconfigure (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmd_eventlogdump (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmd_declinedlogdump (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmd_alarmlogdump (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmd_downloadfirmware (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmd_downloadfirmwaretimeout (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmd_powertableselection (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmd_clearnvram (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmd_dpac (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmd_selftest (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmd_reset (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmd_logwrite (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmd_mfgcommand (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmd_nvrambackup (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmd_extendedresponse (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);

static dissectorParser_t r3command_dissect [] =
{
  { CMD_RESPONSE,                  dissect_r3_cmd_response },
  { CMD_HANDSHAKE,                 dissect_r3_cmd_handshake },
  { CMD_KILLSESSION,               dissect_r3_cmd_killsession },
  { CMD_QUERYSERIALNUMBER,         dissect_r3_cmd_queryserialnumber },
  { CMD_QUERYVERSION,              dissect_r3_cmd_queryversion },
  { CMD_SETDATETIME,               dissect_r3_cmd_setdatetime },
  { CMD_QUERYDATETIME,             dissect_r3_cmd_querydatetime },
  { CMD_SETCONFIG,                 dissect_r3_cmd_setconfig },
  { CMD_GETCONFIG,                 dissect_r3_cmd_getconfig },
  { CMD_MANAGEUSER,                dissect_r3_cmd_manageuser },
  { CMD_DELETEUSERS,               dissect_r3_cmd_deleteusers },
  { CMD_DEFINEEXCEPTION,           dissect_r3_cmd_defineexception },
  { CMD_DEFINEEXCEPTIONGROUP,      dissect_r3_cmd_defineexceptiongroup },
  { CMD_DEFINECALENDAR,            dissect_r3_cmd_definecalendar },
  { CMD_DEFINETIMEZONE,            dissect_r3_cmd_definetimezone },
  { CMD_RMTAUTHRETRY,              dissect_r3_cmd_rmtauthretry },
  { CMD_FILTERS,                   dissect_r3_cmd_filters },
  { CMD_ALARMCONFIGURE,            dissect_r3_cmd_alarmconfigure },
  { CMD_EVENTLOGDUMP,              dissect_r3_cmd_eventlogdump },
  { CMD_DECLINEDLOGDUMP,           dissect_r3_cmd_declinedlogdump },
  { CMD_ALARMLOGDUMP,              dissect_r3_cmd_alarmlogdump },
  { CMD_DOWNLOADFIRMWARE,          dissect_r3_cmd_downloadfirmware },
  { CMD_DOWNLOADFIRMWARETIMEOUT,   dissect_r3_cmd_downloadfirmwaretimeout },
  { CMD_POWERTABLESELECTION,       dissect_r3_cmd_powertableselection },
  { CMD_CLEARNVRAM,                dissect_r3_cmd_clearnvram },
  { CMD_DPAC,                      dissect_r3_cmd_dpac },
  { CMD_SELFTEST,                  dissect_r3_cmd_selftest },
  { CMD_RESET,                     dissect_r3_cmd_reset },
  { CMD_LOGWRITE,                  dissect_r3_cmd_logwrite },
  { CMD_MFGCOMMAND,                dissect_r3_cmd_mfgcommand },
  { CMD_NVRAMBACKUP,               dissect_r3_cmd_nvrambackup },
  { CMD_EXTENDEDRESPONSE,          dissect_r3_cmd_extendedresponse }
};

static void dissect_r3_cmdmfg_setserialnumber (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmdmfg_setcryptkey (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmdmfg_dumpnvram (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmdmfg_terminal (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmdmfg_remoteunlock (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmdmfg_auxctlrversion (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmdmfg_iopins (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmdmfg_adcs (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmdmfg_hardwareid (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmdmfg_checkpointlogdump (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmdmfg_checkpointlogclear (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmdmfg_readregisters (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmdmfg_forceoptions (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmdmfg_commuser (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmdmfg_dumpkeypad (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmdmfg_batterycheck (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmdmfg_ramrefresh (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmdmfg_taskflags (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmdmfg_timerchain (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmdmfg_peekpoke (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmdmfg_lockstate (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmdmfg_capabilities (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmdmfg_dumpm41t81 (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmdmfg_debuglogdump (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmdmfg_debuglogclear (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmdmfg_testwdt (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmdmfg_querycksum (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmdmfg_validatechecksums (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmdmfg_rebuildlrucache (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmdmfg_tzupdate (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmdmfg_testpreserve (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmdmfg_mortisestatelogdump (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmdmfg_mortisestatelogclear (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmdmfg_mortisepins (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_cmdmfg_haltandcatchfire (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);

static dissectorParser_t r3commandmfg_dissect [] =
{
  { CMDMFG_SETSERIALNUMBER,       dissect_r3_cmdmfg_setserialnumber },
  { CMDMFG_SETCRYPTKEY,           dissect_r3_cmdmfg_setcryptkey },
  { CMDMFG_DUMPNVRAM,             dissect_r3_cmdmfg_dumpnvram },
  { CMDMFG_TERMINAL,              dissect_r3_cmdmfg_terminal },
  { CMDMFG_REMOTEUNLOCK,          dissect_r3_cmdmfg_remoteunlock },
  { CMDMFG_AUXCTLRVERSION,        dissect_r3_cmdmfg_auxctlrversion },
  { CMDMFG_IOPINS,                dissect_r3_cmdmfg_iopins },
  { CMDMFG_ADCS,                  dissect_r3_cmdmfg_adcs },
  { CMDMFG_HARDWAREID,            dissect_r3_cmdmfg_hardwareid },
  { CMDMFG_CHECKPOINTLOGDUMP,     dissect_r3_cmdmfg_checkpointlogdump },
  { CMDMFG_CHECKPOINTLOGCLEAR,    dissect_r3_cmdmfg_checkpointlogclear },
  { CMDMFG_READREGISTERS,         dissect_r3_cmdmfg_readregisters },
  { CMDMFG_FORCEOPTIONS,          dissect_r3_cmdmfg_forceoptions },
  { CMDMFG_COMMUSER,              dissect_r3_cmdmfg_commuser },
  { CMDMFG_DUMPKEYPAD,            dissect_r3_cmdmfg_dumpkeypad },
  { CMDMFG_BATTERYCHECK,          dissect_r3_cmdmfg_batterycheck },
  { CMDMFG_RAMREFRESH,            dissect_r3_cmdmfg_ramrefresh },
  { CMDMFG_TASKFLAGS,             dissect_r3_cmdmfg_taskflags },
  { CMDMFG_TIMERCHAIN,            dissect_r3_cmdmfg_timerchain },
  { CMDMFG_PEEKPOKE,              dissect_r3_cmdmfg_peekpoke },
  { CMDMFG_LOCKSTATE,             dissect_r3_cmdmfg_lockstate },
  { CMDMFG_CAPABILITIES,          dissect_r3_cmdmfg_capabilities },
  { CMDMFG_DUMPM41T81,            dissect_r3_cmdmfg_dumpm41t81 },
  { CMDMFG_DEBUGLOGDUMP,          dissect_r3_cmdmfg_debuglogdump },
  { CMDMFG_DEBUGLOGCLEAR,         dissect_r3_cmdmfg_debuglogclear },
  { CMDMFG_TESTWDT,               dissect_r3_cmdmfg_testwdt },
  { CMDMFG_QUERYCKSUM,            dissect_r3_cmdmfg_querycksum },
  { CMDMFG_VALIDATECHECKSUMS,     dissect_r3_cmdmfg_validatechecksums },
  { CMDMFG_REBUILDLRUCACHE,       dissect_r3_cmdmfg_rebuildlrucache },
  { CMDMFG_TZUPDATE,              dissect_r3_cmdmfg_tzupdate },
  { CMDMFG_TESTPRESERVE,          dissect_r3_cmdmfg_testpreserve },
  { CMDMFG_MORTISESTATELOGDUMP,   dissect_r3_cmdmfg_mortisestatelogdump },
  { CMDMFG_MORTISESTATELOGCLEAR,  dissect_r3_cmdmfg_mortisestatelogclear },
  { CMDMFG_MORTISEPINS,           dissect_r3_cmdmfg_mortisepins },
  { CMDMFG_HALTANDCATCHFIRE,      dissect_r3_cmdmfg_haltandcatchfire }
};

static void dissect_r3_response_singlebyte (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_response_hasdata (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);

static dissectorParser_t r3response_dissect [] = 
{
  { RESPONSETYPE_OK,                  dissect_r3_response_singlebyte },
  { RESPONSETYPE_ERROR,               dissect_r3_response_singlebyte },
  { RESPONSETYPE_HASDATA,             dissect_r3_response_hasdata },
  { RESPONSETYPE_NOHANDLER,           dissect_r3_response_singlebyte },
  { RESPONSETYPE_NOSESSION,           dissect_r3_response_singlebyte },
  { RESPONSETYPE_BADCOMMAND,          dissect_r3_response_singlebyte },
  { RESPONSETYPE_BADPARAMETER,        dissect_r3_response_singlebyte },
  { RESPONSETYPE_BADPARAMETERLEN,     dissect_r3_response_singlebyte },
  { RESPONSETYPE_MISSINGPARAMETER,    dissect_r3_response_singlebyte },
  { RESPONSETYPE_DUPLICATEPARAMETER,  dissect_r3_response_singlebyte },
  { RESPONSETYPE_PARAMETERCONFLICT,   dissect_r3_response_singlebyte },
  { RESPONSETYPE_BADDEVICE,           dissect_r3_response_singlebyte },
  { RESPONSETYPE_NVRAMERROR,          dissect_r3_response_singlebyte },
  { RESPONSETYPE_NVRAMERRORNOACK,     dissect_r3_response_singlebyte },
  { RESPONSETYPE_NVRAMERRORNOACK32,   dissect_r3_response_singlebyte },
  { RESPONSETYPE_NOTI2CADDRESS,       dissect_r3_response_singlebyte },
  { RESPONSETYPE_FIRMWAREERROR,       dissect_r3_response_singlebyte },
  { RESPONSETYPE_DUMPINPROGRESS,      dissect_r3_response_singlebyte },
  { RESPONSETYPE_INTERNALERROR,       dissect_r3_response_singlebyte },
  { RESPONSETYPE_NOTIMPLEMENTED,      dissect_r3_response_singlebyte },
  { RESPONSETYPE_PINFORMATERROR,      dissect_r3_response_singlebyte },
  { RESPONSETYPE_PINEXISTS,           dissect_r3_response_singlebyte },
  { RESPONSETYPE_PINNOTFOUND,         dissect_r3_response_singlebyte },
  { RESPONSETYPE_USERACTIVE,          dissect_r3_response_singlebyte },
  { RESPONSETYPE_USERINACTIVE,        dissect_r3_response_singlebyte },
  { RESPONSETYPE_PARENTNOTFOUND,      dissect_r3_response_singlebyte },
  { RESPONSETYPE_NOCHAIN,             dissect_r3_response_singlebyte },
  { RESPONSETYPE_CAUGHTINLOOP,        dissect_r3_response_singlebyte },
  { RESPONSETYPE_EVENTFILTERED,       dissect_r3_response_singlebyte },
  { RESPONSETYPE_PAYLOADTOOLARGE,     dissect_r3_response_singlebyte },
  { RESPONSETYPE_ENDOFDATA,           dissect_r3_response_singlebyte },
  { RESPONSETYPE_RMTAUTHREJECTED,     dissect_r3_response_singlebyte },
  { RESPONSETYPE_NVRAMVERSIONERROR,   dissect_r3_response_singlebyte },
  { RESPONSETYPE_NOHARDWARE,          dissect_r3_response_singlebyte },
  { RESPONSETYPE_SCHEDULERCONFLICT,   dissect_r3_response_singlebyte },
  { RESPONSETYPE_NVRAMWRITEERROR,     dissect_r3_response_singlebyte },
  { RESPONSETYPE_DECLINEDFILTERED,    dissect_r3_response_singlebyte },
  { RESPONSETYPE_NECONFIGPARM,        dissect_r3_response_singlebyte },
  { RESPONSETYPE_FLASHERASEERROR,     dissect_r3_response_singlebyte },
  { RESPONSETYPE_FLASHWRITEERROR,     dissect_r3_response_singlebyte },
  { RESPONSETYPE_BADNVBACKUP,         dissect_r3_response_singlebyte },
  { RESPONSETYPE_EARLYACK,            dissect_r3_response_singlebyte },
  { RESPONSETYPE_ALARMFILTERED,       dissect_r3_response_singlebyte },
  { RESPONSETYPE_ACVFAILURE,          dissect_r3_response_singlebyte },
  { RESPONSETYPE_USERCHECKSUMERROR,   dissect_r3_response_singlebyte },
  { RESPONSETYPE_CHECKSUMERROR,       dissect_r3_response_singlebyte },
  { RESPONSETYPE_RTCSQWFAILURE,       dissect_r3_response_singlebyte },
  { RESPONSETYPE_PRIORITYSHUTDOWN,    dissect_r3_response_singlebyte },
  { RESPONSETYPE_NOTMODIFIABLE,       dissect_r3_response_singlebyte },
  { RESPONSETYPE_CANTPRESERVE,        dissect_r3_response_singlebyte },
  { RESPONSETYPE_INPASSAGEMODE,       dissect_r3_response_singlebyte }
};

static void dissect_r3_upstreamcommand_reserved (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_upstreamcommand_debugmsg (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_upstreamcommand_queryversion (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_upstreamcommand_querydatetime (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_upstreamcommand_queryserialnumber (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_upstreamcommand_dumpeventlog (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_upstreamcommand_dumpnvram (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_upstreamcommand_rmtquthrequest (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_upstreamcommand_retrieveuser (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_upstreamcommand_queryconfig (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_upstreamcommand_rmteventlogrecord (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_upstreamcommand_dpac (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_upstreamcommand_notify (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_upstreamcommand_mfg (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_upstreamcommand_eventlogwarning (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_upstreamcommand_dumpnvramrle (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_upstreamcommand_rmtdeclinedrecord (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_upstreamcommand_declinedwarning (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_upstreamcommand_dumpdeclinedlog (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_upstreamcommand_rmtalarmrecord (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_upstreamcommand_alarmwarning (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_upstreamcommand_dumpalarmlog (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_upstreamcommand_connectscheduler (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_upstreamcommand_connectcommuser (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_upstreamcommand_commandalarm (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_upstreamcommand_dumpdebuglog (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);

static dissectorParser_t r3upstreamcommand_dissect [] = 
{
  { UPSTREAMCOMMAND_RESERVED,           dissect_r3_upstreamcommand_reserved }, 
  { UPSTREAMCOMMAND_DEBUGMSG,           dissect_r3_upstreamcommand_debugmsg }, 
  { UPSTREAMCOMMAND_QUERYVERSION,       dissect_r3_upstreamcommand_queryversion }, 
  { UPSTREAMCOMMAND_QUERYDATETIME,      dissect_r3_upstreamcommand_querydatetime }, 
  { UPSTREAMCOMMAND_QUERYSERIALNUMBER,  dissect_r3_upstreamcommand_queryserialnumber }, 
  { UPSTREAMCOMMAND_DUMPEVENTLOG,       dissect_r3_upstreamcommand_dumpeventlog }, 
  { UPSTREAMCOMMAND_DUMPNVRAM,          dissect_r3_upstreamcommand_dumpnvram }, 
  { UPSTREAMCOMMAND_RMTAUTHREQUEST,     dissect_r3_upstreamcommand_rmtquthrequest }, 
  { UPSTREAMCOMMAND_RETRIEVEUSER,       dissect_r3_upstreamcommand_retrieveuser }, 
  { UPSTREAMCOMMAND_QUERYCONFIG,        dissect_r3_upstreamcommand_queryconfig }, 
  { UPSTREAMCOMMAND_RMTEVENTLOGRECORD,  dissect_r3_upstreamcommand_rmteventlogrecord }, 
  { UPSTREAMCOMMAND_DPAC,               dissect_r3_upstreamcommand_dpac }, 
  { UPSTREAMCOMMAND_NOTIFY,             dissect_r3_upstreamcommand_notify }, 
  { UPSTREAMCOMMAND_MFG,                dissect_r3_upstreamcommand_mfg }, 
  { UPSTREAMCOMMAND_EVENTLOGWARNING,    dissect_r3_upstreamcommand_eventlogwarning }, 
  { UPSTREAMCOMMAND_DUMPNVRAMRLE,       dissect_r3_upstreamcommand_dumpnvramrle }, 
  { UPSTREAMCOMMAND_RMTDECLINEDRECORD,  dissect_r3_upstreamcommand_rmtdeclinedrecord }, 
  { UPSTREAMCOMMAND_DECLINEDWARNING,    dissect_r3_upstreamcommand_declinedwarning }, 
  { UPSTREAMCOMMAND_DUMPDECLINEDLOG,    dissect_r3_upstreamcommand_dumpdeclinedlog }, 
  { UPSTREAMCOMMAND_RMTALARMRECORD,     dissect_r3_upstreamcommand_rmtalarmrecord }, 
  { UPSTREAMCOMMAND_ALARMWARNING,       dissect_r3_upstreamcommand_alarmwarning }, 
  { UPSTREAMCOMMAND_DUMPALARMLOG,       dissect_r3_upstreamcommand_dumpalarmlog }, 
  { UPSTREAMCOMMAND_CONNECTSCHEDULER,   dissect_r3_upstreamcommand_connectscheduler }, 
  { UPSTREAMCOMMAND_CONNECTCOMMUSER,    dissect_r3_upstreamcommand_connectcommuser }, 
  { UPSTREAMCOMMAND_CONNECTALARM,       dissect_r3_upstreamcommand_commandalarm }, 
  { UPSTREAMCOMMAND_DUMPDEBUGLOG,       dissect_r3_upstreamcommand_dumpdebuglog }
};

static void dissect_r3_upstreammfgfield_iopins (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
static void dissect_r3_upstreammfgfield_adcs (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree); 
static void dissect_r3_upstreammfgfield_hardwareid (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree); 
static void dissect_r3_upstreammfgfield_checkpointlog (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree); 
static void dissect_r3_upstreammfgfield_cpuregisters (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree); 
static void dissect_r3_upstreammfgfield_taskflags (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree); 
static void dissect_r3_upstreammfgfield_timerchain (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree); 
static void dissect_r3_upstreammfgfield_peekpoke (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree); 
static void dissect_r3_upstreammfgfield_lockstate (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree); 
static void dissect_r3_upstreammfgfield_capabilities (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree); 
static void dissect_r3_upstreammfgfield_dumpm41t81 (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree); 
static void dissect_r3_upstreammfgfield_nvramchecksumvalue (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree); 
static void dissect_r3_upstreammfgfield_checksumresults (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree); 
static void dissect_r3_upstreammfgfield_mortisestatelog (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree); 
static void dissect_r3_upstreammfgfield_mortisepins (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree); 
static void dissect_r3_upstreammfgfield_keypadchar (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree); 
static void dissect_r3_upstreammfgfield_magcard (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree); 
static void dissect_r3_upstreammfgfield_proxcard (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree); 

static dissectorParser_t r3upstreammfgfield_dissect [] = 
{
  { MFGFIELD_IOPINS,              dissect_r3_upstreammfgfield_iopins },
  { MFGFIELD_ADCS,                dissect_r3_upstreammfgfield_adcs }, 
  { MFGFIELD_HARDWAREID,          dissect_r3_upstreammfgfield_hardwareid }, 
  { MFGFIELD_CHECKPOINTLOG,       dissect_r3_upstreammfgfield_checkpointlog }, 
  { MFGFIELD_CPUREGISTERS,        dissect_r3_upstreammfgfield_cpuregisters }, 
  { MFGFIELD_TASKFLAGS,           dissect_r3_upstreammfgfield_taskflags }, 
  { MFGFIELD_TIMERCHAIN,          dissect_r3_upstreammfgfield_timerchain }, 
  { MFGFIELD_PEEKPOKE,            dissect_r3_upstreammfgfield_peekpoke }, 
  { MFGFIELD_LOCKSTATE,           dissect_r3_upstreammfgfield_lockstate }, 
  { MFGFIELD_CAPABILITIES,        dissect_r3_upstreammfgfield_capabilities }, 
  { MFGFIELD_DUMPM41T81,          dissect_r3_upstreammfgfield_dumpm41t81 }, 
  { MFGFIELD_NVRAMCHECKSUMVALUE,  dissect_r3_upstreammfgfield_nvramchecksumvalue }, 
  { MFGFIELD_CHECKSUMRESULTS,     dissect_r3_upstreammfgfield_checksumresults }, 
  { MFGFIELD_MORTISESTATELOG,     dissect_r3_upstreammfgfield_mortisestatelog }, 
  { MFGFIELD_MORTISEPINS,         dissect_r3_upstreammfgfield_mortisepins }, 
  { MFGFIELD_KEYPADCHAR,          dissect_r3_upstreammfgfield_keypadchar }, 
  { MFGFIELD_MAGCARD,             dissect_r3_upstreammfgfield_magcard }, 
  { MFGFIELD_PROXCARD,            dissect_r3_upstreammfgfield_proxcard }
};

/*
 * ***************************************************************************
 *  
 *  Cannot use epan/crc routines as ccitt-x25 uses a starting value of 0xffff
 *  and we use 0x0000 (legacy compatibility).  If an override method to set
 *  the starting value existed, these could be replaced.
 */
static const guint16 ccitt_16 [256] =
{
  0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
  0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
  0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
  0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
  0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
  0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
  0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
  0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
  0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
  0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
  0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
  0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
  0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
  0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
  0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
  0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
  0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
  0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
  0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
  0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
  0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
  0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
  0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
  0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
  0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
  0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
  0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
  0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
  0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
  0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
  0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
  0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
};

static guint16 utilCrcCalculate (const void *ptr, guint16 len, guint16 crc)
{
  const guint8 *p = (guint8 *) ptr;

  while (len--)
    crc = (guint16) ((crc << 8) ^ ccitt_16 [(crc >> 8) ^ *p++]);

  return crc;
}

/*
 * ***************************************************************************
 */
static void dissect_serialnumber (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree, int hf_index)
{
  proto_item *sn_item = NULL;
  proto_tree *sn_tree = NULL;
  const gchar *s = NULL;

  tvb_ensure_bytes_exist (tvb, start_offset, 16);

  sn_item = proto_tree_add_item (tree, hf_index, tvb, start_offset, 16, TRUE);
  sn_tree = proto_item_add_subtree (sn_item, ett_r3serialnumber);

  s = tvb_get_ephemeral_string (tvb, start_offset +  0, 2);
  proto_tree_add_text (sn_tree, tvb, start_offset +  0, 2, "Manufacturer .. : %s (%s)", s, str_to_str (s, r3_snmanufacturernames, "[Unknown]"));
  s = tvb_get_ephemeral_string (tvb, start_offset +  2, 1);
  proto_tree_add_text (sn_tree, tvb, start_offset +  2, 1, "Year .......... : %s (%s)", s, str_to_str (s, r3_snyearnames, "[Unknown]"));
  s = tvb_get_ephemeral_string (tvb, start_offset +  3, 2);
  proto_tree_add_text (sn_tree, tvb, start_offset +  3, 2, "Week .......... : %s",      s);
  s = tvb_get_ephemeral_string (tvb, start_offset +  5, 1);
  proto_tree_add_text (sn_tree, tvb, start_offset +  5, 1, "Model ......... : %s (%s)", s, str_to_str (s, r3_snmodelnames, "[Unknown]"));
  s = tvb_get_ephemeral_string (tvb, start_offset +  6, 4);
  proto_tree_add_text (sn_tree, tvb, start_offset +  6, 4, "Sequence ...... : %s",      s);
  s = tvb_get_ephemeral_string (tvb, start_offset + 10, 1);
  proto_tree_add_text (sn_tree, tvb, start_offset + 10, 1, "Group ......... : %s (%s)", s, str_to_str (s, r3_sngroupnames, "[Unknown]"));
  s = tvb_get_ephemeral_string (tvb, start_offset + 11, 1);
  proto_tree_add_text (sn_tree, tvb, start_offset + 11, 1, "NID ........... : %s (%s)", s, str_to_str (s, r3_snnidnames, "[Unknown]"));
  s = tvb_get_ephemeral_string (tvb, start_offset + 12, 2);
  proto_tree_add_text (sn_tree, tvb, start_offset + 12, 2, "HID ........... : %s (%s)", s, str_to_str (s, r3_snhidnames, "[Unknown]"));
  s = tvb_get_ephemeral_string (tvb, start_offset + 14, 1);
  proto_tree_add_text (sn_tree, tvb, start_offset + 14, 1, "Power Supply .. : %s (%s)", s, str_to_str (s, r3_snpowersupplynames, "[Unknown]"));
  s = tvb_get_ephemeral_string (tvb, start_offset + 15, 1);
  proto_tree_add_text (sn_tree, tvb, start_offset + 15, 1, "Mortise ....... : %s (%s)", s, str_to_str (s, r3_snmortisenames, "[Unknown]"));
}

/*
 * ***************************************************************************
 *
 * We've already ensured we have enough bytes in the table via tvb_ensure_bytes_exist()
 *
 */
static void dissect_r3_upstreamfields (tvbuff_t *tvb, guint32 start_offset _U_, guint32 length, packet_info *pinfo, proto_tree *tree)
{
  guint32 offset = 0;

  while (offset < tvb_reported_length (tvb))
  {
    guint32 fieldLength = tvb_get_guint8 (tvb, offset + 0);
    guint32 fieldType = tvb_get_guint8 (tvb, offset + 1);
    guint32 dataLength = fieldLength - 2;
    proto_item *upstreamfield_item = NULL;
    proto_tree *upstreamfield_tree = NULL;
    const gchar *usfn = NULL;

    usfn = val_to_str_const (fieldType, r3_upstreamfieldnames, "[Unknown Field]");

    upstreamfield_item = proto_tree_add_none_format (tree, hf_r3_upstreamfield, tvb, offset + 0, fieldLength, "Upstream Field: %s (%u)", usfn, fieldType);
    upstreamfield_tree = proto_item_add_subtree (upstreamfield_item, ett_r3upstreamfield);

    proto_tree_add_item (upstreamfield_tree, hf_r3_upstreamfieldlength, tvb, offset + 0, 1, TRUE);
    proto_tree_add_item (upstreamfield_tree, hf_r3_upstreamfieldtype, tvb, offset + 1, 1, TRUE);

    offset += 2;

    switch (fieldType)
    {
      /*
       *  Strings, booleans, 8 & 16 bit values
       */
      case UPSTREAMFIELD_NOTUSED :
      case UPSTREAMFIELD_PIN :
      case UPSTREAMFIELD_VERSION :
      case UPSTREAMFIELD_PRIMARYPIN :
      case UPSTREAMFIELD_AUXPIN :
      case UPSTREAMFIELD_AUXCTLRVERSION :
      case UPSTREAMFIELD_ACCESSALWAYS :
      case UPSTREAMFIELD_CACHED :
      case UPSTREAMFIELD_ENTRYDEVICE :
      case UPSTREAMFIELD_PPMIFIELDTYPE :
      case UPSTREAMFIELD_RESPONSEWINDOW :
      case UPSTREAMFIELD_USERTYPE :
      case UPSTREAMFIELD_PRIMARYFIELDTYPE :
      case UPSTREAMFIELD_AUXFIELDTYPE :
      case UPSTREAMFIELD_ACCESSMODE :
      case UPSTREAMFIELD_USECOUNT :
      case UPSTREAMFIELD_EXCEPTIONGROUP :
      case UPSTREAMFIELD_NAR :
      case UPSTREAMFIELD_SEQUENCENUMBER :
      case UPSTREAMFIELD_USERNUMBER :
      case UPSTREAMFIELD_EVENTLOGRECORDCOUNT :
      case UPSTREAMFIELD_DECLINEDRECORDCOUNT :
      case UPSTREAMFIELD_ALARMRECORDCOUNT :
        proto_tree_add_item (upstreamfield_tree, hf_r3_upstreamfieldarray [fieldType], tvb, offset, dataLength, TRUE);
        break;

      /*
       *  Special types
       */
      case UPSTREAMFIELD_SERIALNUMBER :
        {
          tvbuff_t *sn_tvb = tvb_new_subset (tvb, offset, dataLength, dataLength);

          dissect_serialnumber (sn_tvb, 0, length, pinfo, upstreamfield_tree, hf_r3_upstreamfieldarray [fieldType]);
        }
        break;

      case UPSTREAMFIELD_EVENTLOGRECORD :
        {
          proto_item *eventlog_item = NULL;
          proto_tree *eventlog_tree = NULL;

          if (dataLength != 9)
            expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "Malformed event log field -- expected 9 octets");
          else
          {
            eventlog_item = proto_tree_add_text (upstreamfield_tree, tvb, offset, 9, "Event Log Record");
            eventlog_tree = proto_item_add_subtree (eventlog_item, ett_r3eventlogrecord);

            proto_tree_add_item (eventlog_tree, hf_r3_eventlog_year, tvb, offset + 0, 1, TRUE);
            proto_tree_add_item (eventlog_tree, hf_r3_eventlog_month, tvb, offset + 1, 1, TRUE);
            proto_tree_add_item (eventlog_tree, hf_r3_eventlog_day, tvb, offset + 2, 1, TRUE);
            proto_tree_add_item (eventlog_tree, hf_r3_eventlog_hour, tvb, offset + 3, 1, TRUE);
            proto_tree_add_item (eventlog_tree, hf_r3_eventlog_minute, tvb, offset + 4, 1, TRUE);
            proto_tree_add_item (eventlog_tree, hf_r3_eventlog_second, tvb, offset + 5, 1, TRUE);
            proto_tree_add_item (eventlog_tree, hf_r3_eventlog_usernumber, tvb, offset + 6, 2, TRUE);
            proto_tree_add_item (eventlog_tree, hf_r3_eventlog_event, tvb, offset + 8, 1, TRUE);
          }
        }
        break;

      case UPSTREAMFIELD_DATETIME :
        {
          proto_item *datetime_item = NULL;
          proto_tree *datetime_tree = NULL;

          if (dataLength != 8)
            expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "Malformed date/time field -- expected 8 octets");
          else
          {
            datetime_item = proto_tree_add_text (upstreamfield_tree, tvb, offset, 8, "Date/Time: %02u/%02u/%02u-%u %02u:%02u:%02u %u",
                tvb_get_guint8 (tvb, offset + 0), tvb_get_guint8 (tvb, offset + 1), tvb_get_guint8 (tvb, offset + 2), tvb_get_guint8 (tvb, offset + 3),
                tvb_get_guint8 (tvb, offset + 4), tvb_get_guint8 (tvb, offset + 5), tvb_get_guint8 (tvb, offset + 6), tvb_get_guint8 (tvb, offset + 7));
            datetime_tree = proto_item_add_subtree (datetime_item, ett_r3datetime);

            proto_tree_add_item (datetime_tree, hf_r3_datetime_year, tvb, offset + 0, 1, TRUE);
            proto_tree_add_item (datetime_tree, hf_r3_datetime_month, tvb, offset + 1, 1, TRUE);
            proto_tree_add_item (datetime_tree, hf_r3_datetime_day, tvb, offset + 2, 1, TRUE);
            proto_tree_add_item (datetime_tree, hf_r3_datetime_dow, tvb, offset + 3, 1, TRUE);
            proto_tree_add_item (datetime_tree, hf_r3_datetime_hours, tvb, offset + 4, 1, TRUE);
            proto_tree_add_item (datetime_tree, hf_r3_datetime_minutes, tvb, offset + 5, 1, TRUE);
            proto_tree_add_item (datetime_tree, hf_r3_datetime_seconds, tvb, offset + 6, 1, TRUE);
            proto_tree_add_item (datetime_tree, hf_r3_datetime_dst, tvb, offset + 7, 1, TRUE);
          }
        }
        break;

      case UPSTREAMFIELD_DECLINEDRECORD :
        {
          proto_item *declinedlog_item = NULL;
          proto_tree *declinedlog_tree = NULL;
          guint8 cred1type = 0;
          guint8 cred2type = 0;

          if (dataLength != 49)
            expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "Malformed declined log field -- expected 49 octets");
          else
          {
            declinedlog_item = proto_tree_add_text (upstreamfield_tree, tvb, offset, 49, "Declined Log Record");
            declinedlog_tree = proto_item_add_subtree (declinedlog_item, ett_r3declinedlogrecord);

            proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_year, tvb, offset + 0, 1, TRUE);
            proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_month, tvb, offset + 1, 1, TRUE);
            proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_day, tvb, offset + 2, 1, TRUE);
            proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_hour, tvb, offset + 3, 1, TRUE);
            proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_minute, tvb, offset + 4, 1, TRUE);
            proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_second, tvb, offset + 5, 1, TRUE);
            proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_usernumber, tvb, offset + 6, 2, TRUE);

            cred1type = tvb_get_guint8 (tvb, offset + 8) & 0x07;
            cred2type = (tvb_get_guint8 (tvb, offset + 8) & 0x38) >> 3;

            proto_tree_add_uint (declinedlog_tree, hf_r3_declinedlog_cred1type, tvb, offset, 1, cred1type);
            proto_tree_add_uint (declinedlog_tree, hf_r3_declinedlog_cred2type, tvb, offset, 1, cred2type);
            proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_cred1, tvb, offset + 9, 19, TRUE);
            proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_cred2, tvb, offset + 28, 19, TRUE);
          }
        }
        break;

      case UPSTREAMFIELD_EXPIREON :
        {
          proto_item *expireon_item = NULL;
          proto_tree *expireon_tree = NULL;

          if (dataLength != 3)
            expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "Malformed expiration field -- expected 3 octets");
          else
          {
            expireon_item = proto_tree_add_text (upstreamfield_tree, tvb, offset, 3, "Expire YY/MM/DD: %02u/%02u/%02u",
                tvb_get_guint8 (tvb, offset + 2), tvb_get_guint8 (tvb, offset + 0), tvb_get_guint8 (tvb, offset + 1));
            expireon_tree = proto_item_add_subtree (expireon_item, ett_r3expireon);

            proto_tree_add_item (expireon_tree, hf_r3_expireon_month, tvb, offset + 0, 1, TRUE);
            proto_tree_add_item (expireon_tree, hf_r3_expireon_day, tvb, offset + 1, 1, TRUE);
            proto_tree_add_item (expireon_tree, hf_r3_expireon_year, tvb, offset + 2, 1, TRUE);
          }
        }
        break;

      case UPSTREAMFIELD_TIMEZONE :
        {
          guint32 i;
          guint32 tz;
          proto_item *timezone_item = NULL;
          proto_tree *timezone_tree = NULL;

          if (dataLength != 4)
            expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "Malformed timezone field -- expected 4 octets");
          else
          {
            tz = tvb_get_letohl (tvb, offset);
            timezone_item = proto_tree_add_item (upstreamfield_tree, hf_r3_upstreamfieldarray [fieldType], tvb, offset, 4, TRUE);
            timezone_tree = proto_item_add_subtree (timezone_item, ett_r3timezone);

            for (i = 0; i < 32; i++)
              proto_tree_add_boolean (timezone_tree, hf_r3_timezonearray [i], tvb, offset, 4, tz);
          }
        }
        break;

      case UPSTREAMFIELD_ALARMRECORD :
        {
          proto_item *alarmlog_item = NULL;
          proto_tree *alarmlog_tree = NULL;

          alarmlog_item = proto_tree_add_text (upstreamfield_tree, tvb, offset, 9, "Alarm Record");
          alarmlog_tree = proto_item_add_subtree (alarmlog_item, ett_r3alarmlogrecord);

          if (dataLength != 9)
            expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "Malformed alarm log field -- expected 9 octets");
          else
          {
            proto_tree_add_item (alarmlog_tree, hf_r3_alarmlog_year, tvb, offset + 0, 1, TRUE);
            proto_tree_add_item (alarmlog_tree, hf_r3_alarmlog_month, tvb, offset + 1, 1, TRUE);
            proto_tree_add_item (alarmlog_tree, hf_r3_alarmlog_day, tvb, offset + 2, 1, TRUE);
            proto_tree_add_item (alarmlog_tree, hf_r3_alarmlog_hour, tvb, offset + 3, 1, TRUE);
            proto_tree_add_item (alarmlog_tree, hf_r3_alarmlog_minute, tvb, offset + 4, 1, TRUE);
            proto_tree_add_item (alarmlog_tree, hf_r3_alarmlog_second, tvb, offset + 5, 1, TRUE);
            proto_tree_add_item (alarmlog_tree, hf_r3_alarmlog_id, tvb, offset + 6, 1, TRUE);
            proto_tree_add_item (alarmlog_tree, hf_r3_alarmlog_usernumber, tvb, offset + 7, 2, TRUE);
          }
        }
        break;

      default :
        proto_tree_add_none_format (upstreamfield_tree, hf_r3_upstreamfielderror, tvb, offset, dataLength, "Unknown Field Type");
        break;
    }

    offset += dataLength;
  }
}

/*
 * ***************************************************************************
 *
 *  These are passed a tvb that contains whatever occurs after the [UPSTREAMCOMMAND_*] byte
 */
static void dissect_r3_upstreamcommand_reserved (tvbuff_t *tvb _U_, guint32 start_offset _U_, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree _U_)
{
  DISSECTOR_ASSERT (0);
}

static void dissect_r3_upstreamcommand_debugmsg (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_item *debugmsg_item = NULL;
  proto_tree *debugmsg_tree = NULL;

  debugmsg_item = proto_tree_add_text (tree, tvb, start_offset, -1, "Debug message");
  debugmsg_tree = proto_item_add_subtree (debugmsg_item, ett_r3debugmsg);

  proto_tree_add_item (debugmsg_tree, hf_r3_debugmsg, tvb, start_offset + 1, -1, TRUE);
}

static void dissect_r3_upstreamcommand_queryversion (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree)
{
  dissect_r3_upstreamfields (tvb, start_offset, length, pinfo, tree);
}

static void dissect_r3_upstreamcommand_querydatetime (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree)
{
  dissect_r3_upstreamfields (tvb, start_offset, length, pinfo, tree);
}

static void dissect_r3_upstreamcommand_queryserialnumber (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree)
{
  dissect_r3_upstreamfields (tvb, start_offset, length, pinfo, tree);
}

static void dissect_r3_upstreamcommand_dumpeventlog (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree)
{
  proto_item *eventlog_item = NULL;
  proto_tree *eventlog_tree = NULL;
  const gchar *en = NULL;

  tvb_ensure_bytes_exist (tvb, start_offset, 11);

  if (length != 11)
    expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "Malformed event log record -- expected 10 octets");
  else
  {
    en = val_to_str_const (tvb_get_guint8 (tvb, start_offset + 10), r3_eventnames, "[Unknown Event]");

    eventlog_item = proto_tree_add_text (tree, tvb, start_offset, 10, "Event Log Record %u (%s)", tvb_get_letohs (tvb, start_offset + 0), en);
    eventlog_tree = proto_item_add_subtree (eventlog_item, ett_r3eventlogrecord);

    proto_tree_add_item (eventlog_tree, hf_r3_eventlog_recordnumber, tvb, start_offset + 0, 2, TRUE);
    proto_tree_add_item (eventlog_tree, hf_r3_eventlog_year, tvb, start_offset + 2, 1, TRUE);
    proto_tree_add_item (eventlog_tree, hf_r3_eventlog_month, tvb, start_offset + 3, 1, TRUE);
    proto_tree_add_item (eventlog_tree, hf_r3_eventlog_day, tvb, start_offset + 4, 1, TRUE);
    proto_tree_add_item (eventlog_tree, hf_r3_eventlog_hour, tvb, start_offset + 5, 1, TRUE);
    proto_tree_add_item (eventlog_tree, hf_r3_eventlog_minute, tvb, start_offset + 6, 1, TRUE);
    proto_tree_add_item (eventlog_tree, hf_r3_eventlog_second, tvb, start_offset + 7, 1, TRUE);
    proto_tree_add_item (eventlog_tree, hf_r3_eventlog_usernumber, tvb, start_offset + 8, 2, TRUE);
    proto_tree_add_item (eventlog_tree, hf_r3_eventlog_event, tvb, start_offset + 10, 1, TRUE);
  }
}

static void dissect_r3_upstreamcommand_dumpnvram (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  tvb_ensure_bytes_exist (tvb, start_offset, 3);

  proto_tree_add_item (tree, hf_r3_nvramdump_record, tvb, start_offset + 0, 2, TRUE);
  proto_tree_add_item (tree, hf_r3_nvramdump_length, tvb, start_offset + 2, 1, TRUE);
  proto_tree_add_item (tree, hf_r3_nvramdump_data, tvb, start_offset + 3, tvb_get_guint8 (tvb, start_offset + 2), TRUE);
}

static void dissect_r3_upstreamcommand_rmtquthrequest (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree)
{
  dissect_r3_upstreamfields (tvb, start_offset, length, pinfo, tree);
}

static void dissect_r3_upstreamcommand_retrieveuser (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree)
{
  dissect_r3_upstreamfields (tvb, start_offset, length, pinfo, tree);
}

static void dissect_r3_upstreamcommand_queryconfig (tvbuff_t *tvb, guint32 start_offset _U_, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  guint32 offset = 0;

  while (offset < tvb_reported_length (tvb))
  {
    proto_item *upstreamfield_item = NULL;
    proto_tree *upstreamfield_tree = NULL;
    const gchar *ci = NULL;

    ci = val_to_str_const (tvb_get_guint8 (tvb, offset + 1), r3_configitemnames, "[Unknown Configuration Item]");

    upstreamfield_item = proto_tree_add_text (tree, tvb, offset + 0, tvb_get_guint8 (tvb, offset + 0), "Config Field: %s (%u)", ci, tvb_get_guint8 (tvb, offset + 1));
    upstreamfield_tree = proto_item_add_subtree (upstreamfield_item, ett_r3upstreamfield);

    proto_tree_add_item (upstreamfield_tree, hf_r3_configitemlength, tvb, offset + 0, 1, TRUE);
    proto_tree_add_item (upstreamfield_tree, hf_r3_configitem, tvb, offset + 1, 1, TRUE);
    proto_tree_add_item (upstreamfield_tree, hf_r3_configitemtype, tvb, offset + 2, 1, TRUE);

    switch (tvb_get_guint8 (tvb, offset + 2))
    {
      case CONFIGTYPE_NONE :
        proto_tree_add_item (upstreamfield_tree, hf_r3_configitemdata, tvb, offset + 3, tvb_get_guint8 (tvb, offset + 0) - 3, TRUE);
        break;

      case CONFIGTYPE_BOOL :
        proto_tree_add_item (upstreamfield_tree, hf_r3_configitemdata_bool, tvb, offset + 3, 1, TRUE);
        break;

      case CONFIGTYPE_8 :
        proto_tree_add_item (upstreamfield_tree, hf_r3_configitemdata_8, tvb, offset + 3, 1, TRUE);
        break;

      case CONFIGTYPE_16 :
        proto_tree_add_item (upstreamfield_tree, hf_r3_configitemdata_16, tvb, offset + 3, 2, TRUE);
        break;

      case CONFIGTYPE_32 :
        proto_tree_add_item (upstreamfield_tree, hf_r3_configitemdata_32, tvb, offset + 3, 4, TRUE);
        break;

      case CONFIGTYPE_STRING :
        proto_tree_add_item (upstreamfield_tree, hf_r3_configitemdata_string, tvb, offset + 3, tvb_get_guint8 (tvb, offset + 0) - 3, TRUE);
        break;

      default :
        proto_tree_add_none_format (upstreamfield_tree, hf_r3_upstreamfielderror, tvb, offset + 3, tvb_get_guint8 (tvb, offset + 0) - 3, "Unknown Field Type");
        break;
    }

    offset += tvb_get_guint8 (tvb, offset + 0);
  }
}

static void dissect_r3_upstreamcommand_rmteventlogrecord (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree)
{
  dissect_r3_upstreamfields (tvb, start_offset, length, pinfo, tree);
}

static void dissect_r3_upstreamcommand_dpac (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_dpacreply_stuff, tvb, start_offset + 2, 1, TRUE);
  proto_tree_add_item (tree, hf_r3_dpacreply_length, tvb, start_offset + 3, 1, TRUE);
  proto_tree_add_item (tree, hf_r3_dpacreply_reply, tvb, start_offset + 4, -1, TRUE);
}

static void dissect_r3_upstreamcommand_notify (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree)
{
  dissect_r3_upstreamfields (tvb, start_offset, length, pinfo, tree);
}

static void dissect_r3_upstreamcommand_mfg (tvbuff_t *tvb, guint32 start_offset _U_, guint32 length, packet_info *pinfo, proto_tree *tree)
{
  proto_item *mfg_item = NULL;
  proto_tree *mfg_tree = NULL;
  tvbuff_t *mfg_tvb = NULL;
  const gchar *cn;

  mfg_tvb = tvb_new_subset (tvb, 2, tvb_reported_length (tvb) - 2, tvb_reported_length (tvb) - 2);

  cn = val_to_str_const (tvb_get_guint8 (tvb, 1), r3_mfgfieldnames, "[Unknown Mfg Field]");

  proto_tree_add_item (tree, hf_r3_mfgfield_length, tvb, 0, 1, TRUE);

  mfg_item = proto_tree_add_text (tree, tvb, 1, -1, "Upstream Manufacturing Field: %s (%u)", cn, tvb_get_guint8 (tvb, 1));
  mfg_tree = proto_item_add_subtree (mfg_item, ett_r3commandmfg);

  proto_tree_add_item (mfg_tree, hf_r3_mfgfield, tvb, 1, 1, TRUE);

  if (tvb_get_guint8 (tvb, 1) >= MFGFIELD_LAST)
    expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "Unknown manufacturing command value");
  else if (r3upstreammfgfield_dissect [tvb_get_guint8 (tvb, 1)].dissector)
    (*r3upstreammfgfield_dissect [tvb_get_guint8 (tvb, 1)].dissector) (mfg_tvb, 0, length, pinfo, mfg_tree);
}

static void dissect_r3_upstreamcommand_eventlogwarning (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree)
{
  dissect_r3_upstreamfields (tvb, start_offset, length, pinfo, tree);
}

static void dissect_r3_upstreamcommand_dumpnvramrle (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_nvramdumprle_record, tvb, start_offset + 0, 2, TRUE);
  proto_tree_add_item (tree, hf_r3_nvramdumprle_length, tvb, start_offset + 3, 1, TRUE);
  proto_tree_add_item (tree, hf_r3_nvramdumprle_data, tvb, start_offset + 4, tvb_get_guint8 (tvb, start_offset + 3), TRUE);
}

static void dissect_r3_upstreamcommand_rmtdeclinedrecord (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree)
{
  dissect_r3_upstreamfields (tvb, start_offset, length, pinfo, tree);
}

static void dissect_r3_upstreamcommand_declinedwarning (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree)
{
  dissect_r3_upstreamfields (tvb, start_offset, length, pinfo, tree);
}

static void dissect_r3_upstreamcommand_dumpdeclinedlog (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_item *declinedlog_item = NULL;
  proto_tree *declinedlog_tree = NULL;
  guint8 cred1type = 0;
  guint8 cred2type = 0;

  declinedlog_item = proto_tree_add_text (tree, tvb, start_offset, 49, "Declined Log Record %u", tvb_get_letohs (tvb, start_offset + 0));
  declinedlog_tree = proto_item_add_subtree (declinedlog_item, ett_r3declinedlogrecord);

  proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_recordnumber, tvb, start_offset, 2, TRUE); start_offset += 2;
  proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_year, tvb, start_offset, 1, TRUE);        start_offset += 1;
  proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_month, tvb, start_offset, 1, TRUE);       start_offset += 1;
  proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_day, tvb, start_offset, 1, TRUE);         start_offset += 1;
  proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_hour, tvb, start_offset, 1, TRUE);        start_offset += 1;
  proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_minute, tvb, start_offset, 1, TRUE);      start_offset += 1;
  proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_second, tvb, start_offset, 1, TRUE);      start_offset += 1;
  proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_usernumber, tvb, start_offset, 2, TRUE);   start_offset += 2;

  cred1type = tvb_get_guint8 (tvb, start_offset) & 0x07;
  cred2type = (tvb_get_guint8 (tvb, start_offset) & 0x38) >> 3;

  proto_tree_add_uint (declinedlog_tree, hf_r3_declinedlog_cred1type, tvb, start_offset, 1, cred1type);   start_offset += 0;
  proto_tree_add_uint (declinedlog_tree, hf_r3_declinedlog_cred2type, tvb, start_offset, 1, cred2type);   start_offset += 1;
  proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_cred1, tvb, start_offset, 19, TRUE);          start_offset += 19;
  proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_cred2, tvb, start_offset, 19, TRUE);
}

static void dissect_r3_upstreamcommand_rmtalarmrecord (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree)
{
  dissect_r3_upstreamfields (tvb, start_offset, length, pinfo, tree);
}

static void dissect_r3_upstreamcommand_alarmwarning (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree)
{
  dissect_r3_upstreamfields (tvb, start_offset, length, pinfo, tree);
}

static void dissect_r3_upstreamcommand_dumpalarmlog (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_item *alarmlog_item = proto_tree_add_text (tree, tvb, start_offset, 9, "Alarm Log Record %u", tvb_get_letohs (tvb, start_offset + 0));
  proto_tree *alarmlog_tree = proto_item_add_subtree (alarmlog_item, ett_r3alarmlogrecord);

  proto_tree_add_item (alarmlog_tree, hf_r3_alarmlog_recordnumber, tvb, start_offset + 0, 2, TRUE);
  proto_tree_add_item (alarmlog_tree, hf_r3_alarmlog_year, tvb, start_offset + 2, 1, TRUE);
  proto_tree_add_item (alarmlog_tree, hf_r3_alarmlog_month, tvb, start_offset + 3, 1, TRUE);
  proto_tree_add_item (alarmlog_tree, hf_r3_alarmlog_day, tvb, start_offset + 4, 1, TRUE);
  proto_tree_add_item (alarmlog_tree, hf_r3_alarmlog_hour, tvb, start_offset + 5, 1, TRUE);
  proto_tree_add_item (alarmlog_tree, hf_r3_alarmlog_minute, tvb, start_offset + 6, 1, TRUE);
  proto_tree_add_item (alarmlog_tree, hf_r3_alarmlog_second, tvb, start_offset + 7, 1, TRUE);
  proto_tree_add_item (alarmlog_tree, hf_r3_alarmlog_id, tvb, start_offset + 8, 1, TRUE);
  proto_tree_add_item (alarmlog_tree, hf_r3_alarmlog_usernumber, tvb, start_offset + 9, 2, TRUE);
}

static void dissect_r3_upstreamcommand_connectscheduler (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree)
{
  dissect_r3_upstreamfields (tvb, start_offset, length, pinfo, tree);
}

static void dissect_r3_upstreamcommand_connectcommuser (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree)
{
  dissect_r3_upstreamfields (tvb, start_offset, length, pinfo, tree);
}

static void dissect_r3_upstreamcommand_commandalarm (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree)
{
  dissect_r3_upstreamfields (tvb, start_offset, length, pinfo, tree);
}

static void dissect_r3_upstreamcommand_dumpdebuglog (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_item *debuglog_item = proto_tree_add_text (tree, tvb, start_offset, 8, "Debug Log Record %u", tvb_get_letohs (tvb, start_offset + 0));
  proto_tree *debuglog_tree = proto_item_add_subtree (debuglog_item, ett_r3debuglogrecord);

  proto_tree_add_item (debuglog_tree, hf_r3_debuglog_recordnumber, tvb, start_offset + 0, 2, TRUE);
  proto_tree_add_item (debuglog_tree, hf_r3_debuglog_flags, tvb, start_offset + 2, 4, TRUE);
  proto_tree_add_item (debuglog_tree, hf_r3_debuglog_tick, tvb, start_offset + 6, 2, TRUE);
}

/*
 * ***************************************************************************
 */
static void dissect_r3_upstreammfgfield_iopins (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo, proto_tree *tree)
{
  guint32 i;
  guint32 l = tvb_length_remaining (tvb, start_offset);
  char portname = 'A';

  if (l % 3 != 0)
    expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "IOPINS data length not modulo 3 == 0");
  else
  {
    for (i = 0; i < l; i += 3, portname++)
    {
      proto_item *port_item = proto_tree_add_text (tree, tvb, start_offset + i, 3, "Port %c Configuration", (portname == 'I') ? ++portname : portname);
      proto_tree *port_tree = proto_item_add_subtree (port_item, ett_r3iopins);

      proto_tree_add_item (port_tree, hf_r3_iopins_lat, tvb, start_offset + i + 0, 1, TRUE);
      proto_tree_add_item (port_tree, hf_r3_iopins_port, tvb, start_offset + i + 1, 1, TRUE);
      proto_tree_add_item (port_tree, hf_r3_iopins_tris, tvb, start_offset + i + 2, 1, TRUE);
    }
  }
}

static void dissect_r3_upstreammfgfield_adcs (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  guint32 i;

  for (i = 0; i < tvb_reported_length (tvb); i++)
  {
    proto_item *item = proto_tree_add_item (tree, hf_r3_adc [i], tvb, start_offset + i, 1, TRUE);
    proto_item_append_text (item, " (%.2f Volts)", (float) tvb_get_guint8 (tvb, start_offset + i) * 0.04154);
  }
}

static void dissect_r3_upstreammfgfield_hardwareid (tvbuff_t *tvb, guint32 start_offset _U_, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_hardwareid_board, tvb, 0, 1, TRUE);
  proto_tree_add_item (tree, hf_r3_hardwareid_cpuid, tvb, 1, 2, TRUE);
  proto_tree_add_item (tree, hf_r3_hardwareid_cpurev, tvb, 3, 1, TRUE);
}

static void dissect_r3_upstreammfgfield_checkpointlog (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_item *cpl_item = NULL;
  proto_tree *cpl_tree = NULL;
  guint counter = 0;
  guint l = tvb_length_remaining (tvb, start_offset + 1);
  guint i;

  proto_tree_add_item (tree, hf_r3_checkpointlog_entryptr, tvb, start_offset, 1, TRUE);
  cpl_item = proto_tree_add_text (tree, tvb, start_offset + 1, -1, "Checkpoint Log");
  cpl_tree = proto_item_add_subtree (cpl_item, ett_r3checkpointlog);

  for (start_offset++, i = 0; i < l; i += 2, counter++)
  {
    guint rcon = tvb_get_guint8 (tvb, start_offset + i + 0);
    guint cp = tvb_get_guint8 (tvb, start_offset + i + 1);
    guint resettype = 0;
    proto_item *cpe_item = proto_tree_add_text (cpl_tree, tvb, start_offset + i + 0, 2, "Checkpoint Log Entry %u", counter);
    proto_tree *cpe_tree = proto_item_add_subtree (cpe_item, ett_r3checkpointlogentry);
    const gchar *resets [] = { "Stack underflow", "Stack overflow", "Power-On", "Software", "Brown-out", "MCLR in sleep", "WDT", "Normal", "[Unknown Reset Type]" };
    const gchar *desc;

    desc = val_to_str_const (cp, r3_checkpointnames, "[Unknown Checkpoint]");

    if (rcon == 0xff)
      resettype = 8;
    else
    {
      rcon &= 0x1f;

      if (rcon == 0x1c)
        resettype = 2;
      else if ((rcon & 0x10) == 0x00)
        resettype = 3;
      else if ((rcon & 0x1d) == 0x1c)
        resettype = 4;
      else if ((rcon & 0x0c) == 0x08)
        resettype = 5;
      else if ((rcon & 0x0c) == 0x04)
        resettype = 6;
      else
        resettype = 7;
    }

    proto_item_append_text (cpe_item, " (%s, %s)", resets [resettype], desc);
    proto_item_append_text (proto_tree_add_item (cpe_tree, hf_r3_checkpointlog_rcon, tvb, start_offset + i + 0, 1, TRUE), " (%s)", resets [resettype]);
    proto_item_append_text (proto_tree_add_item (cpe_tree, hf_r3_checkpointlog_checkpoint, tvb, start_offset + i + 1, 1, TRUE), " (%s)", desc);
  }
}

static void dissect_r3_upstreammfgfield_cpuregisters (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree *tmp_tree [19];
  proto_item *cr_item = proto_tree_add_text (tree, tvb, start_offset, -1, "CPU Registers");
  proto_tree *cr_tree = proto_item_add_subtree (cr_item, ett_r3cpuregisters);

  tmp_tree [ 0] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_intcon,  tvb, start_offset +  0, 1, TRUE), ett_r3cpuregister);
  tmp_tree [ 1] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_intcon2, tvb, start_offset +  1, 1, TRUE), ett_r3cpuregister);
  tmp_tree [ 2] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_intcon3, tvb, start_offset +  2, 1, TRUE), ett_r3cpuregister);
  tmp_tree [ 3] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_pir1,    tvb, start_offset +  3, 1, TRUE), ett_r3cpuregister);
  tmp_tree [ 4] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_pir2,    tvb, start_offset +  4, 1, TRUE), ett_r3cpuregister);
  tmp_tree [ 5] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_pir3,    tvb, start_offset +  5, 1, TRUE), ett_r3cpuregister);
  tmp_tree [ 6] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_pie1,    tvb, start_offset +  6, 1, TRUE), ett_r3cpuregister);
  tmp_tree [ 7] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_pie2,    tvb, start_offset +  7, 1, TRUE), ett_r3cpuregister);
  tmp_tree [ 8] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_pie3,    tvb, start_offset +  8, 1, TRUE), ett_r3cpuregister);
  tmp_tree [ 9] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_ipr1,    tvb, start_offset +  9, 1, TRUE), ett_r3cpuregister);
  tmp_tree [10] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_ipr2,    tvb, start_offset + 10, 1, TRUE), ett_r3cpuregister);
  tmp_tree [11] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_ipr3,    tvb, start_offset + 11, 1, TRUE), ett_r3cpuregister);
  tmp_tree [12] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_rcon,    tvb, start_offset + 12, 1, TRUE), ett_r3cpuregister);
  tmp_tree [13] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_osccon,  tvb, start_offset + 13, 1, TRUE), ett_r3cpuregister);
  tmp_tree [14] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_rcsta,   tvb, start_offset + 14, 1, TRUE), ett_r3cpuregister);
  tmp_tree [15] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_txsta,   tvb, start_offset + 15, 1, TRUE), ett_r3cpuregister);
  tmp_tree [16] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_rcsta2,  tvb, start_offset + 16, 1, TRUE), ett_r3cpuregister);
  tmp_tree [17] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_txsta2,  tvb, start_offset + 17, 1, TRUE), ett_r3cpuregister);
  tmp_tree [18] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_wdtcon,  tvb, start_offset + 18, 1, TRUE), ett_r3cpuregister);

  proto_tree_add_boolean (tmp_tree [ 0], hf_r3_cpuregisters_intcon_rbif,     tvb, start_offset +  0, 1, tvb_get_guint8 (tvb, start_offset +  0));
  proto_tree_add_boolean (tmp_tree [ 0], hf_r3_cpuregisters_intcon_int0if,   tvb, start_offset +  0, 1, tvb_get_guint8 (tvb, start_offset +  0));
  proto_tree_add_boolean (tmp_tree [ 0], hf_r3_cpuregisters_intcon_tmr0if,   tvb, start_offset +  0, 1, tvb_get_guint8 (tvb, start_offset +  0));
  proto_tree_add_boolean (tmp_tree [ 0], hf_r3_cpuregisters_intcon_rbie,     tvb, start_offset +  0, 1, tvb_get_guint8 (tvb, start_offset +  0));
  proto_tree_add_boolean (tmp_tree [ 0], hf_r3_cpuregisters_intcon_int0ie,   tvb, start_offset +  0, 1, tvb_get_guint8 (tvb, start_offset +  0));
  proto_tree_add_boolean (tmp_tree [ 0], hf_r3_cpuregisters_intcon_tmr0ie,   tvb, start_offset +  0, 1, tvb_get_guint8 (tvb, start_offset +  0));
  proto_tree_add_boolean (tmp_tree [ 0], hf_r3_cpuregisters_intcon_giel,     tvb, start_offset +  0, 1, tvb_get_guint8 (tvb, start_offset +  0));
  proto_tree_add_boolean (tmp_tree [ 0], hf_r3_cpuregisters_intcon_gieh,     tvb, start_offset +  0, 1, tvb_get_guint8 (tvb, start_offset +  0));
  proto_tree_add_boolean (tmp_tree [ 1], hf_r3_cpuregisters_intcon2_rbip,    tvb, start_offset +  1, 1, tvb_get_guint8 (tvb, start_offset +  1));
  proto_tree_add_boolean (tmp_tree [ 1], hf_r3_cpuregisters_intcon2_int3ip,  tvb, start_offset +  1, 1, tvb_get_guint8 (tvb, start_offset +  1));
  proto_tree_add_boolean (tmp_tree [ 1], hf_r3_cpuregisters_intcon2_tmr0ip,  tvb, start_offset +  1, 1, tvb_get_guint8 (tvb, start_offset +  1));
  proto_tree_add_boolean (tmp_tree [ 1], hf_r3_cpuregisters_intcon2_intedg3, tvb, start_offset +  1, 1, tvb_get_guint8 (tvb, start_offset +  1));
  proto_tree_add_boolean (tmp_tree [ 1], hf_r3_cpuregisters_intcon2_intedg2, tvb, start_offset +  1, 1, tvb_get_guint8 (tvb, start_offset +  1));
  proto_tree_add_boolean (tmp_tree [ 1], hf_r3_cpuregisters_intcon2_intedg1, tvb, start_offset +  1, 1, tvb_get_guint8 (tvb, start_offset +  1));
  proto_tree_add_boolean (tmp_tree [ 1], hf_r3_cpuregisters_intcon2_intedg0, tvb, start_offset +  1, 1, tvb_get_guint8 (tvb, start_offset +  1));
  proto_tree_add_boolean (tmp_tree [ 1], hf_r3_cpuregisters_intcon2_rbpu,    tvb, start_offset +  1, 1, tvb_get_guint8 (tvb, start_offset +  1));
  proto_tree_add_boolean (tmp_tree [ 2], hf_r3_cpuregisters_intcon3_int1if,  tvb, start_offset +  2, 1, tvb_get_guint8 (tvb, start_offset +  2));
  proto_tree_add_boolean (tmp_tree [ 2], hf_r3_cpuregisters_intcon3_int2if,  tvb, start_offset +  2, 1, tvb_get_guint8 (tvb, start_offset +  2));
  proto_tree_add_boolean (tmp_tree [ 2], hf_r3_cpuregisters_intcon3_int3if,  tvb, start_offset +  2, 1, tvb_get_guint8 (tvb, start_offset +  2));
  proto_tree_add_boolean (tmp_tree [ 2], hf_r3_cpuregisters_intcon3_int1ie,  tvb, start_offset +  2, 1, tvb_get_guint8 (tvb, start_offset +  2));
  proto_tree_add_boolean (tmp_tree [ 2], hf_r3_cpuregisters_intcon3_int2ie,  tvb, start_offset +  2, 1, tvb_get_guint8 (tvb, start_offset +  2));
  proto_tree_add_boolean (tmp_tree [ 2], hf_r3_cpuregisters_intcon3_int3ie,  tvb, start_offset +  2, 1, tvb_get_guint8 (tvb, start_offset +  2));
  proto_tree_add_boolean (tmp_tree [ 2], hf_r3_cpuregisters_intcon3_int1ip,  tvb, start_offset +  2, 1, tvb_get_guint8 (tvb, start_offset +  2));
  proto_tree_add_boolean (tmp_tree [ 2], hf_r3_cpuregisters_intcon3_int2ip,  tvb, start_offset +  2, 1, tvb_get_guint8 (tvb, start_offset +  2));
  proto_tree_add_boolean (tmp_tree [ 3], hf_r3_cpuregisters_pir1_tmr1if,     tvb, start_offset +  3, 1, tvb_get_guint8 (tvb, start_offset +  3));
  proto_tree_add_boolean (tmp_tree [ 3], hf_r3_cpuregisters_pir1_tmr2if,     tvb, start_offset +  3, 1, tvb_get_guint8 (tvb, start_offset +  3));
  proto_tree_add_boolean (tmp_tree [ 3], hf_r3_cpuregisters_pir1_ccp1if,     tvb, start_offset +  3, 1, tvb_get_guint8 (tvb, start_offset +  3));
  proto_tree_add_boolean (tmp_tree [ 3], hf_r3_cpuregisters_pir1_ssp1if,     tvb, start_offset +  3, 1, tvb_get_guint8 (tvb, start_offset +  3));
  proto_tree_add_boolean (tmp_tree [ 3], hf_r3_cpuregisters_pir1_tx1if,      tvb, start_offset +  3, 1, tvb_get_guint8 (tvb, start_offset +  3));
  proto_tree_add_boolean (tmp_tree [ 3], hf_r3_cpuregisters_pir1_rc1if,      tvb, start_offset +  3, 1, tvb_get_guint8 (tvb, start_offset +  3));
  proto_tree_add_boolean (tmp_tree [ 3], hf_r3_cpuregisters_pir1_adif,       tvb, start_offset +  3, 1, tvb_get_guint8 (tvb, start_offset +  3));
  proto_tree_add_boolean (tmp_tree [ 3], hf_r3_cpuregisters_pir1_pspif,      tvb, start_offset +  3, 1, tvb_get_guint8 (tvb, start_offset +  3));
  proto_tree_add_boolean (tmp_tree [ 4], hf_r3_cpuregisters_pir2_ccp2if,     tvb, start_offset +  4, 1, tvb_get_guint8 (tvb, start_offset +  4));
  proto_tree_add_boolean (tmp_tree [ 4], hf_r3_cpuregisters_pir2_tmr3if,     tvb, start_offset +  4, 1, tvb_get_guint8 (tvb, start_offset +  4));
  proto_tree_add_boolean (tmp_tree [ 4], hf_r3_cpuregisters_pir2_hlvdif,     tvb, start_offset +  4, 1, tvb_get_guint8 (tvb, start_offset +  4));
  proto_tree_add_boolean (tmp_tree [ 4], hf_r3_cpuregisters_pir2_bcl1if,     tvb, start_offset +  4, 1, tvb_get_guint8 (tvb, start_offset +  4));
  proto_tree_add_boolean (tmp_tree [ 4], hf_r3_cpuregisters_pir2_eeif,       tvb, start_offset +  4, 1, tvb_get_guint8 (tvb, start_offset +  4));
  proto_tree_add_boolean (tmp_tree [ 4], hf_r3_cpuregisters_pir2_unused5,    tvb, start_offset +  4, 1, tvb_get_guint8 (tvb, start_offset +  4));
  proto_tree_add_boolean (tmp_tree [ 4], hf_r3_cpuregisters_pir2_cmif,       tvb, start_offset +  4, 1, tvb_get_guint8 (tvb, start_offset +  4));
  proto_tree_add_boolean (tmp_tree [ 4], hf_r3_cpuregisters_pir2_oscfif,     tvb, start_offset +  4, 1, tvb_get_guint8 (tvb, start_offset +  4));
  proto_tree_add_boolean (tmp_tree [ 5], hf_r3_cpuregisters_pir3_ccp3if,     tvb, start_offset +  5, 1, tvb_get_guint8 (tvb, start_offset +  5));
  proto_tree_add_boolean (tmp_tree [ 5], hf_r3_cpuregisters_pir3_ccp4if,     tvb, start_offset +  5, 1, tvb_get_guint8 (tvb, start_offset +  5));
  proto_tree_add_boolean (tmp_tree [ 5], hf_r3_cpuregisters_pir3_ccp5if,     tvb, start_offset +  5, 1, tvb_get_guint8 (tvb, start_offset +  5));
  proto_tree_add_boolean (tmp_tree [ 5], hf_r3_cpuregisters_pir3_tmr4if,     tvb, start_offset +  5, 1, tvb_get_guint8 (tvb, start_offset +  5));
  proto_tree_add_boolean (tmp_tree [ 5], hf_r3_cpuregisters_pir3_tx2if,      tvb, start_offset +  5, 1, tvb_get_guint8 (tvb, start_offset +  5));
  proto_tree_add_boolean (tmp_tree [ 5], hf_r3_cpuregisters_pir3_rc2if,      tvb, start_offset +  5, 1, tvb_get_guint8 (tvb, start_offset +  5));
  proto_tree_add_boolean (tmp_tree [ 5], hf_r3_cpuregisters_pir3_bcl2if,     tvb, start_offset +  5, 1, tvb_get_guint8 (tvb, start_offset +  5));
  proto_tree_add_boolean (tmp_tree [ 5], hf_r3_cpuregisters_pir3_ssp2if,     tvb, start_offset +  5, 1, tvb_get_guint8 (tvb, start_offset +  5));
  proto_tree_add_boolean (tmp_tree [ 6], hf_r3_cpuregisters_pie1_tmr1ie,     tvb, start_offset +  6, 1, tvb_get_guint8 (tvb, start_offset +  6));
  proto_tree_add_boolean (tmp_tree [ 6], hf_r3_cpuregisters_pie1_tmr2ie,     tvb, start_offset +  6, 1, tvb_get_guint8 (tvb, start_offset +  6));
  proto_tree_add_boolean (tmp_tree [ 6], hf_r3_cpuregisters_pie1_ccp1ie,     tvb, start_offset +  6, 1, tvb_get_guint8 (tvb, start_offset +  6));
  proto_tree_add_boolean (tmp_tree [ 6], hf_r3_cpuregisters_pie1_ssp1ie,     tvb, start_offset +  6, 1, tvb_get_guint8 (tvb, start_offset +  6));
  proto_tree_add_boolean (tmp_tree [ 6], hf_r3_cpuregisters_pie1_tx1ie,      tvb, start_offset +  6, 1, tvb_get_guint8 (tvb, start_offset +  6));
  proto_tree_add_boolean (tmp_tree [ 6], hf_r3_cpuregisters_pie1_rc1ie,      tvb, start_offset +  6, 1, tvb_get_guint8 (tvb, start_offset +  6));
  proto_tree_add_boolean (tmp_tree [ 6], hf_r3_cpuregisters_pie1_adie,       tvb, start_offset +  6, 1, tvb_get_guint8 (tvb, start_offset +  6));
  proto_tree_add_boolean (tmp_tree [ 6], hf_r3_cpuregisters_pie1_pspie,      tvb, start_offset +  6, 1, tvb_get_guint8 (tvb, start_offset +  6));
  proto_tree_add_boolean (tmp_tree [ 7], hf_r3_cpuregisters_pie2_oscfie,     tvb, start_offset +  7, 1, tvb_get_guint8 (tvb, start_offset +  7));
  proto_tree_add_boolean (tmp_tree [ 7], hf_r3_cpuregisters_pie2_cmie,       tvb, start_offset +  7, 1, tvb_get_guint8 (tvb, start_offset +  7));
  proto_tree_add_boolean (tmp_tree [ 7], hf_r3_cpuregisters_pie2_unused2,    tvb, start_offset +  7, 1, tvb_get_guint8 (tvb, start_offset +  7));
  proto_tree_add_boolean (tmp_tree [ 7], hf_r3_cpuregisters_pie2_eeie,       tvb, start_offset +  7, 1, tvb_get_guint8 (tvb, start_offset +  7));
  proto_tree_add_boolean (tmp_tree [ 7], hf_r3_cpuregisters_pie2_bcl1ie,     tvb, start_offset +  7, 1, tvb_get_guint8 (tvb, start_offset +  7));
  proto_tree_add_boolean (tmp_tree [ 7], hf_r3_cpuregisters_pie2_hlvdie,     tvb, start_offset +  7, 1, tvb_get_guint8 (tvb, start_offset +  7));
  proto_tree_add_boolean (tmp_tree [ 7], hf_r3_cpuregisters_pie2_tmr3ie,     tvb, start_offset +  7, 1, tvb_get_guint8 (tvb, start_offset +  7));
  proto_tree_add_boolean (tmp_tree [ 7], hf_r3_cpuregisters_pie2_ccp2ie,     tvb, start_offset +  7, 1, tvb_get_guint8 (tvb, start_offset +  7));
  proto_tree_add_boolean (tmp_tree [ 8], hf_r3_cpuregisters_pie3_ccp3ie,     tvb, start_offset +  8, 1, tvb_get_guint8 (tvb, start_offset +  8));
  proto_tree_add_boolean (tmp_tree [ 8], hf_r3_cpuregisters_pie3_ccp4ie,     tvb, start_offset +  8, 1, tvb_get_guint8 (tvb, start_offset +  8));
  proto_tree_add_boolean (tmp_tree [ 8], hf_r3_cpuregisters_pie3_ccp5ie,     tvb, start_offset +  8, 1, tvb_get_guint8 (tvb, start_offset +  8));
  proto_tree_add_boolean (tmp_tree [ 8], hf_r3_cpuregisters_pie3_tmr4ie,     tvb, start_offset +  8, 1, tvb_get_guint8 (tvb, start_offset +  8));
  proto_tree_add_boolean (tmp_tree [ 8], hf_r3_cpuregisters_pie3_tx2ie,      tvb, start_offset +  8, 1, tvb_get_guint8 (tvb, start_offset +  8));
  proto_tree_add_boolean (tmp_tree [ 8], hf_r3_cpuregisters_pie3_rc2ie,      tvb, start_offset +  8, 1, tvb_get_guint8 (tvb, start_offset +  8));
  proto_tree_add_boolean (tmp_tree [ 8], hf_r3_cpuregisters_pie3_bcl2ie,     tvb, start_offset +  8, 1, tvb_get_guint8 (tvb, start_offset +  8));
  proto_tree_add_boolean (tmp_tree [ 8], hf_r3_cpuregisters_pie3_ssp2ie,     tvb, start_offset +  8, 1, tvb_get_guint8 (tvb, start_offset +  8));
  proto_tree_add_boolean (tmp_tree [ 9], hf_r3_cpuregisters_ipr1_tmr1ip,     tvb, start_offset +  9, 1, tvb_get_guint8 (tvb, start_offset +  9));
  proto_tree_add_boolean (tmp_tree [ 9], hf_r3_cpuregisters_ipr1_tmr2ip,     tvb, start_offset +  9, 1, tvb_get_guint8 (tvb, start_offset +  9));
  proto_tree_add_boolean (tmp_tree [ 9], hf_r3_cpuregisters_ipr1_ccp1ip,     tvb, start_offset +  9, 1, tvb_get_guint8 (tvb, start_offset +  9));
  proto_tree_add_boolean (tmp_tree [ 9], hf_r3_cpuregisters_ipr1_ssp1ip,     tvb, start_offset +  9, 1, tvb_get_guint8 (tvb, start_offset +  9));
  proto_tree_add_boolean (tmp_tree [ 9], hf_r3_cpuregisters_ipr1_tx1ip,      tvb, start_offset +  9, 1, tvb_get_guint8 (tvb, start_offset +  9));
  proto_tree_add_boolean (tmp_tree [ 9], hf_r3_cpuregisters_ipr1_rc1ip,      tvb, start_offset +  9, 1, tvb_get_guint8 (tvb, start_offset +  9));
  proto_tree_add_boolean (tmp_tree [ 9], hf_r3_cpuregisters_ipr1_adip,       tvb, start_offset +  9, 1, tvb_get_guint8 (tvb, start_offset +  9));
  proto_tree_add_boolean (tmp_tree [ 9], hf_r3_cpuregisters_ipr1_pspip,      tvb, start_offset +  9, 1, tvb_get_guint8 (tvb, start_offset +  9));
  proto_tree_add_boolean (tmp_tree [10], hf_r3_cpuregisters_ipr2_ccp2ip,     tvb, start_offset + 10, 1, tvb_get_guint8 (tvb, start_offset + 10));
  proto_tree_add_boolean (tmp_tree [10], hf_r3_cpuregisters_ipr2_tmr3ip,     tvb, start_offset + 10, 1, tvb_get_guint8 (tvb, start_offset + 10));
  proto_tree_add_boolean (tmp_tree [10], hf_r3_cpuregisters_ipr2_hlvdip,     tvb, start_offset + 10, 1, tvb_get_guint8 (tvb, start_offset + 10));
  proto_tree_add_boolean (tmp_tree [10], hf_r3_cpuregisters_ipr2_bcl1ip,     tvb, start_offset + 10, 1, tvb_get_guint8 (tvb, start_offset + 10));
  proto_tree_add_boolean (tmp_tree [10], hf_r3_cpuregisters_ipr2_eeip,       tvb, start_offset + 10, 1, tvb_get_guint8 (tvb, start_offset + 10));
  proto_tree_add_boolean (tmp_tree [10], hf_r3_cpuregisters_ipr2_unused5,    tvb, start_offset + 10, 1, tvb_get_guint8 (tvb, start_offset + 10));
  proto_tree_add_boolean (tmp_tree [10], hf_r3_cpuregisters_ipr2_cmip,       tvb, start_offset + 10, 1, tvb_get_guint8 (tvb, start_offset + 10));
  proto_tree_add_boolean (tmp_tree [10], hf_r3_cpuregisters_ipr2_oscfip,     tvb, start_offset + 10, 1, tvb_get_guint8 (tvb, start_offset + 10));
  proto_tree_add_boolean (tmp_tree [11], hf_r3_cpuregisters_ipr3_ccp2ip,     tvb, start_offset + 11, 1, tvb_get_guint8 (tvb, start_offset + 11));
  proto_tree_add_boolean (tmp_tree [11], hf_r3_cpuregisters_ipr3_ccp4ip,     tvb, start_offset + 11, 1, tvb_get_guint8 (tvb, start_offset + 11));
  proto_tree_add_boolean (tmp_tree [11], hf_r3_cpuregisters_ipr3_ccp5ip,     tvb, start_offset + 11, 1, tvb_get_guint8 (tvb, start_offset + 11));
  proto_tree_add_boolean (tmp_tree [11], hf_r3_cpuregisters_ipr3_tmr4ip,     tvb, start_offset + 11, 1, tvb_get_guint8 (tvb, start_offset + 11));
  proto_tree_add_boolean (tmp_tree [11], hf_r3_cpuregisters_ipr3_tx2ip,      tvb, start_offset + 11, 1, tvb_get_guint8 (tvb, start_offset + 11));
  proto_tree_add_boolean (tmp_tree [11], hf_r3_cpuregisters_ipr3_rc2ip,      tvb, start_offset + 11, 1, tvb_get_guint8 (tvb, start_offset + 11));
  proto_tree_add_boolean (tmp_tree [11], hf_r3_cpuregisters_ipr3_bcl2ip,     tvb, start_offset + 11, 1, tvb_get_guint8 (tvb, start_offset + 11));
  proto_tree_add_boolean (tmp_tree [11], hf_r3_cpuregisters_ipr3_ssp2ip,     tvb, start_offset + 11, 1, tvb_get_guint8 (tvb, start_offset + 11));
  proto_tree_add_boolean (tmp_tree [12], hf_r3_cpuregisters_rcon_bor,        tvb, start_offset + 12, 1, tvb_get_guint8 (tvb, start_offset + 12));
  proto_tree_add_boolean (tmp_tree [12], hf_r3_cpuregisters_rcon_por,        tvb, start_offset + 12, 1, tvb_get_guint8 (tvb, start_offset + 12));
  proto_tree_add_boolean (tmp_tree [12], hf_r3_cpuregisters_rcon_pd,         tvb, start_offset + 12, 1, tvb_get_guint8 (tvb, start_offset + 12));
  proto_tree_add_boolean (tmp_tree [12], hf_r3_cpuregisters_rcon_to,         tvb, start_offset + 12, 1, tvb_get_guint8 (tvb, start_offset + 12));
  proto_tree_add_boolean (tmp_tree [12], hf_r3_cpuregisters_rcon_unused4,    tvb, start_offset + 12, 1, tvb_get_guint8 (tvb, start_offset + 12));
  proto_tree_add_boolean (tmp_tree [12], hf_r3_cpuregisters_rcon_ri,         tvb, start_offset + 12, 1, tvb_get_guint8 (tvb, start_offset + 12));
  proto_tree_add_boolean (tmp_tree [12], hf_r3_cpuregisters_rcon_sboren,     tvb, start_offset + 12, 1, tvb_get_guint8 (tvb, start_offset + 12));
  proto_tree_add_boolean (tmp_tree [12], hf_r3_cpuregisters_rcon_ipen,       tvb, start_offset + 12, 1, tvb_get_guint8 (tvb, start_offset + 12));
  proto_tree_add_boolean (tmp_tree [13], hf_r3_cpuregisters_osccon_scs0,     tvb, start_offset + 13, 1, tvb_get_guint8 (tvb, start_offset + 13));
  proto_tree_add_boolean (tmp_tree [13], hf_r3_cpuregisters_osccon_scs1,     tvb, start_offset + 13, 1, tvb_get_guint8 (tvb, start_offset + 13));
  proto_tree_add_boolean (tmp_tree [13], hf_r3_cpuregisters_osccon_iofs,     tvb, start_offset + 13, 1, tvb_get_guint8 (tvb, start_offset + 13));
  proto_tree_add_boolean (tmp_tree [13], hf_r3_cpuregisters_osccon_osts,     tvb, start_offset + 13, 1, tvb_get_guint8 (tvb, start_offset + 13));
  proto_tree_add_boolean (tmp_tree [13], hf_r3_cpuregisters_osccon_ircf0,    tvb, start_offset + 13, 1, tvb_get_guint8 (tvb, start_offset + 13));
  proto_tree_add_boolean (tmp_tree [13], hf_r3_cpuregisters_osccon_ircf1,    tvb, start_offset + 13, 1, tvb_get_guint8 (tvb, start_offset + 13));
  proto_tree_add_boolean (tmp_tree [13], hf_r3_cpuregisters_osccon_ircf2,    tvb, start_offset + 13, 1, tvb_get_guint8 (tvb, start_offset + 13));
  proto_tree_add_boolean (tmp_tree [13], hf_r3_cpuregisters_osccon_idlen,    tvb, start_offset + 13, 1, tvb_get_guint8 (tvb, start_offset + 13));
  proto_tree_add_boolean (tmp_tree [14], hf_r3_cpuregisters_rcsta_rx9d,      tvb, start_offset + 14, 1, tvb_get_guint8 (tvb, start_offset + 14));
  proto_tree_add_boolean (tmp_tree [14], hf_r3_cpuregisters_rcsta_oerr,      tvb, start_offset + 14, 1, tvb_get_guint8 (tvb, start_offset + 14));
  proto_tree_add_boolean (tmp_tree [14], hf_r3_cpuregisters_rcsta_ferr,      tvb, start_offset + 14, 1, tvb_get_guint8 (tvb, start_offset + 14));
  proto_tree_add_boolean (tmp_tree [14], hf_r3_cpuregisters_rcsta_adden,     tvb, start_offset + 14, 1, tvb_get_guint8 (tvb, start_offset + 14));
  proto_tree_add_boolean (tmp_tree [14], hf_r3_cpuregisters_rcsta_cren,      tvb, start_offset + 14, 1, tvb_get_guint8 (tvb, start_offset + 14));
  proto_tree_add_boolean (tmp_tree [14], hf_r3_cpuregisters_rcsta_sren,      tvb, start_offset + 14, 1, tvb_get_guint8 (tvb, start_offset + 14));
  proto_tree_add_boolean (tmp_tree [14], hf_r3_cpuregisters_rcsta_rx9,       tvb, start_offset + 14, 1, tvb_get_guint8 (tvb, start_offset + 14));
  proto_tree_add_boolean (tmp_tree [14], hf_r3_cpuregisters_rcsta_spen,      tvb, start_offset + 14, 1, tvb_get_guint8 (tvb, start_offset + 14));
  proto_tree_add_boolean (tmp_tree [15], hf_r3_cpuregisters_txsta_tx9d,      tvb, start_offset + 15, 1, tvb_get_guint8 (tvb, start_offset + 15));
  proto_tree_add_boolean (tmp_tree [15], hf_r3_cpuregisters_txsta_trmt,      tvb, start_offset + 15, 1, tvb_get_guint8 (tvb, start_offset + 15));
  proto_tree_add_boolean (tmp_tree [15], hf_r3_cpuregisters_txsta_brgh,      tvb, start_offset + 15, 1, tvb_get_guint8 (tvb, start_offset + 15));
  proto_tree_add_boolean (tmp_tree [15], hf_r3_cpuregisters_txsta_sendb,     tvb, start_offset + 15, 1, tvb_get_guint8 (tvb, start_offset + 15));
  proto_tree_add_boolean (tmp_tree [15], hf_r3_cpuregisters_txsta_sync,      tvb, start_offset + 15, 1, tvb_get_guint8 (tvb, start_offset + 15));
  proto_tree_add_boolean (tmp_tree [15], hf_r3_cpuregisters_txsta_txen,      tvb, start_offset + 15, 1, tvb_get_guint8 (tvb, start_offset + 15));
  proto_tree_add_boolean (tmp_tree [15], hf_r3_cpuregisters_txsta_tx9,       tvb, start_offset + 15, 1, tvb_get_guint8 (tvb, start_offset + 15));
  proto_tree_add_boolean (tmp_tree [15], hf_r3_cpuregisters_txsta_csrc,      tvb, start_offset + 15, 1, tvb_get_guint8 (tvb, start_offset + 15));
  proto_tree_add_boolean (tmp_tree [16], hf_r3_cpuregisters_rcsta2_rx9d,     tvb, start_offset + 16, 1, tvb_get_guint8 (tvb, start_offset + 16));
  proto_tree_add_boolean (tmp_tree [16], hf_r3_cpuregisters_rcsta2_oerr,     tvb, start_offset + 16, 1, tvb_get_guint8 (tvb, start_offset + 16));
  proto_tree_add_boolean (tmp_tree [16], hf_r3_cpuregisters_rcsta2_ferr,     tvb, start_offset + 16, 1, tvb_get_guint8 (tvb, start_offset + 16));
  proto_tree_add_boolean (tmp_tree [16], hf_r3_cpuregisters_rcsta2_adden,    tvb, start_offset + 16, 1, tvb_get_guint8 (tvb, start_offset + 16));
  proto_tree_add_boolean (tmp_tree [16], hf_r3_cpuregisters_rcsta2_cren,     tvb, start_offset + 16, 1, tvb_get_guint8 (tvb, start_offset + 16));
  proto_tree_add_boolean (tmp_tree [16], hf_r3_cpuregisters_rcsta2_sren,     tvb, start_offset + 16, 1, tvb_get_guint8 (tvb, start_offset + 16));
  proto_tree_add_boolean (tmp_tree [16], hf_r3_cpuregisters_rcsta2_rx9,      tvb, start_offset + 16, 1, tvb_get_guint8 (tvb, start_offset + 16));
  proto_tree_add_boolean (tmp_tree [16], hf_r3_cpuregisters_rcsta2_spen,     tvb, start_offset + 16, 1, tvb_get_guint8 (tvb, start_offset + 16));
  proto_tree_add_boolean (tmp_tree [17], hf_r3_cpuregisters_txsta2_tx9d,     tvb, start_offset + 17, 1, tvb_get_guint8 (tvb, start_offset + 17));
  proto_tree_add_boolean (tmp_tree [17], hf_r3_cpuregisters_txsta2_trmt,     tvb, start_offset + 17, 1, tvb_get_guint8 (tvb, start_offset + 17));
  proto_tree_add_boolean (tmp_tree [17], hf_r3_cpuregisters_txsta2_brgh,     tvb, start_offset + 17, 1, tvb_get_guint8 (tvb, start_offset + 17));
  proto_tree_add_boolean (tmp_tree [17], hf_r3_cpuregisters_txsta2_sendb,    tvb, start_offset + 17, 1, tvb_get_guint8 (tvb, start_offset + 17));
  proto_tree_add_boolean (tmp_tree [17], hf_r3_cpuregisters_txsta2_sync,     tvb, start_offset + 17, 1, tvb_get_guint8 (tvb, start_offset + 17));
  proto_tree_add_boolean (tmp_tree [17], hf_r3_cpuregisters_txsta2_txen,     tvb, start_offset + 17, 1, tvb_get_guint8 (tvb, start_offset + 17));
  proto_tree_add_boolean (tmp_tree [17], hf_r3_cpuregisters_txsta2_tx9,      tvb, start_offset + 17, 1, tvb_get_guint8 (tvb, start_offset + 17));
  proto_tree_add_boolean (tmp_tree [17], hf_r3_cpuregisters_txsta2_csrc,     tvb, start_offset + 17, 1, tvb_get_guint8 (tvb, start_offset + 17));
  proto_tree_add_boolean (tmp_tree [18], hf_r3_cpuregisters_wdtcon_swdten,   tvb, start_offset + 18, 1, tvb_get_guint8 (tvb, start_offset + 18));
  proto_tree_add_boolean (tmp_tree [18], hf_r3_cpuregisters_wdtcon_unused1,  tvb, start_offset + 18, 1, tvb_get_guint8 (tvb, start_offset + 18));
  proto_tree_add_boolean (tmp_tree [18], hf_r3_cpuregisters_wdtcon_unused2,  tvb, start_offset + 18, 1, tvb_get_guint8 (tvb, start_offset + 18));
  proto_tree_add_boolean (tmp_tree [18], hf_r3_cpuregisters_wdtcon_unused3,  tvb, start_offset + 18, 1, tvb_get_guint8 (tvb, start_offset + 18));
  proto_tree_add_boolean (tmp_tree [18], hf_r3_cpuregisters_wdtcon_unused4,  tvb, start_offset + 18, 1, tvb_get_guint8 (tvb, start_offset + 18));
  proto_tree_add_boolean (tmp_tree [18], hf_r3_cpuregisters_wdtcon_unused5,  tvb, start_offset + 18, 1, tvb_get_guint8 (tvb, start_offset + 18));
  proto_tree_add_boolean (tmp_tree [18], hf_r3_cpuregisters_wdtcon_unused6,  tvb, start_offset + 18, 1, tvb_get_guint8 (tvb, start_offset + 18));
  proto_tree_add_boolean (tmp_tree [18], hf_r3_cpuregisters_wdtcon_unused7,  tvb, start_offset + 18, 1, tvb_get_guint8 (tvb, start_offset + 18));
}

static void dissect_r3_upstreammfgfield_taskflags (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  guint l = tvb_length_remaining (tvb, start_offset);
  guint i;

  proto_item *tfg_item = proto_tree_add_text (tree, tvb, start_offset, -1, "Task Flags (%u tasks)", l / 5);
  proto_tree *tfg_tree = proto_item_add_subtree (tfg_item, ett_r3taskflags);

  for (i = 0; i < l; i += 5)
  {
    proto_item *tf_item = proto_tree_add_text (tfg_tree, tvb, start_offset + i, 5, "Task Flags (%2d: 0x%06x)", tvb_get_guint8 (tvb, start_offset + i + 0), tvb_get_letohl (tvb, start_offset + i + 1));
    proto_tree *tf_tree = proto_item_add_subtree (tf_item, ett_r3taskflagsentry);

    proto_tree_add_item (tf_tree, hf_r3_taskflags_taskid, tvb, start_offset + i + 0, 1, TRUE);
    proto_tree_add_item (tf_tree, hf_r3_taskflags_flags, tvb, start_offset + i + 1, 4, TRUE);
  }
}

static void dissect_r3_upstreammfgfield_timerchain (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  guint l = tvb_length_remaining (tvb, start_offset + 3);
  guint i;

  proto_tree_add_item (tree, hf_r3_timerchain_newtick, tvb, start_offset + 0, 2, TRUE);
  proto_tree_add_item (tree, hf_r3_timerchain_currentboundary, tvb, start_offset + 2, 1, TRUE);

  for (start_offset += 3, i = 0; i < l; i += 12)
  {
    proto_item *tc_item = proto_tree_add_text (tree, tvb, start_offset + i, 12, "Timer Chain Entry");
    proto_tree *tc_tree = proto_item_add_subtree (tc_item, ett_r3timerchain);

    proto_tree_add_item (tc_tree, hf_r3_timerchain_tasktag, tvb, start_offset + i + 0, 1, TRUE);
    proto_tree_add_item (tc_tree, hf_r3_timerchain_address, tvb, start_offset + i + 1, 2, TRUE);
    proto_tree_add_item (tc_tree, hf_r3_timerchain_reload, tvb, start_offset + i + 3, 2, TRUE);
    proto_tree_add_item (tc_tree, hf_r3_timerchain_boundary, tvb, start_offset + i + 5, 1, TRUE);
    proto_tree_add_item (tc_tree, hf_r3_timerchain_count, tvb, start_offset + i + 6, 2, TRUE);
    proto_tree_add_item (tc_tree, hf_r3_timerchain_flags, tvb, start_offset + i + 8, 4, TRUE);
  }
}

static void dissect_r3_upstreammfgfield_peekpoke (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  guint i;
  guint l = tvb_length_remaining (tvb, start_offset);

  for (i = 0; i < l; i += 3)
  {
    proto_item *peekpoke_item = proto_tree_add_text (tree, tvb, start_offset + i, 3, "%s", "");
    proto_tree *peekpoke_tree = proto_item_add_subtree (peekpoke_item, ett_r3peekpoke);

    proto_tree_add_item (peekpoke_tree, hf_r3_peekpoke_operation, tvb, start_offset + i + 0, 1, TRUE);
    proto_tree_add_item (peekpoke_tree, hf_r3_peekpoke_address, tvb, start_offset + i + 1, 2, TRUE);

    switch (tvb_get_guint8 (tvb, start_offset + i + 0))
    {
      case PEEKPOKE_READU8 :      
        proto_item_append_text (peekpoke_item, "Read (8 Bits @ 0x%04x = 0x%02x)", tvb_get_letohs (tvb, start_offset + i + 1), tvb_get_guint8 (tvb, start_offset + i + 3));
        proto_item_set_len (peekpoke_item, 4);
        proto_tree_add_item (peekpoke_tree, hf_r3_peekpoke_poke8, tvb, start_offset + i + 3, 1, TRUE); 
        i += 1;
        break; 

      case PEEKPOKE_READU16 :     
        proto_item_append_text (peekpoke_item, "Read (16 Bits @ 0x%04x = 0x%04x)", tvb_get_letohs (tvb, start_offset + i + 1), tvb_get_letohs (tvb, start_offset + i + 3));
        proto_item_set_len (peekpoke_item, 5);
        proto_tree_add_item (peekpoke_tree, hf_r3_peekpoke_poke16, tvb, start_offset + i + 3, 2, TRUE); 
        i += 2; 
        break; 

      case PEEKPOKE_READU24 :     
        proto_item_append_text (peekpoke_item, "Read (24 Bits @ 0x%04x = 0x%06x)", tvb_get_letohs (tvb, start_offset + i + 1), tvb_get_letoh24 (tvb, start_offset + i + 3));
        proto_item_set_len (peekpoke_item, 6);
        proto_tree_add_item (peekpoke_tree, hf_r3_peekpoke_poke24, tvb, start_offset + i + 3, 3, TRUE); 
        i += 3; 
        break; 

      case PEEKPOKE_READU32 :     
        proto_item_append_text (peekpoke_item, "Read (32 Bits @ 0x%04x = 0x%08x)", tvb_get_letohs (tvb, start_offset + i + 1), tvb_get_letohl (tvb, start_offset + i + 3));
        proto_item_set_len (peekpoke_item, 7);
        proto_tree_add_item (peekpoke_tree, hf_r3_peekpoke_poke32, tvb, start_offset + i + 3, 4, TRUE); 
        i += 4; 
        break; 

      case PEEKPOKE_READSTRING :  
        proto_item_append_text (peekpoke_item, "Read (%u Bytes @ 0x%04x)", tvb_get_guint8 (tvb, start_offset + i + 3), tvb_get_letohs (tvb, start_offset + i + 1));
        proto_item_set_len (peekpoke_item, 3 + 1 + tvb_get_guint8 (tvb, start_offset + i + 3));
        proto_tree_add_item (peekpoke_tree, hf_r3_peekpoke_length, tvb, start_offset + i + 3, 1, TRUE); 
        proto_tree_add_item (peekpoke_tree, hf_r3_peekpoke_pokestring, tvb, start_offset + i + 4, tvb_get_guint8 (tvb, start_offset + i + 3), TRUE); 
        i += tvb_get_guint8 (tvb, start_offset + i + 3) + 1; 
        break; 

      default :                   
        DISSECTOR_ASSERT (0); 
    }
  }
}

static void dissect_r3_upstreammfgfield_lockstate (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_item *ls_item = proto_tree_add_text (tree, tvb, start_offset, tvb_length_remaining (tvb, start_offset), "Lock State (0x%06x)", tvb_get_letoh24 (tvb, start_offset));
  proto_tree *ls_tree = proto_item_add_subtree (ls_item, ett_r3lockstate);
  guint ls = tvb_get_letoh24 (tvb, start_offset);

  proto_tree_add_boolean (ls_tree, hf_r3_lockstate_passage, tvb, start_offset, 3, ls);
  proto_tree_add_boolean (ls_tree, hf_r3_lockstate_panic, tvb, start_offset, 3, ls);
  proto_tree_add_boolean (ls_tree, hf_r3_lockstate_lockout, tvb, start_offset, 3, ls);
  proto_tree_add_boolean (ls_tree, hf_r3_lockstate_relock, tvb, start_offset, 3, ls);
  proto_tree_add_boolean (ls_tree, hf_r3_lockstate_autoopen, tvb, start_offset, 3, ls);
  proto_tree_add_boolean (ls_tree, hf_r3_lockstate_nextauto, tvb, start_offset, 3, ls);
  proto_tree_add_boolean (ls_tree, hf_r3_lockstate_lockstate, tvb, start_offset, 3, ls);
  proto_tree_add_boolean (ls_tree, hf_r3_lockstate_wantstate, tvb, start_offset, 3, ls);
  proto_tree_add_boolean (ls_tree, hf_r3_lockstate_remote, tvb, start_offset, 3, ls);
  proto_tree_add_boolean (ls_tree, hf_r3_lockstate_update, tvb, start_offset, 3, ls);
  proto_tree_add_boolean (ls_tree, hf_r3_lockstate_exceptionspresent, tvb, start_offset, 3, ls);
  proto_tree_add_boolean (ls_tree, hf_r3_lockstate_exceptionsactive, tvb, start_offset, 3, ls);
  proto_tree_add_boolean (ls_tree, hf_r3_lockstate_timezonespresent, tvb, start_offset, 3, ls);
  proto_tree_add_boolean (ls_tree, hf_r3_lockstate_timezonesactive, tvb, start_offset, 3, ls);
  proto_tree_add_boolean (ls_tree, hf_r3_lockstate_autounlockspresent, tvb, start_offset, 3, ls);
  proto_tree_add_boolean (ls_tree, hf_r3_lockstate_autounlocksactive, tvb, start_offset, 3, ls);
  proto_tree_add_boolean (ls_tree, hf_r3_lockstate_uapmspresent, tvb, start_offset, 3, ls);
  proto_tree_add_boolean (ls_tree, hf_r3_lockstate_uapmsactive, tvb, start_offset, 3, ls);
  proto_tree_add_boolean (ls_tree, hf_r3_lockstate_uapmrelockspresent, tvb, start_offset, 3, ls);
  proto_tree_add_boolean (ls_tree, hf_r3_lockstate_uapmreslocksactive, tvb, start_offset, 3, ls);
  proto_tree_add_boolean (ls_tree, hf_r3_lockstate_nvramprotect, tvb, start_offset, 3, ls);
  proto_tree_add_boolean (ls_tree, hf_r3_lockstate_nvramchecksum, tvb, start_offset, 3, ls);
}

static void dissect_r3_upstreammfgfield_capabilities (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_item *cf_item = NULL;
  proto_tree *cf_tree= NULL;
  guint l = tvb_length_remaining (tvb, start_offset);
  guint items = 0;
  guint octets;
  guint i;

  i = start_offset;
  while (i < l)
  {
    items++;
    octets = tvb_get_guint8 (tvb, start_offset + i);
    if(!octets)
    {
      cf_item = proto_tree_add_text (tree, tvb, start_offset, l, "Capabilities (unknown items)");
      expert_add_info_format(pinfo, cf_item, PI_MALFORMED, PI_WARN, "Capabilities could not be decoded because length of 0 encountered");
      return;
    }
    i += octets;
  }

  cf_item = proto_tree_add_text (tree, tvb, start_offset, l, "Capabilities (%u items)", items);
  cf_tree = proto_item_add_subtree (cf_item, ett_r3capabilities);

  for (i = start_offset; i < l; i += tvb_get_guint8 (tvb, start_offset + i))
  {
    proto_item *tmp_item = proto_tree_add_item (cf_tree, hf_r3_capabilities, tvb, start_offset + i, tvb_get_guint8 (tvb, start_offset + i), TRUE);
    proto_tree *tmp_tree = proto_item_add_subtree (tmp_item, ett_r3capabilities);
    const gchar *fn;

    fn = val_to_str_const (tvb_get_guint8 (tvb, start_offset + i + 1), r3_capabilitiesnames, "[Unknown Field Name]");

    proto_item_append_text (tmp_item, " (%s, %u)", fn, tvb_get_letohs (tvb, start_offset + i + 2));
    proto_tree_add_item (tmp_tree, hf_r3_capabilities_length, tvb, start_offset + i + 0, 1, TRUE);
    proto_tree_add_item (tmp_tree, hf_r3_capabilities_type, tvb, start_offset + i + 1, 1, TRUE);
    proto_tree_add_item (tmp_tree, hf_r3_capabilities_value, tvb, start_offset + i + 2, 2, TRUE);
  }
}

static void dissect_r3_upstreammfgfield_dumpm41t81 (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo, proto_tree *tree)
{
  proto_item *rtc_item = proto_tree_add_text (tree, tvb, start_offset, -1, "M41T81 RTC Registers");
  proto_tree *rtc_tree = proto_item_add_subtree (rtc_item, ett_r3m41t81registers);
  proto_tree *tmp_tree [20];
  guint offset_in_bits = start_offset * 8;

  if (tvb_length_remaining (tvb, start_offset) != 20)
    expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "Length of M41T81 RTC register dump not 20 octets");
  else
  {
    tmp_tree [ 0] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg00, tvb, start_offset +  0, 1, TRUE), ett_r3m41t81register);
    tmp_tree [ 1] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg01, tvb, start_offset +  1, 1, TRUE), ett_r3m41t81register);
    tmp_tree [ 2] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg02, tvb, start_offset +  2, 1, TRUE), ett_r3m41t81register);
    tmp_tree [ 3] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg03, tvb, start_offset +  3, 1, TRUE), ett_r3m41t81register);
    tmp_tree [ 4] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg04, tvb, start_offset +  4, 1, TRUE), ett_r3m41t81register);
    tmp_tree [ 5] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg05, tvb, start_offset +  5, 1, TRUE), ett_r3m41t81register);
    tmp_tree [ 6] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg06, tvb, start_offset +  6, 1, TRUE), ett_r3m41t81register);
    tmp_tree [ 7] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg07, tvb, start_offset +  7, 1, TRUE), ett_r3m41t81register);
    tmp_tree [ 8] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg08, tvb, start_offset +  8, 1, TRUE), ett_r3m41t81register);
    tmp_tree [ 9] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg09, tvb, start_offset +  9, 1, TRUE), ett_r3m41t81register);
    tmp_tree [10] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg0a, tvb, start_offset + 10, 1, TRUE), ett_r3m41t81register);
    tmp_tree [11] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg0b, tvb, start_offset + 11, 1, TRUE), ett_r3m41t81register);
    tmp_tree [12] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg0c, tvb, start_offset + 12, 1, TRUE), ett_r3m41t81register);
    tmp_tree [13] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg0d, tvb, start_offset + 13, 1, TRUE), ett_r3m41t81register);
    tmp_tree [14] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg0e, tvb, start_offset + 14, 1, TRUE), ett_r3m41t81register);
    tmp_tree [15] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg0f, tvb, start_offset + 15, 1, TRUE), ett_r3m41t81register);
    tmp_tree [16] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg10, tvb, start_offset + 16, 1, TRUE), ett_r3m41t81register);
    tmp_tree [17] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg11, tvb, start_offset + 17, 1, TRUE), ett_r3m41t81register);
    tmp_tree [18] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg12, tvb, start_offset + 18, 1, TRUE), ett_r3m41t81register);
    tmp_tree [19] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg13, tvb, start_offset + 19, 1, TRUE), ett_r3m41t81register);

    proto_tree_add_bits_item (tmp_tree [ 0], hf_r3_dumpm41t81_reg00_sec1,       tvb, offset_in_bits, 4, TRUE);  offset_in_bits += 4;
    proto_tree_add_bits_item (tmp_tree [ 0], hf_r3_dumpm41t81_reg00_sec01,      tvb, offset_in_bits, 4, TRUE);  offset_in_bits += 4;
    proto_tree_add_bits_item (tmp_tree [ 1], hf_r3_dumpm41t81_reg01_st,         tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
    proto_tree_add_bits_item (tmp_tree [ 1], hf_r3_dumpm41t81_reg01_10sec,      tvb, offset_in_bits, 3, TRUE);  offset_in_bits += 3;
    proto_tree_add_bits_item (tmp_tree [ 1], hf_r3_dumpm41t81_reg01_1sec,       tvb, offset_in_bits, 4, TRUE);  offset_in_bits += 4;
    proto_tree_add_bits_item (tmp_tree [ 2], hf_r3_dumpm41t81_reg02_notused,    tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
    proto_tree_add_bits_item (tmp_tree [ 2], hf_r3_dumpm41t81_reg02_10min,      tvb, offset_in_bits, 3, TRUE);  offset_in_bits += 3;
    proto_tree_add_bits_item (tmp_tree [ 2], hf_r3_dumpm41t81_reg02_1min,       tvb, offset_in_bits, 4, TRUE);  offset_in_bits += 4;
    proto_tree_add_bits_item (tmp_tree [ 3], hf_r3_dumpm41t81_reg03_cbe,        tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
    proto_tree_add_bits_item (tmp_tree [ 3], hf_r3_dumpm41t81_reg03_cb,         tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
    proto_tree_add_bits_item (tmp_tree [ 3], hf_r3_dumpm41t81_reg03_10hour,     tvb, offset_in_bits, 2, TRUE);  offset_in_bits += 2;
    proto_tree_add_bits_item (tmp_tree [ 3], hf_r3_dumpm41t81_reg03_1hour,      tvb, offset_in_bits, 4, TRUE);  offset_in_bits += 4;
    proto_tree_add_bits_item (tmp_tree [ 4], hf_r3_dumpm41t81_reg04_notused,    tvb, offset_in_bits, 5, TRUE);  offset_in_bits += 5;
    proto_tree_add_bits_item (tmp_tree [ 4], hf_r3_dumpm41t81_reg04_dow,        tvb, offset_in_bits, 3, TRUE);  offset_in_bits += 3;
    proto_tree_add_bits_item (tmp_tree [ 5], hf_r3_dumpm41t81_reg05_notused,    tvb, offset_in_bits, 2, TRUE);  offset_in_bits += 2;
    proto_tree_add_bits_item (tmp_tree [ 5], hf_r3_dumpm41t81_reg05_10day,      tvb, offset_in_bits, 2, TRUE);  offset_in_bits += 2;
    proto_tree_add_bits_item (tmp_tree [ 5], hf_r3_dumpm41t81_reg05_1day,       tvb, offset_in_bits, 4, TRUE);  offset_in_bits += 4;
    proto_tree_add_bits_item (tmp_tree [ 6], hf_r3_dumpm41t81_reg06_notused,    tvb, offset_in_bits, 3, TRUE);  offset_in_bits += 3;
    proto_tree_add_bits_item (tmp_tree [ 6], hf_r3_dumpm41t81_reg06_10month,    tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
    proto_tree_add_bits_item (tmp_tree [ 6], hf_r3_dumpm41t81_reg06_1month,     tvb, offset_in_bits, 4, TRUE);  offset_in_bits += 4;
    proto_tree_add_bits_item (tmp_tree [ 7], hf_r3_dumpm41t81_reg07_10year,     tvb, offset_in_bits, 4, TRUE);  offset_in_bits += 4;
    proto_tree_add_bits_item (tmp_tree [ 7], hf_r3_dumpm41t81_reg07_1year,      tvb, offset_in_bits, 4, TRUE);  offset_in_bits += 4;
    proto_tree_add_bits_item (tmp_tree [ 8], hf_r3_dumpm41t81_reg08_out,        tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
    proto_tree_add_bits_item (tmp_tree [ 8], hf_r3_dumpm41t81_reg08_ft,         tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
    proto_tree_add_bits_item (tmp_tree [ 8], hf_r3_dumpm41t81_reg08_s,          tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
    proto_tree_add_bits_item (tmp_tree [ 8], hf_r3_dumpm41t81_reg08_cal,        tvb, offset_in_bits, 5, TRUE);  offset_in_bits += 5;
    proto_tree_add_bits_item (tmp_tree [ 9], hf_r3_dumpm41t81_reg09_notused,    tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
    proto_tree_add_bits_item (tmp_tree [ 9], hf_r3_dumpm41t81_reg09_bmb,        tvb, offset_in_bits, 5, TRUE);  offset_in_bits += 5;
    proto_tree_add_bits_item (tmp_tree [ 9], hf_r3_dumpm41t81_reg09_rb,         tvb, offset_in_bits, 2, TRUE);  offset_in_bits += 2;
    proto_tree_add_bits_item (tmp_tree [10], hf_r3_dumpm41t81_reg0a_afe,        tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
    proto_tree_add_bits_item (tmp_tree [10], hf_r3_dumpm41t81_reg0a_sqwe,       tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
    proto_tree_add_bits_item (tmp_tree [10], hf_r3_dumpm41t81_reg0a_abe,        tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
    proto_tree_add_bits_item (tmp_tree [10], hf_r3_dumpm41t81_reg0a_10monthalm, tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
    proto_tree_add_bits_item (tmp_tree [10], hf_r3_dumpm41t81_reg0a_1monthalm,  tvb, offset_in_bits, 4, TRUE);  offset_in_bits += 4;
    proto_tree_add_bits_item (tmp_tree [11], hf_r3_dumpm41t81_reg0b_rpt5,       tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
    proto_tree_add_bits_item (tmp_tree [11], hf_r3_dumpm41t81_reg0b_rpt4,       tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
    proto_tree_add_bits_item (tmp_tree [11], hf_r3_dumpm41t81_reg0b_10dayalm,   tvb, offset_in_bits, 2, TRUE);  offset_in_bits += 2;
    proto_tree_add_bits_item (tmp_tree [11], hf_r3_dumpm41t81_reg0b_1dayalm,    tvb, offset_in_bits, 4, TRUE);  offset_in_bits += 4;
    proto_tree_add_bits_item (tmp_tree [12], hf_r3_dumpm41t81_reg0c_rpt3,       tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
    proto_tree_add_bits_item (tmp_tree [12], hf_r3_dumpm41t81_reg0c_ht,         tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
    proto_tree_add_bits_item (tmp_tree [12], hf_r3_dumpm41t81_reg0c_10houralm,  tvb, offset_in_bits, 2, TRUE);  offset_in_bits += 2;
    proto_tree_add_bits_item (tmp_tree [12], hf_r3_dumpm41t81_reg0c_1houralm,   tvb, offset_in_bits, 4, TRUE);  offset_in_bits += 4;
    proto_tree_add_bits_item (tmp_tree [13], hf_r3_dumpm41t81_reg0d_rpt2,       tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
    proto_tree_add_bits_item (tmp_tree [13], hf_r3_dumpm41t81_reg0d_10minalm,   tvb, offset_in_bits, 3, TRUE);  offset_in_bits += 3;
    proto_tree_add_bits_item (tmp_tree [13], hf_r3_dumpm41t81_reg0d_1minalm,    tvb, offset_in_bits, 4, TRUE);  offset_in_bits += 4;
    proto_tree_add_bits_item (tmp_tree [14], hf_r3_dumpm41t81_reg0e_rpt1,       tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
    proto_tree_add_bits_item (tmp_tree [14], hf_r3_dumpm41t81_reg0e_10secalm,   tvb, offset_in_bits, 3, TRUE);  offset_in_bits += 3;
    proto_tree_add_bits_item (tmp_tree [14], hf_r3_dumpm41t81_reg0e_1secalm,    tvb, offset_in_bits, 4, TRUE);  offset_in_bits += 4;
    proto_tree_add_bits_item (tmp_tree [15], hf_r3_dumpm41t81_reg0f_wdf,        tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
    proto_tree_add_bits_item (tmp_tree [15], hf_r3_dumpm41t81_reg0f_af,         tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
    proto_tree_add_bits_item (tmp_tree [15], hf_r3_dumpm41t81_reg0f_notused,    tvb, offset_in_bits, 6, TRUE);  offset_in_bits += 6;
    proto_tree_add_bits_item (tmp_tree [16], hf_r3_dumpm41t81_reg10_notused,    tvb, offset_in_bits, 8, TRUE);  offset_in_bits += 8;
    proto_tree_add_bits_item (tmp_tree [17], hf_r3_dumpm41t81_reg11_notused,    tvb, offset_in_bits, 8, TRUE);  offset_in_bits += 8;
    proto_tree_add_bits_item (tmp_tree [18], hf_r3_dumpm41t81_reg12_notused,    tvb, offset_in_bits, 8, TRUE);  offset_in_bits += 8;
    proto_tree_add_bits_item (tmp_tree [19], hf_r3_dumpm41t81_reg13_rs,         tvb, offset_in_bits - 8, 4, TRUE);  offset_in_bits += 4;
    proto_tree_add_bits_item (tmp_tree [19], hf_r3_dumpm41t81_reg13_notused,    tvb, offset_in_bits - 8, 4, TRUE);  offset_in_bits += 4;
  }
}

static void dissect_r3_upstreammfgfield_nvramchecksumvalue (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_nvramchecksumvalue, tvb, start_offset + 0, 4, TRUE);
  proto_tree_add_item (tree, hf_r3_nvramchecksumvalue_fixup, tvb, start_offset + 4, 4, TRUE);
}

static void dissect_r3_upstreammfgfield_checksumresults (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo, proto_tree *tree)
{
  proto_item *cksum_item = NULL;
  proto_tree *cksum_tree= NULL;
  guint32 l = tvb_length_remaining (tvb, start_offset);
  guint32 error = FALSE;
  guint32 i;

  if (l % 3 != 0)
    expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "Checksum results data length not modulo 3 == 0");
  else
  {
    for (i = start_offset; i < l; i += tvb_get_guint8 (tvb, start_offset + i))
      error |= tvb_get_guint8 (tvb, start_offset + i + 2);

    cksum_item = proto_tree_add_text (tree, tvb, start_offset, l, "Checksum Results (%s)", error ? "Error" : "No Errors");
    cksum_tree = proto_item_add_subtree (cksum_item, ett_r3checksumresults);

    for (i = 0; i < l; i += tvb_get_guint8 (tvb, start_offset + i))
    {
      proto_item *res_item = proto_tree_add_item (cksum_tree, hf_r3_checksumresults, tvb, start_offset + i, tvb_get_guint8 (tvb, start_offset + i), TRUE);
      proto_tree *res_tree = proto_item_add_subtree (res_item, ett_r3checksumresultsfield);
      const gchar *fn;

      fn = val_to_str_const (tvb_get_guint8 (tvb, start_offset + i + 1), r3_checksumresultnames, "[Unknown Field Name]");

      proto_item_append_text (res_item, " %s (%s)", fn, tvb_get_guint8 (tvb, start_offset + i + 2) ? "Error" : "No Error");

      proto_tree_add_item (res_tree, hf_r3_checksumresults_length, tvb, start_offset + i + 0, 1, TRUE);
      proto_tree_add_item (res_tree, hf_r3_checksumresults_field, tvb, start_offset + i + 1, 1, TRUE);
      proto_tree_add_item (res_tree, hf_r3_checksumresults_state, tvb, start_offset + i + 2, 1, TRUE);
    }
  }
}

static void dissect_r3_upstreammfgfield_mortisestatelog (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  guint l = tvb_length_remaining (tvb, start_offset + 3);
  guint i = 0;

  proto_tree_add_item (tree, hf_r3_mortisestatelog_pointer, tvb, start_offset + 0, 1, TRUE);
  proto_tree_add_item (tree, hf_r3_mortisestatelog_mortisetype, tvb, start_offset + 1, 1, TRUE);
  proto_tree_add_item (tree, hf_r3_mortisestatelog_waiting, tvb, start_offset + 2, 1, TRUE);

  for (start_offset += 3, i = 0; i < l; i += 3)
  {
    guint state = tvb_get_guint8 (tvb, start_offset + i + 0);
    guint last = tvb_get_guint8 (tvb, start_offset + i + 1);
    guint event = tvb_get_guint8 (tvb, start_offset + i + 2);
    proto_item *ms_item = proto_tree_add_text (tree, tvb, start_offset + i, 3, "State Log Entry %2d (State=0x%02x, Last=0x%02x, Event=%s (0x%02x))", i / 3, state, last, val_to_str_const (event, r3_mortiseeventnames, "[Unknown]"), event);
    proto_tree *ms_tree = proto_item_add_subtree (ms_item, ett_r3mortisestatelog);

    proto_tree_add_item (ms_tree, hf_r3_mortisestatelog_state, tvb, start_offset + i + 0, 1, TRUE);
    proto_tree_add_item (ms_tree, hf_r3_mortisestatelog_last, tvb, start_offset + i + 1, 1, TRUE);
    proto_tree_add_item (ms_tree, hf_r3_mortisestatelog_event, tvb, start_offset + i + 2, 1, TRUE);
  }
}

static void dissect_r3_upstreammfgfield_mortisepins (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_item *iopins_item = proto_tree_add_text (tree, tvb, start_offset, 1, "Mortise Pin States (0x%02x)", tvb_get_guint8 (tvb, start_offset));
  proto_tree *iopins_tree = proto_item_add_subtree (iopins_item, ett_r3iopins);

  proto_tree_add_boolean (iopins_tree, hf_r3_mortisepins_s1, tvb, start_offset, 1, tvb_get_guint8 (tvb, start_offset));
  proto_tree_add_boolean (iopins_tree, hf_r3_mortisepins_s2, tvb, start_offset, 1, tvb_get_guint8 (tvb, start_offset));
  proto_tree_add_boolean (iopins_tree, hf_r3_mortisepins_s3, tvb, start_offset, 1, tvb_get_guint8 (tvb, start_offset));
  proto_tree_add_boolean (iopins_tree, hf_r3_mortisepins_s4, tvb, start_offset, 1, tvb_get_guint8 (tvb, start_offset));
}

static void dissect_r3_upstreammfgfield_keypadchar (tvbuff_t *tvb, guint32 start_offset _U_, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_item_append_text (proto_tree_add_item (tree, hf_r3_testkeypad, tvb, 0, 1, TRUE), " ('%c')", tvb_get_guint8 (tvb, 0));
}

static void dissect_r3_upstreammfgfield_magcard (tvbuff_t *tvb, guint32 start_offset _U_, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_testmagcard, tvb, 0, -1, TRUE);
}

static void dissect_r3_upstreammfgfield_proxcard (tvbuff_t *tvb, guint32 start_offset _U_, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_testproxcard, tvb, 0, -1, TRUE);
}

/*
 * ***************************************************************************
 *
 *  This is passed a tvb that contains [length] [CMD_RESPONSE] [responseType_e] [cmdCommand_e]
 */
static void dissect_r3_response_singlebyte (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_responsetype, tvb, start_offset + 2, 1, TRUE);
  proto_tree_add_item (tree, hf_r3_responsetocommand, tvb, start_offset + 3, 1, TRUE);
}

/*
 *  This is passed a tvb that contains [length] [CMD_RESPONSE] [RESPONSETYPE_HASDATA] [UPSTREAMCOMMAND_*]
 */
static void dissect_r3_response_hasdata (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo, proto_tree *tree)
{
  proto_item *upstreamcommand_item = NULL;
  proto_tree *upstreamcommand_tree = NULL;
  tvbuff_t *upstreamcommand_tvb;
  guint32 commandPacketLen;
  const gchar *ct = NULL;

  tvb_ensure_bytes_exist (tvb, start_offset, 4);
  commandPacketLen = tvb_get_guint8 (tvb, 0);
  upstreamcommand_tvb = tvb_new_subset (tvb, 4, commandPacketLen - 4, commandPacketLen - 4);

  if (tvb_get_guint8 (tvb, 1) != CMD_RESPONSE)
    expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "Octet 1 not CMD_RESPONSE");
  else if (tvb_get_guint8 (tvb, 2) != RESPONSETYPE_HASDATA)
    expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "Octet 2 not RESPONSE_HASDATA");
  else if (tvb_get_guint8 (tvb, 3) >= UPSTREAMCOMMAND_LAST)
    expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "Octet 3 >= UPSTREAMCOMMAND_LAST");
  else
  {
    ct = val_to_str_const (tvb_get_guint8 (tvb, 3), r3_upstreamcommandnames, "[Unknown Command Type]");

    proto_tree_add_item (tree, hf_r3_responsetype, tvb, 2, 1, TRUE);

    upstreamcommand_item = proto_tree_add_text (tree, tvb, 3, -1, "Upstream Command: %s (%u)", ct, tvb_get_guint8 (tvb, 3));
    upstreamcommand_tree = proto_item_add_subtree (upstreamcommand_item, ett_r3upstreamcommand);

    proto_tree_add_item (upstreamcommand_tree, hf_r3_upstreamcommand, tvb, 3, 1, TRUE); 

    tvb_ensure_bytes_exist (tvb, start_offset, commandPacketLen - 4);

    if (r3upstreamcommand_dissect [tvb_get_guint8 (tvb, 3)].dissector)
      (*r3upstreamcommand_dissect [tvb_get_guint8 (tvb, 3)].dissector) (upstreamcommand_tvb, 0, commandPacketLen - 4, pinfo, upstreamcommand_tree);
  }
}

/*
 * ***************************************************************************
 *
 *  These are passed a tvb that starts with [length] [CMD_RESPONSE] ...
 */
static void dissect_r3_cmd_response (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree)
{
  guint8 responseLen = tvb_get_guint8 (tvb, start_offset + 0);
  responseType_e responseType = tvb_get_guint8 (tvb, start_offset + 2);
  tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset, responseLen, responseLen);
  const gchar *rt = NULL;

  rt = val_to_str_const (responseType, r3_responsetypenames, "[Unknown Response Type]");

  proto_item_set_text (proto_tree_get_parent (tree), "Response Packet: %s (%u)", rt, responseType);
  proto_tree_add_item (tree, hf_r3_responselength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_responsecommand, tvb, start_offset + 1, 1, TRUE);

  if (tvb_get_guint8 (tvb, start_offset + 2) >= RESPONSETYPE_LAST)
    expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "Octet 3 >= UPSTREAMCOMMAND_LAST");
  else if (r3response_dissect [responseType].dissector)
    (*r3response_dissect [responseType].dissector) (payload_tvb, 0, length, pinfo, tree);
}

/*
 *  These are passed a tvb that contains [length] [cmdCommand_e] [[data]]
 */
static void dissect_r3_cmd_handshake (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
}

static void dissect_r3_cmd_killsession (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
}

static void dissect_r3_cmd_queryserialnumber (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
}

static void dissect_r3_cmd_queryversion (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
}

static void dissect_r3_cmd_setdatetime (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree *dt_tree = NULL;
  proto_item *dt_item = NULL;
  guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
  tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);

  proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);

  dt_item = proto_tree_add_text (tree, payload_tvb, 0, -1, "Set Date/Time (%02u/%02u/%02u-%u %02u:%02u:%02u)", tvb_get_guint8 (payload_tvb, 0), tvb_get_guint8 (payload_tvb, 1), tvb_get_guint8 (payload_tvb, 2), tvb_get_guint8 (payload_tvb, 3), tvb_get_guint8 (payload_tvb, 4), tvb_get_guint8 (payload_tvb, 5), tvb_get_guint8 (payload_tvb, 6));
  dt_tree = proto_item_add_subtree (dt_item, ett_r3setdatetime);

  proto_tree_add_item (dt_tree, hf_r3_setdate_year, payload_tvb, 0, 1, TRUE);
  proto_tree_add_item (dt_tree, hf_r3_setdate_month, payload_tvb, 1, 1, TRUE);
  proto_tree_add_item (dt_tree, hf_r3_setdate_day, payload_tvb, 2, 1, TRUE);
  proto_tree_add_item (dt_tree, hf_r3_setdate_dow, payload_tvb, 3, 1, TRUE);
  proto_tree_add_item (dt_tree, hf_r3_setdate_hours, payload_tvb, 4, 1, TRUE);
  proto_tree_add_item (dt_tree, hf_r3_setdate_minutes, payload_tvb, 5, 1, TRUE);
  proto_tree_add_item (dt_tree, hf_r3_setdate_seconds, payload_tvb, 6, 1, TRUE);
}

static void dissect_r3_cmd_querydatetime (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
}

static void dissect_r3_cmd_setconfig (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
  tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);
  guint32 offset = 0;

  proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);

  while (offset < tvb_reported_length (payload_tvb))
  {
    proto_item *sc_item = NULL;
    proto_tree *sc_tree = NULL;
    const gchar *ci = NULL;

    ci = val_to_str_const (tvb_get_guint8 (payload_tvb, offset + 1), r3_configitemnames,  "[Unknown Configuration Item]");

    sc_item = proto_tree_add_text (tree, payload_tvb, offset + 0, tvb_get_guint8 (payload_tvb, offset + 0), "Config Field: %s (%u)", ci, tvb_get_guint8 (payload_tvb, offset + 1));
    sc_tree = proto_item_add_subtree (sc_item, ett_r3upstreamfield);

    proto_tree_add_item (sc_tree, hf_r3_configitemlength, payload_tvb, offset + 0, 1, TRUE);
    proto_tree_add_item (sc_tree, hf_r3_configitem, payload_tvb, offset + 1, 1, TRUE);

    if (tvb_get_guint8 (payload_tvb, offset + 1) < array_length (configMap))
    {
      switch (configMap [tvb_get_guint8 (payload_tvb, offset + 1)].configType)
      {
        case CONFIGTYPE_NONE :
          proto_tree_add_item (sc_tree, hf_r3_configitemdata, payload_tvb, offset + 2, tvb_get_guint8 (payload_tvb, offset + 0) - 3, TRUE);
          break;

        case CONFIGTYPE_BOOL :
          proto_tree_add_item (sc_tree, hf_r3_configitemdata_bool, payload_tvb, offset + 2, 1, TRUE);
          break;

        case CONFIGTYPE_8 :
          proto_tree_add_item (sc_tree, hf_r3_configitemdata_8, payload_tvb, offset + 2, 1, TRUE);
          break;

        case CONFIGTYPE_16 :
          proto_tree_add_item (sc_tree, hf_r3_configitemdata_16, payload_tvb, offset + 2, 2, TRUE);
          break;

        case CONFIGTYPE_32 :
          proto_tree_add_item (sc_tree, hf_r3_configitemdata_32, payload_tvb, offset + 2, 4, TRUE);
          break;

        case CONFIGTYPE_STRING :
          proto_tree_add_item (sc_tree, hf_r3_configitemdata_string, payload_tvb, offset + 2, tvb_get_guint8 (payload_tvb, offset + 0) - 2, TRUE);
          break;

        default :
          proto_tree_add_none_format (sc_tree, hf_r3_upstreamfielderror, payload_tvb, offset + 2, tvb_get_guint8 (payload_tvb, offset + 0) - 2, "Unknown Field Type");
          break;
      }
    }
    else
      proto_tree_add_text (sc_tree, payload_tvb, offset + 2, tvb_get_guint8 (payload_tvb, offset + 0) - 2, "[Unknown Field Type]");

    offset += tvb_get_guint8 (payload_tvb, offset + 0);
  }
}

static void dissect_r3_cmd_getconfig (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_item *config_item = NULL;
  proto_tree *config_tree = NULL;
  guint32 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
  guint32 i;

  proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);

  config_item = proto_tree_add_item (tree, hf_r3_configitems, tvb, start_offset + 2, cmdLen - 2, TRUE); 
  config_tree = proto_item_add_subtree (config_item, ett_r3configitem);

  for (i = 2; i < cmdLen; i++)
    proto_tree_add_item (config_tree, hf_r3_configitem, tvb, start_offset + i, 1, TRUE);
}

static void dissect_r3_cmd_manageuser (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo, proto_tree *tree)
{
  guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
  tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);
  guint32 offset = 0;

  proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);

  while (offset < tvb_reported_length (payload_tvb))
  {
    guint32 paramLength = tvb_get_guint8 (payload_tvb, offset + 0);
    guint32 paramType = tvb_get_guint8 (payload_tvb, offset + 1);
    guint32 dataLength = paramLength - 2;
    proto_tree *mu_tree = NULL;
    const gchar *auptn = NULL;

    auptn = val_to_str_const (paramType, r3_adduserparamtypenames, "[Unknown Field]");

    mu_tree = proto_item_add_subtree (proto_tree_add_none_format (tree, hf_r3_adduserparamtype, payload_tvb, offset + 0, paramLength, "Manage User Field: %s (%u)", auptn, paramType), ett_r3manageuser);

    proto_tree_add_item (mu_tree, hf_r3_adduserparamtypelength, payload_tvb, offset + 0, 1, TRUE);
    proto_tree_add_item (mu_tree, hf_r3_adduserparamtypetype, payload_tvb, offset + 1, 1, TRUE);

    offset += 2;

    switch (paramType)
    {
      case ADDUSERPARAMTYPE_DISPOSITION :
      case ADDUSERPARAMTYPE_ACCESSALWAYS :
      case ADDUSERPARAMTYPE_ACCESSMODE :
      case ADDUSERPARAMTYPE_CACHED :
      case ADDUSERPARAMTYPE_USERTYPE :
      case ADDUSERPARAMTYPE_PRIMARYFIELDTYPE :
      case ADDUSERPARAMTYPE_AUXFIELDTYPE :
      case ADDUSERPARAMTYPE_USECOUNT :
      case ADDUSERPARAMTYPE_EXCEPTIONGROUP :
        if (dataLength != 1)
          expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "Malformed field -- expected 1 octet");
        else
          proto_tree_add_item (mu_tree, hf_r3_adduserparamtypearray [paramType], payload_tvb, offset, dataLength, TRUE);
        break;

      case ADDUSERPARAMTYPE_USERNO :
        if (dataLength != 2)
          expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "Malformed field -- expected 2 octets");
        else
          proto_tree_add_item (mu_tree, hf_r3_adduserparamtypearray [paramType], payload_tvb, offset, dataLength, TRUE);
        break;

      case ADDUSERPARAMTYPE_PRIMARYFIELD :
      case ADDUSERPARAMTYPE_AUXFIELD :
        proto_tree_add_item (mu_tree, hf_r3_adduserparamtypearray [paramType], payload_tvb, offset, dataLength, TRUE);
        break;

      case ADDUSERPARAMTYPE_EXPIREON :
        {
          proto_item *expireon_item = NULL;
          proto_tree *expireon_tree = NULL;

          if (dataLength != 3)
            expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "Malformed expiration field -- expected 3 octets");
          else
          {
            expireon_item = proto_tree_add_text (mu_tree, payload_tvb, offset, 3, "Expire YY/MM/DD: %02u/%02u/%02u",
                tvb_get_guint8 (payload_tvb, offset + 2), tvb_get_guint8 (payload_tvb, offset + 0), tvb_get_guint8 (payload_tvb, offset + 1));
            expireon_tree = proto_item_add_subtree (expireon_item, ett_r3expireon);

            proto_tree_add_item (expireon_tree, hf_r3_expireon_month, payload_tvb, offset + 0, 1, TRUE);
            proto_tree_add_item (expireon_tree, hf_r3_expireon_day, payload_tvb, offset + 1, 1, TRUE);
            proto_tree_add_item (expireon_tree, hf_r3_expireon_year, payload_tvb, offset + 2, 1, TRUE);
          }
        }
        break;

      case ADDUSERPARAMTYPE_TIMEZONE :
        {
          guint32 i;
          guint32 tz;
          proto_item *timezone_item = NULL;
          proto_tree *timezone_tree = NULL;

          if (dataLength != 4)
            expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "Malformed timezone field -- expected 4 octets");
          else
          {
            tz = tvb_get_letohl (payload_tvb, offset);
            timezone_item = proto_tree_add_item (mu_tree, hf_r3_upstreamfieldarray [paramType], payload_tvb, offset, 4, TRUE);
            timezone_tree = proto_item_add_subtree (timezone_item, ett_r3timezone);

            for (i = 0; i < 32; i++)
              proto_tree_add_boolean (timezone_tree, hf_r3_timezonearray [i], payload_tvb, offset, 4, tz);
          }
        }
        break;

      default :
        proto_tree_add_string (mu_tree, hf_r3_upstreamfielderror, payload_tvb, offset, dataLength, "Unknown Field Type");
        break;
    }

    offset += dataLength;
  }
}

static void dissect_r3_cmd_deleteusers (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
  tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);

  proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
  proto_tree_add_item (tree, hf_r3_deleteusers, payload_tvb, 0, 1, TRUE);
}

static void dissect_r3_cmd_defineexception (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_item *startdate_item = NULL;
  proto_tree *startdate_tree = NULL;
  proto_item *enddate_item = NULL;
  proto_tree *enddate_tree = NULL;
  guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
  tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);

  proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
  proto_tree_add_item (tree, hf_r3_defineexception_number, payload_tvb, 0, 1, TRUE);

  startdate_item = proto_tree_add_text (tree, payload_tvb, 1, 4, "Start MM/DD HH:MM (%02u/%02u %02u:%02u)", tvb_get_guint8 (payload_tvb, 1), tvb_get_guint8 (payload_tvb, 2), tvb_get_guint8 (payload_tvb, 3), tvb_get_guint8 (payload_tvb, 4));
  startdate_tree = proto_item_add_subtree (startdate_item, ett_r3defineexceptionstartdate);
  proto_tree_add_item (startdate_tree, hf_r3_defineexception_startdate_month, payload_tvb, 1, 1, TRUE);
  proto_tree_add_item (startdate_tree, hf_r3_defineexception_startdate_day, payload_tvb, 2, 1, TRUE);
  proto_tree_add_item (startdate_tree, hf_r3_defineexception_startdate_hours, payload_tvb, 3, 1, TRUE);
  proto_tree_add_item (startdate_tree, hf_r3_defineexception_startdate_minutes, payload_tvb, 4, 1, TRUE);

  enddate_item = proto_tree_add_text (tree, payload_tvb, 5, 4, "End MM/DD HH:MM (%02u/%02u %02u:%02u)", tvb_get_guint8 (payload_tvb, 5), tvb_get_guint8 (payload_tvb, 6), tvb_get_guint8 (payload_tvb, 7), tvb_get_guint8 (payload_tvb, 8));
  enddate_tree = proto_item_add_subtree (enddate_item, ett_r3defineexceptionenddate);
  proto_tree_add_item (enddate_tree, hf_r3_defineexception_enddate_month, payload_tvb, 5, 1, TRUE);
  proto_tree_add_item (enddate_tree, hf_r3_defineexception_enddate_day, payload_tvb, 6, 1, TRUE);
  proto_tree_add_item (enddate_tree, hf_r3_defineexception_enddate_hours, payload_tvb, 7, 1, TRUE);
  proto_tree_add_item (enddate_tree, hf_r3_defineexception_enddate_minutes, payload_tvb, 8, 1, TRUE);
}

static void dissect_r3_cmd_defineexceptiongroup (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_item *bits_item = NULL;
  proto_tree *bits_tree = NULL;
  guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
  tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);
  guint32 i = 0;
  guint32 bit = 0;

  proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
  proto_tree_add_item (tree, hf_r3_defineexceptiongroup_number, payload_tvb, 0, 1, TRUE);

  bits_item = proto_tree_add_text (tree, payload_tvb, 1, -1, "Exception Group Bit Field");
  bits_tree = proto_item_add_subtree (bits_item, ett_r3defineexceptiongroupbits);

  for (i = 1; i < tvb_reported_length (payload_tvb); i++)
  {
    guint32 j;
    guint8 byte = tvb_get_guint8 (payload_tvb, i);

    for (j = 0; j < 8; j++)
      proto_tree_add_none_format (bits_tree, hf_r3_defineexceptiongroup_bits, payload_tvb, i, 1, "Exception Group %2d: %s", bit++, (byte & (1 << j)) ? "Enabled" : "Disabled");
  }
}

static void dissect_r3_cmd_definecalendar (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
  tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);
  const gchar *mn;
  guint32 i;

  proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
  proto_tree_add_item (tree, hf_r3_definecalendar_number, payload_tvb, 0, 1, TRUE);

  for (i = 0; i < 12; i++)
  {
    guint32 daymap = tvb_get_letohl (payload_tvb, (i * 4) + 1);
    proto_item *calendar_item = proto_tree_add_text (tree, payload_tvb, (i * 4) + 1, 4, "Calendar Bit Field - %s (0x%08x)", (mn = val_to_str_const (i + 1, r3_monthnames, "[Unknown Month]")), daymap);
    proto_tree *calendar_tree = proto_item_add_subtree (calendar_item, ett_r3definecalendarmonth [i + 1]);
    guint32 j;

    for (j = 0; j < 31; j++)
      proto_tree_add_none_format (calendar_tree, hf_r3_definecalendar_bits, payload_tvb, (i * 4) + 1, 4, "%s Of %s: %s", val_to_str_const (j + 1, r3_monthdaynames, "[Unknown Day]"), mn, (daymap & (1 << j)) ? "Enabled" : "Disabled");
  }
}

static void dissect_r3_cmd_definetimezone (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_item *starttime_item = NULL;
  proto_tree *starttime_tree = NULL;
  proto_item *endtime_item = NULL;
  proto_tree *endtime_tree = NULL;
  proto_item *daymap_item = NULL;
  proto_tree *daymap_tree = NULL;
  guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
  tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);
  guint32 i;
  guint8 tzmode;

  proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
  proto_tree_add_item (tree, hf_r3_definetimezone_number, payload_tvb, 0, 1, TRUE);

  starttime_item = proto_tree_add_text (tree, payload_tvb, 1, 2, "Start HH:MM (%02u:%02u)", tvb_get_guint8 (payload_tvb, 1), tvb_get_guint8 (payload_tvb, 2));
  starttime_tree = proto_item_add_subtree (starttime_item, ett_r3definetimezonestarttime);
  proto_tree_add_item (starttime_tree, hf_r3_definetimezone_starttime_hours, payload_tvb, 1, 1, TRUE);
  proto_tree_add_item (starttime_tree, hf_r3_definetimezone_starttime_minutes, payload_tvb, 2, 1, TRUE);

  endtime_item = proto_tree_add_text (tree, payload_tvb, 3, 2, "End HH:MM (%02u:%02u)", tvb_get_guint8 (payload_tvb, 3), tvb_get_guint8 (payload_tvb, 4));
  endtime_tree = proto_item_add_subtree (endtime_item, ett_r3definetimezoneendtime);
  proto_tree_add_item (endtime_tree, hf_r3_definetimezone_endtime_hours, payload_tvb, 3, 1, TRUE);
  proto_tree_add_item (endtime_tree, hf_r3_definetimezone_endtime_minutes, payload_tvb, 4, 1, TRUE);

  daymap_item = proto_tree_add_text (tree, payload_tvb, 5, 1, "Day Map (0x%02x)", tvb_get_guint8 (payload_tvb, 5));
  daymap_tree = proto_item_add_subtree (daymap_item, ett_r3definetimezonedaymap);

  for (i = 0; i < 7; i++)
    proto_tree_add_boolean (daymap_tree, hf_r3_definetimezone_daymap [i], payload_tvb, 5, 1, tvb_get_guint8 (payload_tvb, 5));

  proto_tree_add_item (tree, hf_r3_definetimezone_exceptiongroup, payload_tvb, 6, 1, TRUE);
  proto_tree_add_uint (tree, hf_r3_definetimezone_mode, payload_tvb, 7, 1, (tzmode = tvb_get_guint8 (payload_tvb, 7)) & 0x0f);
  proto_tree_add_none_format (tree, hf_r3_definetimezone_calendar, payload_tvb, 7, 1, "Access Always: %s", (tzmode & 0x10) ? "True" : "False");
}

static void dissect_r3_cmd_rmtauthretry (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
  tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);

  proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
  proto_tree_add_item (tree, hf_r3_rmtauthretry_sequence, payload_tvb, 0, 2, TRUE);
  proto_tree_add_item (tree, hf_r3_rmtauthretry_retry, payload_tvb, 2, 1, TRUE);
}

static void dissect_r3_cmd_filters (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_item *filter_item = NULL;
  proto_tree *filter_tree = NULL;
  guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
  tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);
  guint32 i;

  proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
  proto_tree_add_item (tree, hf_r3_filter_type, payload_tvb, 1, 1, TRUE);

  filter_item = proto_tree_add_text (tree, payload_tvb, 2, -1, "Filters (%u specified)", tvb_get_guint8 (payload_tvb, 0));
  filter_tree = proto_item_add_subtree (filter_item, ett_r3filters);

  for (i = 0; i < tvb_get_guint8 (payload_tvb, 0); i++)
    proto_tree_add_item (filter_tree, hf_r3_filter_list, payload_tvb, i + 2, 1, TRUE);
}

static void dissect_r3_cmd_alarmconfigure (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_item *alarm_item = NULL;
  proto_tree *alarm_tree = NULL;
  guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
  tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);
  guint32 offset = 0;
  guint32 alarms = 0;

  proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);

  alarm_item = proto_tree_add_text (tree, payload_tvb, 0, -1, "Alarm List (0 items)");
  alarm_tree = proto_item_add_subtree (alarm_item, ett_r3alarmlist);

  while (offset < tvb_reported_length (payload_tvb))
  {
    proto_item *alarmcfg_item = NULL;
    proto_tree *alarmcfg_tree = NULL;
    const gchar *ai;
    const gchar *as;

    if (!(ai = match_strval (tvb_get_guint8 (payload_tvb, offset + 1), r3_alarmidnames)))
    {
      ai = "[Unknown Alarm ID]";
      as = "N/A";
    }
    else
      as = (tvb_get_guint8 (payload_tvb, offset + 2) & 0xfe) ? "Error" : (tvb_get_guint8 (payload_tvb, offset + 2) & 0x01) ? "Enabled" : "Disabled";

    alarmcfg_item = proto_tree_add_text (alarm_tree, payload_tvb, offset, tvb_get_guint8 (payload_tvb, offset), "Alarm Item (%s, %s)", ai, as);
    alarmcfg_tree = proto_item_add_subtree (alarmcfg_item, ett_r3alarmcfg);

    proto_tree_add_item (alarmcfg_tree, hf_r3_alarm_length, payload_tvb, offset + 0, 1, TRUE);
    proto_tree_add_item (alarmcfg_tree, hf_r3_alarm_id, payload_tvb, offset + 1, 1, TRUE);
    proto_tree_add_item (alarmcfg_tree, hf_r3_alarm_state, payload_tvb, offset + 2, 1, TRUE);

    alarms++;
    offset += tvb_get_guint8 (payload_tvb, offset);
  }

  if (alarms)
    proto_item_set_text (alarm_item, "Alarm List (%d items)", alarms);
}

static void dissect_r3_cmd_eventlogdump (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_item *starttime_item = NULL;
  proto_tree *starttime_tree = NULL;
  proto_item *endtime_item = NULL;
  proto_tree *endtime_tree = NULL;
  guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
  tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);

  proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);

  starttime_item = proto_tree_add_text (tree, payload_tvb, 0, 5, "Start YY/MM/DD HH:MM (%02u/%02u/%02u %02u:%02u)", tvb_get_guint8 (payload_tvb, 0), tvb_get_guint8 (payload_tvb, 1), tvb_get_guint8 (payload_tvb, 2), tvb_get_guint8 (payload_tvb, 3), tvb_get_guint8 (payload_tvb, 4));
  starttime_tree = proto_item_add_subtree (starttime_item, ett_r3eventlogdumpstarttime);
  proto_tree_add_item (starttime_tree, hf_r3_eventlogdump_starttime_year, payload_tvb, 0, 1, TRUE);
  proto_tree_add_item (starttime_tree, hf_r3_eventlogdump_starttime_month, payload_tvb, 1, 1, TRUE);
  proto_tree_add_item (starttime_tree, hf_r3_eventlogdump_starttime_day, payload_tvb, 2, 1, TRUE);
  proto_tree_add_item (starttime_tree, hf_r3_eventlogdump_starttime_hours, payload_tvb, 3, 1, TRUE);
  proto_tree_add_item (starttime_tree, hf_r3_eventlogdump_starttime_minutes, payload_tvb, 4, 1, TRUE);

  endtime_item = proto_tree_add_text (tree, payload_tvb, 5, 5, "End YY/MM/DD HH:MM (%02u/%02u/%02u %02u:%02u)", tvb_get_guint8 (payload_tvb, 5), tvb_get_guint8 (payload_tvb, 6), tvb_get_guint8 (payload_tvb, 7), tvb_get_guint8 (payload_tvb, 8), tvb_get_guint8 (payload_tvb, 9));
  endtime_tree = proto_item_add_subtree (endtime_item, ett_r3eventlogdumpendtime);
  proto_tree_add_item (endtime_tree, hf_r3_eventlogdump_endtime_year, payload_tvb, 5, 1, TRUE);
  proto_tree_add_item (endtime_tree, hf_r3_eventlogdump_endtime_month, payload_tvb, 6, 1, TRUE);
  proto_tree_add_item (endtime_tree, hf_r3_eventlogdump_endtime_day, payload_tvb, 7, 1, TRUE);
  proto_tree_add_item (endtime_tree, hf_r3_eventlogdump_endtime_hours, payload_tvb, 8, 1, TRUE);
  proto_tree_add_item (endtime_tree, hf_r3_eventlogdump_endtime_minutes, payload_tvb, 9, 1, TRUE);

  proto_tree_add_item (tree, hf_r3_eventlogdump_user, payload_tvb, 10, 2, TRUE);
}

static void dissect_r3_cmd_declinedlogdump (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_item *starttime_item = NULL;
  proto_tree *starttime_tree = NULL;
  proto_item *endtime_item = NULL;
  proto_tree *endtime_tree = NULL;
  guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
  tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);

  proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);

  starttime_item = proto_tree_add_text (tree, payload_tvb, 0, 5, "Start YY/MM/DD HH:MM (%02u/%02u/%02u %02u:%02u)", tvb_get_guint8 (payload_tvb, 0), tvb_get_guint8 (payload_tvb, 1), tvb_get_guint8 (payload_tvb, 2), tvb_get_guint8 (payload_tvb, 3), tvb_get_guint8 (payload_tvb, 4));
  starttime_tree = proto_item_add_subtree (starttime_item, ett_r3declinedlogdumpstarttime);
  proto_tree_add_item (starttime_tree, hf_r3_declinedlogdump_starttime_year, payload_tvb, 0, 1, TRUE);
  proto_tree_add_item (starttime_tree, hf_r3_declinedlogdump_starttime_month, payload_tvb, 1, 1, TRUE);
  proto_tree_add_item (starttime_tree, hf_r3_declinedlogdump_starttime_day, payload_tvb, 2, 1, TRUE);
  proto_tree_add_item (starttime_tree, hf_r3_declinedlogdump_starttime_hours, payload_tvb, 3, 1, TRUE);
  proto_tree_add_item (starttime_tree, hf_r3_declinedlogdump_starttime_minutes, payload_tvb, 4, 1, TRUE);

  endtime_item = proto_tree_add_text (tree, payload_tvb, 5, 5, "End YY/MM/DD HH:MM (%02u/%02u/%02u %02u:%02u)", tvb_get_guint8 (payload_tvb, 5), tvb_get_guint8 (payload_tvb, 6), tvb_get_guint8 (payload_tvb, 7), tvb_get_guint8 (payload_tvb, 8), tvb_get_guint8 (payload_tvb, 9));
  endtime_tree = proto_item_add_subtree (endtime_item, ett_r3declinedlogdumpendtime);
  proto_tree_add_item (endtime_tree, hf_r3_declinedlogdump_endtime_year, payload_tvb, 5, 1, TRUE);
  proto_tree_add_item (endtime_tree, hf_r3_declinedlogdump_endtime_month, payload_tvb, 6, 1, TRUE);
  proto_tree_add_item (endtime_tree, hf_r3_declinedlogdump_endtime_day, payload_tvb, 7, 1, TRUE);
  proto_tree_add_item (endtime_tree, hf_r3_declinedlogdump_endtime_hours, payload_tvb, 8, 1, TRUE);
  proto_tree_add_item (endtime_tree, hf_r3_declinedlogdump_endtime_minutes, payload_tvb, 9, 1, TRUE);
}

static void dissect_r3_cmd_alarmlogdump (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_item *starttime_item = NULL;
  proto_tree *starttime_tree = NULL;
  proto_item *endtime_item = NULL;
  proto_tree *endtime_tree = NULL;
  guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
  tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);

  proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);

  starttime_item = proto_tree_add_text (tree, payload_tvb, 0, 5, "Start YY/MM/DD HH:MM (%02u/%02u/%02u %02u:%02u)", tvb_get_guint8 (payload_tvb, 0), tvb_get_guint8 (payload_tvb, 1), tvb_get_guint8 (payload_tvb, 2), tvb_get_guint8 (payload_tvb, 3), tvb_get_guint8 (payload_tvb, 4));
  starttime_tree = proto_item_add_subtree (starttime_item, ett_r3alarmlogdumpstarttime);
  proto_tree_add_item (starttime_tree, hf_r3_alarmlogdump_starttime_year, payload_tvb, 0, 1, TRUE);
  proto_tree_add_item (starttime_tree, hf_r3_alarmlogdump_starttime_month, payload_tvb, 1, 1, TRUE);
  proto_tree_add_item (starttime_tree, hf_r3_alarmlogdump_starttime_day, payload_tvb, 2, 1, TRUE);
  proto_tree_add_item (starttime_tree, hf_r3_alarmlogdump_starttime_hours, payload_tvb, 3, 1, TRUE);
  proto_tree_add_item (starttime_tree, hf_r3_alarmlogdump_starttime_minutes, payload_tvb, 4, 1, TRUE);

  endtime_item = proto_tree_add_text (tree, payload_tvb, 5, 5, "End YY/MM/DD HH:MM (%02u/%02u/%02u %02u:%02u)", tvb_get_guint8 (payload_tvb, 5), tvb_get_guint8 (payload_tvb, 6), tvb_get_guint8 (payload_tvb, 7), tvb_get_guint8 (payload_tvb, 8), tvb_get_guint8 (payload_tvb, 9));
  endtime_tree = proto_item_add_subtree (endtime_item, ett_r3alarmlogdumpendtime);
  proto_tree_add_item (endtime_tree, hf_r3_alarmlogdump_endtime_year, payload_tvb, 5, 1, TRUE);
  proto_tree_add_item (endtime_tree, hf_r3_alarmlogdump_endtime_month, payload_tvb, 6, 1, TRUE);
  proto_tree_add_item (endtime_tree, hf_r3_alarmlogdump_endtime_day, payload_tvb, 7, 1, TRUE);
  proto_tree_add_item (endtime_tree, hf_r3_alarmlogdump_endtime_hours, payload_tvb, 8, 1, TRUE);
  proto_tree_add_item (endtime_tree, hf_r3_alarmlogdump_endtime_minutes, payload_tvb, 9, 1, TRUE);
}

static void dissect_r3_cmd_downloadfirmware (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_item *dlfw_item = NULL;
  proto_tree *dlfw_tree = NULL;
  guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
  tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);
  guint32 packetCRC = 0;
  guint32 calculatedCRC = 0;

  proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);

  dlfw_item = proto_tree_add_text (tree, payload_tvb, 0, -1, "Download Record (Record #%u, ", tvb_get_letohs (payload_tvb, 2));
  dlfw_tree = proto_item_add_subtree (dlfw_item, ett_r3downloadfirmware);

  proto_tree_add_item (dlfw_tree, hf_r3_firmwaredownload_length, payload_tvb, 0, 2, TRUE);
  proto_tree_add_item (dlfw_tree, hf_r3_firmwaredownload_record, payload_tvb, 2, 2, TRUE);
  proto_tree_add_item (dlfw_tree, hf_r3_firmwaredownload_action, payload_tvb, 4, 1, TRUE);

  switch (tvb_get_guint8 (payload_tvb, 4))
  {
    case DOWNLOADFIRMWARE_START :
      proto_item_append_text (dlfw_item, "DOWNLOADFIRMWARE_START)");
      proto_tree_add_item (dlfw_tree, hf_r3_firmwaredownload_timeout, payload_tvb, 5, 1, TRUE);
      proto_tree_add_item (dlfw_tree, hf_r3_firmwaredownload_nvram, payload_tvb, 6, 1, TRUE);
      break;

    case DOWNLOADFIRMWARE_DATA :
      proto_item_append_text (dlfw_item, "DOWNLOADFIRMWARE_DATA, Address 0x%08x, %u Bytes)", tvb_get_letohl (payload_tvb, 5), tvb_get_guint8 (payload_tvb, 9));
      proto_tree_add_item (dlfw_tree, hf_r3_firmwaredownload_address, payload_tvb, 5, 4, TRUE);
      proto_tree_add_item (dlfw_tree, hf_r3_firmwaredownload_bytes, payload_tvb, 9, 1, TRUE);
      proto_tree_add_item (dlfw_tree, hf_r3_firmwaredownload_data, payload_tvb, 10, tvb_get_guint8 (payload_tvb, 9), TRUE);
      break;

    case DOWNLOADFIRMWARE_COMPLETE :
      proto_item_append_text (dlfw_item, "DOWNLOADFIRMWARE_COMPLETE)");
      break;

    case DOWNLOADFIRMWARE_ABORT :
      proto_item_append_text (dlfw_item, "DOWNLOADFIRMWARE_ABORT)");
      break;

    case DOWNLOADFIRMWARE_RESET :
      proto_item_append_text (dlfw_item, "DOWNLOADFIRMWARE_RESET)");
      break;

    default :
      DISSECTOR_ASSERT (0);
  }

  packetCRC = tvb_get_letohs (payload_tvb, tvb_reported_length (payload_tvb) - 2);

  if ((calculatedCRC = utilCrcCalculate (tvb_get_ptr (payload_tvb, 0, tvb_reported_length (payload_tvb) - 2), tvb_reported_length (payload_tvb) - 2, 0x0000)) == packetCRC)
    proto_tree_add_uint_format (dlfw_tree, hf_r3_firmwaredownload_crc, payload_tvb, tvb_reported_length (payload_tvb) - 2, 2, packetCRC, "CRC: 0x%04x (correct)", packetCRC);
  else
  {
    proto_item *tmp_item;

    proto_tree_add_uint_format (dlfw_tree, hf_r3_firmwaredownload_crc, payload_tvb, tvb_reported_length (payload_tvb) - 2, 2, packetCRC, "CRC: 0x%04x (incorrect, should be 0x%04x)", calculatedCRC, packetCRC);
    tmp_item = proto_tree_add_boolean (dlfw_tree, hf_r3_firmwaredownload_crc_bad, payload_tvb, tvb_reported_length (payload_tvb) - 2, 2, TRUE);
    PROTO_ITEM_SET_GENERATED (tmp_item);
  }
}

static void dissect_r3_cmd_downloadfirmwaretimeout (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
  tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);

  proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
  proto_tree_add_item (tree, hf_r3_commanddata, payload_tvb, 0, -1, TRUE);
  DISSECTOR_ASSERT (0); /* ### Need nice warning here */
}

static void dissect_r3_cmd_powertableselection (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
  tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);

  proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
  proto_tree_add_item (tree, hf_r3_powertableselection, payload_tvb, 0, 1, TRUE);
}

static void dissect_r3_cmd_clearnvram (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_item *nvram_item = NULL;
  proto_tree *nvram_tree = NULL;
  guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
  tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);
  guint32 nvramclearoptions = tvb_get_letohs (payload_tvb, 0);
  guint32 i;

  proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);

  nvram_item = proto_tree_add_text (tree, payload_tvb, 0, 2, "NVRAM Clean Options (0x%04x)", nvramclearoptions);
  nvram_tree = proto_item_add_subtree (nvram_item, ett_r3clearnvram);

  for (i = 0; i < 16; i++)
    proto_tree_add_boolean (nvram_tree, hf_r3_nvramclearoptions [i], payload_tvb, 0, 2, nvramclearoptions);
}

static void dissect_r3_cmd_dpac (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
  tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);

  proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
  proto_tree_add_item (tree, hf_r3_dpac_action, payload_tvb, 0, 1, TRUE);
  proto_tree_add_item (tree, hf_r3_dpac_waittime, payload_tvb, 1, 2, TRUE);
  proto_tree_add_item (tree, hf_r3_dpac_command, payload_tvb, 3, -1, TRUE);
}

static void dissect_r3_cmd_selftest (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
}

static void dissect_r3_cmd_reset (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
}

static void dissect_r3_cmd_logwrite (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
  tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);

  proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
  proto_tree_add_item (tree, hf_r3_writeeventlog_user, payload_tvb, 0, 2, TRUE);
  proto_tree_add_item (tree, hf_r3_writeeventlog_event, payload_tvb, 2, 1, TRUE);
}

static void dissect_r3_cmd_mfgcommand (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
  mfgCommandFlag = TRUE;
}

static void dissect_r3_cmd_nvrambackup (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
}

static void dissect_r3_cmd_extendedresponse (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
}

/*
 * ***************************************************************************
 */
static void dissect_r3_cmdmfg_setserialnumber (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  tvbuff_t *sn_tvb = tvb_new_subset (tvb, start_offset + 2, 16, 16);

  proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
  dissect_serialnumber (sn_tvb, 0, length, pinfo, tree, hf_r3_mfgsetserialnumber);
}

static void dissect_r3_cmdmfg_setcryptkey (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
  proto_tree_add_item (tree, hf_r3_mfgsetcryptkey, tvb, start_offset + 2, -1, TRUE);
}

static void dissect_r3_cmdmfg_dumpnvram (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
  proto_tree_add_item (tree, hf_r3_mfgdumpnvram, tvb, start_offset + 2, 1, TRUE);
}

static void dissect_r3_cmdmfg_terminal (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
}

static void dissect_r3_cmdmfg_remoteunlock (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
  proto_tree_add_item (tree, hf_r3_mfgremoteunlock, tvb, start_offset + 2, 1, TRUE);
}

static void dissect_r3_cmdmfg_auxctlrversion (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
}

static void dissect_r3_cmdmfg_iopins (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
}

static void dissect_r3_cmdmfg_adcs (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
}

static void dissect_r3_cmdmfg_hardwareid (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
}

static void dissect_r3_cmdmfg_checkpointlogdump (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
}

static void dissect_r3_cmdmfg_checkpointlogclear (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
}

static void dissect_r3_cmdmfg_readregisters (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
}

static void dissect_r3_cmdmfg_forceoptions (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  guint i = 0;
  guint l = 0;

  proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);

  start_offset += 2;
  l = tvb_length_remaining (tvb, start_offset);

  for (i = 0; i < l; i += tvb_get_guint8 (tvb, start_offset + i))
  {
    proto_item *force_item = proto_tree_add_text (tree, tvb, start_offset + i, tvb_get_guint8 (tvb, start_offset + i), "Force Option %s (%u)", val_to_str_const (tvb_get_guint8 (tvb, start_offset + i + 1), r3_forceitemnames, "[Unknown]"), tvb_get_guint8 (tvb, start_offset + i + 1));
    proto_tree *force_tree = proto_item_add_subtree (force_item, ett_r3forceoptions);

    proto_tree_add_item (force_tree, hf_r3_forceoptions_length, tvb, start_offset + i + 0, 1, TRUE);
    proto_tree_add_item (force_tree, hf_r3_forceoptions_item, tvb, start_offset + i + 1, 1, TRUE);

    switch (tvb_get_guint8 (tvb, start_offset + i) - 2)
    {
      case 1  : proto_tree_add_item (force_tree, hf_r3_forceoptions_state_8,  tvb, start_offset + i + 2, 1, TRUE); break;
      case 2  : proto_tree_add_item (force_tree, hf_r3_forceoptions_state_16, tvb, start_offset + i + 2, 2, TRUE); break;
      case 3  : proto_tree_add_item (force_tree, hf_r3_forceoptions_state_24, tvb, start_offset + i + 2, 3, TRUE); break;
      case 4  : proto_tree_add_item (force_tree, hf_r3_forceoptions_state_32, tvb, start_offset + i + 2, 4, TRUE); break;
      default : DISSECTOR_ASSERT (0);
    }
  }
}

static void dissect_r3_cmdmfg_commuser (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
}

static void dissect_r3_cmdmfg_dumpkeypad (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
}

static void dissect_r3_cmdmfg_batterycheck (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
}

static void dissect_r3_cmdmfg_ramrefresh (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
}

static void dissect_r3_cmdmfg_taskflags (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
}

static void dissect_r3_cmdmfg_timerchain (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
}

static void dissect_r3_cmdmfg_peekpoke (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  guint i = 0;
  guint l = 0;

  proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
  
  start_offset += 2;
  l = tvb_length_remaining (tvb, start_offset);

  for (i = 0; i < l; i += 3)
  {
    proto_item *peekpoke_item = proto_tree_add_text (tree, tvb, start_offset + i, 3, "%s", "");
    proto_tree *peekpoke_tree = proto_item_add_subtree (peekpoke_item, ett_r3peekpoke);

    proto_tree_add_item (peekpoke_tree, hf_r3_peekpoke_operation, tvb, start_offset + i + 0, 1, TRUE);
    proto_tree_add_item (peekpoke_tree, hf_r3_peekpoke_address, tvb, start_offset + i + 1, 2, TRUE);

    switch (tvb_get_guint8 (tvb, start_offset + i + 0))
    {
      case PEEKPOKE_READU8 :      
        proto_item_append_text (peekpoke_item, "Read (8 Bits @ 0x%04x)", tvb_get_letohs (tvb, start_offset + i + 1));
        break; 

      case PEEKPOKE_READU16 :     
        proto_item_append_text (peekpoke_item, "Read (16 Bits @ 0x%04x)", tvb_get_letohs (tvb, start_offset + i + 1));
        break; 

      case PEEKPOKE_READU24 :     
        proto_item_append_text (peekpoke_item, "Read (24 Bits @ 0x%04x)", tvb_get_letohs (tvb, start_offset + i + 1));
        break; 

      case PEEKPOKE_READU32 :     
        proto_item_append_text (peekpoke_item, "Read (32 Bits @ 0x%04x)", tvb_get_letohs (tvb, start_offset + i + 1));
        break; 

      case PEEKPOKE_READSTRING :  
        proto_item_append_text (peekpoke_item, "Read (%d Bytes @ 0x%04x)", tvb_get_guint8 (tvb, start_offset + i + 3), tvb_get_letohs (tvb, start_offset + i + 1));
        proto_item_set_len (peekpoke_item, 4);
        proto_tree_add_item (peekpoke_tree, hf_r3_peekpoke_length, tvb, start_offset + i + 3, 1, TRUE); 
        i += 1; 
        break; 

      case PEEKPOKE_WRITEU8 :     
        proto_item_append_text (peekpoke_item, "Write (8 Bits: 0x%02x @ 0x%04x)", tvb_get_guint8 (tvb, start_offset + i + 3), tvb_get_letohs (tvb, start_offset + i + 1));
        proto_item_set_len (peekpoke_item, 4);
        proto_tree_add_item (peekpoke_tree, hf_r3_peekpoke_poke8, tvb, start_offset + i + 3, 1, TRUE); 
        i += 1; 
        break; 

      case PEEKPOKE_WRITEU16 :    
        proto_item_append_text (peekpoke_item, "Write (16 Bits: 0x%04x @ 0x%04x)", tvb_get_letohs (tvb, start_offset + i + 3), tvb_get_letohs (tvb, start_offset + i + 1));
        proto_item_set_len (peekpoke_item, 5);
        proto_tree_add_item (peekpoke_tree, hf_r3_peekpoke_poke16, tvb, start_offset + i + 3, 2, TRUE); 
        i += 2; 
        break; 

      case PEEKPOKE_WRITEU24 :    
        proto_item_append_text (peekpoke_item, "Write (24 Bits: 0x%06x @ 0x%04x)", tvb_get_letoh24 (tvb, start_offset + i + 3), tvb_get_letohs (tvb, start_offset + i + 1));
        proto_item_set_len (peekpoke_item, 6);
        proto_tree_add_item (peekpoke_tree, hf_r3_peekpoke_poke24, tvb, start_offset + i + 3, 3, TRUE); 
        i += 3; 
        break; 

      case PEEKPOKE_WRITEU32 :    
        proto_item_append_text (peekpoke_item, "Write (32 Bits: 0x%08x @ 0x%04x)", tvb_get_letohl (tvb, start_offset + i + 3), tvb_get_letohs (tvb, start_offset + i + 1));
        proto_item_set_len (peekpoke_item, 7);
        proto_tree_add_item (peekpoke_tree, hf_r3_peekpoke_poke32, tvb, start_offset + i + 3, 4, TRUE); 
        i += 4; 
        break; 

      case PEEKPOKE_WRITESTRING : 
        proto_item_append_text (peekpoke_item, "Write (%d Bytes @ 0x%04x)", tvb_get_guint8 (tvb, start_offset + i + 3), tvb_get_letohs (tvb, start_offset + i + 1));
        proto_item_set_len (peekpoke_item, 3 + 1 + tvb_get_guint8 (tvb, start_offset + i + 3));
        proto_tree_add_item (peekpoke_tree, hf_r3_peekpoke_length, tvb, start_offset + i + 3, 1, TRUE); 
        proto_tree_add_item (peekpoke_tree, hf_r3_peekpoke_pokestring, tvb, start_offset + i + 4, tvb_get_guint8 (tvb, start_offset + i + 3), TRUE); 
        i += tvb_get_guint8 (tvb, start_offset + i + 3) + 1; 
        break; 

      default :                   
        DISSECTOR_ASSERT (0); 
    }
  }
}

static void dissect_r3_cmdmfg_lockstate (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
}

static void dissect_r3_cmdmfg_capabilities (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
}

static void dissect_r3_cmdmfg_dumpm41t81 (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
}

static void dissect_r3_cmdmfg_debuglogdump (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
}

static void dissect_r3_cmdmfg_debuglogclear (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
}

static void dissect_r3_cmdmfg_testwdt (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
}

static void dissect_r3_cmdmfg_querycksum (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
}

static void dissect_r3_cmdmfg_validatechecksums (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
}

static void dissect_r3_cmdmfg_rebuildlrucache (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
}

static void dissect_r3_cmdmfg_tzupdate (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
}

static void dissect_r3_cmdmfg_testpreserve (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
  proto_tree_add_item (tree, hf_r3_mfgtestpreserve, tvb, start_offset + 2, 1, TRUE);
}

static void dissect_r3_cmdmfg_mortisestatelogdump (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
}

static void dissect_r3_cmdmfg_mortisestatelogclear (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
}

static void dissect_r3_cmdmfg_mortisepins (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
}

static void dissect_r3_cmdmfg_haltandcatchfire (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
{
  proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE); 
  proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
}

/*
 * ***************************************************************************
 *
 *  If no tree, don't bother parsing anything else since it doesn't affect return results
 */
static gint dissect_r3_command (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *r3_tree)
{
  if (r3_tree)
  {
    proto_item *cmd_item = NULL;
    proto_tree *cmd_tree = NULL;
    const gchar *cn = NULL;
    guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
    guint8 cmd = tvb_get_guint8 (tvb, start_offset + 1);

    tvb_ensure_bytes_exist (tvb, start_offset, 2);

    cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
    cmd = tvb_get_guint8 (tvb, start_offset + 1);

    if (!mfgCommandFlag)
      cn = val_to_str_const (cmd, r3_cmdnames, "[Unknown Command]");
    else
      cn = val_to_str_const (cmd, r3_cmdmfgnames, "[Unknown Mfg Command]");

    cmd_item = proto_tree_add_text (r3_tree, tvb, start_offset, cmdLen, "Command Packet: %s (%d)", cn, cmd); 
    cmd_tree = proto_item_add_subtree (cmd_item, ett_r3cmd);

    if (cmd_tree)
    {
      if (!mfgCommandFlag)
      {
        if (cmd >= CMD_LAST)
          expert_add_info_format (pinfo, cmd_tree, PI_UNDECODED, PI_WARN, "Unknown command value");
        else if (r3command_dissect [cmd].dissector)
          (*r3command_dissect [cmd].dissector) (tvb, start_offset, length, pinfo, cmd_tree);
      }
      else
      {
        mfgCommandFlag = FALSE;

        if (cmd >= CMDMFG_LAST)
          expert_add_info_format (pinfo, cmd_tree, PI_UNDECODED, PI_WARN, "Unknown manufacturing command value");
        else if (r3commandmfg_dissect [cmd].dissector)
          (*r3commandmfg_dissect [cmd].dissector) (tvb, start_offset, length, pinfo, cmd_tree);
      }
    }
  }

  return tvb_get_guint8 (tvb, start_offset);
}

/*
 * ***************************************************************************
 *
 *  Dissect a single packet, return bytes consumed
 *
 *  Return either:
 *    >0 = number of bytes consumed
 *     0 = packet is just the right length
 *    <0 = need more bytes
 */
static gint dissect_r3_packet (tvbuff_t *tvb, guint start_offset, packet_info *pinfo, proto_tree *r3_tree)
{ 
  guint offset = 0;
  guint octConsumed;
  gint available = tvb_length_remaining (tvb, start_offset);

  if (!(tvb_strneql (tvb, start_offset, "~~~ds", 5)))
  {
    if (r3_tree)
      proto_tree_add_item (r3_tree, hf_r3_tildex3ds, tvb, start_offset + 0, -1, TRUE);

    offset = start_offset + 5;
  }
  else
  {
    gint packetLen = 0;

    if (available < 4)
      return available - 4;
    else 
    {
      packetLen = tvb_get_guint8 (tvb, start_offset + 3) + 1;

      if (packetLen > available)
        return available - packetLen;
    }

    --packetLen;

    /*
     *  Show basic header stuff
     */
    if (r3_tree)
    {
      proto_item *header_item = proto_tree_add_item (r3_tree, hf_r3_header, tvb, start_offset + 0, 5, TRUE);
      proto_tree *header_tree = proto_item_add_subtree (header_item, ett_r3header);

      proto_tree_add_item (header_tree, hf_r3_sigil, tvb, start_offset + 0, 1, TRUE);
      proto_tree_add_item (header_tree, hf_r3_address, tvb, start_offset + 1, 1, TRUE);
      proto_tree_add_item (header_tree, hf_r3_packetnumber, tvb, start_offset + 2, 1, TRUE);
      proto_tree_add_item (header_tree, hf_r3_packetlength, tvb, start_offset + 3, 1, TRUE);
      proto_tree_add_item (header_tree, hf_r3_encryption, tvb, start_offset + 4, 1, TRUE);
    }

    /*
     *  If the packet has enough data, try to decode it
     */
    if (available > 8)
    {
      proto_item *payload_item = NULL;
      proto_tree *payload_tree = NULL;
      tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 5, packetLen - 7, packetLen - 7);

      if (r3_tree)
      {
        payload_item = proto_tree_add_item (r3_tree, hf_r3_payload, payload_tvb, 0, -1, TRUE);
        payload_tree = proto_item_add_subtree (payload_item, ett_r3payload);
      }

      while (offset < tvb_reported_length (payload_tvb))
      {
        octConsumed = dissect_r3_command (payload_tvb, offset, 0, pinfo, payload_tree);
        if(!octConsumed)
        {
              expert_add_info_format (pinfo, payload_tree, PI_MALFORMED, PI_WARN, "Command length equal to 0; payload could be partially decoded");
              offset = tvb_reported_length (payload_tvb);
              break;
        }
        offset += octConsumed;
      }
    }

    offset += start_offset;

    /*
     *  Show the CRC and XOR status
     */
    if (r3_tree)
    {
      proto_item *tail_item = proto_tree_add_item (r3_tree, hf_r3_tail, tvb, offset + 5, 3, TRUE);
      proto_tree *tail_tree = proto_item_add_subtree (tail_item, ett_r3tail);
      guint32 packetCRC = tvb_get_letohs (tvb, offset + 5);
      guint32 packetXor = tvb_get_guint8 (tvb, offset + 7);
      guint32 calculatedCRC = 0;
      guint32 calculatedXor = 0;

      if ((calculatedCRC = utilCrcCalculate (tvb_get_ptr (tvb, start_offset + 1, packetLen - 3), packetLen - 3, 0x0000)) == packetCRC)
        proto_tree_add_uint_format (tail_tree, hf_r3_crc, tvb, offset + 5, 2, packetCRC, "CRC: 0x%04x (correct)", packetCRC);
      else
      {
        proto_item *tmp_item;

        proto_tree_add_uint_format (tail_tree, hf_r3_crc, tvb, offset + 5, 2, packetCRC, "CRC: 0x%04x (incorrect, should be 0x%04x)", calculatedCRC, packetCRC);
        tmp_item = proto_tree_add_boolean (tail_tree, hf_r3_crc_bad, tvb, offset + 5, 2, TRUE);
        PROTO_ITEM_SET_GENERATED (tmp_item);
      }

      if ((calculatedXor = (packetLen ^ 0xff)) == packetXor) 
        proto_tree_add_uint_format (tail_tree, hf_r3_xor, tvb, offset + 7, 1, packetXor, "XOR: 0x%02x (correct)", packetXor);
      else 
      {
        proto_item *tmp_item;

        proto_tree_add_uint_format (tail_tree, hf_r3_xor, tvb, offset + 7, 1, packetXor, "XOR: 0x%02x (incorrect, should be 0x%02x)", packetXor, packetLen ^ 0xff);
        tmp_item = proto_tree_add_boolean (tail_tree, hf_r3_xor_bad, tvb, offset + 7, 1, TRUE);
        PROTO_ITEM_SET_GENERATED (tmp_item);
      }
    }

    offset += 8;
  }

  return offset - start_offset;
}

/*
 * ***************************************************************************
 *
 *  Main dissector entry points
 */
static void dissect_r3_message (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
  proto_item *r3_item = NULL;
  proto_tree *r3_tree = NULL;
  guint offset = 0;

  col_set_str (pinfo->cinfo, COL_PROTOCOL, "R3");
  col_clear (pinfo->cinfo, COL_INFO);

  if (tree) 
  { 
    r3_item = proto_tree_add_item (tree, proto_r3, tvb, 0, -1, TRUE);
    r3_tree = proto_item_add_subtree (r3_item, ett_r3);
  }

  while (offset < tvb_reported_length (tvb))
  {
    gint res = dissect_r3_packet (tvb, offset, pinfo, r3_tree);

    if (res <= 0)
    {
      if (r3_item)
        proto_item_set_len (r3_item, offset);

      return;
    }

    offset += res;
  }

  return;
}

static guint get_r3_message_len (packet_info *pinfo _U_, tvbuff_t *tvb, int offset)
{
  return (guint) tvb_get_guint8 (tvb, offset + 3) + 1;
}

static void dissect_r3 (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
  tcp_dissect_pdus (tvb, pinfo, tree, TRUE, 4, get_r3_message_len, dissect_r3_message);
}

/*
 * ***************************************************************************
 */
void proto_register_r3 (void)
{
  proto_r3 = proto_register_protocol ("Assa Abloy R3", "R3", "r3");
  register_dissector ("r3", dissect_r3, proto_r3);
  proto_register_field_array (proto_r3, hf, array_length (hf));
  proto_register_subtree_array (ett, array_length (ett));
}

void proto_reg_handoff_r3 (void)
{
  dissector_handle_t r3_handle = find_dissector ("r3");
  dissector_add ("tcp.port", 2571, r3_handle);
  dissector_add ("tcp.port", 8023, r3_handle);
}


/*
 * Editor modelines
 *
 * Local variables:
 * c-basic-offset: 2
 * tab-width: 8
 * indent-tabs-mode: nil
 * End:
 *
 * vim: set tabstop=2 softtabstop=2 shiftwidth=2 expandtab:
 */

Generated by  Doxygen 1.6.0   Back to index