From 436bed3a692dd371329dbbc9f6b7ffd3da293ce5 Mon Sep 17 00:00:00 2001
From: David Rowe <david@ctrlaltstudio.com>
Date: Sat, 24 Oct 2020 16:00:39 +1300
Subject: [PATCH 01/62] Increase HUD overlay radius

---
 interface/src/ui/OverlayConductor.cpp                      | 2 ++
 .../src/display-plugins/CompositorHelper.cpp               | 7 +++----
 .../display-plugins/src/display-plugins/CompositorHelper.h | 1 +
 3 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/interface/src/ui/OverlayConductor.cpp b/interface/src/ui/OverlayConductor.cpp
index 8edd8ee3a5..a359b8d4c9 100644
--- a/interface/src/ui/OverlayConductor.cpp
+++ b/interface/src/ui/OverlayConductor.cpp
@@ -70,6 +70,8 @@ bool OverlayConductor::updateAvatarIsAtRest() {
 void OverlayConductor::centerUI() {
     // place the overlay at the current hmd position in sensor space
     auto camMat = cancelOutRollAndPitch(qApp->getHMDSensorPose());
+    // Set its radius.
+    camMat = glm::scale(camMat, glm::vec3(HUD_RADIUS));
     qApp->getApplicationCompositor().setModelTransform(Transform(camMat));
 }
 
diff --git a/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp b/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp
index 9b6946bbcc..dc841d6308 100644
--- a/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp
+++ b/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp
@@ -384,9 +384,9 @@ bool CompositorHelper::calculateRayUICollisionPoint(const glm::vec3& position, c
     glm::vec3 localPosition = transformPoint(worldToUi, position);
     glm::vec3 localDirection = glm::normalize(transformVectorFast(worldToUi, direction));
 
-    const float UI_RADIUS = 1.0f;
+    const float UNIT_RADIUS = 1.0f;
     float intersectionDistance;
-    if (raySphereIntersect(localDirection, localPosition, UI_RADIUS, &intersectionDistance)) {
+    if (raySphereIntersect(localDirection, localPosition, UNIT_RADIUS, &intersectionDistance)) {
         result = transformPoint(uiToWorld, localPosition + localDirection * intersectionDistance);
 #ifdef WANT_DEBUG
         DebugDraw::getInstance().drawRay(position, result, glm::vec4(0.0f, 1.0f, 0.0f, 1.0f));
@@ -407,9 +407,8 @@ bool CompositorHelper::calculateParabolaUICollisionPoint(const glm::vec3& origin
     glm::vec3 localVelocity = glm::normalize(transformVectorFast(worldToUi, velocity));
     glm::vec3 localAcceleration = glm::normalize(transformVectorFast(worldToUi, acceleration));
 
-    const float UI_RADIUS = 1.0f;
     float intersectionDistance;
-    if (findParabolaSphereIntersection(localOrigin, localVelocity, localAcceleration, glm::vec3(0.0f), UI_RADIUS, intersectionDistance)) {
+    if (findParabolaSphereIntersection(localOrigin, localVelocity, localAcceleration, glm::vec3(0.0f), HUD_RADIUS, intersectionDistance)) {
         result = origin + velocity * intersectionDistance + 0.5f * acceleration * intersectionDistance * intersectionDistance;
         parabolicDistance = intersectionDistance;
         return true;
diff --git a/libraries/display-plugins/src/display-plugins/CompositorHelper.h b/libraries/display-plugins/src/display-plugins/CompositorHelper.h
index c45119fd63..3149d7fa3f 100644
--- a/libraries/display-plugins/src/display-plugins/CompositorHelper.h
+++ b/libraries/display-plugins/src/display-plugins/CompositorHelper.h
@@ -28,6 +28,7 @@
 class ReticleInterface;
 
 const float DEFAULT_RETICLE_DEPTH = 1.0f; // FIXME - probably should be based on UI radius
+const float HUD_RADIUS = 1.5f;
 
 const float MAGNIFY_WIDTH = 220.0f;
 const float MAGNIFY_HEIGHT = 100.0f;

From 4d70651c699930454d2a55d0b748f410bb3a7eac Mon Sep 17 00:00:00 2001
From: David Rowe <david@ctrlaltstudio.com>
Date: Sat, 24 Oct 2020 16:00:55 +1300
Subject: [PATCH 02/62] Make default reticle depth be HUD overlay radius

---
 .../display-plugins/src/display-plugins/CompositorHelper.h    | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/libraries/display-plugins/src/display-plugins/CompositorHelper.h b/libraries/display-plugins/src/display-plugins/CompositorHelper.h
index 3149d7fa3f..b44d6ffbd9 100644
--- a/libraries/display-plugins/src/display-plugins/CompositorHelper.h
+++ b/libraries/display-plugins/src/display-plugins/CompositorHelper.h
@@ -27,8 +27,8 @@
 
 class ReticleInterface;
 
-const float DEFAULT_RETICLE_DEPTH = 1.0f; // FIXME - probably should be based on UI radius
 const float HUD_RADIUS = 1.5f;
+const float DEFAULT_RETICLE_DEPTH = HUD_RADIUS;
 
 const float MAGNIFY_WIDTH = 220.0f;
 const float MAGNIFY_HEIGHT = 100.0f;
@@ -155,7 +155,7 @@ private:
     std::unique_ptr<QPropertyAnimation> _alphaPropertyAnimation;
 
     std::atomic<bool> _reticleVisible { true };
-    std::atomic<float> _reticleDepth { 1.0f };
+    std::atomic<float> _reticleDepth { DEFAULT_RETICLE_DEPTH };
 
     // NOTE: when the compositor is running in HMD mode, it will control the reticle position as a custom
     // application specific position, when it's in desktop mode, the reticle position will simply move

From 01cd4aa22dd8e8e24ed8bfa63b3745e5aa8045ef Mon Sep 17 00:00:00 2001
From: David Rowe <david@ctrlaltstudio.com>
Date: Sat, 24 Oct 2020 16:05:17 +1300
Subject: [PATCH 03/62] Reduce horizontal size of HUD overlay from 270 deg to
 180 deg

---
 .../src/display-plugins/CompositorHelper.cpp                | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp b/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp
index dc841d6308..c645c39eb4 100644
--- a/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp
+++ b/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp
@@ -41,10 +41,10 @@ static const float reticleSize = TWO_PI / 100.0f;
 //EntityItemID CompositorHelper::_noItemId;
 static QString _tooltipId;
 
-const uvec2 CompositorHelper::VIRTUAL_SCREEN_SIZE = uvec2(3960, 1188); // ~10% more pixel density than old version, 72dx240d FOV
-const QRect CompositorHelper::VIRTUAL_SCREEN_RECOMMENDED_OVERLAY_RECT = QRect(956, 0, 2048, 1188); // don't include entire width only center 2048
+const uvec2 CompositorHelper::VIRTUAL_SCREEN_SIZE = uvec2(2640, 1188);
+const QRect CompositorHelper::VIRTUAL_SCREEN_RECOMMENDED_OVERLAY_RECT = QRect(296, 0, 2048, 1188);  // Center 2048 pixels.
 const float CompositorHelper::VIRTUAL_UI_ASPECT_RATIO = (float)VIRTUAL_SCREEN_SIZE.x / (float)VIRTUAL_SCREEN_SIZE.y;
-const vec2 CompositorHelper::VIRTUAL_UI_TARGET_FOV = vec2(PI * 3.0f / 2.0f, PI * 3.0f / 2.0f / VIRTUAL_UI_ASPECT_RATIO);
+const vec2 CompositorHelper::VIRTUAL_UI_TARGET_FOV = vec2(PI, PI / VIRTUAL_UI_ASPECT_RATIO);
 const vec2 CompositorHelper::MOUSE_EXTENTS_ANGULAR_SIZE = vec2(PI * 2.0f, PI * 0.95f); // horizontal: full sphere,  vertical: ~5deg from poles
 const vec2 CompositorHelper::MOUSE_EXTENTS_PIXELS = vec2(VIRTUAL_SCREEN_SIZE) * (MOUSE_EXTENTS_ANGULAR_SIZE / VIRTUAL_UI_TARGET_FOV);
 

From d2b15d7cbab0f23c2191338220311b30d7884a4c Mon Sep 17 00:00:00 2001
From: David Rowe <david@ctrlaltstudio.com>
Date: Sat, 24 Oct 2020 16:27:03 +1300
Subject: [PATCH 04/62] Reduce "center UI" trigger distance from 0.99m to 0.33m

---
 interface/src/ui/OverlayConductor.cpp | 6 +++---
 interface/src/ui/OverlayConductor.h   | 2 +-
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/interface/src/ui/OverlayConductor.cpp b/interface/src/ui/OverlayConductor.cpp
index a359b8d4c9..2f0c3c3252 100644
--- a/interface/src/ui/OverlayConductor.cpp
+++ b/interface/src/ui/OverlayConductor.cpp
@@ -23,7 +23,7 @@ OverlayConductor::OverlayConductor() {
 OverlayConductor::~OverlayConductor() {
 }
 
-bool OverlayConductor::headOutsideOverlay() const {
+bool OverlayConductor::headNotCenteredInOverlay() const {
     glm::mat4 hmdMat = qApp->getHMDSensorPose();
     glm::vec3 hmdPos = extractTranslation(hmdMat);
     glm::vec3 hmdForward = transformVectorFast(hmdMat, glm::vec3(0.0f, 0.0f, -1.0f));
@@ -32,7 +32,7 @@ bool OverlayConductor::headOutsideOverlay() const {
     glm::vec3 uiPos = uiTransform.getTranslation();
     glm::vec3 uiForward = uiTransform.getRotation() * glm::vec3(0.0f, 0.0f, -1.0f);
 
-    const float MAX_COMPOSITOR_DISTANCE = 0.99f;  // If you're 1m from center of ui sphere, you're at the surface.
+    const float MAX_COMPOSITOR_DISTANCE = 0.33f;
     const float MAX_COMPOSITOR_ANGLE = 180.0f;    // rotation check is effectively disabled
     if (glm::distance(uiPos, hmdPos) > MAX_COMPOSITOR_DISTANCE ||
         glm::dot(uiForward, hmdForward) < cosf(glm::radians(MAX_COMPOSITOR_ANGLE))) {
@@ -106,7 +106,7 @@ void OverlayConductor::update(float dt) {
             shouldRecenter = true;
         }
     } else {
-        if (_hmdMode && headOutsideOverlay()) {
+        if (_hmdMode && headNotCenteredInOverlay()) {
             _suppressedByHead = true;
         }
     }
diff --git a/interface/src/ui/OverlayConductor.h b/interface/src/ui/OverlayConductor.h
index 6c3732cf3c..7e7cf5bd3c 100644
--- a/interface/src/ui/OverlayConductor.h
+++ b/interface/src/ui/OverlayConductor.h
@@ -22,7 +22,7 @@ public:
     void centerUI();
 
 private:
-    bool headOutsideOverlay() const;
+    bool headNotCenteredInOverlay() const;
     bool updateAvatarIsAtRest();
 
 #if !defined(DISABLE_QML)

From 9f95b101fe9266548c5737b12765af3c7532e3dc Mon Sep 17 00:00:00 2001
From: David Rowe <david@ctrlaltstudio.com>
Date: Sat, 24 Oct 2020 16:37:38 +1300
Subject: [PATCH 05/62] Enable "center UI" to be triggered on rotation

---
 interface/src/ui/OverlayConductor.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/interface/src/ui/OverlayConductor.cpp b/interface/src/ui/OverlayConductor.cpp
index 2f0c3c3252..f1aa75eaf9 100644
--- a/interface/src/ui/OverlayConductor.cpp
+++ b/interface/src/ui/OverlayConductor.cpp
@@ -33,7 +33,7 @@ bool OverlayConductor::headNotCenteredInOverlay() const {
     glm::vec3 uiForward = uiTransform.getRotation() * glm::vec3(0.0f, 0.0f, -1.0f);
 
     const float MAX_COMPOSITOR_DISTANCE = 0.33f;
-    const float MAX_COMPOSITOR_ANGLE = 180.0f;    // rotation check is effectively disabled
+    const float MAX_COMPOSITOR_ANGLE = 90.0f;
     if (glm::distance(uiPos, hmdPos) > MAX_COMPOSITOR_DISTANCE ||
         glm::dot(uiForward, hmdForward) < cosf(glm::radians(MAX_COMPOSITOR_ANGLE))) {
         return true;

From cbef9d2926f5df51bbbc741aa6f0744414d10097 Mon Sep 17 00:00:00 2001
From: David Rowe <david@ctrlaltstudio.com>
Date: Sat, 24 Oct 2020 21:28:49 +1300
Subject: [PATCH 06/62] Fix HUD content displaying only every second HUD
 recentering

---
 interface/src/ui/OverlayConductor.cpp | 25 ++++++++++++-------------
 1 file changed, 12 insertions(+), 13 deletions(-)

diff --git a/interface/src/ui/OverlayConductor.cpp b/interface/src/ui/OverlayConductor.cpp
index f1aa75eaf9..557b4d09bf 100644
--- a/interface/src/ui/OverlayConductor.cpp
+++ b/interface/src/ui/OverlayConductor.cpp
@@ -85,7 +85,6 @@ void OverlayConductor::update(float dt) {
     if (!desktop) {
         return;
     }
-    bool currentVisible = !desktop->property("pinned").toBool();
 
     auto myAvatar = DependencyManager::get<AvatarManager>()->getMyAvatar();
     // centerUI when hmd mode is first enabled and mounted
@@ -98,24 +97,24 @@ void OverlayConductor::update(float dt) {
         _hmdMode = false;
     }
 
-    bool shouldRecenter = false;
-
-    if (_suppressedByHead) {
-        if (updateAvatarIsAtRest()) {
-            _suppressedByHead = false;
-            shouldRecenter = true;
-        }
-    } else {
-        if (_hmdMode && headNotCenteredInOverlay()) {
-            _suppressedByHead = true;
-        }
+    bool initiateRecenter = false;
+    if (_hmdMode && headNotCenteredInOverlay()) {
+        initiateRecenter = true;
     }
 
+    bool shouldRecenter = false;
+    if (initiateRecenter || _suppressedByHead) {
+        _suppressedByHead = !updateAvatarIsAtRest();
+        shouldRecenter = !_suppressedByHead;
+    }
+
+    bool currentVisible = !desktop->property("pinned").toBool();
     bool targetVisible = Menu::getInstance()->isOptionChecked(MenuOption::Overlays) && !_suppressedByHead;
     if (targetVisible != currentVisible) {
         offscreenUi->setPinned(!targetVisible);
     }
-    if (shouldRecenter && !_suppressedByHead) {
+
+    if (shouldRecenter) {
         centerUI();
     }
 #endif

From 1a98e818cc4db2e26310c307b60673477a9995b2 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sat, 7 Nov 2020 19:44:15 +0000
Subject: [PATCH 07/62] Bump yargs-parser from 13.1.1 to 13.1.2 in /screenshare

Bumps [yargs-parser](https://github.com/yargs/yargs-parser) from 13.1.1 to 13.1.2.
- [Release notes](https://github.com/yargs/yargs-parser/releases)
- [Changelog](https://github.com/yargs/yargs-parser/blob/master/docs/CHANGELOG-full.md)
- [Commits](https://github.com/yargs/yargs-parser/commits)

Signed-off-by: dependabot[bot] <support@github.com>
---
 screenshare/package-lock.json | 35 ++++++++++++++++++++---------------
 1 file changed, 20 insertions(+), 15 deletions(-)

diff --git a/screenshare/package-lock.json b/screenshare/package-lock.json
index c7d92d3e17..3e799a860a 100644
--- a/screenshare/package-lock.json
+++ b/screenshare/package-lock.json
@@ -655,6 +655,12 @@
         "yargs-parser": "^13.0.0"
       },
       "dependencies": {
+        "camelcase": {
+          "version": "5.3.1",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+          "dev": true
+        },
         "debug": {
           "version": "4.1.1",
           "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
@@ -680,6 +686,16 @@
           "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
           "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
           "dev": true
+        },
+        "yargs-parser": {
+          "version": "13.1.2",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
+          "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
+          "dev": true,
+          "requires": {
+            "camelcase": "^5.0.0",
+            "decamelize": "^1.2.0"
+          }
         }
       }
     },
@@ -2246,23 +2262,13 @@
           "requires": {
             "ansi-regex": "^4.1.0"
           }
-        },
-        "yargs-parser": {
-          "version": "15.0.0",
-          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.0.tgz",
-          "integrity": "sha512-xLTUnCMc4JhxrPEPUYD5IBR1mWCK/aT6+RJ/K29JY2y1vD+FhtgKK0AXRWvI262q3QSffAQuTouFIKUuHX89wQ==",
-          "requires": {
-            "camelcase": "^5.0.0",
-            "decamelize": "^1.2.0"
-          }
         }
       }
     },
     "yargs-parser": {
-      "version": "13.1.1",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz",
-      "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==",
-      "dev": true,
+      "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"
@@ -2271,8 +2277,7 @@
         "camelcase": {
           "version": "5.3.1",
           "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
-          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
-          "dev": true
+          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
         }
       }
     },

From ce8b9d4b246179c5fcac08df1315fbd06fa3f905 Mon Sep 17 00:00:00 2001
From: Maki <mxmcube@gmail.com>
Date: Thu, 3 Sep 2020 18:50:36 +0100
Subject: [PATCH 08/62] Deleted old GLWidget code that breaks alt with current
 Qt on Linux

---
 libraries/gl/src/gl/GLWidget.cpp | 38 --------------------------------
 libraries/gl/src/gl/GLWidget.h   |  3 ---
 2 files changed, 41 deletions(-)

diff --git a/libraries/gl/src/gl/GLWidget.cpp b/libraries/gl/src/gl/GLWidget.cpp
index 94702a9906..45c8e70659 100644
--- a/libraries/gl/src/gl/GLWidget.cpp
+++ b/libraries/gl/src/gl/GLWidget.cpp
@@ -35,11 +35,6 @@ class GLPaintEngine : public QPaintEngine {
 };
 
 GLWidget::GLWidget() {
-#ifdef Q_OS_LINUX
-    // Cause GLWidget::eventFilter to be called.
-    // It wouldn't hurt to do this on Mac and PC too; but apparently it's only needed on linux.
-    qApp->installEventFilter(this);
-#endif
     setAttribute(Qt::WA_AcceptTouchEvents);
     setAttribute(Qt::WA_NativeWindow);
     setAttribute(Qt::WA_PaintOnScreen);
@@ -118,39 +113,6 @@ bool GLWidget::event(QEvent* event) {
     return QWidget::event(event);
 }
 
-// Pressing Alt (and Meta) key alone activates the menubar because its style inherits the
-// SHMenuBarAltKeyNavigation from QWindowsStyle. This makes it impossible for a scripts to
-// receive keyPress events for the Alt (and Meta) key in a reliable manner.
-//
-// This filter catches events before QMenuBar can steal the keyboard focus.
-// The idea was borrowed from
-// http://www.archivum.info/qt-interest@trolltech.com/2006-09/00053/Re-(Qt4)-Alt-key-focus-QMenuBar-(solved).html
-
-bool GLWidget::eventFilter(QObject*, QEvent* event) {
-    switch (event->type()) {
-        case QEvent::KeyPress:
-        case QEvent::KeyRelease:
-        case QEvent::ShortcutOverride:
-        {
-            QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
-            if (keyEvent->key() == Qt::Key_Alt || keyEvent->key() == Qt::Key_Meta) {
-                if (event->type() == QEvent::KeyPress) {
-                    keyPressEvent(keyEvent);
-                } else if (event->type() == QEvent::KeyRelease) {
-                    keyReleaseEvent(keyEvent);
-                } else {
-                    QWidget::event(event);
-                }
-                return true;
-            }
-        }
-        default:
-            break;
-    }
-    return false;
-}
-
-
 bool GLWidget::nativeEvent(const QByteArray &eventType, void *message, long *result) {
 #ifdef Q_OS_WIN32
     MSG* win32message = static_cast<MSG*>(message);
diff --git a/libraries/gl/src/gl/GLWidget.h b/libraries/gl/src/gl/GLWidget.h
index 777d43e8af..9d5c8800bb 100644
--- a/libraries/gl/src/gl/GLWidget.h
+++ b/libraries/gl/src/gl/GLWidget.h
@@ -42,9 +42,6 @@ protected:
     virtual bool event(QEvent* event) override;
     gl::Context* _context { nullptr };
 
-private slots:
-    virtual bool eventFilter(QObject*, QEvent* event) override;
-
 private:
     QPaintEngine* _paintEngine { nullptr };
     bool _vsyncSupported { false };

From 2194a20d347bdb1d7a6b9135a74fa74a25eccb05 Mon Sep 17 00:00:00 2001
From: Dale Glass <dale@daleglass.net>
Date: Sat, 14 Nov 2020 18:55:24 +0100
Subject: [PATCH 09/62] Upgrade to latest TBB

---
 cmake/ports/tbb/portfile.cmake | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/cmake/ports/tbb/portfile.cmake b/cmake/ports/tbb/portfile.cmake
index 4e81df37d1..2e2e78abde 100644
--- a/cmake/ports/tbb/portfile.cmake
+++ b/cmake/ports/tbb/portfile.cmake
@@ -3,7 +3,7 @@ include(vcpkg_common_functions)
 vcpkg_from_github(
     OUT_SOURCE_PATH SOURCE_PATH
     REPO oneapi-src/oneTBB
-    REF 4bdba61bafc6ba2d636f31564f1de5702d365cf7
+    REF eca91f16d7490a8abfdee652dadf457ec820cc37
     SHA512 f2a8d7e0476f846039390f4a79af3fe13770e23b01bf4741e738136f7ddb401357a0e50f35212e8d0fa5fc4cf1563418337309227d7243fc3676edd406ae652d
     HEAD_REF tbb_2019
     PATCHES fix-static-build.patch

From 8e2245c530293b5aaf6fc1ef2583fde1519edc5c Mon Sep 17 00:00:00 2001
From: Dale Glass <dale@daleglass.net>
Date: Sat, 14 Nov 2020 19:00:53 +0100
Subject: [PATCH 10/62] Update hash

---
 cmake/ports/tbb/portfile.cmake | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/cmake/ports/tbb/portfile.cmake b/cmake/ports/tbb/portfile.cmake
index 2e2e78abde..76c881833f 100644
--- a/cmake/ports/tbb/portfile.cmake
+++ b/cmake/ports/tbb/portfile.cmake
@@ -4,7 +4,7 @@ vcpkg_from_github(
     OUT_SOURCE_PATH SOURCE_PATH
     REPO oneapi-src/oneTBB
     REF eca91f16d7490a8abfdee652dadf457ec820cc37
-    SHA512 f2a8d7e0476f846039390f4a79af3fe13770e23b01bf4741e738136f7ddb401357a0e50f35212e8d0fa5fc4cf1563418337309227d7243fc3676edd406ae652d
+    SHA512 7144e1dc68304b5358e6ea330431b6f0c61fadb147efa353a5b242777d6fabf7b8cf99b79cffb51b49b911dd17a9f1879619d6eebdf319f23ec3235c89cffc25
     HEAD_REF tbb_2019
     PATCHES fix-static-build.patch
 )

From 031b3985b03bf120fff8cb1822d0db34f77a94fa Mon Sep 17 00:00:00 2001
From: Alezia Kurdis <60075796+AleziaKurdis@users.noreply.github.com>
Date: Wed, 18 Nov 2020 23:14:34 -0500
Subject: [PATCH 11/62] Fix for Issue 869

This excludes the local and avatar entities from what is returns by Entities.getChildrenIDs
to avoid the selection tools of the Zone entities to be considered as Children of it.
This was necessary for the display of the hierarchy status, but also for the "Add Children to Selection".
---
 scripts/system/create/edit.js | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/scripts/system/create/edit.js b/scripts/system/create/edit.js
index 099cb94988..a8b829c551 100644
--- a/scripts/system/create/edit.js
+++ b/scripts/system/create/edit.js
@@ -2908,7 +2908,7 @@ function zoneSortOrder(a, b) {
 function getParentState(id) {
     var state = "NONE";
     var properties = Entities.getEntityProperties(id, ["parentID"]);
-    var children = Entities.getChildrenIDs(id);
+    var children = getDomainOnlyChildrenIDs(id);
     if (properties.parentID !== Uuid.NULL) {
         if (children.length > 0) {
             state = "PARENT_CHILDREN";
@@ -2923,4 +2923,17 @@ function getParentState(id) {
     return state;
 }
 
+function getDomainOnlyChildrenIDs(id) {
+    var allChildren = Entities.getChildrenIDs(id);
+    var domainOnlyChildren = [];
+    var properties;
+    for (var i = 0; i < allChildren.length; i++) {
+        properties = Entities.getEntityProperties(allChildren[i], ["entityHostType"]);
+        if (properties.entityHostType == "domain") {
+            domainOnlyChildren.push(allChildren[i]);
+        }
+    }
+    return domainOnlyChildren;
+}
+
 }()); // END LOCAL_SCOPE

From 22abf1c2c47aca06e7637b4a3aea48b9b4e26115 Mon Sep 17 00:00:00 2001
From: Alezia Kurdis <60075796+AleziaKurdis@users.noreply.github.com>
Date: Wed, 18 Nov 2020 23:15:23 -0500
Subject: [PATCH 12/62] Fix for Issue 869

This excludes the local and avatar entities from what is returns by Entities.getChildrenIDs
to avoid the selection tools of the Zone entities to be considered as Children of it.
This was necessary for the display of the hierarchy status, but also for the "Add Children to Selection".
---
 .../create/entitySelectionTool/entitySelectionTool.js  | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/scripts/system/create/entitySelectionTool/entitySelectionTool.js b/scripts/system/create/entitySelectionTool/entitySelectionTool.js
index 71edbde765..f9a30ef6a5 100644
--- a/scripts/system/create/entitySelectionTool/entitySelectionTool.js
+++ b/scripts/system/create/entitySelectionTool/entitySelectionTool.js
@@ -724,12 +724,12 @@ SelectionManager = (function() {
     that.addChildrenToSelection = function() {
         if (that.hasSelection()) {
             for (var i = 0; i < that.selections.length; i++) {
-                var childrenIDs = Entities.getChildrenIDs(that.selections[i]);
-                var collectNewChildren; 
+                var childrenIDs = getDomainOnlyChildrenIDs(that.selections[i]);
+                var collectNewChildren;
                 var j;
                 var k = 0;
                 do {
-                    collectNewChildren = Entities.getChildrenIDs(childrenIDs[k]);
+                    collectNewChildren = getDomainOnlyChildrenIDs(childrenIDs[k]);
                     if (collectNewChildren.length > 0) {
                         for (j = 0; j < collectNewChildren.length; j++) {
                             childrenIDs.push(collectNewChildren[j]);
@@ -746,7 +746,7 @@ SelectionManager = (function() {
             that._update(true, this);
         } else {
             audioFeedback.rejection();
-            Window.notifyEditError("You have nothing selected.");            
+            Window.notifyEditError("You have nothing selected.");
         }
     };
 
@@ -832,7 +832,7 @@ SelectionDisplay = (function() {
     
     const BOUNDING_EDGE_OFFSET = 0.5;
 
-    const DUPLICATOR_OFFSET = { x: 0.6, y: 0, z: 0.6 };    
+    const DUPLICATOR_OFFSET = { x: 0.6, y: 0, z: 0.6 };
     
     const CTRL_KEY_CODE = 16777249;
 

From d9255eed953517a87c95cb9e3b10445e32e3f13e Mon Sep 17 00:00:00 2001
From: kasenvr <52365539+kasenvr@users.noreply.github.com>
Date: Fri, 20 Nov 2020 04:12:07 -0500
Subject: [PATCH 13/62] Update pr_build.yml

---
 .github/workflows/pr_build.yml | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/.github/workflows/pr_build.yml b/.github/workflows/pr_build.yml
index d1662e5c8e..b427b3dde7 100644
--- a/.github/workflows/pr_build.yml
+++ b/.github/workflows/pr_build.yml
@@ -14,7 +14,8 @@ env:
   RELEASE_TYPE: PR
   RELEASE_NUMBER: ${{ github.event.number }}
   VERSION_CODE: ${{ github.event.number }}
-
+  CMAKE_BACKTRACE_URL: https://sentry.vircadia.dev/api/2/minidump/?sentry_key=ab9aab2b0d6e46b59d6f06a97048d37e
+  CMAKE_BACKTRACE_TOKEN: PR_${{ github.event.number }}_${{ github.sha }}
 
   # OSX specific variables
   DEVELOPER_DIR: /Applications/Xcode_11.2.app/Contents/Developer

From 84b6736e68922db1bc03a539d2a2e37611a8f2ea Mon Sep 17 00:00:00 2001
From: kasenvr <52365539+kasenvr@users.noreply.github.com>
Date: Fri, 20 Nov 2020 04:13:02 -0500
Subject: [PATCH 14/62] Update pr_build.yml

---
 .github/workflows/pr_build.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/pr_build.yml b/.github/workflows/pr_build.yml
index b427b3dde7..3dfef41db4 100644
--- a/.github/workflows/pr_build.yml
+++ b/.github/workflows/pr_build.yml
@@ -14,7 +14,7 @@ env:
   RELEASE_TYPE: PR
   RELEASE_NUMBER: ${{ github.event.number }}
   VERSION_CODE: ${{ github.event.number }}
-  CMAKE_BACKTRACE_URL: https://sentry.vircadia.dev/api/2/minidump/?sentry_key=ab9aab2b0d6e46b59d6f06a97048d37e
+  CMAKE_BACKTRACE_URL: https://sentry.vircadia.dev/api/2/minidump/?sentry_key=dbf6000201a442e0b5462b63e18ee6b1
   CMAKE_BACKTRACE_TOKEN: PR_${{ github.event.number }}_${{ github.sha }}
 
   # OSX specific variables

From f7b0437bc8cc8419a6eae4d9691384a6ff72fb5a Mon Sep 17 00:00:00 2001
From: Kalila L <somnilibertas@gmail.com>
Date: Sat, 21 Nov 2020 00:03:56 -0500
Subject: [PATCH 15/62] Initial add of crash report arg option.

---
 interface/src/main.cpp | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/interface/src/main.cpp b/interface/src/main.cpp
index c14d22bdbb..f63e19f6b0 100644
--- a/interface/src/main.cpp
+++ b/interface/src/main.cpp
@@ -89,6 +89,7 @@ int main(int argc, const char* argv[]) {
     QCommandLineOption displayNameOption("displayName", "set user display name <string>", "string");
     QCommandLineOption setBookmarkOption("setBookmark", "set bookmark key=value pair", "string");
     QCommandLineOption defaultScriptOverrideOption("defaultScriptsOverride", "override defaultsScripts.js", "string");
+    QCommandLineOption forceCrashReportingOption("forceCrashReporting", "Force crash reporting to initialize");
 
     parser.addOption(urlOption);
     parser.addOption(noLauncherOption);
@@ -103,6 +104,7 @@ int main(int argc, const char* argv[]) {
     parser.addOption(displayNameOption);
     parser.addOption(setBookmarkOption);
     parser.addOption(defaultScriptOverrideOption);
+    parser.addOption(forceCrashReportingOption);
 
     if (!parser.parse(arguments)) {
         std::cout << parser.errorText().toStdString() << std::endl; // Avoid Qt log spam
@@ -218,8 +220,12 @@ int main(int argc, const char* argv[]) {
     }
     qDebug() << "UserActivityLogger is enabled:" << ual.isEnabled();
 
-    qDebug() << "Crash handler logger is enabled:" << ual.isCrashMonitorEnabled();
-    if (ual.isCrashMonitorEnabled()) {
+    bool forceCrashReporting = false;
+    if (parser.isSet(forceCrashReportingOption)) {
+        forceCrashReporting = true;
+    }
+    qDebug() << "Crash handler logger is enabled:" << (forceCrashReporting || ual.isCrashMonitorEnabled());
+    if (forceCrashReporting || ual.isCrashMonitorEnabled()) {
         auto crashHandlerStarted = startCrashHandler(argv[0]);
         qDebug() << "Crash handler started:" << crashHandlerStarted;
     }

From 8f0684abfd635dbde5e2ce4ed503de347332ba2c Mon Sep 17 00:00:00 2001
From: kasenvr <52365539+kasenvr@users.noreply.github.com>
Date: Sat, 21 Nov 2020 14:24:23 -0500
Subject: [PATCH 16/62] Update pr_build.yml

---
 .github/workflows/pr_build.yml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.github/workflows/pr_build.yml b/.github/workflows/pr_build.yml
index 3dfef41db4..a554cb5270 100644
--- a/.github/workflows/pr_build.yml
+++ b/.github/workflows/pr_build.yml
@@ -14,6 +14,7 @@ env:
   RELEASE_TYPE: PR
   RELEASE_NUMBER: ${{ github.event.number }}
   VERSION_CODE: ${{ github.event.number }}
+  # Sentry Crash Reporting
   CMAKE_BACKTRACE_URL: https://sentry.vircadia.dev/api/2/minidump/?sentry_key=dbf6000201a442e0b5462b63e18ee6b1
   CMAKE_BACKTRACE_TOKEN: PR_${{ github.event.number }}_${{ github.sha }}
 

From 00575ae8f88c40f67679277cbdbe6fc8cc8f5996 Mon Sep 17 00:00:00 2001
From: Alezia Kurdis <60075796+AleziaKurdis@users.noreply.github.com>
Date: Sat, 21 Nov 2020 15:43:12 -0500
Subject: [PATCH 17/62] Excluding EntityShapeVisualizer from Children list

Excluding EntityShapeVisualizer from Children list
Now a name is given to the EntityShape of the EntityShapeVisualizer (used to display the zone)
so we can now exclude them from the children list when it's time to figure if there are children for an entity.
(This is a better approach than excluding al the local entities)
The name has been used because it gives better results than trying to use the id map that arrive always too late.
The name is unique for a session, it includes a UUID.
---
 scripts/system/create/edit.js | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/scripts/system/create/edit.js b/scripts/system/create/edit.js
index a8b829c551..3c6f43d3a1 100644
--- a/scripts/system/create/edit.js
+++ b/scripts/system/create/edit.js
@@ -117,8 +117,10 @@ var gridTool = new GridTool({
 });
 gridTool.setVisible(false);
 
+var entityShapeVisualizerSessionName = "SHAPE_VISUALIZER_" + Uuid.generate();
+
 var EntityShapeVisualizer = Script.require('./modules/entityShapeVisualizer.js');
-var entityShapeVisualizer = new EntityShapeVisualizer(["Zone"]);
+var entityShapeVisualizer = new EntityShapeVisualizer(["Zone"], entityShapeVisualizerSessionName);
 
 var entityListTool = new EntityListTool(shouldUseEditTabletApp);
 
@@ -2925,15 +2927,15 @@ function getParentState(id) {
 
 function getDomainOnlyChildrenIDs(id) {
     var allChildren = Entities.getChildrenIDs(id);
-    var domainOnlyChildren = [];
+    var realChildren = [];
     var properties;
     for (var i = 0; i < allChildren.length; i++) {
-        properties = Entities.getEntityProperties(allChildren[i], ["entityHostType"]);
-        if (properties.entityHostType == "domain") {
-            domainOnlyChildren.push(allChildren[i]);
+        properties = Entities.getEntityProperties(allChildren[i], ["name"]);
+        if (properties.name !== entityShapeVisualizerSessionName && properties.name !== undefined) {
+            realChildren.push(allChildren[i]);
         }
     }
-    return domainOnlyChildren;
+    return realChildren;
 }
 
 }()); // END LOCAL_SCOPE

From b633bc4a164ecfa44ce7b063b5bf2e676d2b4672 Mon Sep 17 00:00:00 2001
From: Alezia Kurdis <60075796+AleziaKurdis@users.noreply.github.com>
Date: Sat, 21 Nov 2020 15:44:15 -0500
Subject: [PATCH 18/62] Excluding EntityShapeVisualizer from Children list

Excluding EntityShapeVisualizer from Children list
Now a name is given to the EntityShape of the EntityShapeVisualizer (used to display the zone)
so we can now exclude them from the children list when it's time to figure if there are children for an entity.
(This is a better approach than excluding al the local entities)
The name has been used because it gives better results than trying to use the id map that arrive always too late.
The name is unique for a session, it includes a UUID.
---
 .../system/create/modules/entityShapeVisualizer.js  | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/scripts/system/create/modules/entityShapeVisualizer.js b/scripts/system/create/modules/entityShapeVisualizer.js
index dbf09a1cb7..45cf68fdb5 100644
--- a/scripts/system/create/modules/entityShapeVisualizer.js
+++ b/scripts/system/create/modules/entityShapeVisualizer.js
@@ -116,12 +116,14 @@ function deepCopy(v) {
     return JSON.parse(JSON.stringify(v));
 }
 
-function EntityShape(entityID) {
+function EntityShape(entityID, entityShapeVisualizerSessionName) {
     this.entityID = entityID;
+    this.entityShapeVisualizerSessionName = entityShapeVisualizerSessionName;
+
     var propertiesForType = getEntityShapePropertiesForType(Entities.getEntityProperties(entityID, REQUESTED_ENTITY_SHAPE_PROPERTIES));
 
     this.previousPropertiesForType = propertiesForType;
-
+    
     this.initialize(propertiesForType);
 }
 
@@ -130,6 +132,7 @@ EntityShape.prototype = {
         // Create new instance of JS object:
         var overlayProperties = deepCopy(properties);
 
+        overlayProperties.name = this.entityShapeVisualizerSessionName;
         overlayProperties.localPosition = Vec3.ZERO;
         overlayProperties.localRotation = Quat.IDENTITY;
         overlayProperties.canCastShadows = false;
@@ -172,11 +175,11 @@ EntityShape.prototype = {
     }
 };
 
-function EntityShapeVisualizer(visualizedTypes) {
+function EntityShapeVisualizer(visualizedTypes, entityShapeVisualizerSessionName) {
     this.acceptedEntities = [];
     this.ignoredEntities = [];
     this.entityShapes = {};
-
+    this.entityShapeVisualizerSessionName = entityShapeVisualizerSessionName;
     this.visualizedTypes = visualizedTypes;
 }
 
@@ -185,7 +188,7 @@ EntityShapeVisualizer.prototype = {
         if (this.entityShapes[entityID]) {
             return;
         }
-        this.entityShapes[entityID] = new EntityShape(entityID);
+        this.entityShapes[entityID] = new EntityShape(entityID, this.entityShapeVisualizerSessionName);
 
     },
     updateEntity: function(entityID) {

From 343ded8c6f9cea43e1570e31d50c531ee18307e8 Mon Sep 17 00:00:00 2001
From: Alezia Kurdis <60075796+AleziaKurdis@users.noreply.github.com>
Date: Sat, 21 Nov 2020 22:02:49 -0500
Subject: [PATCH 19/62] Minor code adjustments

Minor code adjustments
---
 scripts/system/create/edit.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/scripts/system/create/edit.js b/scripts/system/create/edit.js
index 3c6f43d3a1..bc7afd8dc3 100644
--- a/scripts/system/create/edit.js
+++ b/scripts/system/create/edit.js
@@ -2931,7 +2931,7 @@ function getDomainOnlyChildrenIDs(id) {
     var properties;
     for (var i = 0; i < allChildren.length; i++) {
         properties = Entities.getEntityProperties(allChildren[i], ["name"]);
-        if (properties.name !== entityShapeVisualizerSessionName && properties.name !== undefined) {
+        if (properties.name !== undefined && properties.name !== entityShapeVisualizerSessionName) {
             realChildren.push(allChildren[i]);
         }
     }

From b865e9bc8cde9eefb835a62ae1c372246daedcb7 Mon Sep 17 00:00:00 2001
From: David Rowe <david@ctrlaltstudio.com>
Date: Mon, 23 Nov 2020 16:02:32 +1300
Subject: [PATCH 20/62] Fix laser intersection with HUD overlay dialogs

Also fixes dialog resize outline being drawn in the wrong position
(desktop and HMD).
---
 interface/resources/qml/desktop/Desktop.qml | 4 ++--
 interface/resources/qml/windows/Frame.qml   | 3 +--
 2 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/interface/resources/qml/desktop/Desktop.qml b/interface/resources/qml/desktop/Desktop.qml
index 9a9252112c..971fb06414 100644
--- a/interface/resources/qml/desktop/Desktop.qml
+++ b/interface/resources/qml/desktop/Desktop.qml
@@ -309,8 +309,8 @@ FocusScope {
             if (child.hasOwnProperty("modality")) {
                 var mappedPoint = mapToItem(child, point.x, point.y);
                 if (child.hasOwnProperty("frame")) {
-                    var outLine = child.frame.children[2];
-                    var framePoint = outLine.mapFromGlobal(point.x, point.y);
+                    var outLine = child.frame.children[2];  // sizeOutline
+                    var framePoint = mapToItem(outLine, point.x, point.y);
                     if (outLine.contains(framePoint)) {
                         return true;
                     }
diff --git a/interface/resources/qml/windows/Frame.qml b/interface/resources/qml/windows/Frame.qml
index 7b0fbf8d8c..cfff40bbf6 100644
--- a/interface/resources/qml/windows/Frame.qml
+++ b/interface/resources/qml/windows/Frame.qml
@@ -27,7 +27,6 @@ Item {
     readonly property int frameMarginRight: frame.decoration ? frame.decoration.frameMarginRight : 0
     readonly property int frameMarginTop: frame.decoration ? frame.decoration.frameMarginTop : 0
     readonly property int frameMarginBottom: frame.decoration ? frame.decoration.frameMarginBottom : 0
-    readonly property int offsetCorrection: 20
 
     // Frames always fill their parents, but their decorations may extend
     // beyond the window via negative margin sizes
@@ -76,7 +75,7 @@ Item {
     Rectangle {
         id: sizeOutline
         x: -frameMarginLeft
-        y: -frameMarginTop - offsetCorrection
+        y: -frameMarginTop
         width: window ? window.width + frameMarginLeft + frameMarginRight + 2 : 0
         height: window ? window.height + frameMarginTop + frameMarginBottom + 2 : 0
         color: hifi.colors.baseGrayHighlight15

From eb70d15f77a0dbafd8567ad528c0138482527663 Mon Sep 17 00:00:00 2001
From: David Rowe <david@ctrlaltstudio.com>
Date: Mon, 23 Nov 2020 19:13:48 +1300
Subject: [PATCH 21/62] Fix JSDoc typo

---
 libraries/script-engine/src/Quat.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libraries/script-engine/src/Quat.h b/libraries/script-engine/src/Quat.h
index 23bfe56309..c1eaa97797 100644
--- a/libraries/script-engine/src/Quat.h
+++ b/libraries/script-engine/src/Quat.h
@@ -188,7 +188,7 @@ public slots:
     * @param {number} roll - The roll angle in degrees.
     * @returns {Quat} A quaternion created using the <code>pitch</code>, <code>yaw</code>, and <code>roll</code> Euler angles.
     * @example <caption>Create a rotation of 180 degrees about the y axis.</caption>
-    * var rotation = Quat.fromPitchYawRollDgrees(0, 180, 0 );
+    * var rotation = Quat.fromPitchYawRollDegrees(0, 180, 0 );
     */
     glm::quat fromPitchYawRollDegrees(float pitch, float yaw, float roll);
 

From 9b253c3a326852990d9e81cd93938ccce43b07ec Mon Sep 17 00:00:00 2001
From: kasenvr <52365539+kasenvr@users.noreply.github.com>
Date: Wed, 25 Nov 2020 16:27:46 -0500
Subject: [PATCH 22/62] Update interface/src/main.cpp

Co-authored-by: David Rowe <david@ctrlaltstudio.com>
---
 interface/src/main.cpp | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/interface/src/main.cpp b/interface/src/main.cpp
index f63e19f6b0..d190e3f3da 100644
--- a/interface/src/main.cpp
+++ b/interface/src/main.cpp
@@ -220,12 +220,9 @@ int main(int argc, const char* argv[]) {
     }
     qDebug() << "UserActivityLogger is enabled:" << ual.isEnabled();
 
-    bool forceCrashReporting = false;
-    if (parser.isSet(forceCrashReportingOption)) {
-        forceCrashReporting = true;
-    }
-    qDebug() << "Crash handler logger is enabled:" << (forceCrashReporting || ual.isCrashMonitorEnabled());
-    if (forceCrashReporting || ual.isCrashMonitorEnabled()) {
+    bool isCrashHandlerEnabled = ual.isCrashMonitorEnabled() || parser.isSet(forceCrashReportingOption);
+    qDebug() << "Crash handler logger is enabled:" << isCrashHandlerEnabled;
+    if (isCrashHandlerEnabled) {
         auto crashHandlerStarted = startCrashHandler(argv[0]);
         qDebug() << "Crash handler started:" << crashHandlerStarted;
     }

From 9a5b956968ebf6342784ead31709b9b63ac6cb82 Mon Sep 17 00:00:00 2001
From: HifiExperiments <53453710+HifiExperiments@users.noreply.github.com>
Date: Fri, 27 Nov 2020 15:11:18 -0800
Subject: [PATCH 23/62] Apply suggestions from code review

Co-authored-by: David Rowe <david@ctrlaltstudio.com>
---
 libraries/entities-renderer/src/RenderableModelEntityItem.cpp | 2 +-
 libraries/render-utils/src/Model.cpp                          | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp
index d6b7313ae7..e13ab6f837 100644
--- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp
+++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp
@@ -704,7 +704,7 @@ void RenderableModelEntityItem::setJointMap(std::vector<int> jointMap) {
 
 int RenderableModelEntityItem::avatarJointIndex(int modelJointIndex) {
     int result = -1;
-    int mapSize = (int) _jointMap.size();
+    int mapSize = (int)_jointMap.size();
     if (modelJointIndex >= 0 && modelJointIndex < mapSize) {
         result = _jointMap[modelJointIndex];
     }
diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp
index 1015c87038..9ad343639d 100644
--- a/libraries/render-utils/src/Model.cpp
+++ b/libraries/render-utils/src/Model.cpp
@@ -975,7 +975,7 @@ void Model::setPrimitiveMode(PrimitiveMode primitiveMode, const render::ScenePoi
 
         render::Transaction transaction;
 
-        for (int i = 0; i < (int) _modelMeshRenderItemIDs.size(); i++) {
+        for (int i = 0; i < (int)_modelMeshRenderItemIDs.size(); i++) {
             auto itemID = _modelMeshRenderItemIDs[i];
             auto meshIndex = _modelMeshRenderItemShapes[i].meshIndex;
             bool invalidatePayloadShapeKey = shouldInvalidatePayloadShapeKey(meshIndex);

From 182302c3e75014ead9de65986139d088185b9606 Mon Sep 17 00:00:00 2001
From: Dale Glass <dale@daleglass.net>
Date: Sat, 28 Nov 2020 02:07:08 +0100
Subject: [PATCH 24/62] GL_TEXTURE_FREE_MEMORY_ATI returns 4 values, not just 1

This should fix a buffer overflow that happens on ATI cards.
---
 libraries/gpu-gl-common/src/gpu/gl/GLBackend.cpp | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/libraries/gpu-gl-common/src/gpu/gl/GLBackend.cpp b/libraries/gpu-gl-common/src/gpu/gl/GLBackend.cpp
index ef247b0835..38aca093cd 100644
--- a/libraries/gpu-gl-common/src/gpu/gl/GLBackend.cpp
+++ b/libraries/gpu-gl-common/src/gpu/gl/GLBackend.cpp
@@ -219,19 +219,21 @@ void GLBackend::init() {
 }
 
 size_t GLBackend::getAvailableMemory() {
-    GLint mem;
+    // GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX returns 1 value
+    // GL_TEXTURE_FREE_MEMORY_ATI returns 4 values, we only need the first
+    GLint mem[4] = {0,0,0,0};
 
     switch( _videoCard ) {
         case NVIDIA:
 #if !defined(Q_OS_ANDROID)
-            glGetIntegerv(GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX, &mem);
+            glGetIntegerv(GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX, &mem[0]);
 #endif
-            return mem * BYTES_PER_KIB;
+            return mem[0] * BYTES_PER_KIB;
         case ATI:
 #if !defined(Q_OS_ANDROID)
-            glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI, &mem);
+            glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI, &mem[0]);
 #endif
-            return mem * BYTES_PER_KIB;
+            return mem[0] * BYTES_PER_KIB;
         case MESA:
             return 0; // Don't know the current value
         case Unknown:
@@ -1002,4 +1004,4 @@ void GLBackend::setCameraCorrection(const Mat4& correction, const Mat4& prevRend
 
 void GLBackend::syncProgram(const gpu::ShaderPointer& program) {
     gpu::gl::GLShader::sync(*this, *program);
-}
\ No newline at end of file
+}

From dec726b976f5cc9dbf28a25626faa2c79ded669f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Julian=20Gro=C3=9F?= <firedefender1@googlemail.com>
Date: Sat, 28 Nov 2020 23:30:34 +0100
Subject: [PATCH 25/62] Update hifi_qt.py to recognize ubuntu version over
 19.10 as not supported yet.

---
 hifi_qt.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/hifi_qt.py b/hifi_qt.py
index 10708e4bc9..d86b2ac6c7 100644
--- a/hifi_qt.py
+++ b/hifi_qt.py
@@ -12,7 +12,7 @@ import functools
 
 print = functools.partial(print, flush=True)
 
-# Encapsulates the vcpkg system 
+# Encapsulates the vcpkg system
 class QtDownloader:
     CMAKE_TEMPLATE = """
 # this file auto-generated by hifi_qt.py
@@ -72,7 +72,7 @@ endif()
                     self.qtUrl = self.assets_url + '/dependencies/vcpkg/qt5-install-5.12.3-ubuntu-18.04.tar.gz'
                 elif u_major == 19 and u_minor == 10:
                     self.qtUrl = self.assets_url + '/dependencies/vcpkg/qt5-install-5.12.6-ubuntu-19.10.tar.xz'
-                elif u_major > 18 and ( u_major != 19 and u_minor != 4):
+                elif u_major > 19:
                     print("We don't support " + distro.name(pretty=True) + " yet. Perhaps consider helping us out?")
                     raise Exception('LINUX DISTRO IS NOT SUPPORTED YET!!!')
                 else:

From af9367ae29d092610854edc027fd399804282bc2 Mon Sep 17 00:00:00 2001
From: Alezia Kurdis <60075796+AleziaKurdis@users.noreply.github.com>
Date: Mon, 30 Nov 2020 00:34:09 -0500
Subject: [PATCH 26/62] Create App "tools" menu implementation

 Create App "tools" menu implementation
---
 scripts/system/libraries/gridTool.js | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/scripts/system/libraries/gridTool.js b/scripts/system/libraries/gridTool.js
index 233ae3a3e4..90a6745ff4 100644
--- a/scripts/system/libraries/gridTool.js
+++ b/scripts/system/libraries/gridTool.js
@@ -4,7 +4,7 @@ var GRID_CONTROLS_HTML_URL = Script.resolvePath('../html/gridControls.html');
 
 Grid = function() {
     var that = {};
-    var gridColor = { red: 0, green: 0, blue: 0 };
+    var gridColor = { red: 255, green: 255, blue: 255 };
     var gridAlpha = 0.6;
     var origin = { x: 0, y: +MyAvatar.getJointPosition('LeftToeBase').y.toFixed(1) + 0.1, z: 0 };
     var scale = 500;
@@ -163,6 +163,14 @@ Grid = function() {
         newPosition = Vec3.subtract(newPosition, { x: 0, y: SelectionManager.worldDimensions.y * 0.5, z: 0 });
         that.setPosition(newPosition);
     };
+    
+    that.moveToAvatar = function() {
+        var position = MyAvatar.getJointPosition("LeftFoot");
+        if (position.x === 0 && position.y === 0 && position.z === 0) {
+            position = MyAvatar.position;
+        }
+        that.setPosition(position);        
+    };
 
     that.emitUpdate = function() {
         if (that.onUpdate) {
@@ -283,11 +291,7 @@ GridTool = function(opts) {
         } else if (data.type === "action") {
             var action = data.action;
             if (action === "moveToAvatar") {
-                var position = MyAvatar.getJointPosition("LeftFoot");
-                if (position.x === 0 && position.y === 0 && position.z === 0) {
-                    position = MyAvatar.position;
-                }
-                horizontalGrid.setPosition(position);
+                horizontalGrid.moveToAvatar();
             } else if (action === "moveToSelection") {
                 horizontalGrid.moveToSelection();
             }

From ab999e529dd891e5c3179deaaacad086157dd7b1 Mon Sep 17 00:00:00 2001
From: Alezia Kurdis <60075796+AleziaKurdis@users.noreply.github.com>
Date: Mon, 30 Nov 2020 00:35:15 -0500
Subject: [PATCH 27/62] Create App "tools" menu implementation

Create App "tools" menu implementation
---
 scripts/system/html/css/edit-style.css | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/scripts/system/html/css/edit-style.css b/scripts/system/html/css/edit-style.css
index 4f0a833a13..db535327d9 100644
--- a/scripts/system/html/css/edit-style.css
+++ b/scripts/system/html/css/edit-style.css
@@ -404,7 +404,7 @@ input[type=button], button.hifi-edit-button {
     text-transform: uppercase;
     vertical-align: top;
     height: 28px;
-    min-width: 120px;
+    min-width: 70px;
     padding: 0 18px;
     margin-right: 6px;
     border-radius: 5px;

From 21eee3c24e9b377e1812309b29008eebadb1a684 Mon Sep 17 00:00:00 2001
From: Alezia Kurdis <60075796+AleziaKurdis@users.noreply.github.com>
Date: Mon, 30 Nov 2020 00:36:15 -0500
Subject: [PATCH 28/62] Create App "tools" menu implementation

Create App "tools" menu implementation
---
 scripts/system/create/edit.js | 86 ++++++++++++++++++++++++++++++-----
 1 file changed, 74 insertions(+), 12 deletions(-)

diff --git a/scripts/system/create/edit.js b/scripts/system/create/edit.js
index bc7afd8dc3..f49b19569a 100644
--- a/scripts/system/create/edit.js
+++ b/scripts/system/create/edit.js
@@ -148,7 +148,10 @@ var DEFAULT_DIMENSIONS = {
 
 var DEFAULT_LIGHT_DIMENSIONS = Vec3.multiply(20, DEFAULT_DIMENSIONS);
 
-var SUBMENU_ENTITY_EDITOR_PREFERENCES = "Edit > Create Application - Preferences";
+var MENU_IMPORT_FROM_FILE = "Import Entities (.json) From a File";
+var MENU_IMPORT_FROM_URL = "Import Entities (.json) From a URL";
+var MENU_CREATE_SEPARATOR = "Create Application";
+var SUBMENU_ENTITY_EDITOR_PREFERENCES = "Edit > Preferences";
 var MENU_AUTO_FOCUS_ON_SELECT = "Auto Focus on Select";
 var MENU_EASE_ON_FOCUS = "Ease Orientation on Focus";
 var MENU_SHOW_LIGHTS_AND_PARTICLES_IN_EDIT_MODE = "Show Lights and Particle Systems in Create Mode";
@@ -880,13 +883,11 @@ var toolBar = (function () {
         });
 
         addButton("importEntitiesButton", function() {
-            Window.browseChanged.connect(onFileOpenChanged);
-            Window.browseAsync("Select .json to Import", "", "*.json");
+            importEntitiesFromFile();
         });
 
         addButton("importEntitiesFromUrlButton", function() {
-            Window.promptTextChanged.connect(onPromptTextChanged);
-            Window.promptAsync("URL of a .json to import", "");
+            importEntitiesFromUrl();
         });
 
         addButton("openAssetBrowserButton", function() {
@@ -1402,6 +1403,22 @@ function setupModelMenus() {
         position: 1,
     });
 
+    Menu.addMenuItem({
+        menuName: "Edit",
+        menuItemName: MENU_CREATE_SEPARATOR,
+        isSeparator: true
+    });
+    Menu.addMenuItem({
+        menuName: "Edit",
+        menuItemName: MENU_IMPORT_FROM_FILE,
+        afterItem: MENU_CREATE_SEPARATOR
+    });
+    Menu.addMenuItem({
+        menuName: "Edit",
+        menuItemName: MENU_IMPORT_FROM_URL,
+        afterItem: MENU_IMPORT_FROM_FILE
+    });
+
     Menu.addMenu(SUBMENU_ENTITY_EDITOR_PREFERENCES);
 
     Menu.addMenuItem({
@@ -1465,7 +1482,7 @@ function setupModelMenus() {
         menuItemName: MENU_ENTITY_LIST_DEFAULT_RADIUS,
         afterItem: MENU_SHOW_ZONES_IN_EDIT_MODE
     });
-
+ 
     Entities.setLightsArePickable(false);
 }
 
@@ -1484,7 +1501,10 @@ function cleanupModelMenus() {
     Menu.removeMenuItem(SUBMENU_ENTITY_EDITOR_PREFERENCES, MENU_SHOW_ZONES_IN_EDIT_MODE);
     Menu.removeMenuItem(SUBMENU_ENTITY_EDITOR_PREFERENCES, MENU_CREATE_ENTITIES_GRABBABLE);
     Menu.removeMenuItem(SUBMENU_ENTITY_EDITOR_PREFERENCES, MENU_ENTITY_LIST_DEFAULT_RADIUS);
-    Menu.removeMenu(SUBMENU_ENTITY_EDITOR_PREFERENCES);   
+    Menu.removeMenu(SUBMENU_ENTITY_EDITOR_PREFERENCES);
+    Menu.removeMenuItem("Edit", MENU_IMPORT_FROM_URL);
+    Menu.removeMenuItem("Edit", MENU_IMPORT_FROM_FILE);
+    Menu.removeSeparator("Edit", MENU_CREATE_SEPARATOR);    
 }
 
 Script.scriptEnding.connect(function () {
@@ -1858,6 +1878,10 @@ function handleMenuEvent(menuItem) {
     } else if (menuItem === MENU_ENTITY_LIST_DEFAULT_RADIUS) {
         Window.promptTextChanged.connect(onPromptTextChangedDefaultRadiusUserPref);
         Window.promptAsync("Entity List Default Radius (in meters)", "" + Settings.getValue(SETTING_ENTITY_LIST_DEFAULT_RADIUS, 100));         
+    } else if (menuItem === MENU_IMPORT_FROM_FILE) {
+        importEntitiesFromFile();
+    } else if (menuItem === MENU_IMPORT_FROM_URL) {
+        importEntitiesFromUrl();
     }
     tooltip.show(false);
 }
@@ -2015,11 +2039,7 @@ function toggleKey(value) {
 }
 function focusKey(value) {
     if (value === 0) { // on release
-        cameraManager.enable();
-        if (selectionManager.hasSelection()) {
-            cameraManager.focus(selectionManager.worldPosition, selectionManager.worldDimensions,
-                                Menu.isOptionChecked(MENU_EASE_ON_FOCUS));
-        }
+        setCameraFocusToSelection();
     }
 }
 function gridKey(value) {
@@ -2938,4 +2958,46 @@ function getDomainOnlyChildrenIDs(id) {
     return realChildren;
 }
 
+function importEntitiesFromFile() {
+    Window.browseChanged.connect(onFileOpenChanged);
+    Window.browseAsync("Select .json to Import", "", "*.json");    
+}
+
+function importEntitiesFromUrl() {
+    Window.promptTextChanged.connect(onPromptTextChanged);
+    Window.promptAsync("URL of a .json to import", "");    
+}
+
+function setCameraFocusToSelection() {
+    cameraManager.enable();
+    if (selectionManager.hasSelection()) {
+        cameraManager.focus(selectionManager.worldPosition, selectionManager.worldDimensions,
+                            Menu.isOptionChecked(MENU_EASE_ON_FOCUS));
+    }
+}
+
+function alignGridToSelection() {
+    if (selectionManager.hasSelection()) {
+        if (!grid.getVisible()) {
+            grid.setVisible(true, true);
+        }
+        grid.moveToSelection();
+    }
+}
+
+function alignGridToAvatar() {
+    if (!grid.getVisible()) {
+        grid.setVisible(true, true);
+    }
+    grid.moveToAvatar();
+}
+
+function toggleGridVisibility() {
+    if (!grid.getVisible()) {
+        grid.setVisible(true, true);
+    } else {
+        grid.setVisible(false, true);
+    }
+}
+
 }()); // END LOCAL_SCOPE

From 7d364add6621f0fa0eca5bd0ce3c17a77b989ba2 Mon Sep 17 00:00:00 2001
From: Alezia Kurdis <60075796+AleziaKurdis@users.noreply.github.com>
Date: Mon, 30 Nov 2020 00:37:18 -0500
Subject: [PATCH 29/62] Create App "tools" menu implementation

Create App "tools" menu implementation
---
 .../system/create/entityList/entityList.js    | 22 +++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/scripts/system/create/entityList/entityList.js b/scripts/system/create/entityList/entityList.js
index 58cf4ce892..8ca62e780f 100644
--- a/scripts/system/create/entityList/entityList.js
+++ b/scripts/system/create/entityList/entityList.js
@@ -381,7 +381,29 @@ EntityListTool = function(shouldUseEditTabletApp) {
             });
         } else if (data.type === 'saveColumnsConfigSetting') {
             Settings.setValue(SETTING_EDITOR_COLUMNS_SETUP, data.columnsData);
+        } else if (data.type === 'importFromFile') {
+            importEntitiesFromFile();
+        } else if (data.type === 'importFromUrl') {
+            importEntitiesFromUrl();
+        } else if (data.type === 'setCameraFocusToSelection') {
+            setCameraFocusToSelection();
+        } else if (data.type === 'alignGridToSelection') {
+            alignGridToSelection();
+        } else if (data.type === 'alignGridToAvatar') {
+            alignGridToAvatar();
+        } else if (data.type === 'toggleGridVisibility') {
+            toggleGridVisibility();
+        } else if (data.type === 'toggleSnapToGrid') {
+            if (!grid.getSnapToGrid()) {
+                grid.setSnapToGrid(true);
+                emitJSONScriptEvent({ "type": "setSnapToGrid", "snap": true }); 
+            } else {
+                grid.setSnapToGrid(false);
+                emitJSONScriptEvent({ "type": "setSnapToGrid", "snap": false }); 
+            }            
         }
+        
+        
     };
 
     webView.webEventReceived.connect(onWebEventReceived);

From 889b74dd045313b6ad0156dd9b8b49da8d197af4 Mon Sep 17 00:00:00 2001
From: Alezia Kurdis <60075796+AleziaKurdis@users.noreply.github.com>
Date: Mon, 30 Nov 2020 00:37:48 -0500
Subject: [PATCH 30/62] Create App "tools" menu implementation

Create App "tools" menu implementation
---
 .../create/entityList/html/entityList.html    | 69 +++++++++++++++++--
 1 file changed, 64 insertions(+), 5 deletions(-)

diff --git a/scripts/system/create/entityList/html/entityList.html b/scripts/system/create/entityList/html/entityList.html
index a5f27bd3a8..dc76b1a866 100644
--- a/scripts/system/create/entityList/html/entityList.html
+++ b/scripts/system/create/entityList/html/entityList.html
@@ -32,8 +32,9 @@
             </div>
             <button id="toggle-space-mode" class="hifi-edit-button space-mode-local">Local</button>
             <input type="button" class="vglyph" id="hmdmultiselect" value="I" style="display: none;" />
-            <input type="button" class="normal" id="selection" value="Selection..." />
-            <input type="button" class="normal" id="actions" value="Actions..." />
+            <input type="button" class="normal" id="selection" value="Select&#9662;" />
+            <input type="button" class="normal" id="actions" value="Edit&#9662;" />
+            <input type="button" class="normal" id="tools" value="Tools&#9662;" />
         </div>
         <div id="entity-list">
             <div id="filter-area">
@@ -159,7 +160,7 @@
         <div class="entity-list-menu" id="selection-menu" >
             <button class="menu-button" id="selectall" >
                 <div class = "menu-item">
-                    <div class = "menu-item-caption">Select All</div>
+                    <div class = "menu-item-caption">Select All (in List)</div>
                     <div class = "menu-item-shortcut">Ctrl-A</div>
                 </div>
             </button>
@@ -171,7 +172,7 @@
             </button>            
             <button class="menu-button" id="selectinverse" >
                 <div class = "menu-item">
-                    <div class = "menu-item-caption">Inverse Selection</div>
+                    <div class = "menu-item-caption">Inverse Selection (in List)</div>
                     <div class = "menu-item-shortcut">Ctrl-I</div>
                 </div>
             </button>
@@ -219,13 +220,71 @@
                     <div class = "menu-item-shortcut"></div>
                 </div>
             </button>
-            <div class="menu-separator"></div>
+        </div>
+        <div class="entity-list-menu" id="tools-menu" >
+            <button class="menu-button" id="setCameraFocusToSelection" >
+                <div class = "menu-item">
+                    <div class = "menu-item-caption">Set Camera Focus To Selection</div>
+                    <div class = "menu-item-shortcut">F</div>
+                </div>
+            </button>
             <button class="menu-button" id="teleport-to-entity" >
                 <div class = "menu-item">
                     <div class = "menu-item-caption">Teleport To Selected Entities</div>
                     <div class = "menu-item-shortcut"></div>
                 </div>
             </button>
+            <div class="menu-separator"></div>
+            <button class="menu-button" id="toggleLocalWorldMode" >
+                <div class = "menu-item">
+                    <div class = "menu-item-caption">Toggle Local/World Mode</div>
+                    <div class = "menu-item-shortcut">T</div>
+                </div>
+            </button>
+            <div class="menu-separator"></div>
+            <button class="menu-button" id="exportSelectedEntities" >
+                <div class = "menu-item">
+                    <div class = "menu-item-caption">Export Selected Entities</div>
+                    <div class = "menu-item-shortcut"></div>
+                </div>
+            </button>
+            <button class="menu-button" id="importEntitiesFromFile" >
+                <div class = "menu-item">
+                    <div class = "menu-item-caption">Import Entities (.json) From a File</div>
+                    <div class = "menu-item-shortcut"></div>
+                </div>
+            </button>
+            <button class="menu-button" id="importEntitiesFromUrl" >
+                <div class = "menu-item">
+                    <div class = "menu-item-caption">Import Entities (.json) From a URL</div>
+                    <div class = "menu-item-shortcut"></div>
+                </div>
+            </button>            
+            <div class="menu-separator"></div>
+            <button class="menu-button" id="gridActivator" >
+                <div class = "menu-item">
+                    <div class = "menu-item-caption">Toggle Grid</div>
+                    <div class = "menu-item-shortcut"></div>
+                </div>
+            </button>
+            <button class="menu-button" id="snapToGridActivator" >
+                <div class = "menu-item">
+                    <div class = "menu-item-caption" id="snapToGridActivatorCaption">Activate Snap to Grid [OFF]</div>
+                    <div class = "menu-item-shortcut"></div>
+                </div>
+            </button>
+            <button class="menu-button" id="alignGridToSelection" >
+                <div class = "menu-item">
+                    <div class = "menu-item-caption">Align Grid to Selected Entities</div>
+                    <div class = "menu-item-shortcut">G</div>
+                </div>
+            </button>
+            <button class="menu-button" id="alignGridToAvatar" >
+                <div class = "menu-item">
+                    <div class = "menu-item-caption">Align Grid to Avatar</div>
+                    <div class = "menu-item-shortcut"></div>
+                </div>
+            </button>            
         </div>
         <div id="menuBackgroundOverlay" ></div>
     </body>

From 64caa54d08abcb2696d1fb3a993d1550b0889091 Mon Sep 17 00:00:00 2001
From: Alezia Kurdis <60075796+AleziaKurdis@users.noreply.github.com>
Date: Mon, 30 Nov 2020 00:38:31 -0500
Subject: [PATCH 31/62] Create App "tools" menu implementation

Create App "tools" menu implementation
---
 .../create/entityList/html/js/entityList.js   | 71 ++++++++++++++++++-
 1 file changed, 70 insertions(+), 1 deletion(-)

diff --git a/scripts/system/create/entityList/html/js/entityList.js b/scripts/system/create/entityList/html/js/entityList.js
index 89eac5fb2f..7c882a4199 100644
--- a/scripts/system/create/entityList/html/js/entityList.js
+++ b/scripts/system/create/entityList/html/js/entityList.js
@@ -226,6 +226,7 @@ let elEntityTable,
     elToggleVisible,
     elActionsMenu,
     elSelectionMenu,
+    elToolsMenu,    
     elMenuBackgroundOverlay,
     elHmdMultiSelect, 
     elHmdCopy,
@@ -249,6 +250,16 @@ let elEntityTable,
     elSelectFamily,
     elSelectTopFamily,
     elTeleportToEntity,
+    elSetCameraFocusToSelection,
+    elToggleLocalWorldMode,
+    elExportSelectedEntities,
+    elImportEntitiesFromFile,
+    elImportEntitiesFromUrl,
+    elGridActivator,
+    elSnapToGridActivator,
+    elSnapToGridActivatorCaption,
+    elAlignGridToSelection,
+    elAlignGridToAvatar,
     elFilterTypeMultiselectBox,
     elFilterTypeText,
     elFilterTypeOptions,
@@ -298,6 +309,7 @@ function loaded() {
         elHmdMultiSelect = document.getElementById("hmdmultiselect");
         elActionsMenu = document.getElementById("actions");
         elSelectionMenu = document.getElementById("selection");
+        elToolsMenu = document.getElementById("tools");
         elMenuBackgroundOverlay = document.getElementById("menuBackgroundOverlay");
         elHmdCopy = document.getElementById("hmdcopy");
         elHmdCut = document.getElementById("hmdcut");
@@ -318,8 +330,18 @@ function loaded() {
         elSelectTopParent = document.getElementById("selecttopparent");
         elAddChildrenToSelection = document.getElementById("addchildrentoselection");
         elSelectFamily = document.getElementById("selectfamily");
-        elSelectTopFamily = document.getElementById("selecttopfamily");
+        elSelectTopFamily = document.getElementById("selecttopfamily");        
         elTeleportToEntity = document.getElementById("teleport-to-entity");
+        elSetCameraFocusToSelection = document.getElementById("setCameraFocusToSelection");
+        elToggleLocalWorldMode = document.getElementById("toggleLocalWorldMode");
+        elExportSelectedEntities = document.getElementById("exportSelectedEntities");
+        elImportEntitiesFromFile = document.getElementById("importEntitiesFromFile");
+        elImportEntitiesFromUrl = document.getElementById("importEntitiesFromUrl");
+        elGridActivator = document.getElementById("gridActivator");
+        elSnapToGridActivator = document.getElementById("snapToGridActivator");
+        elSnapToGridActivatorCaption = document.getElementById("snapToGridActivatorCaption");
+        elAlignGridToSelection = document.getElementById("alignGridToSelection");
+        elAlignGridToAvatar = document.getElementById("alignGridToAvatar");       
         elFilterTypeMultiselectBox = document.getElementById("filter-type-multiselect-box");
         elFilterTypeText = document.getElementById("filter-type-text");
         elFilterTypeOptions = document.getElementById("filter-type-options");
@@ -365,6 +387,10 @@ function loaded() {
             document.getElementById("menuBackgroundOverlay").style.display = "block";
             document.getElementById("selection-menu").style.display = "block";
         };
+        elToolsMenu.onclick = function() {
+            document.getElementById("menuBackgroundOverlay").style.display = "block";
+            document.getElementById("tools-menu").style.display = "block";
+        };
         elMenuBackgroundOverlay.onclick = function() {
             closeAllEntityListMenu();
         };
@@ -498,6 +524,42 @@ function loaded() {
             EventBridge.emitWebEvent(JSON.stringify({ type: "teleportToEntity" }));
             closeAllEntityListMenu();
         };
+        elSetCameraFocusToSelection.onclick = function () {
+            EventBridge.emitWebEvent(JSON.stringify({ type: "setCameraFocusToSelection" }));
+            closeAllEntityListMenu();
+        };
+        elToggleLocalWorldMode.onclick = function () {
+            EventBridge.emitWebEvent(JSON.stringify({ type: 'toggleSpaceMode' }));
+            closeAllEntityListMenu();
+        };
+        elExportSelectedEntities.onclick = function () {
+            EventBridge.emitWebEvent(JSON.stringify({ type: 'export'}));
+            closeAllEntityListMenu();
+        };
+        elImportEntitiesFromFile.onclick = function () {
+            EventBridge.emitWebEvent(JSON.stringify({ type: 'importFromFile'}));
+            closeAllEntityListMenu();
+        };
+        elImportEntitiesFromUrl.onclick = function () {
+            EventBridge.emitWebEvent(JSON.stringify({ type: 'importFromUrl'}));
+            closeAllEntityListMenu();
+        };
+        elGridActivator.onclick = function () {
+            EventBridge.emitWebEvent(JSON.stringify({ type: "toggleGridVisibility" }));
+            closeAllEntityListMenu();
+        };
+        elSnapToGridActivator.onclick = function () {
+            EventBridge.emitWebEvent(JSON.stringify({ type: "toggleSnapToGrid" }));
+            closeAllEntityListMenu();
+        };
+        elAlignGridToSelection.onclick = function () {
+            EventBridge.emitWebEvent(JSON.stringify({ type: "alignGridToSelection" }));
+            closeAllEntityListMenu();
+        };
+        elAlignGridToAvatar.onclick = function () {
+            EventBridge.emitWebEvent(JSON.stringify({ type: "alignGridToAvatar" }));
+            closeAllEntityListMenu();
+        };        
         elToggleSpaceMode.onclick = function() {
             EventBridge.emitWebEvent(JSON.stringify({ type: 'toggleSpaceMode' }));
         };
@@ -1673,6 +1735,12 @@ function loaded() {
                     removeEntities(data.ids);
                 } else if (data.type === "setSpaceMode") {
                     setSpaceMode(data.spaceMode);
+                } else if (data.type === "setSnapToGrid") {
+                    if (data.snap) { 
+                        elSnapToGridActivatorCaption.innerHTML = "Deactivate Snap to Grid [ON]";
+                    } else {
+                        elSnapToGridActivatorCaption.innerHTML = "Activate Snap to Grid [OFF]";
+                    }
                 } else if (data.type === "confirmHMDstate") {
                     if (data.isHmd) {
                         document.getElementById("hmdmultiselect").style.display = "inline";
@@ -1758,6 +1826,7 @@ function loaded() {
         document.getElementById("menuBackgroundOverlay").style.display = "none";
         document.getElementById("selection-menu").style.display = "none";
         document.getElementById("actions-menu").style.display = "none";
+        document.getElementById("tools-menu").style.display = "none";
     }
 
 }

From 1f205365747e5d65512f00be364596a76df73f10 Mon Sep 17 00:00:00 2001
From: Alezia Kurdis <60075796+AleziaKurdis@users.noreply.github.com>
Date: Tue, 1 Dec 2020 00:12:27 -0500
Subject: [PATCH 32/62] Add Grid Actions Shortkeys

Add Grid Actions Shortkeys

Toggle Grid	G
Activate/Deactivate Snap to Grid	H
Align Grid to Selected Entities	J
Align Grid to Avatar	K
---
 scripts/system/create/edit.js | 39 ++++++++++++++++++++++++++++-------
 1 file changed, 32 insertions(+), 7 deletions(-)

diff --git a/scripts/system/create/edit.js b/scripts/system/create/edit.js
index f49b19569a..8e0d3f2536 100644
--- a/scripts/system/create/edit.js
+++ b/scripts/system/create/edit.js
@@ -2044,9 +2044,22 @@ function focusKey(value) {
 }
 function gridKey(value) {
     if (value === 0) { // on release
-        if (selectionManager.hasSelection()) {
-            grid.moveToSelection();
-        }
+        alignGridToSelection();
+    }
+}
+function viewGridKey(value) {
+    if (value === 0) { // on release
+        toggleGridVisibility();
+    }
+}
+function snapKey(value) {
+    if (value === 0) { // on release
+        entityListTool.toggleSnapToGrid();
+    }
+}
+function gridToAvatarKey(value) {
+    if (value === 0) { // on release
+        alignGridToAvatar();
     }
 }
 function recursiveAdd(newParentID, parentData) {
@@ -2391,7 +2404,7 @@ var PropertiesTool = function (opts) {
         }
         var i, properties, dY, diff, newPosition;
         if (data.type === "update") {
-
+            
             if (data.properties || data.propertiesMap) {
                 var propertiesMap = data.propertiesMap;
                 if (propertiesMap === undefined) {
@@ -2446,7 +2459,6 @@ var PropertiesTool = function (opts) {
                 }
             }
 
-
             if (data.onlyUpdateEntities) {
                 blockPropertyUpdates = true;
             } else {
@@ -2455,6 +2467,10 @@ var PropertiesTool = function (opts) {
             }
             selectionManager._update(false, this);
             blockPropertyUpdates = false;
+            
+            if (data.snapToGrid !== undefined) {
+                entityListTool.setListMenuSnapToGrid(data.snapToGrid);
+            }
         } else if (data.type === 'saveUserData' || data.type === 'saveMaterialData') {
             data.ids.forEach(function(entityID) {
                 Entities.editEntity(entityID, data.properties);
@@ -2809,7 +2825,10 @@ if (isOnMacPlatform) {
 }
 mapping.from([Controller.Hardware.Keyboard.T]).to(toggleKey);
 mapping.from([Controller.Hardware.Keyboard.F]).to(focusKey);
-mapping.from([Controller.Hardware.Keyboard.G]).to(gridKey);
+mapping.from([Controller.Hardware.Keyboard.J]).to(gridKey);
+mapping.from([Controller.Hardware.Keyboard.G]).to(viewGridKey);
+mapping.from([Controller.Hardware.Keyboard.H]).to(snapKey);
+mapping.from([Controller.Hardware.Keyboard.K]).to(gridToAvatarKey);
 mapping.from([Controller.Hardware.Keyboard.X])
     .when([Controller.Hardware.Keyboard.Control])
     .to(whenReleased(function() { selectionManager.cutSelectedEntities() }));
@@ -2850,8 +2869,14 @@ keyUpEventFromUIWindow = function(keyUpEvent) {
         toggleKey(pressedValue);
     } else if (keyUpEvent.keyCodeString === "F") {
         focusKey(pressedValue);
-    } else if (keyUpEvent.keyCodeString === "G") {
+    } else if (keyUpEvent.keyCodeString === "J") {
         gridKey(pressedValue);
+    } else if (keyUpEvent.keyCodeString === "G") {
+        viewGridKey(pressedValue);
+    } else if (keyUpEvent.keyCodeString === "H") {
+        snapKey(pressedValue);    
+    } else if (keyUpEvent.keyCodeString === "K") {
+        gridToAvatarKey(pressedValue);
     } else if (keyUpEvent.controlKey && keyUpEvent.keyCodeString === "X") {
         selectionManager.cutSelectedEntities();
     } else if (keyUpEvent.controlKey && keyUpEvent.keyCodeString === "C") {

From 6a31c19747c1f8a8d6fc8b4a783f02ca09812dae Mon Sep 17 00:00:00 2001
From: Alezia Kurdis <60075796+AleziaKurdis@users.noreply.github.com>
Date: Tue, 1 Dec 2020 00:13:26 -0500
Subject: [PATCH 33/62] Add Grid Actions Shortkeys

Add Grid Actions Shortkeys

Toggle Grid	G
Activate/Deactivate Snap to Grid	H
Align Grid to Selected Entities	J
Align Grid to Avatar	K
---
 .../system/create/entityList/entityList.js    | 23 ++++++++++++-------
 1 file changed, 15 insertions(+), 8 deletions(-)

diff --git a/scripts/system/create/entityList/entityList.js b/scripts/system/create/entityList/entityList.js
index 8ca62e780f..a4d4decedb 100644
--- a/scripts/system/create/entityList/entityList.js
+++ b/scripts/system/create/entityList/entityList.js
@@ -146,6 +146,20 @@ EntityListTool = function(shouldUseEditTabletApp) {
         });
     };
 
+    that.setListMenuSnapToGrid = function (isSnapToGrid) {
+        emitJSONScriptEvent({ "type": "setSnapToGrid", "snap": isSnapToGrid });
+    };
+
+    that.toggleSnapToGrid = function () {
+        if (!grid.getSnapToGrid()) {
+            grid.setSnapToGrid(true);
+            emitJSONScriptEvent({ "type": "setSnapToGrid", "snap": true });
+        } else {
+            grid.setSnapToGrid(false);
+            emitJSONScriptEvent({ "type": "setSnapToGrid", "snap": false });
+        }
+    };
+
     function valueIfDefined(value) {
         return value !== undefined ? value : "";
     }
@@ -394,16 +408,9 @@ EntityListTool = function(shouldUseEditTabletApp) {
         } else if (data.type === 'toggleGridVisibility') {
             toggleGridVisibility();
         } else if (data.type === 'toggleSnapToGrid') {
-            if (!grid.getSnapToGrid()) {
-                grid.setSnapToGrid(true);
-                emitJSONScriptEvent({ "type": "setSnapToGrid", "snap": true }); 
-            } else {
-                grid.setSnapToGrid(false);
-                emitJSONScriptEvent({ "type": "setSnapToGrid", "snap": false }); 
-            }            
+            that.toggleSnapToGrid();     
         }
         
-        
     };
 
     webView.webEventReceived.connect(onWebEventReceived);

From 71d0fb52e2c8b96a6458ebecc7987c2ec9076998 Mon Sep 17 00:00:00 2001
From: Alezia Kurdis <60075796+AleziaKurdis@users.noreply.github.com>
Date: Tue, 1 Dec 2020 00:14:15 -0500
Subject: [PATCH 34/62] Add Grid Actions Shortkeys

Add Grid Actions Shortkeys

Toggle Grid	G
Activate/Deactivate Snap to Grid	H
Align Grid to Selected Entities	J
Align Grid to Avatar	K
---
 scripts/system/create/entityList/html/entityList.html | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/scripts/system/create/entityList/html/entityList.html b/scripts/system/create/entityList/html/entityList.html
index dc76b1a866..9817f9ddf9 100644
--- a/scripts/system/create/entityList/html/entityList.html
+++ b/scripts/system/create/entityList/html/entityList.html
@@ -264,25 +264,25 @@
             <button class="menu-button" id="gridActivator" >
                 <div class = "menu-item">
                     <div class = "menu-item-caption">Toggle Grid</div>
-                    <div class = "menu-item-shortcut"></div>
+                    <div class = "menu-item-shortcut">G</div>
                 </div>
             </button>
             <button class="menu-button" id="snapToGridActivator" >
                 <div class = "menu-item">
-                    <div class = "menu-item-caption" id="snapToGridActivatorCaption">Activate Snap to Grid [OFF]</div>
-                    <div class = "menu-item-shortcut"></div>
+                    <div class = "menu-item-caption" id="snapToGridActivatorCaption">Activate Snap to Grid</div>
+                    <div class = "menu-item-shortcut">H</div>
                 </div>
             </button>
             <button class="menu-button" id="alignGridToSelection" >
                 <div class = "menu-item">
                     <div class = "menu-item-caption">Align Grid to Selected Entities</div>
-                    <div class = "menu-item-shortcut">G</div>
+                    <div class = "menu-item-shortcut">J</div>
                 </div>
             </button>
             <button class="menu-button" id="alignGridToAvatar" >
                 <div class = "menu-item">
                     <div class = "menu-item-caption">Align Grid to Avatar</div>
-                    <div class = "menu-item-shortcut"></div>
+                    <div class = "menu-item-shortcut">K</div>
                 </div>
             </button>            
         </div>

From bbde93f54b9e0398ae3a07cddd7cfb47ee12a229 Mon Sep 17 00:00:00 2001
From: Alezia Kurdis <60075796+AleziaKurdis@users.noreply.github.com>
Date: Tue, 1 Dec 2020 00:15:15 -0500
Subject: [PATCH 35/62] Add Grid Actions Shortkeys

Add Grid Actions Shortkeys

Toggle Grid	G
Activate/Deactivate Snap to Grid	H
Align Grid to Selected Entities	J
Align Grid to Avatar	K
---
 scripts/system/create/entityList/html/js/entityList.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/scripts/system/create/entityList/html/js/entityList.js b/scripts/system/create/entityList/html/js/entityList.js
index 7c882a4199..73914c2851 100644
--- a/scripts/system/create/entityList/html/js/entityList.js
+++ b/scripts/system/create/entityList/html/js/entityList.js
@@ -1737,9 +1737,9 @@ function loaded() {
                     setSpaceMode(data.spaceMode);
                 } else if (data.type === "setSnapToGrid") {
                     if (data.snap) { 
-                        elSnapToGridActivatorCaption.innerHTML = "Deactivate Snap to Grid [ON]";
+                        elSnapToGridActivatorCaption.innerHTML = "&#x2713; Deactivate Snap to Grid";
                     } else {
-                        elSnapToGridActivatorCaption.innerHTML = "Activate Snap to Grid [OFF]";
+                        elSnapToGridActivatorCaption.innerHTML = "Activate Snap to Grid";
                     }
                 } else if (data.type === "confirmHMDstate") {
                     if (data.isHmd) {

From 0575971d12b59e60aa6ea8da549abff3699ab392 Mon Sep 17 00:00:00 2001
From: Kalila L <somnilibertas@gmail.com>
Date: Tue, 1 Dec 2020 05:58:01 -0500
Subject: [PATCH 36/62] Fix references 'kasen/core' -> 'master'

---
 BUILD_LINUX.md | 6 ++++--
 hifi_qt.py     | 2 +-
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/BUILD_LINUX.md b/BUILD_LINUX.md
index f6287846ed..8d6062f5e6 100644
--- a/BUILD_LINUX.md
+++ b/BUILD_LINUX.md
@@ -1,9 +1,11 @@
 # Build Linux
 
-*Last Updated on April 11, 2020*
+*Last Updated on December 1, 2020*
 
 Please read the [general build guide](BUILD.md) for information on dependencies required for all platforms. Only Linux specific instructions are found in this file.
 
+You can use the [Vircadia Builder](https://github.com/kasenvr/vircadia-builder) to build on Linux more easily. Alternatively, you can follow the manual steps below.
+
 ## Ubuntu 16.04/18.04 specific build guide
 ### Ubuntu 16.04 only
 Add the following line to *.bash_profile*  
@@ -86,7 +88,7 @@ git fetch -a
 
 Then checkout the main branch with:
 ```bash
-git checkout kasen/core
+git checkout master
 ```
 
 ### Using a custom Qt build
diff --git a/hifi_qt.py b/hifi_qt.py
index 10708e4bc9..b3b3681049 100644
--- a/hifi_qt.py
+++ b/hifi_qt.py
@@ -81,7 +81,7 @@ endif()
             else:
                 print("Sorry, " + distro.name(pretty=True) + " is not supported. Please consider helping us out.")
                 print("It's also possible to build Qt for your distribution, please see the documentation at:")
-                print("https://github.com/kasenvr/project-athena/tree/kasen/core/tools/qt-builder")
+                print("https://github.com/kasenvr/project-athena/tree/master/tools/qt-builder")
                 raise Exception('UNKNOWN LINUX VERSION!!!')
         else:
             print("System      : " + platform.system())

From 510eb08be1ea332daf34fc0d6aea52094da1fdef Mon Sep 17 00:00:00 2001
From: Alezia Kurdis <60075796+AleziaKurdis@users.noreply.github.com>
Date: Tue, 1 Dec 2020 22:56:17 -0500
Subject: [PATCH 37/62] Replace Overlays by Local Entities

1- Replace Overlays by Local Entities
2- Add the missing header with copyright and license
(I have assumed that the author was the same person that make the grid parameter that is referenced there and only used in create App.)
3- Minor requested code change (0.0 instead of 0 in condition using real numbers)
---
 scripts/system/libraries/gridTool.js | 23 +++++++++++++++++------
 1 file changed, 17 insertions(+), 6 deletions(-)

diff --git a/scripts/system/libraries/gridTool.js b/scripts/system/libraries/gridTool.js
index 90a6745ff4..1dbe1fea4c 100644
--- a/scripts/system/libraries/gridTool.js
+++ b/scripts/system/libraries/gridTool.js
@@ -1,3 +1,12 @@
+//  gridTool.js
+//
+//  Created by Ryan Huffman on 6 Nov 2014
+//  Copyright 2014 High Fidelity, Inc.
+//  Copyright 2020 Vircadia contributors.
+//
+//  Distributed under the Apache License, Version 2.0.
+//  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
+//
 /* global keyUpEventFromUIWindow */
 
 var GRID_CONTROLS_HTML_URL = Script.resolvePath('../html/gridControls.html');
@@ -16,18 +25,19 @@ Grid = function() {
 
     var snapToGrid = false;
 
-    var gridOverlay = Overlays.addOverlay("grid", {
+    var gridEntityTool = Entities.addEntity({
+        type: "Grid",
         rotation: Quat.fromPitchYawRollDegrees(90, 0, 0),
         dimensions: { x: scale, y: scale, z: scale },
         position: origin,
         visible: false,
-        drawInFront: false,
+        renderLayer: "world",
         color: gridColor,
         alpha: gridAlpha,
         minorGridEvery: minorGridEvery,
         majorGridEvery: majorGridEvery,
         ignorePickIntersection: true
-    });
+    }, "local");
 
     that.visible = false;
     that.enabled = false;
@@ -166,7 +176,7 @@ Grid = function() {
     
     that.moveToAvatar = function() {
         var position = MyAvatar.getJointPosition("LeftFoot");
-        if (position.x === 0 && position.y === 0 && position.z === 0) {
+        if (position.x === 0.0 && position.y === 0.0 && position.z === 0.0) {
             position = MyAvatar.position;
         }
         that.setPosition(position);        
@@ -222,7 +232,7 @@ Grid = function() {
     };
 
     function updateGrid(noUpdate) {
-        Overlays.editOverlay(gridOverlay, {
+        Entities.editEntity(gridEntityTool, {
             position: { x: 0, y: origin.y, z: 0 },
             visible: that.visible && that.enabled,
             minorGridEvery: minorGridEvery,
@@ -230,6 +240,7 @@ Grid = function() {
             color: gridColor,
             alpha: gridAlpha
         });
+        
 
         if (!noUpdate) {
             that.emitUpdate();
@@ -237,7 +248,7 @@ Grid = function() {
     }
 
     function cleanup() {
-        Overlays.deleteOverlay(gridOverlay);
+        Entities.deleteEntity(gridEntityTool);
     }
 
     that.addListener = function(callback) {

From 5a7188179912ae4ae29a88602ece6d7aacdc0ec6 Mon Sep 17 00:00:00 2001
From: Alezia Kurdis <60075796+AleziaKurdis@users.noreply.github.com>
Date: Tue, 1 Dec 2020 23:04:10 -0500
Subject: [PATCH 38/62] Minor code changes

Minor code changes
---
 scripts/system/create/edit.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/scripts/system/create/edit.js b/scripts/system/create/edit.js
index 8e0d3f2536..5f69548f6b 100644
--- a/scripts/system/create/edit.js
+++ b/scripts/system/create/edit.js
@@ -1482,7 +1482,7 @@ function setupModelMenus() {
         menuItemName: MENU_ENTITY_LIST_DEFAULT_RADIUS,
         afterItem: MENU_SHOW_ZONES_IN_EDIT_MODE
     });
- 
+
     Entities.setLightsArePickable(false);
 }
 
@@ -2404,7 +2404,7 @@ var PropertiesTool = function (opts) {
         }
         var i, properties, dY, diff, newPosition;
         if (data.type === "update") {
-            
+
             if (data.properties || data.propertiesMap) {
                 var propertiesMap = data.propertiesMap;
                 if (propertiesMap === undefined) {

From 670d832c8be42bae74b0025bad329a23425bd55c Mon Sep 17 00:00:00 2001
From: Alezia Kurdis <60075796+AleziaKurdis@users.noreply.github.com>
Date: Tue, 1 Dec 2020 23:32:52 -0500
Subject: [PATCH 39/62] Minor code change

Minor code change
---
 .../create/entityList/html/js/entityList.js   | 132 +++++++++---------
 1 file changed, 66 insertions(+), 66 deletions(-)

diff --git a/scripts/system/create/entityList/html/js/entityList.js b/scripts/system/create/entityList/html/js/entityList.js
index 73914c2851..9ba258b801 100644
--- a/scripts/system/create/entityList/html/js/entityList.js
+++ b/scripts/system/create/entityList/html/js/entityList.js
@@ -9,8 +9,8 @@
 
 const ASCENDING_SORT = 1;
 const DESCENDING_SORT = -1;
-const ASCENDING_STRING = '&#x25B4;';
-const DESCENDING_STRING = '&#x25BE;';
+const ASCENDING_STRING = "&#x25B4;";
+const DESCENDING_STRING = "&#x25BE;";
 const BYTES_PER_MEGABYTE = 1024 * 1024;
 const COLLAPSE_EXTRA_INFO = "E";
 const EXPAND_EXTRA_INFO = "D";
@@ -34,7 +34,7 @@ function displayIfNonZero(number) {
 }
 
 function getFilename(url) {
-    let urlParts = url.split('/');
+    let urlParts = url.split("/");
     return urlParts[urlParts.length - 1];
 }
 
@@ -195,7 +195,7 @@ let lastSelectedEntity;
  */
 let entityListContextMenu = null;
 
-let currentSortColumnID = 'type';
+let currentSortColumnID = "type";
 let currentSortOrder = ASCENDING_SORT;
 let elSortOrders = {};
 let typeFilters = [];
@@ -279,7 +279,7 @@ let elEntityTable,
     elRenameInput;
 
 const ENABLE_PROFILING = false;
-let profileIndent = '';
+let profileIndent = "";
 const PROFILE_NOOP = function(_name, fn, args) {
     fn.apply(this, args);
 } ;
@@ -330,7 +330,7 @@ function loaded() {
         elSelectTopParent = document.getElementById("selecttopparent");
         elAddChildrenToSelection = document.getElementById("addchildrentoselection");
         elSelectFamily = document.getElementById("selectfamily");
-        elSelectTopFamily = document.getElementById("selecttopfamily");        
+        elSelectTopFamily = document.getElementById("selecttopfamily");
         elTeleportToEntity = document.getElementById("teleport-to-entity");
         elSetCameraFocusToSelection = document.getElementById("setCameraFocusToSelection");
         elToggleLocalWorldMode = document.getElementById("toggleLocalWorldMode");
@@ -357,17 +357,17 @@ function loaded() {
         elNoEntitiesMessage = document.getElementById("no-entities");
         elColumnsMultiselectBox = document.getElementById("entity-table-columns-multiselect-box");
         elColumnsOptions = document.getElementById("entity-table-columns-options");
-        elToggleSpaceMode = document.getElementById('toggle-space-mode');
+        elToggleSpaceMode = document.getElementById("toggle-space-mode");
 
         document.body.onclick = onBodyClick;
         elToggleLocked.onclick = function() {
-            EventBridge.emitWebEvent(JSON.stringify({ type: 'toggleLocked' }));
+            EventBridge.emitWebEvent(JSON.stringify({ type: "toggleLocked" }));
         };
         elToggleVisible.onclick = function() {
-            EventBridge.emitWebEvent(JSON.stringify({ type: 'toggleVisible' }));
+            EventBridge.emitWebEvent(JSON.stringify({ type: "toggleVisible" }));
         };
         elExport.onclick = function() {
-            EventBridge.emitWebEvent(JSON.stringify({ type: 'export'}));
+            EventBridge.emitWebEvent(JSON.stringify({ type: "export"}));
         };
         elHmdMultiSelect.onclick = function() {
             if (hmdMultiSelectMode) {
@@ -377,7 +377,7 @@ function loaded() {
                 elHmdMultiSelect.className = "white vglyph";
                 hmdMultiSelectMode = true;
             }
-            EventBridge.emitWebEvent(JSON.stringify({ type: 'hmdMultiSelectMode', value: hmdMultiSelectMode }));
+            EventBridge.emitWebEvent(JSON.stringify({ type: "hmdMultiSelectMode", value: hmdMultiSelectMode }));
         };
         elActionsMenu.onclick = function() {
             document.getElementById("menuBackgroundOverlay").style.display = "block";
@@ -395,43 +395,43 @@ function loaded() {
             closeAllEntityListMenu();
         };
         elHmdCopy.onclick = function() {
-            EventBridge.emitWebEvent(JSON.stringify({ type: 'copy' }));
+            EventBridge.emitWebEvent(JSON.stringify({ type: "copy" }));
             closeAllEntityListMenu();
         };
         elHmdCut.onclick = function() {
-            EventBridge.emitWebEvent(JSON.stringify({ type: 'cut' }));
+            EventBridge.emitWebEvent(JSON.stringify({ type: "cut" }));
             closeAllEntityListMenu();
         };
         elHmdPaste.onclick = function() {
-            EventBridge.emitWebEvent(JSON.stringify({ type: 'paste' }));
+            EventBridge.emitWebEvent(JSON.stringify({ type: "paste" }));
             closeAllEntityListMenu();
         };
         elHmdDuplicate.onclick = function() {
-            EventBridge.emitWebEvent(JSON.stringify({ type: 'duplicate' }));
+            EventBridge.emitWebEvent(JSON.stringify({ type: "duplicate" }));
             closeAllEntityListMenu();
         };
         elParent.onclick = function() {
-            EventBridge.emitWebEvent(JSON.stringify({ type: 'parent' }));
+            EventBridge.emitWebEvent(JSON.stringify({ type: "parent" }));
             closeAllEntityListMenu();
         };
         elUnparent.onclick = function() {
-            EventBridge.emitWebEvent(JSON.stringify({ type: 'unparent' }));
+            EventBridge.emitWebEvent(JSON.stringify({ type: "unparent" }));
             closeAllEntityListMenu();
         };
         elUndo.onclick = function() {
-            EventBridge.emitWebEvent(JSON.stringify({ type: 'undo' }));
+            EventBridge.emitWebEvent(JSON.stringify({ type: "undo" }));
             closeAllEntityListMenu();
         };
         elRedo.onclick = function() {
-            EventBridge.emitWebEvent(JSON.stringify({ type: 'redo' }));
+            EventBridge.emitWebEvent(JSON.stringify({ type: "redo" }));
             closeAllEntityListMenu();
         };         
         elDelete.onclick = function() {
-            EventBridge.emitWebEvent(JSON.stringify({ type: 'delete' }));
+            EventBridge.emitWebEvent(JSON.stringify({ type: "delete" }));
             closeAllEntityListMenu();
         };
         elMoveEntitySelectionToAvatar.onclick = function() {
-            EventBridge.emitWebEvent(JSON.stringify({ type: 'moveEntitySelectionToAvatar' }));
+            EventBridge.emitWebEvent(JSON.stringify({ type: "moveEntitySelectionToAvatar" }));
             closeAllEntityListMenu();
         };
         elSelectAll.onclick = function() {
@@ -493,31 +493,31 @@ function loaded() {
             closeAllEntityListMenu();
         };
         elSelectAllInBox.onclick = function() {
-            EventBridge.emitWebEvent(JSON.stringify({ type: 'selectAllInBox' }));
+            EventBridge.emitWebEvent(JSON.stringify({ type: "selectAllInBox" }));
             closeAllEntityListMenu();
         };
         elSelectAllTouchingBox.onclick = function() {
-            EventBridge.emitWebEvent(JSON.stringify({ type: 'selectAllTouchingBox' }));
+            EventBridge.emitWebEvent(JSON.stringify({ type: "selectAllTouchingBox" }));
             closeAllEntityListMenu();
         };
         elSelectParent.onclick = function() {
-            EventBridge.emitWebEvent(JSON.stringify({ type: 'selectParent' }));
+            EventBridge.emitWebEvent(JSON.stringify({ type: "selectParent" }));
             closeAllEntityListMenu();
         };
         elSelectTopParent.onclick = function() {
-            EventBridge.emitWebEvent(JSON.stringify({ type: 'selectTopParent' }));
+            EventBridge.emitWebEvent(JSON.stringify({ type: "selectTopParent" }));
             closeAllEntityListMenu();
         };
         elAddChildrenToSelection.onclick = function() {
-            EventBridge.emitWebEvent(JSON.stringify({ type: 'addChildrenToSelection' }));
+            EventBridge.emitWebEvent(JSON.stringify({ type: "addChildrenToSelection" }));
             closeAllEntityListMenu();
         };
         elSelectFamily.onclick = function() {
-            EventBridge.emitWebEvent(JSON.stringify({ type: 'selectFamily' }));
+            EventBridge.emitWebEvent(JSON.stringify({ type: "selectFamily" }));
             closeAllEntityListMenu();
         };
         elSelectTopFamily.onclick = function() {
-            EventBridge.emitWebEvent(JSON.stringify({ type: 'selectTopFamily' }));
+            EventBridge.emitWebEvent(JSON.stringify({ type: "selectTopFamily" }));
             closeAllEntityListMenu();
         };
         elTeleportToEntity.onclick = function () {
@@ -529,19 +529,19 @@ function loaded() {
             closeAllEntityListMenu();
         };
         elToggleLocalWorldMode.onclick = function () {
-            EventBridge.emitWebEvent(JSON.stringify({ type: 'toggleSpaceMode' }));
+            EventBridge.emitWebEvent(JSON.stringify({ type: "toggleSpaceMode" }));
             closeAllEntityListMenu();
         };
         elExportSelectedEntities.onclick = function () {
-            EventBridge.emitWebEvent(JSON.stringify({ type: 'export'}));
+            EventBridge.emitWebEvent(JSON.stringify({ type: "export"}));
             closeAllEntityListMenu();
         };
         elImportEntitiesFromFile.onclick = function () {
-            EventBridge.emitWebEvent(JSON.stringify({ type: 'importFromFile'}));
+            EventBridge.emitWebEvent(JSON.stringify({ type: "importFromFile"}));
             closeAllEntityListMenu();
         };
         elImportEntitiesFromUrl.onclick = function () {
-            EventBridge.emitWebEvent(JSON.stringify({ type: 'importFromUrl'}));
+            EventBridge.emitWebEvent(JSON.stringify({ type: "importFromUrl"}));
             closeAllEntityListMenu();
         };
         elGridActivator.onclick = function () {
@@ -561,7 +561,7 @@ function loaded() {
             closeAllEntityListMenu();
         };        
         elToggleSpaceMode.onclick = function() {
-            EventBridge.emitWebEvent(JSON.stringify({ type: 'toggleSpaceMode' }));
+            EventBridge.emitWebEvent(JSON.stringify({ type: "toggleSpaceMode" }));
         };
         elRefresh.onclick = refreshEntities;
         elFilterTypeMultiselectBox.onclick = onToggleTypeDropdown;
@@ -579,11 +579,11 @@ function loaded() {
             let type = FILTER_TYPES[i];
             let typeFilterID = "filter-type-" + type;
             
-            let elDiv = document.createElement('div');
+            let elDiv = document.createElement("div");
             elDiv.onclick = onToggleTypeFilter;
             elFilterTypeOptions.insertBefore(elDiv, elFilterTypeOptionsButtons);
             
-            let elInput = document.createElement('input');
+            let elInput = document.createElement("input");
             elInput.setAttribute("type", "checkbox");
             elInput.setAttribute("id", typeFilterID);
             elInput.setAttribute("filterType", type);
@@ -591,12 +591,12 @@ function loaded() {
             elFilterTypeInputs[type] = elInput;
             elDiv.appendChild(elInput);
             
-            let elLabel = document.createElement('label');
+            let elLabel = document.createElement("label");
             elLabel.setAttribute("for", typeFilterID);
             elLabel.innerText = type;
             elDiv.appendChild(elLabel);
             
-            let elSpan = document.createElement('span');
+            let elSpan = document.createElement("span");
             elSpan.setAttribute("class", "typeIcon");
             elSpan.innerHTML = ENTITY_TYPE_ICON[type];
 
@@ -629,11 +629,11 @@ function loaded() {
                 elTh.innerText = columnData.columnHeader;
             }
             elTh.onmousedown = function(event) {
-                if (event.target.nodeName === 'TH') {
+                if (event.target.nodeName === "TH") {
                     elTargetTh = event.target;
                     targetColumnIndex = parseInt(elTargetTh.getAttribute("columnIndex"));
                     lastColumnSwapPosition = event.clientX;
-                } else if (event.target.nodeName === 'SPAN') {
+                } else if (event.target.nodeName === "SPAN") {
                     elTargetSpan = event.target;
                 }
                 initialThEvent = event;
@@ -656,18 +656,18 @@ function loaded() {
             if (columnData.alwaysShown !== true) { 
                 let columnDropdownID = "entity-table-column-" + columnID;
                 
-                let elDiv = document.createElement('div');
+                let elDiv = document.createElement("div");
                 elDiv.onclick = onToggleColumn;
                 elColumnsOptions.appendChild(elDiv);
                 
-                let elInput = document.createElement('input');
+                let elInput = document.createElement("input");
                 elInput.setAttribute("type", "checkbox");
                 elInput.setAttribute("id", columnDropdownID);
                 elInput.setAttribute("columnID", columnID);
                 elInput.checked = columnData.initiallyShown === true;
                 elDiv.appendChild(elInput);
                 
-                let elLabel = document.createElement('label');
+                let elLabel = document.createElement("label");
                 elLabel.setAttribute("for", columnDropdownID);
                 elLabel.innerText = columnData.dropdownLabel;
                 elDiv.appendChild(elLabel);
@@ -702,7 +702,7 @@ function loaded() {
 
             let elCell = entity.elRow.childNodes[getColumnIndex("name")];
             elRenameInput = document.createElement("input");
-            elRenameInput.setAttribute('class', 'rename-entity');
+            elRenameInput.setAttribute("class", "rename-entity");
             elRenameInput.value = entity.name;
             let ignoreClicks = function(event) {
                 event.stopPropagation();
@@ -767,22 +767,22 @@ function loaded() {
         entityListContextMenu.setOnSelectedCallback(function(optionName, selectedEntityID) {
             switch (optionName) {
                 case "Cut":
-                    EventBridge.emitWebEvent(JSON.stringify({ type: 'cut' }));
+                    EventBridge.emitWebEvent(JSON.stringify({ type: "cut" }));
                     break;
                 case "Copy":
-                    EventBridge.emitWebEvent(JSON.stringify({ type: 'copy' }));
+                    EventBridge.emitWebEvent(JSON.stringify({ type: "copy" }));
                     break;
                 case "Paste":
-                    EventBridge.emitWebEvent(JSON.stringify({ type: 'paste' }));
+                    EventBridge.emitWebEvent(JSON.stringify({ type: "paste" }));
                     break;
                 case "Rename":
                     startRenamingEntity(selectedEntityID);
                     break;
                 case "Duplicate":
-                    EventBridge.emitWebEvent(JSON.stringify({ type: 'duplicate' }));
+                    EventBridge.emitWebEvent(JSON.stringify({ type: "duplicate" }));
                     break;
                 case "Delete":
-                    EventBridge.emitWebEvent(JSON.stringify({ type: 'delete' }));
+                    EventBridge.emitWebEvent(JSON.stringify({ type: "delete" }));
                     break;
             }
         });
@@ -806,11 +806,11 @@ function loaded() {
                 }));
             }
 
-            let enabledContextMenuItems = ['Copy', 'Paste', 'Duplicate'];
+            let enabledContextMenuItems = ["Copy", "Paste", "Duplicate"];
             if (entitiesByID[entityID] && !entitiesByID[entityID].locked) {
-                enabledContextMenuItems.push('Cut');
-                enabledContextMenuItems.push('Rename');
-                enabledContextMenuItems.push('Delete');
+                enabledContextMenuItems.push("Cut");
+                enabledContextMenuItems.push("Rename");
+                enabledContextMenuItems.push("Delete");
             }
 
             entityListContextMenu.open(clickEvent, entityID, enabledContextMenuItems);
@@ -1009,7 +1009,7 @@ function loaded() {
                     if (id === deletedIDs[i]) {
                         let elRow = entities[j].elRow;
                         if (elRow) {
-                            elRow.className = '';
+                            elRow.className = "";
                             elRow.dataset.entityID = EMPTY_ENTITY_ID;
                         }
                         entities.splice(j, 1);
@@ -1092,7 +1092,7 @@ function loaded() {
         }
         
         function refreshEntities() {
-            EventBridge.emitWebEvent(JSON.stringify({ type: 'refresh' }));
+            EventBridge.emitWebEvent(JSON.stringify({ type: "refresh" }));
         }
         
         function refreshFooter() {
@@ -1119,7 +1119,7 @@ function loaded() {
                 if (entity !== undefined) {
                     entity.selected = false;
                     if (entity.elRow) {
-                        entity.elRow.className = '';
+                        entity.elRow.className = "";
                     }
                 }
             });
@@ -1133,9 +1133,9 @@ function loaded() {
                     entity.selected = true;
                     if (entity.elRow) {
                         if (id === lastSelectedEntity) {
-                            entity.elRow.className = 'last-selected';
+                            entity.elRow.className = "last-selected";
                         } else {
-                            entity.elRow.className = 'selected';
+                            entity.elRow.className = "selected";
                         }
                     }
                 } else {
@@ -1206,12 +1206,12 @@ function loaded() {
             // if this entity was previously selected flag it's row as selected
             if (itemData.selected) {
                 if (itemData.id === lastSelectedEntity) {
-                    elRow.className = 'last-selected';
+                    elRow.className = "last-selected";
                 } else {
-                    elRow.className = 'selected';
+                    elRow.className = "selected";
                 }
             } else {
-                elRow.className = '';
+                elRow.className = "";
             }
 
             // if this row previously had an associated entity ID that wasn't the new entity ID then clear
@@ -1264,9 +1264,9 @@ function loaded() {
         }
         
         function onRadiusChange() {
-            elFilterRadius.value = elFilterRadius.value.replace(/[^0-9]/g, '');
+            elFilterRadius.value = elFilterRadius.value.replace(/[^0-9]/g, "");
             elFilterRadius.value = Math.max(elFilterRadius.value, 0);
-            EventBridge.emitWebEvent(JSON.stringify({ type: 'radius', radius: elFilterRadius.value }));
+            EventBridge.emitWebEvent(JSON.stringify({ type: "radius", radius: elFilterRadius.value }));
             refreshEntities();
         }
         
@@ -1487,7 +1487,7 @@ function loaded() {
             }
             
             if (isColumnsSettingLoaded) {
-                EventBridge.emitWebEvent(JSON.stringify({ type: 'saveColumnsConfigSetting', columnsData: columns }));
+                EventBridge.emitWebEvent(JSON.stringify({ type: "saveColumnsConfigSetting", columnsData: columns }));
             }
             
             entityList.refresh();
@@ -1690,7 +1690,7 @@ function loaded() {
             }
 
             EventBridge.emitWebEvent(JSON.stringify({
-                type: 'keyUpEvent',
+                type: "keyUpEvent",
                 keyUpEvent: {
                     code,
                     key,
@@ -1790,7 +1790,7 @@ function loaded() {
                                 }
                             }
                         } else {
-                            EventBridge.emitWebEvent(JSON.stringify({ type: 'saveColumnsConfigSetting', columnsData: "" }));
+                            EventBridge.emitWebEvent(JSON.stringify({ type: "saveColumnsConfigSetting", columnsData: "" }));
                         }
                     }
                     isColumnsSettingLoaded = true;
@@ -1803,7 +1803,7 @@ function loaded() {
         
         window.addEventListener("resize", updateColumnWidths);
         
-        EventBridge.emitWebEvent(JSON.stringify({ type: 'loadConfigSetting' }));
+        EventBridge.emitWebEvent(JSON.stringify({ type: "loadConfigSetting" }));
     });
     
     augmentSpinButtons();

From 726901b087aa11ac4fb9944a14c7a9d85fb1de0f Mon Sep 17 00:00:00 2001
From: Alezia Kurdis <60075796+AleziaKurdis@users.noreply.github.com>
Date: Fri, 4 Dec 2020 23:47:38 -0500
Subject: [PATCH 40/62] Make the Create Tool window larger by default

Previously it was 490px wide (in Desktop)
Now it will be 750 px wide (in Desktop)
The properties tab is now with an acceptable size by default. (which is closer to the landscape display we have in HMD.)

No change in HMD or in-Tablet display.
---
 scripts/system/create/edit.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/scripts/system/create/edit.js b/scripts/system/create/edit.js
index 5f69548f6b..fc3d4fc10f 100644
--- a/scripts/system/create/edit.js
+++ b/scripts/system/create/edit.js
@@ -41,7 +41,7 @@ Script.include([
 var CreateWindow = Script.require('./modules/createWindow.js');
 
 var TITLE_OFFSET = 60;
-var CREATE_TOOLS_WIDTH = 490;
+var CREATE_TOOLS_WIDTH = 750;
 var MAX_DEFAULT_ENTITY_LIST_HEIGHT = 942;
 var ENTIRE_DOMAIN_SCAN_RADIUS = 27713;
 

From 536bf4ef90240202acbe6b7931accdb50ae05aec Mon Sep 17 00:00:00 2001
From: Alezia Kurdis <60075796+AleziaKurdis@users.noreply.github.com>
Date: Fri, 4 Dec 2020 23:50:44 -0500
Subject: [PATCH 41/62] 2 large import button in Desktop

In Desktop mode, the 2 import buttons
are now one over the other and full width.
The text was overlapping with the default Create Tools window size.
---
 scripts/system/create/qml/EditToolsTabView.qml | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/scripts/system/create/qml/EditToolsTabView.qml b/scripts/system/create/qml/EditToolsTabView.qml
index 2403604342..39074946bd 100644
--- a/scripts/system/create/qml/EditToolsTabView.qml
+++ b/scripts/system/create/qml/EditToolsTabView.qml
@@ -210,8 +210,8 @@ TabBar {
                         text: "Import Entities (.json) from a File"
                         color: hifi.buttons.black
                         colorScheme: hifi.colorSchemes.dark
-                        anchors.right: parent.horizontalCenter
-                        anchors.rightMargin: 10
+                        anchors.right: parent.right
+                        anchors.rightMargin: 55
                         anchors.left: parent.left
                         anchors.leftMargin: 55
                         anchors.top: assetServerButton.bottom
@@ -231,9 +231,9 @@ TabBar {
                         colorScheme: hifi.colorSchemes.dark
                         anchors.right: parent.right
                         anchors.rightMargin: 55
-                        anchors.left: parent.horizontalCenter
-                        anchors.leftMargin: 10
-                        anchors.top: assetServerButton.bottom
+                        anchors.left: parent.left
+                        anchors.leftMargin: 55
+                        anchors.top: importButton.bottom
                         anchors.topMargin: 20
                         onClicked: {
                             editRoot.sendToScript({

From 16cc5304ec2c1f6d9e7f5a8918ebf8f02e10bbad Mon Sep 17 00:00:00 2001
From: Kalila <69767640+digisomni@users.noreply.github.com>
Date: Thu, 10 Dec 2020 17:49:41 -0500
Subject: [PATCH 42/62] Update pr_build.yml

---
 .github/workflows/pr_build.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/pr_build.yml b/.github/workflows/pr_build.yml
index a554cb5270..e5a42f67c7 100644
--- a/.github/workflows/pr_build.yml
+++ b/.github/workflows/pr_build.yml
@@ -15,7 +15,7 @@ env:
   RELEASE_NUMBER: ${{ github.event.number }}
   VERSION_CODE: ${{ github.event.number }}
   # Sentry Crash Reporting
-  CMAKE_BACKTRACE_URL: https://sentry.vircadia.dev/api/2/minidump/?sentry_key=dbf6000201a442e0b5462b63e18ee6b1
+  CMAKE_BACKTRACE_URL: ${{ secrets.MINIDUMP_TOKEN }}
   CMAKE_BACKTRACE_TOKEN: PR_${{ github.event.number }}_${{ github.sha }}
 
   # OSX specific variables

From 15b1c51c4900c415673ed0990c9bee2893b881e9 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 10 Dec 2020 22:54:46 +0000
Subject: [PATCH 43/62] Bump ini from 1.3.5 to 1.3.7 in /screenshare

Bumps [ini](https://github.com/isaacs/ini) from 1.3.5 to 1.3.7.
- [Release notes](https://github.com/isaacs/ini/releases)
- [Commits](https://github.com/isaacs/ini/compare/v1.3.5...v1.3.7)

Signed-off-by: dependabot[bot] <support@github.com>
---
 screenshare/package-lock.json | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/screenshare/package-lock.json b/screenshare/package-lock.json
index c7d92d3e17..0857ac396b 100644
--- a/screenshare/package-lock.json
+++ b/screenshare/package-lock.json
@@ -1091,9 +1091,9 @@
       "dev": true
     },
     "ini": {
-      "version": "1.3.5",
-      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
-      "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
+      "version": "1.3.7",
+      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz",
+      "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==",
       "dev": true
     },
     "is-arrayish": {

From f5485e858c27c204d1a84ded92ece4de3999c079 Mon Sep 17 00:00:00 2001
From: Kalila L <somnilibertas@gmail.com>
Date: Thu, 10 Dec 2020 18:56:04 -0500
Subject: [PATCH 44/62] Licensing headers.

---
 domain-server/resources/metadata_exporter/index.html          | 2 +-
 .../qml/hifi/dialogs/security/EntityScriptQMLWhitelist.qml    | 4 ++--
 interface/resources/qml/hifi/dialogs/security/Security.qml    | 2 +-
 plugins/JSAPIExample/src/JSAPIExample.cpp                     | 2 +-
 4 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/domain-server/resources/metadata_exporter/index.html b/domain-server/resources/metadata_exporter/index.html
index a22d50fe22..1b18c508cc 100644
--- a/domain-server/resources/metadata_exporter/index.html
+++ b/domain-server/resources/metadata_exporter/index.html
@@ -2,7 +2,7 @@
 //
 //  index.html
 //
-//  Created by kasenvr@gmail.com on 21 Jul 2020
+//  Created by somnilibertas@gmail.com on 21 Jul 2020
 //  Copyright 2020 Vircadia and contributors.
 //
 //  Distributed under the Apache License, Version 2.0.
diff --git a/interface/resources/qml/hifi/dialogs/security/EntityScriptQMLWhitelist.qml b/interface/resources/qml/hifi/dialogs/security/EntityScriptQMLWhitelist.qml
index 9e0b6ba4cf..8180475527 100644
--- a/interface/resources/qml/hifi/dialogs/security/EntityScriptQMLWhitelist.qml
+++ b/interface/resources/qml/hifi/dialogs/security/EntityScriptQMLWhitelist.qml
@@ -2,8 +2,8 @@
 //  EntityScriptQMLWhitelist.qml
 //  interface/resources/qml/hifi/dialogs/security
 //
-//  Created by Kasen IO on 2019.12.05 | realities.dev | kasenvr@gmail.com
-//  Copyright 2019 Kasen IO
+//  Created by Kalila L. on 2019.12.05 | realities.dev | somnilibertas@gmail.com
+//  Copyright 2019 Kalila L.
 //
 //  Distributed under the Apache License, Version 2.0.
 //  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
diff --git a/interface/resources/qml/hifi/dialogs/security/Security.qml b/interface/resources/qml/hifi/dialogs/security/Security.qml
index 918a0a2ca6..b109f83a23 100644
--- a/interface/resources/qml/hifi/dialogs/security/Security.qml
+++ b/interface/resources/qml/hifi/dialogs/security/Security.qml
@@ -314,7 +314,7 @@ Rectangle {
                         onClicked: {
                             lightboxPopup.titleText = "Script Plugin Infrastructure";
                             lightboxPopup.bodyText = "Toggles the activation of scripting plugins in the 'plugins/scripting' folder. \n\n"
-                              + "Created by:\n    humbletim@gmail.com\n    kasenvr@gmail.com";
+                              + "Created by:\n    humbletim@gmail.com\n    somnilibertas@gmail.com";
                             lightboxPopup.button1text = "OK";
                             lightboxPopup.button1method = function() {
                                 lightboxPopup.visible = false;
diff --git a/plugins/JSAPIExample/src/JSAPIExample.cpp b/plugins/JSAPIExample/src/JSAPIExample.cpp
index ed637e198b..91aa8bd32a 100644
--- a/plugins/JSAPIExample/src/JSAPIExample.cpp
+++ b/plugins/JSAPIExample/src/JSAPIExample.cpp
@@ -3,7 +3,7 @@
 //  plugins/JSAPIExample/src
 //
 //  Copyright (c) 2019-2020 humbletim (humbletim@gmail.com)
-//  Copyright (c) 2019 Kalila L. (kasenvr@gmail.com)
+//  Copyright (c) 2019 Kalila L. (somnilibertas@gmail.com)
 //
 //  Distributed under the Apache License, Version 2.0.
 //  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html

From 5d4612e400f3e5bb41618d6fa9392282cfea72be Mon Sep 17 00:00:00 2001
From: Kalila L <somnilibertas@gmail.com>
Date: Thu, 10 Dec 2020 18:56:57 -0500
Subject: [PATCH 45/62] Update 'kasenvr' -> 'vircadia'

---
 BUILD_ANDROID.md                                 |  2 +-
 BUILD_LINUX.md                                   |  4 ++--
 BUILD_WIN.md                                     |  2 +-
 CONTRIBUTING.md                                  | 10 +++++-----
 README.md                                        | 16 ++++++++--------
 android/docker/Dockerfile                        |  2 +-
 .../resources/web/assignment/placeholder.js      |  2 +-
 hifi_qt.py                                       |  2 +-
 .../qml/hifi/dialogs/TabletAboutDialog.qml       |  4 ++--
 libraries/networking/src/NetworkingConstants.h   |  2 +-
 pkg-scripts/README                               |  2 +-
 pkg-scripts/server-control                       |  4 ++--
 pkg-scripts/vircadia-server.spec                 |  2 +-
 scripts/system/more/more.html                    |  4 ++--
 server-console/package.json                      |  2 +-
 15 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/BUILD_ANDROID.md b/BUILD_ANDROID.md
index 0bea3e5a90..4998648227 100644
--- a/BUILD_ANDROID.md
+++ b/BUILD_ANDROID.md
@@ -66,7 +66,7 @@ The above code to suppress modules is not necessary, but will speed up the build
 
 ### Clone the repository
 
-`git clone https://github.com/kasenvr/project-athena.git`
+`git clone https://github.com/vircadia/project-athena.git`
 
 ## Building & Running
 
diff --git a/BUILD_LINUX.md b/BUILD_LINUX.md
index 8d6062f5e6..fa5d3ef206 100644
--- a/BUILD_LINUX.md
+++ b/BUILD_LINUX.md
@@ -4,7 +4,7 @@
 
 Please read the [general build guide](BUILD.md) for information on dependencies required for all platforms. Only Linux specific instructions are found in this file.
 
-You can use the [Vircadia Builder](https://github.com/kasenvr/vircadia-builder) to build on Linux more easily. Alternatively, you can follow the manual steps below.
+You can use the [Vircadia Builder](https://github.com/vircadia/vircadia-builder) to build on Linux more easily. Alternatively, you can follow the manual steps below.
 
 ## Ubuntu 16.04/18.04 specific build guide
 ### Ubuntu 16.04 only
@@ -78,7 +78,7 @@ sudo apt-get install nodejs
 
 Clone this repository:
 ```bash
-git clone https://github.com/kasenvr/project-athena.git
+git clone https://github.com/vircadia/project-athena.git
 ```
 
 To compile a DEV version checkout the branch you need. To get a list of all tags:
diff --git a/BUILD_WIN.md b/BUILD_WIN.md
index c057d9ca5d..aa94eb30de 100644
--- a/BUILD_WIN.md
+++ b/BUILD_WIN.md
@@ -107,7 +107,7 @@ Note: You can also run Interface by launching it from command line or File Explo
 For any problems after Step #6, first try this:  
 * Delete your locally cloned copy of the Vircadia repository  
 * Restart your computer  
-* Redownload the [repository](https://github.com/kasenvr/project-athena)  
+* Redownload the [repository](https://github.com/vircadia/project-athena)  
 * Restart directions from Step #6  
 
 #### CMake gives you the same error message repeatedly after the build fails
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index aeb6f49280..70ddd11ad6 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -20,7 +20,7 @@ Contributing
 6. Update your branch
   
   ```
-  git remote add upstream https://github.com/kasenvr/project-athena
+  git remote add upstream https://github.com/vircadia/project-athena
   git pull upstream master
   ```
   
@@ -38,10 +38,10 @@ Contributing
 Reporting Bugs
 ===
 1. Always update to the latest code on master, we make many merges every day and it is possible the bug has already been fixed!
-2. Search [issues](https://github.com/kasenvr/project-athena/issues) to make sure that somebody has not already reported the same bug. 
-3. [Add](https://github.com/kasenvr/project-athena/issues/new) your report to the issues list!
+2. Search [issues](https://github.com/vircadia/project-athena/issues) to make sure that somebody has not already reported the same bug. 
+3. [Add](https://github.com/vircadia/project-athena/issues/new) your report to the issues list!
 
 Requesting a Feature
 ===
-1. Search [issues](https://github.com/kasenvr/project-athena/issues) to make sure that somebody has not already requested the same feature. 
-2. [Add](https://github.com/kasenvr/project-athena/issues/new) your request to the issues list!
+1. Search [issues](https://github.com/vircadia/project-athena/issues) to make sure that somebody has not already requested the same feature. 
+2. [Add](https://github.com/vircadia/project-athena/issues/new) your request to the issues list!
diff --git a/README.md b/README.md
index baf333d81f..c4de956d1c 100644
--- a/README.md
+++ b/README.md
@@ -8,17 +8,17 @@ Vircadia is a 3D social software project seeking to incrementally bring about a
 
 ### Releases
 
-[View Releases here](https://github.com/kasenvr/project-athena/releases/)
+[View Releases here](https://github.com/vircadia/project-athena/releases/)
 
 ### How to build the Interface
 
-[For Windows](https://github.com/kasenvr/project-athena/blob/master/BUILD_WIN.md)
+[For Windows](https://github.com/vircadia/project-athena/blob/master/BUILD_WIN.md)
 
-[For Mac](https://github.com/kasenvr/project-athena/blob/master/BUILD_OSX.md)
+[For Mac](https://github.com/vircadia/project-athena/blob/master/BUILD_OSX.md)
 
-[For Linux](https://github.com/kasenvr/project-athena/blob/master/BUILD_LINUX.md)
+[For Linux](https://github.com/vircadia/project-athena/blob/master/BUILD_LINUX.md)
 
-[For Linux - Vircadia Builder](https://github.com/kasenvr/vircadia-builder)
+[For Linux - Vircadia Builder](https://github.com/vircadia/vircadia-builder)
 
 ### How to deploy a Server
 
@@ -26,13 +26,13 @@ Vircadia is a 3D social software project seeking to incrementally bring about a
 
 ### How to build a Server
 
-[For Linux - Vircadia Builder](https://github.com/kasenvr/vircadia-builder)
+[For Linux - Vircadia Builder](https://github.com/vircadia/vircadia-builder)
 
 ### How to generate an Installer
 
-[For Windows](https://github.com/kasenvr/project-athena/blob/master/INSTALL.md)
+[For Windows](https://github.com/vircadia/project-athena/blob/master/INSTALL.md)
 
-[For Linux - AppImage - Vircadia Builder](https://github.com/kasenvr/vircadia-builder/blob/master/README.md#building-appimages)
+[For Linux - AppImage - Vircadia Builder](https://github.com/vircadia/vircadia-builder/blob/master/README.md#building-appimages)
 
 ### Boot to Metaverse: The Goal
 
diff --git a/android/docker/Dockerfile b/android/docker/Dockerfile
index 144f6caffa..54f0a544df 100644
--- a/android/docker/Dockerfile
+++ b/android/docker/Dockerfile
@@ -72,7 +72,7 @@ RUN mkdir "$HIFI_BASE" && \
     mkdir "$HIFI_ANDROID_PRECOMPILED"
 
 # Download the repo
-RUN git clone https://github.com/kasenvr/project-athena.git
+RUN git clone https://github.com/vircadia/project-athena.git
 
 WORKDIR /home/gha/project-athena
 
diff --git a/domain-server/resources/web/assignment/placeholder.js b/domain-server/resources/web/assignment/placeholder.js
index 95c9903e32..b0b2f32c4f 100644
--- a/domain-server/resources/web/assignment/placeholder.js
+++ b/domain-server/resources/web/assignment/placeholder.js
@@ -1,3 +1,3 @@
 // Here you can put a script that will be run by an assignment-client (AC)
-// For examples, please go to https://github.com/kasenvr/project-athena/tree/master/script-archive/acScripts
+// For examples, please go to https://github.com/vircadia/project-athena/tree/master/script-archive/acScripts
 // The directory named acScripts contains assignment-client specific scripts you can try.
diff --git a/hifi_qt.py b/hifi_qt.py
index c59c7b1202..d08670c805 100644
--- a/hifi_qt.py
+++ b/hifi_qt.py
@@ -81,7 +81,7 @@ endif()
             else:
                 print("Sorry, " + distro.name(pretty=True) + " is not supported. Please consider helping us out.")
                 print("It's also possible to build Qt for your distribution, please see the documentation at:")
-                print("https://github.com/kasenvr/project-athena/tree/master/tools/qt-builder")
+                print("https://github.com/vircadia/project-athena/tree/master/tools/qt-builder")
                 raise Exception('UNKNOWN LINUX VERSION!!!')
         else:
             print("System      : " + platform.system())
diff --git a/interface/resources/qml/hifi/dialogs/TabletAboutDialog.qml b/interface/resources/qml/hifi/dialogs/TabletAboutDialog.qml
index a943da32a0..09aba7c206 100644
--- a/interface/resources/qml/hifi/dialogs/TabletAboutDialog.qml
+++ b/interface/resources/qml/hifi/dialogs/TabletAboutDialog.qml
@@ -54,10 +54,10 @@ Rectangle {
             textFormat: Text.StyledText
             linkColor: "#00B4EF"
             color: "white"
-            text: "<a href=\"https://github.com/kasenvr/project-athena\">Vircadia Github</a>."
+            text: "<a href=\"https://github.com/vircadia/project-athena\">Vircadia Github</a>."
             size: 20
             onLinkActivated: {
-                About.openUrl("https:/github.com/kasenvr/project-athena");
+                About.openUrl("https:/github.com/vircadia/project-athena");
             }
 
         }
diff --git a/libraries/networking/src/NetworkingConstants.h b/libraries/networking/src/NetworkingConstants.h
index 58cefb35ad..642dd2426e 100644
--- a/libraries/networking/src/NetworkingConstants.h
+++ b/libraries/networking/src/NetworkingConstants.h
@@ -72,7 +72,7 @@ namespace NetworkingConstants {
     const QUrl HELP_FORUM_URL { "https://forums.vircadia.dev" };
     const QUrl HELP_SCRIPTING_REFERENCE_URL{ "https://apidocs.vircadia.dev/" };
     const QUrl HELP_RELEASE_NOTES_URL{ "https://docs.vircadia.dev/release-notes.html" };
-    const QUrl HELP_BUG_REPORT_URL{ "https://github.com/kasenvr/project-athena/issues" };
+    const QUrl HELP_BUG_REPORT_URL{ "https://github.com/vircadia/project-athena/issues" };
     
     const QString DEFAULT_VIRCADIA_ADDRESS = "file:///~/serverless/tutorial.json";
     const QString DEFAULT_HOME_ADDRESS = "file:///~/serverless/tutorial.json";
diff --git a/pkg-scripts/README b/pkg-scripts/README
index 92a9bf00d3..6eb74980d0 100644
--- a/pkg-scripts/README
+++ b/pkg-scripts/README
@@ -1,5 +1,5 @@
 Collection of scripts to create server distribution packages.  Most of these scripts assume
-use of the build script at https://github.com/kasenvr/vircadia-builder, specifically that
+use of the build script at https://github.com/vircadia/vircadia-builder, specifically that
 the following directory structure exists
 
 base folder/
diff --git a/pkg-scripts/server-control b/pkg-scripts/server-control
index c80b8da724..c1a43876a3 100644
--- a/pkg-scripts/server-control
+++ b/pkg-scripts/server-control
@@ -5,8 +5,8 @@ Maintainer: Heather Anderson <heath@odysseus.anderson.name>
 Build-Depends: debhelper (>= 10)
 Standards-Version: 4.1.2
 Homepage: https://vircadia.com
-Vcs-Git: https://github.com/kasenvr/project-athena.git
-Vcs-Browser: https://github.com/kasenvr/project-athena
+Vcs-Git: https://github.com/vircadia/project-athena.git
+Vcs-Browser: https://github.com/vircadia/project-athena
 
 Package: vircadia-server
 Architecture: any
diff --git a/pkg-scripts/vircadia-server.spec b/pkg-scripts/vircadia-server.spec
index 3e0eed896e..575ad9589e 100644
--- a/pkg-scripts/vircadia-server.spec
+++ b/pkg-scripts/vircadia-server.spec
@@ -9,7 +9,7 @@ Summary:        Vircadia metaverse platform, based on the High Fidelity Engine.
 
 License:        ASL 2.0
 URL:            https://vircadia.com
-Source0:        https://github.com/kasenvr/vircadia-builder/blob/master/vircadia-builder
+Source0:        https://github.com/vircadia/vircadia-builder/blob/master/vircadia-builder
 
 #BuildRequires:  systemd-rpm-macros
 BuildRequires:  chrpath
diff --git a/scripts/system/more/more.html b/scripts/system/more/more.html
index db1f73cc85..9d9a7db257 100644
--- a/scripts/system/more/more.html
+++ b/scripts/system/more/more.html
@@ -5,8 +5,8 @@
 //  Created by Keb Helion, February 2020.
 //  Copyright 2020 Vircadia contributors.
 //
-//  App maintained in: https://github.com/kasenvr/community-apps
-//  App copied to: https://github.com/kasenvr/project-athena
+//  App maintained in: https://github.com/vircadia/community-apps
+//  App copied to: https://github.com/vircadia/project-athena
 //
 //
 //  Distributed under the Apache License, Version 2.0.
diff --git a/server-console/package.json b/server-console/package.json
index 1ceed08d4d..b36db74670 100644
--- a/server-console/package.json
+++ b/server-console/package.json
@@ -13,7 +13,7 @@
   },
   "repository": {
     "type": "git",
-    "url": "https://github.com/kasenvr/project-athena.git"
+    "url": "https://github.com/vircadia/project-athena.git"
   },
   "main": "src/main.js",
   "scripts": {

From e8a2de86bbb85355c0e18a22efec9a177c7150ac Mon Sep 17 00:00:00 2001
From: David Rowe <david@ctrlaltstudio.com>
Date: Sat, 12 Dec 2020 20:32:02 +1300
Subject: [PATCH 46/62] Update GitHub links

---
 BUILD_ANDROID.md                                 |  2 +-
 BUILD_LINUX.md                                   |  4 ++--
 BUILD_WIN.md                                     |  2 +-
 CONTRIBUTING.md                                  | 10 +++++-----
 README.md                                        | 16 ++++++++--------
 android/docker/Dockerfile                        |  2 +-
 cmake/ports/etc2comp/portfile.cmake              |  2 +-
 cmake/ports/hifi-scribe/portfile.cmake           |  2 +-
 cmake/ports/nvtt/portfile.cmake                  |  2 +-
 .../resources/web/assignment/placeholder.js      |  2 +-
 hifi_qt.py                                       |  2 +-
 .../qml/hifi/dialogs/TabletAboutDialog.qml       |  4 ++--
 pkg-scripts/README                               |  2 +-
 pkg-scripts/server-control                       |  4 ++--
 pkg-scripts/vircadia-server.spec                 |  2 +-
 scripts/system/more/more.html                    |  4 ++--
 server-console/package.json                      |  2 +-
 17 files changed, 32 insertions(+), 32 deletions(-)

diff --git a/BUILD_ANDROID.md b/BUILD_ANDROID.md
index 0bea3e5a90..ccba877bfe 100644
--- a/BUILD_ANDROID.md
+++ b/BUILD_ANDROID.md
@@ -66,7 +66,7 @@ The above code to suppress modules is not necessary, but will speed up the build
 
 ### Clone the repository
 
-`git clone https://github.com/kasenvr/project-athena.git`
+`git clone https://github.com/vircadia/vircadia.git`
 
 ## Building & Running
 
diff --git a/BUILD_LINUX.md b/BUILD_LINUX.md
index 8d6062f5e6..1047e04ef5 100644
--- a/BUILD_LINUX.md
+++ b/BUILD_LINUX.md
@@ -4,7 +4,7 @@
 
 Please read the [general build guide](BUILD.md) for information on dependencies required for all platforms. Only Linux specific instructions are found in this file.
 
-You can use the [Vircadia Builder](https://github.com/kasenvr/vircadia-builder) to build on Linux more easily. Alternatively, you can follow the manual steps below.
+You can use the [Vircadia Builder](https://github.com/vircadia/vircadia-builder) to build on Linux more easily. Alternatively, you can follow the manual steps below.
 
 ## Ubuntu 16.04/18.04 specific build guide
 ### Ubuntu 16.04 only
@@ -78,7 +78,7 @@ sudo apt-get install nodejs
 
 Clone this repository:
 ```bash
-git clone https://github.com/kasenvr/project-athena.git
+git clone https://github.com/vircadia/vircadia.git
 ```
 
 To compile a DEV version checkout the branch you need. To get a list of all tags:
diff --git a/BUILD_WIN.md b/BUILD_WIN.md
index c057d9ca5d..1035b1c366 100644
--- a/BUILD_WIN.md
+++ b/BUILD_WIN.md
@@ -107,7 +107,7 @@ Note: You can also run Interface by launching it from command line or File Explo
 For any problems after Step #6, first try this:  
 * Delete your locally cloned copy of the Vircadia repository  
 * Restart your computer  
-* Redownload the [repository](https://github.com/kasenvr/project-athena)  
+* Redownload the [repository](https://github.com/vircadia/vircadia)  
 * Restart directions from Step #6  
 
 #### CMake gives you the same error message repeatedly after the build fails
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index aeb6f49280..88dc39ae51 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -20,7 +20,7 @@ Contributing
 6. Update your branch
   
   ```
-  git remote add upstream https://github.com/kasenvr/project-athena
+  git remote add upstream https://github.com/vircadia/vircadia
   git pull upstream master
   ```
   
@@ -38,10 +38,10 @@ Contributing
 Reporting Bugs
 ===
 1. Always update to the latest code on master, we make many merges every day and it is possible the bug has already been fixed!
-2. Search [issues](https://github.com/kasenvr/project-athena/issues) to make sure that somebody has not already reported the same bug. 
-3. [Add](https://github.com/kasenvr/project-athena/issues/new) your report to the issues list!
+2. Search [issues](https://github.com/vircadia/vircadia/issues) to make sure that somebody has not already reported the same bug. 
+3. [Add](https://github.com/vircadia/vircadia/issues/new) your report to the issues list!
 
 Requesting a Feature
 ===
-1. Search [issues](https://github.com/kasenvr/project-athena/issues) to make sure that somebody has not already requested the same feature. 
-2. [Add](https://github.com/kasenvr/project-athena/issues/new) your request to the issues list!
+1. Search [issues](https://github.com/vircadia/vircadia/issues) to make sure that somebody has not already requested the same feature. 
+2. [Add](https://github.com/vircadia/vircadia/issues/new) your request to the issues list!
diff --git a/README.md b/README.md
index baf333d81f..0368799c73 100644
--- a/README.md
+++ b/README.md
@@ -8,17 +8,17 @@ Vircadia is a 3D social software project seeking to incrementally bring about a
 
 ### Releases
 
-[View Releases here](https://github.com/kasenvr/project-athena/releases/)
+[View Releases here](https://github.com/vircadia/vircadia/releases/)
 
 ### How to build the Interface
 
-[For Windows](https://github.com/kasenvr/project-athena/blob/master/BUILD_WIN.md)
+[For Windows](https://github.com/vircadia/vircadia/blob/master/BUILD_WIN.md)
 
-[For Mac](https://github.com/kasenvr/project-athena/blob/master/BUILD_OSX.md)
+[For Mac](https://github.com/vircadia/vircadia/blob/master/BUILD_OSX.md)
 
-[For Linux](https://github.com/kasenvr/project-athena/blob/master/BUILD_LINUX.md)
+[For Linux](https://github.com/vircadia/vircadia/blob/master/BUILD_LINUX.md)
 
-[For Linux - Vircadia Builder](https://github.com/kasenvr/vircadia-builder)
+[For Linux - Vircadia Builder](https://github.com/vircadia/vircadia-builder)
 
 ### How to deploy a Server
 
@@ -26,13 +26,13 @@ Vircadia is a 3D social software project seeking to incrementally bring about a
 
 ### How to build a Server
 
-[For Linux - Vircadia Builder](https://github.com/kasenvr/vircadia-builder)
+[For Linux - Vircadia Builder](https://github.com/vircadia/vircadia-builder)
 
 ### How to generate an Installer
 
-[For Windows](https://github.com/kasenvr/project-athena/blob/master/INSTALL.md)
+[For Windows](https://github.com/vircadia/vircadia/blob/master/INSTALL.md)
 
-[For Linux - AppImage - Vircadia Builder](https://github.com/kasenvr/vircadia-builder/blob/master/README.md#building-appimages)
+[For Linux - AppImage - Vircadia Builder](https://github.com/vircadia/vircadia-builder/blob/master/README.md#building-appimages)
 
 ### Boot to Metaverse: The Goal
 
diff --git a/android/docker/Dockerfile b/android/docker/Dockerfile
index 144f6caffa..266a8854f1 100644
--- a/android/docker/Dockerfile
+++ b/android/docker/Dockerfile
@@ -72,7 +72,7 @@ RUN mkdir "$HIFI_BASE" && \
     mkdir "$HIFI_ANDROID_PRECOMPILED"
 
 # Download the repo
-RUN git clone https://github.com/kasenvr/project-athena.git
+RUN git clone https://github.com/vircadia/vircadia.git
 
 WORKDIR /home/gha/project-athena
 
diff --git a/cmake/ports/etc2comp/portfile.cmake b/cmake/ports/etc2comp/portfile.cmake
index 343f67169b..1369492599 100644
--- a/cmake/ports/etc2comp/portfile.cmake
+++ b/cmake/ports/etc2comp/portfile.cmake
@@ -19,7 +19,7 @@ include(vcpkg_common_functions)
 
 vcpkg_from_github(
     OUT_SOURCE_PATH SOURCE_PATH
-    REPO kasenvr/etc2comp
+    REPO vircadia/etc2comp
     REF 7f1843bf07825c21cab711360c1ddbad04641036
     SHA512 d747076acda8537d39585858c793a35c3dcc9ef283d723619a47f8c81ec1454c95b3340ad35f0655a939eae5b8271c801c48a9a7568311a01903a344c44af25b
     HEAD_REF master
diff --git a/cmake/ports/hifi-scribe/portfile.cmake b/cmake/ports/hifi-scribe/portfile.cmake
index 498e8a455b..19d03b5db4 100644
--- a/cmake/ports/hifi-scribe/portfile.cmake
+++ b/cmake/ports/hifi-scribe/portfile.cmake
@@ -3,7 +3,7 @@ include(vcpkg_common_functions)
 
 vcpkg_from_github(
     OUT_SOURCE_PATH SOURCE_PATH
-    REPO kasenvr/scribe
+    REPO vircadia/scribe
     REF 1bd638a36ca771e5a68d01985b6389b71835cbd2
     SHA512 dbe241d86df3912e544f6b9839873f9875df54efc93822b145e7b13243eaf2e3d690bc8a28b1e52d05bdcd7e68fca6b0b2f5c43ffd0f56a9b7a50d54dcf9e31e
     HEAD_REF master
diff --git a/cmake/ports/nvtt/portfile.cmake b/cmake/ports/nvtt/portfile.cmake
index c7bf068e13..b21bb5609c 100644
--- a/cmake/ports/nvtt/portfile.cmake
+++ b/cmake/ports/nvtt/portfile.cmake
@@ -9,7 +9,7 @@ include(vcpkg_common_functions)
 
 vcpkg_from_github(
     OUT_SOURCE_PATH SOURCE_PATH
-    REPO kasenvr/nvidia-texture-tools
+    REPO vircadia/nvidia-texture-tools
     REF 330c4d56274a0f602a5c70596e2eb670a4ed56c2
     SHA512 4c0bc2f369120d696cc27710b6d33086b27eef55f537ec66b9a5c8b1839bc2426c0413670b0f65be52c5d353468f0126dfe024be1f0690611d4d7e33ac530127
     HEAD_REF master
diff --git a/domain-server/resources/web/assignment/placeholder.js b/domain-server/resources/web/assignment/placeholder.js
index 95c9903e32..3666396d6e 100644
--- a/domain-server/resources/web/assignment/placeholder.js
+++ b/domain-server/resources/web/assignment/placeholder.js
@@ -1,3 +1,3 @@
 // Here you can put a script that will be run by an assignment-client (AC)
-// For examples, please go to https://github.com/kasenvr/project-athena/tree/master/script-archive/acScripts
+// For examples, please go to https://github.com/vircadia/vircadia/tree/master/script-archive/acScripts
 // The directory named acScripts contains assignment-client specific scripts you can try.
diff --git a/hifi_qt.py b/hifi_qt.py
index c59c7b1202..48e9b337a6 100644
--- a/hifi_qt.py
+++ b/hifi_qt.py
@@ -81,7 +81,7 @@ endif()
             else:
                 print("Sorry, " + distro.name(pretty=True) + " is not supported. Please consider helping us out.")
                 print("It's also possible to build Qt for your distribution, please see the documentation at:")
-                print("https://github.com/kasenvr/project-athena/tree/master/tools/qt-builder")
+                print("https://github.com/vircadia/vircadia/tree/master/tools/qt-builder")
                 raise Exception('UNKNOWN LINUX VERSION!!!')
         else:
             print("System      : " + platform.system())
diff --git a/interface/resources/qml/hifi/dialogs/TabletAboutDialog.qml b/interface/resources/qml/hifi/dialogs/TabletAboutDialog.qml
index a943da32a0..f7a4061f45 100644
--- a/interface/resources/qml/hifi/dialogs/TabletAboutDialog.qml
+++ b/interface/resources/qml/hifi/dialogs/TabletAboutDialog.qml
@@ -54,10 +54,10 @@ Rectangle {
             textFormat: Text.StyledText
             linkColor: "#00B4EF"
             color: "white"
-            text: "<a href=\"https://github.com/kasenvr/project-athena\">Vircadia Github</a>."
+            text: "<a href=\"https://github.com/vircadia/vircadia\">Vircadia Github</a>."
             size: 20
             onLinkActivated: {
-                About.openUrl("https:/github.com/kasenvr/project-athena");
+                About.openUrl("https:/github.com/vircadia/vircadia");
             }
 
         }
diff --git a/pkg-scripts/README b/pkg-scripts/README
index 92a9bf00d3..6eb74980d0 100644
--- a/pkg-scripts/README
+++ b/pkg-scripts/README
@@ -1,5 +1,5 @@
 Collection of scripts to create server distribution packages.  Most of these scripts assume
-use of the build script at https://github.com/kasenvr/vircadia-builder, specifically that
+use of the build script at https://github.com/vircadia/vircadia-builder, specifically that
 the following directory structure exists
 
 base folder/
diff --git a/pkg-scripts/server-control b/pkg-scripts/server-control
index c80b8da724..3ed23b7149 100644
--- a/pkg-scripts/server-control
+++ b/pkg-scripts/server-control
@@ -5,8 +5,8 @@ Maintainer: Heather Anderson <heath@odysseus.anderson.name>
 Build-Depends: debhelper (>= 10)
 Standards-Version: 4.1.2
 Homepage: https://vircadia.com
-Vcs-Git: https://github.com/kasenvr/project-athena.git
-Vcs-Browser: https://github.com/kasenvr/project-athena
+Vcs-Git: https://github.com/vircadia/vircadia.git
+Vcs-Browser: https://github.com/vircadia/vircadia
 
 Package: vircadia-server
 Architecture: any
diff --git a/pkg-scripts/vircadia-server.spec b/pkg-scripts/vircadia-server.spec
index 3e0eed896e..575ad9589e 100644
--- a/pkg-scripts/vircadia-server.spec
+++ b/pkg-scripts/vircadia-server.spec
@@ -9,7 +9,7 @@ Summary:        Vircadia metaverse platform, based on the High Fidelity Engine.
 
 License:        ASL 2.0
 URL:            https://vircadia.com
-Source0:        https://github.com/kasenvr/vircadia-builder/blob/master/vircadia-builder
+Source0:        https://github.com/vircadia/vircadia-builder/blob/master/vircadia-builder
 
 #BuildRequires:  systemd-rpm-macros
 BuildRequires:  chrpath
diff --git a/scripts/system/more/more.html b/scripts/system/more/more.html
index db1f73cc85..a8bdaca913 100644
--- a/scripts/system/more/more.html
+++ b/scripts/system/more/more.html
@@ -5,8 +5,8 @@
 //  Created by Keb Helion, February 2020.
 //  Copyright 2020 Vircadia contributors.
 //
-//  App maintained in: https://github.com/kasenvr/community-apps
-//  App copied to: https://github.com/kasenvr/project-athena
+//  App maintained in: https://github.com/vircadia/community-apps
+//  App copied to: https://github.com/vircadia/vircadia
 //
 //
 //  Distributed under the Apache License, Version 2.0.
diff --git a/server-console/package.json b/server-console/package.json
index 1ceed08d4d..d5b2a0793d 100644
--- a/server-console/package.json
+++ b/server-console/package.json
@@ -13,7 +13,7 @@
   },
   "repository": {
     "type": "git",
-    "url": "https://github.com/kasenvr/project-athena.git"
+    "url": "https://github.com/vircadia/vircadia.git"
   },
   "main": "src/main.js",
   "scripts": {

From fe7380630e882baa722a7621c362c18d2f2447dc Mon Sep 17 00:00:00 2001
From: David Rowe <david@ctrlaltstudio.com>
Date: Sat, 12 Dec 2020 21:17:53 +1300
Subject: [PATCH 47/62] Further updates

---
 BUILD_LINUX.md            | 2 +-
 CONTRIBUTING.md           | 2 +-
 android/docker/Dockerfile | 6 +++---
 3 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/BUILD_LINUX.md b/BUILD_LINUX.md
index 1047e04ef5..90782e90b4 100644
--- a/BUILD_LINUX.md
+++ b/BUILD_LINUX.md
@@ -105,7 +105,7 @@ Qt must be installed in `$HIFI_QT_BASE/$VIRCADIA_USE_QT_VERSION/qt5-install`.
 
 Create the build directory:
 ```bash
-cd project-athena
+cd vircadia
 mkdir build
 cd build
 ```
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 88dc39ae51..35b7589e0c 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -6,7 +6,7 @@ Contributing
 2. Clone your fork of the repository locally
 
   ```
-  git clone git://github.com/USERNAME/project-athena.git
+  git clone git://github.com/USERNAME/vircadia.git
   ```
 3. Create a new branch
   
diff --git a/android/docker/Dockerfile b/android/docker/Dockerfile
index 266a8854f1..ab5ddb562d 100644
--- a/android/docker/Dockerfile
+++ b/android/docker/Dockerfile
@@ -74,15 +74,15 @@ RUN mkdir "$HIFI_BASE" && \
 # Download the repo
 RUN git clone https://github.com/vircadia/vircadia.git
 
-WORKDIR /home/gha/project-athena
+WORKDIR /home/gha/vircadia
 
 RUN mkdir build
 
 # Pre-cache the vcpkg managed dependencies
-WORKDIR /home/gha/project-athena/build
+WORKDIR /home/gha/vircadia/build
 RUN python3 ../prebuild.py --build-root `pwd` --android interface
 
 # Pre-cache the gradle dependencies
-WORKDIR /home/gha/project-athena/android
+WORKDIR /home/gha/vircadia/android
 RUN ./gradlew -m tasks -PHIFI_ANDROID_PRECOMPILED=$HIFI_ANDROID_PRECOMPILED
 #RUN ./gradlew extractDependencies -PHIFI_ANDROID_PRECOMPILED=$HIFI_ANDROID_PRECOMPILED 

From a3dfa6a25bb740fa2751488c1f9302ec0e466474 Mon Sep 17 00:00:00 2001
From: Kalila <69767640+digisomni@users.noreply.github.com>
Date: Sun, 13 Dec 2020 03:07:49 -0500
Subject: [PATCH 48/62] Update BUILD_ANDROID.md

Co-authored-by: David Rowe <david@ctrlaltstudio.com>
---
 BUILD_ANDROID.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/BUILD_ANDROID.md b/BUILD_ANDROID.md
index 4998648227..fc73d7905e 100644
--- a/BUILD_ANDROID.md
+++ b/BUILD_ANDROID.md
@@ -66,7 +66,7 @@ The above code to suppress modules is not necessary, but will speed up the build
 
 ### Clone the repository
 
-`git clone https://github.com/vircadia/project-athena.git`
+`git clone https://github.com/vircadia/vircadia.git`
 
 ## Building & Running
 
@@ -119,4 +119,4 @@ Some things you can try if you want to do a clean build
 * In Android Studio, click _File > Invalidate Caches / Restart_ and select _Invalidate and Restart_
 
 If you see lots of "couldn't acquire lock" errors,
-* Open Task Manager and close any running Clang / Gradle processes
\ No newline at end of file
+* Open Task Manager and close any running Clang / Gradle processes

From 5a4210a04f77f826fb80cafb94f45a0b9d0d8d19 Mon Sep 17 00:00:00 2001
From: David Rowe <david@ctrlaltstudio.com>
Date: Sun, 13 Dec 2020 21:56:03 +1300
Subject: [PATCH 49/62] Further updates

---
 .github/workflows/pr_build.yml                 | 2 +-
 android/containerized_build.sh                 | 2 +-
 libraries/networking/src/NetworkingConstants.h | 2 +-
 prebuild.py                                    | 2 +-
 4 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/.github/workflows/pr_build.yml b/.github/workflows/pr_build.yml
index 757a6fd7c8..746a5bf3c3 100644
--- a/.github/workflows/pr_build.yml
+++ b/.github/workflows/pr_build.yml
@@ -169,7 +169,7 @@ jobs:
     - name: Build for Android + Quest
       if: matrix.build_type == 'android'
       shell: bash
-      working-directory: ${{runner.workspace}}/project-athena
+      working-directory: ${{runner.workspace}}/vircadia
       run: |
         echo "Pre-cache the vcpkg managed dependencies"
         $PYTHON_EXEC prebuild.py --build-root ${{runner.workspace}}/build --android interface
diff --git a/android/containerized_build.sh b/android/containerized_build.sh
index 94b5b28831..bbf0b605d8 100755
--- a/android/containerized_build.sh
+++ b/android/containerized_build.sh
@@ -17,7 +17,7 @@ test -z "$STABLE_BUILD" && export STABLE_BUILD=0
 docker run \
    --rm \
    --security-opt seccomp:unconfined \
-   -v "${WORKSPACE}":/home/gha/project-athena \
+   -v "${WORKSPACE}":/home/gha/vircadia \
    -e RELEASE_NUMBER \
    -e RELEASE_TYPE \
    -e ANDROID_APP \
diff --git a/libraries/networking/src/NetworkingConstants.h b/libraries/networking/src/NetworkingConstants.h
index 58cefb35ad..b64a0845ac 100644
--- a/libraries/networking/src/NetworkingConstants.h
+++ b/libraries/networking/src/NetworkingConstants.h
@@ -72,7 +72,7 @@ namespace NetworkingConstants {
     const QUrl HELP_FORUM_URL { "https://forums.vircadia.dev" };
     const QUrl HELP_SCRIPTING_REFERENCE_URL{ "https://apidocs.vircadia.dev/" };
     const QUrl HELP_RELEASE_NOTES_URL{ "https://docs.vircadia.dev/release-notes.html" };
-    const QUrl HELP_BUG_REPORT_URL{ "https://github.com/kasenvr/project-athena/issues" };
+    const QUrl HELP_BUG_REPORT_URL{ "https://github.com/vircadia/vircadia/issues" };
     
     const QString DEFAULT_VIRCADIA_ADDRESS = "file:///~/serverless/tutorial.json";
     const QString DEFAULT_HOME_ADDRESS = "file:///~/serverless/tutorial.json";
diff --git a/prebuild.py b/prebuild.py
index 21363bb9de..d5bed2d813 100644
--- a/prebuild.py
+++ b/prebuild.py
@@ -102,7 +102,7 @@ def parse_args():
     if True:
         args = parser.parse_args()
     else:
-        args = parser.parse_args(['--android', 'questInterface', '--build-root', 'C:/git/project-athena/android/apps/questInterface/.externalNativeBuild/cmake/debug/arm64-v8a'])
+        args = parser.parse_args(['--android', 'questInterface', '--build-root', 'C:/git/vircadia/android/apps/questInterface/.externalNativeBuild/cmake/debug/arm64-v8a'])
     return args
 
 def main():

From 16eca5d8558d9d09e1b0de1ef32e8363eef24d9f Mon Sep 17 00:00:00 2001
From: Kalila L <somnilibertas@gmail.com>
Date: Sun, 13 Dec 2020 04:42:34 -0500
Subject: [PATCH 50/62] Get most 'project-athena' -> 'vircadia' references.

---
 .github/workflows/pr_build.yml                        |  2 +-
 BUILD_LINUX.md                                        |  2 +-
 BUILD_WIN.md                                          |  2 +-
 CONTRIBUTING.md                                       | 10 +++++-----
 README.md                                             | 10 +++++-----
 android/docker/Dockerfile                             |  8 ++++----
 domain-server/resources/web/assignment/placeholder.js |  2 +-
 hifi_qt.py                                            |  2 +-
 libraries/networking/src/NetworkingConstants.h        |  2 +-
 pkg-scripts/server-control                            |  4 ++--
 prebuild.py                                           |  2 +-
 scripts/system/more/more.html                         |  2 +-
 server-console/package.json                           |  2 +-
 13 files changed, 25 insertions(+), 25 deletions(-)

diff --git a/.github/workflows/pr_build.yml b/.github/workflows/pr_build.yml
index 757a6fd7c8..746a5bf3c3 100644
--- a/.github/workflows/pr_build.yml
+++ b/.github/workflows/pr_build.yml
@@ -169,7 +169,7 @@ jobs:
     - name: Build for Android + Quest
       if: matrix.build_type == 'android'
       shell: bash
-      working-directory: ${{runner.workspace}}/project-athena
+      working-directory: ${{runner.workspace}}/vircadia
       run: |
         echo "Pre-cache the vcpkg managed dependencies"
         $PYTHON_EXEC prebuild.py --build-root ${{runner.workspace}}/build --android interface
diff --git a/BUILD_LINUX.md b/BUILD_LINUX.md
index fa5d3ef206..1047e04ef5 100644
--- a/BUILD_LINUX.md
+++ b/BUILD_LINUX.md
@@ -78,7 +78,7 @@ sudo apt-get install nodejs
 
 Clone this repository:
 ```bash
-git clone https://github.com/vircadia/project-athena.git
+git clone https://github.com/vircadia/vircadia.git
 ```
 
 To compile a DEV version checkout the branch you need. To get a list of all tags:
diff --git a/BUILD_WIN.md b/BUILD_WIN.md
index aa94eb30de..1035b1c366 100644
--- a/BUILD_WIN.md
+++ b/BUILD_WIN.md
@@ -107,7 +107,7 @@ Note: You can also run Interface by launching it from command line or File Explo
 For any problems after Step #6, first try this:  
 * Delete your locally cloned copy of the Vircadia repository  
 * Restart your computer  
-* Redownload the [repository](https://github.com/vircadia/project-athena)  
+* Redownload the [repository](https://github.com/vircadia/vircadia)  
 * Restart directions from Step #6  
 
 #### CMake gives you the same error message repeatedly after the build fails
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 70ddd11ad6..88dc39ae51 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -20,7 +20,7 @@ Contributing
 6. Update your branch
   
   ```
-  git remote add upstream https://github.com/vircadia/project-athena
+  git remote add upstream https://github.com/vircadia/vircadia
   git pull upstream master
   ```
   
@@ -38,10 +38,10 @@ Contributing
 Reporting Bugs
 ===
 1. Always update to the latest code on master, we make many merges every day and it is possible the bug has already been fixed!
-2. Search [issues](https://github.com/vircadia/project-athena/issues) to make sure that somebody has not already reported the same bug. 
-3. [Add](https://github.com/vircadia/project-athena/issues/new) your report to the issues list!
+2. Search [issues](https://github.com/vircadia/vircadia/issues) to make sure that somebody has not already reported the same bug. 
+3. [Add](https://github.com/vircadia/vircadia/issues/new) your report to the issues list!
 
 Requesting a Feature
 ===
-1. Search [issues](https://github.com/vircadia/project-athena/issues) to make sure that somebody has not already requested the same feature. 
-2. [Add](https://github.com/vircadia/project-athena/issues/new) your request to the issues list!
+1. Search [issues](https://github.com/vircadia/vircadia/issues) to make sure that somebody has not already requested the same feature. 
+2. [Add](https://github.com/vircadia/vircadia/issues/new) your request to the issues list!
diff --git a/README.md b/README.md
index c4de956d1c..0368799c73 100644
--- a/README.md
+++ b/README.md
@@ -8,15 +8,15 @@ Vircadia is a 3D social software project seeking to incrementally bring about a
 
 ### Releases
 
-[View Releases here](https://github.com/vircadia/project-athena/releases/)
+[View Releases here](https://github.com/vircadia/vircadia/releases/)
 
 ### How to build the Interface
 
-[For Windows](https://github.com/vircadia/project-athena/blob/master/BUILD_WIN.md)
+[For Windows](https://github.com/vircadia/vircadia/blob/master/BUILD_WIN.md)
 
-[For Mac](https://github.com/vircadia/project-athena/blob/master/BUILD_OSX.md)
+[For Mac](https://github.com/vircadia/vircadia/blob/master/BUILD_OSX.md)
 
-[For Linux](https://github.com/vircadia/project-athena/blob/master/BUILD_LINUX.md)
+[For Linux](https://github.com/vircadia/vircadia/blob/master/BUILD_LINUX.md)
 
 [For Linux - Vircadia Builder](https://github.com/vircadia/vircadia-builder)
 
@@ -30,7 +30,7 @@ Vircadia is a 3D social software project seeking to incrementally bring about a
 
 ### How to generate an Installer
 
-[For Windows](https://github.com/vircadia/project-athena/blob/master/INSTALL.md)
+[For Windows](https://github.com/vircadia/vircadia/blob/master/INSTALL.md)
 
 [For Linux - AppImage - Vircadia Builder](https://github.com/vircadia/vircadia-builder/blob/master/README.md#building-appimages)
 
diff --git a/android/docker/Dockerfile b/android/docker/Dockerfile
index 54f0a544df..ab5ddb562d 100644
--- a/android/docker/Dockerfile
+++ b/android/docker/Dockerfile
@@ -72,17 +72,17 @@ RUN mkdir "$HIFI_BASE" && \
     mkdir "$HIFI_ANDROID_PRECOMPILED"
 
 # Download the repo
-RUN git clone https://github.com/vircadia/project-athena.git
+RUN git clone https://github.com/vircadia/vircadia.git
 
-WORKDIR /home/gha/project-athena
+WORKDIR /home/gha/vircadia
 
 RUN mkdir build
 
 # Pre-cache the vcpkg managed dependencies
-WORKDIR /home/gha/project-athena/build
+WORKDIR /home/gha/vircadia/build
 RUN python3 ../prebuild.py --build-root `pwd` --android interface
 
 # Pre-cache the gradle dependencies
-WORKDIR /home/gha/project-athena/android
+WORKDIR /home/gha/vircadia/android
 RUN ./gradlew -m tasks -PHIFI_ANDROID_PRECOMPILED=$HIFI_ANDROID_PRECOMPILED
 #RUN ./gradlew extractDependencies -PHIFI_ANDROID_PRECOMPILED=$HIFI_ANDROID_PRECOMPILED 
diff --git a/domain-server/resources/web/assignment/placeholder.js b/domain-server/resources/web/assignment/placeholder.js
index b0b2f32c4f..3666396d6e 100644
--- a/domain-server/resources/web/assignment/placeholder.js
+++ b/domain-server/resources/web/assignment/placeholder.js
@@ -1,3 +1,3 @@
 // Here you can put a script that will be run by an assignment-client (AC)
-// For examples, please go to https://github.com/vircadia/project-athena/tree/master/script-archive/acScripts
+// For examples, please go to https://github.com/vircadia/vircadia/tree/master/script-archive/acScripts
 // The directory named acScripts contains assignment-client specific scripts you can try.
diff --git a/hifi_qt.py b/hifi_qt.py
index d08670c805..48e9b337a6 100644
--- a/hifi_qt.py
+++ b/hifi_qt.py
@@ -81,7 +81,7 @@ endif()
             else:
                 print("Sorry, " + distro.name(pretty=True) + " is not supported. Please consider helping us out.")
                 print("It's also possible to build Qt for your distribution, please see the documentation at:")
-                print("https://github.com/vircadia/project-athena/tree/master/tools/qt-builder")
+                print("https://github.com/vircadia/vircadia/tree/master/tools/qt-builder")
                 raise Exception('UNKNOWN LINUX VERSION!!!')
         else:
             print("System      : " + platform.system())
diff --git a/libraries/networking/src/NetworkingConstants.h b/libraries/networking/src/NetworkingConstants.h
index 642dd2426e..b64a0845ac 100644
--- a/libraries/networking/src/NetworkingConstants.h
+++ b/libraries/networking/src/NetworkingConstants.h
@@ -72,7 +72,7 @@ namespace NetworkingConstants {
     const QUrl HELP_FORUM_URL { "https://forums.vircadia.dev" };
     const QUrl HELP_SCRIPTING_REFERENCE_URL{ "https://apidocs.vircadia.dev/" };
     const QUrl HELP_RELEASE_NOTES_URL{ "https://docs.vircadia.dev/release-notes.html" };
-    const QUrl HELP_BUG_REPORT_URL{ "https://github.com/vircadia/project-athena/issues" };
+    const QUrl HELP_BUG_REPORT_URL{ "https://github.com/vircadia/vircadia/issues" };
     
     const QString DEFAULT_VIRCADIA_ADDRESS = "file:///~/serverless/tutorial.json";
     const QString DEFAULT_HOME_ADDRESS = "file:///~/serverless/tutorial.json";
diff --git a/pkg-scripts/server-control b/pkg-scripts/server-control
index c1a43876a3..3ed23b7149 100644
--- a/pkg-scripts/server-control
+++ b/pkg-scripts/server-control
@@ -5,8 +5,8 @@ Maintainer: Heather Anderson <heath@odysseus.anderson.name>
 Build-Depends: debhelper (>= 10)
 Standards-Version: 4.1.2
 Homepage: https://vircadia.com
-Vcs-Git: https://github.com/vircadia/project-athena.git
-Vcs-Browser: https://github.com/vircadia/project-athena
+Vcs-Git: https://github.com/vircadia/vircadia.git
+Vcs-Browser: https://github.com/vircadia/vircadia
 
 Package: vircadia-server
 Architecture: any
diff --git a/prebuild.py b/prebuild.py
index 21363bb9de..d5bed2d813 100644
--- a/prebuild.py
+++ b/prebuild.py
@@ -102,7 +102,7 @@ def parse_args():
     if True:
         args = parser.parse_args()
     else:
-        args = parser.parse_args(['--android', 'questInterface', '--build-root', 'C:/git/project-athena/android/apps/questInterface/.externalNativeBuild/cmake/debug/arm64-v8a'])
+        args = parser.parse_args(['--android', 'questInterface', '--build-root', 'C:/git/vircadia/android/apps/questInterface/.externalNativeBuild/cmake/debug/arm64-v8a'])
     return args
 
 def main():
diff --git a/scripts/system/more/more.html b/scripts/system/more/more.html
index 9d9a7db257..a8bdaca913 100644
--- a/scripts/system/more/more.html
+++ b/scripts/system/more/more.html
@@ -6,7 +6,7 @@
 //  Copyright 2020 Vircadia contributors.
 //
 //  App maintained in: https://github.com/vircadia/community-apps
-//  App copied to: https://github.com/vircadia/project-athena
+//  App copied to: https://github.com/vircadia/vircadia
 //
 //
 //  Distributed under the Apache License, Version 2.0.
diff --git a/server-console/package.json b/server-console/package.json
index b36db74670..d5b2a0793d 100644
--- a/server-console/package.json
+++ b/server-console/package.json
@@ -13,7 +13,7 @@
   },
   "repository": {
     "type": "git",
-    "url": "https://github.com/vircadia/project-athena.git"
+    "url": "https://github.com/vircadia/vircadia.git"
   },
   "main": "src/main.js",
   "scripts": {

From 1634138c6278fa4a79e14bf46a6c75bc7b8068c6 Mon Sep 17 00:00:00 2001
From: Kalila <69767640+digisomni@users.noreply.github.com>
Date: Sun, 13 Dec 2020 16:24:42 -0500
Subject: [PATCH 51/62] Apply suggestions from code review

Co-authored-by: David Rowe <david@ctrlaltstudio.com>
---
 interface/resources/qml/hifi/dialogs/TabletAboutDialog.qml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/interface/resources/qml/hifi/dialogs/TabletAboutDialog.qml b/interface/resources/qml/hifi/dialogs/TabletAboutDialog.qml
index 09aba7c206..f7a4061f45 100644
--- a/interface/resources/qml/hifi/dialogs/TabletAboutDialog.qml
+++ b/interface/resources/qml/hifi/dialogs/TabletAboutDialog.qml
@@ -54,10 +54,10 @@ Rectangle {
             textFormat: Text.StyledText
             linkColor: "#00B4EF"
             color: "white"
-            text: "<a href=\"https://github.com/vircadia/project-athena\">Vircadia Github</a>."
+            text: "<a href=\"https://github.com/vircadia/vircadia\">Vircadia Github</a>."
             size: 20
             onLinkActivated: {
-                About.openUrl("https:/github.com/vircadia/project-athena");
+                About.openUrl("https:/github.com/vircadia/vircadia");
             }
 
         }

From 51ebb12d299adfd78ab92cc6ffa26d4fc095c83d Mon Sep 17 00:00:00 2001
From: Adam Ivie <vegaslon@gmail.com>
Date: Sun, 13 Dec 2020 21:18:12 -0500
Subject: [PATCH 52/62] Add Tips for making pull request to CONTRIBUTING.md

---
 CONTRIBUTING.md | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index a62e4b2825..8cc722554c 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,3 +1,4 @@
+
 The project embraces distributed development and if you'd like to help, it would be greatly appreciated. Just open a pull request with the revisions.
 
 Contributing
@@ -21,7 +22,7 @@ Contributing
   
   ```
   git remote add upstream https://github.com/kasenvr/project-athena
-  git pull upstream kasen/core
+  git pull upstream master
   ```
   
   Resolve any conflicts that arise with this step.
@@ -29,12 +30,21 @@ Contributing
 7. Push to your fork
   
   ```
-  git push origin kasen/core
+  git push origin new_branch_name
   ```
 8. Submit a pull request
 
   *You can follow [GitHub's guide](https://help.github.com/articles/creating-a-pull-request) to find out how to create a pull request.*
   
+Tips for Pull Requests 
+===
+To make the QA process go as smoothly as possible.
+
+1. Have a basic description in your pull request. 
+2. Write a basic test plan if added features.
+3. If added any new api make sure they come with some documentation included.
+4. If accessing any external service make note of how to get a basic setup for these services or what they are based on.
+
 Reporting Bugs
 ===
 1. Always update to the latest code on master, we make many merges every day and it is possible the bug has already been fixed!
@@ -44,4 +54,4 @@ Reporting Bugs
 Requesting a Feature
 ===
 1. Search [issues](https://github.com/kasenvr/project-athena/issues) to make sure that somebody has not already requested the same feature. 
-2. [Add](https://github.com/kasenvr/project-athena/issues/new) your request to the issues list!
+2. [Add](https://github.com/kasenvr/project-athena/issues/new) your request to the issues list!
\ No newline at end of file

From 261c2e6cff4f85336556cf67d830095bcda1e386 Mon Sep 17 00:00:00 2001
From: Kalila L <somnilibertas@gmail.com>
Date: Sun, 13 Dec 2020 23:57:04 -0500
Subject: [PATCH 53/62] Final stragglers...?

---
 BUILD_LINUX.md                 | 2 +-
 CONTRIBUTING.md                | 2 +-
 android/containerized_build.sh | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/BUILD_LINUX.md b/BUILD_LINUX.md
index 1047e04ef5..90782e90b4 100644
--- a/BUILD_LINUX.md
+++ b/BUILD_LINUX.md
@@ -105,7 +105,7 @@ Qt must be installed in `$HIFI_QT_BASE/$VIRCADIA_USE_QT_VERSION/qt5-install`.
 
 Create the build directory:
 ```bash
-cd project-athena
+cd vircadia
 mkdir build
 cd build
 ```
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 88dc39ae51..35b7589e0c 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -6,7 +6,7 @@ Contributing
 2. Clone your fork of the repository locally
 
   ```
-  git clone git://github.com/USERNAME/project-athena.git
+  git clone git://github.com/USERNAME/vircadia.git
   ```
 3. Create a new branch
   
diff --git a/android/containerized_build.sh b/android/containerized_build.sh
index 94b5b28831..bbf0b605d8 100755
--- a/android/containerized_build.sh
+++ b/android/containerized_build.sh
@@ -17,7 +17,7 @@ test -z "$STABLE_BUILD" && export STABLE_BUILD=0
 docker run \
    --rm \
    --security-opt seccomp:unconfined \
-   -v "${WORKSPACE}":/home/gha/project-athena \
+   -v "${WORKSPACE}":/home/gha/vircadia \
    -e RELEASE_NUMBER \
    -e RELEASE_TYPE \
    -e ANDROID_APP \

From e5802a29f1f8af96d5ce54e4ef5677f2c63842c1 Mon Sep 17 00:00:00 2001
From: Adam Ivie <vegaslon@gmail.com>
Date: Mon, 14 Dec 2020 18:01:27 -0500
Subject: [PATCH 54/62] Update CONTRIBUTING.md

Co-authored-by: Kalila <69767640+digisomni@users.noreply.github.com>
---
 CONTRIBUTING.md | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 8cc722554c..c87ae17ecd 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -41,9 +41,9 @@ Tips for Pull Requests
 To make the QA process go as smoothly as possible.
 
 1. Have a basic description in your pull request. 
-2. Write a basic test plan if added features.
-3. If added any new api make sure they come with some documentation included.
-4. If accessing any external service make note of how to get a basic setup for these services or what they are based on.
+2. Write a basic test plan if you are altering or adding features.
+3. If a new API is added, try to make sure that some level of basic documentation on how you can utilize it is included.
+4. If an added API or feature requires an external service, try to document or link to instructions on how to create a basic working setup.
 
 Reporting Bugs
 ===
@@ -54,4 +54,4 @@ Reporting Bugs
 Requesting a Feature
 ===
 1. Search [issues](https://github.com/kasenvr/project-athena/issues) to make sure that somebody has not already requested the same feature. 
-2. [Add](https://github.com/kasenvr/project-athena/issues/new) your request to the issues list!
\ No newline at end of file
+2. [Add](https://github.com/kasenvr/project-athena/issues/new) your request to the issues list!

From 5e17639bed67e2e46da6110c1a0ddd7e72c475c5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Julian=20Gro=C3=9F?= <firedefender1@googlemail.com>
Date: Tue, 15 Dec 2020 02:43:39 +0100
Subject: [PATCH 55/62] Fix building with GLES

---
 cmake/ports/glad/portfile.cmake                  | 3 ++-
 libraries/gpu-gl-common/src/gpu/gl/GLBackend.cpp | 8 ++++----
 2 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/cmake/ports/glad/portfile.cmake b/cmake/ports/glad/portfile.cmake
index 54b1d91c89..c13306ed80 100644
--- a/cmake/ports/glad/portfile.cmake
+++ b/cmake/ports/glad/portfile.cmake
@@ -3,11 +3,12 @@ vcpkg_check_linkage(ONLY_STATIC_LIBRARY)
 
 file(READ "${VCPKG_ROOT_DIR}/_env/EXTERNAL_BUILD_ASSETS.txt" EXTERNAL_BUILD_ASSETS)
 
-if (ANDROID)
+if (ANDROID OR ${GLES_OPTION} ON)
     vcpkg_download_distfile(
         SOURCE_ARCHIVE
         URLS ${EXTERNAL_BUILD_ASSETS}/dependencies/glad/glad32es.zip
         SHA512 2e02ac633eed8f2ba2adbf96ea85d08998f48dd2e9ec9a88ec3c25f48eaf1405371d258066327c783772fcb3793bdb82bd7375fdabb2ba5e2ce0835468b17f65
+        FILENAME glad32es.zip
     )
 else()
     # else Linux desktop
diff --git a/libraries/gpu-gl-common/src/gpu/gl/GLBackend.cpp b/libraries/gpu-gl-common/src/gpu/gl/GLBackend.cpp
index 38aca093cd..aa5d3f8ca1 100644
--- a/libraries/gpu-gl-common/src/gpu/gl/GLBackend.cpp
+++ b/libraries/gpu-gl-common/src/gpu/gl/GLBackend.cpp
@@ -153,7 +153,7 @@ void GLBackend::init() {
 
         if (vendor.contains("NVIDIA") ) {
             qCDebug(gpugllogging) << "NVIDIA card detected";
-#if !defined(Q_OS_ANDROID)
+#if !defined(Q_OS_ANDROID) == !defined(USE_GLES)
             GL_GET_INTEGER(GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX);
             GL_GET_INTEGER(GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX);
             GL_GET_INTEGER(GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX);
@@ -170,7 +170,7 @@ void GLBackend::init() {
 
         } else if (vendor.contains("ATI")) {
             qCDebug(gpugllogging) << "ATI card detected";
-#if !defined(Q_OS_ANDROID)
+#if !defined(Q_OS_ANDROID) == !defined(USE_GLES)
             GL_GET_INTEGER(TEXTURE_FREE_MEMORY_ATI);
 #endif
 
@@ -225,12 +225,12 @@ size_t GLBackend::getAvailableMemory() {
 
     switch( _videoCard ) {
         case NVIDIA:
-#if !defined(Q_OS_ANDROID)
+#if !defined(Q_OS_ANDROID) == !defined(USE_GLES)
             glGetIntegerv(GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX, &mem[0]);
 #endif
             return mem[0] * BYTES_PER_KIB;
         case ATI:
-#if !defined(Q_OS_ANDROID)
+#if !defined(Q_OS_ANDROID) == !defined(USE_GLES)
             glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI, &mem[0]);
 #endif
             return mem[0] * BYTES_PER_KIB;

From 0cebb700fbb61753cb992ee750cb4dbbcc4f2d77 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Julian=20Gro=C3=9F?= <firedefender1@googlemail.com>
Date: Tue, 15 Dec 2020 04:15:44 +0100
Subject: [PATCH 56/62] Change conditionals according to review

---
 libraries/gpu-gl-common/src/gpu/gl/GLBackend.cpp | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/libraries/gpu-gl-common/src/gpu/gl/GLBackend.cpp b/libraries/gpu-gl-common/src/gpu/gl/GLBackend.cpp
index aa5d3f8ca1..8126988294 100644
--- a/libraries/gpu-gl-common/src/gpu/gl/GLBackend.cpp
+++ b/libraries/gpu-gl-common/src/gpu/gl/GLBackend.cpp
@@ -153,7 +153,7 @@ void GLBackend::init() {
 
         if (vendor.contains("NVIDIA") ) {
             qCDebug(gpugllogging) << "NVIDIA card detected";
-#if !defined(Q_OS_ANDROID) == !defined(USE_GLES)
+#if !defined(Q_OS_ANDROID) && !defined(USE_GLES)
             GL_GET_INTEGER(GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX);
             GL_GET_INTEGER(GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX);
             GL_GET_INTEGER(GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX);
@@ -170,7 +170,7 @@ void GLBackend::init() {
 
         } else if (vendor.contains("ATI")) {
             qCDebug(gpugllogging) << "ATI card detected";
-#if !defined(Q_OS_ANDROID) == !defined(USE_GLES)
+#if !defined(Q_OS_ANDROID) && !defined(USE_GLES)
             GL_GET_INTEGER(TEXTURE_FREE_MEMORY_ATI);
 #endif
 
@@ -225,12 +225,12 @@ size_t GLBackend::getAvailableMemory() {
 
     switch( _videoCard ) {
         case NVIDIA:
-#if !defined(Q_OS_ANDROID) == !defined(USE_GLES)
+#if !defined(Q_OS_ANDROID) && !defined(USE_GLES)
             glGetIntegerv(GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX, &mem[0]);
 #endif
             return mem[0] * BYTES_PER_KIB;
         case ATI:
-#if !defined(Q_OS_ANDROID) == !defined(USE_GLES)
+#if !defined(Q_OS_ANDROID) && !defined(USE_GLES)
             glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI, &mem[0]);
 #endif
             return mem[0] * BYTES_PER_KIB;

From 3485efd8081c665982ac6104aea86d12fb90503d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Julian=20Gro=C3=9F?= <firedefender1@googlemail.com>
Date: Tue, 15 Dec 2020 05:00:58 +0100
Subject: [PATCH 57/62] Fix failing builds

---
 CMakeLists.txt                  | 12 +++++++++++-
 cmake/ports/glad/portfile.cmake |  3 ++-
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 424fbdc940..33efb2f240 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -41,6 +41,17 @@ endif()
 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/_env/EXTERNAL_BUILD_ASSETS.txt" "${EXTERNAL_BUILD_ASSETS}")
 MESSAGE(STATUS "EXTERNAL_BUILD_ASSETS: ${EXTERNAL_BUILD_ASSETS}")
 
+set(GLES_OPTION OFF)
+
+if( DEFINED ENV{USE_GLES} )
+    set(USE_GLES "$ENV{USE_GLES}")
+    set(GLES_OPTION "$ENV{USE_GLES}")
+endif()
+
+# Will affect VCPKG dependencies
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/_env/USE_GLES.txt" "${GLES_OPTION}")
+MESSAGE(STATUS "GLES_OPTION: ${GLES_OPTION}")
+
 include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/macros/TargetPython.cmake")
 target_python()
 
@@ -129,7 +140,6 @@ set(BUILD_TESTS_OPTION OFF)
 set(BUILD_MANUAL_TESTS_OPTION ${BUILD_TESTS_OPTION})
 set(BUILD_TOOLS_OPTION ON)
 set(BUILD_INSTALLER_OPTION ON)
-set(GLES_OPTION OFF)
 set(DISABLE_QML_OPTION OFF)
 set(DOWNLOAD_SERVERLESS_CONTENT_OPTION OFF)
 
diff --git a/cmake/ports/glad/portfile.cmake b/cmake/ports/glad/portfile.cmake
index c13306ed80..0c2106e581 100644
--- a/cmake/ports/glad/portfile.cmake
+++ b/cmake/ports/glad/portfile.cmake
@@ -2,8 +2,9 @@ include(vcpkg_common_functions)
 vcpkg_check_linkage(ONLY_STATIC_LIBRARY)
 
 file(READ "${VCPKG_ROOT_DIR}/_env/EXTERNAL_BUILD_ASSETS.txt" EXTERNAL_BUILD_ASSETS)
+file(READ "${VCPKG_ROOT_DIR}/_env/USE_GLES.txt" USE_GLES)
 
-if (ANDROID OR ${GLES_OPTION} ON)
+if (ANDROID OR USE_GLES)
     vcpkg_download_distfile(
         SOURCE_ARCHIVE
         URLS ${EXTERNAL_BUILD_ASSETS}/dependencies/glad/glad32es.zip

From 65fb1320ccf4827e22b1b575527871ca52f9627c Mon Sep 17 00:00:00 2001
From: ArcadeFever <arc8defever@gmail.com>
Date: Tue, 15 Dec 2020 00:04:59 -0800
Subject: [PATCH 58/62] Upgraded Oculus SDKs to latest

---
 cmake/macros/TargetOculusMobile.cmake          |  4 ++--
 hifi_android.py                                | 12 ++++++------
 libraries/oculusMobile/src/ovr/Helpers.h       |  6 +++---
 libraries/oculusMobile/src/ovr/VrHandler.cpp   |  2 +-
 .../src/OculusMobileControllerManager.cpp      | 18 +++++++++---------
 5 files changed, 21 insertions(+), 21 deletions(-)

diff --git a/cmake/macros/TargetOculusMobile.cmake b/cmake/macros/TargetOculusMobile.cmake
index f5229845a9..34d5e33058 100644
--- a/cmake/macros/TargetOculusMobile.cmake
+++ b/cmake/macros/TargetOculusMobile.cmake
@@ -1,6 +1,6 @@
 
 macro(target_oculus_mobile)
-    set(INSTALL_DIR ${HIFI_ANDROID_PRECOMPILED}/oculus_1.22/VrApi)
+    set(INSTALL_DIR ${HIFI_ANDROID_PRECOMPILED}/ovr_sdk_mobile_1.37.0/VrApi)
 
     # Mobile SDK
     set(OVR_MOBILE_INCLUDE_DIRS ${INSTALL_DIR}/Include)
@@ -12,7 +12,7 @@ macro(target_oculus_mobile)
     target_link_libraries(${TARGET_NAME} ${OVR_MOBILE_LIBRARIES})
 
     # Platform SDK
-    set(INSTALL_DIR ${HIFI_ANDROID_PRECOMPILED}/oculusPlatform)
+    set(INSTALL_DIR ${HIFI_ANDROID_PRECOMPILED}/ovr_platform_sdk_23.0.0)
     set(OVR_PLATFORM_INCLUDE_DIRS ${INSTALL_DIR}/Include)
     target_include_directories(${TARGET_NAME} PRIVATE ${OVR_PLATFORM_INCLUDE_DIRS})
     set(OVR_PLATFORM_LIBRARIES ${INSTALL_DIR}/Android/libs/arm64-v8a/libovrplatformloader.so)
diff --git a/hifi_android.py b/hifi_android.py
index 06640390d4..07ea00d270 100644
--- a/hifi_android.py
+++ b/hifi_android.py
@@ -39,15 +39,15 @@ ANDROID_PACKAGES = {
         'sharedLibFolder': 'lib',
         'includeLibs': ['libnvtt.so', 'libnvmath.so', 'libnvimage.so', 'libnvcore.so']
     },
-    'oculus_1.22': {
-        'file': 'ovr_sdk_mobile_1.22.zip',
-        'checksum': '1ac3c5b0521e5406f287f351015daff8',
+    'ovr_sdk_mobile_1.37.0': {
+        'file': 'ovr_sdk_mobile_1.37.0.zip',
+        'checksum': '6040e1966f335a3e5015295154cd7383',
         'sharedLibFolder': 'VrApi/Libs/Android/arm64-v8a/Release',
         'includeLibs': ['libvrapi.so']
     },
-    'oculusPlatform': {
-        'file': 'OVRPlatformSDK_v1.34.0.zip',
-        'checksum': '16e4c5f39520f122bc49cb6d5bb88289',
+    'ovr_platform_sdk_23.0.0': {
+        'file': 'ovr_platform_sdk_23.0.0.zip',
+        'checksum': '29d02b560f60d0fa7b8a64cd965dd55b',
         'sharedLibFolder': 'Android/libs/arm64-v8a',
         'includeLibs': ['libovrplatformloader.so']
     },
diff --git a/libraries/oculusMobile/src/ovr/Helpers.h b/libraries/oculusMobile/src/ovr/Helpers.h
index 2bd0b7f603..10058dbac8 100644
--- a/libraries/oculusMobile/src/ovr/Helpers.h
+++ b/libraries/oculusMobile/src/ovr/Helpers.h
@@ -31,9 +31,9 @@ static inline void for_each_eye(const std::function<void(ovrEye)>& f) {
     f(VRAPI_EYE_RIGHT);
 }
 
-static inline void for_each_hand(const std::function<void(ovrHandedness)>& f) {
-    f(VRAPI_HAND_LEFT);
-    f(VRAPI_HAND_RIGHT);
+static inline void for_each_hand(const std::function<void(ovrTrackedDeviceTypeId)>& f) {
+    f(VRAPI_TRACKED_DEVICE_HAND_LEFT);
+    f(VRAPI_TRACKED_DEVICE_HAND_RIGHT);
 }
 
 static inline glm::mat4 toGlm(const ovrMatrix4f& om) {
diff --git a/libraries/oculusMobile/src/ovr/VrHandler.cpp b/libraries/oculusMobile/src/ovr/VrHandler.cpp
index aff1f256b5..1fe4d19401 100644
--- a/libraries/oculusMobile/src/ovr/VrHandler.cpp
+++ b/libraries/oculusMobile/src/ovr/VrHandler.cpp
@@ -324,7 +324,7 @@ struct VrSurface : public TaskQueue {
                     vrapi_SetTrackingSpace( session, VRAPI_TRACKING_SPACE_LOCAL);
                     vrapi_SetPerfThread(session, VRAPI_PERF_THREAD_TYPE_RENDERER, gettid());
                     vrapi_SetClockLevels(session, 2, 4);
-                    vrapi_SetExtraLatencyMode(session, VRAPI_EXTRA_LATENCY_MODE_DYNAMIC);
+                    vrapi_SetExtraLatencyMode(session, VRAPI_EXTRA_LATENCY_MODE_ON);
                     // Generates a warning on the quest: "vrapi_SetDisplayRefreshRate: Dynamic Display Refresh Rate not supported"
                     // vrapi_SetDisplayRefreshRate(session, 72);
                 });
diff --git a/libraries/oculusMobilePlugin/src/OculusMobileControllerManager.cpp b/libraries/oculusMobilePlugin/src/OculusMobileControllerManager.cpp
index 705045b517..54a796954e 100644
--- a/libraries/oculusMobilePlugin/src/OculusMobileControllerManager.cpp
+++ b/libraries/oculusMobilePlugin/src/OculusMobileControllerManager.cpp
@@ -31,7 +31,7 @@ const quint64 LOST_TRACKING_DELAY = 3000000;
 
 namespace ovr {
 
-    controller::Pose toControllerPose(ovrHandedness hand, const ovrRigidBodyPosef& handPose) {
+    controller::Pose toControllerPose(ovrTrackedDeviceTypeId hand, const ovrRigidBodyPosef& handPose) {
         // When the sensor-to-world rotation is identity the coordinate axes look like this:
         //
         //                       user
@@ -111,7 +111,7 @@ namespace ovr {
         return pose;
     }
 
-    controller::Pose toControllerPose(ovrHandedness hand,
+    controller::Pose toControllerPose(ovrTrackedDeviceTypeId hand,
                                       const ovrRigidBodyPosef& handPose,
                                       const ovrRigidBodyPosef& lastHandPose) {
         static const glm::quat yFlip = glm::angleAxis(PI, Vectors::UNIT_Y);
@@ -165,9 +165,9 @@ public:
 
 private:
     void handlePose(float deltaTime, const controller::InputCalibrationData& inputCalibrationData,
-                    ovrHandedness hand, const ovrRigidBodyPosef& handPose);
+                    ovrTrackedDeviceTypeId hand, const ovrRigidBodyPosef& handPose);
     void handleRotationForUntrackedHand(const controller::InputCalibrationData& inputCalibrationData,
-                                        ovrHandedness hand, const ovrRigidBodyPosef& handPose);
+                                        ovrTrackedDeviceTypeId hand, const ovrRigidBodyPosef& handPose);
     void handleHeadPose(float deltaTime, const controller::InputCalibrationData& inputCalibrationData,
                         const ovrRigidBodyPosef& headPose);
 
@@ -379,9 +379,9 @@ void OculusMobileInputDevice::update(float deltaTime, const controller::InputCal
     handleHeadPose(deltaTime, inputCalibrationData, _headTracking.HeadPose);
 
     static const auto REQUIRED_HAND_STATUS = VRAPI_TRACKING_STATUS_ORIENTATION_TRACKED | VRAPI_TRACKING_STATUS_POSITION_TRACKED;
-    ovr::for_each_hand([&](ovrHandedness hand) {
-        size_t handIndex = (hand == VRAPI_HAND_LEFT) ? 0 : 1;
-        int controller = (hand == VRAPI_HAND_LEFT) ? controller::LEFT_HAND : controller::RIGHT_HAND;
+    ovr::for_each_hand([&](ovrTrackedDeviceTypeId hand) {
+        size_t handIndex = (hand == VRAPI_TRACKED_DEVICE_HAND_LEFT) ? 0 : 1;
+        int controller = (hand == VRAPI_TRACKED_DEVICE_HAND_LEFT) ? controller::LEFT_HAND : controller::RIGHT_HAND;
         auto& handData = _hands[handIndex];
         const auto& tracking = handData.tracking;
         ++numTrackedControllers;
@@ -476,7 +476,7 @@ void OculusMobileInputDevice::focusOutEvent() {
 
 void OculusMobileInputDevice::handlePose(float deltaTime,
                                                       const controller::InputCalibrationData& inputCalibrationData,
-                                                      ovrHandedness hand, const ovrRigidBodyPosef& handPose) {
+                                                      ovrTrackedDeviceTypeId hand, const ovrRigidBodyPosef& handPose) {
     auto poseId = (hand == VRAPI_HAND_LEFT) ? controller::LEFT_HAND : controller::RIGHT_HAND;
     auto& pose = _poseStateMap[poseId];
     pose = ovr::toControllerPose(hand, handPose);
@@ -507,7 +507,7 @@ void OculusMobileInputDevice::handleHeadPose(float deltaTime,
 }
 
 void OculusMobileInputDevice::handleRotationForUntrackedHand(const controller::InputCalibrationData& inputCalibrationData,
-                                                                          ovrHandedness hand, const ovrRigidBodyPosef& handPose) {
+                                                                          ovrTrackedDeviceTypeId hand, const ovrRigidBodyPosef& handPose) {
     auto poseId = (hand == VRAPI_HAND_LEFT ? controller::LEFT_HAND : controller::RIGHT_HAND);
     auto& pose = _poseStateMap[poseId];
     const auto& lastHandPose = (hand == VRAPI_HAND_LEFT) ? _hands[0].lastPose : _hands[1].lastPose;

From 4e18382089508a89266360a9456dc35479f9d575 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Julian=20Gro=C3=9F?= <firedefender1@googlemail.com>
Date: Tue, 15 Dec 2020 13:53:17 +0100
Subject: [PATCH 59/62] Work around android not building with set glad32es.zip
 filename

---
 cmake/ports/glad/portfile.cmake | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/cmake/ports/glad/portfile.cmake b/cmake/ports/glad/portfile.cmake
index 0c2106e581..bb6a26a40e 100644
--- a/cmake/ports/glad/portfile.cmake
+++ b/cmake/ports/glad/portfile.cmake
@@ -4,7 +4,13 @@ vcpkg_check_linkage(ONLY_STATIC_LIBRARY)
 file(READ "${VCPKG_ROOT_DIR}/_env/EXTERNAL_BUILD_ASSETS.txt" EXTERNAL_BUILD_ASSETS)
 file(READ "${VCPKG_ROOT_DIR}/_env/USE_GLES.txt" USE_GLES)
 
-if (ANDROID OR USE_GLES)
+if (ANDROID)
+    vcpkg_download_distfile(
+        SOURCE_ARCHIVE
+        URLS ${EXTERNAL_BUILD_ASSETS}/dependencies/glad/glad32es.zip
+        SHA512 2e02ac633eed8f2ba2adbf96ea85d08998f48dd2e9ec9a88ec3c25f48eaf1405371d258066327c783772fcb3793bdb82bd7375fdabb2ba5e2ce0835468b17f65
+    )
+elseif (USE_GLES)
     vcpkg_download_distfile(
         SOURCE_ARCHIVE
         URLS ${EXTERNAL_BUILD_ASSETS}/dependencies/glad/glad32es.zip

From dcd26c8ad6803e32161061d1aa4883d0fd38bb0f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Julian=20Gro=C3=9F?= <firedefender1@googlemail.com>
Date: Tue, 15 Dec 2020 21:19:49 +0100
Subject: [PATCH 60/62] Add comment about `FILENAME` being missing from ANDROID

---
 cmake/ports/glad/portfile.cmake | 1 +
 1 file changed, 1 insertion(+)

diff --git a/cmake/ports/glad/portfile.cmake b/cmake/ports/glad/portfile.cmake
index bb6a26a40e..6e3118b31e 100644
--- a/cmake/ports/glad/portfile.cmake
+++ b/cmake/ports/glad/portfile.cmake
@@ -4,6 +4,7 @@ vcpkg_check_linkage(ONLY_STATIC_LIBRARY)
 file(READ "${VCPKG_ROOT_DIR}/_env/EXTERNAL_BUILD_ASSETS.txt" EXTERNAL_BUILD_ASSETS)
 file(READ "${VCPKG_ROOT_DIR}/_env/USE_GLES.txt" USE_GLES)
 
+# GitHub Actions Android builds fail with `FILENAME` set while desktop builds with GLES fail without a set `FILENAME`.
 if (ANDROID)
     vcpkg_download_distfile(
         SOURCE_ARCHIVE

From b416ca1e174bc5cd530015b8bcf44cfb7d0cc047 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Julian=20Gro=C3=9F?= <firedefender1@googlemail.com>
Date: Wed, 16 Dec 2020 16:50:54 +0100
Subject: [PATCH 61/62] Simplify code according to review

---
 CMakeLists.txt | 7 +------
 1 file changed, 1 insertion(+), 6 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 33efb2f240..f111f482ae 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -41,12 +41,7 @@ endif()
 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/_env/EXTERNAL_BUILD_ASSETS.txt" "${EXTERNAL_BUILD_ASSETS}")
 MESSAGE(STATUS "EXTERNAL_BUILD_ASSETS: ${EXTERNAL_BUILD_ASSETS}")
 
-set(GLES_OPTION OFF)
-
-if( DEFINED ENV{USE_GLES} )
-    set(USE_GLES "$ENV{USE_GLES}")
-    set(GLES_OPTION "$ENV{USE_GLES}")
-endif()
+set(GLES_OPTION "$ENV{USE_GLES}")
 
 # Will affect VCPKG dependencies
 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/_env/USE_GLES.txt" "${GLES_OPTION}")

From 3a7195c21ccba763225e38dbc51531d18416947c Mon Sep 17 00:00:00 2001
From: Adam Ivie <vegaslon@gmail.com>
Date: Wed, 16 Dec 2020 18:37:19 -0500
Subject: [PATCH 62/62] Remove artifact from resolving conflict

Co-authored-by: Kalila <69767640+digisomni@users.noreply.github.com>
---
 CONTRIBUTING.md | 1 -
 1 file changed, 1 deletion(-)

diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index b4d6383f7b..72f296e92e 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -21,7 +21,6 @@ Contributing
 6. Update your branch
   
   ```
-
   git remote add upstream https://github.com/vircadia/vircadia
   git pull upstream master
   ```