Make GUIDDAO only set the GUID if the object doesn't have one.
Let TableView pull its model from this.data.model as a last resort.
Add CloningDAO that clones on .select()
Add VersionNoDAO that operates like a SeqNoDAO but always bumps the version number on an object to he next highest value in the DAO.
Add a MergeDAO which applies a pluggable merge strategy when writing an object to the DAO when it already exists there.
Add a generic foam.core.dao.Sync class which will synchronize two DAOs.

DAOs are required to provide versioning of objects so it can easily determine which objects are out of date.  This can generally be added easily with the VersionNoDAO decorator.

A properly configured MergeDAO decorator is recommended to handle conflicts.

The protocol is "stateless" in that all necessary data is already stored in the DAOs, so sync can be resumed and continued at any time so long as the DAOs are accessible.
Add SyncDemo demonstration of the foam.core.dao.Sync protocol.
Add SyncDemo to DemoCat.
Add deleted and clientVersion properties to FOAMGMailMessage in preparation for use with foam.core.dao.Sync.
GMailDAO: Output deleted messages as records with deleted = true.
Update lib/gmail/dao.js to work with foam.core.dao.Sync

Add tracking of clientVersion to GMailMessageDAO
Mark all relevant properties as transient so that the GMailMessageDAO can live in a persistent context to track clientVersion between sessions.  If we find a way to persist this on the server that would be even better.
Make the merge strategy editable in the SyncDemo.
Replace gmail demo with a demo of using foam.core.dao.Sync with the GMail rest dao.
Merge branch 'master' of github.com:foam-framework/foam