IO Ninja changelog
==================

This changelog is a manually cleaned-up git log of important changes
happened in-between the official IO Ninja releases.

Modules
-------

  * Main application - the two main executables (bin/ioninja,
    bin/ioninja-server)

  * Scripts - open-source Jancy scripts (*.jnc) which implement all of the
    IO Ninja plugins.

  * Ninja Scroll - the proprietary logging engine of IO Ninja (statically linked
    to the main executables)

  * Device Monitor - partly open-source tools, libraries, and kernel-mode
    modules allowing  to intercept and monitor communications between
    user-mode applications and kernel-mode device drivers

  * QT Property Browser - a heavily modified fork of the official QT property
    grid library

  * Jancy - an open-source scripting language with C-compatible structs,
    safe pointer aritmetic and spreadsheet-like reactive programming (jancy.dll/
    libjancy.so/libjancy.dylib)

Changelog Items
---------------

  + denotes a new feature
  - denotes a bug-fix or a removed feature
  * is used for all other changes (re-factorings, updates, etc)

...............................................................................

version 3.10.2 (2019-02-01)

  Service release

  Main application changelog:

  * nj_app: changed default font to Consolas-10 on windows, Menlo-12 on Mac,
    Monospace-10 otherwise
  * nj_app: use the script editor font for line number margin
  * nj_app: detect font changes and update accordingly
  * nj_app: added a size-grip to the parametrized action dlg and removed the
    question mark from the caption
  - nj_app: fix: switching between sessions might have left BinaryTransmitPage
    with a dangling m_settings pointer (leading to a crash)
  + nj_app: added auto-show-terminal setting (false by default)
  + nj_app: attempt to auto-load log plugin if it's in the same directory
  + nj_app: added new setting: auto-add-user-plugin
  * nj_app: when opening log file with aux representers, don't suspend log
  + nj_app: use the newly added njs::NotifyCode_SelectionChanged
  - nj_app: fix: load/save sessions still relied on plugin guids rather that
    ids (and we removed guids from session/layer plugins)
  - axl_enc: remove the expectedLength/Size parameters from conversion functions

  Scripts changelog:

  + tcp: added the reconnect functionality (on remote disconnet/reset)
  + serial: added the reopen-on-error functionality
  + usb-data: added read-timeout & use-read-timeout props; use those for proper
    buffer configuration
  + common: added configurable defaults to BufferPropertySet
  - wizards: fixed reswitch code in layer plugin wizards
  * wizards: updated wizards for the new plugin arch
  * serialtap: rename: serial tap doesn't use FTDI anymore
  - serialmon: fix: representSerialMonLog should not fall back to
    representSerialLog
  + serial: added icons to serial log plugin
  - tcp: fix: on error, transmit should be disabled and session ended

  Ninja Scroll engine changelog:

  - njs_log: fix: when adding text we should add an extra line when text ends
    on new-line (\n)
  - njs_log: fix: CacheLineAttr.clear should reset m_iconIdx to -1
  - njs_log: typo fix: RecordFile::getAuxClassGuidArray () mapped
    a view at a wrong offset
  - njs_log: typo: SaveLogAsTextRangeProcessor should use
    m_lineTimestamp, not m_timestamp
  - njs_wdg: fix: keep the line color when painting hex-ascii
  - njs_wdg: fix: hex editor crashed if a user starts typing in the hex pane
    in overwrite mode and the editor is empty
  + njs_wdg: added NotifyCode_SelectionChanged

  Jancy changelog:

  - jnc_rtl: bugfix: 'this' arg of 'onevent' handlers was adjusted twice
  + jnc_rtl: make RegexState.m_replayLength public & readonly (may be needed)
  * cmake: moved all rtl .jnc files into src/jnc_ext/jnc_rtl
  + jnc_ext: create jnc_stdlib.jncx for IO Ninja IDE
  - jnc_io_ssh: fix: read initially from socket (otherwise, data may be stuck
    in libssh2 buffers until more data arrives over a socket)

...............................................................................

