From 481125f97857f78147c5a9024f2e5b143f649ce7 Mon Sep 17 00:00:00 2001
From: Martin Allerton <madders@gmail.com>
Date: Wed, 18 Aug 2021 23:54:23 +0100
Subject: [PATCH 1/2] Explore app metaverse api updates

Blended the metaverse api places data in to the list with the beacon data. Also lightened the icons at the top as they were a little lost.
---
 scripts/communityScripts/explore/explore.html | 138 +++++++++++++-----
 .../libraries/axios/axios.min.js              |   3 +
 2 files changed, 103 insertions(+), 38 deletions(-)
 create mode 100644 scripts/communityScripts/libraries/axios/axios.min.js

diff --git a/scripts/communityScripts/explore/explore.html b/scripts/communityScripts/explore/explore.html
index c147dba134..747e969daa 100644
--- a/scripts/communityScripts/explore/explore.html
+++ b/scripts/communityScripts/explore/explore.html
@@ -13,8 +13,18 @@
         #component-templates {
             display: none;
         }
+
+        .thumbnailItem .d-flex {
+            background: rgba(0, 0, 0, 0.2);
+            backdrop-filter: blur(5px);
+            text-shadow: 1px 1px 2px black, 0 0 25px black, 0 0 5px black;
+        }
+
+        .thumbnailItemHover .d-flex {
+            background: rgba(100, 100, 100, 0.2);
+        }
     </style>
-    <!--<script src="js/TestEventBridge.js"></script>-->
+    <!--<script src="../Explore/js/TestEventBridge.js"></script>-->
 </head>
 <body>
     <div id="component-templates">
@@ -22,7 +32,7 @@
             <v-dialog v-model="dialog" fullscreen hide-overlay transition="dialog-bottom-transition">
                 <template v-slot:activator="{ on, attrs }">
                     <v-btn color="grey darken-3" class="ml-5" v-show="permission" value="animations" v-bind="attrs" v-on="on" fab small>
-                        <v-icon color="purple">mdi-map-plus</v-icon>
+                        <v-icon color="purple lighten-2">mdi-map-plus</v-icon>
                     </v-btn>
                 </template>
                 <v-card>
@@ -30,7 +40,7 @@
                         <v-btn icon dark @click="closeDialog();">
                             <v-icon>mdi-close</v-icon>
                         </v-btn>
-                        <v-toolbar-title>Add Location</v-toolbar-title>
+                        <v-toolbar-title>Add Location Beacon</v-toolbar-title>
                         <v-spacer></v-spacer>
                         <v-toolbar-items>
                             <v-btn dark text @click="addLocation()">Save</v-btn>
@@ -101,30 +111,28 @@
                         <template v-slot:default="props">
                             <v-row dense>
                                 <v-col v-for="item in props.items"
-                                       :key="item.name"
+                                       :key="item.index"
                                        cols="12"
                                        sm="6"
                                        md="4"
                                        lg="3">
-                                   <v-hover
-                                       v-slot:default="{ hover }"
-                                   >
-                                        <v-card 
-                                            @click.native="openLocation(item['Visit'])"
-                                            :color="hover ? 'grey darken-3' : 'grey darken-4'"
-                                        >
-                                            <!--<v-card-title class="headline">{{ item["Domain Name"] }}</v-card-title>-->
+                                    <v-hover v-slot:default="{ hover }">
+                                        <v-card @click.native="openLocation(item['location'])"
+                                                :color="hover ? 'grey darken-3' : 'grey darken-4'"
+                                                 :style="item.thumbnail ? 'background-size: cover; background-position: center; background-image: url(' + item.thumbnail +');' : '' "
+                                                 :class="item.thumbnail ? (hover ? 'thumbnailItem thumbnailItemHover' : 'thumbnailItem') : '' "
+                                                >
                                             <div class="d-flex flex-no-wrap justify-space-between">
