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)