version 3.10.1 (2018-12-25)

  Service release

  Main application changelog:

  + nj_app: added test mode -- load plugin(s) and wait a bit, then exit
    (added all official plugins to the test list)
  - nj_cmn, nj_app, nj_srv: removed AppMsgCode_OnException -- it was only used
    if the initial plugin startup failed. replaced with onStartupCompleted;
    this also leads to reduced flickering during plugin startup
  - nj_app, nj_srv: fix: use proper libunwind libnames and link sequence
  - nj_cmn: fix: only use signalContext on Linux x86/amd64
    otherwise, use unw_getcontext (which pretty much works everywhere)
  + nj_app: force-generate cursorPosChanged in HexEditWidget::selectAll ()
  - nj_app: fix: install crash report writer BEFORE jancy initialization (for
    proper sequence of signal handlers)
  + nj_cmn: added SIGILL to the signal list -- turns out, clang may replace
    invalid memory accesses with UD instructions
  - nj_app, nj_srv: don’t link to libunwind on mac (it’s part of standard
    lib here)
  * nj_cmn: moved posix crash report thread writer to a dedicated file
  + nj_cmn: implemented crash reports on posix using libunwind
  - nj_app: fix: user plugin page didn't work well for log plugins (new plugin
    type was not handled properly)
  * nj_srv: return --plugin-file option (for old ioninja-ide compatibility)
    loosen up errors in CmdLineParser::finalize (simpy don't set server flags
    if log files are not specified)
  - nj_app: don't call QNetworkProxyFactory::setUseSystemConfiguration at all
  * nj_app: check for running state during execSyncReq and Document::save
    this is to prevent main-app lock ups due to zombie server
  * nj_app: licensemgr should update about dialog (if present)
    example sequence: about->deregister->nag->register
  * nj_app: nagdlg: don't set time-left-string if it's not evaluation

  Scripts changelog:

  * i2c-spi: updated firmware files (both i2c and spi are functional)
  - all: removed guids from layers
  + all: added icons to all log plugins
  * i2c-spi: major update -- no more lattice, implemented altera max10
    upload protocol
  - tcp-flow-mon: typo fix: guid-> log-guid

  Jancy changelog:

  * jnc_ct: major update: raw literals are now zero-terminated, just like
    normal literals (practice showed it's safer and better this way)
  - jnc_io_usb: minor warning fix (signed-vs-unsigned mismatch in assert)
  - jnc_ct: fix: incorrect assert -- unprimed static gc root classes have
    NULL box

...............................................................................

version 3.10.0 (2018-12-14)

  New major features:

  A build for Raspberri Pi, machine interface in Device Monitor, a new plugin
  Serial Monitor over SSH, half-duplex support in Modbus Analyzer, redesign of
  Jancy reactors, new 64-bit log record code architecture, dedicated log
  representer plugins (separated from session/layer plugins).

  Main application changelog:

  * nj_app: for default session and layer plugins, use ID rather than GUID
  * nj_app: if no plugin selected, getPluginListWidgetCurrentItem should return
    NULL
  * nj_app: update: instant-nag-screen should only pop once
  * nj_app: prevent silent overwriting of the outdated log file (create a
    backup and show warning with a link to the KB article)
  + nj_log, nj_app, nj_srv: added configurability for record code filter
    groups via bool properties
  + nj_log: added standard filter RecordCodeFilter
  + nj_gui: allow creating BoolProperty without a jancy runtime
  * nj_log: lock before compiling log plugins to avoid races between multiple
    log threads
  - nj_srv: fix: addLayer didn't work properly on the new log design
  - nj_app: fix: no-response-dlg should be closed when server process terminates
  * nj_srv: fail if log plugin failed to attach (usually, because of a
    misspelled representer func)
  + nj_app: added presell serial num page to the welcome dialog
  - nj_app: typo fix in TextTransmitPage::onEnterKeyPressed (no need to take
    parent)
  - nj_srv: fix: erase entry from the layer map if add-layer failed
  + nj_app: added welcome-dialog (blocking unregistered access) -- a license
    is now required to run io ninja (at least, an evaluation one).
  * all: ensure zero-initialization where it matters (post auto-zero-init
    removal from axl)
  - all: removed auto-zero-init of allocated blocks
  - nj_app: qt-5.0.2 fix in UsageReportMgr re QJsonValue
  * sh: added target cpu mapping armv7l -> arm32
  + conf, cmake: added ssh-serialmon to the official plugin list and to the
    test suite

  Scripts changelog:

  - serialmon: removed unnecessary termios->uint_t converters
  + serialmon: added handling of TCSETSW, TCSETSF, TCSETA, TCSETAW, TCSETAF
  - pcap: typo fix: should check *filter, not *p (which is void)
  + serialmon: added serial monitoring over ssh
  * ssh: moved common ssh ui code into io_SshUi.jnc
  * udp-flow-mon, tcp-flow-mon: reuse log record codes from PcapLog and
    SocketLog
  * all: all-around-fixes, everything passes tests under the new
    64-bit record code design
  + devicemon: added device monitor log plugin
  * all: ported to the new 64-bit record code design
  + modbus: added support for half-duplex links
  * all: updated reactors re the new reactor syntax/capabilities

  Ninja Scroll engine changelog:

  + njs_app: implemented conversion for record codes 32-bit ->
    64-bit (record-code-db-driven)
  * njs_log: moved RecordFilePreOpener to a dedicated file
  + all: 64-bit record/part codes
  - all: a bunch of typos/fixes found by pvs-studio
  * all: ensure zero-initialization where it matters (after
    auto-zero-init removal from axl)

  Device Monitor changelog:

  - dm_app: minor posix fix re StdinThread
  + dm_app: monitor EOF on STDIN (important for SSH connections)
  + dm_app: added os/cpu information to the start message, renamed
    dm_MachineInterface.h -> dm_MachineIface.h
  * dm_app: turn off stdout buffering in machine-interface mode
  + dm_app: implemented machine interface on linux
  + dm_app: added machine interface (output binary to stdout for
    easy parsing -- e.g. over SSH)
  * lkm: replaced flush_tlb_all (not exported on rpi2) -> local_flush_tlb_all

  Jancy changelog:

  + jnc_io_devmon: build io_devmon.jncx even if devmon is not available
  + jnc_ct: added support for source-only jncx extensions
  - jnc_ct: fix: conditional_expr didn't check for result of conditionalJump
  - jnc_pch: removed empty preproc line (confuses cppcheck)
  - jnc_io_ssh: don't request PTY if ptyType is null or empty
  - jnc_io_ssh: don't start process if processType is null or empty
  + jnc_std: added overload std.setError (std.Error const*)
  + jnc_io_devmon: added io_DeviceMonitorMi.jnc (machine interface)
  + jnc_ct: added __FILE__ and __DIR__ lexer-time constants
  - jnc_rt: fix: Runtime::m_module was uninitialized
  + jnc_std: added methods: std.Guid.parse, std.Guid.getString
  - jnc_ct: fix: NamedTypeBlock::callMemberFieldConstructors
    should not assume this is a class type
  + jnc_rt: add destructors of class field of static objects
  - jnc_io_base: fix: struct OverlappedIo had uninitialized fields
    (windows-only)
  - jnc_ct: fix: DerivableType::findItemTraverseImpl shouldn't assume no
    unresolved imports in base types
  + jnc_ct: added a bunch of arm arithmetic/conversion impl functions
  + jnc_ct: force hard-fp-abi on ARM
  - jnc_ct: fix: arm32 coercion (should depend on alignment)
  - jnc_ct: fix: 'char's are unsigned on ARM
  + jnc_ct: arm call-conv implemented (not fully tested yet)
  + jnc_ct: added arm calling convention (draft)
  + test, cmake: added jnc_test_abi to the test quite and make it run
    before the other tests (except for samples)
  + jnc_ct: added support for arm32/arm64
  + pch: detect arm32/arm64
  - pch: fix: don't use attribute(ms_struct) if it's not supported
  * jnc_ct: moved deletion of llvm::Module, llvm::ExecutionEngine
    and llvm::Context to the very end of ct::Module::clear
  - jnc_ct: typo fix in Function::addUsingSet
  - jnc_dll: fix: Xcode refuses to build a library out of TARGET_OBJECTs only
  + jnc_io: added WSAStartup on windows to io_base.jncx/io_ssh.jncx
  - jnc_ct: fix: pass Token::Pos to internalPrologue (otherwise,
    m_llvmDiScope is not initialized)
  + jnc_ct: added optional Token::Pos* pos arg to FunctionMgr::internalPrologue
  - jnc_ct: fix: incorrect include dir sequence
  - api: removed empty pp lines (containing only #) -- they confuse cppcheck
  - jnc_ct: fix: call postDeclaratos/postDeclaratorName when parsing reactors
  + jnc_ct, jnc_rtl: allow empty reactors
  - jnc_ct: fix: delete llvm::Context in Module::clear
  - all: a bunch of typos/fixes found by pvs-studio
  - jnc_ct: don't create vtable for a class unless it's actually needed
  * all: ensure zero-initialization where it matters (post auto-zero-init
    removal from axl)
  * jnc_rtl: use shadow reaction index to loop through pending reactions
    (rather than picking the pending reaction with the minimal index)
  + jnc_rtl: added method ReactorBase.restart
  - jnc_ct: fix: ensure reactor-closure type is created together with
    jnc.ReactorBase
  - jnc_ct: fix: jnc.ReactorBaseType should mark ctor/dtor as user-item
    (otherwise, these will be auto-generated)
  * jnc_ct: minor modification of the signature of
    DerivableType::createDefaultMethod
  * test: updated reactor samples/tests to the new syntax
  + jnc_ct, jnc_rtl: initial commit of reactor-redesign

...............................................................................

version 3.9.2 (2018-09-27)

  Service release

  A bunch of critical bugfixes in Jancy runtime and in the Ninja Scroll engine
  (after a series of tests with libfuzzer + address sanitizer); added delayed
  cache update in Ninja Scroll (critical to maintain high data throughput,
  such as with the I2C/SPI Sniffer plugin capturing SPI data at ~50MHz).

  Main application changelog:

  + nj_log: added properties: Log.m_leafLineCountLimit,
    Log.m_cacheUpdateScrollRateLimit
  + nj_app: use the newly added LogWidget::setStickyScroll
  * nj_app: set ScrollToBottom & SetCursorToEnd flags on clear
  - nj_app: fix: gcSafePointMethod setting was neither serialized nor applied
    on win x64
  + nj_doc: added property: doc.PluginHost.m_pluginDir
  - nj_gui_srv: fix: EnumProperty::setValue should check for null before the
    shortcut exit (may be setting 0 to null)
  * doc: updated hardware manual

  Scripts changelog:

  + i2c-spi-sniffer: use the newly added m_cacheUpdateScrollRateLimit to limit
    log cache update rate
  + log: added properties: Log.m_leafLineCountLimit,
    Log.m_cacheUpdateScrollRateLimit
  + i2c-spi-sniffer: added automatic FPGA firmware update
  + common: added file parseVersion.jnc
  - log: bugfix: infinite recursion in log.Writer.writeString
  + doc: added property: doc.PluginHost.m_pluginDir
  - i2c-spi-sniffer: remove io.UsbEndpointOptions.KeepReadBlockSize
  + i2c-spi-sniffer: added support for buffer overflow, optimized the SPI
    decoder, added support for SPI LSB-first-vs-MSB-first
  - i2c-spi-sniffer: fixed bitwise-arithmetic for building the SPI 16-bit word
  * i2c-spi-sniffer: switch order of bytes to: MOSI-HI, MISO-HI, MOSI-LO, MISO-LO
  + i2c-spi-sniffer: renamed I2cSniffer -> I2cSpiSniffer; added SPI decoder
  + i2c-sniffer: added 'Show STOP' property
  * i2c-sniffer: wait for OUT-transfers finished before closing the OUT-endpoint
  + i2c-sniffer: added 7-bit & 10-bit address decoding

  Ninja Scroll engine changelog:

  - njs_log: fix: first update cache, then notify widget parent
  - njs_log: don't reset sticky scroll files on cache rebuild
  + njs_log: added method: LogWidget::setStickyScroll
  * njs_log: only modify sticky-scroll flags when cursor is changed because of
    keyboard/mouse
  - njs_log: removed m_leafFoldableRecordCountLimit (seems like an excessive
    setting)
  + exposed access to m_leafLineCountLimit and m_cacheUpdateScrollRateLimit via
    njs::Server
  * changed m_cacheUpdateScrollRateLimit default to -1 (no delayed cache update
    -- each plugin must turn it on manually)
  * njs_log: inlined CacheMgr::processStickyScroll ()
  * njs_log: don't let any UI things to happen between releasing the index lock
    and requesting updates
  * njs_log: update line count on represent
  + njs_log: added delayed cache update (based on scroll-change rate limit)
  * njs_log: use the newly added methods axl::io::MappedFile::duplicate, setSize
  - njs_log: fix: SharedRecordFile::rename cleared m_auxFileList
  - njs_wdg: fix: TerminalWidget::escReset () incorrectly reset cursor pos to
    (0, 0)
  - njs_wdg: fix: csiSetScrollRgn didn't check begin/end for validity
  - njs_wdg: fix: csiSetMode/csiResetMode didn't check length of m_body before
    accessing m_body [0]
  - njs_wdg: fix: if zero size is passed in TerminalWidget::setConsoleSize,
    use defaults
  + njs_wdg: added TerminalWidget::isValidCursor
  - njs_wdg: fix: always delete history on set-scroll-region
  + axl_gui: added support for Ctrl+U (cut a line before the cursor)
  - axl_gui: fix: incorrect condition in WidgetScrollBar::isMaxed
  + njs_wdg: added TerminalScreenBuffer::isInsideScrollRegion
  + test_qt: added libfuzzer support, added xterm fuzz corpus

  Jancy changelog:

  - jnc_io_cmn: fix: invalid test in  AsyncIoDevice::isReadBufferValid and
    AsyncIoDevice::isWriteBufferValid
  - jnc_io: critical bugfix: incorrect handling of readBuffer/readOverflowBuffer
    when KeepReadBlockSize is in effect
  * axl_sl: CircularBuffer::setBufferSize should do a quick size
    check for a possible shortcut return
  - axl_sl: fix: inaccurate assert in CircularBuffer::setBufferSize
  - jnc_ct: critical bugfix: jnc_Type_getTypeString returned a dangling
    pointer
  * jnc_std:jnc_rtl: use sl::getAllocSize, not sl::getHiBit for allocation
    round-ups
  + jnc_std: added memmove
  + jnc_api: added jnc_Variant_isNull
  - jnc_rt: critical bugfix: GcHeap::stopTheWorld_l released the lock
    without changing state to something other than State_Idle, which
    effectively enabled threads running GcHeap::collect_l concurrently.
    the bug introduced when adding 'abort' functionality in the prev release.
  * jnc_io_base: use the newly added method axl::io::MappedFile::getFile ()
  + jnc_ct: added jnc_TypeKindFlag_ErrorCode to jnc_TypeKind_Enum
  + jnc_io_usb: added io.UsbEndpointEvent.WriteCompleted

...............................................................................

version 3.9.1-a (2018-09-07)

  Service release

  Main application changelog:

  * nj_app: only use QPlainTextEdit::setPlaceholderText on QT >= 5.3; we use
    QT 5.0.2 on Linux as to increase the chances of the IO Ninja binary running
    on various Linux distros
  * nj_app: only apply packet template if packet templates are really used
    (otherwise, packet parse delay-finishes, and then we have min size limits
    even if packet template is off)
  - cmake: fix: added JANCY_JNCX_DIR to the import list when generating the API
    documentation

  Scripts changelog:

  - usb: removed the unused function getLineString ()
  * hw-serial-mon: moved getLineString to HwSerialMonLog.jnc
  + i2c-sniffer: initial commit (for internal testing)

  Jancy changelog:
  - jnc_ct: fix: decodeBinString should ignore \r and \n -- otherwise,
    multi-line binary literals don't work
  + cmake: added JANCY_JNCX_DIR to jancy_config.cmake

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

version 3.9.1 (2018-09-05)

  Major improvements:

  + Script transmit pane
  * Packet templates are now processed in the ioninja-server process
  + Added support for Modbus ASCII, Modbus TCP

  Main application changelog:

  * nj_app: remove min size limit when turning packet templates off with a tx
    pane
  + nj_app: use icons for use-packet-template/edit-packet-template buttons
  + nj_app: highlight the error line in script editor
  + nj_app: use default.jnc scripts whenever packet template or tx script is
    empty
  + nj_app: added placeholder text in file-transmit and text-tranmit pages
  + nj_app: added images: form, edit (used in packet template tx pane)
  + nj_app: added support for alternate radix in binary literals (0x, 0d, 0b,
    0o)
  + nj_app: added class ScriptEdit to serve as a Jancy editor for packet
    templates and script tx
  + nj_etx: added timetout to ScriptTransmitSrvPeer::abort (so we can just
    request abort without waiting)
  * nj_srv: abort tx script when tx gets disabled
  + nj_etx: added ScriptTransmitAppMsgCode_OnRunAborted to distinguish between
    user-induced abort and a legit Jancy exception
  * package: link msi actions to CRT statically (as to avoid the
    yet-not-installed msvcr/msvcp deps which might be missing on older Цindows)
  - nj_app: removed packet min size setting, properly update packet templates
    stuff (setting-page vs transmit-widget)
  + nj_etx: added two modes to PacketTemplateMgr (so setting page changes can
    be undone)
  - nj_srv: fix: keep DirectSource until module is compiled (otherwise, we gonna
    have dangling source pointers)
  + nj_srv: added idle event to script transmit srv peer (so we can wait until
    thread is done)
  * axl_sys_win: when calling FormatMessageW, try LANG_ENGLISH,
    SUBLANG_ENGLISH_US first; if failed, fall back to LANG_NEUTRAL,
    SUBLANG_NEUTRAL

  Scripts changelog:

  + ssh: added ssh-exec property (to specify the remote process to exec)
  + tdevmon: added KB links to the representation of capture error records
  * packets: updated the default packet template script
  - network-sniffer: removed the now defunct pcap write buffer stuff
  * tx: updated the default tx script and the arp who-is sample
  + api: added tx.jnc with a prototype for the transmit () function
  * tibbo-modbus: updated re the latest modbus code changes
  + modbus: major update: added support for Modbus-ASCII, Modbus-TCP
  + common: added hexEncoding.jnc
  + api: added methods: log.Writer.writeString, writeError, writeLastError
  * network-sniffer: renamed folder to NetworkSniffer
  + cypress-uploader: added FPGA status check retries

  Jancy changelog:

  + jnc_io_ssh: added advanced method SshChannel.connect which accepts
    SshConnectParams struct with extra options
  + jnc_std: added operators == and  != for std.Guid
  - jnc_io_pcap: removed the now unused property io.Pcap.m_writeBufferSize and
    io.PcapEvents.WriteBufferReady
  + jnc_io_pcap: implemented io.Pcap.write (was not functional)
  + jnc_ct: added support for non-space separators in binary literals (useful
    when defining IPs, MACs, etc)
  + jnc_api: added jnc_Runtime_isAborted
  * changed int -> bool_t wherever int is used as bool
  + jnc_rt: added GcHeap::isAborted and Runtime::isAborted
  - jnc_rt: APC prototype fix (caused compiler error on 32-bit windows)
  + jnc_rt: use SIGUSR1 to try and wake up waiting threads in GcHeap::abort
  - jnc_rt: fix: GcMutatorThread::m_waitRegionLevel should be volatile
  - jnc_io_base: properly handle read-only & write-only file-streams on POSIX
  - jnc_rt: fixed missing type specifier in GcHeap::resumeTheWorld
  + jnc_rt:jnc_api: added jnc_Runtime_abort ()
  * jnc_sys: make sys.sleep alertable on windows
  - jnc_ct: fix: don't set the newly created unit as the current unit
    (leads to problems when nest-parsing stdlib entities)
  * axl_io: io::Pcap::write should distinguish between retvals from pcap_inject
    (returns actual size on success) and pcap_sendpacket (returns 0 on success)


...............................................................................

version 3.9.0 (2018-08-08)

  New major features:

  * Major logging engine update (now it's more responsive under high-load and
    with huge multi-gigabyte logs due to the fully parallel processing of
    indexing, representing, converting, searching, etc)
  + New plugins:
    + USB Control Endpoint (allows low-level communication with USB control
      endpoint #0)
    + TX Modifier (provides packet prefix/suffix, re-transmission,
      inter-character delays)
    + TX/RX Filter (allows switching TX/RX streams ON or OFF)
  + Serial baud rate combo-boxes are now editable (allows for arbitrary
    baud rate specification)
  + Hung server process detection and termination (now problems with the
    ioninja-server process should not affect the main GUI process)
  + Unicode temp paths are supported on Windows (previously, having a non-ASCII
    characters in TEMP would have resulted in the error: 'A device attached to
    the system is not functioning.')

  Main application changelog:

  * nj_app: improved handling of server crashes/hang-ups
  * nj_app: nagdlg layout update (didn't look too good on gnome)
  + nj_app: allow zero-length transmits (required by USB control transfers)
  - nj_gui: fix: ComboBox should set items value when it switches to editable
    mode
  - nj_app: fix: check for find-next/find-prev button state (in case invoked by
    shortcut)
  + conf: added TxModifier
  + nj_gui: allow adding child items to any property/information-item, not
    just groups (QTPB allows that)
  + nj_doc: added doc.Layer.m_isTransmitEnabled bindable const property - now
    layers may be notified when lower sessions enable/disable transmission
  + nj_app:nj_srv: added keep-alives (5 second timeout)
  - nj_srv: fix: restored registration of usb error provider
  - nj_app: fix: unmap index file on clear/rebuild
  * conf: re-factored plugin groups: now it's serial, network, file-systems,
    usb
  + nj_gui: added gui.ComboProperty.selectOption
  * nj_gui: made ComboBox.m_currentData read-write
  + nj_gui: added a separate binding for ComboBox.m_currentIndex
  * nj_app: rename default plugin groups ("other" for sessions, "generic" for
    layers)
  + nj_gui: added support for item values to gui.ComboProperty
    (EnumOption.m_value is used as actual value)
  - nj_gui: removed gui.ComboBox.m_isDualText property -- now every editable
    combo box behaves like this (item text - description, item data - value)
  - nj_app: fix: merge kind combo did not enable/disable merge threshold
    spinbox
  + nj_gui, nj_app: added new gui class: gui.ComboProperty
  + nj_srv: added self-pipe trick on POSIX. Apparently, closing STDIN does not
    terminate the ongoing 'read' (at least, not on Linux)
  + nj_app: added FileFlag_DeleteOnClose to plugin-settings and log-settings
    files
  - njs_app: fixed find-incremental/find-next/find-prev logic
  + nj_app, nj_srv: implemented clear-log/rebuild-log
  + nj_srv: use stdin to monitor state of the parent process
  + nj_app: use QShortcut for F3/Shift+F3 in the Find Dialog
    this way, there is no forced delay in between activations of the shortcut
  + nj_app, nj_srv: use the newly added io::FileFlag_Unlink, io::AutoDeleteFile,
    io::psx::AutoUnlinkSharedMemory
  * nj_app, nj_srv: use mapping name instead of file name for index lock

  Scripts changelog:

  * usb: split the usb endpoint plugin into two: usb data endpoint
    and usb plugin endpoint (completely different ui and io code)
  + common: added parseInteger.jnc
  * tx-modifier: removed groups (made use of the newly added ability to
    add children to any property)
  + tx-rx-filter: added setting persistency
  * serial: added SerialLogRecordCode.ControlLineChanged -- now control line
    changes can be encoded symmetrically with status line changes.
  - serial: removed inter-char delays -- now this funcionality is available
    via the TX Modifier layer
  + tx-modifier: initial commit of TX Modifier layer
  + common: added new file: escapeEncoding.jnc
  + tx-rx-filter: initial commit of TX/RX filter layer
  - wizards: fix: invalid signature for log.Filter.filter ()
  + api.gui: allow adding child items to any property/information-item, not
    just groups (qtpb allows that)
  + api.doc: added doc.Layer.m_isTransmitEnabled
  * conf: updated plugin grouping
  - serial-mon: fix: don't update port name while capturing
  - hw-serial-mon: fixed path to UsbLog.jnc
  * serial: all the serial plugins are finalized (use common ui, allow editing
    baud-rate, updated re api change in io.Serial.setupDevice)
  - common: bugfix: io.SerialSettingUi should check for presence
    of properties before accessing them
  - serial-tap: fixed serial setting configuration (was broken after moving the
    code to SerialSettingUi)
  * serial: don't try to set baud rate if it's the same
  * serial, serial-tap, ez-tap-pro, generic-serial-tap: extracted common setting
    code and shared it via io_SerialUi.jnc
  * all: redesign plugin grouping (now it's serial/network/file-systems/usb)
  + gui: gui.ComboBox.m_currentIndex now has a separate non-shared binding
  + added gui.ComboProperty.selectOption
  + added a convenient overload for gui.Toolbar.addComboBox
  * samples: removed hw-serial-mon and spi-tap from plugin folder
    and added those as samples
  + serial: make baud-rate editable (initial commit)
  - gui: removed m_isDualItemText
  * serial: use the newly added gui.ComboProperty for port name and baud rate
  + api: added new class: gui.ComboProperty
  * regex: log thread is no more; use suspend/resume instead
  - std: minor locking fix
  - ssh: fix: import "io_File.jnc" was missing
  - xmodem: fix: io.File.m_size is now read-only; use setSize instead
  - serial, udp: fixed signature for: log.Filter.filter

  Ninja Scroll engine changelog:

  - njs_log: fix: conversion mgr was unfunctional (never tested)
  - njs_log: a few int64/int32 fixes (relevant for 32-bit platforms)
  - njs_log: fix: invalid offset for save-log-as-text
  + njs_log: make bom configurable
  + njs_log: added support for bin-text lines in save-log-as-text
  - njs_log: typo fix: invalid caret pos returned by
    CachePage::getCaretPosFromLogPos
  - njs_log: fix: unbalanced lock calls on hidden records
  - njs_log: fix: don’t use setMouseCapture/releaseMouseCapture
  - njs_log: fix: bool function returning NULL
  - njs_log: fix: index file accessors MUST HAVE multiple dynamic views
    (otherwise walking the tree could cause page faults)
  * njs_log: set cursor to the *end* of selection upon successful
    find (more traditional approach)
  * njs_log: update "is-incremental-find" logic -- accept size
    decrement also (as long it's not empty)
  - njs_log: fixed wrapping in range processors
  + njs_log: added IndexFile::getZoneCount
  * njs_log: changed LogPos to only contain absolute zone-idx and zone-offset
  * njs_log: validate caret pos and redraw widget on log-clear
  - njs_log: fix: false-positive cache-miss in LogWidgeT::paintLineRange
  - njs_log: fix: suspension logic in RangeProcessor/ConversionMgr
  * njs_log: minor optimization of redrawing in
    CacheMgr::onRepresentPageCompleted
  * njs_log: use the newly added io::FileFlag_Unlink (dropped the old
    ifdef-ed code)
  - njs_log: critical fix: in CacheMgr::onRepresentPageCompleted
    it's NOT OK to touch 'page' pointer after scrolling or redrawing line
    ranges -- it might unload the page due to the cache size limit
  * njs_log: moved OnFoldRecordCompleted notification to IndexMgr
  - njs_log: fix: IndexMgr updated a leaf using m_recordIdx instead of
    m_recordCount
  - njs_log: fix: ConversionMgr has unbalanced suspend/resume inside stop ()
  * njs_log: create a dedicated cleanup thread in  RangeProcessorMgr
  - njs_log: fix: cache one extra record per page if the leaf is merged forward
  + njs_log*: the first working prototype of the new design

  QT Property Browser changelog:

  - qtpb: fix: invalid signal/slot names in
    QtComboEditorFactory::disconnectPropertyManager
  - qtpb: fix: clang failed to compile a double-right chevron in a template use
  * qtpb: check for unchanged value in
    QtComboEditorFactoryPrivate::slotPropertyChanged
  * qtpb: QtComboProperty now can use item data as actual text values (e.g.
    item text - device description, item data - device name)
  - qtpb: minor fixes in the newly added QtComboProperty... classes
  + qtpb: added QtComboProperty/QtComboPropertyManager/QtComboEditorFactory

  Jancy changelog:

  - jnc_io_usb: fix: UsbDevice::close should nullify m_asyncControlEndpoint
  - jnc_io_usb: fix: typo in UsbAsyncControlEndpoint::UsbAsyncControlEndpoint
  * jnc_io_usb: renamed requestId -> requestCode (for consistency)
  + jnc_io_usb: added support for asynchronous control transfers
    (initial commit, work-in-progress)
  + jnc_std: added std.Array.detach () / std.Buffer.detach ()
  - app: fixed main() error code on cmd-line parse error
  - cmake: changed language of jnc_dll to CXX (otherwise,
    -static-libstdc++ doesn't apply, which results in libstdc++.so dependency)
  * jnc_io_base: changed the order of values in io.Serial.setupDevice and added
    default values

...............................................................................

version 3.8.7 (2018-06-05)

  introduces: Tibbo Serial Tap plugin, shared library jancy-1.8

  Main application changelog:

  - nj_app: fix: check whether a layer has already been added (disallow adding
    duplicate layers)
  + inf: added .inf files and a script for .cat file generation and signing
  * sh: 7z archives are built using cpack instead of bat files
  + conf: added serial and spi tap plugins to plugins.conf
  * cmake: redesign packaging on Mac OSX
  - nj_app: removed explicit qt library path modification (better use qt.conf)
  * drivers: updated driver package to include the winusb co-installer (so it
    works on machine with no winusb)
  * cpack: use top-level-directory with archive generators
  + conf: added new filter wizard to wizards.conf
  - njs_srv: don't link to libusb and register usb error provider anymore
    since we've changed to dynamic linking to jancy.dll, it must be done there
  + nj_log: report Rx parts of TxRx to the app (so terminal can be used with
    dual-hex-view)
  + nj_log: fix: Log.suspend and Log.resume were not mapped
  + nj_log: added support for retro-colorization flags (aux flag for
    specifying the part of dual-hex-view)
  * nj_app, nj_srv: update conf dir detection (include ../etc/ioninja)
  - don't display crash-report-dlg if crash dir is empty
  + cpack: packaging for TXZ, DEB, RPM implemented
  * package: wix packaged updated to auto-install winusb drivers using
    dpinst.exe
  * inf: renamed dirs: inf -> drivers (more windows-traditional, even though
    there are no actual drivers)
  + nj_app, nj_srv: setup error router
  + register parse error provider; previously, we only linked jancy libs
    statically, so it wasn't necessary

  Scripts changelog:

  + regex-colorizer: added support for dual-hex view (e.g. SPI Tap)
  + common: throughput calc now processes log.StrRecordCode.TxRx
  + api: added RetroColorizeFlags.Aux (to specify which part to apply
    colorization to)
  - serial-tap: check for non-null mask before reporting status-line
    changes
  * serial-tap, spi-tap: removed usb.ids files and instead hardcode
    device ids into the script (not going to add more ids anyway)
  + spi-tap: initial commit
  - ez-tap-pro: fix: use m_highSpeed for anything above 115200 bps

  Ninja Scroll engine changelog:

  + njs_log: improved support for dual-hex-view: misc copy modes
    implemented, retro-colorization now has a aux-flag (to specify the which
    part to apply colorization to)
  - cmake: minor fix: using QT modules should happen BEFORE axl_set_pch
  - njs_log: fixed uint64_t <-> size_t warnings on x86

  Jancy changelog:

  * cmake: build with install rpath
  - jnc_api, jnc_dll: (temp solution) link to libusb and register usb
    error provider
  - jnc_rtl: fix: jnc.RegexDfa unconditionally set m_isIncremental in
    jnc.RegexState (probably, a brainfart)
  - jnc_rtl: fix: jnc.RegeDfa finalize did not update group counts in accept
    contexts
  - jnc_rt: fix: prevent longjmp unwinding on win64
  + jnc_app: setup error forwarding and register parse error provider
  - jnc_ext: removed propagateLastError (now irrelevant); setup error
    forwarding in *.jncx
  + jnc_api: implemented jnc_setErrorRouter
  * jnc_api: moved jnc_DynamicExtensionLibHost.h to the 'include'
    folder
  + jnc_api: added explicit definition of jnc_Error (maps to axl::err::ErrorHdr)
  * cpack: inverted the os-version order in the file name of a package
    (must be version-first)
  * cmake: workaround for SOVERSION on windows (jnc_dll)
  + added VERSION/SOVERSION properties to jnc_dll
  * cmake: renamed jnc_api_static -> jnc_core and jnc_api_dynamic ->
    jnc_api_ext
  * changed JNCX dir from JANCY_BIN_DIR to JANCY_DLL_DIR (not the same on unix)
  * cmake: link all the executables to the jancy dll (if it's being built)
  + jnc_ext: added object libraries for jnc_rtl, jnc_std, jnc_sys
  + jnc_api: export api functions when building cmake object library
  + jnc_dll: build dynamic library jancy-x.x.dll
  - jnc_api: fixed a few missing JNC_EXTERN_C declarations

  AXL changelog:

  * axl_sys: updates in sys::ReadWriteLock re named sems on posix
  + axl_err: added support for error forwarding
  * cpack: inverted the os-version order in the file name of a package
    (must be version-first)
  - cmake: removed rpath direct modification via linker options (should
    be done via CMAKE_INSTALL_RPATH in actual projects)
  * cmake: switch to dynamic link (/MD /MDd) by default
  - axl_sl: minor fix: sl::BoxIterator::r () -- better reference
    m_value directly (rather than as: *p())

...............................................................................

version 3.8.6 (2018-04-26)

  introduces: new EZ-Tap Pro plugin

  Main application changelog:

  * nj_gui: added property: gui.InformationValue.m_valueColor
  * nj_gui: added property: gui.ComboBox.m_isDualItemText
    this allows having an editable combo box with descriptive items in the
    drop-down (e.g. editable port names, device descriptions in the drop-down)
  * nj_app: emit cursor-pos changes and index-file changes once a second
    this changes renders the timer in InformationWidget irrelevant

  Scripts changelog:

  + plugins: added new plugin: EZ-Tap Pro (initial commit)
  + generic-serial-tap: new command: flip DTE/DCE
  + tibbo-serial-tap: new command: flip DTE/DCE
  - serial: fix: removed trailing \n from the port-opened log message
  * plugins: updated HwSerialMon for Cypress EZ-USB FX3 -- we are
    ditching FT601x (good riddance)
  + plugins: use the new prop gui.ComboBox.m_isDualItemText in serial
    and serial mon plugins
  - plugins: removed DCD line info
  + plugins: added new plugin: Tibbo Serial Tap Cable
  * plugins: renames: SerialTapCable -> GenericSerialTapCable,
    ModbusGatewayMon ->TibboModbusGatewayMon
  + api: added properties: gui.ComboBox.m_isDualItemText,
    gui.InformationValue.m_valueColor
  - udp: fix: apply socket and buffer properties to the socket
  + common: added new socket property: udp broadcast
  * common: renamed"local/remote TCP port" -> "local/remote port" -- these
    are used for UDP, as well
  * moved all scripts to a dedicated repo; public mirror at:
    https://github.com/vovkos/ioninja-scripts

  Jancy changelog:

  + jnc_io_usb: added support for control transfers (io.Device.controlTransfer)
  - jnc_io_usb: fix: invalid location for clearing active events (lock
    was released after that) -- may have caused events to be never noticed
  - jnc_io: fix: apply SocketOption_UdpBroadcast and enforce
    AsyncIoOption_KeepReadBlockSize | AsyncIoOption_KeepWriteBlockSize for
    datagram sockets in SocketBase::setOptions

  QT Property Browser changelog:

  + qtpb: added support for value color (QtProperty::valueColor/setValueColor)

  AXL changelog:

  + axl_sl, axl_ref, axl_err: use rvalue refs in all ref-count-buffer-based
    classes
  + axl_g: added simple detection of rvalue-ref support in C++ compiler
  * axl_ref: moved ref::RefCount functions to .h; replaced size_t ->
    int32_t and removed bitfields -- for a minor performance improvement
  * axl_sys: use intrinsics for interlocked ops on windows
  + axl_sl: added branchless algo from hacker's delight for hi-bit/lo-bit
  + axl_io: added support for async control transfers -- for completeness

...............................................................................

version 3.8.5 (2018-04-09)

  introduces: server-side log processors in the Ninja Scroll enging, dramatic
  performance increase in find-in-log and save-log-as-text for large (multi-GB)
  logs, new information pane, throughput calculator, checksum calculator,
  new Tibbo Modbus Gateway Monitor plugin.

  Main application changelog:

  + nj_app: added calc-progress-bar in information widget (unified with
    rebuild-progress-bar)
    also, added nice thousand-separated formatting for large integers
  - nj_srv: fix: cancel all active range processors during shut down (definitely
    before shutting down plugin runtimes)
  * nj_app: alleviated evaluation restrictions on Crash Report dialog (can
    skip sending, aka "not now")
  * nj_app: don't update information widget unless it's visible
  + nj_app: added a new erasor icon
  * nj_srv: add udev dependency (needed when linking to libusb statically)
  - nj_app: fix: save transmit pane during session switching
  - nj_gui: fix: all information values should be read-only
  - nj_log: remove RangeProcessor::startRecord; instead, set timestamps and
    record codes in RangeProcesor::processXxx. this allows for more precise
    timestamp-based calculations
  + nj_gui: added property: gui.EnumProperty.m_currentText
  * nj_app: reduce flickering in the information widget by delaying the
    disable of selection-dependent items don't show "updating..." until the next
    update cycle -- chances are, range processor will finish before then
  + nj_app: added command: select all
  + nj_app, nj_srv: added support for selection processors
  + nj_app: added information pane
  * nj_gui: updated StringPropertyAppPeer for the new qtpropertybrowser
  + nj_app: added 'delete all' button to crash report dialog
  + nj_app: new save-log-as-text using range processors (rather than cache
    processors)
  * nj_app: minor ui fixes in find dlg
  + nj_app: replaced cache find (client-side) with range find (server-side)
  + nj_app, nj_srv: added SrvMsgCode_ProcessHyperlink

  Scripts changelog:

  - scripts: removed Hardware Serial Monitor (to reduce confusion)
  * scripts: renamed files: ModBus -> Modbus
  + scripts: added Tibbo Modbus Gateway Monitor plugin
  * scripts: usb endpoint should use max-packet-size as read-block-size
    this way, the responsiveness is better (this plugin is a usb endpoint
    terminal, after all)
  - scripts: fix: properties of io.UsbEndpoint were not updated properly
  + scripts: added momentary tx/rx throughput calc
  * scripts: use thousand-separated format for all sizes
  + scripts: sniffer: added ARP/INARP support to the Network Sniffer plugin
  + scripts: file stream: added message: "file cleared"
  * scripts: file stream: read all the buffered data on eof
  + scripts: added standard information values to all the plugins
  * scripts: refactor: trhoughput calculator, checksum calculator, std session
    info
  + scripts: added simple checksums (sum8, sum16-le, sum16-be)
  + scripts: added session timer
  * scripts: re-factored/updated checksum information set
  + scripts: added utility function for ip4 checksum incremental calculation
  - scripts: fixed name: should be crc16_ccitt, not "ccit"
  - scripts: io.Pcap.m_snapshotSize is read-only (remnants from the previous
    version of jancy)
  - scripts: fix: a bug in modbus exception processing
  + scripts: added crc32.jnc
  + scripts: selection processors & related infos are extracted into common
    files

  Ninja Scroll engine changelog:

  - njs_log: critical bugfix: mini-index file was not cleared on reset
  + njs_log: added sync method Server::cancelAllRangeProcessors
  - njs_log: typo fix: if the end page is not cached, range process
    must be postponed; but it was added to the start page, not the end page
    as it should
  - njs_log: fix: incorrect calculation of njs::LogPos on merged page borders
    (the last line of a merged page contanis records from two leaves)
  * njs_wdg: keep selection on tab keypress
  - njs_log: fix: new zone should only processed when we are in range
  - njs_log: fix: LogWidget::isBinSelection () was incorrect (just used the
    cursor position)
  + njs_log: added LogWidget::selectAll () method
  * njs_log: only call onCursorPosChanged when the pos actually changes
  - njs_wdg: fix: copy from terminal stopped upon the very first empty
    line
  + njs_log: added field: RangeProcessor.m_zoneOffset
  * njs_log: rename RangeProcessor::processDualBinHex -> processDualBin
  + njs_log: added StdRangeProcessorId_Last constant
  + njs_log: added NotifyCode_IndexFileChanged
    changed logic in getLogPos (need to handle selection start differently)
  + njs_log: export informational functions from IndexFile/CacheMgr
  + njs_log: added save bin as file & save log as text range processors
  - njs_log: fix offset issue in TextFindRangeProcessor set caret to the
    beginning of selection -- otherwise, using keyboard after find produces
    unexpected log jumps
  - njs_log: fix: RangeFind should use 0 as an indicator for invalid
    processId, not -1
  * njs_log: refactor UI update limitation code
  + njs_wdg: add a flag CursorFlag_KeepSelection to keep selection when
    setting caret
  - njs_log: fix: adjust record count in mini-index leaves
  * njs_wdg: LineWidget::getSelection should return caret pos if actual
    selection is empty
  - njs_log: fix: when wrapping, also update leaf zone idx and zone offset
    -- otherwise, isFinished may return false-positive
  * njs_log: check for failed processRange (processId == 0)
  + njs_log: added RangeFind::getProcessId accessor
  + njs_log: populate mini index file in log server
  - njs_log: fix: incorrect calculation of m_zoneOffset in
    CountingRepresenterTarget
  * njs_log: zone indexing re-design
  + njs_log: TextFindRangeProcessor/BinaryFindRangeProcessor prototypes
    are functional
  + njs_log: added server-side RangeProcessor-s

  Jancy changelog:

  + jnc_io_usb: support out-of-order completion of usb transfers
  - jnc_io: removed incorrect assert (!m_readBuffer.isFull ()) in
    AsyncIoDevice::bufferedReadImpl_l
  + jnc_io_usb: added property UsbEndpoint::m_readTimeout
  - jnc_io_usb: fix: incorrect context for USB transfers
  - jnc_io_usb: fix: Endpoint::m_isOpen was not properly initialized
  - jnc_io_usb: fix: usb transfer was not properly allocated prior to
    fill & submit
  - jnc_ct: fix: bigendian enums were not handled properly
  + cmake: add crypto & udev dependencies (needed during static link to
    libusb & libssh2)
  - cmake: don't use axl_set_export_version_scrtipt on mac, where the
    --version-script option is not supported
  * jnc_io: advance disk file position on windows (overlapped IO requires
    explicit offsets)
  + jnc_sys: added sys.formatTimestamp () functions
  - jnc_ext: fixes re the latest change in axl::sl::HandleTable
  - jnc_ct: fix: data/class ptr type tuple had incorrect handling of
    readonly pointers
  - jnc_io: fix: process 0-lengthed return in FileStream as EOF indicator
  - jnc_io: minor fix: incorrect logic in AsyncIoDevice::setEvents_l
  - jnc_io: fix: AsyncIoDevice::m_readOverflowBuffer was not cleared on
    open; this could leave to inconsisten buffer state when a device is
    closed during intense IO and then re-opened
  - jnc_std: remove readonly modifier from fields of struct std.Error
  - jnc_io: critical bugfix: lock inside markOpaqueGcRoots
  - jnc_ext: fixes re the latest change in axl::sl::HandleTable
  - jnc_ct: fix: data/class ptr type tuple had incorrect handling of
    readonly pointers
  - jnc_io_base: fix: interpret 0-lengthed serial read on POSIX as EPIPE
    (broken pipe)
  - jnc_ext: fixes re the latest change in axl::sl::HandleTable
  - jnc_ct: fix: data/class ptr type tuple had incorrect handling of
    readonly pointers

  QT Property Browser changelog:

  + qtpb: added QtProperty::valueToolTip and disabledValueText
    properties
  - qtpb: fixed displayMode (must be part of StringPropertyManager)
  + qtpb: added StringPropertyManager::isReadOnly/setReadOnly property
  + qtpb: added QtTreePropertyBrowser::resizeNameColumnToContents method

  AXL changelog:

  - axl_cmake: removed GCC_LINK_FLAG_EXPORTLESS_EXE on mac -- ld here doesn't
    support --version-script
  + axl_gui: added QT_NO_VERSION_TAGGING
  * axl_gui: don't check if caret was visible before, force caret update
  - axl_enc: fix: UTF-8 -> UTF-32 -> UTF-8 should yield the same length
  - axl_sl: critical bug fix: TextBoyerMooreFind::find should use length,
    not size
  - axl_sl: fix: reverse boyer moore accessor save tail incorrectly
  * axl_sl: minor update in sl::String: s2 & s3 should return sl::String,
    not sl::StringRef
  + axl_gui: added convenient constructors to class HyperText
  - axl_sl: gcc-related fixes in sl::HandleTable
  * axl_sl: refactor: sl::HandleTable is now uniform with the other maps

...............................................................................

version 3.8.4-a (2018-02-29)

  * axl_cmake: gcc: export NOTHING from executables and JUST the specified
    symbols -- from shared libs to improve portability across various Linux
    distros
  * jnc_ct: typo fix: ExtensionLibMgr reported a wrong error if dynamic
    extension could not be loaded

...............................................................................

version 3.8.4 (2018-01-26)

  introduces: new Serial Tap Cable plugin, new streaming mode in Tibbo Device
  Monitor, all Tibbo Device Monitor-based plugins use generic class
  io.DeviceMonitor and do IOCTL decoding in Jancy scripts, detection of
  buggy serial drivers on Windows with fall-back to conservative settings, a
  few critical bug fixes in the Ninja Scroll logging engine.

  Main application changelog:

  + nj_app: add a break between main and session toolbars (this way they
    initially are displayed on two separate lines, rather than being next to
    each other on a single line)
  - nj_srv: fix: relative timestamps (compile times) should use time-zone #0
  + nj_log: added log.StdRecordCode.Alert (as a more severe warning on pastel
    orange background)
  * nj_app: set GC guard page as the default everywhere; previously, the default
    for windows x64 was gc-simple-call
  - nj_app: workaround: avoid calling QIcon::availableSizes ()
    currently, we use static linking to CRT, it means QT dlls use a different
    memory allocator than the main EXE module; returning templated classes
    (QList <QSize> in this particular case) under these conditions is not safe
  * cmake: added libusb as optional dependency
  * package: removed nj_io_mon.jncx from all the packages (io_devmon.jncx will
    be pacakges with all the other jancy extensions)

  Scripts changelog:

  - scripts: restore defaults button should not reset port name(s)
  - scripts: use 'try' in 'gui.ComboBox.m_onEnter' handlers so that a possible
    exception is not added to the log.
  * scripts: minor update to the serial log port open message (for consistency)
  * scripts: make RxBufferFull message optional (and OFF by default)
  * scripts: rename: ReceiveBufferFull -> ReadBufferFull, TransmitBufferReady
    -> WriteBufferReady
  + scripts: new plugin: serial tap cable session
  * scripts: minor re-factoring in Serial plugin
    (adjustSerialSettingsForBuggyDrivers -> detectSerialBuggyDriver +
    setConservativeSerialSettings) this way, it's more convenient to apply to a
    dual-serial port sessions such as Serial Tap-Cable
  - scripts: typo fix in Mailslot session: m_syncId is now a member of
    MailslotSession, not io.Mailslot
  - scripts: removed ring status line change detection (it's not shown in
    log/status-bar anyway)
  + scripts: SerialMon for Linux: implemented termios IOCTL parsing
  * scripts: renamed io.SerialFlowControl.XOnXOff ->
    io.SerialFlowControl.XonXoff (for consistency)
  + scripts: added workaround for buggy drivers such as the one from Prolific
  * scripts: rename: log.StdRecordCode.RxBufferFulllLossless ->
    log.StdRecordCode.RxBuffeFull
  * scripts: moved SerialReadMode to SerialLog.jnc (otherwise, serial monitor
    fails to compile)
  + scripts: added overridable method: io.Monitor.processError
    normally, we also want to close the active connection whenever an error
    occurs; it has to be done from within the main session class
  * scripts: changed the order of PID/file ID in monitor sessions
  + scripts: serial: added more info to port-open log record; merged two props
    (wait-first-char & check-comstat) into one (read-mode); write read-mode and
    read-interval changes to the log
  * scripts: serial: use io.Serial.setupDevice for applying all the settings at
    once and avoiding multiple SetCommState/tcsetattr calls
  + scripts: serial: added DTR/RTS properties so it's possible to fully control
    the serial port from the setting property page
  * scripts: serial: disable RTS button/property when RTS/CTS is on.
  * scripts: ported all the remaining plugins to the new Jancy IO model
  + scripts: create a dedicated class io.Monitor --  it reads from tdevmon in
    stream mode, accumulates notification package andthen calls the overridable
    handler

  Ninja Scroll engine changelog:

  - njs_log: criticial fix: don't update CachePage::m_indexLeaf inside
    updateIndexTailLeaf unless we have successfully applied the part buffer
    (could cause occasional and hard-to-catch crashes)
  - njs_log: there is no need to check page for null (getPageByIndexLeaf always
    returns a non-null page ptr)
  * njs_log: make updateTailLeaf return IndexLeaf* and also assert on
    growing record count/size
  - njs_log: critical bugfix: don't unconditionally nullify the current
    line during fold
  + njs_log: added overload ServerPeer::writeRecord (const char*)

  Device Monitor changelog:

  - dm_app: fix: properly configure monitor on linux (including the final
    enable call)
  + dm_app: added the file name wildcard cmd-line switch on linux
  - dm_win_lib: fix: reading blobs was inefficient (was starting with 0 bytes
    -- have to start with something reasonable, e.g. 256)
  - dm_app: fix: monitor was not initially enabled (it was working due to a bug
    in the driver -- enable counter was ignored)
  * dm_app: minor update in output format for file name wildcard
  * dm_app: updates re the latest kernel-module api changes
  - dm_win_sys_core: critical bugfix: removed the leftover KeAcquireSpinLock
    inside loop in Connection_p_notifyMessage_l
  + all-drivers: added a debug suffix to all description strings
  - dm_win_sys_core: fix: partial notifications had incorrect
    PendingNotify.m_size field; this resulted in garbaged stream and likely
    an invalid-signature error
  * dm_win_sys_core: major update: re-write cancellation race protection and
    prevent notification order races
  + dm_win: added a dedicated code dm_NotifyCode_DataDropped for data dropped
    notifications
  * dm_win_sys_core: removed const modifier from MemBlock* paramBlockArray
    this is necessary for copyScatterGatherPartial (in streaming mode)
  + dm_win_sys_cmn: added copyScatterGatherPartial for copying scatter-gather
    into multiple buffers
  - dm_win_sys_core: fix: check for m_enableCount before notification
  - dm_win_sys: bugfix: DM_IOCTL_SET_FILE_NAME_FILTER should check in buffer
    size, not out buffer size
  * dm_win_sys: style: use upper-case for types (DDK/WDK-style)
  - dm_win_sys_core: fixed warning re UINT -> USHORT conversion
  + whdc: added test-sign script for testing the drivers under win10
  + dm_win_sys: dm_win_lib: added streaming mode (message mode is still
    available as an option)
  * dm_win_sys: changed API a bit -- now pending notify limit and file name
    filter could be set after connection to a device is established (so it's
    possible to adjust it on-the-fly)
  - dm_lnx_lkm: removed redundant trailing '...' from printk's
  * dm_lnx_lkm: switched the order of fields in dm_IoctlDesc (to make it more
    convenient to use curly initializers) the old API (via Connect_v0302xx) is
    still available -- the order of fields is adjusted dynamically
  + dm_lnx_lkm: added debug printk's on setting the IOCTL desc table
  + dm_lnx_lkm: added support for FIONREAD
  + dm_lnx_lkm: ported the new streaming notification model (with partial
    scatter-gather and postponed read completion) to LKM
  + dm_lnx_lkm: added dm_NotifyCode_DataDropped
  + dm_lnx_lkm: added function: copyScatterGatherPartial
  - dm_lnx_lkm: fix: IOCTL argument should not be size_t; use uint32_t instead
  + dm_lnx_lkm: streaming mode (message mode is still available as an option)
  + dm_lnx_lkm: added a bunch of IOCTL codes for post-connect configuration
  + dm_lnx_lkm: added support for file-name filtering (so it's possible to hook
    a driver and then receive notifications for all the device it's serving)

  Jancy changelog:

  - jnc_io_base: fix: in io::FileStream::open PIPE_READMODE_MESSAGE is only
    applicable to named pipes (when GetFileType returns FILE_TYPE_PIPE)
  - jnc_io_base: bugfix: length of \\.\pipe\ and \\.\mailslot\ prefixes was
    calculated incorrectly
  - jnc_io_base: bugfix: don't read in io.FileStream if it was opened with
    io.FileFlags.WriteOnly
  + jnc_io_base: ensure \\.\pipe\ prefix in io.NamedPipe.open
  - jnc_io_xxx: critical bugfix: all the newly ported IO classes had null
    markOpaqueGcRoots (instead, should call AsyncIoDevice::markOpaqueGcRoots)
  + jnc_ct: added utf8_t, utf16_t, utf32_t to jnc_StdTypedefs.jnc (for stdlib
    doc generation)
  - cmake: fix: -D_JNC_DYNAMIC_EXTENSION_LIB must be added prior to axl_set_pch
  * jnc_io_xxx: rename: ReceiveBufferFull -> ReadBufferFull,
    TransmitBufferReady -> WriteBufferReady
  - jnc_ct: critical bugfix: octal constant tokens were converted to numbers
    using the decimal radix
  - jnc_io_devmon: don't check getIncomingDataSize (not really necessary)
  - jnc_io_base: don't check getIncomingDataSize (not really necessary)
  * jnc_ct: when searching in namespaces, don't go to parent namespaces of
    base types
  * jnc_io_base: rename XOnXOff -> XonXoff (for consistency)
  - jnc_ct: fix: use module global symbol map (m_functionMap) for maping global
    variables on llvm versions < 4.0.0
  * jnc_ct: use '?' prefix for global variables (just like we do for functions)
  * jnc_ct: changed the implementation of Module::mapVariable
  - jnc_io_devmon: POSIX fix: m_ioThreadEvent.wait () -> sleepIoThread ()
  - jnc_sys: typo fix: incorrect flag assignments in sys.SystemInfo
  * jnc_sys: fix: OsFlag's had wrong values
  - jnc_io_usb: POSIX compilation fix: include "axl_io_psx_Pipe.h" was
    missing
  - jnc_io_pcap: POSIX compilation fix: m_ioThreadEvent.wait () ->
    sleepIoThread ()
  - jnc_io_base: POSIX compilation fix: createIncomingConnection () ->
    m_incomingConnectionPool.get ()
  + jnc_std: added functions: strncmp, strnicmp, strneq, strnieq,
    strichr, stristr
  + jnc_io_base: added function: io.getSymbolicLinkTarget
  - jnc_io_base, jnc_io_usb, jnc_io_pcap: removed unnecessary declarations of
    the now-missing event params
  - jnc_io_base: fix: removed the now-missing Mailslot.m_syncId field
  - jnc_io_devmon: fix: m_overlappedIo was not allocated/freed
  + jnc_std: added property: std.StringBuilder.m_sz (which is always
    non-null and zero-terminated)
  + jnc_io_base: added method: io.File.flush ()
  + jnc_io_base: added io.Serial.setupDevice for setting all the
    setting with one call
  * jnc_io_base: replace ^ with != (reads cleaner)
  * jnc_sys: changed sys.g_systemInfo to a variable (instead of a property) and
    map it directly
  + jnc_ct: added a pragma-todo-warning re retval coercion on MSC 32-bit
  + jnc_api, jnc_ct: added support for mapping global variables
  - jnc_io_usb: fixed warning re singed-unsigned-comparison
  + jnc_api: added NOMINMAX definition under windows
  * jnc_io_ssh: use AsyncIoDevice::setSetting for changing read block
    size
  * jnc_io_usb: ported io.UsbEndpoint to the new IO architecture
  * jnc_io_pcap: ported io.Pcap to the new IO architecture
  * jnc_io_base: ported io.NamedPipe, io.Mailslot, io.FileStream to the new
    IO architecture
  * jnc_io_base: io.SocketAddressResolver now uses completion routine
    arg rather than event field
  * jnc_io_devmon: moved all overlapped-related fields in io::DeviceMonitor
    to struct OverlappedIo
  * jnc_io_base: moved all overlapped-related fields in io::Socket & io::Serial
    to struct OverlappedIo
  * jnc_io_cmn: removed overlapped read list & overlapped write block
    from the base class AsyncIoDevice
  + jnc_io: added tdemon-based device monitoring extensions library
    io_devmon.jncx
  - jnc_rt: bugfix: class field boxes of base types were not added during
    allocation
  + jnc_std: added standard error guids: errno, winerror, ntstatus
  + jnc_std: added overloads in std.StringBuilder for dealing with UTF-16 &
    UTF-32
  - jnc_io: bugfix: AsyncIoEvent_ReceiveBufferFull was not cleared in
    AsyncIoDevice::bufferedRead
  - jnc_ct: fix: choosing overloads could end prematurely (incorrectly reporting
    ambiguous call)
  - jnc_ct: fix: when up-casting class pointers, don't check safe pointers for
    null
  + jnc_ct: added standard typedefs: utf8_t, utf16_t, utf32_t
  * jnc_api: move warning suppressions to a dedicated file (no pragma once)
  + doc: added --ignore-import io_base.jncx cmdline switch in stdlib
    documentation
  + jnc_app: added a command line option for adding ignored imports
  + jnc_ct, jnc_api: added ignored import set
  - jnc_ct: removed the unneeded file path string cache

  AXL changelog:

  * axl_io_win: when enumerating serial ports, use SPDRP_FRIENDLYNAME first,
    then SPDRP_DEVICEDESC as a fallback (SPDRP_FRIENDLYNAME yields a
    description just like in the Device Manager)
  - axl_io: typo fix: SerialSettings constructor didn't propagate dtr & rts
    values
  + axl_g: added macros _strnicmp/_wcsnicmp on POSIX (mapping to
    strncasecmp/wcsncasecmp)
  + axl_io: implemented getSymbolicLinkTarget for POSIX (via readlink)
  - axl_io: fixed missing 'const' qualifier in
    SharedMemoryTransportBase::initializeMapping ()
  + axl_io: added io::getSymbolicLinkTarget (implemented on windows via
    NtQuerySymbolicLinkObject)
  + axl_core: added axl_sys_win_NtDll.h/cpp to store native NT declarations
  * axl_io: on windows, setting all serial settings via DCB affects DTR & RTS;
    therefore, we must include it in io::SerialSettings and update it
    whenever we modify flow control
  * axl_io_win: enumerate serial ports using GUID_DEVCLASS_PORTS (a driver may
    fail or choose not to register the GUID_DEVINTERFACE_COMPORT interface)
  * axl_g: g::Module::getSystemInfo should return a const-pointer
  * axl_g: removed leading underscore from AXL_CPP_xxx_VERSION defines
    (for consistency)
  + axl_g: added NOMINMAX definition under windows
  + axl_err: added a constructor overload for err::Error to allow passing string
    literals as errors
  + axl_sl: added an assert to StringRef::attach (length must not be -1)
  + axl_mem: added a simple mem::Pool <T> template class for fixed-sized memory
    pools
  - axl_io: fix: must clear flow control fields in the DCB prior to setting the
    new value
  * axl_g: minor cleanup of the warning suppression file

...............................................................................

version 3.8.3 (2017-12-15)

  introduces: major redesign of Jancy IO model, support for guard-page-based
  GC safe-points on Windows x64, advanced IO & buffering options in plugins

  Main application changelog:

  * nj_app: show error message in message box only if there's no plugin startup
    dialog
  * nj_srv: always return 0 on success; print error messages to stderr
  - nj_app: critical bugfix: don't nullify SessionStartupSyncReqSlot in
    processMsg_OnStartupCompleted (could lead to a deadlock if plugin failed to
    load properly)
  - nj_app: bugfix: receiving transmit-disabled notification should not affect
    the transmit pane unless the document is active
  + nj_log: added StdRecordCode.RxBufferFullLossless &
    StdRecordCode.RxBufferFullLossy
  + nj_srv: add errors & exceptions to the main log
  - nj_gui: bugfix: incorrect check EnumProperty::setCurrentIndex (should be
    >= count)
  - njs_srv: fix: check m_workerThreadTerminateFlag in worker thread request
    processing loop
  - nj_app: bugfix: next-time combo box in crash report dialog was not
    serialized properly
  - nj_app: bugfix: usage report and crash reports could not be disabled (even
    for paid licenses) - the check for a paid license was made too early (before
    license mgr initialization)
  - nj_srv: crash during compilation stage caused invalid manifest collection
    (log is not opened)
  + nj_app: allow guard page safe points on win64
  - nj_app: bugfix: transmitting a file caused invalid selection in history
    combo
  - nj_app: bugfix: submitting usage report during the initial open (e.g.
    `ioninja serial`) lead to a crash
  * nj_srv: link to dbghelp.lib on windows. somehow it worked without explicit
    linking on msvc10, but it doesnt on msvc14
  - nj_app: fix: handle server process exit (e.g. during system
    shutdown/restart)

  Scripts changelog:

  + scripts: ported tcp connection socket, udp socket, ssh channel, tcp proxy and
    serial to the new jancy io model
  + scripts: added advanced buffering options to serial and all socket-based
    plugins:
    * read parallelism
    * read block size
    * rx buffer size
    * tx buffer size
    * keep read block size
    * keep write block size
  + scripts: added advanced socket options to all socket-based plugins:
    * tcp keep-alives
    * tcp nagle
    * tcp reset
    * re-use address
  + scripts: added advanced serial port options to the serial plugin:
    * read interval
    * comstat check
    * wait for the first char

  Ninja Scroll engine changelog:

  + njs_wdg: added support for ESC D, ESC M
  - njs_wdg: fix: properly handle newline inside a scroll-region
  - njs_wdg: fix: when deleting lines, fill the space with background color
  - njs_wdg: fix: terminal widget did not always invalidate necessary lines on
    scroll
  + njs_wdg: improved support for xterm scroll regions
  - njs_wdg: bugfix: cursor pos should be re-validated after console size
    change (could lead to crashes on terminal resize)

  Jancy changelog:

  * jnc_io: use the new axl::io::Serial::open to open serial port in
    asynchrounous mode
  + jnc_sys: added sys.g_systemInfo property
  + jnc_api: added alias _JNC_CPU_IA32 (the same as _JNC_CPU_X86)
  - jnc_ct: fix: set value to ValueKind_Void when const-casting to (void)
  - jnc_ct: fix: incorrect check for void value in ControlFlowMgr::ret
    (const Value&)
  + jnc_io: added SocketOption_TcpKeepAlive (translates to SO_KEEPALIVE)
  + jnc_ct: fix: handle returning of values from void functions
  + test: added a test for checking the recent modification re gc
    shadow stack frame maps
  - jnc_ct: critical bugfix: for-loop had incorrect sequence of
    jump/close-scope (could lead to premature release of temp gc-heap vars)
  * jnc_ct, jnc_rt: critical update: changed the way shadow stack frame
    maps are initialized and set
  * jnc_ct: remove Unit* argument from OperatorMgr::parseXxx (...) set
    of functions;  instead, set current unit explicitly (the same spot where
    we open namespaces)
  * jnc_io_base: redesigned io.Socket
  + jnc_io_ssj: redesigned class io.SshChannel
  + jnc_io_base: redesign of io.Serial class (using async event model)
  + jnc_io_cmn, jnc_io_base: added io.AsyncIoDevice (will be base for
    all asynchronous IO classes: Serial, Socket, SshChannel, etc)
  * jnc_ct: bool should belong to TypeKindFlag_Integer
  - jnc_ct: incorrect assert in ClassType::markGcRootsImpl -- opaque
    classes may be derived from!
  - jnc_ct: fix: bitwise-xor operator should keep bitflag enum type (just
    like bitwise-or)
  * jnc_rt: switch to vectored exception handling on windows; remove
    seh frames remove jnc_handleSehException;
  * jnc_rt: by default use gc guard page and no explicit check-calls everywhere
  + jnc_rt, jnc_ct: added rt::ExceptionMgr to handle null-ptr-access &
    div-by-zero with signals on POSIX and with vectored exceptions on Windows
  * jnc_ct: split entry block into two: alloca & prologue
  + jnc_ct: ported to llvm-5.0

  AXL changelog:

  - axl_io: fix: clear "bad" termios attributes
  + axl_io: apply read interval via c_cc VTIME:
  + axl_io: modified io::Serial::open to allow choosing sync vs async
    using io::FileFlag-s
  + axl_g: added alias _AXL_CPU_IA32 (the same as _AXL_CPU_X86)
  * axl_sl: treat uninitialized empty CircularBuffer as valid
  + axl_io: added axl::io::win::Socket::wsaGetOverlappedResult (...)
    methods
  + axl_sl: added sl::CircularBuffer:drop method
  + axl_sl: added sl::Handle::takeOver method
  + axl_sl: added a simple circular buffer class sl::CircularBuffer
  + axl_sys_win: try to FormatMessage (FORMAT_MESSAGE_FROM_HMODULE) for
    getting NTSTATUS description if RtlNtStatusToDosErrorFunc failed
    (returned the same code)

...............................................................................

version 3.8.2 (2017-11-24)

  introduces: major optimization in ninja scroll logging engine for bin-text
  lines and large log files (plus a few critical bugfixes), a critical bugfix
  in jancy scripting engine, hi-precision (sub-microsecond) timestamps on
  windows 8+, crash reports, usage reports, new version popup notifications.

  Main application changelog:

  - nj_doc: fix: reset current directory to root in StorageParser::finalize
  - nj_app: bugfix: clicking "reset terminal" in terminal context menu was
    incorrectly directed to the active document (wrong for floating terminals)
  + nj_app: added floating/tabbed items to the terminal context menu
  + nj_app: implemented play-log-in-terminal functionality
  + nj_app: collect and submit crash-reports (configurable: always-on/confirm/
    off)
  + nj_app: added a popup dialog when a new version is found (configurable:
    popup/asteris/off)
  + nj_app: encrypt usage and crash reports (configurable)
  - nj_app: set fixed size for the status-bar (to prevent if from being
    stretched by plugins)
  - nj_app: don't do any network requests until a user presses "Agree" on the
    initial nag screen
  - nj_app: bugfix: clicking Remove All on the Add-on Plugins page could lead to
     a crash
  - nj_app: bugfix: layerPluginUsageStats argument list was not null-terminated
    (caused occasional crashes)
  - nj_app: use RtlGetVersion instead of GetVersionEx (which may lie about the
    actual OS version depending on the app' manifest)
  + nj_app: generate a unique installation ID and submit it in every usage
    report
  * conf: changed comments from // to #
  + all: generate linker debug information in Release builds
  + package: create an extra archive with pdb files
  + legal: added privacy.txt file with detailed description of our privacy
    policy

  Scripts changelog:

  + scripts: sniffer: added handling of io.PcapEventCode.IoError
  + scripts: ssh: track console size changes during connect
  + scripts: added default remote port setting to TCP, UDP & SSH sessions
  + scripts: use std.getPreciseTimestamp in log
  - scripts: removed debug printfs
  + scripts: added PID information to all tdevmon-based monitors
  + scripts: added gui.ComboBoxHistory class extenstion all the scripts now use
    it instead of (now removed) gui.ComboBox.addEditTextToHistory
  * wizards: change icons for all the plugins (previously it was a tennis ball
    from the Echo plugin, now it's a generic "plugin" icon)

  Ninja Scroll engine changelog:

  - njs_log: critical bugfix: merge-id should be a part of each index
    leaf (not just merged ones)
  * njs_log: only processUiEvents on rebuild (otherwise, it introduces
    unnecessary latency on incremental log updates)
  * njs_wdg: don't scroll to bottom on resize by default (do that for
    terminal widget only)
  - njs_log: critical bugfix: in bin-text line we should check for
    enc::utfIsPrintableNonMark (not just enc::utfIsPrintable) -- could cause
    occasional crashes
  - njs_log: fix: codec for wchar_t is platform-dependent (utf16_t/utf32_t)
  + njs_log: show tooltips with HEX-ASCII/U+ notation for bin-text lines
  - njs_log: fix: default copy processing for bin-text lines should
    take actual data bytes, not binText string (because binText is
    translated regarding tabs/unprintable chars)
  * njs_log: major update: don't hide '\r' and '\n' in bin-text-lines
    (show as unprintable char)
  - njs_log: fix: keyboard jumps over tabs in bin-text lines
  - njs_log: fix: update m_partIdx of the bin-text line if it's empty during
    add-data
  - njs_log: critical bugfix: bin-text lines incorrectly handled
    multibyte unicode chars being split inside the code-point
  * njs_log: major optimization update:
    - optimized index tree re-balancing
    - delayed UI updates on index rebuild
    - added support for incremental re-indexing (large logs are now immediatly
      usable)
    - UTF buffer-based batch decoding (previously it was per-code-point)
  * njs_wdg: don't auto-scroll terminal console on write (use the same logic as
    with the log -- if the bottom line is visible, then scroll to bottom)
  + njs_wdg: added support for CSI L/M (insert/delete lines), CSI d/G
    (set cursor line/col) and CSI !p (soft terminal reset)
  - njs_log: fix: empty log was not handled properly in CacheMgr::processCache

  Jancy changelog:
  - jnc_ct: major update/bugfix: StdFunc_AllocateXxx/StdFunc_TryAllocateXxx
    should return StdType_AbstractDataPtr, not StdType_DataPtrStruct.
    this under certain circumstances could cause premature release of
    temporaries which in turn was leading to UB including crashes
  - jnc_rt: fix: assertion failure could still occasionally fire
  * jnc_ct: remove dummy field from StdType_AbstractData; instead, just
    force-set flags (gc-root & non-pod)
  + jnc_io_pcap: added event io.PcapEventCode.IoError
  + jnc_sys: added std.getPreciseTimestamp => axl::sys::getPreciseTimestamp
  * jnc_ct: cleaned up using-sets implementation (now applicable to imports
    and orphans)

  AXL changelog:

  - axl_io: critical bugfix: non-atomic file size grow in
    io::SharedMemoryTransportBase on POSIX (could lead to SIGBUS)
  + axl_ini: support empty sections in .ini files (may be useful to reset
    to root directory)
  - axl_g: fix: _AXL_GCC_ASAN was detected incorrectly on clang
  - axl_io: critical bugfix: block size for file copying should be a
    multiple of systemInfo->m_mappingAlignFactor
  + axl_gui: added support for tooltips
  + axl_enc: added access to the accumulator in CodePointDecoder
  * axl_io: changed default MappedFile read-ahead size to 64K
  * axl_gui: minor update in WidgetDriver::postThreadMsg API
  + axl_gui: added Engine::processUiEvents
  + axl_enc: major update in char codecs (support for buffer decoding
    in CodePointDecoder, support for single-pass decoding + codepoint map
    calculation)
  + axl_cry: added axl::cry::Rsa::publicEncrypt/privateEncrypt/
    publicDecrypt/privateDecrypt
  + axl_cry: added cry::AesKey wrapper class for AES block encryption
  + axl_sys: implemented hi-res timestamps on mac (via mach_absolute_time)
    for testing (production version is still using gettimeofday)
  - axl_sl: bugfix in PackIntTrunc: va_arg was called twice
  - axl_sys: removed qpc-based precise timestamps on windows; instead,
    use GetSystemTimePreciseAsFileTime available in win8+
  + axl_gui: added support for ansi attr inversion
  - cmake: don't use -static-libgcc/-static-libstdc++ on clang (not supported)

...............................................................................

version 3.8.0 (2017-10-20)

  introduces: major terminal emulator redesign, regular expression colorizer
  layer plugin, add-on plugin management system, support for layer plugin
  persistency in saved log files and session files, support for key
  authentification in Jancy class io.SshChannel and in the SSH plugin, new
  Jancy class jnc.RegexDfa for compiling and matching dynamic regular
  expressions (uses the same engine as the 'reswitch' statement).

  Main application changelog:

  * nj_app: major redesign of the terminal widget
    - now it can be floating or tabbed
    - can be fixed-sized or auto-sized
    - when it's auto-sized, the size tooltip is shown on resize
  * nj_app: terminal: fixed bugs in arrow key mapping
  * nj_app: added tab close button, i need it to add it to the terminal tab,
    it's closable now (but not the log tab!)
  * nj_app: delay terminal console size adjustment (otherwise, lines are
    cropped prematurely)
  * nj_app: inverted the terminal mouse roles when xterm mouse-mode is set:
    send clicks by default; select/context-menu when Ctrl is pressed
  * nj_app: re-design of transmit history:
    now text transmit, binary transmit and file transmit all have independent
    histories. previously having shared history for text+binary transmit caused
    problems with escape-sequence in the text pane
  * nj_app: fixed persistency for the file transmit page (previously it was
    always empty on session start, even when we've set the file previously)
  * nj_app: added support for layers in saved session files
  * nj_app: added per-plugin resource directories
  * nj_app: save document settings as defaults upon closing the settings dlg
  * nj_app: fix: actions for recent files in the file menu were not connected
  * nj_gui: added support for enabling/disabling for action (link) properties
  * nj_srv: apply default settings on add layer
  * nj_srv:suspend/resume log server on add & remove layer
    suspending helps avoiding premature rebuilding of log index when layer
    adds converters/representers
  * nj_gui: added methods: gui.PropertyGrid.removeProperty and
    gui.GroupProperty.removeProperty
  * nj_app: added user plugin setting page
  * nj_app: set fixed size for the nag dialog (measure by the image)
  * nj_app: disable already added layers in the "new-layer" drop-down menu
  * nj_srv: added doc.PluginHost.m_logThreadScheduler
  * nj_srv: added doc.PluginHost.m_pluginGuid
  * nj_srv: added support for multi-class-guids in log files
  * nj_srv: adapted log api to the new representer stack architecture
  * nj_srv: moved std record code representer into a dedicated class
  * nj_srv: save log file now takes the last log record file in converter stack
  * nj_app: brought back the Add Layer toolbar button
  * qtpb: hide alpha channel in color properties
  * qtpb: adjusted the display format in flag properties
  * qtpb: added QVariant user data to properties
  * nj_gui: added gui.ColorProperty, gui.ActionProperty, gui.FlagProperty,
    gui.FileProperty
  * nj_gui: fix: insert properties to the group of particular plugin
  * nj_app: added tooltip label (QToolTip has certain issues with widget
    activation/deactivation). i need something simple and predictable to show
    terminal console size
  * nj_app: updated icons (also, added a terminal icon)
  * nj_app: fixed buddies and tab order on all the dialogs
  * package: added NSPrincipalClass=NSApplication to Info.plist in Mac packages
    (crucial for high-DPI support)

  Scripts changelog:

  * scripts: fix: modbus plugin should use a volatile variable for checking
    for role inversion (the value of property is not volatile and not
    guaranteed to return the correct result after the change). timing is
    critical on startup (if we apply a modbus rtu layer with role inversion
    to an already captured log)
  * scripts: MosBus RTU: added support for role inversion: TX/RX - Master/Slave
    also, improved the handling of invalid ModBus frames
  * scripts: fixed regex colorizer race issues (log thread vs main thread)
  * scripts: minor fixes in the file and hw-serial-mon plugins
  * scripts: added the 'Remove all extra patterns' action to the regex
    colorizer plugin
  * wizards: bugfix in syntax highlighter wizard (length should be updated
    each iteration)
  * wizards: fixed a typo in TX/RX test plugin wizard
  * scripts: added gui.rgb function
  * scripts: ssh: added key authentication
  * scripts: serial: removed flow control combo box (available via property
    grid)
  * scripts: added regex colorizer layer

  Ninja Scroll engine changelog:

  * njs_wdg: added support for CSI set scroll region command
  * njs_log: write bin-format to clipboard on bin-copy mode
  * njs_log: added "smart" copy logic for bin-hex lines:
    when selecting in the hex part, the copied text will contain hex codes;
    when selecting in the text part; the actual text will be copied
  * njs_log: added support for CopyBinKind_HexView
  * njs_wdg: added support for mouse mode change notifications
  * njs_log: critical bug fix in njs::Server::processSyncReqList
  * njs_wdg: terminal: added support for CSI n P (erase chars)
  * njs_wdg: fixed a repaint problem on full erase
  * njs_log: added support for multiple class guids in a single log file
    (crucial for io ninja layers)
  * njs_log: moved fold flags to a dedicated fold  file (now we don't have to
    enforce read-write when opening logs; also, it's possible to have multiple
    log servers working with the same log file)
  * njs_log: added support for suspend/resume (may be necessary when building
    complex layer stacks)
  * njs_log: added support for user callbacks in the log thread (necessary to
    synchronize io ninja converter layers)
  * njs_log: show page boundaries under debug

  Device Monitor changelog:

  * dm_lnx_lkm: fix: in-header inline functions must be static to make
    gcc happy
  * make: added variable LINUX_BUILD_DIR to override build dir when
    needed
  * dm_lnx_lkm: implemented write-protection disabling for arm32
    now tdevmon can be used on Tibbo LTPS LTPP3 boards for serial monitoring
  * dm_lnx_lkm: use do_div instead of direct int64 division on arm32
  * dm_lnx_lkm: bugfix: Device_p_unhook did Hook_stop sequence
    incorrectly
  * dm_lnx_lkm: warning fix: ioctl arg is long, must be cast to
    (uintptr_t) before casting to (void*)
  * cmake: added an option for lkm target in cmake project

  Jancy changelog:

  * jnc_ext: fix: consumed length calculation in jnc.RegexState did not work
    properly for negative offsets
  * jnc_ext: added support for buffer replay after a successful match in
    incremental jnc.RegexState/jnc.RegexDfa
  * jnc_ct: critical bugfix: reactor iface classes were not properly
    shared
  * jnc_ct: bugfix: skipping non-trailing default arguments crashed the
    compiler (need to do explicit check for null jnc::ct::Value-s)
  * jnc_ct: allow finishing commas in named-based curly initializers
  * jnc_rtl: implement full reset in RegexState::reset
  * jnc_rt: added Runtime::m_userData field (rather convenient when
    there are multiple runtimes, like with ioninja plugin stack)
  * jnc_rtl: removed RegexDfa.incrementalMatch
  * jnc_rtl: added RegexDfa class
  * jnc_io_base: typo fix in io.Socket
  * jnc_io_base: minor sync bugfix in io.Serial (m_ioFlags must be
    accessed under lock)
  * jnc_io_ssh: added support for key authentication
  * jnc_io_ssh: bugfix: SshChannel::write returned 0 on success (must return
    the actual size)
  * jnc_ct: fix: OperatorMgr::getConditionalOperatorResultType should
    use closure-aware types of operands

  AXL changelog:

  * axl_io: fix: io::SharedMemoryTransport did not release the lock on
    open-error
  * axl_gui: export TextPainter::buildBinTextString for public use (the
    same code which is used for producing hex-view strings)
  * axl_sl: minor fix in sl::ListBase::moveXxx to allow usage of these methods
    from sl::BoxList
  * axl_io: typo fix in the POSIX impl of io::getDir
  * axl_io: bug fix in the POSIX impl of io::copyFile
  * axl_sl: added sl::List::eraseHead/eraseTail for consistency
  * axl_io: expose const io::File* via io::SharedMemoryTransport::getFile (for
    uniformity with io::MappedFile)
  * axl_io: io::MappedFile now provides information about the actual end of a
    mapping
  * axl_io: expose const io::File* via io::MappedFile::getFile
  * axl_io: added io::copyFile () overload (accepting a const io::File*
    instead of a source file name)
  * axl_fsm: fix: calling RegexCompiler::makeDfa with an empty regex caused
    a crash

...............................................................................

version 3.7.8 (2017-09-15)

  * devmon: criticial bugfix: opportunistic BSOD (read beyond the end of a
    buffer during scatter-gather collection on IRP_MJ_CREATE/
    IRP_MJ_CREATE_NAMED_PIPE/IRP_MJ_CREATE_MAILSLOT)
  * devmon: fix: self-hooking attempts detection and prevention in tdevmon
    for Linux
  * devmon: fix: tdevmon --stop-core-service always failed as long as there
    is at least a single filter device attached
  * devmon: fix: if the core service could not be stopped, MSI would misbehave:
    it could failed instead of asking for a reboot or do not ask for reboot at
    all
  * plugins: SerialMon: extend port combo (space is unused, anyway)
  * plugins: Serial: added read buffer size setting
  * plugins: ModBus: added support for field-clicks in decoded ModBus messages
  * plugins: ModBus: bugfix: upon a successful decode of a ModBus message, a
    chunk of raw data was doubled
  * nj_app: added terminal settings for backspace key mode, home-end key mode
    and function key mode
  * nj_app: added proper handling of double-click in terminal
  * nj_app: remember last open-file dir
  * nj_app: fix: on Windows and Mac ignore extension case when auto-detecting
    open-file type
  * nj_srv: reset base timestamp to the first line of the log if it's not empty
    otherwise, it produces weird "minus" times when opening existing logs
    and/or sessions
  * nj_gui: added properties m_minValue, m_maxValue, m_spinBoxStep to the
    class gui.IntProperty
  * axl_sys: fix: month number should be one-based, not zero-based
  * njs_log: fix: handle double-click on hyperlinks as a normal click (don't
    select-word)
  * njs_wdg: added support for character sets (in particular, line-drawing
    character set) in the terminal widget
  * njs_log: added support for backward-bin-range-highlighting

...............................................................................

version 3.7.7 (2017-08-31)

  introduces: Tibbo Device Monitor for Linux, Serial Monitor plugin for Linux,
  support for monitoring the Fast IO and remote pipe/mailslot connections
  on Windows, dual WHDC-compatible signing of Windows drivers with SHA-1 and
  SHA-256 EV certificates for Windows 10 1607+ compatibility, two critical
  BSOD fixes, dynamic structures in Jancy language.

  * nj_app: added the "What's New" dialog
  * nj_app: cleaned up QT widget/dialog layout issues
  * nj_app: removed the "Key Translation" terminal setting (never was fully
    implemented); added the 'Enter key mode' setting (CR/LF/CR-LF) instead
  * nj_io_mon: added support dual device monitoring (e.g. \device\namedpipe and
    \device\lanmanredirector); this allows for monitoring remote pipe/mailslots
  * moved all *.jncx into 'extensions' dir in tar package
  * devmon: file name wildcards can contain multiple \r - separated wildcards;
    to pass a file name must match all the wildcards using AND logic)
  * devmon: added notifications for FastIoRead/FastIoWrite/FastIoDeviceControl
    -- this is crucial for monitoring the named pipe IO on Windows (otherwise,
    a substantial part of pipe traffic is unlogged)
  * devmon: improvement: MSI installer should not ask for reboot during upgrade
    unless that's really necessary -- before it *may* have asked for reboot
    even when services could be cleanly stopped
  * devmon: fix: IRP_MJ_FILE_SYSTEM_CONTROL file id and data was not properly
    displayed in tdevmon console utility
  * devmon: critical bugfix: BSOD on METHOD_NEITHER IOCTLs when either IN or
    OUT buffer is NULL (due to unconditional MmGetSystemAddressForMdlSafe on
    NULL MDL)
  * devmon: critical bugfix: an opprtunistic BSOD crash during open file
    notification on IRP_MJ_CREATE/IRP_MJ_CREATE_NAMED_PIPE/
    IRP_MJ_CREATE_MAILSLOT -- due to incorrect usage of FILE_OBJECT::FileName
  * devmon: ported tdevmon console application to Linux
  * devmon: added Linux loadable kernel module (LKM) and usermode library
  * devmon: added scripts for WHDC signing with the new EV certificate
  * devmon: bugfix: a leak in HashTable_remove (entry was removed, but not
    actually freed)
  * cmake: added QT_COMPILING_QSTRING_COMPAT_CPP and
     QT_COMPILING_QIMAGE_COMPAT_CPP to QT-based modules. this way, the resulting
    binary has less import symbols and is more likely to run when linked against
    older versions of QT
  * cmake: added gcc settings for -static-libgcc and -static-libstdc++
    (static by default). this way, the resulting binaries are more likely to run
    on different linux distros
  * ported Serial Monitor plugin to Linux
  * jancy: added dynamic structs (dynamic layour via non-const-sized arrays)
  * axl: fixed typos in sl::String::getLeftSubstring/getRightSubstring
  * axl: catch out-of-memory error in Array::reserve
  * axl: added assert to getMinPower2Gt to catch values with highest-bit set
    to one
  * njscroll: fixed a regression introduced with dual bin hex lines
    CachedLine::isBin was broken, which lead to incorrect painting of
    bin-text lines

...............................................................................

version 3.7.5 (2017-07-06)

  * njscroll: ensure visible cursor on paste
  * njscroll: scroll the widget if necessary on insert/delete data
  * sh: updated build-packages shell scripts for all opensource projects --
    should use cpack rather than hand-made shell scripts (which are all
    removed now)
  * nj_app: added support for time-limited evaluation licenses
  * nj_app: re-designed the license dialog
  * ecckey: added support for time-limited (expiring) product keys
  * ecckey: added srand() -- otherwise, product key padding is always
    the same
  * jnc_sys: added g_env property for accessing system environment
    variables

...............................................................................

version 3.7.4 (2017-06-03)

  * nj_app: bugfix: having both a session and a log opened and then closing
    first the session and then ioninja lead to a crash
  * njs_log: auto-convert logs from ioninja 3.5.x
  * nj_app: removed api.conf (not needed anymore)

...............................................................................

version 3.7.3 (2017-05-17)

  internal release.

  * jnc_ct: ported to llvm-4.0; compiles and runs under llvm versions 3.4.2
    to llvm-4.0.0
  * jnc_ct: named import types used in orphaned functions/reactors are
    re-anchored (no more need to qualify nested types in orphaned methods)
  * njs_log: bugfix: crash if dual bin hex block happen to span cache page
    boundaries
  * nj_app: bugfix: hex editor incorrectly reported selected range if cursor
    was at ASCII-EOL position

...............................................................................

version 3.7.2 (2017-05-03)

  introduces: Hardware Serial Monitor for UART/SPI/I2C; USB Endpoint Terminal;
  dual binary blocks in Ninja Scroll Engine.

  * axl_gui: bugfix: TextPainter::drawHyperBinHex incorrectly checked
    for an empty attr array
  * nj_app: bugfix: when a session was created after closing a previous one,
    session property grid was often inaccessible for editing
  * axl_gui: shift+Tab support
  * nj_app, nj_log: added support for dual-bin view
  * nj_log: break record support
  * nj_gui: proper group property support
  * axl_gui: make HyperText use UTF-32 for text storage; this way makes it
    possible to use unicode chars in IO Ninja text log lines
  * jnc_ct: implemented const casts for class pointers -- this is critical for
    doing class-ptr upcasts from variants
  * jnc_ct: critical bugfix: don't fallback to llvm cast post-compile
  * jnc_ct: allow casts to void (crucial for conditional operators)
  * jnc_std: bugfix in Array::insert/Buffer::insert methods (they always copied
    new data into the beginning)
  * njs_log: added PartKind_Break for inserting breaks between mergeable
    messages

...............................................................................

version 3.7.1 (2017-04-14)

  introduces new features in Jancy language: 'reswitch' statement; 'cmut'
  modifier; variant containers (arrays, lists, hash tables, rb-trees);
  redirectable stdio; raw literals; indexer properties; disposable pointers;
  declarations in reactors.

  * scripts: move io_ModBus.jnc/io_TcpIp.jnc to common folder (not really api)
  * jnc_ct: allow writing formatting literals as f"..." ($"..." is also ok)
  * axl_err: bugfix: StdErrorCode_String incorrectly handled string length
    (off-by-one)
  * ioninja: fix: master encoding was never really saved (reset to UTF-8 each
    time)
  * jnc_ct: fix: array->ptr casts, also for const values (required for
    variants)
  * jnc_std: cleaned up std classes StringBuilder/HashTable/RbTree
  * jnc_std: removed unused structs/classes (std.BufferRef/std.StringRef etc)
  * jnc_std: added std.RbTree, redesigned std.HashTable
  * jnc_ct: bugfix: thunk function compilation failed if function had
    call-conv-dependent arg coercion
  * jnc_ct: fix: non-POD struct field access was essentially unchecked
  * axl_sl: breaking change: eliminated diversity BinTree/BinTreeMap and
    HashTable/HashTableMap
  * jnc_ct: major update: redesign of dual modifiers, implemented dual
    modifier 'cmut' (container mutability).
  * jnc_std: added std.Array class
  * jnc_std: added gets, print, perror and make stdio adjustable by the
    host application (via jnc::setStdio)
  * jnc_ct: relaxed the requirement to use 'indexed' modifier when declaring
    indexed properties
  * axl_sl: bugfix in sl::CmdLineParser -- parse switch prematurely
    terminated the switch value upon discovering a space
  * jnc_ct: added support for raw literals (non-escape-decoded)
  * jnc_ct: redesign of automatons -> regex switches
  * jnc_rt: suppress unwinding on longjmp on windows x64 (doesn't work
    properly -- at least with LLVM 3.9.1)
  * scripts: remove types in bindable aliases, remove terminating semicolons
    from curly-initialized declarations
  * jnc_ct: update in grammar: allow curly-initialized declarations to
    be non-terminated with ';'
  * jnc_rt: fix: assert in GcHeap::parkAtSafePoint could occasionally
    fire due to its wrong placement -- it should be placed *before*
    atomicDec (&m_handshakeCount)
  * jnc_ct: indexer properties implemented
  * jnc_ct: function redirection implemented
  * jnc_ct: alias redesign
  * jnc_ct: major update: member & index operators for variants
  * jnc_ct: disposable pointers
  * jnc_ct: redesign of automatons -> regex switches
  * axl_sl: bugfix in sl::Pack -- size calculation for simple types did
    not advance va_list
  * axl_fsm: supportfor simple quantifiers, e.g \h{8}
  * axl_fsm: capturing groups
  * axl_sl: added support for and-not operation to BitMap::merge
  * jnc_ct: allow declarations in reactors
  * jnc_ext: move gc stuff from std to sys
  * jnc_ct: redesign module constructors/destructors (allow
    one-per-unit)
  * jnc_ct: removed 'delete' operator (prolly, never gonna be supported)

...............................................................................

version 3.7.0 (2016-12-20)

  provides a critical fix in Serial plugin.

  * jnc_io_base: major update in Serial class -- fixed EV_RXCHAR-related data
    loss and completely removed interval timeouts on windows. As it turns out,
    certain drivers do not follow WinAPI guidelines on EV_RXCHAR notifications
    and serial timeouts and it may cause IO Ninja to hang indefinitely
  * nj_app: proper updates of transmit pane during switching and closing of
    documents
  * don't disable transmit pane in monitor and linked sessions (could be used
    as a scratch-pad). "send" button is disabled anyways
  * dm_app: bugfix: %lld implies 64-bit, but the argument was intptr_t; it
    caused a crash during monitoring on 32-bit machines
  * njscroll: assertions in mergeEditTransactions could actually fire
    (if we select and then replace by typing)
  * njscroll: make selectAll (Ctrl+A) keep the cursor in the same pane it was
    before (Hex-vs-Ascii)
  * nj_app: keep transmit histories separate for different sessions; also,
    don't save/restore histories (only current blocks).

...............................................................................

version 3.6.8 (2016-11-25)

  * axl_sys: add unix-windows time epoch difference to POSIX timestamps
  * axl_enc: critical bugfix in Base32 implementation
  * axl_cry: critical bugfix: we should update signature size after ECDSA_sign
  * axl_sys: bugfix in POSIX timed wait (absolute timespec was calculated
    incorrectly)
  * jnc_io: bugfix: on POSIX checking socket for FD_WRITE should happen
    AFTER connect
  * nj_ssh: rename io.SshEvent->io.SshEventCode (to reflect change in jnc_ssh)
  * jnc_ct: support for $! in formatting literals (expands to
    std.getLastError ().m_description)
  * jnc_api: critical bugfix: propagateLastError should use
    axl::err:getLastError, not jnc_getLastError
  * scripts: update scripts to use the new properties
    io.Socket.m_isSocketEventEnabled and
    io.FileStream.m_isFileStreamEventEnabled
  * scripts: read all incoming data before closing the socket in disconnect
    event handler
  * all the libs/frameworks added as submodules; list of submodules: axl,
    doxyrest, ecckey, graco, jancy, njscroll, qtpropertybrowser, minhook
    devmon
  * axl: fix: sl::String & ref::Buf should handle in-buffer copies/inserts/
    appends properly (either by in-buffer shifts or by add-reffing the original
    buffer to keep it intact)
  * jnc_io: Serial::setDtr/setRts should modify property-holding values
  * axl_enc: UTF trie is now ICU-based
  * jancy: allow untyped aliases;  mostly it's done to allow simple aliasing
    of 'dispose' method, like: alias dispose = close
  * jancy: typo: setas declaration had no effect
  * jancy: fix: io.File was not properly added to IoLib
  * ioninja: use _wfopen for log file on windows (otherwise it doesnt work for
    unicode-user-names)
  * ioninja: show command line output if server process finishes BEFORE
    transport has been established.
  * jancy: typo in jnc_Type.h (jnc::TypeKind_Long was mapped to int32, not to
    int64)
  * axl: support for \v in escape encoding engine
  * jnc_ct: multiline literals syntax change: i feel it's better to make it look
    like python docstrings, using triple quotation """
  * jnc_ct:  unified hex/octal/binary/decimal constants/literals and added
    support for multiline binary literals 0x""", 0o""", 0b""", 0n"""
  * jancy: remove int8..int64 keywords, instead use the same keyword system as
    in C/Java: int, char, short, long + one non-standard keyword: intptr.
      char -- signed 8-bit int,
      short -- signed 16-bit int,
      int -- signed 32-bit int,
      long -- signed 64-bit int.
    the rest is defined just like in stdint.h: int8_t, int16_t, etc. this way
    it's much easier to switch between C and Jancy (i constantly make typos
    myself).
  * jancy: remove C pseudo-inheritance via JNC_BEGIN_INHERITED_STRUCT
    alas, this approach doesn't work on gcc anyway;

...............................................................................

version 3.6.7 (2016-07-28)

  * all: suppress -rdynamic by default. turns out, (at least) on Linux, CMake
    adds -rdynamic to the link flags, which results in dll hell on steroids
  * axl: remove kernel32.GetThreadId dependency (missing on Windows XP)
  * devmon: print extended information message when driver's signature is
    rejected (may happen on vanilla Windows 7 because of SHA-2 certificates)
  * ioninja: tx/rx test wizard
  * ioninja: layers should be able to filter transmission (before transmission
    was directed to the main plugin (head of plugin stack)
  * ioninja: if layer representer is unable to represent a log message, we
    need to fall back to the previous representer (before it worked only for
    log converters)
  * jancy: critical bugfix: lifting variables could lead to incorrect current
    gc shadow stack frame
  * ioninja: bugfix: if the 2nd (or later) plugin passed in command-line failed
    compilation, both ioninja and ioninja-server processes remained in limbo
    state.
  * ioninja: answering machine wizard generated a project which would not
    compile out-of-the-box
  * axl: critical bugfix: buffer overrun in axl::enc::CharCodec class
  * ioninja: installer should put bundled packages into user temp folder, not
    to INSTALLDIR; otherwise it's impossible to delete em afterwards
    (not with UAC on) so previsouly on all UAC machines we had winpcap.exe and
    tdevmon64.msi remaining after installation. the solution is to use a temp
    folder (SUPPORTDIR). It is generated using ProductCode, which will be new
    every MSI build. in this case we don't have to worry about conflicts and we
    can delete this folder without elevation.
  * ioninja: critical bugfix: installer checked tdevmonc.sys version
    incorrectly: ioninja uses major-minor-revision versioning, windows uses
    major-minor-build-revision versioning. MSI used ioninja version rather
    than windows version; this resulted in "...installed version appears to be
    older..." message all the time (even when it's not)
  * jancy: remove server stuff; re-organize JncApp structure
  * axl: extra utility methods in StringRef
  * axl: reverseMemMem using BoyerMooreFind
  * axl: ref::BufHdr methods for checking pointer being inside/outside
  * axl: wrapper for lua_pushvalue; support for relaying arguments to
    LuaStringTemplate::process
  * axl: major redesign: String/StringRef; Array/ArrayRef
  * ioninja: automatic pad-file generation

...............................................................................

version 3.6.5 (2016-05-13)

  * ioninja: transmit history fixes: use hex-exncoding for transmit history
    because it seems like QT has problems with variant lists, x86 crashes
    inside QT list conversions (reproduced in isolated test app)
  * ioninja: don't add empty blocks to transmit history
  * ioninja: update transmit history buttons after load
  * jancy: important grammar update: type_name_or_expr should use expression_0,
    not expression; dynamic sizeof/countof/typeof should use expression, not
    type_name_or_expr. this way we prevent generating code for unused values
    and at the same type allow sizeof (struct-field) and countof (struct-field)
  * njscroll: typo caused only a single line to be processed (introduced when
    fixing reversed cache processors)
  * jancy: critical bugfix: after lifting a variable we need to propagate new
    frame map down the scope stack
  * axl: bugfix: after adding special handling of zero-utf32_t methods in
    sl::String enc::EscapeEncoding ::decode started to incorrectly parse \0
    escape sequence. should use append (c, 1) instead
  * jancy: unary ! operator for variants
  * jancy: critical bugfix: continueBlock in for-loop should be set at
    loopBlock, not conditionBlock
  * cmake: sanitiser flags should also be added to
    CMAKE_SHARED_LINKER_FLAGS_DEBUG (for Xcode)

...............................................................................

version 3.6.4 (2016-05-12)

  * ioninja: file transmit dialog is now aware of incomplete transmissions
    and does retransmissions accordingly
  * ioninja: persistency for transmit widgets (text, binary, file)
  * jancy: io_base.jncx: TransmitBufferOverflow event removed (it was not
    really implemented anyway, and TX buffer overflow should be checked during
    send/write)
  * jancy: io_base.jncx: TransmitBufferReady event is implemented for sockets
  * jancy: io_base.jncx: synchronous and asynchronous socket modes
  * ioninja: log all jancy exceptions in ioninja-server-system-log
  * jancy: cricitcal bugfix: Runtime::uninitializeThread should restore
    exception recovery snapshot even when thread is being uninitialized
    otherwise there is a potential race: exception could have left GC shadow
    stack in invalid state, and it could be accessed if another thread happen
    to perform a collection simultaneously with GcHeap::unregisterMutatorThread
    trying to GcHeap::waitIdleAndLock ()
  * jancy: fix Timer::stop () from within onTimer event -- before it
    deadlocked
  * jancy: HashVariant should invert bigendians -- otherwise the same values
    will fall into different buckets
  * jancy: typo in sys.Timer.wait () -- single shot timer was satisfied
    immediatly
  * axl: bugfix: BinaryBoyerMoore should use uchar_t, not char -- equality
    comparisons failed because of that
  * axl: bugfix in FSM library: hexcode escapes were parsed incorrectly
  * axl: added support for hex-literals in RegExpCompiler
  * jancy: strstr & memmem
  * axl: memmem via in BinaryBoyerMooreFind
  * jancy: bugfix: each regexp in automaton function should FIRST set the
    block, THEN open scope (LLVM bugchecked with unterminated blocks if
    formatting literals were used within actions of automaton)

...............................................................................

version 3.6.3 (2016-05-04)

  introduces: Tibbo Device Monitor security management; new IO Ninja sessions:
  Mailslot and Mailslot Monitor; inter-character delays during transmission in
  IO Ninja Serial session.

  * ioninja: setting dialog minimum size is properly calculated (looked bad on
    Mac and Linux KDE before); setting dialog now also installs event filter
    to disable mouse wheel in comboboxes and spinboxes -- otherwise it really
    breaks the flow of wheel scrolling and produces unwanted setting changes
  * axl: bugfix: Mac OSX axl_cf & axl_iok libraries had multi-CFRelease bug
    which occasionally crashed serial port enumerator
  * cmake: add sanitiser flags to CMAKE_EXE_LINKER_FLAGS as well — Xcode
    fails to link sanitised executables otherwise
  * ioninja: serial session: inter-char delay; also removed data-bits,
    stop-bits, parity combo-boxes from toolbar (it takes too much space)
  * jancy: keyword rename: thread -> threadlocal (otherwise it's too
    conflict-prone)
  * jancy: bugfix: sys.Event and sys.Lock should enter wait regions before
    waiting
  * jancy: jnc_sys library (Lock, Event, Thread, Timer) implemented
  * jancy: run destructors in dedicated destruct-thread (instead of running
    them synchronously during collection)
  * axl: new methods: sys::Thread::wait, sys::Thread::terminate
  * jancy: IPV6_HDRINCL is apparently windows-only -- use IP_HDRINCL instead
    on *nix
  * jancy: fix broken #ifdef structure (error introduced when implementing
    FileFlag_WriteOnly support)
  * axl: ifdef win-specific test code
  * ioninja: mailslot & mailslot monitor plugins. mailslot uses io.Mailslot
    from io_base.jncx to create server mailslot; mailslot monitor uses a
    io.MailslotMon in io_mon.jncx
  * devmon: --show-sd option doesn't really need KEY_WRITE access
  * jancy: raw sockets (almost useless on windows except for ICMP/IGMP)
    on *nix should be much more convenient for low-level network IO than pcap
  * devmon: access management
    monitor function is now controlled by configurable SD (security descriptor)
    stored in service parameters regkey; access is checked during
    IOCTL_DM_CONNECT; default SD allows access for Administrators only; if SD
    is not found in service parameters regkey or is not valid, then default SD
    is used.
  * axl: sys::win::Sid major improvements (name lookups, sid lookups, parsing
    etc)
  * axl: sl::String should handle copy, append, insert of 0 as NULL (otherwise
    it's very easy to misuse); if actual utf32_t 0 assign/append/insert is
    required, this can be achieved by specifying "count" implicitly
  * axl: sys::getTimestampFromTimeval
  * axl: ref::Buf::getSize () method
  * axl: timestamps in io::PCap -- essential when reading from file
  * devmon: keyboard & mouse service callbacks moved to tdevmonp.sys
  * devmon: support for IRP_MJ_CREATE_MAILSLOT monitoring
  * jancy: io.Mailslot class
  * jancy: support for write-only in io.FileStream
  * ioninja: Mailslot plugin
  * jancy: conditional operator with bitflag enums and zero
  * axl: io::FileFlag_WriteOnly
  * jancy: add isReusableAddress parameter to Socket::open ()
  * njscroll: bugfix: reversed cache processor cause out-of-bounds access to
    line array

...............................................................................

version 3.6.2 (2016-04-15)

  * ioninja: replace empty filter in Named Pipe Mon with * -- this way we will
    not be notified of already-opened nameless files
  * jancy: sl::String -> String conversion requires explicit .cc () method
    call
  * jancy: update to prev bugfix: adding GC roots in schedule launcher
    function is not enough, cause internalPrologue adds a gc-safe-point
    which will fire BEFORE adding GC roots in schedule launcher. instead,
    add roots in internalPrologue directly. later on, remove it, also remove
    no-collect call-sites and instead add ALL user-allocated data to something
    like call-site-gc-root-set
  * jancy: critical bugfix: schedule launcher functions should mark gc-root
    arguments (otherwise it's extremely error-prone when calling scheduled
    function pointers from C++). bug discovered during crash analysis in
    Answering Machine under debug build. listener function is scheduled in the
    main thread, and it makes a gc-copy of parameter block. Parameter block
    gets collected during allocation of closure object (debug build runs
    gc-collect on every allocation), then dangling pointer gets saved in the
    closure object
  * all: add debug suffix to version strings
  * all: replace strlen/wcslen with safe NULL-checked axl_strlen/axl_wcslen
  * axl: make axl::sl::StringDetails::calcLength null-ptr safe
  * ioninja: Plugin::transmitTo/Plugin::transmitToNext methods
  * jancy: toupper/tolower in jnc_std
  * qtpropertybrowser: added support for changing property label style (bold,
    italic, underlined, color)
  * ioninja: parametrized packet template actions
  * ioninja: bugfix in reading/writing of bigendian bitfields in packet template
    widget
  * ioninja: setSrcAddress/setDstAddress actions in TCP/IP packet library.
  * jancy: bugfix: inplace const cast destroyed original const (also, fired an
    assert on cast bool->int during prepareOperand)
  * axl: bugfix: enc::EscapeEncoding::encode should clear target string first
  * jancy: Type::getDeclarationString

...............................................................................

version 3.6.1 (2016-04-11)

  * ioninja: macro variable _IONJ_CRASH_DUMP to turn on/off Windows error-mode
    in ioninja-server (for Vlad Yershov crashdump request)
  * ioninja: updated icons from leonid (pipe listener, pipe monitor, modbus
    analyzer)
  * ioninja: pipe listener and pipe monitor icons from leonid
  * ioninja: proper removal of plugins should also modify common-among-plugins
    nj::log::LogRepresenter
  * njscroll: sync request should not wait if io thread is already
    stopped/stopping
  * njscroll: restore previous target record file upon converter removal
  * njscroll: fix uint32_t/uint64_t warning on x86
  * jancy: parseConstIntegerExpression should take int64_t, not intptr_t
    EnumConst::m_value should also be int64_t, not intptr_t
    added limit checks for array bounds and enum constants
  * jancy: 02_dialog sample is now correctly garbage-collected (-1 size
    trigger removed, opaque-gc-roots marked)
  * ioninja: remove all layers upon log destruction -- otherwise remove-layer
    leaves log in an invalid state (referencing desturcted and deallocated
    layer objects)
  * jancy: re-prime after destruct is just wrong -- it damages child class
    fields. also, need to figure out why we even need zeroing of Multicast
    fields after destruct. seems like a wrong and error-prone design.
  * ioninja: udp session has "show packet header" filter (to produce clean log
    when udp socket is used in one-to-one communication)
  * ioninja: serial session and serialmon session use "true" as default value
    for log filter properties
  * ioninja: default values when reading from doc.Storage
  * ioninja: modbus analyzer plugin; modbus packet library
  * ioninja: packet template mgr also adds fields from base types
  * ioninja: io_mon uses timestamp recorded by devmon (rather than current)
  * devmon: add timestamps to notifications. currently i provide completion
    timestamps only, but space is reserved for start timestamp as well. start
    timestamp would require pool allocation on irp start, so im not sure if
    it's necessary. later i can add it while staying binary-compatible.
  * jancy: bugfix: gc heap should check if TLS belongs to the same runtime
    (bug discovered during multi-layer ioninja session, each layer has its own
    runtime)
  * ioninja: serial session should get initial parity from combo box, not from
    property
  * axl: critical bugfix: io::Serial did not handle parity setting properly
  * ioninja: description update
  * cmake: add -Wno-incompatible-ms-struct warning suppression
  * jancy: llvm integer constant values were read incorrectly. address
    sanitizer helped to pin read overflow for integer constants (unconditional
    load of 8-bytes). changed to 1, 2, 4, 8 byte load depending on type.
  * ioninja: add AXL_GCC_MSC_STRUCT to 8-byte-aligned types (log.Log and
    doc.PluginHost)
  * jancy: add AXL_GCC_MSC_STRUCT to class boxes
  * axl: AXL_GCC_MSC_STRUCT macro for enforcing MSC-layout
  * axl: bool-vs-bool_t warning fix in io::win::File::setSize

...............................................................................

version 3.6.0 (2016-04-04)

  introduces: Jancy exceptions and disposable variables (resource management)
  Tibbo Device Monitor FileSystem Filters; IO Ninja  Named Pipe Monitor plugin;
  relative timestamps; actions in packet templates.

  * jancy: critical bugfix: switch statement could damage gc shadow stack
    frame maps (incorrect map after break)
  * ioninja: new icons for pipe monitor and stopwatch
  * jancy: support for multiple kinds of alignment in classboxes
  * devmon: don't use FSRTL per-stream contexts cause we didn't test it -
    npfs.sys does not support it
  * devmon: replace ULONGLONG m_fileId with UINT_PTR m_fileId while preserving
    the layout (using unions)
  * ioninja: menu items for setting base timestamp as current line or current
    time
  * njscroll: new design for relative timestamps
    relative timestamps are per-logwidget now, relative to adjustable epoch
    (instead of baked into log in form of epoch records)
  * ioninja: pipe mon should inspect FSCTL, not IOCTL (for listen/disconnect
    requests)
  * devmon: support for IRP_MJ_FILE_SYSTEM_CONTROL (otherwise pipe-mon did not
    see listen/disconnect requests)
  * ioninja: pipemon - merge fileIdChanged and other informational messages
    (accepted, disconnected, closed)
  * ioninja: log message style unification (unable-to vs cannot, error
    (details) vs error: details)
  * ioninja: pipemon improvements: file-id cache & open error handling
  * ioninja: pipe mon plugin
  * axl: make win::FileHandle::getOverlappedResult return size_t, not dword_t
    (very easy to misuse on amd64)
  * axl: escape-encoding did not encode backslash properly
  * ioninja: escape-encode string values
  * ioninja: critical bugfix: FileStream hang on close
  * devmon: file name filter redesign -- instead of caching *all* file-objects
    and storing isMatch flag, we now only cache matching file-objects
    also, file name checks are only done during create/create-named-pipe
    requests -- microsoft states that FILE_OBJECT::FileName is only valid
    during IRP_MJ_CREATE/IRP_MJ_CREATE_NAMED_PIPE.
  * devmon: HashTable_removeKey should return TRUE/FALSE depending on whether
    the key was found
  * devmon: neither-method ioctl should also use AssociatedIrp.SystemBuffer
    for output buffer -- if IRP_BUFFERED_IO is set
  * devmon: support for FSRTL stream contexts (turns out, npfs.sys does not
    support them anyway)
  * devmon: HashTable method renames (remove->removeKey; removeEntry->remove
    find-> findValue; findEntry -> find)
  * devmon: critical bugfix: with NEITHER_IO and IRP_BUFFERED_IO we have to
    manually copy the buffer from AssociatedIrp.SystemBuffer (which would be
    done by IopCompleteRequest later, during APC completion)
  * devmon: we should remove file-object from cache also on unsuccessful
    open/create requests; therefore, it makes sense to rename isClose ->
    isLastRequest.
  * devmon: bugfix: we did not add CacheEntry to cacheMapEntry->m_value (so
    cache was essentially useless)
  * devmon: bugfix: incorrect setup for dm_ConnectParams
  * devmon: make wildcard string comparison in lowercase
  * devmon: file name wildcard filter
  * ioninja: session-started log record (epoch timestamp)
    we need some uniform rule for relative timestamps in different sessions.
    the problem is, often times establishing connection takes time and/or
    multiple steps, so it's difficult to use as time epoch. suggested solution
    is: before even attempting any new connection operation
    (resolving/parsing/connecting/etc), create an epoch record "Session
    started" (light bulb icon)
  * ioninja: relative timestamps
  * njscroll: relative timestamps
  * ioninja: update data ptr range check in log representor
  * jancy: replace rangeLength with rangeEnd in rt::DataPtrValidator
    it makes runtime bounds checks shorter
  * ioninja: having exception in ioninja-server during sync request loop
    caused ioninja-app to hang. on exception we have to cancel all sync
    requests first.
  * njscroll: rename MultiRangeHilite to OverlayHilite
  * ioninja: increase fade timeout (so it slowly fades)
  * ioninja: invalid check for unsigned/bigendian in PacketTemplateMgr
  * ioninja: keep/fade hilite timeouts adjusted to 750/500 msec
  * ioninja: checksum calculations for TCP/IP stack protocol headers
  * njscroll: bugfix: incorrect fade animation of multi-range highlight
    spanning multiple lines (typo, actually)
  * jancy: critical bugfix: dynamic sizeof/dynamic countof returned incorrect
    result for incremented pointers
  * ioninja: packet template action methods
    modified parts are highlighted in red (flash, then fade)
  * njscroll: leave 4-bit cursor mode when writing data
  * jancy: separate calc-layout and compile stages;
  * jancy: fix attribute block assignment for declarations
  * njscroll: multi-range hilites; fade animation for multi-range hilites.
    this is crucial for the ability to hilite modified areas
  * axl: gui subsystem: alpha rects & animation support
  * jancy: disable variant operators
    proper implementation requires more advanced redesign than i assumed
    initially. for member assignments, property address operators, indexation
    etc special new type like TypeKind_VariantRef must be introduced.
    importance/implementation-difficultly ratio is too low
    for now variants will be used for storage only.
  * jancy: eleviate dbl-ptr-size limitation on type size that can be stored in
    Variant; it was really annoying when you couldn't store long literal in
    variant, now it is allowed to store arbitrary sized values (large values
    will be stored as references)
  * jancy: disable tests if jnc_app is not built
  * ioninja: remove no-terminal flag from UDP session -- it will allow
    redirecting from/to UDP sockets
  * jancy: test10 did not zero-terminate memcat-generated buffer (which halted
    address-sanitizer on Mac in printf)
    no need to zero-terminate memcat-buffer automatically -- printf is unsafe,
    anyway
  * jancy: no need to zero memory in StdLib::memCat
  * jancy: force simple GC safe points if we compile with address sanitizer
    hitting GC guard page does not make address sanitizer happy. so just use
    simple GC safe point call if we make a sanitized build
  * axl: add macro to check whether we compile with address sanitizer
  * graco: add pthread to test_cpp
  * jancy: typo TypeKind_Void/ValueKind_Void
  * jancy: add full path to units (otherwise imports may be searched in the
    wrong sequence)
  * axl: io::findFilePath should also check *firstDir before trying (otherwise
    it will effectively search in current dir)
  * jancy: all old tests are added to the test suit
    in the future as during debugging of jancy compiler/runtime problems,
    corresponding test should be added to test/test_jnc folder
  * jancy: invalid function sequence in std.String/std.StringBuilder
  * jancy: HashTable classes didnt' properly mark opaque GC roots
  * jancy: allow multiple typedefs for the same name (as long as type matches)
  * jancy: fix CallConv::getThisArgValue with respect to argument coercion
    (applied to struct/union methods on amd64, both Microsoft x64 and SystemV)
  * jancy: don't erase allocas of lifted variables until the very end (they
    may be already stored in Value-s)
  * FunctionMgr::callStaticConstructor calls LlvmIrBuilder directly
    (OperatorMgr complained about conversion of function-ptr to thin-data-ptr
    in non-unsafe region)
  * jancy: incorrect assert in Value::getFieldOffset
  * jancy: test_qt had incorrect highlighting for dynamiclib
  * jancy: appending char array to fmt-literal should trim zero-termination
    (if any)
  * jancy: sample of disposable pattern in jancy
  * jancy: incorrect assertions in exception-handling  code
  * graco: simple console test for graco cpp back-end (will use it later for
    testing and further development of graco)
  * axl: RagelLexer should check length for -1 (and use strlen)
  * jancy: separate between cross-scope and cross-function landing pads.
    we must restore previous gc shadow stack frame on exception landing pads --
    even when the function has no roots.
  * jancy: major redesign of exception handling and scope escapes
    replace multiple allocas for sjlj-frames with a single re-usable sjlj-frame
    array; also much cleaner implementation for setting the correct sjlj-frame
    via landing-pad-blocks
  * jancy: try expression and try statement; try expression truely catches
    exceptions now (instead of just locking throw-if errorcode handling like
    before)
  * jancy: remove tmp gc root scopes (add tmp roots to user scope)
    this potentially keeps temp objects lingering longer than they are needed,
    but it greatly simplifies everything
  * jancy: when opening user scope frame map we should also update tmp stack
    root frame map insert point
  * jancy: bugfix: tmp gc root insert location was not alwats cleared between
    functions
  * jancy: we must open tmp gc stack root map in the beginning of
    statement/declaration (because of phi-functions)
  * jancy: when opening gc shadow stack frame map we need to zero gc roots
    even when we roots are not re-used (because of loops)
    use corelib function for simplicity
  * jancy: everything compiles, all the tests are passed (but some ioninja
    sessions crash on run)
  * jancy: sjlj struct
  * axl: rename LongJmp -> Sjlj
    also change layout of SjljTry struct (to make it usable from jancy)
  * jancy: initial commit for new exception model.
    new tokens, new grammar, no new code generation logic - yet.
  * ioninja: displaying functions as clickable actions in packet template
    widget
  * axl: AXL_NO_ASAN macro
  * jancy: bugfix: strlen should FIRST check the range, then NULL
    subtle bug, discovered by GCC address sanitizer
  * jancy: bugfix: off-by-one bug in MulticastImpl::removeHandler
  * jancy: bugfix: clear friendset and dual ptr type tuple map in
    Namespace::clear
  * jancy: jnc_sys extension library skeleton
  * jancy: minor fix in jnc_ext_Pch.h (after axl namespace shuffle)
  * axl: minor namespace shuffle (mt:: moved to sys::
    some mt:: members moved to sl::)
  * axl: remove lex-related classes from axl_core and move them to axl_lex lib
  * ioninja: added all standard high-speed baud rates to the serial session
  * jancy: attribute values;  clang-specific issues to be worked out
    pch settings for gcc do not work out-of-the-box
  * ioninja: package script fixes after latest cmake changes
  * bulldozer renamed to graco (grammar-compiler)
  * jancy: disposable pattern (raii replacement)
  * jancy: fixes in samples/02_dialog (compiles & runs)
  * jancy: fixes in samples/01_export (compiles & runs)
  * jancy: bugfix in stack lifting for structs with constructors
  * jancy: re-prime after destruct (may prevent tricky bugs like the previous
    one)
  * jancy: critical: replace MulticastImpl::~MulticastImpl with
    Multicast::destruct. turned out, newer GCC may optimize things out of
    destructors!
  * ioninja: remove debug printfs
  * ioninja: make ioninja compile with or without devmon
  * ioninja: remove devmon inclusions from main ioninja CMakeLists.txt (move
    it to MSI installer project)
  * jancy: also apply --source-name to the first file in list
  * jancy: multiple files can be passed to command-line compiler jancy.exe
  * jancy: cmd line app runs function by default (rather than compile-only)
    some sanity checks for the entry point function type
  * ioninja: compile profiling
  * jancy: always place alloca's in the entry block
    turns out it may cause stack overflow otherwise (alloca's in looped block)
  * jancy: bugfix: array_suffix incorrectly parsed expressions starting with
    integer (because this special "shortcut" rule). shortcut rule removed
  * jancy: check division by zero
  * jancy: anydata pointers
  * ioninja: remove transmit pane size limitations

...............................................................................

version 3.5.5 (2016-01-08)

  * ioninja: typo in SerialSession.onParityChanged ()
  * njscroll: bugfix: once record is hidden, it was impossible to un-hide it
    (even if filter were to return true) -- hidden bit was kind of sticky.
  * ioninja: add an option to disable terminal pane for stream sessions (as an
    performance tweak; plus it might also help to isolate problems when crashes
    occur)
  * ioninja: don't emit SerialStatusLineChanged event on
    IOCTL_SERIAL_GET_MODEMSTATUS, insteqd keep track of the latest status line
    and emit event only when some line actually chanes
  * njscroll: critical bugfix: incorrect destruct sequence in CacheMgr
  * ioninja: start log server suspended when opening log file
  * njscroll: support for starting server in suspended state, resume later.
    this is important for opening ioninja logs (before representer is set)
  * ioninja: change shutdown sequence (stop log server IO thread in the
    beginning, but close record file in the very end)
  * njscroll: bugfix: NotifyCode_RebuildCompleted was never issued on amd64,
    resulting in hang-on-log-rebuild
  * ioninja: serial session port prop is now gui.StringProperty (without port
    list suggestion)
  * njscroll: bugfix: incorrect cursor advance when typing at the end of
    hex-pane
  * njscroll: bugfix: incorrect logic for changing console size
  * axl: use CLOCK_REALTIME_COARSE only if it's available (fallback to
    CLOCK_REALTIME otherwise -- older Linuxes don't have CLOCK_REALTIME_COARSE)
  * axl: make libudev optional (use find_path to determine whether libudev is
    installed and choose whether to build AXL wrappers for it).
    sys::lnx::SerialPortEnumerator simply returns a fixed list of devices if
    libudev is not available
  * axl: don't use C++ rtti typeid anymore
  * cmake: make GCC rtti optional and OFF by default
    using RTTI under GCC is really annoying. AXL used RTTI to get nicely
    formatted typenames, however under GCC typeid (T).name () gives a
    mangled name anyway. Even bigger issue is that it's impossible to derive
    from an interface class (with virtual functions) defined in a -fno-rtti
    library (and LLVM uses -fno-rtti by default, so it would require to rebuild
    LLVM with LLVM_REQUIRES_RTTI=1).
  * axl: bugfix: memory leak in cf::TypeRef::getDescription ()

...............................................................................

version 3.5.4 (2015-12-31)

  * axl: minor update re moving time functions to axl::sys namespace
  * axl: fsm subsystem is separated into a dedicated lib
  * axl: cf lib (Mac OSX Core Foundation Framework wrappers)
  * axl: iok lib (Mac OSX IOKit Framework wrappers)
  * ioninja: serial enumeration is implemented on Mac (using IOKit)
  * jancy: detect USB serial disconnect io.Serial implementation for POSIX
  * jancy: io_base.jncx should link to libudev
  * axl: sys::lnx::Udev classes
  * axl: sys::lnx::SerialPortEnumerator (via udev)
  * ioninja: terminal scrollback limit implemented (translates to
    Terminal::setHistoryLimit)
  * ioninja: gui.ComboBox.clear () method
  * ioninja: refresh com port list in both Serial and SerialMon sessions
  * ioninja: handling IoError in SerialSession (especially important during USB
    serial ports surprise removal)
  * ioninja: log error format change: (error-desc) -> : error-desc
  * njscroll: TerminalWidget history limit implemented
  * jancy: IoError event for various IO classes (particularly important for
    USB serial ports)
  * jancy: FileStream overlapped bugfix (potential lost of read blocks)
  * axl: serial port enumerator
  * njscroll: bugfix in TerminalWidget: terminal could crashed on invalid
    input due to unverified escRestoreCursor

...............................................................................

version 3.5.2 (2015-12-21)

  * ioninja: bugfix: File->Exit caused a hang
  * ioninja: dock state persistency fix
  * ioninja: font family should not be altered if it's not set properly
  * jancy: first add library, then do forcedExport
  * jancy: forcedExport did not check for addImport result
  * ioninja: mac dmg installer background image update
  * ioninja: update nj_io_mon to reflect the latest jancy change (.jncx is now
    .zip)
  * jancy: extension lib redesign: .jncx is now a .zip archive with .jnc
    source files and .bin dynamic library
  * axl: io::getTempDir
  * ioninja: add /d switch when signing installer (otherwise UAC displays some
    random tmp file name)
  * devmon: MSI installer fixes (did not work with UAC on)
  * axl: bugfix in AccessToken::getTokenInformation
  * jancy: remove jncx-info -- .jncx file is going to be a .zip archive
  * ioninja: installer can now execute nested MSIs
  * axl: zip read support (library axl_zip, class axl::zip::ZipReader)
  * ioninja: bugfix: installer did not ask to install Device Monitor if
    WinPcap feature was not selected
  * ioninja: rephrased installer message "XX-bit version already installed"
  * devmon: check for admin rights before admin-sensitive operations
  * devmon: update removeAllPnpFilters to ignore devices with no physical name
    (yes, it might happen in win10)
  * axl: simple access token wrappers
  * axl: sid wrappers
  * ioninja: proper handling of SSH re-authentification (need to reconnect
    when user name changes)
  * ioninja: appearance settings (fonts & colors)
  * njscroll: bugfix: icon placement was calculated incorrectly
  * njscroll: also, icon placement must be updated upon font change.
  * njscroll: critical bugfix: fold record should nullify current line
  * ioninja: bugfix: Serial was using wrong settings on open (should use combo
    boxes, not properties)
  * ioninja: zip package on windows changed to 7z
  * ioninja: mac packages (tar & dmg)
  * unix tar packages now use xz compression
  * ioninja: mac app bundle support
  * jancy: bugfix: jancy.exe crashed on --help command line switch
    (--import-dir had missing value)
  * ioninja: bug fix: session menu was created too late (caused an occasional
    crash)
  * bugfix: QT toolbar buttons had background on MacOS X

...............................................................................

version 3.5.1 (2015-11-24)

  * ioninja: session link re-implemented (via dedicated Session Link dialog)

...............................................................................

version 3.5.0 (2015-11-20)

  introduces: Jancy dynamic extensions (.jncx); Jancy multi-line literals;
  new Tibbo Device Monitor service for Windows with support for early attach
  to PNP devices; Serial Monitor plugin uses new Tibbo Device Monitor; Jancy
  compiles and runs on Mac OSX;

  * jancy: io::Socket::open did not translate io::AddressFamily_Ip6 to AF_INET6
  * jancy: io::SshChannel did not report libssh2 errors properly (should use
    libssh2_session_last_error)
  * ioninja: hex-view & plain-text icons resized to 20x20
  * all: port to MaxOSX
  * jancy: critical bugfix: using _alloca to determine stack epoch is not safe.
    turned out under certain conditions the first _alloca was above subsequent
    _alloca's (initializeThread () also uses up some stack). so we better use
    ExceptionRecordSnapshot pointer on stack, which is guaranteed to be above
    any subsequent stack allocations.
  * all: add -fPIC to all libraries. on amd64 gcc refuses to build shared
    objects unless all used static libraries are compiled with -fPIC. so, let's
    add -fPIC to all static libraries (libssh2/openssl for amd64 were also
    rebuilt with -fPIC)
  * ioninja: include .jncx extensions into deb & rpm package
  * ioninja: don't automatically add scipts/api to import path (rather, use
    paths.conf -- it's more consistent and more flexible)
  * ioninja: if server process terminates normally, just wait (rather than
    abruptly cancel pending requests -- this might result in losing compile
    error messages)
  * axl: allow read from SharedMemoryTransport even after remote disconnect
  * ioninja: add io_base.jncx. io_pcap.jncx and io_ssh.jncx to tar package
  * ioninja: premature termination of ioninja-server should report some error
    (before it was "no error")
  * ioninja: . in paths.conf should refer to conf dir, not to bin dir
  * axl: no need to have pvoid_cast (int) specialization on gcc
  * all: Version.h.in -> version.h.in
  * ioninja: msi and zip packages include tdevmon.msi and extensions:
    io_base.jncx , io_pcap.jncx, io_ssh.jncx, io_pcap.jncx
  * devmon: disable damn OACR in wdk build
  * ioninja: serialmon bugfix (m_dataSize was not set)
  * ioninja: SrvLib was not really added to module (printf/trace were not
    linked properly)
  * ioninja: serialmon had missing JNC_BEGIN_CALL_SITE around jnc::rt::memDup
    also, it's necessary to protect m_eventParamArray against race conditions
    in enumOpaqueGcRoots (we use JNC_BEGIN_CALL_SITE for that)
  * sh: devmon added to build scripts
  * ioninja: switch from old tdevmon to new tdevmon
  * ioninja: error propagation in shared extension lib nj_io_mon.jncx
  * jancy: error propagation in shared extension libraries io_*.jncx
  * devmon: cmake prefix change: DM_xxx -> DEVMON_xxx
  * axl: err::ErrorHdr& -> err::ErrorHdr*
  * devmon: forced stop support (for uninstall/reinstall). in case safe stop
    is not possible, service is still stopped (but the driver actually remains
    in memory in limbo state (reboot is required)
  * devmon: prevent unsafe filter device stoppage even in debug build
    (otherwise it's difficult to test release-expected behaviour)
  * devmon: critical bugfix in FilterDevice_dispatchCreate: caused a BSOD for
    non-exclusive devices.
  * devmon: msi package executes tdevmon.exe to perform necessary service
    actions (create, start, stop etc)
  * all: version.h.in VERSION_FULL is now defined as MAKELONG (MAKEWORD
    (VERSION_REVISION, VERSION_MINOR), VERSION_MAJOR)
    this is to allow specifying version in a natural way (2 hex digits for each
    version part, e.g.: 0x10203 --> 1.2.3)
  * devmon: critical bugfix: m_exclusiveFileCount did not account for initial
    ObDereferenceObject
  * axl: class sys::win::Process; sys::win::syncExec ()
  * devmon: MSI package prototype
  * devmon: driver signing (now that the new Tibbo code-sigining installed)
  * devmon: listing devices (all or devices of specified class)
  * devmon: getting device info
  * devmon: installing/removing PNP filters using physical device name or device
    class
  * devmon: removing PNP filters for all devices
  * axl: support for enumerators in sys::win::DeviceInfo
  * devmon: starting and stopping core service should also update service start
    type
  * devmon: stats for PNP beacon device
  * devmon: proper propagation of DeviceType and DeviceCharacteristics in both
    FilterDevice and PnpDevice.
  * devmon: major update: support for early pnp device attach via pnp filter
    driver tdevmonp.sys
  * axl: setupapi wrappers (sys::win::DeviceInfo)
  * axl: better overlapped IO support in io::win::File/io::win::FileHandle
  * devmon: application displays driver version, description and build time
  * devmon: all the binary data of read/write/ioctl requests is displayed in
    hex-view
  * devmon: supports for driver description, build time and asynchronous reads
    in client library
  * devmon: build driver with cmake (invokes WDK build as custom command)
  * devmon: handle IRP_MJ_INTERNAL_DEVICE_CONTROL
  * devmon: don't copy extra bytes besides the header on
    ntm_NotifyFlag_InsufficientBuffer
  * devmon: provide information on driver description and build time
  * axl: mt::win::WaitableTimer
  * devmon: initial release of the new device monitor (driver, library and
    application)
  * cmake: WDK support
  * ioninja: old njdm (device monitor) is removed
  * axl: sys::win::Service/ServiceMgr wrappers for SCM
  * jancy: multi-line literals
  * enumeration of source files in extension libraries.
  * axl: mt::DynamicLibrary method renames (load -> open; release -> close)
  * axl: add pvoid_cast specialization for int (othersize it was impossible to
    use pvoid_cast (NULL) on 64-bit systems)
  * ioninja: remove lib-prefix from jancy extension io_mon.jncx
  * jancy: remove lib-prefix from jancy extensions io_base, io_pcap, io_ssh
  * axl: remove extern "C" from AXL_EXPORT macro (must specify it explicitly)
  * ioninja: link jnc.stdLib explicitly
  * jancy: stdLib must be linked explicitly due to the link-order importance
  * jancy: llvm tag decoration bugfix.
  * ioninja: migration to the new jancy extension model
  * jancy: jnc::rt::RuntimeRef -> jnc::rt::Runtime (opaque in shared
    extensions)
  * jancy: jnc2cpp.pl is made public
  * jancy: minor bugfixes in jnc_io_base jnc sources.
  * jancy: major extension framework redesign; now suitable for shared
    libraries as well.
  * axl: rtl->sl (bad naming, besides, rtl is now used in jancy lib, and there
    it really means run-time-support-lib)
  * jancy: extension framework is somewhat functional
  * axl: bugfix in rtl::StringSlice::isEmpty
  * axl: GUID_Xxx -> g_xxxGuid
  * axl: minor improvements in rtl::StringCache
  * axl: rtl::BoxList::copy ()
  * axl: rtl::StringSlice

...............................................................................

version 3.4.11 (2015-09-25)

  * ioninja: save-session and load-session are functional
  * njscroll: better to make renameRecordFile copy the file (on Windows it's
    not possible to remove FILE_FLAG_DELETE_ON_CLOSE flag unless using
    undocumented methods)
  * bugfix: io::MappedFile::write did not update m_fileSize.
  * ioninja: remove unlink for CmdLineFlag_TmpLogFile (now it's done
    automatically in njs::Server
  * njscroll: support for io::FileFlag_DeleteOnClose (also on POSIX)
  * njscroll: extra file flags argument for rename record file method
  * njscroll: support for layer removal
  * support for record file renaming
  * njscroll: njs::LayerMgr::removeLayer ()
  * axl: io.renameFile (), io::copyFile (), io::deleteFile ()
  * axl: io::MappedFile::write method (uses io::File::writeAt)


...............................................................................

version 3.4.10 (2015-09-23)

  * ioninja: serial session: all serial settings are available via toolbar
    combo boxes
  * ioninja: pass plugin and log settings via temporary files during document
    creation
  * njscroll: additional BinDataConfig argument in njs::Server::create ()
  * ioninja: bugfix: gui::ComboBox::setCurrentIndex did not update value field
    m_currentIndex
  * axl: io.TemporaryFile (on windows uses FileFlag_DeleteOnClose, on POSIX
    deletes file in destructor)
  * ioninja: setting for gc-safe-point method (write-barrier vs simple-call)
  * jancy: support for simple gc-safe-points via call (rather than write
    barrier). write barrier safe points are not currently possible on win64
    because SEH 64 relies on being able to walk the call stack, and it doesnt
    work with llvm-jitted functions
  * jancy: critical bugfix in linux garbage collector
  * jancy: system V on amd64 incorrectly passed 128-bit structures
  * ioninja: support for redirecting of dbg::trace to ioninja-server-log
  * axl: support for redirection of dbg::trace to a file
  * axl: io::SharedMemoryTransport uses io::Mapping directly (without the
    overhead of io::MappedFile)

...............................................................................

version 3.4.9 (2015-09-16)

  * jancy: critical bugfix: crash on windows 10 due to different base address
    of ntdll.dll (__chkstk was too far, more than 4GB away from the generated
    code, therefore relative call was not possible)

...............................................................................

version 3.4.8 (2015-09-14)

  introduces: new Jancy pointer safety model; new Jancy garbage collector
  implementation; support for retro-colorization in Ninja Scroll engine;
  Syntax Highlighter plugin wizard in IO Ninja; new setting UI in IO Ninja

  * ioninja: apply method for Jancy Settings page
  * ioninja: set acceleration=true for large-value spin-boxes
  * jancy: setters for stack size limit, gc heap size trigger and gc period
    size trigger
  * ioninja: Colorizer plugin wizard is now called Syntax Highlighter plugin
    wizard; by default it generates a full C-language syntax highlighter
    including keywords, comments, and literals.
  * jancy: bugfix: accessing autoget property field of parent class did not
    work
  * jancy: improvement: allow non-closure-aware function ptr casts
  * jancy: jnc.AutomatonFunc typedef
  * jancy: function ptr type should update its signature on calc-layout.
  * jancy: minor bugfix in qt_test syntax highlighters
  * jancy: remove pseudo-chars ^/$ from jnc.Recognizer
  * axl: remove pseudo-chars ^/$ from FSM (was not an efficient implementation
    anyway)
  * ioninja: serial mon session now has filters for serial setting changes,
    serial control line changes, serial status line changes.
  * ioninja: show session settings by default when a session is open
  * jancy: JNC_END_CALL_SITE should only leave no collect region if no
    exception happened (otherwise gc shadow stack might contain invalid entries
    which will lead to crash)
  * ioninja: colorizer plugin wizard
  * ioninja: bugfix: protocol analyzer wizard used incorrect automaton
    declaration
  * njscroll: retro-colorize should redraw all the affected lines (previously
    only the last line was redrawn)
  * ioninja: colorization of protocol headers in network sniffer
  * ioninja: retro-colorize support
  * jancy: support for line continuation sequences in regexp literals
  * axl: support for line continuation sequences in FSM compiler
  * njscroll: bugfix: retro-colorize should drop
    CacheBinLineFlag_FinalAttrArrayReady
  * jancy: bugfixes in jnc.Recognizer: updating currentOffset should
    synchronously update lexemeOffset and currentOffset
  * jancy: changing lexemeLengthLimit didn't update lexeme buffer accordingly
  * njscroll: retro-colorization support
  * njscroll: bugfix: addPartBuffer did not properly update longest line
    length if lines were unmerged
  * njscroll: RepresenterTarget::writeRecord for strings.
  * ioninja: toolbar button binary data view switch
  * ioninja: critical bugfix: call-function-in-worker-thread req entry must be
    removed INSIDE jancy call site -- otherwise FunctionPtr might be deleted
    during gc-mark
  * ioninja: rebuild log progress dialog
  * ioninja: critical bugfix in all io-related classes: waiting functions
    should be enclosed in gc-wait regions (deadlocks otherwise)
  * ioninja: bugfixes in dialog classes construction
  * njscroll: rebuild log progress notifications
  * njscroll: remove half-impltemented colorizer architecture
  * jancy: JANCY_CALL_SITE_FINALLY
  * axl: AXL_MT_LONG_JMP_FINALLY
  * ioninja: bump up the size of setting dialog
  * ioninja: under kubuntu page area of setting dialog was too small to
    accomodate the minimum size of some pages
  * jancy: bugfixes in jnc::callFunction/jnc::callFunctionPtr
  * axl: remove mulDiv64 -- (bad performance and non-amd64 compatible); use
    simpler and faster approach with cast-to-double.
  * ioninja: jancy settings page is functional
  * ioninja: gc trigger sizes/stack limit size are being passed in command line
    and in setJancySettings msg
  * ioninja: gc stats is being collected by ioninja-server and displayed on
    jancy  settings page.
  * jancy: gc alloc size trigger
  * jancy: gc stats is available.
  * njscroll: use axl::g::getPreciseTimestamp for log record timestamps and
    for profiling
  * axl: critical bugfix re timestamps on windows: now there are
    axl::g::getTimestamp () using GetSystemTimeAsFileTime and
    axl::g::getPreciseTimestamp () using QPC
  * ioninja: no need to unparent property widget in ~SettingDlg
  * ioninja: major update: new settings dialog
  * ioninja: all objects created by layers now consolidated and can be removed
    all together
  * ioninja: remove-layer and remove-all-layers are functional
  * jancy: markOpaqueGcRoots func should be a member function rather than
    static
  * jancy: improvement/simplification in weak function/property pointers: weak
    mask is gone -- only 'this' arg can be made weak
  * jancy: no weakening-operator is required now
  * jancy: scheduled function pointers are properly weak-traced now.
  * ioninja: better design for main thread scheduler (as dedicated opaque
    class)
  * jancy: add TypeFlag_GcRoot if class type has mark opaque gc roots func
  * ioninja: major redesign: each plugin has its own runtime (now it's
    possible to remove plugins one-by-one)
  * jancy: jnc::construct/jnc::destruct moved to axl
  * jancy: rename JNC_BEGIN/JNC_END to JNC_BEGIN_CALL_SITE/JNC_END_CALL_SITE
  * jancy: JNC_BEGIN_CALL_SITE_NO_COLLECT for creating non-collectible call
    sites
  * jancy: support for direct function calls (when already inside call site)
  * axl: memory allocation and ref-counting model redesign:
  * axl: factories are gone (were poorly designed anyway)
  * axl: support for easy switching of base allocator
  * axl: support for constructor arguments (!)
  * axl: switch from explicit destruct function pointer to virtual destructor
    in RefCount
  * axl: decrease of size for child and in-place RefCount objects
  * ioninja: minor api redesign: use opaque class fields instead of pointers
    wherever possible (before it was impossible to instantiate opaque classes
    as variables or fields)
  * ioninja: remove FileDlg, LoginDlg etc dialogs from plugin host (should be
    created by plugins as needed)
  * jancy: bugfix: reactor layout could not be calculated due to the bug in
    lookupIdentifierType -- variable or field always yielded DataRef (for
    classes should be ClassRef)
  * jancy: ApiBase <T> --> ApiBaseTailPadding <T>; this is to allow arguments
    in base constructors.
  * ioninja: don't allocate log on gc-heap (it's static anyway)
  * jancy: critical bugfix: new (p) T () -> new (p) T
  * jancy: prevent zero-initializing already-primed headers
  * jancy: allocate large structs/unions/arrays directly on the gc-heap
  * jancy: minor bugfix: in multi-declarator declarations with implicit storage
    specifier, the first deduced storage specifier was used for all the other
    declarators (without re-evaluation)
  * ioninja: bugfixes and updates re io object on POSIX
  * jancy: bugfixes and updates re GC on POSIX
  * axl: mt.atomic functions for size_t on POSIX
  * ioninja: minor bugfix in io.Ssh: 64-bit size_t <-> int cast
  * ioninja: prevent unnecessary setError in Ssh::write ()
  * ioninja: major cleanup of api prime/construct calls
  * jancy: ApiClassBox is gone; ClassBox does not implicitly call constructor
  * ioninja: major update of all the API re latest jancy change in opaque
    classes design
  * jancy: major opaque class redesign: allow deriving from opaque classes,
    allocation as variables or fields etc -- basically, opaque classes are now
    just like normal classes but with opaque padding. 'operator new' is gone.
  * axl: minor StringCache bugfixes
  * jancy: bugfix: variable declaration for non-creatable types caused a crash
  * ioninja: bugfix: exception in log representer caused in 'result' being
    used without initialization
  * ioninja: critical bugfix: jancy exception in plugin constructor lead to
    deadlock (mutator thread has been not unregistered)
  * jancy: callFunction uses new axl-mt-long-jmp-try
  * jancy: JNC_END_EX returns status (so JNC_CATCH can be in many cases omitted)
  * jancy: more strict checks on ExceptionRecoverySnapshot.
  * axl: long-jmp-try can now return status via AXL_MT_END_LONG_JMP_TRY_EX (so
    AXL_MT_LONG_JMP_CATCH can be in many cases omitted)
  * jancy: exception recovery snapshots
  * jancy: handle destructor exceptions individually.
  * ioninja: remove debug printf's from io_PCapDeviceUi.jnc
  * jancy: memory leak in jnc.StringHashTable and jnc.VariantHashTable
  * ioninja: bugfix: no collect regions in Serial::fireSerialEvent and
    PCap::firePCapEvent
  * jancy: major update: multicasts & snapshots now use gc heap only instead
    of malloc/free (in-destructors)
  * ioninja: bugfix: serial log had skipped trailing argument in formatting
    literal
  * jancy: disallow argument skipping in formatting literals
  * jancy: formatting literal improvements: remove special gc handling (use
    fat pointer instead)
  * jancy: check for unused formatting literal arguments
  * axl: minor fix re io.UsbDevice on amd64
  * jancy: optimized method addRootArray for adding continual regions of roots
  * ioninja: major update of all api implementation classes re latest jancy
    changes
  * jancy: majort redesign of garbage collector and pointer-related structures
  * axl: minor update of mem-tracker report format
  * jancy: allow nested JNC_BEGIN-s (keep thread init count in tls)
  * ioninja: all the plugins compile
  * jancy: markStackGcRoot accepts target scope
  * jancy: StdFunction_CreateDataPtrValidator
  * jancy: jnc.memDup
  * jancy: LeanDataPtrValidator from class ptr
  * jancy: create reactor bindsite variables in entry block
  * ioninja: minor serial log colorization fix
  * axl: io.UsbDevice cleanup of 64-bit incompatibilities

...............................................................................

version 3.4.7 (2015-09-07)

  * axl: undo broken QPC implementation of timestamps

...............................................................................

version 3.4.6 (2015-07-16)

  * ioninja: devmon32 caused crash on installation -- replaced with the stable
    one from ioninja-2.3.5
  * ioninja: minor serial log colorization fix
  * axl: io.UsbDevice cleanup of 64-bit incompatibilities
  * changelog: force re-generation of changelog.txt every time
  * axl: err::SystemErrorCode_ObjectNameNotFound->ENOINT
  * axl: minor bugfix in hex-encoding
  * jancy: support for binary numbers and binary-literals (token is still
    called HexLiteral -- it yields the same results in all regards)
  * axl: improvements in libusb support; extended test for libusb enumeration
  * axl: minor update in ref::Buf (use pointers instead of references)
  * jancy: bugfix: formatting literals did not handle int64/uint64 properly
  * axl: high-resolution timestamps on windows (GetSystemFileAsFileTime proved
    to be way imprecise)

...............................................................................

version 3.4.5 (2015-06-23)

  * ioninja: bugfixes in scripts (re moving network adapter UI from API to
    common)
  * ioninja: updates re IP-defragmentation in all pcap-based plugins (Network
    Sniffer, TCP Flow Mon, UDP Flow Mon)
  * jancy: bugfix: deleteUnreachableBlocks used llvm::Value::hasOneUse () while
    it should have used llvm::Value::use_empty ()
  * jancy: bugfix: logical or/and should promote reachability flag BEFORE
    compiling the second operand.
  * jancy: bugfix: struct/union member functions did not work (due to
    incorrect lean this-pointer)
  * jancy: bugfix: locally declared named types did not work (due to missing
    calc-layout)
  * ioninja: tcp-flow-mon, udp-flow-mon plugin updates
  * ioninja: hide "add new layer" button (not relevant now)
  * ioninja: gui.ComboBox crashed on addEditTextToHistory with null-string
  * ioninja: io.PCap.openFile
  * ioninja: ip4 header fragmentation fields
  * axl: io::parseSocketAddress with empty string now yields zero'ed ip4
  * axl: io::PCap::openFile
  * jancy: jnc.List class
  * jancy: jnc.StringHashTable, jnc.VariantHashTable
  * jancy: bigendian bitfield support
  * ioninja: context menus for hex-edit & terminal widgets
  * bugfix in context menu (mouse-drag was not released)
  * njscroll: improvements in undo/redo: sanity checks, clear/setData/writeData
    registers with transaction history, caret update post setData/clear
  * njscroll: undo/redo in hex-edit widget
  * njscroll: select word on double-click
  * axl: don't disply 0.0.0.0 when formatting IPv4 address (display port only)
  * ioninja: Displaying update error message in About dialog in a single line.
  * ioninja: Displaying error description in About dialog when update fails.

...............................................................................

version 3.4.4 (2015-06-08)

  * ioninja: bugfix: test code in MainWindow::onHelpAbout caused a crash
  * ioninja: update session to reflect recent jancy change re dynamic
    sizeof/dynamic countof
  * ioninja: serial session improvements
  * ioninja: gui.ComboBox.adjustSizeToContents method
  * jancy: dynamic sizeof/dynamic countof now require pointers rather than
    references
  * ioninja: serial: only report when current value is different from the
    previously reported one
  * jancy: bugfix: variantRelationalOperator did not work
  * njscroll: timestamp visibility setting (never, smart, verbose)
  * njscroll: add CursorFlag_EnsureVisible when setting cursor on mouse move
    (very useful when selecting data in big log so it's possible to jerk mouse
    around to scroll)
  * axl: force english for windows error description (otherwise it causes
    problems with chinese windows and njscroll log engine)
  * ioninja: change log update, website update
  * ioninja: rollback defaults of auto-convert single lf/single cr to lf/cr
    pair to FALSE (just wasted almost an hour trying to figure out why mc
    doesn't work in ssh session)
  * njscroll: bugfix: xterm saved cursor and caret attr should be part of
    screen buffer
  * njscroll: bugfix: invalid bin line size was used in cache processors (bug
    introduced with recent changes in unicode drawing)

...............................................................................

version 3.4.3 (2015-06-01)

  introduces: TCP Flow Monitor, UDP Flow Monitor, proper display of unicode
  characters spanning across line borders, member operator for jancy enums

  * axl: release 5.3.7
  * jancy: release 1.5.5
  * ioninja: rollback defaults of auto-convert single lf/single cr to lf/cr
    pair to FALSE
  * njscroll: bugfix: xterm saved cursor and caret attr should be part of
    screen buffer
  * njscroll: bugfix: invalid bin line size was used in cache processors (bug
    introduced with recent changes in unicode drawing)
  * jancy: adjust function tag of std functions memcpy, memset, strlen etc as
    to avoid mapping conflicts
  * jancy: use zeroInitialize rather than store for stack variables
  * jancy: add memset, memcpy, memmove to global mapping (required by llvm
    intrinsics)
  * jancy: bugfix: getMemberOperatorResultType () and memberOperator () should
    use OpFlag_KeepEnum when preparing operand (now that we have enum member
    operators for simplified enum value checking)
  * jancy: remove explicit cast requirement for integer truncations (it's
    really annoying)
  * ioninja: tcp-flow-mon explicit cast size_t->uint32_t
  * jancy: bugfix: using enum constants from within the same enum caused
    calc-layout recursion error
  * jancy: bugfix: deleteUnreachableBlocks might have lead to situation when
    block is marked unreachable but still had uses. changed to a fixed-point
    computation to delete unreachable blocks in proper order
  * jancy: llvm.memcpy, llvm.memset, llvm.memmove
  * zero-initialize large variables with llvm.memset (rather than store)
  * jancy: member operator for enums (allows skip writing fully-qualifed
    member names when you need to check the value of a enum variable/field)
  * ioninja: tcp flow monitor/udp flow monitor icons from leo
  * ioninja: change the size of buffer back to 1600 (apparently, windows does
    not reassemble IP-fragmented datagrams, so it doesn't really matter)
  * added minhook library and test (for api hooking in ioninja)
  * cmake: create_flag_setting improvements: modify both C and C++ flags
  * automatically detect configuration-independent/configuration-specific
    flags.
  * ioninja: change min/max packet size limits to 0..65536
  * ioninja: tcp flow mon session: support for out-of-order TCP segments
  * ioninja: udp session: read buffer should be 65535
  * udp flow mon sessions: read buffer should be 1600 (no IP fragmentation
    supported yet)
  * ioninja: bugfix: sniffer session did not handle invalid UDP/TCP sizes
    properly
  * ethernet frame buffer was too small (should be 1600)
  * ioninja: filter combo in sniffer
  * bugfix in tcp flow mon
  * ioninja: re-arrange plugin groups (UDP is now client, TCP proxy is now
    server)
  * axl: io::SockAddr::parse also accepts single port string (results in IPv4
    with zero-ed address)
  * ioninja: UDP flow monitor
  * axl: bugfix: rtl::String::insertSpace did not work properly on libc
    (memcpy vs memmove)
  * ioninja: TCP flow monitor (uses pcap to build clean TCP data flow log)
  * axl: SockAddr utils for equality checking and filter matching
  * ioninja: clean-up of test code in ioninja-server
  * ioninja: support for job objects (turns out to be unreliable and have *a
    lot* of corner cases)
  * support for waiting for parent object, so any of the following will
    terminate server process: 1) disconnect message or 2) shared-memory
    transport disconnect or 3) parent process finished
  * axl: mt::win::JobObject wrapper
  * ioninja: prevent windows crash & send report dialog when ioninja-server
    crashes
  * ioninja: remove windows-vs-linux closeKind configuration (always use
    SO_LINGER)
  * axl: test_mini simple socket test re graceful close/reset
  * ioninja: bugfix: doc.Storage incorrectly saved empty strings (as '(null)'
    values)
  * ioninja: --root flag was ignored
  * ioninja: sniffer session should use device name if description is null
  * jancy: strdup should return null for empty strings
  * ioninja: bugfix: socket property disconnectKind (graceful/reset) did not
    work
  * ioninja: disconnect message (rather than waiting for stdin to be closed)
    reading stdin interferes with the new design of gdb debugging
  * ioninja: major redesign of debugger interface: instead of initially
    staring ioninja-server in suspended state to give gdb a chance to attach
    and resume it later, we now start gdb directly. communication with gdb is
    supposed to be done via TCP port passed in a command line (e.g. -d=1234).
  * njscroll: pending cursor validation (when we set cursor into an un-cached
    area)
  * njscroll: don't scroll to bottom on resize unless the vertical scroll bar
    is maxed (before it was cursor based, which was really annoying)
  * njscroll: bugfix in CacheBinHexLine::addBinData: now we need to manually
    check if the line is full (and if yes, then try to fill extra utf bytes)
  * njscroll: let BinLine decide the size of accepted chunk (bin hex lines did
    that outside of addBinData, which now is wrong cause we want to save extra
    bytes past end-of-line for better UTF display)
  * njscroll: save up to 3 extra bytes in bin-hex lines (may help with proper
    UTF display)
  * ioninja: add changelog to windows packages zip/msi
  * ioninja: changelog
  * jancy: major bugfix: const 64-bit integer arithmetics used 32-bit
    operations (potentially resulting in garbage in high bits of results)
  * axl/njscroll: update in unicode bintext painting: use buffer past
    end-of-line (if available) to correctly display characters which are
    encoded acroll line boundaries
  * ioninja: CMakeLists.txt had qt rpath-link added twice (removed old one)
  * cmake: remove rpath when compiling release unix binaries
  * that also requires manually adding rpath-link (otherwise linker failes
  * to build qt-dependent binaries)
  * axl: warning suppression for gcc64
  * ioninja: debian package depends field
  * debian dependency calc perl script

...............................................................................

version 3.4.2 (2015-05-13)

  * don't try to display utf combining marks in hex-view and hex-editor (it
    turns into a mess anyways)
  * bugfix: merge threshold didnt work as expected (milliseconds were
    not converted to 100-nanoseconds)
  * bugfixes re suspended/resume states under linux
  * bugfix: removing packet template crashed ninja
  * 3 extra std log record codes (plain text, hyper text, bin)
  * msvc redistributables were not included in zip packages
  * jancy: critical bugfix in checkVariantScopeLevel re TypeFlag_StructRet

...............................................................................

version 3.4.1 (2015-05-06)

  * jancy: critical bugfix: gc root variables should be zero-initialized even
    if they have initializer (cause initializer can induce gc-run)
  * jancy: critical bugfix: variant should have TypeFlag_StructRet (otherwise
    it results in invalid argument/retval ABI)

...............................................................................

version 3.4.0 (2015-05-05)

  introduces: IPv6 support, named regexps and standard character classes in
  automatons, variants, dynamic library access, SSH session re-authentication,
  x-term changeable terminal console size

  * bugfix: scripts did not compile under x64 due to size_t->int cast (made
    cast explicit)
  * jancy: critical bugfix in gc (due to typo destructGuards of other threads
    were not marked)
  * jancy: null default for automatonFunc in jnc.Recognizer constructor
  * remove extra space from labels like "Address: " (now toolbar injects space
    widgets)
  * minor updates/bugfixes in jnc.Recognizer
  * jancy: bugfix: member automatons produced compile error (did not take
    'this' into account)
  * axl bugfix: RegExpCompiler skipped repeat-char after ')'
  * jancy: recognizer samples updates
  * jancy: update re new regexp engine: AutomatonResult type (to distinguish
    between error and stop)
  * support for named regexp definitions in automatons
  * major regexp engine improvements: support for ^ $ anchors
  * support for std char classes \w \W \s \S \d \D \h \H
  * tcp plugin, ssh plugin -- minor updates in log record logic
  * size hints for toolbar combo boxes
  * forced spacings before toolbar labels and combo boxes
  * network adapter properties update in all plugins
  * AF_INET and AF_INET6 constants are exported into script namespaces
    (AF_INET6 is platform-dependent)
  * jancy: support for export of constants into script namespace
  * change 'debug-info' switch to 'debug'
  * jancy: bugfix: debug info for variant type
  * IPv6 support
  * IPv6 support updates: socket fixes, host name resolving, network
    adapter enumeration
  * adjust property grid drop-down width using QComboBox::sizeHint
  * linux fixes re latest socket changes
  * struct SockAddr as union of sockaddr_in and sockaddr_in6
  * replace all out args of type sockaddr* with SockAddr* (preparation for IPv6
    support in ninja)
  * network adapter enumeration
  * comply with WSAAddressToStringA on windows (or with inet_ntop otherwise)
  * IPv6 parsing and formatting linux fixes
  * IPv6 address parsing and formatting
  * jancy: check variant scope levels
  * throw long-jmp exceptions if library function is called from within
    non-throwing scope
  * check pointer should either soft-throw or long-jmp-throw (ignore try
    operators)
  * full-clear runtime in Runtime::destroy (caused crashes)
  * mt.win.Library fixes
  * remove duplicate strings in dynamic library error messages
  * jnc.Library uses axl.DynamicLibrary, works on Windows and POSIX
  * mt.DynamicLibrary class
  * update tar-building scripts to remove '.'
  * jancy: major update: unsafe functions, unsafe regions, dynamic libraries
  * jancy: declarator syntax update (so it's possible to use 'throws' and
    'const' modifiers in any sequence)
  * SSH channel improvements: re-authenticate, console size change handling
  * jancy: std function jnc.throw ()
  * jancy: bugfix: cast from variant did not handle null variant
  * gui.LoginDlg, gui.MessageDlg
  * remove 'object' (use 'class' instead) and 'object <T>' (use
    'variant' instead)
  * jancy: variant relational operator (at runtime)
  * jancy: allow casts non-POD* --> POD thin*
  * jancy: make variants, structs, unions and arrays nullable (assigning null
    means zero-initialize)

...............................................................................

version 3.3.3 (2015-03-31)

  * bugfix: crash during binary transmit page destruction due to incorrect
    destruct order
  * enforce min and max sizes in HexEditWidget::setData
  * bugfix: unexpected jump to the next location when opening find dialog
    with something selected in log
  * bugfix: memory leak fix in Array::reserve
  * find dialog improvements
  * support for copying into string/array rather than clipboard
  * bugfix in property factory (properties were not deleted)
  * re-organize packet template widget
  * only update properties within modification range
  * hex edit widget dataChanged event now contains info about modified range
  * jancy: variant support in formatting literals
  * jancy: variant type basic functionality implemented
  * jancy: remove jnc_VariantType.h
  * typo in copy/paste/undo/redo shortcut handling
  * bugfix: packages did not include packets.conf

...............................................................................

version 3.3.2 (2015-03-16)

  * jancy: increase default stack limit (turned out jancy dialog sample failed
    with stack overflow on amd64)
  * axl: support for catchless long-jmp try
  * jancy: c++ exceptions replaced with long_jmp-based exceptions
  * axl: long_jmp-based exceptions (jancy: hard-throws do not work well with
    c++ exceptions)
  * cmake: fix CMP0043 warnings on newer CMake versions
  * jancy: critical bugfix in pointer arithmetics: increment of fat pointer
    was broken after pointer struct unification
  * jancy: remove thin-vs-fat varieties of check-ptr functions (doesn't work
    well under x64)
  * support for post-compile LLVM IR emission
  * jancy: namespace stack should also contain scope field (otherwise
    evaluateAlias nullifies current scope -- it opens namespace, in which alias
    was declared)
  * jancy: should also null-check class pointers before accessing vtable
  * jancy: property ptr vtable loads should add PtrTypeFlag_Safe to function
    pointers
  * jancy: all vtable entries should have PtrTypeFlag_Safe
  * jancy: also null-check thin function and property ptrs
  * jancy: null ptr checks use soft-throws if possible
  * jancy: function ptr and property ptr structs are the same for all pointers
    (cast is done at pointer access)
  * jancy: data ptr range checks use soft-throws if possible
  * jancy: data pointer struct is now the same for all pointers (cast is done
    at pointer access rather than pointer check)
  * jancy: prevent throw loops (catch label marks scope as non-catching)

...............................................................................

version 3.3.1 (2015-03-06)

  * important bugfixes in automaton functions
  * IDE plugin wizard updates
  * support for hex-code escape sequence in regexp \x00
  * DFA should use accept context of the NFA state with the lowest ID

...............................................................................

version 3.3.0 (2015-03-04)

  introduces: automatons and recognizers, IDE wizards, import facilities

  * recognizers and automaton functions
  * IDE plugin wizards updates re automaton functions
  * IDE session plugin wizard is functional
  * bugfix: API slot conflicts
  * doc.Plugin.transmitString method
  * log.Writer should be allocated on heap, not on stack
  * jancy: std functions: strcat, strdup, memdup
  * bugfix: conflict between std api slots vs user api slots
  * jancy: bugfix: member automatons did not account for 'this' argument
  * jancy: minor update in comments in recognizer sample
  * jancy: test sequence fix
  * jancy: minor gcc fixes
  * jancy: bugfix in CallConv64::createArgVariables ()
  * jancy: automaton samples (plus minor bugfixes)
  * axl: err::getError --> err::getLastError
  * axl: rtl::AutoPtrArray update
  * jancy: on linux gc-stratgy requires stack module before JITting
  * jancy: eof handling in recognizers
  * jancy: major update: automaton functions
  * axl: fsm library (finite state machines)
  * minor updates in protocol analyzer wizard
  * log.attachConverter accepts extra representerFunc argument
  * jancy: allow implicit casts void* to char* and to uchar_t*
  * minor updates in scripts and wizards
  * jancy: memchr, strchr is changed to return char*
  * Cast_Array should have OpFlag_LoadArrayRef (for now, to be removed later)
  * jancy: const-cast for arrays
  * allow implicit casts between integer types of the same size
  * udp socket compass button
  * jancy: minor updates in stdFunction.jnc and stdTypes.jnc
  * jancy: update in jnc2cpp.pl: support for namespaces so io ninja IDE can
    properly add standard items
  * plugin default settings should also be used when creating session
    by plugin file path
  * udp session: auto-switch remote address setting
  * paths.conf update: user-plugin-dir
  * debug trace support
  * fixes regarding failed add-layer
  * udp session: uses std log record codes TX & RX
  * updates re latest jancy changes
  * layer IDE wizards (answering machine and protocol analyzer) are finally
    functional
  * jancy: remove current thread module dependencies
  * operator new takes extra type* parameter
  * extra std functions for memory ops
  * bugfixes in pointer diff operator
  * jancy: mark heap allocations in new operator as temp stack roots
  * bugfixes regarding plugin open process
  * msi fixes in Add/Remove Programs entries
  * bugfix in PacketPad.jnc creation
  * minor gcc vararg fix
  * all plugins use import facilities to reduce compilation time
  * log representer is now a function rather than class (to enforce its
    stateless nature)
  * jancy: optional types and functions in API declarations
  * minor modifications in imports implementation
  * jancy: import declaration
  * setData checks for minDataSize
  * bugfix in CMakeLists.txt tests
  * improved logic for backspace from hex0 + cursor4bit
  * major redesign of packet templates
  * HexEditWidget bugfix in replaceSelection
  * HexEditWidget bugfixes in setDataSizeLimits
  * bugfixes and improvements in HexEditWidget
  * website -- introduction update
  * jancy: website markdown files
  * website markdown files
  * mascot update
  * minor update on wizard files
  * sessions and layers dirs are merged together (pugins dir)
  * wizards dir added (3 wizards: session, protocol analyzer layer, answering
    machine layer)
  * wizards.conf added
  * geeky ninja icon
  * package cleanup before the release
  * jancy: linux fixes
  * JNC_GC_ROOT_ENUMERATOR -> JNC_OPAQUE_CLASS
  * intptr->int warnings suppressed
  * jancy: dialog sample (properties, events, reactive programming)
  * jancy: gc bugfixes
  * preConstructor -> preconstructor
  * opaque class setup must specify actual size
  * export sample

...............................................................................

version 3.2.5 (2014-12-31)

  * linux requires special handling of Ctrl+<letter>
  * jancy: linux bugfix re multicast destructors
  * TerminalWidget should kill selection on screen buffer change
  * bugfix in TerminalScreenBuffer::getLine ()
  * new defaults for ssh channel
  * pty: xterm
  * address: sdf.org:22
  * user: new
  * bugfix in TerminalWidget (TerminalLine* could be referred from
    both m_history and m_console)
  * bugfix: paint always painted all the way down till the end of
    console
  * copy/paste support in terminal
  * axl: ecc-key: set utf8 for console output
  * xterm mouse support
  * application cursor key mode support in TerminalWidget
  * xterm support
  * jancy: bugfix: jnc.FmtLiteral must be a root (even though it has no fat
    pointers)
  * support for connect cancellation in SSH channel
  * intercept ctrl+<letter> keys in terminal widget (optional)
  * exceptions in plugin constructor were not handled properly (main
    app remained waiting)
  * jancy: 'const' post-declarator modifier is made part of declarator_suffix
    (so 'throws' and 'const' can be specified in any order
  * changelog: show all comits after the latest release also
  * jancy: construction sequence change: field constructors -> field
    initializers -> property constructors -> preconstructor -> constructor
    (before field initializers were called as part of a preconstructor)
  * update ioninja api to re-used IfaceHdr of basetype (applies to
    Property->IntProperty and Plugin->Session/Layer)
  * jancy: major structural refactoring:
  * common code from DerivableType and Property moved to NamedTypeBlock
  * static and member destructors are called in reverse order of
    corresponding constructors
  * property constructors and field initializers implementation
  * class re-uses IfaceHdr from the first parent
  * jancy: VTable -> vtable
  * property getDefaultConstructor () removed -- properties don't have
    overloaded constructors anyway
  * jancy: property constructors, destructors, field initializers -- work in
    simple cases (still need to refine)
  * opaque class GC root enumerator placeholders
  * axl: CPCap -> PCap
  * jancy: allocate memory for formatting literals from GC heap
  * jancy: gc-mark opaque classes, multicasts and multicast snapshots
  * axl: bugfix: hexcode buffer must be at least 9 chars long
  * axl: bugfix in escape encoding -- must force null-termination of a hex
    code
  * axl: escape encoding now supports unicode characters \u \U
  * if pattern is incremental then start from the last found location
  * axl: bugfix: incremental boyer-moore find should use offset in case of
    empty pattern
  * axl: boyer-moore find should actually succeed on empty pattern
  * JNC_API_XXX --> JNC_XXX
  * jancy: JNC_API_XXX --> JNC_XXX
  * hexedit should paste text as hex if the cursor is in hex area
  * bugfix: copy from bintext line
  * jancy: prevent adding fields and virtual methods to extension namespaces
    (before it was possible to cheat by using in-property firleds or virtuals)
  * jancy: reactor recursion protection
  * refinement of comments in samples
  * jancy: sample pack comment updates by dima
  * jancy: minor sample updates
  * jancy: bugfix: remove TokenKind_Signed
  * jancy: gcc callconv fixes
  * jancy: major sample pack update
  * jancy: major redesign of extension namespaces
  * using declaration implemented
  * jancy: bugfix: arg_pass1 did not add parentheses into token list
  * jancy: bugfix: bitflag enum did not accept '0' (cause of recent integer
    const type change unsigned vs signed)
  * jancy: support for escape sequences in single-quoted literals
  * jancy: more bugfixes regarding try/catch/finally
  * jancy: bugfixes regarding try/catch/finally
  * jancy: jnc.setPosixError, jnc.setStringError std functions
  * jancy: bugfix: getInt32TypeKind_u/getInt64TypeKind_u should actually
    return signed types (otherwise all the integer constants are unsigned)
  * jancy: support for 'bindingof' without parentheses in 'onevent' statment
  * 'extend' -> 'extension' (for symmetry: extend is a verb, namespace is a
    noun)
  * jancy: allow casts from non-POD* to POD const*
  * jancy: update of the last commit
  * jancy: bugfix: tls object header was not constructed properly
  * variable scope level is NOT variabl->getScope ()->getLevel () (for example,
    local statics, or local tls variables)
  * jancy: assert statements implemented
  * changelog: linux fixes
  * changelog: created perl utility to generate changelog out of git commits
  * scripts updated to use dynamic sizeof instead of
    jnc.getDataPtrSpan
  * jancy: jnc.getDataPtrSpan is removed (not needed now when we have dynamic
    sizeof)
  * scripts brought to conformance with the latest jancy changes
    (i.e. dynamic casts and static new)
  * jancy: bugfix: getHeapVariableObjHdr caused a crash (cause of null type)
  * removed static new/stack new operators from jancy samples
  * jancy: prevent dynamic casts const->non-const
  * prevent casts non-pod -> void*
  * support for dynamic casts of arrays
  * jancy: variable object headers
  * dynamic casts
  * dynamic sizeof
  * dynamic countof
  * jancy: scripts brought to conformance with latest jancy grammar
    changes
  * jancy: grammar bugfix (now that we have dynamic sizeof/countof/typeof,
    type_name_or_expr must return Value, not Type*)
  * jancy: unmanaged heap -> gone
  * jancy: pragma pack -> gone
  * jancy: pack -> alignment
  * jancy: fenum -> bitflag enum
  * jancy: cenum -> exposed enum
  * jancy: dconst -> readonly
  * jancy: devent -> gone
  * jancy: dtypeof -> dynamic typeof
  * dynamic sizeof
  * dynamic countof
  * dynamic cast

...............................................................................

version 3.2.3 (2014-11-17)

  * handle LIBSSH2_ERROR_EGAIN in SshChannel::write ()
  * jancy: ragel highlighters included headers from src dir (which required
    adding src dir to includes)
  * cursor selection in ASCII area did not work properly
  * axl: MappedFile bugfix: under POSIX mapping view beyond end-of-file
    caused bus error

...............................................................................

version 3.2.2 (2014-11-14)

  * post-fold caret, selection and hilite validation and update
  * sessions use ansi-escape sequences for hyper text
  * bugfix: don't update CachePage::m_indexLeaf.m_lineCount int
    CachePage::insertRemoveLines (already done in
    CacheMgr::onFoldRecordCompleted)
  * validate and update caret pos after fold completed
  * axl: HyperText -- actually, it should ignore \n: line-handling should
    be done before feeding data to HyperText
  * axl: bugfixes and updates
  * axl: AnsiAttrParser and HyperText bugfixes and updates
  * bugfix: length used before initialization
  * log widget validate cursor pos takes selAnchor into account
  * hex-edit widget validate cursor pos takes selAnchor into account
  * axl:fast widget scrolling support (instead of full redraw)
  * corner button bug fixes and adaptation for fast scrolling
  * axl:ansi attributes
  * hyper text uses ansi attributes instead of <> tags
  * forced limit in JncRepresenterTarget::addPart () -- Sniffer
    plugin occasionally crashed on bad packets
  * workaround: corner button was drawn on black background on linux
  * axl: bugfix: std palette did not mask out alpha channel
  * bugfix: widget should stop caret timer on destruction
  * axl: QT monospace font force integer metrics
  * QT std palette
  * axl: TextPaint update
  * LogWidget/HexEditWidget/Terminal widget update to use new TextPaint
  * cmake: include_directories should not be part of master CMakeLists.txt
    files
  * activationFinished signal should use int status (moc doesn't do
    well with nested typedefs)

...............................................................................

version 3.2.1 (2014-11-10)

  * axl: default font flags should be 0, not -1
  * axl: major gui subsystem redesign
  * axl: ecc-key -- linux update
  * nj_keygen is removed (no need anymore)
  * axl: ecc-key utility for generating license keys & product keys
  * LicenseMgr update -- rely on axl::cry::EcKey
  * support for 2 license kinds and 3 keys (personal, workgroup licenses +
    activation key)
  * axl: ecc product keys implemented
  * axl: open-ssl wrappers (axl::cry)
  * all codecs moved to axl::enc namespace
  * base32 encoding implemented

...............................................................................

version 3.2.0 (2014-11-03)

  introduces: Linux packages, Java naming convention, log search functionality,
  auto-update, option to sudo plugins under Linux

  * update-database change (split by os-cpu)
  * shell script updates (rpmbuild and debpkg should be sudone)
  * axl: gcc fixups in BoyerMooreFind
  * signed-unsigned comparison warning fix
  * reverse find implemented
  * LogWidget::processCache -- support for reverse line order (if startLine >
    lastLine)
  * bugfix: mouse wheel delta can actually be less than 120
  * so need to accumulate deltas
  * find improvements
  * switch to new boyer-moore find
  * text-find and binary-find
  * case-sensitive and whole-word-only features are functional
  * (find-prev not yet)
  * hex-edit data-changed notification
  * find uses new boyer-moore instead of boyer-moore horspool
  * jancy: tests->test
  * axl: boyer-moore bugfixes
  * tests->test
  * axl: boyer-moore enhancements:
  * whole-word support
  * pass offset in incremental-find
  * find and reverse-find return same offsets
  * axl: full boyer-moore (good-skip/bad-skip)
  * axl: horspool variation (bad-skip only)
  * axl: utf support in boyer-moore find
  * axl: case-insensitive find (unicode-aware, but no special cases)
  * axl: reverse boyer-moore find
  * axl: incremental boyer-moorefind
  * cmake: configure_file_w_permissions doesn't try to detect whether the full
    dst path was specified or not (use CMAKE_CURRENT_BINARY_DIR for output)
  * package scripts bugfixes
  * auto-update file format redesign (to support multiple
    installation types: msi, zip, deb, rpm, tar)
  * bugfix in AniLabelWidget
  * AniLabelWidget optimization attempt. CPU load showed 5% on Release build
    when About dialog was shown. ridiculous! i supposed switching from QTimer
    to QBasicTimer, caching rich text and  drawing only the visible part of it
    would speed up animation. turns out, no. the solution happened to be
    drawing background by hand, cpu load dropped to reasonable values after
    that
  * typo in transportFlags
  * hide run-as-root without layout distortion (change QHBoxLayout->QWidget
    container)
  * run as root via sudo
  * delete session temporary files
  * also, fixups regarding closing of the transport when terminating on
  * errors
  * axl: attach/detach file handles (io.File, io.MappedFile,
    io.SharedMemoryTransport)
  * axl: FileFlag_DeleteOnClose calls unlink () on linux
  * desktop file for deb & rpm packages
  * remove tmp files generated as a result of erroneous linux conf
    files
  * jancy: don't create imports when parsing std function declarations
  * linux fixes
  * linux packages
  * package update (use specialized paths-*.cmake, without unnecessary
    libs/tools)
  * zip package
  * msi package update (do not expand paths.conf on installation
  * keep conf files in ./conf dir)
  * detect conf dir
  * expand std paths in paths.conf
  * axl: getExeFilePath (), getExeFileDir ()
  * zip packages for publishing
  * jancy: std function declarations are moved to jnc file just like std types
  * internal types are hidden from public jnc namespace
  * support for
    jnc.String/jnc.StringRef/jnc.ConstBuffer/jnc.ConstBufferRef/jnc.BufferRef
    in formatting literals
  * StdLib.getErrorDescription is moved to dedcated type jnc.Error (this way
    property m_description is not mapped unless type jnc.Error is really used)
  * jancy: return error if formatting literal doesn't know how to format a
    value
  * jancy: automatically cast from Derivable& to Derivable*
  * jancy: operator cdecl ... () is added to String and StringRef
  * jancy: operator ... / operator cdecl ... (to specify how to pass types in
    vararg functions)
  * jancy: typo in jnc_String.jnc
  * jancy: struct constructor cast should be prevented not via type map, but
    rather via simple bool flag -- multistep conversions should be disallowed
    anyway
  * jancy: String/StringRef/StringBuilder
  * jancy: ConstBuffer/ConstBufferRef/BufferRef/Buffer std types draft
  * jancy: support for skipping the first function overload
  * jancy: prevent infinite recursion when trying struct constructor casts
  * jancy: bugfix: formatting literal was losing the ending portion
  * jancy: formatting literal improvements (support for indexed-based argument
    injection)
  * jancy: function_suffix_rslv to allow C++-style constructors
  * jancy: setas declaration -- for specifying setter argument types
  * jancy: getArgCastKind for Value arrays
  * if CastOp::cast (): if constCast fails, fall back to llvmCast (essential
    for constructor-casts)
  * CastOp_Struct uses constructor-casts as a last-resort cast
  * jancy: std typedefs (size_t, uint_t etc)
  * jnc.String/StringRef draft
  * update re latest jancy changes
  * jancy: api overload mapping redesing
  * api macros for mapping struct and union members
  * jancy: overloaded function support via JNC_API_XXX macros
  * enum ApiSlotId -> enum ApiSlot
  * axl: replace ListLink with Entry in ListData -- this way it's easier
    to debug (can walk and inspect the whole list in locals/watch)
  * jancy: std type definitions are moved to perl-processed jancy source files
    (instead of manually assembling struct types by hand)
  * sh: test projects shell script, testing is made part of full rebuild
  * jancy: decided to remove throw conditions (it's never really needed
  * but it requires not-so-elegant syntax, a dedicated keyword and tricky error
    propagation logic)
  * sh: small updates in shell script output
  * cmake: disable linker warning 4221 (no public symbols in a source file)
  * update for the last fix: turns out, the style is not automatically deleted
    but it is altered upon during (and maybe after) setStyle (). therefore, we
    have to use the new instance every time and also make sure it doesn't
    linger indefinitely
  * bugfix: plugin list widget style should be dynamically created
    rather than static
  * ensure all stylesheets use namespaces
  * don't pass full source file list in command line, instead pass a
    single plugin file
  * switching read-only mode set 2px-wide caret (must be 1px)
  * axl: CMakeLists.txt update
  * axl: remove length limit in dbg::trace
  * axl: make gcc happy about names from base template type
  * axl: rename crc16 (used in Packetizer) to "checksum16" (cause it was not
    crc16)
  * remove redundant ...Kind suffixes from enum names (after java-style
    conversion)
  * keygen: signed/unsigned comparison warning
  * axl: Iterator redesign: instead of storing ListLink pointer, it's
    better to store Entry pointer -- this way it's easier to see contents of
    iterator in the debugger
  * linux fixes
  * qtWidget -> QtWidget
  * keygen: fixed size_t -> int warnings on amd64 builds
  * java naming convention
  * jancy: java naming convention
  * bulldozer: java naming convention
  * axl: type names brought to java naming convention
  * axl: variables, fields, functions brought to java naming convention
  * keygen: during linux port attempt it stopped compiling under windows
    restore for now, refactor/port later
  * windows shell scripts update -- detect CPU by default
  * don't build keygen on linux yet
  * keygen doesn't compile on linux and needs minor porting. but it has to
    be refactored anyway, so postpone that for now
  * linux shell script updates
  * calculate build times
  * halt build process on any error
  * use native processor architecture by default
  * accept processor aliases (x86/i386, amd64/x86_64/x64)
  * bugfix: shell script rebuild-all calculated elapsed time
    incorrectly
  * wix installer fix (incorrect redist dir)
  * shell script updates: add calc-time-diff script to calculate
    build times
  * switch to lowercase (most examples on the web use lowercase)
  * wix installer updates
  * shell scripts no longer copies stuff into files/ dir before invoking
    heat/candle/light (instead, it uses original files directly)
  * INSTALLDIR layout has been redesigned a little bit: executables,
    redistributables and conf files go into INSTALLDIR/bin
  * uninstall shortcut is created
  * remove 'scripts' folder from the project (no more CMakeLists.txt
    in 'scripts') originally it was useful to edit plugin and api .jnc files
    from Visual Studio. now it's much more convenient to do with IO Ninja IDE

...............................................................................

version 3.1.2 (2014-09-23)

  * trim user name and product key
  * disabling activation bugfixes
  * activation disabled
  * sample packet-templates.jnc is put into scripts/samples
  * nj_keygen app
  * sh: build for windows no longer requires WIX in the PATH
  * installer build scripts re-engineered
  * installers for linux: deb, rpm, tar
  * bulldozer: bugfix: CppParserUtils.lua should be prepended with '/'
  * axl: bugfix: incorrect posix flags in CFile::Open
  * cmake: Paths.cmake.template had QT_DLL_DIR missing
  * bulldozer: frame for c++ parser is split into 2 files (CppParser.cpp.in
    and CppParser.h.in)
  * lua support code is put into CppParserUtils.lua
  * bulldozer.cmake is updated to support generation of both *.llk.cpp and
    *.llk.h files in one go
  * sh: update: clean everything first, then build
  * cmake: bugfixes: added @ONLY for generated cmake modules
  * sh: update of linux set-variables shell script
  * jancy: update: on 64-bit there are no divdi3/moddi3
  * jancy: add mappings for divdi3/udivdi3/moddi3/umoddi3
  * cmake: bugfix: generated files in cmake/latest had TARGET_CPU already
    substituted, need to use @ONLY
  * debug trace in PaintLineRange
  * sitara transfer plugin
  * bugfix: serial session port-open did not use current values of
    Baud and FlowControl combos
  * crc16
  * typo in CMakeLists.txt
  * bugfix: filteransmitpage -- m_progressDlg was not nullified
    (caused a crash)
  * git: remove set-variables.template, remove set-variables from gitignore
  * git: remove cmake/latest/*.* from history
  * git: typo in gitignore
  * cmake: generated cmake files from the latest build are placed in
    cmake/latest
  * cmake:sh: cmake and build shell script updates for linux
  * cmake: sh: major refactoring of cmake and shell scripts
  * linux fixes
  * cmake: updates for linux
  * axl: libusb support

...............................................................................

version 3.1.1 (2014-08-28)

  * fold record-related bugfixes: bindata config was not passed and
    follow-up foldrecord line indices were not re-indexed properly
  * log file save / load works now (before there were access issues)
  * remove io::EFileFlag_ReadOnly from record file open -- otherwise
    cannot fold
  * add line feed \n to record, index node and merge point
    signatures
  * axl: shared memory transport: add line feed \n to message signature
  * tmp-log-file command line switch -- adds
    io::EFileFlag_DeleteOnClose when opening log file
  * axl: shared memory transport uses io::EFileFlag_DeleteOnClose when
    creating transport file
  * axl: add FILE_SHARE_DELETE flag to file open flags -- important when
    using io::EFileFlag_DeleteOnClose
  * bugfix: not all the property grid calls were properly tunneled
  * jancy: always create alloca in entry block
  * otherwise it causes crash due to garbled address of __chkstk on windows 8
  * actually, it's an LLVM bug (incorrect sign-extension of address during
    lowering -- most likely they store address in 'int'), but the easy
    workaround turns out to be simply move allocas to entry block
  * bulldozer: version info, cmdline parsing via axl facilities
  * udp session: save last port in combo box history
  * git: remove set-variables.bat from history
  * jancy: bugfix: atoi was declared incorrectly
  * sh: to avoid confusion, renamed 'build' folders to 'sh' -- 'build' is
    commonly used as build location (='prj' in our case)
  * one week worth of refactoring

...............................................................................

version 3.1.0 (2014-08-15)

  initial public release of IO Ninja 3 (accumulation of 3.0.x improvements)

  * showing error message when trying to install 32-Bit and 64-Bit versions at
    the same time
  * axl: bugfix: incorrect cast in return from -1
  * include tag suffix and cpu suffix in version string
  * axl: dword_t -> size_t (otherwise it's very error-prone on win64)
  * version info resources
  * visualizing state about linked or layered sessions through MDI
    tab icons
  * copying redistributables from the folder named after TARGET_CPU
    specified in set-variables.bat

...............................................................................

version 3.0.21 (2014-08-13)

  * added null-ptr checks to keyboard handlers (crashed on empty
    log)
  * removed old stdin-stdout transport (use shared memory transport)
  * use stdin in ioninja-server to control life time (once stdin is
    disconnected, terminate ioninja-server process)
  * remove m_menuAction from Document (not really necessary)
  * each session has its own menu (before menu items from different
    sesssion accumulated in stdMenu (SessionMenu))
  * added icon for the executable on windows
  * document didn't remove widget from status bar on deactivation
  * cmake: copy_qt_dll_files incorrectly created Debug or Release file
    (instead of the directory) which, in turn, prevented subsequent builds
  * jancy: on MSVC it is illegal to create zero-length array, so CApiBaseT was
    adjusted
  * bugfix: scroll buttons in MDI's tab bar displayed transparent
  * changed it to white background with a solid border matching rest of the
    tabs
  * a couple of gcc warning-related fixes
  * bulldozer: a couple of gcc warning-related fixes
  * compiles and runs on linux-x86_64 -- finally
  * jancy: x86_64 System V ABI support
  * cmake: gcc setting for no-invalid-offsetof warning
  * jancy: gcc tail-padding issue workaround
  * axl: shared memory transport for POSIX
  * shrinking tabs in MDI's tab bar as much as possible before
    showing scroll buttons
  * 64-bit installer
  * 64-bit installer can be run by setting TARGET_CPU flag in set-variables.bat
    to 'amd64'
  * minor bugfixes in jancy files
  * tests for running ioninja-server on all official plugins
  * -x switch for passing plugin project file instead of full list of
    jancy source files
  * axl: CParserT::ParseFile
  * axl: CString 'operator +' for utf32_t (was missing)
  * axl: CMapping and CSimpleMappedFile updates
  * bugfix: struct LineAttr was incorrectly declared (layout
    inconsistency ninja scroll C++ vs jancy)
  * jancy: bugfix: incorrect struct aligned size calculation
  * jancy: remove SRet attribute from Microsoft x64 calling convention (LLVM
    JIT crashes if sret is present)
  * remove compile warnings
  * jancy: bugfixes re amd64
  * jancy: bugfix: calling convention was not properly assigned to user
    functions
  * jancy: thiscall support
  * default calling convention for methods is still cdecl (unless explicitly
    specified as 'thiscall')
  * axl: rtl::CAutoPtrArrayT
  * jancy: Microsoft x64 calling convention implemented. IO Ninja runs under
    amd64
  * copy QT dlls
  * cmake: copy QT dlls for ioninja and JncQtTest
  * bugfixes: uint_t -> size_t (important on amd64)
  * cmake: macro for copying QT dlls -- important when 2 builds of QT (both
    x86 & amd64) present on a computer
  * axl: bugfix: register format should be uintptr_t, not uint_t
  * jancy: bugfix: formatting literal for char array reference

...............................................................................

version 3.0.19 (2014-07-28)

  * replace app-srv communications via stdin/stdout with shared
    memory transport, results in dramatic performance improvement under
    windows
  * axl: shared memory transport
  * simple mapped file
  * cross-platform mapping object
  * forgot to uncomment subsystem linker pragma
  * save log as text progress dialog, start session by specifying
    either session name, or session plugin path
  * jancy: when adding methods to a class, no need to overwrite tags (Parser
    should do it)
  * wrong QT file filter (extensions should be space-separated)
  * StatusBar.m_pane should be a const property
  * jancy: function tagging critucal temp-fix (operator-new -> operator_new)
  * show line/col/offset status panes for log documents
  * different cache page size defaults
  * cache process cancellation
  * find progress, find completion notifications
  * find dialog progress bar & cancellation support

...............................................................................

version 3.0.18 (2014-07-18)

  * bugfix: installer did not find correct files for updating WinPcap
    and Serial Monitor

...............................................................................

version 3.0.17 (2014-07-17)

  * re-engineer action UI in all sessions: replace pairs of action
    (like Open/Close, Connect/Disconnect etc) with single action with toggled
    semantic
  * added 2 properties to gui.Action: m_text & m_icon

...............................................................................

version 3.0.16 (2014-07-16)

  * mark inactive MDI tabs which have unseen log records
  * status panes for the rest of plugins (file, pipe listener, serial
    monitor, network sniffer, tcp listener, tcp proxy udp socket)
  * status panes for Serial plugin
  * jancy: reactor starter should also bind to bind-sites in skipped branches
    of operators &&, ||, ?
  * currently, && and || are replaced with full-circuit evaluation via bitwise
    & and |
  * obviously, this is not a 100% clean solution
  * in the future on potentially skipped bind-sites should be flagged (if
    skipped in starter, then delay-bind)
  * jancy: bugfix: reactors potentially stored invalid event pointer in
    bindsite
  * status panes for SSH Channel plugin
  * status panes for Listener Socket plugin
  * status bar API
  * status panes for Connection Socket plugin
  * jancy: bugfix: static fields/variables with initializers were checked
    incorrectly
  * jancy: static field initialization
  * find dialog Cancel button connection
  * make a compilation-time define for choosing whether or not to
    show cache miss using different background color
  * NetworkSniffer Session: apply capture filter when pcap is open
  * improvemnts in copy from log (use the application/njs-bin) format
    in addition to text
  * edit commands support for HexEditWidget
  * Copy Bin as Jancy: Hex-literal command
  * improvements in paste operation in hex editor
  * copy/paste in hex editor
  * registry formats support (hex editor should copy both textual
    representation, which depends on cursor pos AND the actual binary data)
  * save log as text fixes:
  * \r\n on windows
  * keep IsTimestampVisible setting
  * keep IsIconVisible setting
  * keep IsOffsetVisible setting
  * different background for hexedit hex and ascii panes
  * read only mode for hex edit
  * new logo hexedit -- always have 1 line
  * even when there is no data
  * linux fixes
  * build scripts: mkdir --> mkdir -p
  * sniffer session: incorrect replace (new io.PCapDeviceDescList -->
  * io.createPCapDeviceDescList)
  * io_Socket updates re disconnect event
  * io_SocketAddress compatibility fixes

...............................................................................

version 3.0.15 (2014-07-02)

  * sign binaries (including installer MSI)
  * jancy: change default throw conditions: retval < 0 for signed integers
  * retval == -1 for unsigned integers
  * update scripts as they don't need explicit cast literal->char
    const* in conditional expressions
  * jancy: array ref -> data ptr conversion is not performed by default
    anymore, instead, now it's an optional flag to PrepareOperand and
    PrepareOperandType. adjust GetConditionalOperatorResult: works for literals
    and keeps references if true and false types match

...............................................................................

version 3.0.14 (2014-07-02)

  * TCP close kind property, TCP disconnect kind flags in
    SocketEvents, added 'from' information to Connect log record, added
    'close-kind' and 'initiator' information to Disconnect log record

...............................................................................

version 3.0.13 (2014-07-01)

  * msi installer now includes qico.dll -- turns out QT needs a plugin for
    .ico support
  * remove record size limit to decide whether to buffer or not (it
    causes empty "stripes"). instead, always buffer during incremental update
    (non-rebuild). also, enforce check for missing parts in cache mgr (instead
    of assert)
  * don't report disconnect if GetIncomingDataSize () is zero --
    there is a race with the main thread, so 0 is actually normal
  * jancy: bitwise & operator yields fenum if one of the operands is fenum

...............................................................................

version 3.0.11 (2014-06-23)

  * jancy: replace no_specifier -> wo_specifier in *.llk files
  * bulldozer: generation of "clean" EBNF presentation of input grammar
  * all the plugins now create opaque classes with 'new operator'
    (instead of 'createXxx' functions)
  * jancy: operator new for opaque classes
  * small bugfixes after linux port
  * api.conf and plugins.conf are made platform-dependent
  * sh: update set-variables.template for linux
  * git: remove set-variables from git history
  * git: update gitignore to include build/linux/set-variables
  * bugfixes: sockets, SSH
  * posix socket used incorrect error code for asynchronous connect
  * SSH channel was reporting incorrect event after TCP connect completed
  * include --debug flag for ioninja-server process on linux if NDEBUG flag
    is not set
  * sh: build scripts for linux
  * axl: remove ui_mainwindow.h
  * bugfixes: linux version is now functional
  * axl:gcc-compliance: project compiles on linux
  * jancy: bugfix: tmp gc roots were unconditionally nullified
  * nullify gc-root happened post-statement regardless of whether the block
  * is reachable or not. this caused an abort in MCJIT cause code was
  * injected past basic-block terminator (return statement). the solution is
  * to only nullify tmp gc rool list if the block is reachable
  * bugfix: installer did not overwrite all files when used in repair
    mode
  * bugfix: installer did not configure paths.conf due to missing
    rights
  * using a deferred custom action for gaining elevated rights. Must also use a
    further custom action for setting custom data for the deferred custom
    action
  * bugfix: corner button displayed too small

...............................................................................

version 3.0.11 (2014-06-12)

  * new icon resources
  * bugfix: bin text map was calculated incorrectly if the data
    block ended in-between multi-unit code point..
  * bugfix: bin text map for the lines terminated with '\n'
  * typo in SnifferLog_Ip.jnc
  * document activate/deactivate improvements: use
    mdiArea->activeSubWindow instead of event argument
  * save current transmit page
  * removed merged record count tracking from index mgr (not
    releavant)
  * bugfixes: hiding messages did not properly work before. remove
    binary record count, merged record count and foldable record count from
    index leaf (not really relevant)
  * instead add hidden record count (important for caching). binary and
    foldable record count must still be tracked in index mgr (to determine
    whether changing bin-data-config should finalize the current leaf or not)
  * bugfix: serial log filter used incorrect flag variable for status
    line change check
  * bugfix: CIndexMgr incorrectly determined whether the first part
    was merged or not (relied on PartIdx, which gets reset every time parts are
    not merged). replace it with IsFirstPart flag
  * packet template editor dialog -- remove icon from the caption
  * bugfix: io::CSerial should force-set settings after open
    (otherwise baudRate, flowControl and other properties get out-of-sync, and,
    more importantly, read interval might be invalid (serial.read might wait
    for the whole buffer to fill)
  * bugfixes: SSH & TCP connection should close socket when remote
    side closes connection (otherwise there is a possible syncId mix up with
    SocketAddressResolver)
  * replace ProgressDlg and QFileDlg members with pointers -- this
    way plugin startup dialog for the documents shows up faster and response
    better (most likely, QFileDlg constructors initiates some jobs in
    background?)
  * bulldozer: lookahead statement syntax change

...............................................................................

version 3.0.10 (2014-06-09)

  * file transmit is functional
  * resources update by leo: plugin icons, file icons, installer splash &
    banner

...............................................................................

version 3.0.9 (2014-06-03)

  * bugfix: unexpected mdi tab switch after transmit pane tab switch
    (findNextPrevChild issue)
  * bring back file transmit page
  * proxy session icon
  * improvements of focus handling (set focus to contents of tab
    widget on current tab change)
  * small icons for drop down menus / tabs
  * big icons update from leo
  * small icons
  * new icons
  * log widget, terminal widget & hex edit widget now provide events for
    handling cursor pos change
  * ioninja main window displays line, col, offset, range in status bar
  * bugfix: incremental find should be reset when lines are not
    merged
  * basic find functionality is implemented (no
    case-insensitive/whole-words yet)
  * MRU list implemented
  * save-log-as-text is functional
  * log widget keyboard handling fixes
  * new layer dialog brought to consistency (vs new session dialog style)
  * log copy/save-bin-to-file is functional
  * corrected edit button title in binary transmit settings
  * cache processing prototypes (find, copy, copy-bin-as,
    save-bin-as-file, save-log-as-text)
  * plugin groups
  * remove CCopyMgr, CFindMgr -- they will be part of CLogWidget
  * add dropdown for New Layer toolbar command
  * bugfix: MDI area's tab bar and sub window was drawn too far to the
    right
  * implemented group functionality for New Session dialog's list
    view (including test groups)
  * displaying corner button in packet template property grid over
    header
  * bugfix: shortcut for 'New Session' action didn't work
  * modified MDI tab close icons
  * bugfix: MDI area's tab bar was drawn to far to the right
  * made selected MDI tab and MDI pane look connected by removing tab
    border
  * revert back TX & RX codes (not really important -- just so it
    matches with previously saved logs)
  * major update of logging engine
  * fold flags are now stored in record file rather than index file -- this
    allows for persistency of fold state across log file rebuilds/reopens
  * record code no longer needs to have mergeable flags: parts are what's
    merged, not records
  * instead of log filter which generates secondary log we now have 2 options:
    1) simple filter just hides unwanted messages (using fold flag field) and
    does NOT generate secondary log and 2) converter, which does generate
    secondary log. when only simple filter is attached, fold state persist
    across log file rebuilds
  * bugfix: 'New Session' action in menu also contained drop down list
  * separated 'New Session' action in two actions one containing drop down list
    used in toolbar and one without used in standard menu
  * drop down list in New Session action with list of all session
    providers
  * using rectangular MDI tabs with custom close icon
  * jancy: bugfix: COperatorMgr::GetArgCastKind didn't take default arguments
    into account
  * added corner button to packet template property grid
  * displaying Packet Template Editor when clicked
  * qtpropertybrowser: Added method for access to tree widget
  * bugfix: Packet Template Editor wasn't centered relative to the
    settings dialog
  * displaying message in About dialog when update check failed
  * corrected name in About dialog's team info label

...............................................................................

version 3.0.8 (2014-05-22)

  * bugfix: corner button not positioned correctly in terminal widget
  * this was due to sizeHint() being called after updatePos() resulting in an
    incorrect corner button size
  * UI/API prototype for copy/find
  * save/load log is functional
  * ClearCache -> Rebuild (cause it's not just clear cache but also
    clear index)
  * clear part buffer after UpdateIndex (cause subsequent SetBinDataConfig
    might re-send what's left in the buffer)
  * set representer guid on log server create
  * axl: TGuid::Parse
  * added readme and license files to installer resources
  * bugfix: installer couldn't be built because of old reference to
    session-providers.conf instead of plugins.conf
  * save -> save session, save session as, save log as
  * save log implemented
  * forgot to uncomment subsystem/entry pragma in main.cpp
  * refactoring of license management UI
  * animated label widget with team info in AboutDlg
  * AniLabelWidget (for running line on team info)
  * implemented license registration and activation (server-side response
    handling not implemented yet)
  * listener is now a function* rather than class* -- this allows
    easy scheduling (we normally want to invoke listener in main thread)
  * listener sensitivity check (live-records-only vs all-records)
  * jancy: instead of marking as gc-collectible, add a tmp gc-root for every
    heap-new (marking as gc-collectible still does not invoke gcEnter/gcLeave
    if no roots are found). besides, gc-roots are still necessary for temporary
    closure objects
  * jancy: mark every function invoking gcAllocate as gc-collectible
  * jancy: scheduler had 'safe' modifier in function pointer argument --
    better take it out (not that necessary, and developers (me included) will
    constantly bump into 'override signature mismatch'
  * transmit history maintans 2 current blocks (text & binary)
  * changing tabs in setting dlg also changes to the corresponding tab in
    document/transmit widget
  * bugfix: fold record did not adjust cache page state line idx
  * bugfix: if fold record line count delta is non-null, invalidation should
    range all the way to the bottom
  * bugfix: foldable records calculated line count incorrectly (did
    not nullify m_pCurrentFoldableRecord)
  * sniffer interface list now includes IP address and excludes
    device name (which is real ugly)
  * generic file session: distinguish between file stream kinds (disk
    files, pipes, serial devices)
  * allow writing past EOF for disk files
  * add clear function for disk files
  * New Layer action is placed in File Menu and main-toolbar
  * document-specific actions are disabled if there is no active document
  * xmodem receive is functional
  * xmodem transmit is functional
  * gui.FileDlg, gui.ProgressDlg, io.MappedFile
  * Link Sessions functionality is now accessible via Setting Dialog
    rather than session tab context menu
  * filtering layers are functional (PPP sample)
  * *.njssp -> *.njplg
  * jancy: bugfix: POD*->void* should always be implicit
  * bugfix: pointer difference for void* caused division-by-zero
  * jancy: bugfix: static new class variables were primed twice, writing data
    out of allocated range
  * jancy: bugfix: pointer difference operator did not work
  * properties for plugins are grouped
  * already-added layer plugins are disabled
  * adding layers feature is functional!
  * ioninja-server compiles and jits additional layers
  * jancy: CModule - CRuntime pair redesign (move LlvmExecutionEngine to
    CModule to allow multiple modules to work with the single runtime) -- in
    preparation for incremental compilation & jitting (adding layers in
    ioninja-server)
  * minor design update in AboutDlg check-for-updates
  * setting dlg: rebuild log layout -> rebuild log widget (to
    simplify hiding it completely when m_document == NULL)
  * namespace prefix only for API files
  * plain names for folders (api, sessions, layers)
  * currently there is no reason to have namespace prefixes for the rest of
    plugin files, so as to avoid unnecessary questions i decided to simplify
    everything to a more conventional and less cryptic scheme
  * plugin manamenent cleanup
  * plugin management and api further updates
  * document model update (2 kinds of plugins: sessions and
    protocols)
  * log filtering is functional, serial session provider
    uses filters to show/hide groups of notification messages
  * jancy: bugfix: empty condition in for stmt caused a crash on JIT (compiler
    was creating an invalid basic block graph)
  * bugfix: API function 'io.createSerialPortList' accidentally removed
  * added Device Monitor feature to installer
  * added buttons for adding and removing filters in session settings dialog

...............................................................................

version 3.0.7 (2014-04-26)

  * remove all the serial settings & lines (baud, flowcontrol, dtr,
    rts etc), from io.SerialMon -- instead of 'state' semantics, they should be
    represented by 'event' semantics. bugfix in io.SerialLogRepresenter: status
    line change parts were not merged properly
  * bugfix: incorrect line range update on tail-leaf-update
  * nj_srv should close .conf files when its done reading the
    configuration
  * serial mon plugin logs all the events (using SerialLogRecordCode
    / SerialLogRepresenter for most of the records)
  * jancy: re-fix the previous commits. todo: really clean this shit up
  * jancy: bugfix: the previous commit has broken certain scenarios (e.g when
    unnamed union is half way to the field, union-coord was added twice)
  * jancy: bugfix: resolve import types did not work properly if class had
    import base
  * bugfix: nested unnamed structs & unions did not work correctly in some
    cases (and i suspect still not 100% correct -- double check!)
  * jancy: creating member closures moved from CParser -> COperatorMgr
  * when using qualified name for virtual functions don't lookup vtable (get
    LlvmValue of the parent class)
  * making use of 'io.createSerialPortList' and
    'Document.createSerialPortProperty' in Serial session provider
  * added io.createSerialPortList and Document.createSerialPortProperty to API
  * jancy: allow using basetype in functions other than constructors: as type
    specifiers and as namespaces
  * background change of combo boxes if local port or target address
    changed while listening in TCP Proxy session provider
  * jancy: don't erase unreachable blocks if they were added to function
    (potentially causes assert failures in LLVM: value is used. most likely
    this assert is not relevant: block is used from unreachable block, but
    still)
  * serial mon plugin base functionality (using tdevmon service)
  * axl: legacy packetizer (compatible with previous versions of AXL, and
    tdevmon in particular)
  * background change of local port combo box in UDP session provider
    if port changed during open state
  * added 'gui.ComboBox.m_backgroundColor ' property to API
  * using address resolver for target address in TCP Proxy session
    provider
  * using address resolver for remote address in UDP session
    provider
  * refactored UDP session provider to share same code style as the
    other session providers
  * out of class definitions
  * use of State enum
  * use of ActionId enum
  * cleaned up Serial session provider
  * bugfix: io.CSerial had incorrect order of autoget fields
  * bugfix: io.CSerial did not update autoget fields on serial
    setting change
  * jancy: bugfix: getLastError () did not copy the TError struct (previous
    commit actually had incorrect description: actually it implements host name
    resolver and proper error handling in SSH channel session)
  * jancy: bugfix: getLastError () did not copy the TError struct
  * axl: remove CString::c () (cast to char*)
  * CString::cc () never returns NULL
  * socket address resolver implemented
  * TCP Connection session uses this resolver, allowing specifying address by
    name
  * displaying 'Run IO Ninja 3' checkbox in installer only if color
    depth of screen is 32 bit. this is to avoid that the checkbox otherwise
    overlays the background (alpha bitmap) with its own control background
  * io.Socket properties: m_closeKind, m_isNagleEnabled
  * use these properties in TcpConnection session provider
  * added default packet template file to installer
  * creating default packet templates files if none exists
  * reading and writing packet template file in user's documents
    directory
  * only reloading packet template and clearing hex editor when
    template was modified
  * bugfix: current data in binary transmit widget not always kept when
    swichting sessions
  * bugfix in CHexEditWidget::CalcCursorPos () -- incorrect column
    calculation
  * bugfix: hex editor data wasn't applied to array properties in packet
    template widget

...............................................................................

version 3.0.6 (2014-04-21)

  * loading hex editor data into packet template property widget when
    transmitting
  * bugfix: unlink sessions menu item was not connected properly
  * session linking is implemented
  * serverProcess_readyRead () slot: replace loop with a single readAll () --
    if ioninja-server produces data faster than log widget can update index
    and cache pages, the loop never exits, and requires extra event
    processing (to keep ninja responsive)
  * renamed packet template file (packet_templates.jnc -> packet-templates.jnc)
  * axl: critical bugfix: MappedFile on Windows sometimes failed View ()
    if aligned end-of-view fell behind mapped-size
  * loading proper default values in packet template property widget
  * displaying bit fields with a bit count of 1 as a bool property within
    packet template widget
  * highlighting selected packet template property in hex editor
  * qtpropertybrowser: changed first column's tooltip (property name) with
    property tooltip
  * bugfix: pressing Enter in packet template widget caused the transmit
    action to be triggered
  * bugfix: packet template file not created when trying to edit a new
    template file
  * link sessions menus
  * support for hexadecimal input for bit fields in packet template widget
  * removed signed/unsigned checks in packet template widget
  * warning about errors in packet template editor
  * include part-buffer in update-tail-leaf notification. this
    way log-widget can update its cache without the need of sending
    represnet-request to the log-server
  * indicating if packet templates are available or not in settings
    dialog
  * bugfix: current packet template wasn't selected in settings dialog
  * removed bit count from bit field properties in packet template
    widget
  * renamed "transmit template" to "packet template"
  * optimized mask creation for bit field modifications in packet
    template widget
  * hexedit: highlight on write capability
  * modified echos in installer build script

...............................................................................

version 3.0.5 (2014-04-17)

  * LogSettingPage: disable 'apply-to-all-log' if log widget is NULL
  * prompt for unsaved changes before closing transmit template editor
  * remove main window search loop
  * sticky log (scroll to bottom when vscroll is maxed)
  * scroll-to-bottom corner button in log widget
  * added button for checking for updates in About dialog
  * jancy: restore original order of resolve-orphans and resolve-import types
  * templatetransmitmanager -> templatetransmitmgr
  * jancy: bugfix: DeleteUnreachableBlock caused a dangling pointer write in
    case last current block was unreachable block
  * CModule support for calc-layout without actual compilation
  * bugfix: update check not working correctly
  * cmake: PCH for MSVC is placed in $(Configuration) subfolder
  * jancy: bugfix: ensure 8 bytes for const buffer (GetLlvmConst
    unconditionally reads 8 bytes)

...............................................................................

version 3.0.4 (2014-04-16)

  * catch exceptions in ioninja-server and report them to the application
  * prompt before closing unsaved changes in transmit template editor
  * removal of undesired delimiter above TransmitWidget tab implemented
    transmit templates
  * jancy: bugfix: bit-field offset calculation during CalcLayout
  * isTransmitEnabled property -- to disable 'Send' button when there
    is no connection
  * bugfix: delete all the page requests from the map when the page
    is dropped
  * fold record support in new log engine design
  * SSH channel session: log messages update (merge all the 'connecting'
    messages together, so there are no inter-line delimiters)
  * bugfixes in logging engine
  * index mgr: finalize leaf on mergable record
  * cache mgr: set index tail leaf bin data config
  * bin text line: bin text map calculation and code point decoder state
  * highlight unprintable chars setting
  * axl: bugfix in CCharCodec::LoadState/SaveState
  * bugfixes and updates (mostly re bin-text mode)
  * new log engine design updates
  * major redesign of logging engine and protocol (initial commit)
  * qtpropertybrowser: header column labels can be set via constructor
  * fixed "mismatched component reference" warning when building
    installer
  * sh: build-projects.bat saves and restores current dir (otherwise
    rebuild-all fails to build installer)
  * build and installer scripts cleanup
  * adjusted corner button fade time
  * added "Run IO Ninja" to exit dialog of installer
  * msi installer actions DLL project is generated by CMake and is
    built together with other ioninja binaries
  * formatted batch scripts
  * removed directory "icons" from installer
  * added folder 'redist' to gitignore
  * WIX installer updates
  * generate .rl.cpp & .llk.h in output folder to keep source folder clean
  * WIX installer's build.bat takes a parameter defining base directory for
    files, redistributables and output
  * cmake: version templates for ioninja app and installer
  * initial commit of encoding support in log-plain-text mode
  * WIX installer
  * version automation and build script adjustments still missing

...............................................................................

version 3.0.2 (2014-04-07)

  * session startup dialog update (display errors)
  * remove UTF32->UTF8 conversion in terminal lines (draw UTF32 directly)
  * axl: support for UTF32 drawing in gui::CTextPaint
  * session startup dialog
  * log setting page update
  * all the dialogs tab order fixups
  * log setting page: include showСheckerPattern option + some layout
    modifications
  * checker pattern colorization (to show merged packet boundaries)

...............................................................................

version 3.0.1 (2014-04-02)

  initial internal release of IO Ninja 3