-                                                <div>
-                                                    <v-card-title class="text-h6 d-block text-truncate pa-2" v-text="item['Domain Name']" style="max-width: 400px;"></v-card-title>
-                                                    <v-card-subtitle class="pa-2 d-block text-truncate" style="max-width: 400px;" v-text="item.Owner"></v-card-subtitle>
-                                                </div>
-                                                <div style="text-align: right;">
-                                                    <v-card-title align-right class="align-right" v-text="item['People']"></v-card-title>
-                                                </div>
+                                                    <div>
+                                                        <v-card-title class="text-h6 d-block text-truncate pa-2" v-text="item['name']" style="max-width: 400px;"></v-card-title>
+                                                        <v-card-subtitle class="pa-2 d-block text-truncate" style="max-width: 400px;" v-text="item.owner"></v-card-subtitle>
+                                                    </div>
+                                                    <div style="text-align: right;">
+                                                        <v-card-title align-right class="align-right" v-text="item['userCount']"></v-card-title>
+                                                    </div>
                                             </div>
                                         </v-card>
-                                    </hover>
+                                    </v-hover>
                                 </v-col>
                             </v-row>
                         </template>
@@ -230,7 +238,7 @@
                     <v-tooltip bottom>
                         <template v-slot:activator="{ on, attrs }">
                             <v-btn v-bind="attrs" v-on="on" color="grey darken-3" class="mx-1" v-show="isHomeSet" value="animations" fab small @click="navigateHome()">
-                                <v-icon color="purple">mdi-home</v-icon>
+                                <v-icon color="purple lighten-2">mdi-home</v-icon>
                             </v-btn>
                         </template>
                         <span>Go Home</span>
@@ -238,7 +246,7 @@
                     <v-tooltip bottom>
                         <template v-slot:activator="{ on, attrs }">
                             <v-btn v-bind="attrs" v-on="on" color="grey darken-3" class="mx-1" value="animations" fab small @click="navigateBack()">
-                                <v-icon color="purple">mdi-arrow-left-bold</v-icon>
+                                <v-icon color="purple lighten-2">mdi-arrow-left-bold</v-icon>
                             </v-btn>
                         </template>
                         <span>Go Back</span>
@@ -246,14 +254,14 @@
                     <v-tooltip bottom>
                         <template v-slot:activator="{ on, attrs }">
                             <v-btn v-bind="attrs" v-on="on" color="grey darken-3" class="mx-1" value="animations" fab small @click="navigateForward()">
-                                <v-icon color="purple">mdi-arrow-right-bold</v-icon>
+                                <v-icon color="purple lighten-2">mdi-arrow-right-bold</v-icon>
                             </v-btn>
                         </template>
                         <span>Go Forward</span>
                     </v-tooltip>
                     <!--<v-btn value="animations" fab small>
-        <v-icon color="purple">mdi-map-marker-plus</v-icon>
-    </v-btn>-->
+                        <v-icon color="purple">mdi-map-marker-plus</v-icon>
+                    </v-btn>-->
                     <add-location ref="addLocation" :permission="permission"></add-location>
                 </v-app-bar>
             </div>
@@ -286,22 +294,76 @@
     <script src="../libraries/vue/vue.min.js"></script>
     <script src="../libraries/vue-router/vue-router.js"></script>
     <script src="../libraries/vuetify/vuetify-v2.3.9.js"></script>
+    <script src="../libraries/axios/axios.min.js"></script>
 
     <script>
         var exploreComponent = null;
         var locationData = null;
