diff --git a/.eslintrc.js b/.eslintrc.js
index 631d17a792..f778512ac9 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -42,7 +42,6 @@ module.exports = {
         "EventBridge": false,
         "FaceTracker": false,
         "GlobalServices": false,
-        "GooglePoly": false,
         "Graphics": false,
         "HifiAbout": false,
         "HMD": false,
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5d566d5da2..abe642a329 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -256,12 +256,6 @@ else()
   set(MOBILE 0)
 endif()
 
-set(SCREENSHARE 0)
-if (APPLE AND NOT CLIENT_ONLY)
-  # Don't include Screenshare in OSX client-only builds.
-  set(SCREENSHARE 1)
-endif()
-
 # Use default time server if none defined in environment
 set_from_env(TIMESERVER_URL TIMESERVER_URL "http://timestamp.comodoca.com?td=sha256")
 
@@ -462,10 +456,6 @@ if (BUILD_GPU_FRAME_PLAYER_ONLY)
     add_subdirectory(tools/gpu-frame-player)
 else()
 
-if (SCREENSHARE)
-  add_subdirectory(screenshare)
-endif()
-
 # BUILD_TOOLS option will be handled inside the tools's CMakeLists.txt because 'scribe' tool is required for build anyway
 add_subdirectory(tools)
 
diff --git a/assignment-client/src/avatars/AvatarMixerClientData.cpp b/assignment-client/src/avatars/AvatarMixerClientData.cpp
index 1e9046a2af..a2e8087795 100644
--- a/assignment-client/src/avatars/AvatarMixerClientData.cpp
+++ b/assignment-client/src/avatars/AvatarMixerClientData.cpp
@@ -90,10 +90,7 @@ using std::static_pointer_cast;
 struct FindContainingZone {
     glm::vec3 position;
     bool isInPriorityZone { false };
-    bool isInScreenshareZone { false };
     float priorityZoneVolume { std::numeric_limits<float>::max() };
-    float screenshareZoneVolume { priorityZoneVolume };
-    EntityItemID screenshareZoneid{};
 
     static bool operation(const OctreeElementPointer& element, void* extraData) {
         auto findContainingZone = static_cast<FindContainingZone*>(extraData);
@@ -103,19 +100,12 @@ struct FindContainingZone {
                 if (item->getType() == EntityTypes::Zone && item->contains(findContainingZone->position)) {
                     auto zoneItem = static_pointer_cast<ZoneEntityItem>(item);
                     auto avatarPriorityProperty = zoneItem->getAvatarPriority();
-                    auto screenshareProperty = zoneItem->getScreenshare();
                     float volume = zoneItem->getVolumeEstimate();
                     if (avatarPriorityProperty != COMPONENT_MODE_INHERIT
                         && volume < findContainingZone->priorityZoneVolume) {  // Smaller volume wins
                         findContainingZone->isInPriorityZone = avatarPriorityProperty == COMPONENT_MODE_ENABLED;
                         findContainingZone->priorityZoneVolume = volume;
                     }
-                    if (screenshareProperty != COMPONENT_MODE_INHERIT
-                        && volume < findContainingZone->screenshareZoneVolume) {
-                            findContainingZone->isInScreenshareZone = screenshareProperty == COMPONENT_MODE_ENABLED;
-                            findContainingZone->screenshareZoneVolume = volume;
-                            findContainingZone->screenshareZoneid = zoneItem->getEntityItemID();
-                    }
                 }
             });
             return true;  // Keep recursing
@@ -157,18 +147,6 @@ int AvatarMixerClientData::parseData(ReceivedMessage& message, const WorkerShare
         if (currentlyHasPriority != _avatar->getHasPriority()) {
             _avatar->setHasPriority(currentlyHasPriority);
         }
-        bool isInScreenshareZone = findContainingZone.isInScreenshareZone;
-        if (isInScreenshareZone != _avatar->isInScreenshareZone()
-            || findContainingZone.screenshareZoneid != _avatar->getScreenshareZone()) {
-            _avatar->setInScreenshareZone(isInScreenshareZone);
-            _avatar->setScreenshareZone(findContainingZone.screenshareZoneid);
-            const QUuid& zoneId = isInScreenshareZone ? findContainingZone.screenshareZoneid : QUuid();
-            auto nodeList = DependencyManager::get<NodeList>();
-            auto packet = NLPacket::create(PacketType::AvatarZonePresence, 2 * NUM_BYTES_RFC4122_UUID, true);
-            packet->write(_avatar->getSessionUUID().toRfc4122());
-            packet->write(zoneId.toRfc4122());
-            nodeList->sendPacket(std::move(packet), nodeList->getDomainSockAddr());
-        }
         _avatar->setNeedsHeroCheck(false);
     }
 
diff --git a/assignment-client/src/avatars/MixerAvatar.h b/assignment-client/src/avatars/MixerAvatar.h
index 7b19c53132..e610cf3555 100644
--- a/assignment-client/src/avatars/MixerAvatar.h
+++ b/assignment-client/src/avatars/MixerAvatar.h
@@ -29,16 +29,10 @@ public:
     bool needsIdentityUpdate() const { return _needsIdentityUpdate; }
     void setNeedsIdentityUpdate(bool value = true) { _needsIdentityUpdate = value; }
 
-    bool isInScreenshareZone() const { return _inScreenshareZone; }
-    void setInScreenshareZone(bool value = true) { _inScreenshareZone = value; }
-    const QUuid& getScreenshareZone() const { return _screenshareZone; }
-    void setScreenshareZone(QUuid zone) { _screenshareZone = zone; }
-
 private:
     bool _needsHeroCheck { false };
     bool _needsIdentityUpdate { false };
-    bool _inScreenshareZone { false };
-    QUuid _screenshareZone;
+
 };
 
 using MixerAvatarSharedPointer = std::shared_ptr<MixerAvatar>;
diff --git a/cmake/macros/SetPackagingParameters.cmake b/cmake/macros/SetPackagingParameters.cmake
index 4320522784..2adf65b236 100644
--- a/cmake/macros/SetPackagingParameters.cmake
+++ b/cmake/macros/SetPackagingParameters.cmake
@@ -133,7 +133,6 @@ macro(SET_PACKAGING_PARAMETERS)
 
     set(CONSOLE_INSTALL_DIR       ".")
     set(INTERFACE_INSTALL_DIR     ".")
-    set(SCREENSHARE_INSTALL_DIR   ".")
     set(NITPICK_INSTALL_DIR       ".")
 
     if (CLIENT_ONLY)
@@ -143,27 +142,20 @@ macro(SET_PACKAGING_PARAMETERS)
     endif()
     set(CONSOLE_INSTALL_APP_PATH "${CONSOLE_INSTALL_DIR}/${CONSOLE_EXEC_NAME}")
 
-    set(SCREENSHARE_EXEC_NAME "hifi-screenshare.app")
-    set(SCREENSHARE_INSTALL_APP_PATH "${SCREENSHARE_INSTALL_DIR}/${SCREENSHARE_EXEC_NAME}")
-
     set(CONSOLE_APP_CONTENTS "${CONSOLE_INSTALL_APP_PATH}/Contents")
     set(COMPONENT_APP_PATH "${CONSOLE_APP_CONTENTS}/MacOS/Components.app")
     set(COMPONENT_INSTALL_DIR "${COMPONENT_APP_PATH}/Contents/MacOS")
     set(CONSOLE_PLUGIN_INSTALL_DIR "${COMPONENT_APP_PATH}/Contents/PlugIns")
     
-    set(SCREENSHARE_APP_CONTENTS "${SCREENSHARE_INSTALL_APP_PATH}/Contents")
-
     set(INTERFACE_INSTALL_APP_PATH "${INTERFACE_INSTALL_DIR}/${INTERFACE_BUNDLE_NAME}.app")
     set(INTERFACE_ICON_FILENAME "${INTERFACE_ICON_PREFIX}.icns")
     set(NITPICK_ICON_FILENAME "${NITPICK_ICON_PREFIX}.icns")
   else ()
     if (WIN32)
       set(CONSOLE_INSTALL_DIR "server-console")
-      set(SCREENSHARE_INSTALL_DIR "hifi-screenshare")
       set(NITPICK_INSTALL_DIR "nitpick")
     else ()
       set(CONSOLE_INSTALL_DIR ".")
-      set(SCREENSHARE_INSTALL_DIR ".")
       set(NITPICK_INSTALL_DIR ".")
     endif ()
 
@@ -177,7 +169,6 @@ macro(SET_PACKAGING_PARAMETERS)
     set(NITPICK_ICON_FILENAME "${NITPICK_ICON_PREFIX}.ico")
 
     set(CONSOLE_EXEC_NAME "server-console.exe")
-    set(SCREENSHARE_EXEC_NAME "hifi-screenshare.exe")
 
     set(DS_EXEC_NAME "domain-server.exe")
     set(AC_EXEC_NAME "assignment-client.exe")
diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp
index 5db7bb7f74..988a21c899 100644
--- a/domain-server/src/DomainServer.cpp
+++ b/domain-server/src/DomainServer.cpp
@@ -3813,72 +3813,4 @@ void DomainServer::processAvatarZonePresencePacket(QSharedPointer<ReceivedMessag
         qCWarning(domain_server) << "Ignoring null avatar presence";
         return;
     }
-    static const int SCREENSHARE_EXPIRATION_SECONDS = 24 * 60 * 60;
-    screensharePresence(zoneID.isNull() ? "" : zoneID.toString(), avatarID, SCREENSHARE_EXPIRATION_SECONDS);
-}
-
-void DomainServer::screensharePresence(QString roomname, QUuid avatarID, int expirationSeconds) {
-    if (!DependencyManager::get<AccountManager>()->hasValidAccessToken()) {
-        static std::once_flag presenceAuthorityWarning;
-        std::call_once(presenceAuthorityWarning, [] {
-            qCDebug(domain_server) << "No authority to send screensharePresence.";
-        });
-        return;
-    }
-
-    auto limitedNodeList = DependencyManager::get<LimitedNodeList>();
-    auto matchingNode = limitedNodeList->nodeWithUUID(avatarID);
-    if (!matchingNode) {
-        qCWarning(domain_server) << "Ignoring avatar presence for unknown avatar ID" << avatarID;
-        return;
-    }
-    QString verifiedUsername = matchingNode->getPermissions().getVerifiedUserName();
-    if (verifiedUsername.isEmpty()) { // Silently bail for users who are not logged in.
-        return;
-    }
-
-    JSONCallbackParameters callbackParams;
-    callbackParams.callbackReceiver = this;
-    callbackParams.jsonCallbackMethod = "handleSuccessfulScreensharePresence";
-    callbackParams.errorCallbackMethod = "handleFailedScreensharePresence";
-    // Construct `callbackData`, which is data that will be available to the callback functions.
-    // In this case, the "success" callback needs access to the "roomname" (the zone ID) and the
-    // relevant avatar's UUID.
-    QJsonObject callbackData;
-    callbackData.insert("roomname", roomname);
-    callbackData.insert("avatarID", avatarID.toString());
-    callbackParams.callbackData = callbackData;
-    const QString PATH = "/api/v1/domains/%1/screenshare";
-    QString domain_id = uuidStringWithoutCurlyBraces(getID());
-    QJsonObject json, screenshare;
-    screenshare["username"] = verifiedUsername;
-    screenshare["roomname"] = roomname;
-    if (expirationSeconds > 0) {
-        screenshare["expiration"] = expirationSeconds;
-    }
-    json["screenshare"] = screenshare;
-    DependencyManager::get<AccountManager>()->sendRequest(
-        PATH.arg(domain_id),
-        AccountManagerAuth::Required,
-        QNetworkAccessManager::PostOperation,
-        callbackParams, QJsonDocument(json).toJson()
-        );
-}
-
-void DomainServer::handleSuccessfulScreensharePresence(QNetworkReply* requestReply, QJsonObject callbackData) {
-    QJsonObject jsonObject = QJsonDocument::fromJson(requestReply->readAll()).object();
-    if (jsonObject["status"].toString() != "success") {
-        qCWarning(domain_server) << "screensharePresence api call failed:" << QJsonDocument(jsonObject).toJson(QJsonDocument::Compact);
-        return;
-    }
-
-    // Tell the client that we just authorized to screenshare which zone ID in which they are authorized to screenshare.
-    auto nodeList = DependencyManager::get<LimitedNodeList>();
-    auto packet = NLPacket::create(PacketType::AvatarZonePresence, NUM_BYTES_RFC4122_UUID, true);
-    packet->write(QUuid(callbackData["roomname"].toString()).toRfc4122());
-    nodeList->sendPacket(std::move(packet), *(nodeList->nodeWithUUID(QUuid(callbackData["avatarID"].toString()))));
-}
-
-void DomainServer::handleFailedScreensharePresence(QNetworkReply* requestReply) {
-    qCWarning(domain_server) << "screensharePresence api call failed:" << requestReply->error();
 }
diff --git a/domain-server/src/DomainServer.h b/domain-server/src/DomainServer.h
index 80295b05d1..fd9c89e546 100644
--- a/domain-server/src/DomainServer.h
+++ b/domain-server/src/DomainServer.h
@@ -81,8 +81,6 @@ public:
 
     bool isAssetServerEnabled();
 
-    void screensharePresence(QString roomname, QUuid avatarID, int expiration_seconds = 0);
-
     static bool forceCrashReporting() { return _forceCrashReporting; }
 
 public slots:
@@ -132,9 +130,6 @@ private slots:
     void handleSuccessfulICEServerAddressUpdate(QNetworkReply* requestReply);
     void handleFailedICEServerAddressUpdate(QNetworkReply* requestReply);
 
-    void handleSuccessfulScreensharePresence(QNetworkReply* requestReply, QJsonObject callbackData);
-    void handleFailedScreensharePresence(QNetworkReply* requestReply);
-
     void updateReplicatedNodes();
     void updateDownstreamNodes();
     void updateUpstreamNodes();
diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt
index 04ab3ab948..d6af18b6d2 100644
--- a/interface/CMakeLists.txt
+++ b/interface/CMakeLists.txt
@@ -193,9 +193,6 @@ if (NOT ANDROID)
   add_dependencies(${TARGET_NAME} resources)
 endif()
 
-if (SCREENSHARE)
-  add_dependencies(${TARGET_NAME} screenshare)
-endif()
 
 if (WIN32)
   # These are external plugins, but we need to do the 'add dependency' here so that their
@@ -360,15 +357,6 @@ if (APPLE)
       "${RESOURCES_DEV_DIR}/serverless/redirect.json"
     )
 