+        var placesData = null;
+
+        function blendedData() {
+            var joinedData = [];
+            if (locationData != null) {
+                for (var i = 0; i < locationData.length; i++) {
+                    joinedData.push({
+                        "index": joinedData.length
+                        , "location": locationData[i].Visit
+                        , "name": locationData[i]['Domain Name']
+                        , "owner": locationData[i].Owner
+                        , "userCount": locationData[i].People
+                        , "description": ""
+                        , "thumbnail": ""
+                    });
+                }
+            }
+
+            if (placesData != null) {
+                var activeThresholdTime = new Date();
+                activeThresholdTime.setMinutes(activeThresholdTime.getMinutes() - 15);
+
+                // while blending metaverse data ensure it is cleaned for active domains
+                for (var i = 0; i < placesData.length; i++) {
+                    if (placesData[i].domain.active && placesData[i].visibility == "open" && new Date(placesData[i].last_activity_update) > activeThresholdTime) {
+                        joinedData.push({
+                            "index": joinedData.length
+                            , "location": placesData[i].address
+                            , "name": placesData[i].name
+                            , "owner": placesData[i].managers[0]
+                            , "userCount": placesData[i].current_attendance
+                            , "description": placesData[i].description
+                            , "thumbnail": placesData[i].thumbnail
+                        });
+                    }
+                }
+            }
+
+            return joinedData;
+        }
+
         function getAddressListData(component) {
             exploreComponent = component;
 
-            if (locationData != null) {
-                exploreComponent.updateData(locationData);
-                return;
+            // if json data not loaded fire emti event for it
+            if (locationData == null) {
+                var readyEvent = {
+                    "action": "requestAddressList",
+                };
+                EventBridge.emitWebEvent(JSON.stringify(readyEvent));
             }
 
-            var readyEvent = {
-                "action": "requestAddressList",
-            };
-            EventBridge.emitWebEvent(JSON.stringify(readyEvent));
+            // if metaverse data not loaded fire a request for it
+            if (placesData == null) {
+                // TODO: fire off data get against the metaverse
+                axios.get("https://metaverse.vircadia.com/live/api/v1/places")
+                    .then((response) => {
+                        placesData = response.data.data.places;
+
+                        exploreComponent.updateData(blendedData());
+                    })
+                    .catch(function (error) {
+                        console.log(error);
+                    });
+            }
         }
 
         var bookmarksComponent = null;
@@ -346,8 +408,8 @@
                     page: 1,
                     pageCount: 0,
                     itemsPerPage: 6,
-                    sortBy: 'People',
-                    items: [], 
+                    sortBy: 'userCount',
+                    items: [],
                 }
             },
             template: document.getElementById("explore-template").innerHTML,
@@ -544,7 +606,7 @@
                     if (messageData.action == "addressListv2") {
                         self.permission = messageData.permission;
                         locationData = messageData.myAddress;
-                        exploreComponent.updateData(locationData);
+                        exploreComponent.updateData(blendedData());
                         self.isHomeSet = messageData.isHomeSet;
                     }
                     if (messageData.action == "bookmarksList") {
@@ -553,9 +615,9 @@
                     }
                     if (messageData.action == "retrievePortInformationResponse") {
                         addLocationData = messageData.goToAddresses;
-                        for (let i = 0; i < addLocationData.length; i++) {	
-                            var metaverseProvider = addLocationData[i].split("/")[2].split(":")[0];	
-                            addLocationData[i] = "https://" + metaverseProvider + "/interim/d-goto/app/decentralizedGoToServerScript.js";	
+                        for (let i = 0; i < addLocationData.length; i++) {
+                            var metaverseProvider = addLocationData[i].split("/")[2].split(":")[0];
+                            addLocationData[i] = "https://" + metaverseProvider + "/interim/d-goto/app/decentralizedGoToServerScript.js";
                         }
                         addLocationComponent.updateData(addLocationData);
                     }
diff --git a/scripts/communityScripts/libraries/axios/axios.min.js b/scripts/communityScripts/libraries/axios/axios.min.js
new file mode 100644
index 0000000000..fc6c8b6187
--- /dev/null
+++ b/scripts/communityScripts/libraries/axios/axios.min.js
@@ -0,0 +1,3 @@
+/* axios v0.21.1 | (c) 2020 by Matt Zabriskie */
+!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.axios=t():e.axios=t()}(this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={exports:{},id:r,loaded:!1};return e[r].call(o.exports,o,o.exports,t),o.loaded=!0,o.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){e.exports=n(1)},function(e,t,n){"use strict";function r(e){var t=new i(e),n=s(i.prototype.request,t);return o.extend(n,i.prototype,t),o.extend(n,t),n}var o=n(2),s=n(3),i=n(4),a=n(22),u=n(10),c=r(u);c.Axios=i,c.create=function(e){return r(a(c.defaults,e))},c.Cancel=n(23),c.CancelToken=n(24),c.isCancel=n(9),c.all=function(e){return Promise.all(e)},c.spread=n(25),c.isAxiosError=n(26),e.exports=c,e.exports.default=c},function(e,t,n){"use strict";function r(e){return"[object Array]"===R.call(e)}function o(e){return"undefined"==typeof e}function s(e){return null!==e&&!o(e)&&null!==e.constructor&&!o(e.constructor)&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}function i(e){return"[object ArrayBuffer]"===R.call(e)}function a(e){return"undefined"!=typeof FormData&&e instanceof FormData}function u(e){var t;return t="undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&e.buffer instanceof ArrayBuffer}function c(e){return"string"==typeof e}function f(e){return"number"==typeof e}function p(e){return null!==e&&"object"==typeof e}function d(e){if("[object Object]"!==R.call(e))return!1;var t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}function l(e){return"[object Date]"===R.call(e)}function h(e){return"[object File]"===R.call(e)}function m(e){return"[object Blob]"===R.call(e)}function y(e){return"[object Function]"===R.call(e)}function g(e){return p(e)&&y(e.pipe)}function v(e){return"undefined"!=typeof URLSearchParams&&e instanceof URLSearchParams}function x(e){return e.replace(/^\s*/,"").replace(/\s*$/,"")}function w(){return("undefined"==typeof navigator||"ReactNative"!==navigator.product&&"NativeScript"!==navigator.product&&"NS"!==navigator.product)&&("undefined"!=typeof window&&"undefined"!=typeof document)}function b(e,t){if(null!==e&&"undefined"!=typeof e)if("object"!=typeof e&&(e=[e]),r(e))for(var n=0,o=e.length;n<o;n++)t.call(null,e[n],n,e);else for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&t.call(null,e[s],s,e)}function E(){function e(e,n){d(t[n])&&d(e)?t[n]=E(t[n],e):d(e)?t[n]=E({},e):r(e)?t[n]=e.slice():t[n]=e}for(var t={},n=0,o=arguments.length;n<o;n++)b(arguments[n],e);return t}function j(e,t,n){return b(t,function(t,r){n&&"function"==typeof t?e[r]=S(t,n):e[r]=t}),e}function C(e){return 65279===e.charCodeAt(0)&&(e=e.slice(1)),e}var S=n(3),R=Object.prototype.toString;e.exports={isArray:r,isArrayBuffer:i,isBuffer:s,isFormData:a,isArrayBufferView:u,isString:c,isNumber:f,isObject:p,isPlainObject:d,isUndefined:o,isDate:l,isFile:h,isBlob:m,isFunction:y,isStream:g,isURLSearchParams:v,isStandardBrowserEnv:w,forEach:b,merge:E,extend:j,trim:x,stripBOM:C}},function(e,t){"use strict";e.exports=function(e,t){return function(){for(var n=new Array(arguments.length),r=0;r<n.length;r++)n[r]=arguments[r];return e.apply(t,n)}}},function(e,t,n){"use strict";function r(e){this.defaults=e,this.interceptors={request:new i,response:new i}}var o=n(2),s=n(5),i=n(6),a=n(7),u=n(22);r.prototype.request=function(e){"string"==typeof e?(e=arguments[1]||{},e.url=arguments[0]):e=e||{},e=u(this.defaults,e),e.method?e.method=e.method.toLowerCase():this.defaults.method?e.method=this.defaults.method.toLowerCase():e.method="get";var t=[a,void 0],n=Promise.resolve(e);for(this.interceptors.request.forEach(function(e){t.unshift(e.fulfilled,e.rejected)}),this.interceptors.response.forEach(function(e){t.push(e.fulfilled,e.rejected)});t.length;)n=n.then(t.shift(),t.shift());return n},r.prototype.getUri=function(e){return e=u(this.defaults,e),s(e.url,e.params,e.paramsSerializer).replace(/^\?/,"")},o.forEach(["delete","get","head","options"],function(e){r.prototype[e]=function(t,n){return this.request(u(n||{},{method:e,url:t,data:(n||{}).data}))}}),o.forEach(["post","put","patch"],function(e){r.prototype[e]=function(t,n,r){return this.request(u(r||{},{method:e,url:t,data:n}))}}),e.exports=r},function(e,t,n){"use strict";function r(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}var o=n(2);e.exports=function(e,t,n){if(!t)return e;var s;if(n)s=n(t);else if(o.isURLSearchParams(t))s=t.toString();else{var i=[];o.forEach(t,function(e,t){null!==e&&"undefined"!=typeof e&&(o.isArray(e)?t+="[]":e=[e],o.forEach(e,function(e){o.isDate(e)?e=e.toISOString():o.isObject(e)&&(e=JSON.stringify(e)),i.push(r(t)+"="+r(e))}))}),s=i.join("&")}if(s){var a=e.indexOf("#");a!==-1&&(e=e.slice(0,a)),e+=(e.indexOf("?")===-1?"?":"&")+s}return e}},function(e,t,n){"use strict";function r(){this.handlers=[]}var o=n(2);r.prototype.use=function(e,t){return this.handlers.push({fulfilled:e,rejected:t}),this.handlers.length-1},r.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},r.prototype.forEach=function(e){o.forEach(this.handlers,function(t){null!==t&&e(t)})},e.exports=r},function(e,t,n){"use strict";function r(e){e.cancelToken&&e.cancelToken.throwIfRequested()}var o=n(2),s=n(8),i=n(9),a=n(10);e.exports=function(e){r(e),e.headers=e.headers||{},e.data=s(e.data,e.headers,e.transformRequest),e.headers=o.merge(e.headers.common||{},e.headers[e.method]||{},e.headers),o.forEach(["delete","get","head","post","put","patch","common"],function(t){delete e.headers[t]});var t=e.adapter||a.adapter;return t(e).then(function(t){return r(e),t.data=s(t.data,t.headers,e.transformResponse),t},function(t){return i(t)||(r(e),t&&t.response&&(t.response.data=s(t.response.data,t.response.headers,e.transformResponse))),Promise.reject(t)})}},function(e,t,n){"use strict";var r=n(2);e.exports=function(e,t,n){return r.forEach(n,function(n){e=n(e,t)}),e}},function(e,t){"use strict";e.exports=function(e){return!(!e||!e.__CANCEL__)}},function(e,t,n){"use strict";function r(e,t){!s.isUndefined(e)&&s.isUndefined(e["Content-Type"])&&(e["Content-Type"]=t)}function o(){var e;return"undefined"!=typeof XMLHttpRequest?e=n(12):"undefined"!=typeof process&&"[object process]"===Object.prototype.toString.call(process)&&(e=n(12)),e}var s=n(2),i=n(11),a={"Content-Type":"application/x-www-form-urlencoded"},u={adapter:o(),transformRequest:[function(e,t){return i(t,"Accept"),i(t,"Content-Type"),s.isFormData(e)||s.isArrayBuffer(e)||s.isBuffer(e)||s.isStream(e)||s.isFile(e)||s.isBlob(e)?e:s.isArrayBufferView(e)?e.buffer:s.isURLSearchParams(e)?(r(t,"application/x-www-form-urlencoded;charset=utf-8"),e.toString()):s.isObject(e)?(r(t,"application/json;charset=utf-8"),JSON.stringify(e)):e}],transformResponse:[function(e){if("string"==typeof e)try{e=JSON.parse(e)}catch(e){}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,validateStatus:function(e){return e>=200&&e<300}};u.headers={common:{Accept:"application/json, text/plain, */*"}},s.forEach(["delete","get","head"],function(e){u.headers[e]={}}),s.forEach(["post","put","patch"],function(e){u.headers[e]=s.merge(a)}),e.exports=u},function(e,t,n){"use strict";var r=n(2);e.exports=function(e,t){r.forEach(e,function(n,r){r!==t&&r.toUpperCase()===t.toUpperCase()&&(e[t]=n,delete e[r])})}},function(e,t,n){"use strict";var r=n(2),o=n(13),s=n(16),i=n(5),a=n(17),u=n(20),c=n(21),f=n(14);e.exports=function(e){return new Promise(function(t,n){var p=e.data,d=e.headers;r.isFormData(p)&&delete d["Content-Type"];var l=new XMLHttpRequest;if(e.auth){var h=e.auth.username||"",m=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";d.Authorization="Basic "+btoa(h+":"+m)}var y=a(e.baseURL,e.url);if(l.open(e.method.toUpperCase(),i(y,e.params,e.paramsSerializer),!0),l.timeout=e.timeout,l.onreadystatechange=function(){if(l&&4===l.readyState&&(0!==l.status||l.responseURL&&0===l.responseURL.indexOf("file:"))){var r="getAllResponseHeaders"in l?u(l.getAllResponseHeaders()):null,s=e.responseType&&"text"!==e.responseType?l.response:l.responseText,i={data:s,status:l.status,statusText:l.statusText,headers:r,config:e,request:l};o(t,n,i),l=null}},l.onabort=function(){l&&(n(f("Request aborted",e,"ECONNABORTED",l)),l=null)},l.onerror=function(){n(f("Network Error",e,null,l)),l=null},l.ontimeout=function(){var t="timeout of "+e.timeout+"ms exceeded";e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),n(f(t,e,"ECONNABORTED",l)),l=null},r.isStandardBrowserEnv()){var g=(e.withCredentials||c(y))&&e.xsrfCookieName?s.read(e.xsrfCookieName):void 0;g&&(d[e.xsrfHeaderName]=g)}if("setRequestHeader"in l&&r.forEach(d,function(e,t){"undefined"==typeof p&&"content-type"===t.toLowerCase()?delete d[t]:l.setRequestHeader(t,e)}),r.isUndefined(e.withCredentials)||(l.withCredentials=!!e.withCredentials),e.responseType)try{l.responseType=e.responseType}catch(t){if("json"!==e.responseType)throw t}"function"==typeof e.onDownloadProgress&&l.addEventListener("progress",e.onDownloadProgress),"function"==typeof e.onUploadProgress&&l.upload&&l.upload.addEventListener("progress",e.onUploadProgress),e.cancelToken&&e.cancelToken.promise.then(function(e){l&&(l.abort(),n(e),l=null)}),p||(p=null),l.send(p)})}},function(e,t,n){"use strict";var r=n(14);e.exports=function(e,t,n){var o=n.config.validateStatus;n.status&&o&&!o(n.status)?t(r("Request failed with status code "+n.status,n.config,null,n.request,n)):e(n)}},function(e,t,n){"use strict";var r=n(15);e.exports=function(e,t,n,o,s){var i=new Error(e);return r(i,t,n,o,s)}},function(e,t){"use strict";e.exports=function(e,t,n,r,o){return e.config=t,n&&(e.code=n),e.request=r,e.response=o,e.isAxiosError=!0,e.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code}},e}},function(e,t,n){"use strict";var r=n(2);e.exports=r.isStandardBrowserEnv()?function(){return{write:function(e,t,n,o,s,i){var a=[];a.push(e+"="+encodeURIComponent(t)),r.isNumber(n)&&a.push("expires="+new Date(n).toGMTString()),r.isString(o)&&a.push("path="+o),r.isString(s)&&a.push("domain="+s),i===!0&&a.push("secure"),document.cookie=a.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}}():function(){return{write:function(){},read:function(){return null},remove:function(){}}}()},function(e,t,n){"use strict";var r=n(18),o=n(19);e.exports=function(e,t){return e&&!r(t)?o(e,t):t}},function(e,t){"use strict";e.exports=function(e){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(e)}},function(e,t){"use strict";e.exports=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}},function(e,t,n){"use strict";var r=n(2),o=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];e.exports=function(e){var t,n,s,i={};return e?(r.forEach(e.split("\n"),function(e){if(s=e.indexOf(":"),t=r.trim(e.substr(0,s)).toLowerCase(),n=r.trim(e.substr(s+1)),t){if(i[t]&&o.indexOf(t)>=0)return;"set-cookie"===t?i[t]=(i[t]?i[t]:[]).concat([n]):i[t]=i[t]?i[t]+", "+n:n}}),i):i}},function(e,t,n){"use strict";var r=n(2);e.exports=r.isStandardBrowserEnv()?function(){function e(e){var t=e;return n&&(o.setAttribute("href",t),t=o.href),o.setAttribute("href",t),{href:o.href,protocol:o.protocol?o.protocol.replace(/:$/,""):"",host:o.host,search:o.search?o.search.replace(/^\?/,""):"",hash:o.hash?o.hash.replace(/^#/,""):"",hostname:o.hostname,port:o.port,pathname:"/"===o.pathname.charAt(0)?o.pathname:"/"+o.pathname}}var t,n=/(msie|trident)/i.test(navigator.userAgent),o=document.createElement("a");return t=e(window.location.href),function(n){var o=r.isString(n)?e(n):n;return o.protocol===t.protocol&&o.host===t.host}}():function(){return function(){return!0}}()},function(e,t,n){"use strict";var r=n(2);e.exports=function(e,t){function n(e,t){return r.isPlainObject(e)&&r.isPlainObject(t)?r.merge(e,t):r.isPlainObject(t)?r.merge({},t):r.isArray(t)?t.slice():t}function o(o){r.isUndefined(t[o])?r.isUndefined(e[o])||(s[o]=n(void 0,e[o])):s[o]=n(e[o],t[o])}t=t||{};var s={},i=["url","method","data"],a=["headers","auth","proxy","params"],u=["baseURL","transformRequest","transformResponse","paramsSerializer","timeout","timeoutMessage","withCredentials","adapter","responseType","xsrfCookieName","xsrfHeaderName","onUploadProgress","onDownloadProgress","decompress","maxContentLength","maxBodyLength","maxRedirects","transport","httpAgent","httpsAgent","cancelToken","socketPath","responseEncoding"],c=["validateStatus"];r.forEach(i,function(e){r.isUndefined(t[e])||(s[e]=n(void 0,t[e]))}),r.forEach(a,o),r.forEach(u,function(o){r.isUndefined(t[o])?r.isUndefined(e[o])||(s[o]=n(void 0,e[o])):s[o]=n(void 0,t[o])}),r.forEach(c,function(r){r in t?s[r]=n(e[r],t[r]):r in e&&(s[r]=n(void 0,e[r]))});var f=i.concat(a).concat(u).concat(c),p=Object.keys(e).concat(Object.keys(t)).filter(function(e){return f.indexOf(e)===-1});return r.forEach(p,o),s}},function(e,t){"use strict";function n(e){this.message=e}n.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},n.prototype.__CANCEL__=!0,e.exports=n},function(e,t,n){"use strict";function r(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise(function(e){t=e});var n=this;e(function(e){n.reason||(n.reason=new o(e),t(n.reason))})}var o=n(23);r.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},r.source=function(){var e,t=new r(function(t){e=t});return{token:t,cancel:e}},e.exports=r},function(e,t){"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}},function(e,t){"use strict";e.exports=function(e){return"object"==typeof e&&e.isAxiosError===!0}}])});
+//# sourceMappingURL=axios.min.map
\ No newline at end of file

From 1a02b918d755a38d2c8cfe544a3e27d784e6e85e Mon Sep 17 00:00:00 2001
From: Martin Allerton <madders@gmail.com>
Date: Sat, 21 Aug 2021 23:05:11 +0100
Subject: [PATCH 2/2] formatting changes and added axios license

Updates following comment from ctrlaltdavid
---
 scripts/communityScripts/explore/explore.html | 31 +++++++++----------
 .../communityScripts/libraries/axios/LICENSE  | 19 ++++++++++++
 2 files changed, 34 insertions(+), 16 deletions(-)
 create mode 100644 scripts/communityScripts/libraries/axios/LICENSE

diff --git a/scripts/communityScripts/explore/explore.html b/scripts/communityScripts/explore/explore.html
index 747e969daa..51f2045915 100644
--- a/scripts/communityScripts/explore/explore.html
+++ b/scripts/communityScripts/explore/explore.html
@@ -306,13 +306,13 @@
             if (locationData != null) {
                 for (var i = 0; i < locationData.length; i++) {
                     joinedData.push({
-                        "index": joinedData.length
-                        , "location": locationData[i].Visit
-                        , "name": locationData[i]['Domain Name']
-                        , "owner": locationData[i].Owner
-                        , "userCount": locationData[i].People
-                        , "description": ""
-                        , "thumbnail": ""
+                        "index": joinedData.length, 
+                        "location": locationData[i].Visit, 
+                        "name": locationData[i]['Domain Name'], 
+                        "owner": locationData[i].Owner, 
+                        "userCount": locationData[i].People, 
+                        "description": "", 
+                        "thumbnail": ""
                     });
                 }
             }
@@ -325,13 +325,13 @@
                 for (var i = 0; i < placesData.length; i++) {
                     if (placesData[i].domain.active && placesData[i].visibility == "open" && new Date(placesData[i].last_activity_update) > activeThresholdTime) {
                         joinedData.push({
-                            "index": joinedData.length
-                            , "location": placesData[i].address
-                            , "name": placesData[i].name
-                            , "owner": placesData[i].managers[0]
-                            , "userCount": placesData[i].current_attendance
-                            , "description": placesData[i].description
-                            , "thumbnail": placesData[i].thumbnail
+                            "index": joinedData.length,
+                            "location": placesData[i].address,
+                            "name": placesData[i].name,
+                            "owner": placesData[i].managers[0],
+                            "userCount": placesData[i].current_attendance,
+                            "description": placesData[i].description,
+                            "thumbnail": placesData[i].thumbnail
                         });
                     }
                 }
@@ -353,11 +353,10 @@
 
             // if metaverse data not loaded fire a request for it
             if (placesData == null) {
-                // TODO: fire off data get against the metaverse
+                // fire off data get against the metaverse
                 axios.get("https://metaverse.vircadia.com/live/api/v1/places")
                     .then((response) => {
                         placesData = response.data.data.places;
-
                         exploreComponent.updateData(blendedData());
                     })
                     .catch(function (error) {
diff --git a/scripts/communityScripts/libraries/axios/LICENSE b/scripts/communityScripts/libraries/axios/LICENSE
new file mode 100644
index 0000000000..2d8d66aa4e
--- /dev/null
+++ b/scripts/communityScripts/libraries/axios/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2014-present Matt Zabriskie
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
\ No newline at end of file