-  if (SCREENSHARE)
-    add_custom_command(TARGET ${TARGET_NAME} POST_BUILD
-      # copy screenshare app to the resource folder
-      COMMAND "${CMAKE_COMMAND}" -E copy_directory
-        "${CMAKE_CURRENT_BINARY_DIR}/../screenshare/hifi-screenshare-darwin-x64/hifi-screenshare.app"
-        "${RESOURCES_DEV_DIR}/hifi-screenshare.app"
-      )
-  endif()
-
   if (JSDOC_ENABLED)
     add_custom_command(TARGET ${TARGET_NAME} POST_BUILD
       # copy JSDoc files beside the executable
diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp
index 74a252f473..762c08c394 100644
--- a/interface/src/Application.cpp
+++ b/interface/src/Application.cpp
@@ -86,7 +86,6 @@
 #include <scripting/PlatformInfoScriptingInterface.h>
 #include <scripting/RatesScriptingInterface.h>
 #include <scripting/RenderScriptingInterface.h>
-#include <scripting/ScreenshareScriptingInterface.h>
 #include <scripting/SelectionScriptingInterface.h>
 #include <scripting/SettingsScriptingInterface.h>
 #include <scripting/TestScriptingInterface.h>
@@ -324,7 +323,6 @@ Application::~Application() {
     DependencyManager::destroy<SoundCache>();
     DependencyManager::destroy<OctreeStatsProvider>();
     DependencyManager::destroy<GeometryCache>();
-    DependencyManager::destroy<ScreenshareScriptingInterface>();
 
     if (auto resourceManager = DependencyManager::get<ResourceManager>()) {
         resourceManager->cleanup();
@@ -541,7 +539,6 @@ void Application::registerScriptEngineWithApplicationServices(ScriptManagerPoint
     scriptEngine->registerGlobalObject("AvatarList", DependencyManager::get<AvatarManager>().data());
 
     scriptEngine->registerGlobalObject("Camera", &_myCamera);
-    scriptEngine->registerGlobalObject("Screenshare", DependencyManager::get<ScreenshareScriptingInterface>().data());
 
 #if defined(Q_OS_MAC) || defined(Q_OS_WIN)
     scriptEngine->registerGlobalObject("SpeechRecognizer", DependencyManager::get<SpeechRecognizer>().data());
@@ -644,8 +641,6 @@ void Application::registerScriptEngineWithApplicationServices(ScriptManagerPoint
     scriptEngine->registerGlobalObject("UserActivityLogger", DependencyManager::get<UserActivityLoggerScriptingInterface>().data());
     scriptEngine->registerGlobalObject("Users", DependencyManager::get<UsersScriptingInterface>().data());
 
-    //scriptEngine->registerGlobalObject("GooglePoly", DependencyManager::get<GooglePolyScriptingInterface>().data());
-
     if (auto steamClient = PluginManager::getInstance()->getSteamClientPlugin()) {
         scriptEngine->registerGlobalObject("Steam", new SteamScriptingInterface(scriptManager.get(), steamClient.get()));
     }
diff --git a/interface/src/Application.h b/interface/src/Application.h
index 50064d9b94..941559f265 100644
--- a/interface/src/Application.h
+++ b/interface/src/Application.h
@@ -481,14 +481,14 @@ public slots:
     // Assets
     void addAssetToWorldFromURL(QString url);
     void addAssetToWorldFromURLRequestFinished();
-    void addAssetToWorld(QString filePath, QString zipFile, bool isZip = false, bool isBlocks = false);
+    void addAssetToWorld(QString filePath, QString zipFile, bool isZip = false);
     void addAssetToWorldUnzipFailure(QString filePath);
-    void addAssetToWorldWithNewMapping(QString filePath, QString mapping, int copy, bool isZip = false, bool isBlocks = false);
-    void addAssetToWorldUpload(QString filePath, QString mapping, bool isZip = false, bool isBlocks = false);
-    void addAssetToWorldSetMapping(QString filePath, QString mapping, QString hash, bool isZip = false, bool isBlocks = false);
+    void addAssetToWorldWithNewMapping(QString filePath, QString mapping, int copy, bool isZip = false);
+    void addAssetToWorldUpload(QString filePath, QString mapping, bool isZip = false);
+    void addAssetToWorldSetMapping(QString filePath, QString mapping, QString hash, bool isZip = false);
     void addAssetToWorldAddEntity(QString filePath, QString mapping);
 
-    void handleUnzip(QString sourceFile, QStringList destinationFile, bool autoAdd, bool isZip, bool isBlocks);
+    void handleUnzip(QString sourceFile, QStringList destinationFile, bool autoAdd, bool isZip);
 
     ArchiveDownloadInterface* getFileDownloadInterface() { return _fileDownload; }
 
diff --git a/interface/src/Application_Assets.cpp b/interface/src/Application_Assets.cpp
index 8012ee93a5..d810fc7aee 100644
--- a/interface/src/Application_Assets.cpp
+++ b/interface/src/Application_Assets.cpp
@@ -103,15 +103,6 @@ void Application::addAssetToWorldFromURL(QString url) {
     if (url.contains("filename")) {
         filename = url.section("filename=", 1, 1);  // Filename is in "?filename=" parameter at end of URL.
     }
-    if (url.contains("poly.google.com/downloads")) {
-        filename = url.section('/', -1);
-        if (url.contains("noDownload")) {
-            filename.remove(".zip?noDownload=false");
-        } else {
-            filename.remove(".zip");
-        }
-
-    }
 
     if (!DependencyManager::get<NodeList>()->getThisNodeCanWriteAssets()) {
         QString errorInfo = "You do not have permissions to write to the Asset Server.";
@@ -135,20 +126,9 @@ void Application::addAssetToWorldFromURLRequestFinished() {
     auto result = request->getResult();
 
     QString filename;
-    bool isBlocks = false;
-
     if (url.contains("filename")) {
         filename = url.section("filename=", 1, 1);  // Filename is in "?filename=" parameter at end of URL.
     }
-    if (url.contains("poly.google.com/downloads")) {
-        filename = url.section('/', -1);
-        if (url.contains("noDownload")) {
-            filename.remove(".zip?noDownload=false");
-        } else {
-            filename.remove(".zip");
-        }
-        isBlocks = true;
-    }
 
     if (result == ResourceRequest::Success) {
         QTemporaryDir temporaryDir;
@@ -162,7 +142,7 @@ void Application::addAssetToWorldFromURLRequestFinished() {
                 tempFile.write(request->getData());
                 addAssetToWorldInfoClear(filename);  // Remove message from list; next one added will have a different key.
                 tempFile.close();
-                qApp->getFileDownloadInterface()->runUnzip(downloadPath, url, true, false, isBlocks);
+                qApp->getFileDownloadInterface()->runUnzip(downloadPath, url, true, false);
             } else {
                 QString errorInfo = "Couldn't open temporary file for download";
                 qWarning(interfaceapp) << errorInfo;
@@ -185,11 +165,11 @@ QString filenameFromPath(QString filePath) {
     return filePath.right(filePath.length() - filePath.lastIndexOf("/") - 1);
 }
 
-void Application::addAssetToWorld(QString path, QString zipFile, bool isZip, bool isBlocks) {
+void Application::addAssetToWorld(QString path, QString zipFile, bool isZip) {
     // Automatically upload and add asset to world as an alternative manual process initiated by showAssetServerWidget().
     QString mapping;
     QString filename = filenameFromPath(path);
-    if (isZip || isBlocks) {
+    if (isZip) {
         QString assetName = zipFile.section("/", -1).remove(QRegExp("[.]zip(.*)$"));
         QString assetFolder = path.section("model_repo/", -1);
         mapping = "/" + assetName + "/" + assetFolder;
@@ -207,7 +187,7 @@ void Application::addAssetToWorld(QString path, QString zipFile, bool isZip, boo
 
     addAssetToWorldInfo(filename, "Adding " + mapping.mid(1) + " to the Asset Server.");
 
-    addAssetToWorldWithNewMapping(path, mapping, 0, isZip, isBlocks);
+    addAssetToWorldWithNewMapping(path, mapping, 0, isZip);
 }
 
 void Application::addAssetToWorldUnzipFailure(QString filePath) {
@@ -216,14 +196,14 @@ void Application::addAssetToWorldUnzipFailure(QString filePath) {
     addAssetToWorldError(filename, "Couldn't unzip file " + filename + ".");
 }
 
-void Application::addAssetToWorldWithNewMapping(QString filePath, QString mapping, int copy, bool isZip, bool isBlocks) {
+void Application::addAssetToWorldWithNewMapping(QString filePath, QString mapping, int copy, bool isZip) {
     auto request = DependencyManager::get<AssetClient>()->createGetMappingRequest(mapping);
 
     QObject::connect(request, &GetMappingRequest::finished, this, [=](GetMappingRequest* request) mutable {
         const int MAX_COPY_COUNT = 100;  // Limit number of duplicate assets; recursion guard.
         auto result = request->getError();
         if (result == GetMappingRequest::NotFound) {
-            addAssetToWorldUpload(filePath, mapping, isZip, isBlocks);
+            addAssetToWorldUpload(filePath, mapping, isZip);
         } else if (result != GetMappingRequest::NoError) {
             QString errorInfo = "Could not map asset name: "
                 + mapping.left(mapping.length() - QString::number(copy).length() - 1);
@@ -235,7 +215,7 @@ void Application::addAssetToWorldWithNewMapping(QString filePath, QString mappin
             }
             copy++;
             mapping = mapping.insert(mapping.lastIndexOf("."), "-" + QString::number(copy));
-            addAssetToWorldWithNewMapping(filePath, mapping, copy, isZip, isBlocks);
+            addAssetToWorldWithNewMapping(filePath, mapping, copy, isZip);
         } else {
             QString errorInfo = "Too many copies of asset name: "
                 + mapping.left(mapping.length() - QString::number(copy).length() - 1);
@@ -248,7 +228,7 @@ void Application::addAssetToWorldWithNewMapping(QString filePath, QString mappin
     request->start();
 }
 
-void Application::addAssetToWorldUpload(QString filePath, QString mapping, bool isZip, bool isBlocks) {
+void Application::addAssetToWorldUpload(QString filePath, QString mapping, bool isZip) {
     qInfo(interfaceapp) << "Uploading" << filePath << "to Asset Server as" << mapping;
     auto upload = DependencyManager::get<AssetClient>()->createUpload(filePath);
     QObject::connect(upload, &AssetUpload::finished, this, [=](AssetUpload* upload, const QString& hash) mutable {
@@ -257,7 +237,7 @@ void Application::addAssetToWorldUpload(QString filePath, QString mapping, bool
             qWarning(interfaceapp) << "Error downloading model: " + errorInfo;
             addAssetToWorldError(filenameFromPath(filePath), errorInfo);
         } else {
-            addAssetToWorldSetMapping(filePath, mapping, hash, isZip, isBlocks);
+            addAssetToWorldSetMapping(filePath, mapping, hash, isZip);
         }
 
         // Remove temporary directory created by Clara.io market place download.
@@ -274,7 +254,7 @@ void Application::addAssetToWorldUpload(QString filePath, QString mapping, bool
     upload->start();
 }
 
-void Application::addAssetToWorldSetMapping(QString filePath, QString mapping, QString hash, bool isZip, bool isBlocks) {
+void Application::addAssetToWorldSetMapping(QString filePath, QString mapping, QString hash, bool isZip) {
     auto request = DependencyManager::get<AssetClient>()->createSetMappingRequest(mapping, hash);
     connect(request, &SetMappingRequest::finished, this, [=](SetMappingRequest* request) mutable {
         if (request->getError() != SetMappingRequest::NoError) {
@@ -286,7 +266,7 @@ void Application::addAssetToWorldSetMapping(QString filePath, QString mapping, Q
             if ((filePath.toLower().endsWith(OBJ_EXTENSION) || filePath.toLower().endsWith(FBX_EXTENSION) ||
                  filePath.toLower().endsWith(GLTF_EXTENSION) || filePath.toLower().endsWith(GLB_EXTENSION)) ||
                 ((filePath.toLower().endsWith(JPG_EXTENSION) || filePath.toLower().endsWith(PNG_EXTENSION)) &&
-                ((!isBlocks) && (!isZip)))) {
+                !isZip)) {
                 addAssetToWorldAddEntity(filePath, mapping);
             } else {
                 qCDebug(interfaceapp) << "Zipped contents are not supported entity files";
@@ -340,13 +320,13 @@ void Application::addAssetToWorldAddEntity(QString filePath, QString mapping) {
     }
 }
 
-void Application::handleUnzip(QString zipFile, QStringList unzipFile, bool autoAdd, bool isZip, bool isBlocks) {
+void Application::handleUnzip(QString zipFile, QStringList unzipFile, bool autoAdd, bool isZip) {
     if (autoAdd) {
         if (!unzipFile.isEmpty()) {
             for (int i = 0; i < unzipFile.length(); i++) {
                 if (QFileInfo(unzipFile.at(i)).isFile()) {
                     qCDebug(interfaceapp) << "Preparing file for asset server: " << unzipFile.at(i);
-                    addAssetToWorld(unzipFile.at(i), zipFile, isZip, isBlocks);
+                    addAssetToWorld(unzipFile.at(i), zipFile, isZip);
                 }
             }
         } else {
@@ -503,13 +483,7 @@ bool Application::importSVOFromURL(const QString& urlString) {
 
 bool Application::importFromZIP(const QString& filePath) {
     qDebug() << "A zip file has been dropped in: " << filePath;
-    QUrl empty;
-    // handle Blocks download from Marketplace
-    if (filePath.contains("poly.google.com/downloads")) {
-        addAssetToWorldFromURL(filePath);
-    } else {
-        qApp->getFileDownloadInterface()->runUnzip(filePath, empty, true, true, false);
-    }
+    qApp->getFileDownloadInterface()->runUnzip(filePath, QUrl(), true, true, false);
     return true;
 }
 
@@ -521,6 +495,6 @@ bool Application::importImage(const QString& urlString) {
 #else
     filepath.remove("file://");
 #endif
-    addAssetToWorld(filepath, "", false, false);
+    addAssetToWorld(filepath, "", false);
     return true;
 }
diff --git a/interface/src/Application_Setup.cpp b/interface/src/Application_Setup.cpp
index d17ce5f7db..edd3a8f1b8 100644
--- a/interface/src/Application_Setup.cpp
+++ b/interface/src/Application_Setup.cpp
@@ -44,7 +44,6 @@
 #include <DomainAccountManager.h>
 #include <EntityScriptClient.h>
 #include <EntityScriptServerLogClient.h>
-#include <FadeEffect.h>
 #include <FingerprintUtils.h>
 #include <FramebufferCache.h>
 #include <gl/GLHelpers.h>
@@ -90,11 +89,8 @@
 #include <scripting/AssetMappingsScriptingInterface.h>
 #include <scripting/ControllerScriptingInterface.h>
 #include <scripting/DesktopScriptingInterface.h>
-#include <scripting/GooglePolyScriptingInterface.h>
 #include <scripting/HMDScriptingInterface.h>
 #include <scripting/KeyboardScriptingInterface.h>
-#include <scripting/ScreenshareScriptingInterface.h>
-#include <scripting/SelectionScriptingInterface.h>
 #include <scripting/TestScriptingInterface.h>
 #include <scripting/TTSScriptingInterface.h>
 #include <scripting/WindowScriptingInterface.h>
@@ -423,7 +419,6 @@ bool setupEssentials(const QCommandLineParser& parser, bool runningMarkerExisted
 
     DependencyManager::set<EntityScriptServerLogClient>();
 
-    DependencyManager::set<GooglePolyScriptingInterface>();
     DependencyManager::set<OctreeStatsProvider>(nullptr, qApp->getOcteeSceneStats());
     DependencyManager::set<AvatarBookmarks>();
     DependencyManager::set<LocationBookmarks>();
@@ -433,13 +428,11 @@ bool setupEssentials(const QCommandLineParser& parser, bool runningMarkerExisted
     DependencyManager::set<SelectionScriptingInterface>();
     DependencyManager::set<TTSScriptingInterface>();
 
-    DependencyManager::set<FadeEffect>();
     DependencyManager::set<ResourceRequestObserver>();
     DependencyManager::set<Keyboard>();
     DependencyManager::set<KeyboardScriptingInterface>();
     DependencyManager::set<GrabManager>();
     DependencyManager::set<AvatarPackager>();
-    DependencyManager::set<ScreenshareScriptingInterface>();
     PlatformHelper::setup();
 
     QObject::connect(PlatformHelper::instance(), &PlatformHelper::systemWillWake, [] {
diff --git a/interface/src/Application_UI.cpp b/interface/src/Application_UI.cpp
index 42c16e4a39..04331b61e9 100644
--- a/interface/src/Application_UI.cpp
+++ b/interface/src/Application_UI.cpp
@@ -53,7 +53,6 @@
 #include <scripting/PlatformInfoScriptingInterface.h>
 #include <scripting/RatesScriptingInterface.h>
 #include <scripting/RenderScriptingInterface.h>
-#include <scripting/ScreenshareScriptingInterface.h>
 #include <scripting/SelectionScriptingInterface.h>
 #include <scripting/SettingsScriptingInterface.h>
 #include <scripting/WindowScriptingInterface.h>
@@ -198,7 +197,6 @@ PickRay Application::computePickRay(float x, float y) const {
 }
 
 void Application::setupQmlSurface(QQmlContext* surfaceContext, bool setAdditionalContextProperties) {
-    surfaceContext->setContextProperty("Screenshare", DependencyManager::get<ScreenshareScriptingInterface>().data());
     surfaceContext->setContextProperty("Users", DependencyManager::get<UsersScriptingInterface>().data());
     surfaceContext->setContextProperty("HMD", DependencyManager::get<HMDScriptingInterface>().data());
     surfaceContext->setContextProperty("UserActivityLogger", DependencyManager::get<UserActivityLoggerScriptingInterface>().data());
@@ -838,7 +836,6 @@ void Application::onDesktopRootContextCreated(QQmlContext* surfaceContext) {
     surfaceContext->setContextProperty("Users", DependencyManager::get<UsersScriptingInterface>().data());
 
     surfaceContext->setContextProperty("UserActivityLogger", DependencyManager::get<UserActivityLoggerScriptingInterface>().data());
-    surfaceContext->setContextProperty("Screenshare", DependencyManager::get<ScreenshareScriptingInterface>().data());
     surfaceContext->setContextProperty("Camera", &_myCamera);
 
 #if defined(Q_OS_MAC) || defined(Q_OS_WIN)
diff --git a/interface/src/ArchiveDownloadInterface.cpp b/interface/src/ArchiveDownloadInterface.cpp
index feef1ba9fb..39ddaddc1c 100644
--- a/interface/src/ArchiveDownloadInterface.cpp
+++ b/interface/src/ArchiveDownloadInterface.cpp
@@ -38,7 +38,7 @@ ArchiveDownloadInterface::ArchiveDownloadInterface(QObject* parent) : QObject(pa
     // nothing for now
 }
 
-void ArchiveDownloadInterface::runUnzip(QString path, QUrl url, bool autoAdd, bool isZip, bool isBlocks) {
+void ArchiveDownloadInterface::runUnzip(QString path, QUrl url, bool autoAdd, bool isZip) {
     QString fileName = "/" + path.section("/", -1);
     QString tempDir = path;
     if (!isZip) {
@@ -68,7 +68,7 @@ void ArchiveDownloadInterface::runUnzip(QString path, QUrl url, bool autoAdd, bo
         isZip = false;
     }
 
-    emit unzipResult(path, fileList, autoAdd, isZip, isBlocks);
+    emit unzipResult(path, fileList, autoAdd, isZip);
 
 }
 
diff --git a/interface/src/ArchiveDownloadInterface.h b/interface/src/ArchiveDownloadInterface.h
index a406108c55..2ae45b860b 100644
--- a/interface/src/ArchiveDownloadInterface.h
+++ b/interface/src/ArchiveDownloadInterface.h
@@ -50,27 +50,24 @@ public slots:
      *     unzipResult signal.
      * @param isZip - Set to true if path has a ".zip" extension,
      *     false if it doesn't (but should still be treated as a zip file).
-     * @param isBlocks - Not used by user scripts. The value is simply passed through to the
-     *     unzipResult signal.
      * @example (Old example from JS, needs to be converted)
      * Select and unzip a file.
-     * File.unzipResult.connect(function (zipFile, unzipFiles, autoAdd, isZip, isBlocks) {
+     * File.unzipResult.connect(function (zipFile, unzipFiles, autoAdd, isZip) {
      *     print("File.unzipResult()");
      *     print("- zipFile: " + zipFile);
      *     print("- unzipFiles(" + unzipFiles.length + "): " + unzipFiles);
      *     print("- autoAdd: " + autoAdd);
      *     print("- isZip: " + isZip);
-     *     print("- isBlocks: " + isBlocks);
      * });
      * 
      * var zipFile = Window.browse("Select a Zip File", "", "*.zip");
      * if (zipFile) {
-     *     File.runUnzip(zipFile, "", false, true, false);
+     *     File.runUnzip(zipFile, "", false, true);
      * } else {
      *     print("Zip file not selected.");
      * }
      */
-    void runUnzip(QString path, QUrl url, bool autoAdd, bool isZip, bool isBlocks);
+    void runUnzip(QString path, QUrl url, bool autoAdd, bool isZip);
 
     /**
      * Creates a new, unique directory for temporary use.
@@ -88,9 +85,8 @@ signals:
      * @param autoAdd - The value that runUnzip was called with.
      * @param isZip - true if runUnzip was called with isZip == true,
      *     unless there is no FBX or OBJ file in the unzipped file(s) in which case the value is false.
-     * @param isBlocks - The value that runUnzip was called with.
      */
-    void unzipResult(QString zipFile, QStringList unzipFile, bool autoAdd, bool isZip, bool isBlocks);
+    void unzipResult(QString zipFile, QStringList unzipFile, bool autoAdd, bool isZip);
 
 private:
     bool isTempDir(QString tempDir);
diff --git a/interface/src/scripting/Audio.h b/interface/src/scripting/Audio.h
index 509d5a8fa7..a8778fcc2d 100644
--- a/interface/src/scripting/Audio.h
+++ b/interface/src/scripting/Audio.h
@@ -298,9 +298,9 @@ public:
      * Audio is recorded to snapshots directory specified in settings.
      * @function Audio.startRecording
      * @returns {Uuid} A valid <code>Uuid</code> if the specified file could be opened and audio recording has started, otherwise
-     *     <code>Uuid.NULL</code>.
+     *     <code>Uuid.NONE</code>.
      * @example <caption>Make a 10 second audio recording.</caption>
-     * if (Audio.startRecording() !== Uuid.NULL) {
+     * if (Audio.startRecording() !== Uuid.NONE) {
      *     Script.setTimeout(function () {
      *         Audio.stopRecording();
      *         print("Audio recording finished.");
diff --git a/interface/src/scripting/GooglePolyScriptingInterface.cpp b/interface/src/scripting/GooglePolyScriptingInterface.cpp
deleted file mode 100644
index ba4afaba27..0000000000
--- a/interface/src/scripting/GooglePolyScriptingInterface.cpp
+++ /dev/null
@@ -1,180 +0,0 @@
-//
-//  GooglePolyScriptingInterface.cpp
-//  interface/src/scripting
-//
-//  Created by Elisa Lupin-Jimenez on 12/3/2017.
-//  Copyright 2017 High Fidelity, Inc.
-//
-//  Distributed under the Apache License, Version 2.0.
-//  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
-//
-
-#include "GooglePolyScriptingInterface.h"
-
-#include <QEventLoop>
-#include <QtGlobal>
-#include <QJsonArray>
-#include <QJsonDocument>
-#include <QJsonObject>
-#include <QNetworkAccessManager>
-#include <QNetworkReply>
-#include <QNetworkRequest>
-#include <QString>
-#include <QTime>
-#include <QUrl>
-#include <QRandomGenerator>
-
-#include "ScriptEngineLogging.h"
-
-const QString LIST_POLY_URL = "https://poly.googleapis.com/v1/assets?";
-const QString GET_POLY_URL = "https://poly.googleapis.com/v1/assets/model?";
-
-const QStringList VALID_FORMATS = QStringList() << "BLOCKS" << "FBX" << "GLTF" << "GLTF2" << "OBJ" << "TILT" << "";
-const QStringList VALID_CATEGORIES = QStringList() << "animals" << "architecture" << "art" << "food" <<
-    "nature" << "objects" << "people" << "scenes" << "technology" << "transport" << "";
-
-GooglePolyScriptingInterface::GooglePolyScriptingInterface() {
-    // nothing to be implemented
-}
-
-void GooglePolyScriptingInterface::setAPIKey(const QString& key) {
-    _authCode = key;
-}
-
-QString GooglePolyScriptingInterface::getAssetList(const QString& keyword, const QString& category, const QString& format) {
-    QUrl url = formatURLQuery(keyword, category, format);
-    if (!url.isEmpty()) {
-        QByteArray json = parseJSON(url, 0).toJsonDocument().toJson();
-        return (QString) json;
-    } else {
-        qCDebug(scriptengine) << "Invalid filters were specified.";
-        return "";
-    }
-}
-
-QString GooglePolyScriptingInterface::getFBX(const QString& keyword, const QString& category) {
-    QUrl url = formatURLQuery(keyword, category, "FBX");
-    return getModelURL(url);
-}
-
-QString GooglePolyScriptingInterface::getOBJ(const QString& keyword, const QString& category) {
-    QUrl url = formatURLQuery(keyword, category, "OBJ");
-    return getModelURL(url);
-}
-
-QString GooglePolyScriptingInterface::getBlocks(const QString& keyword, const QString& category) {
-    QUrl url = formatURLQuery(keyword, category, "BLOCKS");
-    return getModelURL(url);
-}
-
-QString GooglePolyScriptingInterface::getGLTF(const QString& keyword, const QString& category) {
-    QUrl url = formatURLQuery(keyword, category, "GLTF");
-    return getModelURL(url);
-}
-
-QString GooglePolyScriptingInterface::getGLTF2(const QString& keyword, const QString& category) {
-    QUrl url = formatURLQuery(keyword, category, "GLTF2");
-    return getModelURL(url);
-}
-
-// This method will not be useful until we support Tilt models
-QString GooglePolyScriptingInterface::getTilt(const QString& keyword, const QString& category) {
-    QUrl url = formatURLQuery(keyword, category, "TILT");
-    return getModelURL(url);
-}
-
-// Can provide asset name or full URL to model
-QString GooglePolyScriptingInterface::getModelInfo(const QString& input) {
-    QString name(input);
-    if (input.contains("poly.googleapis") || input.contains("poly.google.com")) {
-        QStringList list = input.split("/");
-        if (input.contains("poly.googleapis")) {
-            name = list[4];
-        } else {
-            name = list.last();
-        }
-    }
-    QString urlString(GET_POLY_URL);
-    urlString = urlString.replace("model", name) + "key=" + _authCode;
-    qCDebug(scriptengine) << "Google URL request";
-    QUrl url(urlString);
-    QString json = parseJSON(url, 2).toString();
-    return json;
-}
-
-int GooglePolyScriptingInterface::getRandIntInRange(int length) {
-    return QRandomGenerator::global()->bounded(length);
-}
-
-QUrl GooglePolyScriptingInterface::formatURLQuery(const QString& keyword, const QString& category, const QString& format) {
-    QString queries;
-    if (!VALID_FORMATS.contains(format, Qt::CaseInsensitive) || !VALID_CATEGORIES.contains(category, Qt::CaseInsensitive)) {
-        return QUrl("");
-    } else {
-        if (!keyword.isEmpty()) {
-            QString keywords(keyword);
-            keywords.replace(" ", "+");
-            queries.append("&keywords=" + keywords);
-        }
-        if (!category.isEmpty()) {
-            queries.append("&category=" + category);
-        }
-        if (!format.isEmpty()) {
-            queries.append("&format=" + format);
-        }
-        QString urlString(LIST_POLY_URL + "key=" + _authCode + queries);
-        return QUrl(urlString);
-    }
-}
-
-QString GooglePolyScriptingInterface::getModelURL(const QUrl& url) {
-    qCDebug(scriptengine) << "Google URL request";
-    if (!url.isEmpty()) {
-        return parseJSON(url, 1).toString();
-    } else {
-        qCDebug(scriptengine) << "Invalid filters were specified.";
-        return "";
-    }
-}
-
-// FIXME: synchronous
-QByteArray GooglePolyScriptingInterface::getHTTPRequest(const QUrl& url) {
-    QNetworkAccessManager manager;
-    QNetworkReply *response = manager.get(QNetworkRequest(url));
-    QEventLoop event;
-    connect(response, SIGNAL(finished()), &event, SLOT(quit()));
-    event.exec();
-
-    return response->readAll();
-}
-
-// 0 = asset list, 1 = model from asset list, 2 = specific model
-QVariant GooglePolyScriptingInterface::parseJSON(const QUrl& url, int fileType) {
-    QByteArray jsonString = getHTTPRequest(url);
-    QJsonDocument doc = QJsonDocument::fromJson(jsonString);
-    QJsonObject obj = doc.object();
-    if (obj.isEmpty()) {
-        qCDebug(scriptengine) << "Assets with specified filters not found";
-        return "";
-    }
-    if (obj.keys().first() == "error") {
-        QString error = obj.value("error").toObject().value("message").toString();
-        qCDebug(scriptengine) << error;
-        return "";
-    }
-    if (fileType == 0 || fileType == 1) {
-        QJsonArray arr = obj.value("assets").toArray();
-        // return model url
-        if (fileType == 1) {
-            int random = getRandIntInRange(arr.size());
-            QJsonObject json = arr.at(random).toObject();
-            // nested JSONs
-            return json.value("formats").toArray().at(0).toObject().value("root").toObject().value("url");
-        }
-        // return whole asset list
-        return QJsonDocument(arr);
-    // return specific object
-    } else {
-        return jsonString;
-    }
-}
diff --git a/interface/src/scripting/GooglePolyScriptingInterface.h b/interface/src/scripting/GooglePolyScriptingInterface.h
deleted file mode 100644
index 693b07f18e..0000000000
--- a/interface/src/scripting/GooglePolyScriptingInterface.h
+++ /dev/null
@@ -1,116 +0,0 @@
-//
-//  GooglePolyScriptingInterface.h
-//  interface/src/scripting
-//
-//  Created by Elisa Lupin-Jimenez on 12/3/2017.
-//  Copyright 2017 High Fidelity, Inc.
-//
-//  Distributed under the Apache License, Version 2.0.
-//  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
-//
-
-#ifndef hifi_GooglePolyScriptingInterface_h
-#define hifi_GooglePolyScriptingInterface_h
-
-#include <QObject>
-#include <DependencyManager.h>
-
-/*@jsdoc 
- * The GooglePoly API allows you to interact with Google Poly models direct from inside High Fidelity.
- * @namespace GooglePoly
- *
- * @hifi-interface
- * @hifi-client-entity
- * @hifi-avatar
- */
-
-class GooglePolyScriptingInterface : public QObject, public Dependency {
-    Q_OBJECT
-
-public:
-    GooglePolyScriptingInterface();
-
-public slots:
-
-    /*@jsdoc
-     * @function GooglePoly.setAPIKey
-     * @param {string} key
-     */
-    void setAPIKey(const QString& key);
-
-    /*@jsdoc
-     * @function GooglePoly.getAssetList
-     * @param {string} keyword
-     * @param {string} category
-     * @param {string} format
-     * @returns {string}
-     */
-    QString getAssetList(const QString& keyword, const QString& category, const QString& format);
-
-    /*@jsdoc
-     * @function GooglePoly.getFBX
-     * @param {string} keyword
-     * @param {string} category
-     * @returns {string}
-     */
-    QString getFBX(const QString& keyword, const QString& category);
-
-    /*@jsdoc
-     * @function GooglePoly.getOBJ
-     * @param {string} keyword
-     * @param {string} category
-     * @returns {string}
-     */
-    QString getOBJ(const QString& keyword, const QString& category);
-
-    /*@jsdoc
-     * @function GooglePoly.getBlocks
-     * @param {string} keyword
-     * @param {string} category
-     * @returns {string}
-     */
-    QString getBlocks(const QString& keyword, const QString& category);
-
-    /*@jsdoc
-     * @function GooglePoly.getGLTF
-     * @param {string} keyword
-     * @param {string} category
-     * @returns {string}
-     */
-    QString getGLTF(const QString& keyword, const QString& category);
-
-    /*@jsdoc
-     * @function GooglePoly.getGLTF2
-     * @param {string} keyword
-     * @param {string} category
-     * @returns {string}
-     */
-    QString getGLTF2(const QString& keyword, const QString& category);
-
-    /*@jsdoc
-     * @function GooglePoly.getTilt
-     * @param {string} keyword
-     * @param {string} category
-     * @returns {string}
-     */
-    QString getTilt(const QString& keyword, const QString& category);
-
-    /*@jsdoc
-     * @function GooglePoly.getModelInfo
-     * @param {string} input
-     * @returns {string}
-     */
-    QString getModelInfo(const QString& input);
-
-private:
-    QString _authCode;
-
-    QUrl formatURLQuery(const QString& keyword, const QString& category, const QString& format);
-    QString getModelURL(const QUrl& url);
-    QByteArray getHTTPRequest(const QUrl& url);
-    QVariant parseJSON(const QUrl& url, int fileType);
-    int getRandIntInRange(int length);
-
-};
-
-#endif // hifi_GooglePolyScriptingInterface_h
diff --git a/interface/src/scripting/ScreenshareScriptingInterface.cpp b/interface/src/scripting/ScreenshareScriptingInterface.cpp
deleted file mode 100644
index 7a3aac3435..0000000000
--- a/interface/src/scripting/ScreenshareScriptingInterface.cpp
+++ /dev/null
@@ -1,354 +0,0 @@
-//
-//  ScreenshareScriptingInterface.cpp
-//  interface/src/scripting/
-//
-//  Created by Milad Nazeri and Zach Fox on 2019-10-23.
-//  Copyright 2019 High Fidelity, Inc.
-//
-//  Distributed under the Apache License, Version 2.0.
-//  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
-//
-
-#include <QJsonDocument>
-#include <QJsonObject>
-#include <QNetworkAccessManager>
-#include <QThread>
-#include <QUrl>
-
-#include <AccountManager.h>
-#include <AddressManager.h>
-#include <DependencyManager.h>
-#include <NetworkingConstants.h>
-#include <NodeList.h>
-#include <UUID.h>
-
-#include "EntityScriptingInterface.h"
-#include "ScreenshareScriptingInterface.h"
-#include "ExternalResource.h"
-
-static const int SCREENSHARE_INFO_REQUEST_RETRY_TIMEOUT_MS = 300;
-ScreenshareScriptingInterface::ScreenshareScriptingInterface() {
-    auto esi = DependencyManager::get<EntityScriptingInterface>();
-    if (!esi) {
-        return;
-    }
-
-    // This signal/slot connection is used when the screen share local web entity sends an event bridge message. 
-    QObject::connect(esi.data(), &EntityScriptingInterface::webEventReceived, this, &ScreenshareScriptingInterface::onWebEventReceived);
-
-    _requestScreenshareInfoRetryTimer = new QTimer;
-    _requestScreenshareInfoRetryTimer->setSingleShot(true);
-    _requestScreenshareInfoRetryTimer->setInterval(SCREENSHARE_INFO_REQUEST_RETRY_TIMEOUT_MS);
-    connect(_requestScreenshareInfoRetryTimer, &QTimer::timeout, this, &ScreenshareScriptingInterface::requestScreenshareInfo);
-
-    // This packet listener handles the packet containing information about the latest zone ID in which we are allowed to share.
-    auto nodeList = DependencyManager::get<NodeList>();
-    PacketReceiver& packetReceiver = nodeList->getPacketReceiver();
-    packetReceiver.registerListener(PacketType::AvatarZonePresence,
-        PacketReceiver::makeUnsourcedListenerReference<ScreenshareScriptingInterface>(this, &ScreenshareScriptingInterface::processAvatarZonePresencePacketOnClient));
-};
-
-ScreenshareScriptingInterface::~ScreenshareScriptingInterface() {
-    stopScreenshare();
-}
-
-void ScreenshareScriptingInterface::processAvatarZonePresencePacketOnClient(QSharedPointer<ReceivedMessage> message) {
-    QUuid zone = QUuid::fromRfc4122(message->readWithoutCopy(NUM_BYTES_RFC4122_UUID));
-
-    if (zone.isNull()) {
-        qWarning() << "Ignoring avatar zone presence packet that doesn't specify a zone.";
-        return;
-    }
-
-    // Set the last known authorized screenshare zone ID to the zone that the Domain Server just told us about.
-    _lastAuthorizedZoneID = zone;
-
-    // If we had previously started the screenshare process but knew that we weren't going to be authorized to screenshare,
-    // let's continue the screenshare process here.
-    if (_waitingForAuthorization) {
-        requestScreenshareInfo();
-    }
-}
-
-static const int MAX_NUM_SCREENSHARE_INFO_REQUEST_RETRIES = 5;
-void ScreenshareScriptingInterface::requestScreenshareInfo() {
-    // If the screenshare zone that we're currently in (i.e. `startScreenshare()` was called) is different from
-    // the zone in which we are authorized to screenshare...
-    // ...return early here and wait for the DS to send us a packet containing this zone's ID.
-    if (_screenshareZoneID != _lastAuthorizedZoneID) {
-        qDebug() << "Client not yet authorized to screenshare. Waiting for authorization message from domain server...";
-        _waitingForAuthorization = true;
-        return;
-    }
-
-    _waitingForAuthorization = false;
-
-    _requestScreenshareInfoRetries++;
-
-    if (_requestScreenshareInfoRetries >= MAX_NUM_SCREENSHARE_INFO_REQUEST_RETRIES) {
-        qDebug() << "Maximum number of retries for screenshare info exceeded. Screenshare will not function.";
-        return;
-    }
-
-    // Don't continue with any more of this logic if we can't get the `AccountManager` or `AddressManager`.
-    auto accountManager = DependencyManager::get<AccountManager>();
-    if (!accountManager) {
-        return;
-    }
-    auto addressManager = DependencyManager::get<AddressManager>();
-    if (!addressManager) {
-        return;
-    }
-
-    // Construct and send a request to the Metaverse to obtain the information
-    // necessary to start the screen sharing process.
-    // This request requires:
-    //     1. The domain ID of the domain in which the user's avatar is present
-    //     2. User authentication information that is automatically included when `sendRequest()` is passed
-    //         with the `AccountManagerAuth::Required` argument.
-    // Note that this request will only return successfully if the Domain Server has already registered
-    // the user paired with the current domain with the Metaverse.
-    // See `DomainServer::screensharePresence()` for more info about that.
-
-    QString currentDomainID = uuidStringWithoutCurlyBraces(addressManager->getDomainID());
-    QString requestURLPath = "/api/v1/domains/%1/screenshare";
-    JSONCallbackParameters callbackParams;
-    callbackParams.callbackReceiver = this;
-    callbackParams.jsonCallbackMethod = "handleSuccessfulScreenshareInfoGet";
-    callbackParams.errorCallbackMethod = "handleFailedScreenshareInfoGet";
-    accountManager->sendRequest(
-        requestURLPath.arg(currentDomainID),
-        AccountManagerAuth::Required,
-        QNetworkAccessManager::GetOperation,
-        callbackParams
-    );
-}
-
-static const EntityTypes::EntityType LOCAL_SCREENSHARE_WEB_ENTITY_TYPE = EntityTypes::Web;
-static const uint8_t LOCAL_SCREENSHARE_WEB_ENTITY_FPS = 30;
-// This is going to be a good amount of work to make this work dynamically for any screensize.
-// V1 will have only hardcoded values.
-// The `z` value here is dynamic.
-static const glm::vec3 LOCAL_SCREENSHARE_WEB_ENTITY_LOCAL_POSITION(0.0128f, -0.0918f, 0.0f);
-static const glm::vec3 LOCAL_SCREENSHARE_WEB_ENTITY_DIMENSIONS(3.6790f, 2.0990f, 0.0100f);
-static const ExternalResource::Bucket LOCAL_SCREENSHARE_WEB_ENTITY_BUCKET = ExternalResource::Bucket::HF_Content;
-static const QString LOCAL_SCREENSHARE_WEB_ENTITY_PATH = 
-    "Experiences/Releases/usefulUtilities/smartBoard/screenshareViewer/screenshareClient.html";
-static const QString LOCAL_SCREENSHARE_WEB_ENTITY_HOST_TYPE = "local";
-void ScreenshareScriptingInterface::startScreenshare(const QUuid& screenshareZoneID,
-                                                     const QUuid& smartboardEntityID,
-                                                     const bool& isPresenter) {
-    // We must start a new QProcess from the main thread.
-    if (QThread::currentThread() != thread()) {
-        QMetaObject::invokeMethod(this, "startScreenshare", Q_ARG(const QUuid&, screenshareZoneID),
-                                  Q_ARG(const QUuid&, smartboardEntityID), Q_ARG(const bool&, isPresenter));
-        return;
-    }
-
-    // These three private member variables are set now so that they may be used later during asynchronous
-    // callbacks.
-    _screenshareZoneID = screenshareZoneID;
-    _smartboardEntityID = smartboardEntityID;
-    _isPresenter = isPresenter;
-
-    // If we are presenting, and the screenshare process is already running, don't do anything else here.
-    if (_isPresenter && _screenshareProcess && _screenshareProcess->state() != QProcess::NotRunning) {
-        return;
-    }
-
-    // If we're presenting...
-    if (_isPresenter) {
-        // ...make sure we first reset this `std::unique_ptr`.
-        _screenshareProcess.reset(new QProcess(this));
-
-        // Ensure that the screenshare executable exists where we expect it to.
-        // Error out and reset the screen share state machine if the executable doesn't exist.
-        QFileInfo screenshareExecutable(SCREENSHARE_EXE_PATH);
-        if (!screenshareExecutable.exists() || !(screenshareExecutable.isFile() || screenshareExecutable.isBundle())) {
-            qDebug() << "Screenshare executable doesn't exist at" << SCREENSHARE_EXE_PATH;
-            stopScreenshare();
-            emit screenshareError();
-            return;
-        }
-    }
-
-    if (_requestScreenshareInfoRetryTimer && _requestScreenshareInfoRetryTimer->isActive()) {
-        _requestScreenshareInfoRetryTimer->stop();
-    }
-
-    _requestScreenshareInfoRetries = 0;
-    requestScreenshareInfo();
-}
-
-void ScreenshareScriptingInterface::stopScreenshare() {
-    // We can only deal with our Screen Share `QProcess` on the main thread.
-    if (QThread::currentThread() != thread()) {
-        QMetaObject::invokeMethod(this, "stopScreenshare");
-        return;
-    }
-
-    // If the retry timer is active, stop it.
-    if (_requestScreenshareInfoRetryTimer && _requestScreenshareInfoRetryTimer->isActive()) {
-        _requestScreenshareInfoRetryTimer->stop();
-    }
-
-    // If the Screen Share process is running...
-    if (_screenshareProcess && _screenshareProcess->state() != QProcess::NotRunning) {
-        //...terminate it and make sure that scripts know we terminated it by emitting
-        // `screenshareProcessTerminated()`.
-        _screenshareProcess->terminate();
-    }
-
-    // Delete the local web entity if we know about it here.
-    if (!_screenshareViewerLocalWebEntityUUID.isNull()) {
-        auto esi = DependencyManager::get<EntityScriptingInterface>();
-        if (esi) {
-            esi->deleteEntity(_screenshareViewerLocalWebEntityUUID);
-        }
-    }
-
-    // Reset all private member variables related to screen share here.
-    _screenshareViewerLocalWebEntityUUID = "{00000000-0000-0000-0000-000000000000}";
-    _token = "";
-    _projectAPIKey = "";
-    _sessionID = "";
-    _isPresenter = false;
-    _waitingForAuthorization = false;
-}
-
-// Called when the Metaverse returns the information necessary to start/view a screen share.
-void ScreenshareScriptingInterface::handleSuccessfulScreenshareInfoGet(QNetworkReply* reply) {
-    // Read the reply and get it into a format we understand.
-    QString answer = reply->readAll();
-    QByteArray answerByteArray = answer.toUtf8();
-    QJsonDocument answerJSONObject = QJsonDocument::fromJson(answerByteArray);
-
-    // This Metaverse endpoint will always return a status key/value pair of "success" if things went well.
-    QString status = answerJSONObject["status"].toString();
-    if (status != "success") {
-        qDebug() << "Error when retrieving screenshare info via HTTP. Error:" << reply->errorString();
-        stopScreenshare();
-        emit screenshareError();
-        return;
-    }
-
-    // Store the information necessary to start/view a screen share in these private member variables.
-    _token = answerJSONObject["token"].toString();
-    _projectAPIKey = answerJSONObject["projectApiKey"].toString();
-    _sessionID = answerJSONObject["sessionID"].toString();
-
-    // Make sure we have all of the info that we need.
-    if (_token.isEmpty() || _projectAPIKey.isEmpty() || _sessionID.isEmpty()) {
-        qDebug() << "Not all Screen Share information was retrieved from the backend. Stopping...";
-        stopScreenshare();
-        emit screenshareError();
-        return;
-    }
-
-    // If we're presenting:
-    // 1. Build a list of arguments that we're going to pass to the screen share Electron app.
-    // 2. Make sure we connect a signal/slot to know when the user quits the Electron app.
-    // 3. Start the screen share Electron app with the list of args from (1).
-    if (_isPresenter) {
-        QStringList arguments;
-        arguments << " ";
-        arguments << "--token=" + _token << " ";
-        arguments << "--projectAPIKey=" + _projectAPIKey << " ";
-        arguments << "--sessionID=" + _sessionID << " ";
-
-        connect(_screenshareProcess.get(), QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
-            [=](int exitCode, QProcess::ExitStatus exitStatus) {
-                stopScreenshare();
-                emit screenshareProcessTerminated();
-            });
-
-        _screenshareProcess->start(SCREENSHARE_EXE_PATH, arguments);
-    }
-
-    // Make sure we can grab the entity scripting interface. Error out if we can't.
-    auto esi = DependencyManager::get<EntityScriptingInterface>();
-    if (!esi) {
-        stopScreenshare();
-        emit screenshareError();
-        return;
-    }
-
-    // If, for some reason, we already have a record of a screen share local Web entity, delete it.
-    if (!_screenshareViewerLocalWebEntityUUID.isNull()) {
-        esi->deleteEntity(_screenshareViewerLocalWebEntityUUID);
-    }
-
-    // Set up the entity properties associated with the screen share local Web entity.
-    EntityItemProperties localScreenshareWebEntityProps;
-    localScreenshareWebEntityProps.setType(LOCAL_SCREENSHARE_WEB_ENTITY_TYPE);
-    localScreenshareWebEntityProps.setMaxFPS(LOCAL_SCREENSHARE_WEB_ENTITY_FPS);
-    glm::vec3 localPosition(LOCAL_SCREENSHARE_WEB_ENTITY_LOCAL_POSITION);
-    localPosition.z = _localWebEntityZOffset;
-    localScreenshareWebEntityProps.setLocalPosition(localPosition);
-    auto LOCAL_SCREENSHARE_WEB_ENTITY_URL = ExternalResource::getInstance()->getUrl(LOCAL_SCREENSHARE_WEB_ENTITY_BUCKET,
-        LOCAL_SCREENSHARE_WEB_ENTITY_PATH);
-    localScreenshareWebEntityProps.setSourceUrl(LOCAL_SCREENSHARE_WEB_ENTITY_URL);
-    localScreenshareWebEntityProps.setParentID(_smartboardEntityID);
-    localScreenshareWebEntityProps.setDimensions(LOCAL_SCREENSHARE_WEB_ENTITY_DIMENSIONS);
-
-    // The lines below will be used when writing the feature to support scaling the Smartboard entity to any arbitrary size.
-    //EntityPropertyFlags desiredSmartboardProperties;
-    //desiredSmartboardProperties += PROP_POSITION;
-    //desiredSmartboardProperties += PROP_DIMENSIONS;
-    //EntityItemProperties smartboardProps = esi->getEntityProperties(_smartboardEntityID, desiredSmartboardProperties);
-    
-    // Add the screen share local Web entity to Interface's entity tree.
-    // When the Web entity loads the page specified by `LOCAL_SCREENSHARE_WEB_ENTITY_URL`, it will broadcast an Event Bridge
-    // message, which we will consume inside `ScreenshareScriptingInterface::onWebEventReceived()`.
-    _screenshareViewerLocalWebEntityUUID = esi->addEntity(localScreenshareWebEntityProps, LOCAL_SCREENSHARE_WEB_ENTITY_HOST_TYPE);
-}
-
-void ScreenshareScriptingInterface::handleFailedScreenshareInfoGet(QNetworkReply* reply) {
-    if (_requestScreenshareInfoRetries >= MAX_NUM_SCREENSHARE_INFO_REQUEST_RETRIES) {
-        qDebug() << "Failed to get screenshare info via HTTP after" << MAX_NUM_SCREENSHARE_INFO_REQUEST_RETRIES << "retries. Error:" << reply->errorString();
-        stopScreenshare();
-        emit screenshareError();
-        return;
-    }
-
-    _requestScreenshareInfoRetryTimer->start();
-}
-
-// This function will handle _all_ web events received via `EntityScriptingInterface::webEventReceived()`, including
-// those not related to screen sharing.
-void ScreenshareScriptingInterface::onWebEventReceived(const QUuid& entityID, const QVariant& message) {
-    // Bail early if the entity that sent the Web event isn't the one we care about.
-    if (entityID == _screenshareViewerLocalWebEntityUUID) {
-        // Bail early if we can't grab the Entity Scripting Interface.
-        auto esi = DependencyManager::get<EntityScriptingInterface>();
-        if (!esi) {
-            return;
-        }
-
-        // Web events received from the screen share Web JS will always be in stringified JSON format.
-        QByteArray jsonByteArray = QVariant(message).toString().toUtf8();
-        QJsonDocument jsonObject = QJsonDocument::fromJson(jsonByteArray);
-
-        // It should never happen where the screen share Web JS sends a message without the `app` key's value
-        // set to "screenshare".
-        if (jsonObject["app"] != "screenshare") {
-            return;
-        }
-
-        // The screen share Web JS only sends a message with one method: "eventBridgeReady". Handle it here.
-        if (jsonObject["method"] == "eventBridgeReady") {
-            // Stuff a JSON object full of information necessary for the screen share local Web entity
-            // to connect to the screen share session associated with the room in which the user's avatar is standing.
-            QJsonObject responseObject;
-            responseObject.insert("app", "screenshare");
-            responseObject.insert("method", "receiveConnectionInfo");
-            QJsonObject responseObjectData;
-            responseObjectData.insert("token", _token);
-            responseObjectData.insert("projectAPIKey", _projectAPIKey);
-            responseObjectData.insert("sessionID", _sessionID);
-            responseObject.insert("data", responseObjectData);
-
-            esi->emitScriptEvent(_screenshareViewerLocalWebEntityUUID, responseObject.toVariantMap());
-        }
-    }
-}
diff --git a/interface/src/scripting/ScreenshareScriptingInterface.h b/interface/src/scripting/ScreenshareScriptingInterface.h
deleted file mode 100644
index ceb7b1d9fc..0000000000
--- a/interface/src/scripting/ScreenshareScriptingInterface.h
+++ /dev/null
@@ -1,93 +0,0 @@
-//
-//  ScreenshareScriptingInterface.h
-//  interface/src/scripting/
-//
-//  Created by Milad Nazeri and Zach Fox on 2019-10-23.
-//  Copyright 2019 High Fidelity, Inc.
-//
-//  Distributed under the Apache License, Version 2.0.
-//  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
-//
-
-#ifndef hifi_ScreenshareScriptingInterface_h
-#define hifi_ScreenshareScriptingInterface_h
-
-#include <QObject>
-#include <QProcess>
-#include <QtCore/QCoreApplication>
-#include <QNetworkReply>
-#include <QtCore/QSharedPointer>
-
-#include <PathUtils.h>
-#include <ReceivedMessage.h>
-
-class ScreenshareScriptingInterface : public QObject, public Dependency {
-    Q_OBJECT
-    Q_PROPERTY(float localWebEntityZOffset MEMBER _localWebEntityZOffset NOTIFY localWebEntityZOffsetChanged)
-public:
-    ScreenshareScriptingInterface();
-    ~ScreenshareScriptingInterface();
-
-    Q_INVOKABLE void startScreenshare(const QUuid& screenshareZoneID, const QUuid& smartboardEntityID, const bool& isPresenter = false);
-    Q_INVOKABLE void stopScreenshare();
-
-signals:
-    void screenshareError();
-    void screenshareProcessTerminated();
-    void startScreenshareViewer();
-    void localWebEntityZOffsetChanged(const float& newZOffset);
-
-private slots:
-    void processAvatarZonePresencePacketOnClient(QSharedPointer<ReceivedMessage> message);
-    void onWebEventReceived(const QUuid& entityID, const QVariant& message);
-    void handleSuccessfulScreenshareInfoGet(QNetworkReply* reply);
-    void handleFailedScreenshareInfoGet(QNetworkReply* reply);
-
-private:
-#if DEV_BUILD
-#ifdef Q_OS_WIN
-    const QString SCREENSHARE_EXE_PATH{ PathUtils::projectRootPath() + "/screenshare/hifi-screenshare-win32-x64/hifi-screenshare.exe" };
-#elif defined(Q_OS_MAC)
-    const QString SCREENSHARE_EXE_PATH{ QCoreApplication::applicationDirPath() + "/../Resources/hifi-screenshare.app" };
-#else
-    // This path won't exist on other platforms, so the Screenshare Scripting Interface will exit early when invoked.
-    const QString SCREENSHARE_EXE_PATH{ PathUtils::projectRootPath() + "/screenshare/hifi-screenshare-other-os/hifi-screenshare" };
-#endif
-#else
-#ifdef Q_OS_WIN
-    const QString SCREENSHARE_EXE_PATH{ QCoreApplication::applicationDirPath() + "/hifi-screenshare/hifi-screenshare.exe" };
-#elif defined(Q_OS_MAC)
-    const QString SCREENSHARE_EXE_PATH{ QCoreApplication::applicationDirPath() + "/../Resources/hifi-screenshare.app" };
-#else
-    // This path won't exist on other platforms, so the Screenshare Scripting Interface will exit early when invoked.
-    const QString SCREENSHARE_EXE_PATH{ QCoreApplication::applicationDirPath() + "/hifi-screenshare/hifi-screenshare" };
-#endif
-#endif
-
-    QTimer* _requestScreenshareInfoRetryTimer{ nullptr };
-    int _requestScreenshareInfoRetries{ 0 };
-    void requestScreenshareInfo();
-
-    // Empirically determined. The default value here can be changed in Screenshare scripts, which enables faster iteration when we discover
-    // positional issues with various Smartboard entities.
-    // The following four values are closely linked:
-    // 1. The z-offset of whiteboard polylines (`STROKE_FORWARD_OFFSET_M` in `drawSphereClient.js`).
-    // 2. The z-offset of the screenshare local web entity (`LOCAL_WEB_ENTITY_Z_OFFSET` in `smartboardZoneClient.js`).
-    // 3. The z-offset of the screenshare "glass bezel" (`DEFAULT_SMARTBOARD_SCREENSHARE_GLASS_PROPS` in `smartboardZoneClient.js`).
-    // 4. The z-offset of the screenshare "status icon" (handled in the screenshare JSON file).
-    float _localWebEntityZOffset{ 0.0375f };
-
-    std::unique_ptr<QProcess> _screenshareProcess{ nullptr };
-    QUuid _screenshareViewerLocalWebEntityUUID;
-    QString _token{ "" };
-    QString _projectAPIKey{ "" };
-    QString _sessionID{ "" };
-    QUuid _screenshareZoneID;
-    QUuid _smartboardEntityID;
-    bool _isPresenter{ false };
-
-    QUuid _lastAuthorizedZoneID;
-    bool _waitingForAuthorization{ false };
-};
-
-#endif // hifi_ScreenshareScriptingInterface_h
diff --git a/interface/src/ui/overlays/Overlays.h b/interface/src/ui/overlays/Overlays.h
index fcf0c71bc9..c62cb11649 100644
--- a/interface/src/ui/overlays/Overlays.h
+++ b/interface/src/ui/overlays/Overlays.h
@@ -85,7 +85,7 @@ public:
  *
  * @property {Uuid} keyboardFocusOverlay - The <code>{@link Overlays.OverlayProperties-Web3D|"web3d"}</code> overlay
  *     ({@link Entities.EntityProperties-Web|Web} entity) that has keyboard focus. If no overlay (entity) has keyboard focus,
- *     returns <code>null</code>; set to <code>null</code> or {@link Uuid(0)|Uuid.NULL} to clear keyboard focus.
+ *     returns <code>null</code>; set to <code>null</code> or {@link Uuid(0)|Uuid.NONE} to clear keyboard focus.
  */
 
 class Overlays : public QObject {
@@ -125,7 +125,7 @@ public slots:
      * @function Overlays.addOverlay
      * @param {Overlays.OverlayType} type - The type of the overlay to add.
      * @param {Overlays.OverlayProperties} properties - The properties of the overlay to add.
-     * @returns {Uuid} The ID of the newly created overlay if successful, otherwise {@link Uuid(0)|Uuid.NULL}.
+     * @returns {Uuid} The ID of the newly created overlay if successful, otherwise {@link Uuid(0)|Uuid.NONE}.
      * @example <caption>Add a cube overlay in front of your avatar.</caption>
      * var overlay = Overlays.addOverlay("cube", {
      *     position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0, z: -3 })),
@@ -141,7 +141,7 @@ public slots:
      * <p>Note: For cloning behavior of 3D overlays and entities, see {@link Entities.cloneEntity}.</p>
      * @function Overlays.cloneOverlay
      * @param {Uuid} id - The ID of the overlay (or entity) to clone.
-     * @returns {Uuid} The ID of the new overlay (or entity) if successful, otherwise {@link Uuid(0)|Uuid.NULL}.
+     * @returns {Uuid} The ID of the new overlay (or entity) if successful, otherwise {@link Uuid(0)|Uuid.NONE}.
      */
     QUuid cloneOverlay(const QUuid& id);
 
@@ -535,7 +535,7 @@ public slots:
      * @function Overlays.setKeyboardFocusOverlay
      * @param {Uuid} id - The ID of the <code>{@link Overlays.OverlayProperties-Web3D|"web3d"}</code> overlay
      * ({@link Entities.EntityProperties-Web|Web} entity) to set keyboard focus to. Use <code>null</code> or
-     * {@link Uuid(0)|Uuid.NULL} to unset keyboard focus from an overlay (entity).
+     * {@link Uuid(0)|Uuid.NONE} to unset keyboard focus from an overlay (entity).
      */
     void setKeyboardFocusOverlay(const QUuid& id) { DependencyManager::get<EntityScriptingInterface>()->setKeyboardFocusEntity(id); }
 
diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h
index 2e618350a4..c3b6f9b92d 100644
--- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h
+++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h
@@ -443,7 +443,7 @@ public:
     /*@jsdoc
      * Gets the ID of the entity or avatar that the avatar is parented to.
      * @function MyAvatar.getParentID
-     * @returns {Uuid} The ID of the entity or avatar that the avatar is parented to. {@link Uuid(0)|Uuid.NULL} if not parented.
+     * @returns {Uuid} The ID of the entity or avatar that the avatar is parented to. {@link Uuid(0)|Uuid.NONE} if not parented.
      */
     // This calls through to the SpatiallyNestable versions, but is here to expose these to JavaScript.
     Q_INVOKABLE virtual const QUuid getParentID() const override { return SpatiallyNestable::getParentID(); }
@@ -452,7 +452,7 @@ public:
      * Sets the ID of the entity or avatar that the avatar is parented to.
      * @function MyAvatar.setParentID
      * @param {Uuid} parentID - The ID of the entity or avatar that the avatar should be parented to. Set to
-     *    {@link Uuid(0)|Uuid.NULL} to unparent.
+     *    {@link Uuid(0)|Uuid.NONE} to unparent.
      */
     // This calls through to the SpatiallyNestable versions, but is here to expose these to JavaScript.
     Q_INVOKABLE virtual void setParentID(const QUuid& parentID) override;
diff --git a/libraries/avatars-renderer/src/avatars-renderer/ScriptAvatar.h b/libraries/avatars-renderer/src/avatars-renderer/ScriptAvatar.h
index bffd0561ab..906d3d438d 100644
--- a/libraries/avatars-renderer/src/avatars-renderer/ScriptAvatar.h
+++ b/libraries/avatars-renderer/src/avatars-renderer/ScriptAvatar.h
@@ -153,7 +153,7 @@ public slots:
     /*@jsdoc
      * Gets the ID of the entity or avatar that the avatar is parented to.
      * @function ScriptAvatar.getParentID
-     * @returns {Uuid} The ID of the entity or avatar that the avatar is parented to. {@link Uuid(0)|Uuid.NULL} if not parented
+     * @returns {Uuid} The ID of the entity or avatar that the avatar is parented to. {@link Uuid(0)|Uuid.NONE} if not parented
      *     or avatar data aren't available.
      */
     QUuid getParentID() const;
diff --git a/libraries/entities/src/EntityItem.cpp.in b/libraries/entities/src/EntityItem.cpp.in
index aed0b2bcb6..0d3f721c91 100644
--- a/libraries/entities/src/EntityItem.cpp.in
+++ b/libraries/entities/src/EntityItem.cpp.in
@@ -1659,7 +1659,7 @@ void EntityItem::setAngularVelocity(const glm::vec3& value) {
     if (angularVelocity != value) {
         float speed = glm::length(value);
         if (!glm::isnan(speed)) {
-            const float MIN_ANGULAR_SPEED = 0.0002f;
+            const float MIN_ANGULAR_SPEED = 0.00001f;
             const float MAX_ANGULAR_SPEED = 9.0f * TWO_PI; // 1/10 rotation per step at 90Hz
             if (speed < MIN_ANGULAR_SPEED) {
                 angularVelocity = ENTITY_ITEM_ZERO_VEC3;
diff --git a/libraries/entities/src/EntityItemProperties.cpp.in b/libraries/entities/src/EntityItemProperties.cpp.in
index e5d16aaf94..3bc67c71f3 100644
--- a/libraries/entities/src/EntityItemProperties.cpp.in
+++ b/libraries/entities/src/EntityItemProperties.cpp.in
@@ -332,15 +332,6 @@ void EntityItemProperties::setAvatarPriorityFromString(const QString& mode) {
     }
 }
 
-QString EntityItemProperties::getScreenshareAsString() const { return getComponentModeAsString(_screenshare); }
-void EntityItemProperties::setScreenshareFromString(const QString& mode) {
-    auto modeItr = stringToComponentMode.find(mode.toLower());
-    if (modeItr != stringToComponentMode.end()) {
-        _screenshare = modeItr.value();
-        _screenshareChanged = true;
-    }
-}
-
 inline void addTextEffect(QHash<QString, TextEffect>& lookup, TextEffect effect) { lookup[TextEffectHelpers::getNameForTextEffect(effect)] = effect; }
 const QHash<QString, TextEffect> stringToTextEffectLookup = [] {
     QHash<QString, TextEffect> toReturn;
diff --git a/libraries/entities/src/EntityItemProperties.txt b/libraries/entities/src/EntityItemProperties.txt
index 251c9766d1..a375ea75eb 100644
--- a/libraries/entities/src/EntityItemProperties.txt
+++ b/libraries/entities/src/EntityItemProperties.txt
@@ -182,7 +182,6 @@ enum:SKYBOX_MODE prop:skyboxMode type:uint8_t default:(uint8_t)COMPONENT_MODE_IN
 enum:HAZE_MODE prop:hazeMode type:uint8_t default:(uint8_t)COMPONENT_MODE_INHERIT enum,
 enum:BLOOM_MODE prop:bloomMode type:uint8_t default:(uint8_t)COMPONENT_MODE_INHERIT enum,
 enum:AVATAR_PRIORITY prop:avatarPriority type:uint8_t default:(uint8_t)COMPONENT_MODE_INHERIT enum basicProp,
-enum:SCREENSHARE prop:screenshare type:uint8_t default:(uint8_t)COMPONENT_MODE_INHERIT enum basicProp,
 enum:TONEMAPPING_MODE prop:tonemappingMode type:uint8_t default:(uint8_t)COMPONENT_MODE_INHERIT enum,
 enum:AMBIENT_OCCLUSION_MODE prop:ambientOcclusionMode type:uint8_t default:(uint8_t)COMPONENT_MODE_INHERIT enum,
 PolyVox
diff --git a/libraries/entities/src/EntityItemPropertiesDocs.cpp b/libraries/entities/src/EntityItemPropertiesDocs.cpp
index 2e1c0013e3..8f8959165c 100644
--- a/libraries/entities/src/EntityItemPropertiesDocs.cpp
+++ b/libraries/entities/src/EntityItemPropertiesDocs.cpp
@@ -31,8 +31,8 @@
  *     <code>false</code> if it isn't. The value is per the <code>entityHostType</code> property value, set at entity creation
  *     by one of the {@link Entities.addEntity} methods. <em>Read-only.</em>
  *
- * @property {Uuid} owningAvatarID=Uuid.NULL - The session ID of the owning avatar if <code>avatarEntity</code> is
- *     <code>true</code>, otherwise {@link Uuid(0)|Uuid.NULL}. <em>Read-only.</em>
+ * @property {Uuid} owningAvatarID=Uuid.NONE - The session ID of the owning avatar if <code>avatarEntity</code> is
+ *     <code>true</code>, otherwise {@link Uuid(0)|Uuid.NONE}. <em>Read-only.</em>
  *
  * @property {number} created - When the entity was created, expressed as the number of microseconds since
  *     1970-01-01T00:00:00 UTC. <em>Read-only.</em>
@@ -131,8 +131,8 @@
  *     button beside the "script URL" field in properties tab of the Create app works.
  * @property {string} serverScripts="" - The URL of the server entity script, if any, that is attached to the entity.
  *
- * @property {Uuid} parentID=Uuid.NULL - The ID of the entity or avatar that the entity is parented to. A value of
- *     {@link Uuid(0)|Uuid.NULL} is used if the entity is not parented.
+ * @property {Uuid} parentID=Uuid.NONE - The ID of the entity or avatar that the entity is parented to. A value of
+ *     {@link Uuid(0)|Uuid.NONE} is used if the entity is not parented.
  * @property {number} parentJointIndex=65535 - The joint of the entity or avatar that the entity is parented to. Use
  *     <code>65535</code> or <code>-1</code> to parent to the entity or avatar's position and orientation rather than a joint.
  * @property {Vec3} localPosition=0,0,0 - The position of the entity relative to its parent if the entity is parented,
@@ -184,7 +184,7 @@
  *
  * @property {MirrorMode} mirrorMode="none" - If this entity should render as a mirror (reflecting the view of the camera),
  *     a portal (reflecting the view through its <code>portalExitID</code>), or normally.
- * @property {Uuid} portalExitID=Uuid.NULL - The ID of the entity that should act as the portal exit if the <code>mirrorMode</code>
+ * @property {Uuid} portalExitID=Uuid.NONE - The ID of the entity that should act as the portal exit if the <code>mirrorMode</code>
  *     is set to <code>portal</code>.
  *
  * @comment The different entity types have additional properties as follows:
@@ -612,18 +612,18 @@
  *     JPG or PNG format. If no texture is specified the surfaces display white.
  * @property {string} zTextureURL="" - The URL of the texture to map to surfaces perpendicular to the entity's local z-axis.
  *     JPG or PNG format. If no texture is specified the surfaces display white.
- * @property {Uuid} xNNeighborID=Uuid.NULL - The ID of the neighboring PolyVox entity in the entity's -ve local x-axis
- *     direction, if you want them joined. Set to {@link Uuid(0)|Uuid.NULL} if there is none or you don't want to join them.
- * @property {Uuid} yNNeighborID=Uuid.NULL - The ID of the neighboring PolyVox entity in the entity's -ve local y-axis
- *     direction, if you want them joined. Set to {@link Uuid(0)|Uuid.NULL} if there is none or you don't want to join them.
- * @property {Uuid} zNNeighborID=Uuid.NULL - The ID of the neighboring PolyVox entity in the entity's -ve local z-axis
- *     direction, if you want them joined. Set to {@link Uuid(0)|Uuid.NULL} if there is none or you don't want to join them.
- * @property {Uuid} xPNeighborID=Uuid.NULL - The ID of the neighboring PolyVox entity in the entity's +ve local x-axis
- *     direction, if you want them joined. Set to {@link Uuid(0)|Uuid.NULL} if there is none or you don't want to join them.
- * @property {Uuid} yPNeighborID=Uuid.NULL - The ID of the neighboring PolyVox entity in the entity's +ve local y-axis
- *     direction, if you want them joined. Set to {@link Uuid(0)|Uuid.NULL} if there is none or you don't want to join them.
- * @property {Uuid} zPNeighborID=Uuid.NULL - The ID of the neighboring PolyVox entity in the entity's +ve local z-axis
- *     direction, if you want them joined. Set to {@link Uuid(0)|Uuid.NULL} if there is none or you don't want to join them.
+ * @property {Uuid} xNNeighborID=Uuid.NONE - The ID of the neighboring PolyVox entity in the entity's -ve local x-axis
+ *     direction, if you want them joined. Set to {@link Uuid(0)|Uuid.NONE} if there is none or you don't want to join them.
+ * @property {Uuid} yNNeighborID=Uuid.NONE - The ID of the neighboring PolyVox entity in the entity's -ve local y-axis
+ *     direction, if you want them joined. Set to {@link Uuid(0)|Uuid.NONE} if there is none or you don't want to join them.
+ * @property {Uuid} zNNeighborID=Uuid.NONE - The ID of the neighboring PolyVox entity in the entity's -ve local z-axis
+ *     direction, if you want them joined. Set to {@link Uuid(0)|Uuid.NONE} if there is none or you don't want to join them.
+ * @property {Uuid} xPNeighborID=Uuid.NONE - The ID of the neighboring PolyVox entity in the entity's +ve local x-axis
+ *     direction, if you want them joined. Set to {@link Uuid(0)|Uuid.NONE} if there is none or you don't want to join them.
+ * @property {Uuid} yPNeighborID=Uuid.NONE - The ID of the neighboring PolyVox entity in the entity's +ve local y-axis
+ *     direction, if you want them joined. Set to {@link Uuid(0)|Uuid.NONE} if there is none or you don't want to join them.
+ * @property {Uuid} zPNeighborID=Uuid.NONE - The ID of the neighboring PolyVox entity in the entity's +ve local z-axis
+ *     direction, if you want them joined. Set to {@link Uuid(0)|Uuid.NONE} if there is none or you don't want to join them.
  * @example <caption>Create a textured PolyVox sphere.</caption>
  * var position = Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0.5, z: -8 }));
  * var texture = "http://public.highfidelity.com/cozza13/tuscany/Concrete2.jpg";
@@ -915,8 +915,6 @@
  * @property {Entities.AvatarPriorityMode} avatarPriority="inherit" - Configures the priority of updates from avatars in the
  *     zone to other clients.
  *
- * @property {Entities.ScreenshareMode} screenshare="inherit" - Configures a zone for screen-sharing.
- *
  * @example <caption>Create a zone that casts a red key light along the x-axis.</caption>
  * var zone = Entities.addEntity({
  *     type: "Zone",
diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h
index 6fe4a96d75..f916b97367 100644
--- a/libraries/entities/src/EntityScriptingInterface.h
+++ b/libraries/entities/src/EntityScriptingInterface.h
@@ -164,7 +164,7 @@ public:
  * @hifi-assignment-client
  *
  * @property {Uuid} keyboardFocusEntity -  The {@link Entities.EntityProperties-Web|Web} entity that has keyboard focus. If no 
- *     Web entity has keyboard focus, returns <code>null</code>; set to <code>null</code> or {@link Uuid(0)|Uuid.NULL} to clear 
+ *     Web entity has keyboard focus, returns <code>null</code>; set to <code>null</code> or {@link Uuid(0)|Uuid.NONE} to clear
  *     keyboard focus.
  */
 /// handles scripting of Entity commands from JS passed to assigned clients
@@ -323,7 +323,7 @@ public slots:
      * @param {Entities.EntityProperties} properties - The properties of the entity to create.
      * @param {Entities.EntityHostType} [entityHostType="domain"] - The type of entity to create.
      
-     * @returns {Uuid} The ID of the entity if successfully created, otherwise {@link Uuid(0)|Uuid.NULL}.
+     * @returns {Uuid} The ID of the entity if successfully created, otherwise {@link Uuid(0)|Uuid.NONE}.
      * @example <caption>Create a box domain entity in front of your avatar.</caption>
      * var entityID = Entities.addEntity({
      *     type: "Box",
@@ -354,7 +354,7 @@ public slots:
      * @param {Entities.EntityProperties} properties - The properties of the entity to create.
      * @param {boolean} [avatarEntity=false] - <code>true</code> to create an avatar entity, <code>false</code> to create a 
      *     domain entity.
-     * @returns {Uuid} The ID of the entity if successfully created, otherwise {@link Uuid(0)|Uuid.NULL}.
+     * @returns {Uuid} The ID of the entity if successfully created, otherwise {@link Uuid(0)|Uuid.NONE}.
      */
     Q_INVOKABLE QUuid addEntity(const EntityItemProperties& properties, bool avatarEntity = false) {
         entity::HostType entityHostType = avatarEntity ? entity::HostType::AVATAR : entity::HostType::DOMAIN;
@@ -378,7 +378,7 @@ public slots:
      * <code>true</code> in order to be cloned.</p>
      * @function Entities.cloneEntity
      * @param {Uuid} entityID - The ID of the entity to clone.
-     * @returns {Uuid} The ID of the new entity if successfully cloned, otherwise {@link Uuid(0)|Uuid.NULL}.
+     * @returns {Uuid} The ID of the new entity if successfully cloned, otherwise {@link Uuid(0)|Uuid.NONE}.
      */
     Q_INVOKABLE QUuid cloneEntity(const QUuid& entityID);
 
@@ -429,7 +429,7 @@ public slots:
      * @function Entities.editEntity
      * @param {Uuid} entityID - The ID of the entity to edit.
      * @param {Entities.EntityProperties} properties - The new property values.
-     * @returns {Uuid} The ID of the entity if the edit was successful, otherwise <code>null</code> or {@link Uuid|Uuid.NULL}.
+     * @returns {Uuid} The ID of the entity if the edit was successful, otherwise <code>null</code> or {@link Uuid|Uuid.NONE}.
      * @example <caption>Change the color of an entity.</caption>
      * var entityID = Entities.addEntity({
      *     type: "Box",
@@ -1681,7 +1681,7 @@ public slots:
      * }
      *
      * var position = Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 2, z: -5 }));
-     * var root = createEntity("Root", position, Uuid.NULL);
+     * var root = createEntity("Root", position, Uuid.NONE);
      * var child = createEntity("Child", Vec3.sum(position, { x: 0, y: -1, z: 0 }), root);
      * var grandChild = createEntity("Grandchild", Vec3.sum(position, { x: 0, y: -2, z: 0 }), child);
      *
@@ -1713,7 +1713,7 @@ public slots:
      * }
      *
      * var position = Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 2, z: -5 }));
-     * var root = createEntity("Root", position, Uuid.NULL);
+     * var root = createEntity("Root", position, Uuid.NONE);
      * var child = createEntity("Child", Vec3.sum(position, { x: 0, y: -1, z: 0 }), root);
      *
      * Script.setTimeout(function () { // Wait for the entity to be created before editing.
@@ -1749,7 +1749,7 @@ public slots:
      * }
      *
      * var position = Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 2, z: -5 }));
-     * var root = createEntity("Root", position, Uuid.NULL);
+     * var root = createEntity("Root", position, Uuid.NONE);
      * var child = createEntity("Child", Vec3.sum(position, { x: 0, y: -1, z: 0 }), root);
      * var grandChild = createEntity("Grandchild", Vec3.sum(position, { x: 0, y: -2, z: 0 }), child);
      *
@@ -1785,7 +1785,7 @@ public slots:
      * Sets the {@link Entities.EntityProperties-Web|Web} entity that has keyboard focus.
      * @function Entities.setKeyboardFocusEntity
      * @param {Uuid} id - The ID of the {@link Entities.EntityProperties-Web|Web} entity to set keyboard focus to. Use 
-     *     <code>null</code> or {@link Uuid(0)|Uuid.NULL} to unset keyboard focus from an entity.
+     *     <code>null</code> or {@link Uuid(0)|Uuid.NONE} to unset keyboard focus from an entity.
      */
     Q_INVOKABLE void setKeyboardFocusEntity(const QUuid& id);
 
@@ -2017,7 +2017,7 @@ public slots:
      *
      * var position = Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 2, z: -5 }));
      *
-     * var parent = createEntity(position, MyAvatar.orientation, Uuid.NULL);
+     * var parent = createEntity(position, MyAvatar.orientation, Uuid.NONE);
      *
      * var childTranslation = { x: 0, y: -1.5, z: 0 };
      * var childRotation = Quat.fromPitchYawRollDegrees(0, 45, 0);
diff --git a/libraries/entities/src/ZoneEntityItem.cpp.in b/libraries/entities/src/ZoneEntityItem.cpp.in
index e926f678ce..66283ebf45 100644
--- a/libraries/entities/src/ZoneEntityItem.cpp.in
+++ b/libraries/entities/src/ZoneEntityItem.cpp.in
@@ -339,7 +339,7 @@ bool ZoneEntityItem::matchesJSONFilters(const QJsonObject& jsonFilters) const {
 
     // If set match zones of interest to avatar mixer:
     if (jsonFilters.contains(AVATAR_PRIORITY_PROPERTY) && jsonFilters[AVATAR_PRIORITY_PROPERTY].toBool()
-        && (_avatarPriority != COMPONENT_MODE_INHERIT || _screenshare != COMPONENT_MODE_INHERIT)) {
+        && _avatarPriority != COMPONENT_MODE_INHERIT) {
         return true;
     }
 
diff --git a/libraries/networking/src/AddressManager.h b/libraries/networking/src/AddressManager.h
index bbf78157bf..a78f9d7d73 100644
--- a/libraries/networking/src/AddressManager.h
+++ b/libraries/networking/src/AddressManager.h
@@ -49,7 +49,7 @@ const QString GET_PLACE = "/api/v1/places/%1";
  * @hifi-avatar
  * @hifi-assignment-client
  *
- * @property {Uuid} domainID - A UUID uniquely identifying the domain you're visiting. Is {@link Uuid(0)|Uuid.NULL} if you're not
+ * @property {Uuid} domainID - A UUID uniquely identifying the domain you're visiting. Is {@link Uuid(0)|Uuid.NONE} if you're not
  *     connected to the domain or are in a serverless domain.
  *     <em>Read-only.</em>
  * @property {string} hostname - The name of the domain for your current directory services address (e.g., <code>"DomainName"</code>,
@@ -83,7 +83,7 @@ const QString GET_PLACE = "/api/v1/places/%1";
  * @deprecated This API is deprecated and will be removed. Use the {@link location} or {@link Window|Window.location} APIs
  * instead.
  *
- * @property {Uuid} domainID - A UUID uniquely identifying the domain you're visiting. Is {@link Uuid(0)|Uuid.NULL} if you're not
+ * @property {Uuid} domainID - A UUID uniquely identifying the domain you're visiting. Is {@link Uuid(0)|Uuid.NONE} if you're not
  *     connected to the domain or are in a serverless domain.
  *     <em>Read-only.</em>
  * @property {string} hostname - The name of the domain for your current directory services address (e.g., <code>"DomainName"</code>,
@@ -397,7 +397,7 @@ signals:
      * Triggered when a request is made to go to a URL or IP address.
      * @function location.possibleDomainChangeRequired
      * @param {string} domainURL - The URL of the domain.
-     * @param {Uuid} domainID - The UUID of the domain to go to. May be {@link Uuid|Uuid.NULL} if not yet known.
+     * @param {Uuid} domainID - The UUID of the domain to go to. May be {@link Uuid|Uuid.NONE} if not yet known.
      * @returns {Signal}
      */
     // No example because this function isn't typically used in scripts.
diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h
index 923913e896..4b1d6fde03 100644
--- a/libraries/networking/src/udt/PacketHeaders.h
+++ b/libraries/networking/src/udt/PacketHeaders.h
@@ -341,7 +341,8 @@ enum class EntityVersion : PacketVersion {
     ShadowBiasAndDistance,
     TextEntityFonts,
     ScriptServerKinematicMotion,
-    ScreenshareZone,
+    // This was ScreenshareZone, property was dropped.
+    ScreenshareZoneUnused,
     ZoneOcclusion,
     ModelBlendshapes,
     TransparentWeb,
@@ -362,6 +363,7 @@ enum class EntityVersion : PacketVersion {
     ModelLoadPriority,
     PropertyCleanup,
     TextVerticalAlignment,
+    RemoveScreenshare,
 
     // Add new versions above here
     NUM_PACKET_TYPE,
diff --git a/libraries/physics/src/ObjectMotionState.cpp b/libraries/physics/src/ObjectMotionState.cpp
index 5376d296aa..a030b8ec08 100644
--- a/libraries/physics/src/ObjectMotionState.cpp
+++ b/libraries/physics/src/ObjectMotionState.cpp
@@ -23,7 +23,7 @@ const float ACTIVATION_POSITION_DELTA = 0.005f;
 const float ACTIVATION_ALIGNMENT_DOT = 0.99990f;
 const float ACTIVATION_LINEAR_VELOCITY_DELTA = 0.01f;
 const float ACTIVATION_GRAVITY_DELTA = 0.1f;
-const float ACTIVATION_ANGULAR_VELOCITY_DELTA = 0.03f;
+const float ACTIVATION_ANGULAR_VELOCITY_DELTA = 0.0004f;
 
 
 // origin of physics simulation in world-frame
diff --git a/libraries/render-utils/res/fonts/CourierPrime.arfont b/libraries/render-utils/res/fonts/CourierPrime.arfont
index 3396ccfb86..b79c4a16e3 100644
Binary files a/libraries/render-utils/res/fonts/CourierPrime.arfont and b/libraries/render-utils/res/fonts/CourierPrime.arfont differ
diff --git a/libraries/render-utils/res/fonts/InconsolataMedium.arfont b/libraries/render-utils/res/fonts/InconsolataMedium.arfont
index 0b0e3750fe..e5ca26ebf7 100644
Binary files a/libraries/render-utils/res/fonts/InconsolataMedium.arfont and b/libraries/render-utils/res/fonts/InconsolataMedium.arfont differ
diff --git a/libraries/render-utils/res/fonts/Roboto.arfont b/libraries/render-utils/res/fonts/Roboto.arfont
index b93b738e1a..6122590805 100644
Binary files a/libraries/render-utils/res/fonts/Roboto.arfont and b/libraries/render-utils/res/fonts/Roboto.arfont differ
diff --git a/libraries/render-utils/res/fonts/Timeless.arfont b/libraries/render-utils/res/fonts/Timeless.arfont
index 6d2674deeb..a9232139fe 100644
Binary files a/libraries/render-utils/res/fonts/Timeless.arfont and b/libraries/render-utils/res/fonts/Timeless.arfont differ
diff --git a/libraries/script-engine/src/ScriptManagerScriptingInterface.h b/libraries/script-engine/src/ScriptManagerScriptingInterface.h
index d319cd30ae..9fc23de283 100644
--- a/libraries/script-engine/src/ScriptManagerScriptingInterface.h
+++ b/libraries/script-engine/src/ScriptManagerScriptingInterface.h
@@ -435,7 +435,7 @@ public:
      * @param {Uuid} entityID - The ID of the entity running the entity script.
      * @param {string} methodName - The name of the method to call.
      * @param {string[]} [parameters=[]] - The parameters to call the specified method with.
-     * @param {Uuid} [remoteCallerID=Uuid.NULL] - An ID that identifies the caller.
+     * @param {Uuid} [remoteCallerID=Uuid.NONE] - An ID that identifies the caller.
      */
     Q_INVOKABLE void callEntityScriptMethod(const EntityItemID& entityID, const QString& methodName,
                                             const QStringList& params = QStringList(),
@@ -740,7 +740,7 @@ public:
      * @returns {Signal}
      * @example <caption>Get the ID of the entity that a client entity script is running in.</caption>
      * var entityScript = function () {
-     *     this.entityID = Uuid.NULL;
+     *     this.entityID = Uuid.NONE;
      * };
      *
      * Script.entityScriptPreloadFinished.connect(function (entityID) {
diff --git a/libraries/script-engine/src/ScriptUUID.h b/libraries/script-engine/src/ScriptUUID.h
index 921c61428b..b32d3b11a1 100644
--- a/libraries/script-engine/src/ScriptUUID.h
+++ b/libraries/script-engine/src/ScriptUUID.h
@@ -41,7 +41,7 @@
 /// Provides the <code><a href="https://apidocs.overte.org/Uuid.html">Uuid</a></code> scripting interface
 class ScriptUUID : public QObject, protected Scriptable {
     Q_OBJECT
-    Q_PROPERTY(QString NULL READ NULL_UUID CONSTANT) // String for use in scripts.
+    Q_PROPERTY(QString NONE READ getNullUuid CONSTANT) // String for use in scripts.
 
 public slots:
     /*@jsdoc
@@ -100,14 +100,14 @@ public slots:
      * Tests whether a UUID is null.
      * @function Uuid(0).isNull
      * @param {Uuid} id - The UUID to test.
-     * @returns {boolean} <code>true</code> if the UUID equals <code>Uuid.NULL</code> or is <code>null</code>, otherwise 
+     * @returns {boolean} <code>true</code> if the UUID equals <code>Uuid.NONE</code> or is <code>null</code>, otherwise
      *     <code>false</code>.
      * @example <caption>Demonstrate <code>true</code> and <code>false</code> cases.</caption>
      * var uuid; // undefined
      * print(Uuid.isNull(uuid)); // false
      * uuid = Uuid.generate();
      * print(Uuid.isNull(uuid)); // false
-     * uuid = Uuid.NULL;
+     * uuid = Uuid.NONE;
      * print(Uuid.isNull(uuid)); // true
      * uuid = null;
      * print(Uuid.isNull(uuid)); // true
@@ -125,9 +125,9 @@ public slots:
      * print("Generated UUID: " + uuid);    // Generated UUID: {nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn}
      */
     void print(const QString& label, const QUuid& id);
+    QString getNullUuid() const { return NULL_ID; }
 
 private:
-    const QString NULL_UUID() { return NULL_ID; }
     const QString NULL_ID { "{00000000-0000-0000-0000-000000000000}" };
 };
 
diff --git a/libraries/script-engine/src/UsersScriptingInterface.h b/libraries/script-engine/src/UsersScriptingInterface.h
index 76055253ab..026441f5fe 100644
--- a/libraries/script-engine/src/UsersScriptingInterface.h
+++ b/libraries/script-engine/src/UsersScriptingInterface.h
@@ -235,7 +235,7 @@ signals:
      * @param {string} userName - The user name of the client, if the requesting client is an administrator in the domain or 
      *     the <code>sessionID</code> is that of the client, otherwise <code>""</code>.
      * @param {Uuid} machineFingerprint - The machine fingerprint of the client, if the requesting client is an administrator 
-     *     in the domain or the <code>sessionID</code> is that of the client, otherwise {@link Uuid|Uuid.NULL}.
+     *     in the domain or the <code>sessionID</code> is that of the client, otherwise {@link Uuid|Uuid.NONE}.
      * @param {boolean} isAdmin - <code>true</code> if the client is an administrator in the domain, <code>false</code> if not.
      * @returns {Signal}
     */
diff --git a/libraries/shared/src/PhysicsHelpers.h b/libraries/shared/src/PhysicsHelpers.h
index 2e32865fd0..c3c47d1245 100644
--- a/libraries/shared/src/PhysicsHelpers.h
+++ b/libraries/shared/src/PhysicsHelpers.h
@@ -26,7 +26,7 @@ const float PHYSICS_ENGINE_FIXED_SUBSTEP = 1.0f / (float)NUM_SUBSTEPS_PER_SECOND
 const float DYNAMIC_LINEAR_SPEED_THRESHOLD = 0.05f;  // 5 cm/sec
 const float DYNAMIC_ANGULAR_SPEED_THRESHOLD = 0.087266f;  // ~5 deg/sec
 const float KINEMATIC_LINEAR_SPEED_THRESHOLD = 0.001f;  // 1 mm/sec
-const float KINEMATIC_ANGULAR_SPEED_THRESHOLD = 0.008f;  // ~0.5 deg/sec
+const float KINEMATIC_ANGULAR_SPEED_THRESHOLD = 0.0004f;  // ~0.025 deg/sec
 
 // return incremental rotation (Bullet-style) caused by angularVelocity over timeStep
 glm::quat computeBulletRotationStep(const glm::vec3& angularVelocity, float timeStep);
diff --git a/screenshare/.gitignore b/screenshare/.gitignore
deleted file mode 100644
index e978d75d04..0000000000
--- a/screenshare/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-hifi-screenshare-*/
-hifi-screenshare*.zip
-screenshare*.zip
-screenshare-*/
diff --git a/screenshare/CMakeLists.txt b/screenshare/CMakeLists.txt
deleted file mode 100644
index d91d8c50b1..0000000000
--- a/screenshare/CMakeLists.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-set(TARGET_NAME screenshare)
-
-add_custom_target(${TARGET_NAME}-npm-install
-	COMMAND npm install
-	WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
-)
-add_custom_target(${TARGET_NAME}
-	COMMAND npm run packager -- --out ${CMAKE_CURRENT_BINARY_DIR}
-	WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
-	DEPENDS ${TARGET_NAME}-npm-install
-)
-
-set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "screenshare")
-set_target_properties(${TARGET_NAME}-npm-install PROPERTIES FOLDER "hidden/screenshare")
-
-if (WIN32)
-	set(PACKAGED_SCREENSHARE_FOLDER "hifi-screenshare-win32-x64")
-	set(SCREENSHARE_DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/${PACKAGED_SCREENSHARE_FOLDER}")
-	install(
-		DIRECTORY "${SCREENSHARE_DESTINATION}/"
-		DESTINATION ${SCREENSHARE_INSTALL_DIR}
-	)
-
-	set(EXECUTABLE_PATH "${SCREENSHARE_DESTINATION}/${SCREENSHARE_EXEC_NAME}")
-	optional_win_executable_signing()
-endif()
-
-# DO build the Screenshare Electron app when building the `ALL_BUILD` target.
-# DO build the Screenshare Electron app when a user selects "Build Solution" from within Visual Studio.
-set_target_properties(${TARGET_NAME} PROPERTIES EXCLUDE_FROM_ALL FALSE EXCLUDE_FROM_DEFAULT_BUILD FALSE)
-set_target_properties(${TARGET_NAME}-npm-install PROPERTIES EXCLUDE_FROM_ALL FALSE EXCLUDE_FROM_DEFAULT_BUILD FALSE)
diff --git a/screenshare/README.md b/screenshare/README.md
deleted file mode 100644
index 63501dd490..0000000000
--- a/screenshare/README.md
+++ /dev/null
@@ -1,16 +0,0 @@
-# Screen Sharing within High Fidelity
-This Screen Share app, built using Electron, allows for easy desktop screen sharing when used in conjuction with various scripts in the `overte-content` repository.
-
-# Screen Sharing Source Files
-## `packager.js`
-Calling npm run packager will use this file to create the actual Electron `hifi-screenshare` executable.
-It will kick out a folder `hifi-screenshare-<platform>` which contains an executable.
-
-## `src/screenshareApp.js`
-The main process file to configure the electron app.
-
-## `src/screenshareMainProcess.js`
-The render file to display the app's UI.
-
-## `screenshareApp.html`
-The HTML that displays the screen selection UI and the confirmation screen UI.
diff --git a/screenshare/package-lock.json b/screenshare/package-lock.json
deleted file mode 100644
index 94dddfec8c..0000000000
--- a/screenshare/package-lock.json
+++ /dev/null
@@ -1,1950 +0,0 @@
-{
-  "name": "highfidelity_screenshare",
-  "version": "1.0.0",
-  "lockfileVersion": 1,
-  "requires": true,
-  "dependencies": {
-    "@electron/asar": {
-      "version": "3.2.7",
-      "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.7.tgz",
-      "integrity": "sha512-8FaSCAIiZGYFWyjeevPQt+0e9xCK9YmJ2Rjg5SXgdsXon6cRnU0Yxnbe6CvJbQn26baifur2Y2G5EBayRIsjyg==",
-      "dev": true,
-      "requires": {
-        "commander": "^5.0.0",
-        "glob": "^7.1.6",
-        "minimatch": "^3.0.4"
-      }
-    },
-    "@electron/get": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz",
-      "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==",
-      "dev": true,
-      "requires": {
-        "debug": "^4.1.1",
-        "env-paths": "^2.2.0",
-        "fs-extra": "^8.1.0",
-        "global-agent": "^3.0.0",
-        "got": "^11.8.5",
-        "progress": "^2.0.3",
-        "semver": "^6.2.0",
-        "sumchecker": "^3.0.1"
-      },
-      "dependencies": {
-        "fs-extra": {
-          "version": "8.1.0",
-          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
-          "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.2.0",
-            "jsonfile": "^4.0.0",
-            "universalify": "^0.1.0"
-          }
-        },
-        "semver": {
-          "version": "6.3.1",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
-          "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
-          "dev": true
-        }
-      }
-    },
-    "@electron/notarize": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-1.2.4.tgz",
-      "integrity": "sha512-W5GQhJEosFNafewnS28d3bpQ37/s91CDWqxVchHfmv2dQSTWpOzNlUVQwYzC1ay5bChRV/A9BTL68yj0Pa+TSg==",
-      "dev": true,
-      "requires": {
-        "debug": "^4.1.1",
-        "fs-extra": "^9.0.1"
-      },
-      "dependencies": {
-        "fs-extra": {
-          "version": "9.1.0",
-          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
-          "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
-          "dev": true,
-          "requires": {
-            "at-least-node": "^1.0.0",
-            "graceful-fs": "^4.2.0",
-            "jsonfile": "^6.0.1",
-            "universalify": "^2.0.0"
-          }
-        },
-        "jsonfile": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
-          "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.1.6",
-            "universalify": "^2.0.0"
-          }
-        },
-        "universalify": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
-          "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
-          "dev": true
-        }
-      }
-    },
-    "@electron/osx-sign": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.0.5.tgz",
-      "integrity": "sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==",
-      "dev": true,
-      "requires": {
-        "compare-version": "^0.1.2",
-        "debug": "^4.3.4",
-        "fs-extra": "^10.0.0",
-        "isbinaryfile": "^4.0.8",
-        "minimist": "^1.2.6",
-        "plist": "^3.0.5"
-      },
-      "dependencies": {
-        "fs-extra": {
-          "version": "10.1.0",
-          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
-          "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.2.0",
-            "jsonfile": "^6.0.1",
-            "universalify": "^2.0.0"
-          }
-        },
-        "jsonfile": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
-          "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.1.6",
-            "universalify": "^2.0.0"
-          }
-        },
-        "universalify": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
-          "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
-          "dev": true
-        }
-      }
-    },
-    "@electron/universal": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.4.2.tgz",
-      "integrity": "sha512-ymGwXYBUGFS1DuTqYJwZ0p1gIlELKOf21zPJefij/amzV66vTXRNJ2mAtW0uRsaHfV+pzYTJVrt5oco44DFOMg==",
-      "dev": true,
-      "requires": {
-        "@electron/asar": "^3.2.1",
-        "@malept/cross-spawn-promise": "^1.1.0",
-        "debug": "^4.3.1",
-        "dir-compare": "^3.0.0",
-        "fs-extra": "^9.0.1",
-        "minimatch": "^3.0.4",
-        "plist": "^3.0.4"
-      },
-      "dependencies": {
-        "fs-extra": {
-          "version": "9.1.0",
-          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
-          "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
-          "dev": true,
-          "requires": {
-            "at-least-node": "^1.0.0",
-            "graceful-fs": "^4.2.0",
-            "jsonfile": "^6.0.1",
-            "universalify": "^2.0.0"
-          }
-        },
-        "jsonfile": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
-          "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.1.6",
-            "universalify": "^2.0.0"
-          }
-        },
-        "universalify": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
-          "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
-          "dev": true
-        }
-      }
-    },
-    "@malept/cross-spawn-promise": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz",
-      "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==",
-      "dev": true,
-      "requires": {
-        "cross-spawn": "^7.0.1"
-      }
-    },
-    "@sindresorhus/is": {
-      "version": "4.6.0",
-      "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
-      "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==",
-      "dev": true
-    },
-    "@szmarczak/http-timer": {
-      "version": "4.0.6",
-      "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
-      "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==",
-      "dev": true,
-      "requires": {
-        "defer-to-connect": "^2.0.0"
-      }
-    },
-    "@types/cacheable-request": {
-      "version": "6.0.3",
-      "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz",
-      "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==",
-      "dev": true,
-      "requires": {
-        "@types/http-cache-semantics": "*",
-        "@types/keyv": "^3.1.4",
-        "@types/node": "*",
-        "@types/responselike": "^1.0.0"
-      }
-    },
-    "@types/http-cache-semantics": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.2.tgz",
-      "integrity": "sha512-FD+nQWA2zJjh4L9+pFXqWOi0Hs1ryBCfI+985NjluQ1p8EYtoLvjLOKidXBtZ4/IcxDX4o8/E8qDS3540tNliw==",
-      "dev": true
-    },
-    "@types/keyv": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz",
-      "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==",
-      "dev": true,
-      "requires": {
-        "@types/node": "*"
-      }
-    },
-    "@types/node": {
-      "version": "16.18.57",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.57.tgz",
-      "integrity": "sha512-piPoDozdPaX1hNWFJQzzgWqE40gh986VvVx/QO9RU4qYRE55ld7iepDVgZ3ccGUw0R4wge0Oy1dd+3xOQNkkUQ==",
-      "dev": true
-    },
-    "@types/responselike": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.1.tgz",
-      "integrity": "sha512-TiGnitEDxj2X0j+98Eqk5lv/Cij8oHd32bU4D/Yw6AOq7vvTk0gSD2GPj0G/HkvhMoVsdlhYF4yqqlyPBTM6Sg==",
-      "dev": true,
-      "requires": {
-        "@types/node": "*"
-      }
-    },
-    "@types/yauzl": {
-      "version": "2.10.1",
-      "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.1.tgz",
-      "integrity": "sha512-CHzgNU3qYBnp/O4S3yv2tXPlvMTq0YWSTVg2/JYLqWZGHwwgJGAwd00poay/11asPq8wLFwHzubyInqHIFmmiw==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "@types/node": "*"
-      }
-    },
-    "@xmldom/xmldom": {
-      "version": "0.8.10",
-      "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz",
-      "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==",
-      "dev": true
-    },
-    "ansi-regex": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
-      "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g=="
-    },
-    "ansi-styles": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-      "requires": {
-        "color-convert": "^1.9.0"
-      }
-    },
-    "at-least-node": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
-      "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
-      "dev": true
-    },
-    "author-regex": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/author-regex/-/author-regex-1.0.0.tgz",
-      "integrity": "sha512-KbWgR8wOYRAPekEmMXrYYdc7BRyhn2Ftk7KWfMUnQ43hFdojWEFRxhhRUm3/OFEdPa1r0KAvTTg9YQK57xTe0g==",
-      "dev": true
-    },
-    "balanced-match": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
-      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
-      "dev": true
-    },
-    "base64-js": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
-      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
-      "dev": true
-    },
-    "bluebird": {
-      "version": "3.7.2",
-      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
-      "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
-      "dev": true
-    },
-    "boolean": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz",
-      "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==",
-      "dev": true,
-      "optional": true
-    },
-    "brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dev": true,
-      "requires": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "buffer-crc32": {
-      "version": "0.2.13",
-      "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
-      "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
-      "dev": true
-    },
-    "buffer-equal": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz",
-      "integrity": "sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==",
-      "dev": true
-    },
-    "cacheable-lookup": {
-      "version": "5.0.4",
-      "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz",
-      "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==",
-      "dev": true
-    },
-    "cacheable-request": {
-      "version": "7.0.4",
-      "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz",
-      "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==",
-      "dev": true,
-      "requires": {
-        "clone-response": "^1.0.2",
-        "get-stream": "^5.1.0",
-        "http-cache-semantics": "^4.0.0",
-        "keyv": "^4.0.0",
-        "lowercase-keys": "^2.0.0",
-        "normalize-url": "^6.0.1",
-        "responselike": "^2.0.0"
-      }
-    },
-    "cliui": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
-      "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
-      "requires": {
-        "string-width": "^3.1.0",
-        "strip-ansi": "^5.2.0",
-        "wrap-ansi": "^5.1.0"
-      },
-      "dependencies": {
-        "is-fullwidth-code-point": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
-        },
-        "string-width": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-          "requires": {
-            "emoji-regex": "^7.0.1",
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^5.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-          "requires": {
-            "ansi-regex": "^4.1.0"
-          }
-        }
-      }
-    },
-    "clone-response": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
-      "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
-      "dev": true,
-      "requires": {
-        "mimic-response": "^1.0.0"
-      }
-    },
-    "color-convert": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-      "requires": {
-        "color-name": "1.1.3"
-      }
-    },
-    "color-name": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
-    },
-    "commander": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
-      "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
-      "dev": true
-    },
-    "compare-version": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz",
-      "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==",
-      "dev": true
-    },
-    "concat-map": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
-      "dev": true
-    },
-    "cross-spawn": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
-      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
-      "dev": true,
-      "requires": {
-        "path-key": "^3.1.0",
-        "shebang-command": "^2.0.0",
-        "which": "^2.0.1"
-      }
-    },
-    "cross-spawn-windows-exe": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/cross-spawn-windows-exe/-/cross-spawn-windows-exe-1.2.0.tgz",
-      "integrity": "sha512-mkLtJJcYbDCxEG7Js6eUnUNndWjyUZwJ3H7bErmmtOYU/Zb99DyUkpamuIZE0b3bhmJyZ7D90uS6f+CGxRRjOw==",
-      "dev": true,
-      "requires": {
-        "@malept/cross-spawn-promise": "^1.1.0",
-        "is-wsl": "^2.2.0",
-        "which": "^2.0.2"
-      }
-    },
-    "debug": {
-      "version": "4.3.4",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-      "dev": true,
-      "requires": {
-        "ms": "2.1.2"
-      }
-    },
-    "decamelize": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
-      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
-    },
-    "decompress-response": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
-      "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
-      "dev": true,
-      "requires": {
-        "mimic-response": "^3.1.0"
-      },
-      "dependencies": {
-        "mimic-response": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
-          "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
-          "dev": true
-        }
-      }
-    },
-    "defer-to-connect": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
-      "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
-      "dev": true
-    },
-    "define-data-property": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.0.tgz",
-      "integrity": "sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "get-intrinsic": "^1.2.1",
-        "gopd": "^1.0.1",
-        "has-property-descriptors": "^1.0.0"
-      }
-    },
-    "define-properties": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
-      "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "define-data-property": "^1.0.1",
-        "has-property-descriptors": "^1.0.0",
-        "object-keys": "^1.1.1"
-      }
-    },
-    "detect-node": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
-      "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
-      "dev": true,
-      "optional": true
-    },
-    "dir-compare": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz",
-      "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==",
-      "dev": true,
-      "requires": {
-        "buffer-equal": "^1.0.0",
-        "minimatch": "^3.0.4"
-      }
-    },
-    "electron": {
-      "version": "22.3.25",
-      "resolved": "https://registry.npmjs.org/electron/-/electron-22.3.25.tgz",
-      "integrity": "sha512-AjrP7bebMs/IPsgmyowptbA7jycTkrJC7jLZTb5JoH30PkBC6pZx/7XQ0aDok82SsmSiF4UJDOg+HoLrEBiqmg==",
-      "dev": true,
-      "requires": {
-        "@electron/get": "^2.0.0",
-        "@types/node": "^16.11.26",
-        "extract-zip": "^2.0.1"
-      },
-      "dependencies": {
-        "@electron/get": {
-          "version": "2.0.3",
-          "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz",
-          "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==",
-          "dev": true,
-          "requires": {
-            "debug": "^4.1.1",
-            "env-paths": "^2.2.0",
-            "fs-extra": "^8.1.0",
-            "global-agent": "^3.0.0",
-            "got": "^11.8.5",
-            "progress": "^2.0.3",
-            "semver": "^6.2.0",
-            "sumchecker": "^3.0.1"
-          }
-        },
-        "@sindresorhus/is": {
-          "version": "4.6.0",
-          "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
-          "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==",
-          "dev": true
-        },
-        "@szmarczak/http-timer": {
-          "version": "4.0.6",
-          "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
-          "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==",
-          "dev": true,
-          "requires": {
-            "defer-to-connect": "^2.0.0"
-          }
-        },
-        "cacheable-request": {
-          "version": "7.0.4",
-          "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz",
-          "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==",
-          "dev": true,
-          "requires": {
-            "clone-response": "^1.0.2",
-            "get-stream": "^5.1.0",
-            "http-cache-semantics": "^4.0.0",
-            "keyv": "^4.0.0",
-            "lowercase-keys": "^2.0.0",
-            "normalize-url": "^6.0.1",
-            "responselike": "^2.0.0"
-          }
-        },
-        "debug": {
-          "version": "4.3.4",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-          "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-          "dev": true,
-          "requires": {
-            "ms": "2.1.2"
-          }
-        },
-        "decompress-response": {
-          "version": "6.0.0",
-          "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
-          "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
-          "dev": true,
-          "requires": {
-            "mimic-response": "^3.1.0"
-          }
-        },
-        "defer-to-connect": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
-          "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
-          "dev": true
-        },
-        "fs-extra": {
-          "version": "8.1.0",
-          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
-          "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.2.0",
-            "jsonfile": "^4.0.0",
-            "universalify": "^0.1.0"
-          }
-        },
-        "get-stream": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
-          "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
-          "dev": true,
-          "requires": {
-            "pump": "^3.0.0"
-          }
-        },
-        "got": {
-          "version": "11.8.6",
-          "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz",
-          "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==",
-          "dev": true,
-          "requires": {
-            "@sindresorhus/is": "^4.0.0",
-            "@szmarczak/http-timer": "^4.0.5",
-            "@types/cacheable-request": "^6.0.1",
-            "@types/responselike": "^1.0.0",
-            "cacheable-lookup": "^5.0.3",
-            "cacheable-request": "^7.0.2",
-            "decompress-response": "^6.0.0",
-            "http2-wrapper": "^1.0.0-beta.5.2",
-            "lowercase-keys": "^2.0.0",
-            "p-cancelable": "^2.0.0",
-            "responselike": "^2.0.0"
-          }
-        },
-        "json-buffer": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
-          "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
-          "dev": true
-        },
-        "keyv": {
-          "version": "4.5.3",
-          "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz",
-          "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==",
-          "dev": true,
-          "requires": {
-            "json-buffer": "3.0.1"
-          }
-        },
-        "lowercase-keys": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
-          "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
-          "dev": true
-        },
-        "mimic-response": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
-          "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
-          "dev": true
-        },
-        "normalize-url": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
-          "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
-          "dev": true
-        },
-        "p-cancelable": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz",
-          "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==",
-          "dev": true
-        },
-        "responselike": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz",
-          "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==",
-          "dev": true,
-          "requires": {
-            "lowercase-keys": "^2.0.0"
-          }
-        },
-        "semver": {
-          "version": "6.3.1",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
-          "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
-          "dev": true
-        }
-      }
-    },
-    "electron-packager": {
-      "version": "17.1.2",
-      "resolved": "https://registry.npmjs.org/electron-packager/-/electron-packager-17.1.2.tgz",
-      "integrity": "sha512-XofXdikjYI7MVBcnXeoOvRR+yFFFHOLs3J7PF5KYQweigtgLshcH4W660PsvHr4lYZ03JBpLyEcUB8DzHZ+BNw==",
-      "dev": true,
-      "requires": {
-        "@electron/asar": "^3.2.1",
-        "@electron/get": "^2.0.0",
-        "@electron/notarize": "^1.2.3",
-        "@electron/osx-sign": "^1.0.5",
-        "@electron/universal": "^1.3.2",
-        "cross-spawn-windows-exe": "^1.2.0",
-        "debug": "^4.0.1",
-        "extract-zip": "^2.0.0",
-        "filenamify": "^4.1.0",
-        "fs-extra": "^11.1.0",
-        "galactus": "^1.0.0",
-        "get-package-info": "^1.0.0",
-        "junk": "^3.1.0",
-        "parse-author": "^2.0.0",
-        "plist": "^3.0.0",
-        "rcedit": "^3.0.1",
-        "resolve": "^1.1.6",
-        "semver": "^7.1.3",
-        "yargs-parser": "^21.1.1"
-      },
-      "dependencies": {
-        "yargs-parser": {
-          "version": "21.1.1",
-          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
-          "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
-          "dev": true
-        }
-      }
-    },
-    "emoji-regex": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
-      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
-    },
-    "end-of-stream": {
-      "version": "1.4.4",
-      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
-      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
-      "dev": true,
-      "requires": {
-        "once": "^1.4.0"
-      }
-    },
-    "env-paths": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
-      "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
-      "dev": true
-    },
-    "error-ex": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
-      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
-      "dev": true,
-      "requires": {
-        "is-arrayish": "^0.2.1"
-      }
-    },
-    "es6-error": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
-      "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
-      "dev": true,
-      "optional": true
-    },
-    "escape-string-regexp": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
-      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
-      "dev": true,
-      "optional": true
-    },
-    "extract-zip": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
-      "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
-      "dev": true,
-      "requires": {
-        "@types/yauzl": "^2.9.1",
-        "debug": "^4.1.1",
-        "get-stream": "^5.1.0",
-        "yauzl": "^2.10.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "4.3.4",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-          "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-          "dev": true,
-          "requires": {
-            "ms": "2.1.2"
-          }
-        },
-        "get-stream": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
-          "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
-          "dev": true,
-          "requires": {
-            "pump": "^3.0.0"
-          }
-        }
-      }
-    },
-    "fd-slicer": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
-      "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
-      "dev": true,
-      "requires": {
-        "pend": "~1.2.0"
-      }
-    },
-    "filename-reserved-regex": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz",
-      "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==",
-      "dev": true
-    },
-    "filenamify": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz",
-      "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==",
-      "dev": true,
-      "requires": {
-        "filename-reserved-regex": "^2.0.0",
-        "strip-outer": "^1.0.1",
-        "trim-repeated": "^1.0.0"
-      }
-    },
-    "find-up": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
-      "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==",
-      "dev": true,
-      "requires": {
-        "locate-path": "^2.0.0"
-      }
-    },
-    "flora-colossus": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/flora-colossus/-/flora-colossus-2.0.0.tgz",
-      "integrity": "sha512-dz4HxH6pOvbUzZpZ/yXhafjbR2I8cenK5xL0KtBFb7U2ADsR+OwXifnxZjij/pZWF775uSCMzWVd+jDik2H2IA==",
-      "dev": true,
-      "requires": {
-        "debug": "^4.3.4",
-        "fs-extra": "^10.1.0"
-      },
-      "dependencies": {
-        "fs-extra": {
-          "version": "10.1.0",
-          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
-          "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.2.0",
-            "jsonfile": "^6.0.1",
-            "universalify": "^2.0.0"
-          }
-        },
-        "jsonfile": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
-          "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.1.6",
-            "universalify": "^2.0.0"
-          }
-        },
-        "universalify": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
-          "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
-          "dev": true
-        }
-      }
-    },
-    "fs-extra": {
-      "version": "11.1.1",
-      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz",
-      "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.2.0",
-        "jsonfile": "^6.0.1",
-        "universalify": "^2.0.0"
-      },
-      "dependencies": {
-        "jsonfile": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
-          "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.1.6",
-            "universalify": "^2.0.0"
-          }
-        },
-        "universalify": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
-          "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
-          "dev": true
-        }
-      }
-    },
-    "fs.realpath": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
-      "dev": true
-    },
-    "function-bind": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
-      "dev": true,
-      "optional": true
-    },
-    "galactus": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/galactus/-/galactus-1.0.0.tgz",
-      "integrity": "sha512-R1fam6D4CyKQGNlvJne4dkNF+PvUUl7TAJInvTGa9fti9qAv95quQz29GXapA4d8Ec266mJJxFVh82M4GIIGDQ==",
-      "dev": true,
-      "requires": {
-        "debug": "^4.3.4",
-        "flora-colossus": "^2.0.0",
-        "fs-extra": "^10.1.0"
-      },
-      "dependencies": {
-        "fs-extra": {
-          "version": "10.1.0",
-          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
-          "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.2.0",
-            "jsonfile": "^6.0.1",
-            "universalify": "^2.0.0"
-          }
-        },
-        "jsonfile": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
-          "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.1.6",
-            "universalify": "^2.0.0"
-          }
-        },
-        "universalify": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
-          "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
-          "dev": true
-        }
-      }
-    },
-    "get-caller-file": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
-      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
-    },
-    "get-intrinsic": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
-      "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "function-bind": "^1.1.1",
-        "has": "^1.0.3",
-        "has-proto": "^1.0.1",
-        "has-symbols": "^1.0.3"
-      }
-    },
-    "get-package-info": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/get-package-info/-/get-package-info-1.0.0.tgz",
-      "integrity": "sha512-SCbprXGAPdIhKAXiG+Mk6yeoFH61JlYunqdFQFHDtLjJlDjFf6x07dsS8acO+xWt52jpdVo49AlVDnUVK1sDNw==",
-      "dev": true,
-      "requires": {
-        "bluebird": "^3.1.1",
-        "debug": "^2.2.0",
-        "lodash.get": "^4.0.0",
-        "read-pkg-up": "^2.0.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
-          "dev": true
-        }
-      }
-    },
-    "get-stream": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
-      "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
-      "dev": true,
-      "requires": {
-        "pump": "^3.0.0"
-      }
-    },
-    "glob": {
-      "version": "7.2.3",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
-      "dev": true,
-      "requires": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^3.1.1",
-        "once": "^1.3.0",
-        "path-is-absolute": "^1.0.0"
-      }
-    },
-    "global-agent": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz",
-      "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "boolean": "^3.0.1",
-        "es6-error": "^4.1.1",
-        "matcher": "^3.0.0",
-        "roarr": "^2.15.3",
-        "semver": "^7.3.2",
-        "serialize-error": "^7.0.1"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "7.5.4",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
-          "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
-        }
-      }
-    },
-    "globalthis": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
-      "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "define-properties": "^1.1.3"
-      }
-    },
-    "gopd": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
-      "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "get-intrinsic": "^1.1.3"
-      }
-    },
-    "got": {
-      "version": "11.8.6",
-      "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz",
-      "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==",
-      "dev": true,
-      "requires": {
-        "@sindresorhus/is": "^4.0.0",
-        "@szmarczak/http-timer": "^4.0.5",
-        "@types/cacheable-request": "^6.0.1",
-        "@types/responselike": "^1.0.0",
-        "cacheable-lookup": "^5.0.3",
-        "cacheable-request": "^7.0.2",
-        "decompress-response": "^6.0.0",
-        "http2-wrapper": "^1.0.0-beta.5.2",
-        "lowercase-keys": "^2.0.0",
-        "p-cancelable": "^2.0.0",
-        "responselike": "^2.0.0"
-      }
-    },
-    "graceful-fs": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz",
-      "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==",
-      "dev": true
-    },
-    "has": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz",
-      "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==",
-      "dev": true
-    },
-    "has-property-descriptors": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
-      "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "get-intrinsic": "^1.1.1"
-      }
-    },
-    "has-proto": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
-      "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
-      "dev": true,
-      "optional": true
-    },
-    "has-symbols": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
-      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
-      "dev": true,
-      "optional": true
-    },
-    "hosted-git-info": {
-      "version": "2.8.9",
-      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
-      "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
-      "dev": true
-    },
-    "http-cache-semantics": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz",
-      "integrity": "sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew==",
-      "dev": true
-    },
-    "http2-wrapper": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz",
-      "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==",
-      "dev": true,
-      "requires": {
-        "quick-lru": "^5.1.1",
-        "resolve-alpn": "^1.0.0"
-      }
-    },
-    "inflight": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
-      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
-      "dev": true,
-      "requires": {
-        "once": "^1.3.0",
-        "wrappy": "1"
-      }
-    },
-    "inherits": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
-      "dev": true
-    },
-    "is-arrayish": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
-      "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
-      "dev": true
-    },
-    "is-core-module": {
-      "version": "2.13.0",
-      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz",
-      "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==",
-      "dev": true,
-      "requires": {
-        "has": "^1.0.3"
-      }
-    },
-    "is-docker": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
-      "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
-      "dev": true
-    },
-    "is-wsl": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
-      "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
-      "dev": true,
-      "requires": {
-        "is-docker": "^2.0.0"
-      }
-    },
-    "isbinaryfile": {
-      "version": "4.0.10",
-      "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz",
-      "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==",
-      "dev": true
-    },
-    "isexe": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
-      "dev": true
-    },
-    "json-buffer": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
-      "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
-      "dev": true
-    },
-    "json-stringify-safe": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
-      "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
-      "dev": true,
-      "optional": true
-    },
-    "jsonfile": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
-      "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.6"
-      }
-    },
-    "junk": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz",
-      "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==",
-      "dev": true
-    },
-    "keyv": {
-      "version": "4.5.3",
-      "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz",
-      "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==",
-      "dev": true,
-      "requires": {
-        "json-buffer": "3.0.1"
-      }
-    },
-    "load-json-file": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
-      "integrity": "sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.2",
-        "parse-json": "^2.2.0",
-        "pify": "^2.0.0",
-        "strip-bom": "^3.0.0"
-      }
-    },
-    "locate-path": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
-      "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==",
-      "dev": true,
-      "requires": {
-        "p-locate": "^2.0.0",
-        "path-exists": "^3.0.0"
-      }
-    },
-    "lodash.get": {
-      "version": "4.4.2",
-      "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
-      "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==",
-      "dev": true
-    },
-    "lowercase-keys": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
-      "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
-      "dev": true
-    },
-    "lru-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-      "dev": true,
-      "requires": {
-        "yallist": "^4.0.0"
-      }
-    },
-    "matcher": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz",
-      "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "escape-string-regexp": "^4.0.0"
-      }
-    },
-    "mimic-response": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
-      "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
-      "dev": true
-    },
-    "minimatch": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
-      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
-      "dev": true,
-      "requires": {
-        "brace-expansion": "^1.1.7"
-      }
-    },
-    "minimist": {
-      "version": "1.2.8",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
-      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
-      "dev": true
-    },
-    "ms": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-      "dev": true
-    },
-    "normalize-package-data": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
-      "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
-      "dev": true,
-      "requires": {
-        "hosted-git-info": "^2.1.4",
-        "resolve": "^1.10.0",
-        "semver": "2 || 3 || 4 || 5",
-        "validate-npm-package-license": "^3.0.1"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "5.7.2",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
-          "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
-          "dev": true
-        }
-      }
-    },
-    "normalize-url": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
-      "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
-      "dev": true
-    },
-    "object-keys": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
-      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
-      "dev": true,
-      "optional": true
-    },
-    "once": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-      "dev": true,
-      "requires": {
-        "wrappy": "1"
-      }
-    },
-    "p-cancelable": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz",
-      "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==",
-      "dev": true
-    },
-    "p-limit": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
-      "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
-      "dev": true,
-      "requires": {
-        "p-try": "^1.0.0"
-      }
-    },
-    "p-locate": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
-      "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==",
-      "dev": true,
-      "requires": {
-        "p-limit": "^1.1.0"
-      }
-    },
-    "p-try": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
-      "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==",
-      "dev": true
-    },
-    "parse-author": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/parse-author/-/parse-author-2.0.0.tgz",
-      "integrity": "sha512-yx5DfvkN8JsHL2xk2Os9oTia467qnvRgey4ahSm2X8epehBLx/gWLcy5KI+Y36ful5DzGbCS6RazqZGgy1gHNw==",
-      "dev": true,
-      "requires": {
-        "author-regex": "^1.0.0"
-      }
-    },
-    "parse-json": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
-      "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==",
-      "dev": true,
-      "requires": {
-        "error-ex": "^1.2.0"
-      }
-    },
-    "path-exists": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
-      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
-    },
-    "path-is-absolute": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
-      "dev": true
-    },
-    "path-key": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
-      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
-      "dev": true
-    },
-    "path-parse": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
-      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
-      "dev": true
-    },
-    "path-type": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
-      "integrity": "sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==",
-      "dev": true,
-      "requires": {
-        "pify": "^2.0.0"
-      }
-    },
-    "pend": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
-      "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
-      "dev": true
-    },
-    "pify": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-      "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
-      "dev": true
-    },
-    "plist": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz",
-      "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==",
-      "dev": true,
-      "requires": {
-        "@xmldom/xmldom": "^0.8.8",
-        "base64-js": "^1.5.1",
-        "xmlbuilder": "^15.1.1"
-      }
-    },
-    "progress": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
-      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
-      "dev": true
-    },
-    "pump": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
-      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
-      "dev": true,
-      "requires": {
-        "end-of-stream": "^1.1.0",
-        "once": "^1.3.1"
-      }
-    },
-    "quick-lru": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
-      "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
-      "dev": true
-    },
-    "rcedit": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-3.1.0.tgz",
-      "integrity": "sha512-WRlRdY1qZbu1L11DklT07KuHfRk42l0NFFJdaExELEu4fEQ982bP5Z6OWGPj/wLLIuKRQDCxZJGAwoFsxhZhNA==",
-      "dev": true,
-      "requires": {
-        "cross-spawn-windows-exe": "^1.1.0"
-      }
-    },
-    "read-pkg": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
-      "integrity": "sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==",
-      "dev": true,
-      "requires": {
-        "load-json-file": "^2.0.0",
-        "normalize-package-data": "^2.3.2",
-        "path-type": "^2.0.0"
-      }
-    },
-    "read-pkg-up": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
-      "integrity": "sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w==",
-      "dev": true,
-      "requires": {
-        "find-up": "^2.0.0",
-        "read-pkg": "^2.0.0"
-      }
-    },
-    "require-directory": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
-      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
-    },
-    "require-main-filename": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
-      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
-    },
-    "resolve": {
-      "version": "1.22.6",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz",
-      "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==",
-      "dev": true,
-      "requires": {
-        "is-core-module": "^2.13.0",
-        "path-parse": "^1.0.7",
-        "supports-preserve-symlinks-flag": "^1.0.0"
-      }
-    },
-    "resolve-alpn": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
-      "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==",
-      "dev": true
-    },
-    "responselike": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz",
-      "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==",
-      "dev": true,
-      "requires": {
-        "lowercase-keys": "^2.0.0"
-      }
-    },
-    "roarr": {
-      "version": "2.15.4",
-      "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz",
-      "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "boolean": "^3.0.1",
-        "detect-node": "^2.0.4",
-        "globalthis": "^1.0.1",
-        "json-stringify-safe": "^5.0.1",
-        "semver-compare": "^1.0.0",
-        "sprintf-js": "^1.1.2"
-      }
-    },
-    "semver": {
-      "version": "7.5.4",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
-      "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
-      "dev": true,
-      "requires": {
-        "lru-cache": "^6.0.0"
-      }
-    },
-    "semver-compare": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
-      "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==",
-      "dev": true,
-      "optional": true
-    },
-    "serialize-error": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz",
-      "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "type-fest": "^0.13.1"
-      }
-    },
-    "set-blocking": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
-      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
-    },
-    "shebang-command": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
-      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
-      "dev": true,
-      "requires": {
-        "shebang-regex": "^3.0.0"
-      }
-    },
-    "shebang-regex": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
-      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
-      "dev": true
-    },
-    "spdx-correct": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
-      "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
-      "dev": true,
-      "requires": {
-        "spdx-expression-parse": "^3.0.0",
-        "spdx-license-ids": "^3.0.0"
-      }
-    },
-    "spdx-exceptions": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
-      "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
-      "dev": true
-    },
-    "spdx-expression-parse": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
-      "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
-      "dev": true,
-      "requires": {
-        "spdx-exceptions": "^2.1.0",
-        "spdx-license-ids": "^3.0.0"
-      }
-    },
-    "spdx-license-ids": {
-      "version": "3.0.16",
-      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz",
-      "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==",
-      "dev": true
-    },
-    "sprintf-js": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
-      "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==",
-      "dev": true,
-      "optional": true
-    },
-    "strip-bom": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
-      "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
-      "dev": true
-    },
-    "strip-outer": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz",
-      "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==",
-      "dev": true,
-      "requires": {
-        "escape-string-regexp": "^1.0.2"
-      },
-      "dependencies": {
-        "escape-string-regexp": {
-          "version": "1.0.5",
-          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-          "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
-          "dev": true
-        }
-      }
-    },
-    "sumchecker": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz",
-      "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==",
-      "dev": true,
-      "requires": {
-        "debug": "^4.1.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "4.3.4",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-          "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-          "dev": true,
-          "requires": {
-            "ms": "2.1.2"
-          }
-        }
-      }
-    },
-    "supports-preserve-symlinks-flag": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
-      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
-      "dev": true
-    },
-    "trim-repeated": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz",
-      "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==",
-      "dev": true,
-      "requires": {
-        "escape-string-regexp": "^1.0.2"
-      },
-      "dependencies": {
-        "escape-string-regexp": {
-          "version": "1.0.5",
-          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-          "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
-          "dev": true
-        }
-      }
-    },
-    "type-fest": {
-      "version": "0.13.1",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
-      "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==",
-      "dev": true,
-      "optional": true
-    },
-    "universalify": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
-      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
-      "dev": true
-    },
-    "validate-npm-package-license": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
-      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
-      "dev": true,
-      "requires": {
-        "spdx-correct": "^3.0.0",
-        "spdx-expression-parse": "^3.0.0"
-      }
-    },
-    "which": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-      "dev": true,
-      "requires": {
-        "isexe": "^2.0.0"
-      }
-    },
-    "which-module": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
-      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
-    },
-    "wrap-ansi": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
-      "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
-      "requires": {
-        "ansi-styles": "^3.2.0",
-        "string-width": "^3.0.0",
-        "strip-ansi": "^5.0.0"
-      },
-      "dependencies": {
-        "is-fullwidth-code-point": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
-        },
-        "string-width": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-          "requires": {
-            "emoji-regex": "^7.0.1",
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^5.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-          "requires": {
-            "ansi-regex": "^4.1.0"
-          }
-        }
-      }
-    },
-    "wrappy": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
-      "dev": true
-    },
-    "xmlbuilder": {
-      "version": "15.1.1",
-      "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz",
-      "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==",
-      "dev": true
-    },
-    "y18n": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz",
-      "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ=="
-    },
-    "yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-      "dev": true,
-      "optional": true
-    },
-    "yargs": {
-      "version": "14.2.0",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.0.tgz",
-      "integrity": "sha512-/is78VKbKs70bVZH7w4YaZea6xcJWOAwkhbR0CFuZBmYtfTYF0xjGJF43AYd8g2Uii1yJwmS5GR2vBmrc32sbg==",
-      "requires": {
-        "cliui": "^5.0.0",
-        "decamelize": "^1.2.0",
-        "find-up": "^3.0.0",
-        "get-caller-file": "^2.0.1",
-        "require-directory": "^2.1.1",
-        "require-main-filename": "^2.0.0",
-        "set-blocking": "^2.0.0",
-        "string-width": "^3.0.0",
-        "which-module": "^2.0.0",
-        "y18n": "^4.0.0",
-        "yargs-parser": "^15.0.0"
-      },
-      "dependencies": {
-        "camelcase": {
-          "version": "5.3.1",
-          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
-          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
-        },
-        "find-up": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
-          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
-          "requires": {
-            "locate-path": "^3.0.0"
-          }
-        },
-        "is-fullwidth-code-point": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
-        },
-        "locate-path": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
-          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
-          "requires": {
-            "p-locate": "^3.0.0",
-            "path-exists": "^3.0.0"
-          }
-        },
-        "p-limit": {
-          "version": "2.2.1",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz",
-          "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==",
-          "requires": {
-            "p-try": "^2.0.0"
-          }
-        },
-        "p-locate": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
-          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
-          "requires": {
-            "p-limit": "^2.0.0"
-          }
-        },
-        "p-try": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-          "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
-        },
-        "string-width": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-          "requires": {
-            "emoji-regex": "^7.0.1",
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^5.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-          "requires": {
-            "ansi-regex": "^4.1.0"
-          }
-        }
-      }
-    },
-    "yargs-parser": {
-      "version": "15.0.1",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz",
-      "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==",
-      "requires": {
-        "camelcase": "^5.0.0",
-        "decamelize": "^1.2.0"
-      },
-      "dependencies": {
-        "camelcase": {
-          "version": "5.3.1",
-          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
-          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
-        }
-      }
-    },
-    "yauzl": {
-      "version": "2.10.0",
-      "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
-      "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
-      "dev": true,
-      "requires": {
-        "buffer-crc32": "~0.2.3",
-        "fd-slicer": "~1.1.0"
-      }
-    }
-  }
-}
diff --git a/screenshare/package.json b/screenshare/package.json
deleted file mode 100644
index a9ad1facbb..0000000000
--- a/screenshare/package.json
+++ /dev/null
@@ -1,27 +0,0 @@
-{
-  "name": "highfidelity_screenshare",
-  "version": "1.0.0",
-  "description": "High Fidelity Screenshare",
-  "main": "src/screenshareMainProcess.js",
-  "scripts": {
-    "test": "echo \"Error: no test specified\" && exit 1",
-    "packager": "node packager.js"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/highfidelity/hifi.git"
-  },
-  "author": "High Fidelity",
-  "license": "Apache-2.0",
-  "bugs": {
-    "url": "https://github.com/highfidelity/hifi/issues"
-  },
-  "homepage": "https://github.com/highfidelity/hifi#readme",
-  "devDependencies": {
-    "electron": "^22.3.25",
-    "electron-packager": "^17.1.2"
-  },
-  "dependencies": {
-    "yargs": "^14.2.0"
-  }
-}
diff --git a/screenshare/packager.js b/screenshare/packager.js
deleted file mode 100644
index dd1a92f4a6..0000000000
--- a/screenshare/packager.js
+++ /dev/null
@@ -1,49 +0,0 @@
-var packager = require('electron-packager');
-var osType = require('os').type();
-var argv = require('yargs').argv;
-
-var platform = null;
-if (osType == "Darwin" || osType == "Linux") {
-    platform = osType.toLowerCase();
-} else if (osType == "Windows_NT") {
-    platform = "win32"
-}
-
-var NAME = "hifi-screenshare";
-var options = {
-    dir: __dirname,
-    name: NAME,
-    version: "0.1.0",
-    overwrite: true,
-    prune: true,
-    arch: "x64",
-    platform: platform,
-    ignore: "electron-packager|README.md|CMakeLists.txt|packager.js|.gitignore"
-};
-
-// setup per OS options
-if (osType == "Darwin") {
-    options["app-bundle-id"] = "com.highfidelity.hifi-screenshare";
-} else if (osType == "Windows_NT") {
-    options["version-string"] = {
-        CompanyName: "Overte",
-        FileDescription: "Overte Screenshare",
-        ProductName: NAME,
-        OriginalFilename: NAME + ".exe"
-    }
-}
-
-// check if we were passed a custom out directory, pass it along if so
-if (argv.out) {
-    options.out = argv.out
-}
-
-// call the packager to produce the executable
-packager(options)
-    .then(appPath => {
-        console.log("Wrote new app to " + appPath);
-    })
-    .catch(error => {
-        console.error("There was an error writing the packaged console: " + error.message);
-        process.exit(1);
-    });
diff --git a/screenshare/src/resources/FiraSans-Regular.ttf b/screenshare/src/resources/FiraSans-Regular.ttf
deleted file mode 100644
index d9fdc0e922..0000000000
Binary files a/screenshare/src/resources/FiraSans-Regular.ttf and /dev/null differ
diff --git a/screenshare/src/resources/interface.png b/screenshare/src/resources/interface.png
deleted file mode 100644
index f90cbe591c..0000000000
Binary files a/screenshare/src/resources/interface.png and /dev/null differ
diff --git a/screenshare/src/screenshareApp.html b/screenshare/src/screenshareApp.html
deleted file mode 100644
index 6268b581e4..0000000000
--- a/screenshare/src/screenshareApp.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<!-- 
-screenshareApp.html
-
-Created by Milad Nazeri, Rebecca Stankus, and Zach Fox 2019/11/13
-Copyright 2019 High Fidelity, Inc.
-
-Distributed under the Apache License, Version 2.0.
-See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html 
--->
-
-<html>
-    <head>
-        <link href="styles.css" rel="stylesheet">
-    </head>
-    <body id="main">
-        <div id="title" class="text_title">
-            <h1>Share your screen</h1>
-            <h3 id="subtitle">Please select the content you'd like to share.</h3>
-        </div>
-        <button id="screenshare" onclick="stopSharing()" style="display: none;">Stop Screenshare</button>
-        <div id="select_screen">
-            <div class="scrollbar" id="style-1">
-                <div class="force-overflow">
-                    <div id="selects">
-                    </div>
-                </div>
-            </div>
-        </div> 
-        <div id="confirmation_screen" style="display: none;">
-            <div id="share_pick">
-            </div> <!-- share_pick --> 
-            <div id="confirmation_text" style="color: white;">
-                <p>
-                    Are you sure you'd like to share <span id="content_name">Content Name</span>?
-                </p>
-                <p>
-                    Others will be able to see everything contained within this view.
-                </p>
-            </div>
-            <div id="button_selection">
-                <div id="yes" class="button_confirmation grey_background" onclick="screenConfirmed(true)">
-                    YES, SHARE THIS CONTENT
-                </div>
-                <div id="no" class="button_confirmation" onclick="screenConfirmed(false)">
-                    No, don't share this content
-                </div>
-            </div>
-        </div> <!-- confirmation screen -->
-        <script src="screenshareApp.js"></script>
-        <script src="https://static.opentok.com/v2/js/opentok.min.js"></script>
-    </body>
-</html>
diff --git a/screenshare/src/screenshareApp.js b/screenshare/src/screenshareApp.js
deleted file mode 100644
index 6a33b827d4..0000000000
--- a/screenshare/src/screenshareApp.js
+++ /dev/null
@@ -1,312 +0,0 @@
-'use strict';
-//  screenshareApp.js
-//
-//  Created by Milad Nazeri, Rebecca Stankus, and Zach Fox 2019/11/13
-//  Copyright 2019 High Fidelity, Inc.
-//
-//  Distributed under the Apache License, Version 2.0.
-//  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
-
-const { remote } = require('electron');
-
-// Helpers
-function handleError(error) {
-    if (error) {
-        console.error(error);
-    }
-}
-
-
-// When an application is picked, make sure we clear out the previous pick, toggle the page, 
-// and add the correct source
-let currentScreensharePickID = "";
-function screensharePicked(id) {
-    currentScreensharePickID = id;
-    document.getElementById("share_pick").innerHTML = "";
-    togglePage();
-    addSource(sourceMap[id], "share_pick");
-}
-
-
-// Once we have confirmed that we want to share, prepare the tokbox publishing initiating
-// and toggle back to the selects page
-function screenConfirmed(isConfirmed) {    
-    document.getElementById("selects").innerHTML = "";
-    if (isConfirmed === true){
-        onAccessApproved(currentScreensharePickID);
-    }
-    togglePage();
-}
-
-
-// Hide/show the select page or the confirmation page
-let currentPage = "mainPage";
-function togglePage(){
-    if (currentPage === "mainPage") {
-        currentPage = "confirmationPage";
-        document.getElementById("select_screen").style.display = "none";
-        document.getElementById("subtitle").innerHTML = "Confirm that you'd like to share this content.";
-        document.getElementById("confirmation_screen").style.display = "block";
-    } else {
-        showSources();
-        currentPage = "mainPage";
-        document.getElementById("select_screen").style.display = "block";
-        document.getElementById("subtitle").innerHTML = "Please select the content you'd like to share.";
-        document.getElementById("confirmation_screen").style.display = "none";
-    }
-}
-
-
-// UI
-
-// Render the html properly and append that to the correct parent
-function addSource(source, type) {
-    let renderedHTML = renderSourceHTML(source);
-    if (type === "selects") {
-        document.getElementById("selects").appendChild(renderedHTML);
-    } else {
-        document.getElementById("share_pick").appendChild(renderedHTML);
-        document.getElementById("content_name").innerHTML = source.name;
-    }
-}
-
-
-// Get the html created from the source.  Alter slightly depending on whether this source
-// is on the selects screen, or the confirmation screen.  Mainly removing highlighting.
-// If there is an app Icon, then add it.
-function renderSourceHTML(source) {
-    let type = currentPage === "confirmationPage" ? "share_pick" : "selects";
-    let sourceBody = document.createElement('div')
-    let thumbnail = source.thumbnail.toDataURL();
-    sourceBody.classList.add("box")
-    if (type === "share_pick") {
-        sourceBody.style.marginLeft = "0px";
-    }
-
-    let image = "";
-    if (source.appIcon) {
-        image = `<img class="icon" src="${source.appIcon.toDataURL()}" />`;
-    }
-    sourceBody.innerHTML = `
-        <div class="heading">
-            ${image}
-            <span class="screen_label">${source.name}</span>
-        </div>
-        <div class="${type === "share_pick" ? "image_no_hover" : "image"}" onclick="screensharePicked('${source.id}')">
-            <img src="${thumbnail}" />
-        </div>
-    `
-    return sourceBody;
-}
-
-
-// Separate out the screenshares and applications
-// Make sure the screens are labeled in order
-// Concact the two arrays back together and return
-function sortSources() {
-    let screenSources = [];
-    let applicationSources = [];
-    // Difference with Mac selects:
-    // 1 screen = "Enitre Screen", more than one like PC "Screen 1, Screen 2..."
-    screenshareSourceArray.forEach((source) => {
-        if (source.name.match(/(entire )?screen( )?([0-9]?)/i)) {
-            screenSources.push(source);
-        } else {
-            applicationSources.push(source)
-        }
-    });
-    screenSources.sort((a, b) => {
-        let aNumber = a.name.replace(/[^\d]/, "");
-        let bNumber = b.name.replace(/[^\d]/, "");
-        return aNumber - bNumber;
-    });
-    let finalSources = [...screenSources, ...applicationSources];
-    return finalSources;
-}
-
-
-// Setup sorting the selection array, add individual sources, and update the sourceMap
-function addSources() {
-    screenshareSourceArray = sortSources();
-    for (let i = 0; i < screenshareSourceArray.length; i++) {
-        addSource(screenshareSourceArray[i], "selects");
-        sourceMap[screenshareSourceArray[i].id] = screenshareSourceArray[i];
-    }
-}
-
-
-// 1. Get the screens and window that are available from electron
-// 2. Remove the screenshare app itself
-// 3. Create a source map to help grab the correct source when picked
-// 4. push all the sources for sorting to the source array
-// 5. Add thse sources
-const electron = require('electron');
-const SCREENSHARE_TITLE = "Screen share";
-const SCREENSHARE_TITLE_REGEX = new RegExp("^" + SCREENSHARE_TITLE + "$");
-const IMAGE_WIDTH = 265;
-const IMAGE_HEIGHT = 165;
-let screenshareSourceArray = [];
-let sourceMap = {};    
-function showSources() {
-    screenshareSourceArray = [];
-    electron.desktopCapturer.getSources({ 
-        types:['window', 'screen'],
-        thumbnailSize: {
-            width: IMAGE_WIDTH,
-            height: IMAGE_HEIGHT
-        },
-        fetchWindowIcons: true
-    }, (error, sources) => {
-        if (error) {
-            console.log("Error getting sources", error);
-        }
-        for (let source of sources) {
-            if (source.name.match(SCREENSHARE_TITLE_REGEX)){
-                continue;
-            }
-            sourceMap[source.id] = source;
-            screenshareSourceArray.push(source);
-        }
-        addSources();
-    });
-}
-
-
-// Stop the localstream and end the tokrok publishing
-let localStream;
-let desktopSharing;
-function stopSharing() {
-    desktopSharing = false;
-
-    if (localStream) {
-        localStream.getTracks()[0].stop();
-        localStream = null;
-    }
-
-    document.getElementById('screenshare').style.display = "none";
-    stopTokBoxPublisher();
-}
-
-
-// Callback to start publishing after we have setup the chromium stream
-function gotStream(stream) {
-    if (localStream) {
-        stopSharing();
-    }
-
-    localStream = stream;
-    startTokboxPublisher(localStream);
-
-    stream.onended = () => {
-        if (desktopSharing) {
-            togglePage();
-        }
-    };
-}
-
-
-// After we grant access to electron, create a stream and using the callback
-// start the tokbox publisher
-function onAccessApproved(desktop_id) {
-    if (!desktop_id) {
-        console.log('Desktop Capture access rejected.');
-        return;
-    }
-
-
-
-    document.getElementById('screenshare').style.visibility = "block";
-    desktopSharing = true;
-    navigator.webkitGetUserMedia({
-        audio: false,
-        video: {
-            mandatory: {
-                chromeMediaSource: 'desktop',
-                chromeMediaSourceId: desktop_id,
-                maxWidth: 1280,
-                maxHeight: 720,
-                maxFrameRate: 7
-            }
-        }
-    }, gotStream, handleError);
-    remote.getCurrentWindow().minimize();
-}
-
-
-// Tokbox
-
-// Once we have the connection info, this will create the session which will allow
-// us to publish a stream when we are ready
-function initializeTokboxSession() {
-    session = OT.initSession(projectAPIKey, sessionID);
-    session.on('sessionDisconnected', (event) => {
-        console.log('You were disconnected from the session.', event.reason);
-    });
-
-    // Connect to the session
-    session.connect(token, (error) => {
-        if (error) {
-            handleError(error);
-        }
-    });
-}
-
-
-// Init the tokbox publisher with our newly created stream
-var publisher; 
-function startTokboxPublisher(stream) {
-    publisher = document.createElement("div");
-    var publisherOptions = {
-        audioFallbackEnabled: false,
-        audioSource: null,
-        fitMode: 'contain',
-        frameRate: 7,
-        height: 720,
-        insertMode: 'append',
-        publishAudio: false,
-        videoSource: stream.getVideoTracks()[0],
-        width: 1280
-    };
-
-    publisher = OT.initPublisher(publisher, publisherOptions, function(error){
-        if (error) {
-            console.log("ERROR: " + error);
-        } else {
-            session.publish(publisher, function(error) {
-                if (error) {
-                    console.log("ERROR FROM Session.publish: " + error);
-                    return;
-                }
-            })
-        }
-    });
-}
-
-
-// Kills the streaming being sent to tokbox
-function stopTokBoxPublisher() {
-    publisher.destroy();
-}
-
-
-// When the app is ready, we get this info from the command line arguments.
-const ipcRenderer = electron.ipcRenderer;
-let projectAPIKey;
-let sessionID;
-let token;
-let session;
-ipcRenderer.on('connectionInfo', function(event, message) {
-    const connectionInfo = JSON.parse(message);
-    projectAPIKey = connectionInfo.projectAPIKey;
-    sessionID = connectionInfo.sessionID;
-    token = connectionInfo.token;
-
-    initializeTokboxSession();
-});
-
-
-// Show the initial sources after the dom has loaded
-// Sources come from electron.desktopCapturer
-document.addEventListener("DOMContentLoaded", () => {
-    showSources();
-});
diff --git a/screenshare/src/screenshareMainProcess.js b/screenshare/src/screenshareMainProcess.js
deleted file mode 100644
index 5dce65a783..0000000000
--- a/screenshare/src/screenshareMainProcess.js
+++ /dev/null
@@ -1,74 +0,0 @@
-'use strict';
-//  screenshareMainProcess.js
-//
-//  Milad Nazeri and Zach Fox 2019/11/13
-//  Copyright 2019 High Fidelity, Inc.
-//
-//  Distributed under the Apache License, Version 2.0.
-//  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
-
-const {app, BrowserWindow, ipcMain} = require('electron');
-const gotTheLock = app.requestSingleInstanceLock()
-const argv = require('yargs').argv;
-
-
-const connectionInfo = {
-    token: argv.token || "token",
-    projectAPIKey: argv.projectAPIKey || "projectAPIKey",
-    sessionID: argv.sessionID || "sessionID"
-}
-
-
-// Mac and PC need slightly different width and height sizes.
-const osType = require('os').type();
-let width;
-let height;
-if (osType == "Darwin" || osType == "Linux") {
-    width = 960;
-    height = 660;
-} else if (osType == "Windows_NT") {
-    width = 973;
-    height = 740;
-}
-
-
-if (!gotTheLock) {
-    console.log("Another instance of the screenshare is already running - this instance will quit.");
-    app.exit(0);
-    return;
-}
-
-let window;
-const zoomFactor = 1.0;
-function createWindow(){
-    window = new BrowserWindow({
-        backgroundColor: "#000000",
-        width: width,
-        height: height,
-        center: true,
-        frame: true,
-        useContentSize: true,
-        zoomFactor: zoomFactor,
-        resizable: false,
-        webPreferences: {
-            nodeIntegration: true
-        },
-        icon: __dirname + `/resources/interface.png`,
-        skipTaskbar: false,
-        title: "Screen share"
-    });
-    window.loadURL('file://' + __dirname + '/screenshareApp.html');
-    window.setMenu(null);
-    
-    window.webContents.on("did-finish-load", () => {
-        window.webContents.send('connectionInfo', JSON.stringify(connectionInfo));
-    });
-}
-
-
-// This method will be called when Electron has finished
-// initialization and is ready to create browser windows.
-app.on('ready', function() {
-    createWindow();
-    window.webContents.send('connectionInfo', JSON.stringify(connectionInfo))
-});
diff --git a/screenshare/src/styles.css b/screenshare/src/styles.css
deleted file mode 100644
index 7a6d20447d..0000000000
--- a/screenshare/src/styles.css
+++ /dev/null
@@ -1,217 +0,0 @@
-body {
-  background-color: black;
-  box-sizing: border-box;
-  font-family: "FiraSans";
-  margin: 0px 22px 10px 22px;
-  }
-
-#confirmation_screen {
-  width: 100%;
-  display: flex;
-  text-align: center;
-  justify-content: center;
-  align-items: center;
-}
-
-#confirmation_text {
-  margin-top: 65px;
-  font-size: 25px;
-  line-height: 25px;
-}
-
-#confirmation_text p {
-  margin: 0px;
-}
-
-#button_selection {
-  margin-top: 25px;
-  width: 100%;
-  display: flex;
-  text-align: center;
-  justify-content: center;
-  align-items: center;
-  flex-direction: column;
-}
-
-.button_confirmation {
-    margin: 4px;
-    cursor: pointer;
-    width: 300px;
-    height: 32px;
-    line-height: 32px;
-    text-align: center;
-    vertical-align: middle;
-    color: white
-}
-
-.grey_background {
-  background-color: #191919;
-}
-
-#no {
-    color: rgba(1, 152, 203,0.7);
-}
-
-#no:hover {
-    color: rgba(1, 152, 203,1);
-}
-
-#yes {
-    outline: solid white 2px;
-}
-
-#yes:hover {
-    background: #0198CB;
-}
-
-yes:hover + #yes_background {
-    display: block;
-}
-
-#share_pick {
-    margin-top: 60px;
-}
-
-.text_title {
-  color: white;
-}
-
-@font-face {
-  font-family: "FiraSans";
-  src: url("./resources/FiraSans-Regular.ttf");
-}
-
-#title {
-  margin-top: 21px;
-}
-
-h1 {
-  line-height: 48px;
-  font-size: 48px;
-  margin: 0px;
-}
-
-h3 {
-  line-height: 24px;
-  font-size: 24px;
-  margin: 9px 0px 0px 0px;
-}
-
-#publisher {
-  visibility: hidden;
-  width: 0px;
-  height: 0px;
-  bottom: 10px;
-  left: 10px;
-  z-index: 100;
-  border: 3px solid white;
-  border-radius: 3px;
-}
-
-#selects {
-    margin-right: 19px;
-    padding-left: 3px;
-}
-
-.screen_label {
-  max-width: 220px;
-  font-size: 25px;
-  line-height: 25px;
-  color: white;
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-
-.icon {
-  display: inline-block;
-  background: #000000;
-  width: 20px;
-  height: 20px;
-  margin-right: 15px;
-}
-
-.box {
-  height: 165px;
-  width: 265px;
-  display: inline-block;
-  margin-left: 35px;
-  margin-top: 60px;
-  cursor: pointer;
-}
-
-.box:nth-child(1) {
-    margin-top: 0 !important;
-}
-
-.box:nth-child(2) {
-    margin-top: 0 !important;
-}
-
-.box:nth-child(3) {
-    margin-top: 0 !important;
-}
-
-.box:nth-child(3n) {
-    margin-right: 0 !important;
-}
-
-.box:nth-child(3n+1) {
-    margin-left: 0 !important;
-}
-
-.heading {
-  height: 35px;
-  display: flex;
-  align-items: center;
-}
-
-.image {
-  width: 265px;
-  height: 165px;
-  max-height: 165px;
-  max-width: 265px;
-  margin: 0px;
-}
-
-.image:hover {
-  outline: solid white 3px;
-}
-
-.image_no_hover {
-  width: 265px;
-  height: 165px;
-  max-height: 165px;
-  max-width: 265px;
-}
-
-img {
-  width: 265px;
-  height: 165px;
-  margin: 0px;
-}
-
-.scrollbar {
-  float: right;
-  height: 500px;
-  width: 100%;
-  overflow-y: scroll;
-  margin-top: 40px;
-}
-
-#style-1::-webkit-scrollbar {
-  width: 9px;
-  overflow: scroll;
-  overflow-x: hidden;
-}
-
-#style-1::-webkit-scrollbar-thumb {
-  background-color: #0198CB;
-  width: 9px;
-}
-
-#style-1::-webkit-scrollbar-track {
-  -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3);
-  background-color: #848484;
-  width: 9px;
-}
diff --git a/scripts/developer/utilities/render/materialInspector.js b/scripts/developer/utilities/render/materialInspector.js
index 8a7d5ad7dd..d20f20f304 100644
--- a/scripts/developer/utilities/render/materialInspector.js
+++ b/scripts/developer/utilities/render/materialInspector.js
@@ -139,7 +139,7 @@ function setSelectedObject(id, type) {
 
 function setWindow(window) {
     if (activeWindow !== undefined) {
-        setSelectedObject(Uuid.NULL, "");
+        setSelectedObject(Uuid.NONE, "");
        // activeWindow.closed.disconnect(killWindow);
         activeWindow.fromQml.disconnect(fromQml);
         Controller.mousePressEvent.disconnect(mousePressEvent);
diff --git a/scripts/system/attachedEntitiesManager.js b/scripts/system/attachedEntitiesManager.js
index 061e27f595..4af97a41fe 100644
--- a/scripts/system/attachedEntitiesManager.js
+++ b/scripts/system/attachedEntitiesManager.js
@@ -115,7 +115,7 @@ function AttachedEntitiesManager() {
         var allowedJoints = getEntityCustomData('wearable', grabbedEntity, DEFAULT_WEARABLE_DATA).joints;
 
         var props = Entities.getEntityProperties(grabbedEntity, ["position", "parentID", "parentJointIndex"]);
-        if (props.parentID === Uuid.NULL || props.parentID === MyAvatar.sessionUUID) {
+        if (props.parentID === Uuid.NONE || props.parentID === MyAvatar.sessionUUID) {
             var bestJointName = "";
             var bestJointIndex = -1;
             var bestJointDistance = 0;
@@ -167,7 +167,7 @@ function AttachedEntitiesManager() {
                 if (updatePresets) {
                     this.updateRelativeOffsets(newEntity);
                 }
-            } else if (props.parentID != Uuid.NULL) {
+            } else if (props.parentID != Uuid.NONE) {
                 // drop the entity and set it to have no parent (not on the avatar), unless it's being equipped in a hand.
                 if (props.parentID === MyAvatar.sessionUUID &&
                     (props.parentJointIndex == MyAvatar.getJointIndex("RightHand") ||
@@ -175,7 +175,7 @@ function AttachedEntitiesManager() {
                     // this is equipped on a hand -- don't clear the parent.
                 } else {
                     var wearProps = Entities.getEntityProperties(grabbedEntity);
-                    wearProps.parentID = Uuid.NULL;
+                    wearProps.parentID = Uuid.NONE;
                     wearProps.parentJointIndex = -1;
                     delete wearProps.id;
                     delete wearProps.created;
diff --git a/scripts/system/controllers/controllerModules/equipEntity.js b/scripts/system/controllers/controllerModules/equipEntity.js
index 4b24ef17b0..06bde716c8 100644
--- a/scripts/system/controllers/controllerModules/equipEntity.js
+++ b/scripts/system/controllers/controllerModules/equipEntity.js
@@ -340,7 +340,7 @@ EquipHotspotBuddy.prototype.update = function(deltaTime, timestamp, controllerDa
             var props = controllerData.nearbyEntityPropertiesByID[hotspot.entityID];
 
             var hasParent = true;
-            if (props.parentID === Uuid.NULL) {
+            if (props.parentID === Uuid.NONE) {
                 hasParent = false;
             }
 
@@ -561,7 +561,7 @@ EquipHotspotBuddy.prototype.update = function(deltaTime, timestamp, controllerDa
 
             this.storeAttachPointInSettings();
             Entities.editEntity(this.targetEntityID, {
-                parentID: Uuid.NULL,
+                parentID: Uuid.NONE,
                 parentJointIndex: -1
             });
 
diff --git a/scripts/system/controllers/controllerModules/farActionGrabEntity.js b/scripts/system/controllers/controllerModules/farActionGrabEntity.js
index 4fabcae04d..585b2d5a61 100644
--- a/scripts/system/controllers/controllerModules/farActionGrabEntity.js
+++ b/scripts/system/controllers/controllerModules/farActionGrabEntity.js
@@ -168,7 +168,7 @@ Script.include("/~/system/libraries/controllers.js");
                 tag: "far-grab-" + MyAvatar.sessionUUID,
                 ttl: ACTION_TTL
             });
-            if (this.actionID === Uuid.NULL) {
+            if (this.actionID === Uuid.NONE) {
                 this.actionID = null;
             }
 
diff --git a/scripts/system/controllers/controllerModules/nearParentGrabOverlay.js b/scripts/system/controllers/controllerModules/nearParentGrabOverlay.js
index cb071c2dbd..a7a273f719 100644
--- a/scripts/system/controllers/controllerModules/nearParentGrabOverlay.js
+++ b/scripts/system/controllers/controllerModules/nearParentGrabOverlay.js
@@ -134,9 +134,9 @@ Script.include("/~/system/libraries/utils.js");
 
         this.endNearParentingGrabOverlay = function () {
             var previousParentID = this.previousParentID[this.grabbedThingID];
-            if ((previousParentID === Uuid.NULL || previousParentID === null) && !this.robbed) {
+            if ((previousParentID === Uuid.NONE || previousParentID === null) && !this.robbed) {
                 Entities.editEntity(this.grabbedThingID, {
-                    parentID: Uuid.NULL,
+                    parentID: Uuid.NONE,
                     parentJointIndex: -1
                 });
             } else if (!this.robbed){
diff --git a/scripts/system/controllers/controllerModules/stylusInput.js b/scripts/system/controllers/controllerModules/stylusInput.js
index 15048bca00..3b58657ad3 100644
--- a/scripts/system/controllers/controllerModules/stylusInput.js
+++ b/scripts/system/controllers/controllerModules/stylusInput.js
@@ -108,7 +108,7 @@ Script.include("/~/system/libraries/controllers.js");
             }
 
             // add the tabletScreen, if it is valid
-            if (HMD.tabletScreenID && HMD.tabletScreenID !== Uuid.NULL &&
+            if (HMD.tabletScreenID && HMD.tabletScreenID !== Uuid.NONE &&
                 Entities.getEntityProperties(HMD.tabletScreenID, ["visible"]).visible) {
                 stylusTarget = getOverlayDistance(controllerPosition, HMD.tabletScreenID);
                 if (stylusTarget) {
@@ -117,7 +117,7 @@ Script.include("/~/system/libraries/controllers.js");
             }
 
             // add the tablet home button.
-            if (HMD.homeButtonID && HMD.homeButtonID !== Uuid.NULL &&
+            if (HMD.homeButtonID && HMD.homeButtonID !== Uuid.NONE &&
                 Entities.getEntityProperties(HMD.homeButtonID, ["visible"]).visible) {
                 stylusTarget = getOverlayDistance(controllerPosition, HMD.homeButtonID);
                 if (stylusTarget) {
diff --git a/scripts/system/controllers/controllerModules/teleport.js b/scripts/system/controllers/controllerModules/teleport.js
index be45d3b70e..8e1458360d 100644
--- a/scripts/system/controllers/controllerModules/teleport.js
+++ b/scripts/system/controllers/controllerModules/teleport.js
@@ -513,7 +513,7 @@ Script.include("/~/system/libraries/controllers.js");
             if (Vec3.distance(targetXZPosition, avatarXZPosition) < MIN_PARENTING_DISTANCE) {
                 // Set play area position and rotation in world coordinates with no parenting.
                 Overlays.editOverlay(_this.playAreaOverlay, {
-                    parentID: Uuid.NULL,
+                    parentID: Uuid.NONE,
                     position: Vec3.sum(position,
                         Vec3.multiplyQbyV(sensorToWorldRotation,
                             Vec3.multiply(MyAvatar.sensorToWorldScale,
diff --git a/scripts/system/create/assets/data/createAppTooltips.json b/scripts/system/create/assets/data/createAppTooltips.json
index fcbad7b320..7c197e45df 100644
--- a/scripts/system/create/assets/data/createAppTooltips.json
+++ b/scripts/system/create/assets/data/createAppTooltips.json
@@ -228,9 +228,6 @@
     "avatarPriority": {
         "tooltip": "Alter Avatars' update priorities."
     },
-    "screenshare": {
-        "tooltip": "Enable screen-sharing within this zone"
-    },
     "modelURL": {
         "tooltip": "A mesh model from an FBX or OBJ file."
     },
@@ -573,6 +570,39 @@
     "grab.grabbable": {
         "tooltip": "If enabled, this entity will allow grabbing input and will be movable."
     },
+    "grab.grabFollowsController": {
+        "tooltip": "If enabled, grabbed entities will follow the movements of your hand controller instead of your avatar's hand."
+    },
+    "grab.grabKinematic": {
+        "tooltip": "If enabled, this grabbed entity will be updated in a kinematic manner. If disabled, it will be grabbed using a tractor action. A kinematic grab will make the item appear more tightly held but will cause it to behave poorly when interacting with dynamic entities."
+    },
+    "grab.grabDelegateToParent": {
+        "tooltip": "If enabled, when the entity is grabbed, the grab will be transferred to its parent entity if there is one. If disabled, the grab won't be transferred, so a child entity can be grabbed and moved relative to its parent."
+    },
+    "grab.equippable": {
+        "tooltip": "If enabled, this entity can be attached to the hands/controllers in a simple click. (Note: Entities can't be equipped if 'ignorePickIntersection' is set to true.)"
+    },
+    "grab.equippableLeftPosition": {
+        "tooltip": "When equipped on an avatar, this defines the 'position' of the entity relative to the 'left' hand."
+    },
+    "grab.equippableLeftRotation": {
+        "tooltip": "When equipped on an avatar, this defines the 'rotation' of the entity relative to the 'left' hand."
+    },
+    "grab.equippableRightPosition": {
+        "tooltip": "When equipped on an avatar, this defines the 'position' of the entity relative to the 'right' hand."
+    },
+    "grab.equippableRightRotation": {
+        "tooltip": "When equipped on an avatar, this defines the 'rotation' of the entity relative to the 'right' hand."
+    },
+    "grab.equippableIndicatorURL": {
+        "tooltip": "If a model URL is specified, this model will be used to indicate that an entity is equippable."
+    },
+    "grab.equippableIndicatorScale": {
+        "tooltip": "If an 'Indicator URL' is specified, this controls the scale factors for each dimension of the displayed indicator."
+    },
+    "grab.equippableIndicatorOffset": {
+        "tooltip": "If an 'Indicator URL' is specified, this controls the relative offset of the displayed indicator from the equippable entity."
+    },
     "grab.triggerable": {
         "tooltip": "If enabled, the collider on this entity is used for triggering events."
     },
@@ -597,9 +627,6 @@
     "cloneAvatarEntity": {
         "tooltip": "If enabled, then clones created from this entity will be created as avatar entities."
     },
-    "grab.grabFollowsController": {
-        "tooltip": "If enabled, grabbed entities will follow the movements of your hand controller instead of your avatar's hand."
-    },
     "canCastShadow": {
         "tooltip": "If enabled, the geometry of this entity casts shadows when a shadow-casting light source shines on it. Note: Shadows are rendered only on high-profiled computers. This setting will have no effect on computers profiled to medium or low graphics."
     },
diff --git a/scripts/system/create/edit.js b/scripts/system/create/edit.js
index 12e8629134..82cab1c76c 100644
--- a/scripts/system/create/edit.js
+++ b/scripts/system/create/edit.js
@@ -106,7 +106,7 @@
         } else if (properties.type === "Zone") {
             return { imageURL: ZONE_URL };
         } else if (properties.type === "Material") {
-            if (properties.parentID !== Uuid.NULL && properties.name !== "MATERIAL_" + entityShapeVisualizerSessionName) {
+            if (properties.parentID !== Uuid.NONE && properties.name !== "MATERIAL_" + entityShapeVisualizerSessionName) {
                 return { imageURL: MATERIAL_URL };
             } else {
                 return { imageURL: "" };
@@ -417,8 +417,7 @@
             },
             shapeType: "box",
             bloomMode: "inherit",
-            avatarPriority: "inherit",
-            screenshare: "inherit",
+            avatarPriority: "inherit"
         },
         Model: {
             collisionShape: "none",
@@ -1858,7 +1857,7 @@
             }
             selectedEntities.forEach(function (id, index) {
                 var parentId = Entities.getEntityProperties(id, ["parentID"]).parentID;
-                if (parentId !== null && parentId.length > 0 && parentId !== Uuid.NULL) {
+                if (parentId !== null && parentId.length > 0 && parentId !== Uuid.NONE) {
                     parentCheck = true;
                 }
                 Entities.editEntity(id, {parentID: null});
@@ -2890,7 +2889,7 @@
             } else if (data.type === "materialTargetRequest") {
                 var parentModelData;
                 var properties = Entities.getEntityProperties(data.entityID, ["type", "parentID"]);
-                if (properties.type === "Material" && properties.parentID !== Uuid.NULL) {
+                if (properties.type === "Material" && properties.parentID !== Uuid.NONE) {
                     var parentType = Entities.getEntityProperties(properties.parentID, ["type"]).type;
                     if (parentType === "Model" || Entities.getNestableType(properties.parentID) === "avatar") {
                         parentModelData = Graphics.getModel(properties.parentID);
@@ -3313,7 +3312,7 @@
         var state = "NONE";
         var properties = Entities.getEntityProperties(id, ["parentID"]);
         var children = createApp.getDomainOnlyChildrenIDs(id);
-        if (properties.parentID !== Uuid.NULL) {
+        if (properties.parentID !== Uuid.NONE) {
             if (children.length > 0) {
                 state = "PARENT_CHILDREN";
             } else {
diff --git a/scripts/system/create/entityProperties/html/js/entityProperties.js b/scripts/system/create/entityProperties/html/js/entityProperties.js
index 8eab673e31..408a3771cc 100644
--- a/scripts/system/create/entityProperties/html/js/entityProperties.js
+++ b/scripts/system/create/entityProperties/html/js/entityProperties.js
@@ -760,12 +760,6 @@ const GROUPS = [
                 type: "dropdown",
                 options: { inherit: "Inherit", crowd: "Crowd", hero: "Hero" },
                 propertyID: "avatarPriority",
-            },
-            {
-                label: "Screen-share",
-                type: "dropdown",
-                options: { inherit: "Inherit", disabled: "Off", enabled: "On" },
-                propertyID: "screenshare",
             }
         ]
     },
@@ -1819,11 +1813,6 @@ const GROUPS = [
         id: "behavior",
         label: "BEHAVIOR",
         properties: [
-            {
-                label: "Grabbable",
-                type: "bool",
-                propertyID: "grab.grabbable",
-            },
             {
                 label: "Cloneable",
                 type: "bool",
@@ -1856,16 +1845,6 @@ const GROUPS = [
                 propertyID: "cloneAvatarEntity",
                 showPropertyRule: { "cloneable": "true" },
             },
-            {
-                label: "Triggerable",
-                type: "bool",
-                propertyID: "grab.triggerable",
-            },
-            {
-                label: "Follow Controller",
-                type: "bool",
-                propertyID: "grab.grabFollowsController",
-            },
             {
                 label: "Cast Shadows",
                 type: "bool",
@@ -1890,6 +1869,118 @@ const GROUPS = [
             }
         ]
     },
+    {
+        id: "grabAndEquip",
+        label: "GRAB AND EQUIP",
+        properties: [
+            {
+                label: "Grabbable",
+                type: "bool",
+                propertyID: "grab.grabbable",
+            },
+            {
+                label: "Follow Controller",
+                type: "bool",
+                propertyID: "grab.grabFollowsController",
+                showPropertyRule: { "grab.grabbable": "true" },
+            },
+            {
+                label: "Kinematic Grab",
+                type: "bool",
+                propertyID: "grab.grabKinematic",
+                showPropertyRule: { "grab.grabbable": "true" },
+            },
+            {
+                label: "Delegate To Parent",
+                type: "bool",
+                propertyID: "grab.grabDelegateToParent",
+                showPropertyRule: { "grab.grabbable": "true" },
+            },
+            {
+                label: "Triggerable",
+                type: "bool",
+                propertyID: "grab.triggerable",
+            },
+            {
+                label: "Equippable",
+                type: "bool",
+                propertyID: "grab.equippable",
+            },
+            {
+                label: "Left Position",
+                type: "vec3",
+                vec3Type: "xyz",
+                subLabels: [ "x", "y", "z" ],
+                step: 0.0025,
+                decimals: 4,
+                unit: "m",
+                propertyID: "grab.equippableLeftPosition",
+                showPropertyRule: { "grab.equippable": "true" },
+            },
+            {
+                label: "Left Rotation",
+                type: "vec3",
+                vec3Type: "pyr",
+                step: 0.1,
+                decimals: 4,
+                subLabels: [ "x", "y", "z" ],
+                unit: "deg",
+                propertyID: "grab.equippableLeftRotation",
+                showPropertyRule: { "grab.equippable": "true" },
+            },
+            {
+                label: "Right Position",
+                type: "vec3",
+                vec3Type: "xyz",
+                subLabels: [ "x", "y", "z" ],
+                step: 0.0025,
+                decimals: 4,
+                unit: "m",
+                propertyID: "grab.equippableRightPosition",
+                showPropertyRule: { "grab.equippable": "true" },
+            },
+            {
+                label: "Right Rotation",
+                type: "vec3",
+                vec3Type: "pyr",
+                step: 0.1,
+                decimals: 4,
+                subLabels: [ "x", "y", "z" ],
+                unit: "deg",
+                propertyID: "grab.equippableRightRotation",
+                showPropertyRule: { "grab.equippable": "true" },
+            },
+            {
+                label: "Indicator Model URL",
+                type: "string",
+                propertyID: "grab.equippableIndicatorURL",
+                placeholder: "URL",
+                showPropertyRule: { "grab.equippable": "true" },
+            },
+            {
+                label: "Indicator Scale",
+                type: "vec3",
+                vec3Type: "xyz",
+                subLabels: [ "x", "y", "z" ],
+                step: 0.0025,
+                decimals: 4,
+                unit: "scale",
+                propertyID: "grab.equippableIndicatorScale",
+                showPropertyRule: { "grab.equippable": "true" },
+            },
+            {
+                label: "Indicator Offset",
+                type: "vec3",
+                vec3Type: "xyz",
+                subLabels: [ "x", "y", "z" ],
+                step: 0.005,
+                decimals: 4,
+                unit: "m",
+                propertyID: "grab.equippableIndicatorOffset",
+                showPropertyRule: { "grab.equippable": "true" },
+            },
+        ]
+    },
     {
         id: "scripts",
         label: "SCRIPTS",
@@ -2068,25 +2159,25 @@ const GROUPS = [
 ];
 
 const GROUPS_PER_TYPE = {
-  None: [ 'base', 'spatial', 'behavior', 'scripts', 'collision', 'physics' ],
-  Shape: [ 'base', 'shape', 'spatial', 'behavior', 'scripts', 'collision', 'physics' ],
-  Text: [ 'base', 'text', 'spatial', 'behavior', 'scripts', 'collision', 'physics' ],
+  None: [ 'base', 'spatial', 'behavior', 'grabAndEquip', 'scripts', 'collision', 'physics' ],
+  Shape: [ 'base', 'shape', 'spatial', 'behavior', 'grabAndEquip', 'scripts', 'collision', 'physics' ],
+  Text: [ 'base', 'text', 'spatial', 'behavior', 'grabAndEquip', 'scripts', 'collision', 'physics' ],
   Zone: [ 'base', 'zone', 'zone_key_light', 'zone_skybox', 'zone_ambient_light', 'zone_haze',
             'zone_bloom', 'zone_tonemapping', 'zone_ambient_occlusion', 'zone_avatar_priority',
-            'zone_audio', 'spatial', 'behavior', 'scripts', 'physics' ],
-  Model: [ 'base', 'model', 'spatial', 'behavior', 'scripts', 'collision', 'physics' ],
-  Image: [ 'base', 'image', 'spatial', 'behavior', 'scripts', 'collision', 'physics' ],
-  Web: [ 'base', 'web', 'spatial', 'behavior', 'scripts', 'collision', 'physics' ],
-  Light: [ 'base', 'light', 'spatial', 'behavior', 'scripts', 'collision', 'physics' ],
-  Material: [ 'base', 'material', 'spatial', 'behavior', 'scripts', 'physics' ],
+            'zone_audio', 'spatial', 'behavior', 'grabAndEquip', 'scripts', 'physics' ],
+  Model: [ 'base', 'model', 'spatial', 'behavior', 'grabAndEquip', 'scripts', 'collision', 'physics' ],
+  Image: [ 'base', 'image', 'spatial', 'behavior', 'grabAndEquip', 'scripts', 'collision', 'physics' ],
+  Web: [ 'base', 'web', 'spatial', 'behavior', 'grabAndEquip', 'scripts', 'collision', 'physics' ],
+  Light: [ 'base', 'light', 'spatial', 'behavior', 'grabAndEquip', 'scripts', 'collision', 'physics' ],
+  Material: [ 'base', 'material', 'spatial', 'behavior', 'grabAndEquip', 'scripts', 'physics' ],
   ParticleEffect: [ 'base', 'particles', 'particles_emit', 'particles_size', 'particles_color', 
-                    'particles_behavior', 'particles_constraints', 'spatial', 'behavior', 'scripts', 'physics' ],
-  ProceduralParticleEffect: [ 'base', 'particles_procedural', 'spatial', 'behavior', 'scripts', 'physics' ],
-  PolyLine: [ 'base', 'spatial', 'behavior', 'scripts', 'collision', 'physics' ],
-  PolyVox: [ 'base', 'polyvox', 'spatial', 'behavior', 'scripts', 'collision', 'physics' ],
-  Grid: [ 'base', 'grid', 'spatial', 'behavior', 'scripts', 'physics' ],
-  Sound: [ 'base', 'sound', 'spatial', 'behavior', 'scripts', 'physics' ],
-  Multiple: [ 'base', 'spatial', 'behavior', 'scripts', 'collision', 'physics' ],
+                    'particles_behavior', 'particles_constraints', 'spatial', 'behavior', 'grabAndEquip', 'scripts', 'physics' ],
+  ProceduralParticleEffect: [ 'base', 'particles_procedural', 'spatial', 'behavior', 'grabAndEquip', 'scripts', 'physics' ],
+  PolyLine: [ 'base', 'spatial', 'behavior', 'grabAndEquip', 'scripts', 'collision', 'physics' ],
+  PolyVox: [ 'base', 'polyvox', 'spatial', 'behavior', 'grabAndEquip', 'scripts', 'collision', 'physics' ],
+  Grid: [ 'base', 'grid', 'spatial', 'behavior', 'grabAndEquip', 'scripts', 'physics' ],
+  Sound: [ 'base', 'sound', 'spatial', 'behavior', 'grabAndEquip', 'scripts', 'physics' ],
+  Multiple: [ 'base', 'spatial', 'behavior', 'grabAndEquip', 'scripts', 'collision', 'physics' ],
 };
 
 const EDITOR_TIMEOUT_DURATION = 1500;
diff --git a/scripts/system/create/entityProperties/html/tabs/grabAndEquip.png b/scripts/system/create/entityProperties/html/tabs/grabAndEquip.png
new file mode 100644
index 0000000000..2cd1c75f23
Binary files /dev/null and b/scripts/system/create/entityProperties/html/tabs/grabAndEquip.png differ
diff --git a/scripts/system/create/entitySelectionTool/entitySelectionTool.js b/scripts/system/create/entitySelectionTool/entitySelectionTool.js
index 574f91eba7..42a4f0f247 100644
--- a/scripts/system/create/entitySelectionTool/entitySelectionTool.js
+++ b/scripts/system/create/entitySelectionTool/entitySelectionTool.js
@@ -428,7 +428,7 @@ SelectionManager = (function() {
                     entityID: newEntityID,
                     properties: properties
                 });
-                if (properties.parentID !== Uuid.NULL) {
+                if (properties.parentID !== Uuid.NONE) {
                     duplicatedChildrenWithOldParents[newEntityID] = properties.parentID;
                 }
                 originalEntityToNewEntityID[originalEntityID] = newEntityID;
@@ -480,7 +480,7 @@ SelectionManager = (function() {
                     entityID: newEntityID,
                     properties: properties
                 });
-                if (properties.parentID !== Uuid.NULL) {
+                if (properties.parentID !== Uuid.NONE) {
                     createdChildrenWithOldParents[newEntityID] = properties.parentID;
                 }
                 originalEntityToNewEntityID[properties.id] = newEntityID;
@@ -755,7 +755,7 @@ SelectionManager = (function() {
             that.selections = [];
             for (var i = 0; i < currentSelection.length; i++) {
                 var properties = Entities.getEntityProperties(currentSelection[i], ['parentID']);
-                if (properties.parentID !== Uuid.NULL) {
+                if (properties.parentID !== Uuid.NONE) {
                     that.selections.push(properties.parentID);
                 }
             }
@@ -772,7 +772,7 @@ SelectionManager = (function() {
             that.selections = [];
             for (var i = 0; i < currentSelection.length; i++) {
                 var topParentId = getTopParent(currentSelection[i]);
-                if (topParentId !== Uuid.NULL) {
+                if (topParentId !== Uuid.NONE) {
                     that.selections.push(topParentId);
                 }
             }
@@ -784,9 +784,9 @@ SelectionManager = (function() {
     };
 
     function getTopParent(id) {
-        var topParentId = Uuid.NULL;
+        var topParentId = Uuid.NONE;
         var properties = Entities.getEntityProperties(id, ['parentID']);
-        if (properties.parentID === Uuid.NULL) {
+        if (properties.parentID === Uuid.NONE) {
             topParentId = id;
         } else {
             topParentId = getTopParent(properties.parentID);
@@ -1567,7 +1567,7 @@ SelectionDisplay = (function() {
         } else if (toolEntity === handleTranslateZCylinder) {
             return handleTranslateZCone;
         }
-        return Uuid.NULL;
+        return Uuid.NONE;
     };
     
     that.updateHighlight = function(event) {
diff --git a/scripts/system/libraries/controllerDispatcherUtils.js b/scripts/system/libraries/controllerDispatcherUtils.js
index f331c147e0..705991d97d 100644
--- a/scripts/system/libraries/controllerDispatcherUtils.js
+++ b/scripts/system/libraries/controllerDispatcherUtils.js
@@ -317,7 +317,7 @@ var isAnothersAvatarEntity = function (iaaeProps) {
 };
 
 var isAnothersChildEntity = function (iaceProps) {
-    while (iaceProps.parentID && iaceProps.parentID !== Uuid.NULL) {
+    while (iaceProps.parentID && iaceProps.parentID !== Uuid.NONE) {
         if (Entities.getNestableType(iaceProps.parentID) == "avatar") {
             if (iaceProps.parentID == MyAvatar.SELF_ID || iaceProps.parentID == MyAvatar.sessionUUID) {
                 return false; // not another's, it's mine.
@@ -452,7 +452,7 @@ var ensureDynamic = function (entityID) {
     // if we distance hold something and keep it very still before releasing it, it ends up
     // non-dynamic in bullet.  If it's too still, give it a little bounce so it will fall.
     var edProps = Entities.getEntityProperties(entityID, ["velocity", "dynamic", "parentID"]);
-    if (edProps.dynamic && edProps.parentID === Uuid.NULL) {
+    if (edProps.dynamic && edProps.parentID === Uuid.NONE) {
         var velocity = edProps.velocity;
         if (Vec3.length(velocity) < 0.05) { // see EntityMotionState.cpp DYNAMIC_LINEAR_VELOCITY_THRESHOLD
             velocity = { x: 0.0, y: 0.2, z: 0.0 };
@@ -464,7 +464,7 @@ var ensureDynamic = function (entityID) {
 var findGrabbableGroupParent = function (controllerData, targetProps) {
     while (targetProps.grab.grabDelegateToParent &&
            targetProps.parentID &&
-           targetProps.parentID !== Uuid.NULL &&
+           targetProps.parentID !== Uuid.NONE &&
            Entities.getNestableType(targetProps.parentID) == "entity") {
         var parentProps = Entities.getEntityProperties(targetProps.parentID, DISPATCHER_PROPERTIES);
         if (!parentProps) {
@@ -484,7 +484,7 @@ var findGrabbableGroupParent = function (controllerData, targetProps) {
 var getEntityParents = function(targetProps) {
     var parentProperties = [];
     while (targetProps.parentID &&
-           targetProps.parentID !== Uuid.NULL &&
+           targetProps.parentID !== Uuid.NONE &&
            Entities.getNestableType(targetProps.parentID) == "entity") {
         var parentProps = Entities.getEntityProperties(targetProps.parentID, DISPATCHER_PROPERTIES);
         if (!parentProps) {
diff --git a/scripts/system/libraries/touchEventUtils.js b/scripts/system/libraries/touchEventUtils.js
index bdee5cf5dc..e9ab4f3770 100644
--- a/scripts/system/libraries/touchEventUtils.js
+++ b/scripts/system/libraries/touchEventUtils.js
@@ -13,21 +13,21 @@
 
 var controllerDispatcher = Script.require("/~/system/libraries/controllerDispatcherUtils.js");
 function touchTargetHasKeyboardFocus(touchTarget) {
-    if (touchTarget.entityID && touchTarget.entityID !== Uuid.NULL) {
+    if (touchTarget.entityID && touchTarget.entityID !== Uuid.NONE) {
         return Entities.keyboardFocusEntity === touchTarget.entityID;
-    } else if (touchTarget.overlayID && touchTarget.overlayID !== Uuid.NULL) {
+    } else if (touchTarget.overlayID && touchTarget.overlayID !== Uuid.NONE) {
         return Overlays.keyboardFocusOverlay === touchTarget.overlayID;
     }
 }
 
 function setKeyboardFocusOnTouchTarget(touchTarget) {
-    if (touchTarget.entityID && touchTarget.entityID !== Uuid.NULL &&
+    if (touchTarget.entityID && touchTarget.entityID !== Uuid.NONE &&
         Entities.wantsHandControllerPointerEvents(touchTarget.entityID)) {
-        Overlays.keyboardFocusOverlay = Uuid.NULL;
+        Overlays.keyboardFocusOverlay = Uuid.NONE;
         Entities.keyboardFocusEntity = touchTarget.entityID;
-    } else if (touchTarget.overlayID && touchTarget.overlayID !== Uuid.NULL) {
+    } else if (touchTarget.overlayID && touchTarget.overlayID !== Uuid.NONE) {
         Overlays.keyboardFocusOverlay = touchTarget.overlayID;
-        Entities.keyboardFocusEntity = Uuid.NULL;
+        Entities.keyboardFocusEntity = Uuid.NONE;
     }
 }
 
@@ -42,9 +42,9 @@ function sendHoverEnterEventToTouchTarget(hand, touchTarget) {
         button: "None"
     };
 
-    if (touchTarget.entityID && touchTarget.entityID !== Uuid.NULL) {
+    if (touchTarget.entityID && touchTarget.entityID !== Uuid.NONE) {
         Entities.sendHoverEnterEntity(touchTarget.entityID, pointerEvent);
-    } else if (touchTarget.overlayID && touchTarget.overlayID !== Uuid.NULL) {
+    } else if (touchTarget.overlayID && touchTarget.overlayID !== Uuid.NONE) {
         Overlays.sendHoverEnterOverlay(touchTarget.overlayID, pointerEvent);
     }
 }
@@ -60,10 +60,10 @@ function sendHoverOverEventToTouchTarget(hand, touchTarget) {
         button: "None"
     };
 
-    if (touchTarget.entityID && touchTarget.entityID !== Uuid.NULL) {
+    if (touchTarget.entityID && touchTarget.entityID !== Uuid.NONE) {
         Entities.sendMouseMoveOnEntity(touchTarget.entityID, pointerEvent);
         Entities.sendHoverOverEntity(touchTarget.entityID, pointerEvent);
-    } else if (touchTarget.overlayID && touchTarget.overlayID !== Uuid.NULL) {
+    } else if (touchTarget.overlayID && touchTarget.overlayID !== Uuid.NONE) {
         Overlays.sendMouseMoveOnOverlay(touchTarget.overlayID, pointerEvent);
         Overlays.sendHoverOverOverlay(touchTarget.overlayID, pointerEvent);
     }
@@ -81,10 +81,10 @@ function sendTouchStartEventToTouchTarget(hand, touchTarget) {
         isPrimaryHeld: true
     };
 
-    if (touchTarget.entityID && touchTarget.entityID !== Uuid.NULL) {
+    if (touchTarget.entityID && touchTarget.entityID !== Uuid.NONE) {
         Entities.sendMousePressOnEntity(touchTarget.entityID, pointerEvent);
         Entities.sendClickDownOnEntity(touchTarget.entityID, pointerEvent);
-    } else if (touchTarget.overlayID && touchTarget.overlayID !== Uuid.NULL) {
+    } else if (touchTarget.overlayID && touchTarget.overlayID !== Uuid.NONE) {
         Overlays.sendMousePressOnOverlay(touchTarget.overlayID, pointerEvent);
     }
 }
@@ -100,11 +100,11 @@ function sendTouchEndEventToTouchTarget(hand, touchTarget) {
         button: "Primary"
     };
 
-    if (touchTarget.entityID && touchTarget.entityID !== Uuid.NULL) {
+    if (touchTarget.entityID && touchTarget.entityID !== Uuid.NONE) {
         Entities.sendMouseReleaseOnEntity(touchTarget.entityID, pointerEvent);
         Entities.sendClickReleaseOnEntity(touchTarget.entityID, pointerEvent);
         Entities.sendHoverLeaveEntity(touchTarget.entityID, pointerEvent);
-    } else if (touchTarget.overlayID && touchTarget.overlayID !== Uuid.NULL) {
+    } else if (touchTarget.overlayID && touchTarget.overlayID !== Uuid.NONE) {
         Overlays.sendMouseReleaseOnOverlay(touchTarget.overlayID, pointerEvent);
     }
 }
@@ -121,10 +121,10 @@ function sendTouchMoveEventToTouchTarget(hand, touchTarget) {
         isPrimaryHeld: true
     };
 
-    if (touchTarget.entityID && touchTarget.entityID !== Uuid.NULL) {
+    if (touchTarget.entityID && touchTarget.entityID !== Uuid.NONE) {
         Entities.sendMouseMoveOnEntity(touchTarget.entityID, pointerEvent);
         Entities.sendHoldingClickOnEntity(touchTarget.entityID, pointerEvent);
-    } else if (touchTarget.overlayID && touchTarget.overlayID !== Uuid.NULL) {
+    } else if (touchTarget.overlayID && touchTarget.overlayID !== Uuid.NONE) {
         Overlays.sendMouseMoveOnOverlay(touchTarget.overlayID, pointerEvent);
     }
 }
diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js
index acd0d96e9b..f75cbe2346 100644
--- a/scripts/system/miniTablet.js
+++ b/scripts/system/miniTablet.js
@@ -442,7 +442,7 @@
 
         function release() {
             Entities.editEntity(miniOverlay, {
-                "parentID": Uuid.NULL, // Release hold so that hand can grab tablet proper.
+                "parentID": Uuid.NONE, // Release hold so that hand can grab tablet proper.
                 "grab": {
                     "grabbable": false
                 }
diff --git a/scripts/system/nameTag.js b/scripts/system/nameTag.js
index 147da25779..e09f19f90b 100644
--- a/scripts/system/nameTag.js
+++ b/scripts/system/nameTag.js
@@ -23,7 +23,7 @@ const SIZE_Y = 0.075;
 const LETTER_OFFSET = 0.03; // arbitrary value to dynamically change width, could be more accurate by detecting characters
 const LINE_HEIGHT = 0.05;
 
-var nameTagEntityID = Uuid.NULL;
+var nameTagEntityID = Uuid.NONE;
 var lastCheckForEntity = 0;
 
 // create the name tag entity after a brief delay
@@ -61,9 +61,9 @@ function updateNameTag() {
 };
 
 function deleteNameTag() {
-    if(nameTagEntityID !== Uuid.NULL) {
+    if(nameTagEntityID !== Uuid.NONE) {
         Entities.deleteEntity(nameTagEntityID);
-        nameTagEntityID = Uuid.NULL;
+        nameTagEntityID = Uuid.NONE;
     }
 }
 
@@ -84,7 +84,7 @@ function cleanup() {
 Script.update.connect(update);
 function update() {
     // if no entity we return
-    if(nameTagEntityID == Uuid.NULL) {
+    if(nameTagEntityID == Uuid.NONE) {
         return;
     }
 
diff --git a/scripts/system/notifications.js b/scripts/system/notifications.js
index fec9fb2341..2f6bca6878 100644
--- a/scripts/system/notifications.js
+++ b/scripts/system/notifications.js
@@ -47,7 +47,7 @@
     var HMD_UI_SCALE_FACTOR = 1.0; //This define the size of all the notification system in HMD.
     var hmdPanelLocalPosition = {"x": 0.3, "y": 0.25, "z": -1.5};
     var hmdPanelLocalRotation = Quat.fromVec3Degrees({"x": 0, "y": -3, "z": 0});
-    var mainHMDnotificationContainerID = Uuid.NULL;
+    var mainHMDnotificationContainerID = Uuid.NONE;
     var CAMERA_MATRIX_INDEX = -7;
     
     //HMD LOCAL ENTITY PROPERTIES
@@ -128,7 +128,7 @@
                         "unlit": true,
                         "renderLayer": "hud"
                     };
-                    if (notifications[i].entityID === Uuid.NULL){
+                    if (notifications[i].entityID === Uuid.NONE){
                         properties.text =  notifications[i].dataText;
                         notifications[i].entityID = Entities.addEntity(properties, "local");
                     } else {
@@ -149,7 +149,7 @@
                             "alpha": alpha,
                             "renderLayer": "hud"
                         };                        
-                        if (notifications[i].imageEntityID === Uuid.NULL){
+                        if (notifications[i].imageEntityID === Uuid.NONE){
                             properties.imageURL = notifications[i].dataImage.path;
                             notifications[i].imageEntityID = Entities.addEntity(properties, "local");
                         } else {
@@ -174,7 +174,7 @@
                         "leftMargin": overlayLeftMargin,
                         "font": {"size": overlayFontSize}
                     };
-                    if (notifications[i].overlayID === Uuid.NULL){
+                    if (notifications[i].overlayID === Uuid.NONE){
                         properties.text =  notifications[i].dataText;
                         notifications[i].overlayID = Overlays.addOverlay("text", properties);
                     } else {
@@ -192,7 +192,7 @@
                             "visible": true,
                             "alpha": alpha
                         };
-                        if (notifications[i].imageOverlayID === Uuid.NULL){
+                        if (notifications[i].imageOverlayID === Uuid.NONE){
                             properties.imageURL = notifications[i].dataImage.path;
                             notifications[i].imageOverlayID = Overlays.addOverlay("image", properties);
                         } else {
@@ -214,26 +214,26 @@
     }
     
     function deleteSpecificNotification(indexNotification) {
-        if (notifications[indexNotification].entityID !== Uuid.NULL){
+        if (notifications[indexNotification].entityID !== Uuid.NONE){
             Entities.deleteEntity(notifications[indexNotification].entityID);
-            notifications[indexNotification].entityID = Uuid.NULL;
+            notifications[indexNotification].entityID = Uuid.NONE;
         }
-        if (notifications[indexNotification].overlayID !== Uuid.NULL){
+        if (notifications[indexNotification].overlayID !== Uuid.NONE){
             Overlays.deleteOverlay(notifications[indexNotification].overlayID);
-            notifications[indexNotification].overlayID = Uuid.NULL;
+            notifications[indexNotification].overlayID = Uuid.NONE;
         }
-        if (notifications[indexNotification].imageEntityID !== Uuid.NULL){
+        if (notifications[indexNotification].imageEntityID !== Uuid.NONE){
             Entities.deleteEntity(notifications[indexNotification].imageEntityID);
-            notifications[indexNotification].imageEntityID = Uuid.NULL;
+            notifications[indexNotification].imageEntityID = Uuid.NONE;
         }
-        if (notifications[indexNotification].imageOverlayID !== Uuid.NULL){
+        if (notifications[indexNotification].imageOverlayID !== Uuid.NONE){
             Overlays.deleteOverlay(notifications[indexNotification].imageOverlayID);
-            notifications[indexNotification].imageOverlayID = Uuid.NULL;
+            notifications[indexNotification].imageOverlayID = Uuid.NONE;
         }
     }
     
     function createMainHMDnotificationContainer() {
-        if (mainHMDnotificationContainerID === Uuid.NULL) {
+        if (mainHMDnotificationContainerID === Uuid.NONE) {
             var properties = {
                 "type": "Shape",
                 "shape": "Cube",
@@ -249,9 +249,9 @@
     }
     
     function deleteMainHMDnotificationContainer() {
-        if (mainHMDnotificationContainerID !== Uuid.NULL) {
+        if (mainHMDnotificationContainerID !== Uuid.NONE) {
             Entities.deleteEntity(mainHMDnotificationContainerID);
-            mainHMDnotificationContainerID = Uuid.NULL;
+            mainHMDnotificationContainerID = Uuid.NONE;
         }
     }    
     //UTILITY FUNCTIONS
@@ -288,10 +288,10 @@
             "dataText": dataText,
             "dataImage": dataImage,
             "timestamp": d.getTime(),
-            "entityID": Uuid.NULL,
-            "imageEntityID": Uuid.NULL,
-            "overlayID": Uuid.NULL,
-            "imageOverlayID": Uuid.NULL
+            "entityID": Uuid.NONE,
+            "imageEntityID": Uuid.NONE,
+            "overlayID": Uuid.NONE,
+            "imageOverlayID": Uuid.NONE
         };
         notifications.push(notification);
         newEventDetected = true;
diff --git a/scripts/system/places/places.html b/scripts/system/places/places.html
index 980d8f0f1f..fda67f4066 100644
--- a/scripts/system/places/places.html
+++ b/scripts/system/places/places.html
@@ -150,7 +150,11 @@
                 if (message.channel === channel && message.action === "CURRENT_LOCATION") {
                     currentLocation = message.data;
                     displayCurrentLocation();
-                }                
+                }
+                if (message.channel === channel && message.action === "MATURITY_FILTER") {
+                    maturityFilter = message.filter;
+                    displayMaturityFilter();
+                }
             });
             
             var goSignal = {
@@ -600,8 +604,16 @@
                     maturityFilter = arrayRemove(maturityFilter, targeted);
                 }
                 loadRecordsUpTo = NUMBER_OF_RECORDS_PER_LOAD;
+
+                var messageSent = {
+                    "channel": channel,
+                    "action": "SET_MATURITY_FILTER",
+                    "filter": maturityFilter
+                    };
+                EventBridge.emitWebEvent(JSON.stringify(messageSent));
+
                 displayMaturityFilter();
-                generateContent();            
+                generateContent();
             }
 
             function filterSearchField(targeted) {
diff --git a/scripts/system/places/places.js b/scripts/system/places/places.js
index b9cd49bb1f..fa22d536b7 100644
--- a/scripts/system/places/places.js
+++ b/scripts/system/places/places.js
@@ -19,6 +19,8 @@
     var metaverseServers = [];
     var SETTING_METAVERSE_TO_FETCH = "placesAppMetaverseToFetch";
     var SETTING_PINNED_METAVERSE = "placesAppPinnedMetaverse";
+    var SETTING_MATURITY_FILTER = "placesAppMaturityFilter";
+    var DEFAULT_MATURITY = ["adult", "mature", "teen", "everyone", "unrated"];
     var REQUEST_TIMEOUT = 10000; //10 seconds
 
     var httpRequest = null;
@@ -78,8 +80,8 @@
             if (messageObj.action === "READY_FOR_CONTENT" && (n - timestamp) > INTERCALL_DELAY) {
                 d = new Date();
                 timestamp = d.getTime();
+                sendPersistedMaturityFilter();
                 transmitPortalList();
-
                 sendCurrentLocationToUI();
 
             } else if (messageObj.action === "TELEPORT" && (n - timestamp) > INTERCALL_DELAY) {
@@ -88,17 +90,23 @@
 
                 if (messageObj.address.length > 0) {
                     Window.location = messageObj.address;
-                }                
+                }
                 
             } else if (messageObj.action === "GO_HOME" && (n - timestamp) > INTERCALL_DELAY) {
+                d = new Date();
+                timestamp = d.getTime();
                 if (LocationBookmarks.getHomeLocationAddress()) {
                     location.handleLookupString(LocationBookmarks.getHomeLocationAddress());
                 } else {
                     Window.location = "file:///~/serverless/tutorial.json";
                 }                
             } else if (messageObj.action === "GO_BACK" && (n - timestamp) > INTERCALL_DELAY) {
+                d = new Date();
+                timestamp = d.getTime();
                 location.goBack();
             } else if (messageObj.action === "GO_FORWARD" && (n - timestamp) > INTERCALL_DELAY) {
+                d = new Date();
+                timestamp = d.getTime();
                 location.goForward();
             } else if (messageObj.action === "PIN_META" && (n - timestamp) > INTERCALL_DELAY) {
                 d = new Date();
@@ -122,6 +130,10 @@
                 }
                 metaverseServers.push(newMs);
                 savePinnedMetaverseSetting();
+            } else if (messageObj.action === "SET_MATURITY_FILTER" && (n - timestamp) > INTERCALL_DELAY) {
+                d = new Date();
+                timestamp = d.getTime();
+                Settings.setValue(SETTING_MATURITY_FILTER, messageObj.filter);
             }
         }
     }
@@ -224,6 +236,15 @@
         
     };
 
+    function sendPersistedMaturityFilter() {
+        var messageSent = {
+            "channel": channel,
+            "action": "MATURITY_FILTER",
+            "filter": Settings.getValue(SETTING_MATURITY_FILTER, DEFAULT_MATURITY)
+        };
+        tablet.emitScriptEvent(messageSent);
+    }
+
     function getFederationData() {
         /*
         //If federation.json is got from the Metaverse Server (not implemented yet)