@dcl/wearable-preview 1.1.0 → 1.1.1-2625749587.commit-a84645b

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,20 +1,20 @@
1
1
  {
2
2
  "files": {
3
- "main.css": "https://cdn.decentraland.org/@dcl/wearable-preview/1.1.0/static/css/main.0663ee53.chunk.css",
4
- "main.js": "https://cdn.decentraland.org/@dcl/wearable-preview/1.1.0/static/js/main.c1df60f9.chunk.js",
5
- "main.js.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.1.0/static/js/main.c1df60f9.chunk.js.map",
6
- "runtime-main.js": "https://cdn.decentraland.org/@dcl/wearable-preview/1.1.0/static/js/runtime-main.8384a02d.js",
7
- "runtime-main.js.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.1.0/static/js/runtime-main.8384a02d.js.map",
8
- "static/js/2.51a0a5de.chunk.js": "https://cdn.decentraland.org/@dcl/wearable-preview/1.1.0/static/js/2.51a0a5de.chunk.js",
9
- "static/js/2.51a0a5de.chunk.js.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.1.0/static/js/2.51a0a5de.chunk.js.map",
10
- "index.html": "https://cdn.decentraland.org/@dcl/wearable-preview/1.1.0/index.html",
11
- "static/css/main.0663ee53.chunk.css.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.1.0/static/css/main.0663ee53.chunk.css.map",
12
- "static/js/2.51a0a5de.chunk.js.LICENSE.txt": "https://cdn.decentraland.org/@dcl/wearable-preview/1.1.0/static/js/2.51a0a5de.chunk.js.LICENSE.txt"
3
+ "main.css": "https://cdn.decentraland.org/@dcl/wearable-preview/1.1.1-2625749587.commit-a84645b/static/css/main.0663ee53.chunk.css",
4
+ "main.js": "https://cdn.decentraland.org/@dcl/wearable-preview/1.1.1-2625749587.commit-a84645b/static/js/main.2b7cd13e.chunk.js",
5
+ "main.js.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.1.1-2625749587.commit-a84645b/static/js/main.2b7cd13e.chunk.js.map",
6
+ "runtime-main.js": "https://cdn.decentraland.org/@dcl/wearable-preview/1.1.1-2625749587.commit-a84645b/static/js/runtime-main.03bb0c13.js",
7
+ "runtime-main.js.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.1.1-2625749587.commit-a84645b/static/js/runtime-main.03bb0c13.js.map",
8
+ "static/js/2.51a0a5de.chunk.js": "https://cdn.decentraland.org/@dcl/wearable-preview/1.1.1-2625749587.commit-a84645b/static/js/2.51a0a5de.chunk.js",
9
+ "static/js/2.51a0a5de.chunk.js.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.1.1-2625749587.commit-a84645b/static/js/2.51a0a5de.chunk.js.map",
10
+ "index.html": "https://cdn.decentraland.org/@dcl/wearable-preview/1.1.1-2625749587.commit-a84645b/index.html",
11
+ "static/css/main.0663ee53.chunk.css.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.1.1-2625749587.commit-a84645b/static/css/main.0663ee53.chunk.css.map",
12
+ "static/js/2.51a0a5de.chunk.js.LICENSE.txt": "https://cdn.decentraland.org/@dcl/wearable-preview/1.1.1-2625749587.commit-a84645b/static/js/2.51a0a5de.chunk.js.LICENSE.txt"
13
13
  },
14
14
  "entrypoints": [
15
- "static/js/runtime-main.8384a02d.js",
15
+ "static/js/runtime-main.03bb0c13.js",
16
16
  "static/js/2.51a0a5de.chunk.js",
17
17
  "static/css/main.0663ee53.chunk.css",
18
- "static/js/main.c1df60f9.chunk.js"
18
+ "static/js/main.2b7cd13e.chunk.js"
19
19
  ]
20
20
  }
package/index.html CHANGED
@@ -1 +1 @@
1
- <!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="https://cdn.decentraland.org/@dcl/wearable-preview/1.1.0/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Preview wearables from Decentraland"/><link rel="apple-touch-icon" href="https://cdn.decentraland.org/@dcl/wearable-preview/1.1.0/logo192.png"/><link rel="manifest" href="https://cdn.decentraland.org/@dcl/wearable-preview/1.1.0/manifest.json"/><title>Decentraland | Wearable Preview</title><link href="https://cdn.decentraland.org/@dcl/wearable-preview/1.1.0/static/css/main.0663ee53.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>!function(e){function r(r){for(var n,u,a=r[0],i=r[1],p=r[2],f=0,s=[];f<a.length;f++)u=a[f],Object.prototype.hasOwnProperty.call(o,u)&&o[u]&&s.push(o[u][0]),o[u]=0;for(n in i)Object.prototype.hasOwnProperty.call(i,n)&&(e[n]=i[n]);for(c&&c(r);s.length;)s.shift()();return l.push.apply(l,p||[]),t()}function t(){for(var e,r=0;r<l.length;r++){for(var t=l[r],n=!0,a=1;a<t.length;a++){var i=t[a];0!==o[i]&&(n=!1)}n&&(l.splice(r--,1),e=u(u.s=t[0]))}return e}var n={},o={1:0},l=[];function u(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,u),t.l=!0,t.exports}u.m=e,u.c=n,u.d=function(e,r,t){u.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},u.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},u.t=function(e,r){if(1&r&&(e=u(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(u.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)u.d(t,n,function(r){return e[r]}.bind(null,n));return t},u.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return u.d(r,"a",r),r},u.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},u.p="https://cdn.decentraland.org/@dcl/wearable-preview/1.1.0/";var a=this["webpackJsonp@dcl/wearable-preview"]=this["webpackJsonp@dcl/wearable-preview"]||[],i=a.push.bind(a);a.push=r,a=a.slice();for(var p=0;p<a.length;p++)r(a[p]);var c=i;t()}([])</script><script src="https://cdn.decentraland.org/@dcl/wearable-preview/1.1.0/static/js/2.51a0a5de.chunk.js"></script><script src="https://cdn.decentraland.org/@dcl/wearable-preview/1.1.0/static/js/main.c1df60f9.chunk.js"></script></body></html>
1
+ <!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="https://cdn.decentraland.org/@dcl/wearable-preview/1.1.1-2625749587.commit-a84645b/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Preview wearables from Decentraland"/><link rel="apple-touch-icon" href="https://cdn.decentraland.org/@dcl/wearable-preview/1.1.1-2625749587.commit-a84645b/logo192.png"/><link rel="manifest" href="https://cdn.decentraland.org/@dcl/wearable-preview/1.1.1-2625749587.commit-a84645b/manifest.json"/><title>Decentraland | Wearable Preview</title><link href="https://cdn.decentraland.org/@dcl/wearable-preview/1.1.1-2625749587.commit-a84645b/static/css/main.0663ee53.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>!function(e){function r(r){for(var n,a,u=r[0],i=r[1],c=r[2],f=0,s=[];f<u.length;f++)a=u[f],Object.prototype.hasOwnProperty.call(o,a)&&o[a]&&s.push(o[a][0]),o[a]=0;for(n in i)Object.prototype.hasOwnProperty.call(i,n)&&(e[n]=i[n]);for(p&&p(r);s.length;)s.shift()();return l.push.apply(l,c||[]),t()}function t(){for(var e,r=0;r<l.length;r++){for(var t=l[r],n=!0,u=1;u<t.length;u++){var i=t[u];0!==o[i]&&(n=!1)}n&&(l.splice(r--,1),e=a(a.s=t[0]))}return e}var n={},o={1:0},l=[];function a(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,a),t.l=!0,t.exports}a.m=e,a.c=n,a.d=function(e,r,t){a.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},a.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.t=function(e,r){if(1&r&&(e=a(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(a.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)a.d(t,n,function(r){return e[r]}.bind(null,n));return t},a.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(r,"a",r),r},a.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},a.p="https://cdn.decentraland.org/@dcl/wearable-preview/1.1.1-2625749587.commit-a84645b/";var u=this["webpackJsonp@dcl/wearable-preview"]=this["webpackJsonp@dcl/wearable-preview"]||[],i=u.push.bind(u);u.push=r,u=u.slice();for(var c=0;c<u.length;c++)r(u[c]);var p=i;t()}([])</script><script src="https://cdn.decentraland.org/@dcl/wearable-preview/1.1.1-2625749587.commit-a84645b/static/js/2.51a0a5de.chunk.js"></script><script src="https://cdn.decentraland.org/@dcl/wearable-preview/1.1.1-2625749587.commit-a84645b/static/js/main.2b7cd13e.chunk.js"></script></body></html>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dcl/wearable-preview",
3
- "version": "1.1.0",
3
+ "version": "1.1.1-2625749587.commit-a84645b",
4
4
  "description": "Static website for the wearable preview",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -9,6 +9,6 @@
9
9
  "keywords": [],
10
10
  "author": "",
11
11
  "license": "Apache-2.0",
12
- "homepage": "https://cdn.decentraland.org/@dcl/wearable-preview/1.1.0",
13
- "commit": "59924d5ce5c014705c7532609c5ec064293e03ed"
12
+ "homepage": "https://cdn.decentraland.org/@dcl/wearable-preview/1.1.1-2625749587.commit-a84645b",
13
+ "commit": "a84645bdde06d4c770cd71f4e3adf64d3ed38161"
14
14
  }
@@ -0,0 +1,2 @@
1
+ (this["webpackJsonp@dcl/wearable-preview"]=this["webpackJsonp@dcl/wearable-preview"]||[]).push([[0],{348:function(e,t,n){},516:function(e,t){},522:function(e,t,n){"use strict";n.r(t),t.default="float angleY = 3.14 / 2.0;\n\nmat3 rotateY = mat3(\n cos(angleY), 0, sin(angleY),\n 0, 1, 0,\n -sin(angleY), 0, cos(angleY)\n);\n\n// view angle DOT normal of the position\nvec3 tray = normalize(viewDirectionW * rotateY);\nvec3 rayDirection = normalize(tray-vPositionW);\nfloat t=(dot(normalW,rayDirection) + 1.0) / 2.0;\n\nfloat ToonThresholds[3];\nToonThresholds[0] = 0.90;\nToonThresholds[1] = 0.80;\nToonThresholds[2] = 0.20;\n\nfloat ToonBrightnessLevels[4];\nToonBrightnessLevels[0] = 1.2;\nToonBrightnessLevels[1] = 1.0;\nToonBrightnessLevels[2] = 1.0;\nToonBrightnessLevels[3] = 0.8;\n\nif (t > ToonThresholds[0])\n{\n finalColor.rgb *= ToonBrightnessLevels[0];\n}\nelse if (t > ToonThresholds[1])\n{\n finalColor.rgb *= ToonBrightnessLevels[1];\n}\nelse if (t > ToonThresholds[2])\n{\n finalColor.rgb *= ToonBrightnessLevels[2];\n}\nelse\n{\n finalColor.rgb *= ToonBrightnessLevels[3];\n}\n"},523:function(e,t,n){},527:function(e,t,n){"use strict";n.r(t);var r=n(51),a=n.n(r),o=n(339),c=n.n(o),i=(n(348),n(58)),s=n(257),u=n.n(s),l=n(20);var f,d=n(71),p=n(111),b=n(28),h=n.n(b),w=n(112),v=n(38),y=n(188),m=n(254),g=n(168);function O(e){return E.apply(this,arguments)}function E(){return(E=Object(v.a)(h.a.mark((function e(t){return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",new Promise((function(e){return setTimeout(e,t)})));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function x(e){return k.apply(this,arguments)}function k(){return k=Object(v.a)(h.a.mark((function e(t){var n,r,a=arguments;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=a.length>1&&void 0!==a[1]?a[1]:3,e.prev=1,e.next=4,fetch(t);case 4:if((r=e.sent).ok){e.next=11;break}return e.t0=Error,e.next=9,r.text();case 9:throw e.t1=e.sent,new e.t0(e.t1);case 11:return e.abrupt("return",r.json());case 14:if(e.prev=14,e.t2=e.catch(1),!(n>0)){e.next=22;break}return e.next=19,O(100);case 19:return e.abrupt("return",x(t,n-1));case 22:throw e.t2;case 23:case"end":return e.stop()}}),e,null,[[1,14]])}))),k.apply(this,arguments)}var j,S=(f={},Object(g.a)(f,l.PreviewEnv.DEV,"https://nft-api.decentraland.io"),Object(g.a)(f,l.PreviewEnv.PROD,"https://nft-api.decentraland.org"),f),C=function(){function e(){Object(y.a)(this,e)}return Object(m.a)(e,[{key:"fetchItem",value:function(){var e=Object(v.a)(h.a.mark((function e(t,n,r){var a,o;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,x("".concat(S[r],"/v1/items?contractAddress=").concat(t,"&itemId=").concat(n));case 2:if(a=e.sent,0!==(o=a.data).length){e.next=6;break}throw new Error('Item not found for contractAddress="'.concat(t,'" itemId="').concat(n,'"'));case 6:return e.abrupt("return",o[0]);case 7:case"end":return e.stop()}}),e)})));return function(t,n,r){return e.apply(this,arguments)}}()},{key:"fetchNFT",value:function(){var e=Object(v.a)(h.a.mark((function e(t,n,r){var a,o;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,x("".concat(S[r],"/v1/nfts?contractAddress=").concat(t,"&tokenId=").concat(n));case 2:if(a=e.sent,0!==(o=a.data).length){e.next=6;break}throw new Error('NFT not found for contractAddress="'.concat(t,'" tokenId="').concat(n,'"'));case 6:return e.abrupt("return",o[0].nft);case 7:case"end":return e.stop()}}),e)})));return function(t,n,r){return e.apply(this,arguments)}}()}]),e}(),T=new C,A=(j={},Object(g.a)(j,l.PreviewEnv.DEV,"https://peer.decentraland.zone"),Object(g.a)(j,l.PreviewEnv.PROD,"https://peer.decentraland.org"),j),P=function(){function e(){Object(y.a)(this,e)}return Object(m.a)(e,[{key:"fetchWearables",value:function(){var e=Object(v.a)(h.a.mark((function e(t,n){var r,a;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(0!==t.length){e.next=2;break}return e.abrupt("return",[]);case 2:return e.next=4,x("".concat(A[n],"/lambdas/collections/wearables?").concat(t.map((function(e){return"wearableId=".concat(e)})).join("&")));case 4:if(r=e.sent,0!==(a=r.wearables).length){e.next=8;break}throw new Error('Wearables not found for urns="'.concat(t,'"'));case 8:return e.abrupt("return",a);case 9:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}()},{key:"fetchProfile",value:function(){var e=Object(v.a)(h.a.mark((function e(t,n){var r;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,x("".concat(A[n],"/lambdas/profiles?id=").concat(t));case 2:return r=e.sent,e.abrupt("return",r.length>0?r[0]:null);case 4:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}()}]),e}(),B=new P;var R=n(37);function L(e){return e.startsWith("#")?e:"#"+e}function W(e){return("0"+(255*e|0).toString(16)).slice(-2)}function M(e){return W(e.r)+W(e.g)+W(e.b)}function _(e){var t=function(e){return e.startsWith("#")?e.slice(1):e}(e);return new R.Color3(parseInt(t.slice(0,2),16)/256,parseInt(t.slice(2,4),16)/256,parseInt(t.slice(4,6),16)/256)}var I=n(340),D=n(342),F=n(343);function Y(e){return"emoteDataV0"in e}var N=function(e){Object(I.a)(n,e);var t=Object(D.a)(n);function n(){return Object(y.a)(this,n),t.call(this,"Invalid emote")}return n}(Object(F.a)(Error));function U(){return{getLength:function(){throw new N},isPlaying:function(){throw new N},goTo:function(){throw new N},play:function(){throw new N},pause:function(){throw new N},stop:function(){throw new N}}}function V(e,t){return e.bodyShapes.includes(t)}function H(e){return V(e,l.BodyShape.MALE)}function z(e){return V(e,l.BodyShape.FEMALE)}function G(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.BodyShape.MALE;switch(t){case l.BodyShape.FEMALE:if(!e.data.representations.some(z))throw new Error('Could not find a BaseFemale representation for wearable="'.concat(e.id,'"'));return e.data.representations.find(z);case l.BodyShape.MALE:if(!e.data.representations.some(H))throw new Error('Could not find a BaseMale representation for wearable="'.concat(e.id,'"'));return e.data.representations.find(H)}}function Z(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.BodyShape.MALE;if(X(e,t))return G(e,t);if(e.data.representations.length>0)return e.data.representations[0];throw new Error('The wearable="'.concat(e.id,'" has no representation'))}function X(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.BodyShape.MALE;try{return G(e,t),!0}catch(n){return!1}}function q(e){var t=e.contents.find((function(t){return t.key===e.mainFile}));if(!t)throw new Error("Could not find main file");return t.url}function K(e){return e.mainFile.endsWith("png")}function J(e,t){return e.find((function(e){return e.data.category===t}))||null}function Q(){return[l.WearableCategory.EYEBROWS,l.WearableCategory.MOUTH,l.WearableCategory.EYES]}function $(){return[l.WearableCategory.HAIR,l.WearableCategory.UPPER_BODY,l.WearableCategory.LOWER_BODY,l.WearableCategory.FEET]}function ee(){return[l.WearableCategory.EYEBROWS,l.WearableCategory.MOUTH,l.WearableCategory.EYES,l.WearableCategory.HAIR,l.WearableCategory.UPPER_BODY,l.WearableCategory.LOWER_BODY,l.WearableCategory.FEET]}function te(e,t){switch(e){case l.WearableCategory.EYEBROWS:return t===l.BodyShape.MALE?"urn:decentraland:off-chain:base-avatars:eyebrows_00":"urn:decentraland:off-chain:base-avatars:f_eyebrows_00";case l.WearableCategory.MOUTH:return t===l.BodyShape.MALE?"urn:decentraland:off-chain:base-avatars:mouth_00":"urn:decentraland:off-chain:base-avatars:f_mouth_00";case l.WearableCategory.EYES:return t===l.BodyShape.MALE?"urn:decentraland:off-chain:base-avatars:eyes_00":"urn:decentraland:off-chain:base-avatars:f_eyes_00";case l.WearableCategory.HAIR:return t===l.BodyShape.MALE?"urn:decentraland:off-chain:base-avatars:casual_hair_01":"urn:decentraland:off-chain:base-avatars:standard_hair";case l.WearableCategory.UPPER_BODY:return t===l.BodyShape.MALE?"urn:decentraland:off-chain:base-avatars:green_hoodie":"urn:decentraland:off-chain:base-avatars:f_sweater";case l.WearableCategory.LOWER_BODY:return t===l.BodyShape.MALE?"urn:decentraland:off-chain:base-avatars:brown_pants":"urn:decentraland:off-chain:base-avatars:f_jeans";case l.WearableCategory.FEET:return t===l.BodyShape.MALE?"urn:decentraland:off-chain:base-avatars:sneakers":"urn:decentraland:off-chain:base-avatars:bun_shoes";default:throw new Error('There is no default wearable for category="'.concat(e,'"'))}}function ne(e){return!!e}function re(e){var t=[l.BodyShape.MALE,l.BodyShape.FEMALE];return t.find((function(t){return e.data.representations.some((function(e){return e.bodyShapes.includes(t)}))}))||t[0]}function ae(e){var t=e?parseFloat(e):null;return null===t||isNaN(t)?null:1.8*Math.min(Math.max(t,0),100)/100+1}function oe(e){switch(null===e||void 0===e?void 0:e.data.category){case l.WearableCategory.UPPER_BODY:return 2;case l.WearableCategory.SKIN:return 1.75;default:return 1.25}}var ce="default";function ie(e,t){return se.apply(this,arguments)}function se(){return(se=Object(v.a)(h.a.mark((function e(t,n){var r;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,de([t],n);case 2:if(1===(r=e.sent).length){e.next=5;break}throw new Error('Could not find wearable for urn="'.concat(t,'"'));case 5:return e.abrupt("return",r[0]);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ue(e){return JSON.parse(atob(e))}function le(e,t){return fe.apply(this,arguments)}function fe(){return(fe=Object(v.a)(h.a.mark((function e(t,n){var r;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t){e.next=2;break}return e.abrupt("return",[]);case 2:return e.next=4,de(t.avatar.wearables,n);case 4:return r=e.sent,e.abrupt("return",r.filter((function(e){return!Y(e)})));case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function de(e,t){return pe.apply(this,arguments)}function pe(){return(pe=Object(v.a)(h.a.mark((function e(t,n){return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(0!==t.length){e.next=2;break}return e.abrupt("return",[]);case 2:return e.abrupt("return",B.fetchWearables(t,n));case 3:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function be(e){return he.apply(this,arguments)}function he(){return(he=Object(v.a)(h.a.mark((function e(t){var n,r;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(0!==t.length){e.next=2;break}return e.abrupt("return",[]);case 2:return n=t.map((function(e){return fetch(e).then((function(e){return e.json()})).catch()})),e.next=5,Promise.all(n);case 5:return r=e.sent,e.abrupt("return",r.filter(ne));case 7:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var we=function(){var e={};return{memo:function(){var t=Object(v.a)(h.a.mark((function t(n,r){var a,o,c,i=arguments;return h.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(!(n in e)){for(a=i.length,o=new Array(a>2?a-2:0),c=2;c<a;c++)o[c-2]=i[c];e[n]=r.apply(void 0,o)}return t.abrupt("return",e[n]);case 3:case"end":return t.stop()}}),t)})));return function(e,n){return t.apply(this,arguments)}}(),reset:function(){for(var t in e)delete e[t]}}}();function ve(e,t){return ye.apply(this,arguments)}function ye(){return(ye=Object(v.a)(h.a.mark((function e(t,n){return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",we.memo(t,Object(v.a)(h.a.mark((function e(){var r;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t!==ce){e.next=2;break}return e.abrupt("return",null);case 2:return e.next=4,B.fetchProfile(t,n).then((function(e){return e&&e.avatars.length>0?e.avatars[0]:null})).catch((function(e){return console.log('Failed to load profile="'.concat(t,'"'),e)}));case 4:return r=e.sent,e.abrupt("return",r||null);case 6:case"end":return e.stop()}}),e)})))));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function me(e){return ge.apply(this,arguments)}function ge(){return(ge=Object(v.a)(h.a.mark((function e(t){var n,r,a,o,c,i,s;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=t.contractAddress,r=t.itemId,a=t.tokenId,o=t.env,r||a){e.next=3;break}throw new Error("You need to provide an itemId or a tokenId");case 3:if(c=o===l.PreviewEnv.PROD?"matic":"mumbai",i="urn:decentraland:".concat(c,":collections-v2:").concat(n,":").concat(r),r||a){e.next=9;break}throw new Error("You must provide either tokenId or itemId");case 9:if(r||!a){e.next=14;break}return e.next=12,T.fetchNFT(n,a,o);case 12:s=e.sent,i=s.network!==l.Network.ETHEREUM?"urn:decentraland:".concat(c,":collections-v2:").concat(n,":").concat(s.itemId):s.image.split("contents/")[1].split("/thumbnail")[0];case 14:return e.abrupt("return",ie(i,o));case 15:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Oe(e,t,n,r,a,o,c,i){return Ee.apply(this,arguments)}function Ee(){return(Ee=Object(v.a)(h.a.mark((function e(t,n,r,a,o,c,i,s){var u,l,f,b,w,v,y,m;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.t0=[],e.t1=p.a,e.next=4,le(t,s);case 4:return e.t2=e.sent,e.t3=(0,e.t1)(e.t2),e.t4=p.a,e.next=9,de([o].concat(Object(p.a)(n)),s);case 9:return e.t5=e.sent,e.t6=(0,e.t4)(e.t5),e.t7=p.a,e.next=14,be(r);case 14:e.t8=e.sent,e.t9=(0,e.t7)(e.t8),e.t10=Object(p.a)(a.map(ue)),u=(u=e.t0.concat.call(e.t0,e.t3,e.t6,e.t9,e.t10)).filter((function(e){return X(e,o)})),l=[],f=c&&i?ee():c?$():i?Q():[],b=Object(d.a)(f),e.prev=22,b.s();case 24:if((w=b.n()).done){e.next=36;break}if(v=w.value,J(u,v)){e.next=34;break}if(!(y=te(v,o))){e.next=33;break}l.push(y),e.next=34;break;case 33:throw new Error('Could not get default URN for category="'.concat(v,'"'));case 34:e.next=24;break;case 36:e.next=41;break;case 38:e.prev=38,e.t11=e.catch(22),b.e(e.t11);case 41:return e.prev=41,b.f(),e.finish(41);case 44:if(!(l.length>0)){e.next=49;break}return e.next=47,de(l,s);case 47:m=e.sent,u=[].concat(Object(p.a)(u),Object(p.a)(m));case 49:return e.abrupt("return",u);case 50:case"end":return e.stop()}}),e,null,[[22,38,41,44]])})))).apply(this,arguments)}function xe(){return xe=Object(v.a)(h.a.mark((function e(){var t,n,r,a,o,c,s,u,f,d,b,v,y,m,g,O,E,x,k,j,S,C,T,A,P,B,R,W,_,I,D=arguments;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=D.length>0&&void 0!==D[0]?D[0]:{},n=t.contractAddress,r=t.tokenId,a=t.itemId,o=t.env||l.PreviewEnv.PROD,c=Promise.resolve(),n&&(c=me({contractAddress:n,tokenId:r,itemId:a,env:o})),s=t.profile?ve(t.profile,o):Promise.resolve(null),e.next=8,Promise.all([c,s]);case 8:if(u=e.sent,f=Object(i.a)(u,2),d=f[0],b=f[1],v=t.bodyShape||b&&b.avatar.bodyShape||(d?re(d):l.BodyShape.MALE),y=L(t.skin||b&&M(b.avatar.skin.color)||"cc9b76"),m=L(t.hair||b&&M(b.avatar.hair.color)||"000000"),g=L(t.eyes||b&&M(b.avatar.eyes.color)||"000000"),O=Object(p.a)(t.urns||[]),E=t.urls||[],x=t.base64s||[],k=[],j=1.75,S=l.PreviewType.WEARABLE,C={color:"#4b4852",transparent:!0===t.disableBackground},!(O.length>0||E.length>0||x.length>0||d&&Y(d)||t.profile)){e.next=28;break}return S=l.PreviewType.AVATAR,e.next=27,Oe(b,O,E,x,v,!t.disableDefaultWearables,!t.disableFace,o);case 27:k=e.sent;case 28:return d&&(j=k.length>0?j:oe(d),K(Z(d))&&S!==l.PreviewType.AVATAR&&(S=l.PreviewType.TEXTURE),C=Object(w.a)(Object(w.a)({},C),{},{image:d.thumbnail}),Object(l.isStandard)(d)&&(T=l.Rarity.getColor(d.rarity),C=Object(w.a)(Object(w.a)({},C),{},{image:d.thumbnail,color:T}))),A=l.PreviewEmote.IDLE,t.emote&&Object.values(l.PreviewEmote).includes(t.emote)&&(A=t.emote),P=l.PreviewCamera.INTERACTIVE,t.camera&&Object.values(l.PreviewCamera).includes(t.camera)&&(P=t.camera),B="number"!==typeof t.autoRotateSpeed||isNaN(t.autoRotateSpeed)?.2:t.autoRotateSpeed,R=!t.disableAutoCenter,W=1,_=100,I=50,ke(t.wheelZoom)&&(W=Math.max(t.wheelZoom,1)),ke(t.wheelPrecision)&&(_=Math.max(t.wheelPrecision,1)),ke(t.wheelStart)&&(I=100-Math.min(Math.max(t.wheelStart,0),100)),t.background&&(C.color=t.background),e.abrupt("return",{wearable:null!==d&&void 0!==d?d:t.blob?je(t.blob):void 0,wearables:k,bodyShape:v,skin:y,hair:m,eyes:g,type:S,background:C,face:!1!==t.disableFace,emote:A,camera:P,autoRotateSpeed:t.disableAutoRotate?0:B,centerBoundingBox:R,offsetX:t.offsetX||0,offsetY:t.offsetY||0,offsetZ:t.offsetZ||0,zoom:"number"===typeof t.zoom?t.zoom:j,wheelZoom:W,wheelPrecision:_,wheelStart:I});case 43:case"end":return e.stop()}}),e)}))),xe.apply(this,arguments)}function ke(e){return"number"===typeof e&&!isNaN(e)}function je(e){return Object(w.a)(Object(w.a)({},e),{},{data:Object(w.a)(Object(w.a)({},e.data),{},{representations:e.data.representations.map((function(e){return Object(w.a)(Object(w.a)({},e),{},{contents:e.contents.map((function(e){return{key:e.key,url:URL.createObjectURL(e.blob)}}))})}))})})}var Se={};function Ce(e,t){return t===Se[e]}var Te=n(341),Ae=n.n(Te),Pe=function(e){var t=Object(r.useCallback)(e,[]);Object(r.useEffect)((function(){function e(e){t(e)}return window.addEventListener("message",e),function(){window.removeEventListener("message",e)}}),[t])},Be=function(){var e=Object(r.useState)(window.location.search.toString()),t=Object(i.a)(e,1)[0],n=Object(r.useMemo)((function(){var e=new URLSearchParams(t),n=e.get("autoRotateSpeed"),r=e.get("offsetX"),a=e.get("offsetY"),o=e.get("offsetZ"),c=e.get("wheelZoom"),i=e.get("wheelPrecision"),s=e.get("wheelStart"),u=e.get("bodyShape"),f=e.has("transparentBackground");f&&console.warn('Deprecated: you are using the query param "transparentBackground" that has been deprecated in favor of "disableBackground". Please switch to the new query param since in the future this will not be supported.');var d="false"!==e.get("centerBoundingBox");return f&&console.warn('Deprecated: you are using the query param "transparentBackground" that has been deprecated in favor of "disableBackground". Please switch to the new query param since in the future this will not be supported.'),{contractAddress:e.get("contract"),tokenId:e.get("token"),itemId:e.get("item"),skin:e.get("skin"),hair:e.get("hair"),eyes:e.get("eyes"),emote:e.get("emote"),camera:e.get("camera"),background:e.get("background"),autoRotateSpeed:n?parseFloat(n):null,offsetX:r?parseFloat(r):null,offsetY:a?parseFloat(a):null,offsetZ:o?parseFloat(o):null,wheelZoom:c?parseFloat(c):null,wheelPrecision:i?parseFloat(i):null,wheelStart:s?parseFloat(s):null,zoom:ae(e.get("zoom")),bodyShape:"female"===u||u===l.BodyShape.FEMALE?l.BodyShape.FEMALE:"male"===u||u===l.BodyShape.MALE?l.BodyShape.MALE:null,urns:e.getAll("urn"),urls:e.getAll("url"),base64s:e.getAll("base64"),profile:e.get("profile"),disableBackground:e.has("disableBackground")||f,disableAutoCenter:e.has("disableAutoCenter")||!d,disableAutoRotate:e.has("disableAutoRotate")||!d,disableFace:e.has("disableFace"),disableDefaultWearables:e.has("disableDefaultWearables"),env:Object.values(l.PreviewEnv).filter((function(e){return"string"===typeof e})).reduce((function(t,n){return n===e.get("env")?n:t}),l.PreviewEnv.PROD)}}),[t]),a=function(){var e=Object(r.useState)({}),t=Object(i.a)(e,2),n=t[0],a=t[1];return Pe((function(e){if(e.data&&e.data.type===l.PreviewMessageType.UPDATE&&"object"===typeof e.data.payload&&"object"===typeof e.data.payload.options){var t=e.data.payload.options;Ae()(n,t)||a(t)}})),n}();return Object(r.useMemo)((function(){return Object(w.a)(Object(w.a)({},n),a)}),[n,a])};function Re(){var e=Be(),t=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],a=Object(r.useState)(!1),o=Object(i.a)(a,2),c=o[0],s=o[1],u=Object(r.useState)(null),l=Object(i.a)(u,2),f=l[0],d=l[1],p=Object(r.useState)(""),b=Object(i.a)(p,2),h=b[0],w=b[1];return"undefined"===typeof Se[e]&&(Se[e]=0),Object(r.useEffect)((function(){var n=++Se[e];s(!0),t().then((function(t){Ce(e,n)&&d(t)})).catch((function(t){Ce(e,n)&&w(t.message)})).finally((function(){Ce(e,n)&&s(!1)}))}),n),[f,c,h]}("useConfig",(function(){return function(){return xe.apply(this,arguments)}(e)}),[e]),n=Object(i.a)(t,3);return[n[0],n[1],n[2]]}function Le(e,t){Object(l.sendMessage)(window.parent,l.PreviewMessageType.CONTROLLER_RESPONSE,{id:e,ok:!0,result:t})}function We(e,t){Object(l.sendMessage)(window.parent,l.PreviewMessageType.CONTROLLER_RESPONSE,{id:e,ok:!1,error:t})}function Me(e){return function(t){return t.data.category===e}}function _e(e){return function(t){return t.wearable.data.category===e||(t.wearable.data.hides||[]).includes(e)||(t.wearable.data.replaces||[]).includes(e)}}function Ie(e){return!!e}function De(e){return!K(Z(e))}function Fe(e){return!De(e)}function Ye(e){var t=e.find((function(e){return e.wearable.data.category===l.WearableCategory.BODY_SHAPE}));if(!t)return null;var n,r=e.some((function(e){return e.wearable.data.category===l.WearableCategory.SKIN})),a=r||e.some(_e(l.WearableCategory.UPPER_BODY)),o=r||e.some(_e(l.WearableCategory.LOWER_BODY)),c=r||e.some(_e(l.WearableCategory.FEET)),i=r||e.some(_e(l.WearableCategory.HEAD)),s=Object(d.a)(t.container.meshes);try{for(s.s();!(n=s.n()).done;){var u=n.value,f=u.name.toLowerCase();f.endsWith("ubody_basemesh")&&a&&u.setEnabled(!1),f.endsWith("lbody_basemesh")&&o&&u.setEnabled(!1),f.endsWith("feet_basemesh")&&c&&u.setEnabled(!1),f.endsWith("head")&&i&&u.setEnabled(!1),f.endsWith("head_basemesh")&&i&&u.setEnabled(!1),f.endsWith("mask_eyes")&&i&&u.setEnabled(!1),f.endsWith("mask_eyebrows")&&i&&u.setEnabled(!1),f.endsWith("mask_mouth")&&i&&u.setEnabled(!1)}}catch(p){s.e(p)}finally{s.f()}return t}var Ne=[l.WearableCategory.HELMET,l.WearableCategory.HAIR,l.WearableCategory.FACIAL_HAIR,l.WearableCategory.MOUTH,l.WearableCategory.EYEBROWS,l.WearableCategory.EYES,l.WearableCategory.UPPER_BODY,l.WearableCategory.LOWER_BODY,l.WearableCategory.FEET];function Ue(e){var t=new Map,n=e.wearables.filter((function(e){return!Y(e)}));e.wearable&&!Y(e.wearable)&&(n=e.wearables.filter((function(t){if(e.wearable){var n=e.wearable.data,r=n.category,a=n.hides,o=n.replaces;if("skin"===t.data.category){if(Ne.includes(r))return!1;if(a&&a.includes(l.WearableCategory.HEAD))return!1;if(o&&o.includes(l.WearableCategory.HEAD))return!1}if(t.data.hides&&t.data.hides.includes(r))return!1;if(t.data.replaces&&t.data.replaces.includes(r))return!1}return!0})),n.push(e.wearable));var r,a=Object(d.a)(n);try{for(a.s();!(r=a.n()).done;){var o=r.value,c=o.data.category;X(o,e.bodyShape)&&t.set(c,o)}}catch(j){a.e(j)}finally{a.f()}var i=!1;n=n.filter((function(e){return t.get(e.data.category)===e})).reverse();var s,u=new Set,f=Object(d.a)(n);try{for(f.s();!(s=f.n()).done;){var b=s.value,h=b.data.category;if(!u.has(h)){for(var w=b.data.replaces||[],v=b.data.hides||[],y=Array.from(new Set([].concat(Object(p.a)(w),Object(p.a)(v)))),m=0,g=y;m<g.length;m++){var O=g[m];O!==h&&(t.delete(O),u.add(O))}b.data.category===l.WearableCategory.SKIN&&(i=!0)}}}catch(j){f.e(j)}finally{f.f()}if(i){var E,x=Object(d.a)(Ne);try{for(x.s();!(E=x.n()).done;){var k=E.value;t.delete(k)}}catch(j){x.e(j)}finally{x.f()}}return t}function Ve(e,t){e&&(e.useAutoRotationBehavior=!0,e.autoRotationBehavior&&(e.autoRotationBehavior.idleRotationSpeed=t.autoRotateSpeed))}n(338);function He(){return["iPad Simulator","iPhone Simulator","iPod Simulator","iPad","iPhone","iPod"].includes(navigator.platform)}var ze=["data:EnvironmentBRDFTexture0","GlowLayerBlurRTT","GlowLayerBlurRTT2","HighlightLayerMainRTT"];function Ge(e,t,n){function r(){return(r=Object(v.a)(h.a.mark((function t(r,a){return h.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",R.Tools.CreateScreenshotUsingRenderTargetAsync(e,n,{width:r,height:a},void 0,void 0,!0));case 1:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function a(){return(a=Object(v.a)(h.a.mark((function e(){var n,r,a,o;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.meshes.reduce((function(e,t){return e+Math.floor(t.getTotalIndices()/3)}),0),r=t.materials.length,a=t.meshes.length,o=t.textures.filter((function(e){return e.name&&!ze.includes(e.name)})).length,e.abrupt("return",{triangles:n,materials:r,meshes:a,textures:o,bodies:a,entities:1});case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}return{getScreenshot:function(e,t){return r.apply(this,arguments)},getMetrics:function(){return a.apply(this,arguments)}}}var Ze,Xe=Object({NODE_ENV:"production",PUBLIC_URL:"https://cdn.decentraland.org/@dcl/wearable-preview/1.1.1-2625749587.commit-a84645b",WDS_SOCKET_HOST:void 0,WDS_SOCKET_PATH:void 0,WDS_SOCKET_PORT:void 0,FAST_REFRESH:!0,REACT_APP_WEBSITE_VERSION:"1.1.1-2625749587.commit-a84645b"}).REACT_APP_DEBUG;function qe(e,t){return Ke.apply(this,arguments)}function Ke(){return(Ke=Object(v.a)(h.a.mark((function e(t,n){var r,a,o;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:Ze&&Ze.dispose(),Ze=new R.Engine(t,!0,{preserveDrawingBuffer:!0,stencil:!0,antialias:!0}),(r=new R.Scene(Ze)).autoClear=!0,r.clearColor=n.background.transparent?new R.Color4(0,0,0,0):_(n.background.color).toColor4(),r.ambientColor=new R.Color3(1,1,1),r.preventDefaultOnPointerDown=!1,(a=new R.ArcRotateCamera("camera",0,0,0,new R.Vector3(0,0,0),r)).mode=R.Camera.PERSPECTIVE_CAMERA,e.t0=n.type,e.next=e.t0===l.PreviewType.WEARABLE?12:e.t0===l.PreviewType.AVATAR?15:17;break;case 12:return Ve(a,n),a.position=new R.Vector3(-2,2,2),e.abrupt("break",17);case 15:return a.position=new R.Vector3(0,1,3.5),e.abrupt("break",17);case 17:return n.camera===l.PreviewCamera.INTERACTIVE&&a.attachControl(t,!0),o=new R.Vector3(n.offsetX,n.offsetY,n.offsetZ),a.position.addInPlace(o),a.setTarget(o),a.lowerRadiusLimit=a.radius/n.zoom,a.upperRadiusLimit=a.lowerRadiusLimit*n.wheelZoom,a.radius=a.lowerRadiusLimit+(a.upperRadiusLimit-a.lowerRadiusLimit)*n.wheelStart/100,a.wheelPrecision=n.wheelPrecision,n.type===l.PreviewType.WEARABLE&&(new R.DirectionalLight("directional",new R.Vector3(0,0,1),r).intensity=1,new R.SpotLight("spot",new R.Vector3(-2,2,2),new R.Vector3(2,-2,-2),Math.PI/2,1e3,r).intensity=1),new R.HemisphericLight("top",new R.Vector3(0,-1,0),r).intensity=1,new R.HemisphericLight("bottom",new R.Vector3(0,1,0),r).intensity=1,He()||(new R.GlowLayer("glow",r).intensity=2),Ze.runRenderLoop((function(){r.render()})),Xe&&r.debugLayer.show({showExplorer:!0,embedMode:!0}),e.abrupt("return",[r,Ge(Ze,r,a)]);case 34:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Je(e,t,n){return Qe.apply(this,arguments)}function Qe(){return(Qe=Object(v.a)(h.a.mark((function e(t,n,r){var a,o,c;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=n.id,o=G(n,r),!(c=o.contents.find((function(e){return e.key.toLowerCase().endsWith("_mask.png")})))){e.next=5;break}return e.abrupt("return",new Promise((function(e,n){var r=new R.TextureAssetTask(a,c.url,!0,!1);r.onError=function(){return n(r.errorObject)},r.onSuccess=function(){e(r.texture)},r.run(t,(function(){return e(r.texture)}),n)})));case 5:return e.abrupt("return",null);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function $e(e,t,n){return et.apply(this,arguments)}function et(){return(et=Object(v.a)(h.a.mark((function e(t,n,r){var a,o,c;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=n.id,o=G(n,r),!(c=o.contents.find((function(e){return e.key.toLowerCase().endsWith(".png")&&!e.key.toLowerCase().endsWith("_mask.png")})))){e.next=5;break}return e.abrupt("return",new Promise((function(e,n){var r=new R.TextureAssetTask(a,c.url,!0,!1);r.onError=function(){return n(r.errorObject)},r.onSuccess=function(){e(r.texture)},r.run(t,(function(){return e(r.texture)}),n)})));case 5:return e.abrupt("return",null);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function tt(e,t){return nt.apply(this,arguments)}function nt(){return nt=Object(v.a)(h.a.mark((function e(t,n){var r;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=function(){var e=Object(v.a)(h.a.mark((function e(n,r){return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",R.SceneLoader.LoadAssetContainerAsync(n,"",t,null,r));case 1:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}(),e.prev=1,e.next=4,r(n,".glb");case 4:case 11:return e.abrupt("return",e.sent);case 7:return e.prev=7,e.t0=e.catch(1),e.next=11,r(n,".gltf");case 12:case"end":return e.stop()}}),e,null,[[1,7]])}))),nt.apply(this,arguments)}function rt(e){var t,n=new R.Mesh("parent",e),r=Object(d.a)(e.meshes);try{for(r.s();!(t=r.n()).done;){var a=t.value;a!==n&&a.setParent(n)}}catch(s){r.e(s)}finally{r.f()}!function(e){var t=e.getChildren().filter((function(e){return"__root__"!==e.id}));if(t.length>0){for(var n=t[0],r=n.getBoundingInfo(),a=r.boundingBox.minimumWorld.add(n.position),o=r.boundingBox.maximumWorld.add(n.position),c=1;c<t.length;c++){var i=t[c],s=(r=i.getBoundingInfo()).boundingBox.minimumWorld.add(i.position),u=r.boundingBox.maximumWorld.add(i.position);a=R.Vector3.Minimize(a,s),o=R.Vector3.Maximize(o,u)}e.setBoundingInfo(new R.BoundingInfo(a,o))}}(n);var o=n.getBoundingInfo().boundingBox.extendSize.length(),c=new R.Vector3(1/o,1/o,1/o);n.scaling=c;var i=n.getBoundingInfo().boundingBox.center.multiply(c);n.position.subtractInPlace(i)}Xe&&n(521);var at=[l.PreviewEmote.IDLE,l.PreviewEmote.MONEY,l.PreviewEmote.CLAP];function ot(e){return at.includes(e)}function ct(e){var t="https://cdn.decentraland.org/@dcl/wearable-preview/1.1.1-2625749587.commit-a84645b";t.endsWith("/")||(t+="/");var n="./emotes/".concat(e,".glb");return t.startsWith("http")?new URL(n,t).href:n}function it(e,t){return st.apply(this,arguments)}function st(){return(st=Object(v.a)(h.a.mark((function e(t,n){var r;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,tt(t,n);case 2:if(0!==(r=e.sent).animationGroups.length){e.next=5;break}throw new Error("No animation groups found for emote with url=".concat(n));case 5:return e.abrupt("return",r);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ut(e,t,n){return lt.apply(this,arguments)}function lt(){return(lt=Object(v.a)(h.a.mark((function e(t,n,r){var a,o;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=G(n,r.bodyShape),o=a.contents.find((function(e){return e.key===a.mainFile}))){e.next=4;break}throw new Error("Could not find a valid content in representation for wearable=".concat(n.id," and bodyShape=").concat(r.bodyShape));case 4:return e.abrupt("return",it(t,o.url));case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ft(e,t,n){return dt.apply(this,arguments)}function dt(){return(dt=Object(v.a)(h.a.mark((function e(t,n,r){var a,o,c,i,s,u,f,p,b,w,v,y,m,g,O,E,x,k,j,S,C,T;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(p=function(){r.camera!==l.PreviewCamera.STATIC&&Ve(t.cameras[0],r);o&&f.play(!0)},o=ot(r.emote),!r.wearable||!Y(r.wearable)){e.next=15;break}return e.prev=3,e.next=6,ut(t,r.wearable,r);case 6:a=e.sent,o=!!(null===(c=r.wearable.emoteDataV0)||void 0===c?void 0:c.loop),e.next=13;break;case 10:e.prev=10,e.t0=e.catch(3),console.warn("Could not load emote=".concat(r.wearable.id));case 13:e.next=21;break;case 15:if(!r.wearables.some(Y)){e.next=21;break}return s=r.wearables.reverse().find(Y),e.next=19,ut(t,s,r);case 19:a=e.sent,o=!!(null===(i=s.emoteDataV0)||void 0===i?void 0:i.loop);case 21:if(a){e.next=26;break}return u=ct(r.emote),e.next=25,it(t,u);case 25:a=e.sent;case 26:f=new R.AnimationGroup("emote",t),e.prev=27,b=Object(d.a)(n),e.prev=29,b.s();case 31:if((w=b.n()).done){e.next=42;break}if(v=w.value,y=v.container.transformNodes.reduce((function(e,t){var n=e.get(t.id)||[];return n.push(t),e.set(t.id,n)}),new Map),!(a.animationGroups.length>0)){e.next=39;break}m=Object(d.a)(a.animationGroups[0].targetedAnimations);try{for(m.s();!(g=m.n()).done;)if(O=g.value,E=O.animation,x=O.target,(k=y.get(x.id))&&k.length>0){j=Object(d.a)(k);try{for(j.s();!(S=j.n()).done;)C=S.value,f.addTargetedAnimation(E,C)}catch(h){j.e(h)}finally{j.f()}}}catch(h){m.e(h)}finally{m.f()}e.next=40;break;case 39:throw new Error("No animationGroups found");case 40:e.next=31;break;case 42:e.next=47;break;case 44:e.prev=44,e.t1=e.catch(29),b.e(e.t1);case 47:return e.prev=47,b.f(),e.finish(47);case 50:return f.onAnimationGroupEndObservable.addOnce(p),T=pt(f,o),r.camera===l.PreviewCamera.STATIC?T.stop():T.play(),e.abrupt("return",T);case 56:e.prev=56,e.t2=e.catch(27),console.warn("Could not play emote=".concat(r.emote),e.t2);case 59:case"end":return e.stop()}}),e,null,[[3,10],[27,56],[29,44,47,50]])})))).apply(this,arguments)}function pt(e,t){var n=0,r=!1;function a(){return o.apply(this,arguments)}function o(){return(o=Object(v.a)(h.a.mark((function t(){return h.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",e.to);case 1:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function c(){return i.apply(this,arguments)}function i(){return(i=Object(v.a)(h.a.mark((function t(){return h.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",e.isPlaying);case 1:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function s(e){return u.apply(this,arguments)}function u(){return(u=Object(v.a)(h.a.mark((function t(r){return h.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,c();case 2:if(!t.sent){t.next=8;break}e.pause(),s(r),window.requestAnimationFrame(l),t.next=11;break;case 8:e.stop(),e.start(!1,1,r,r,!1),n=r;case 11:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function l(){return f.apply(this,arguments)}function f(){return(f=Object(v.a)(h.a.mark((function o(){return h.a.wrap((function(o){for(;;)switch(o.prev=o.next){case 0:return o.next=2,c();case 2:if(o.sent){o.next=16;break}if(!n){o.next=14;break}return o.t0=e,o.t1=t,o.t2=n,o.next=9,a();case 9:o.t3=o.sent,o.t0.start.call(o.t0,o.t1,1,o.t2,o.t3,!1),n=0,o.next=15;break;case 14:e.play(t);case 15:r=!0;case 16:case"end":return o.stop()}}),o)})))).apply(this,arguments)}function d(){return p.apply(this,arguments)}function p(){return(p=Object(v.a)(h.a.mark((function t(){return h.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,c();case 2:if(!t.sent){t.next=4;break}e.pause();case 4:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function b(){return w.apply(this,arguments)}function w(){return(w=Object(v.a)(h.a.mark((function e(){return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:r?(s(0),window.requestAnimationFrame(d)):(l(),window.requestAnimationFrame(b));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}return{getLength:a,isPlaying:c,goTo:s,play:l,pause:d,stop:b}}function bt(e,t,n){return function(){var r=Object(v.a)(h.a.mark((function r(a){var o;return h.a.wrap((function(r){for(;;)switch(r.prev=r.next){case 0:if(!(o=t.find(Me(a)))){r.next=3;break}return r.abrupt("return",Promise.all([$e(e,o,n),Je(e,o,n)]));case 3:return r.abrupt("return",[null,null]);case 4:case"end":return r.stop()}}),r)})));return function(e){return r.apply(this,arguments)}}()}function ht(e,t,n){return wt.apply(this,arguments)}function wt(){return(wt=Object(v.a)(h.a.mark((function e(t,n,r){var a,o,c,s,u,f;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=bt(t,n,r),e.next=3,Promise.all([a(l.WearableCategory.EYES),a(l.WearableCategory.EYEBROWS),a(l.WearableCategory.MOUTH)]);case 3:return o=e.sent,c=Object(i.a)(o,3),s=c[0],u=c[1],f=c[2],e.abrupt("return",{eyes:s,eyebrows:u,mouth:f});case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function vt(e,t,n,r,a,o){return yt.apply(this,arguments)}function yt(){return(yt=Object(v.a)(h.a.mark((function e(t,n,r,a,o,c){var s,u,l,f,p,b,w,v,y,m,g,O;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:s=Object(d.a)(n.container.meshes);try{for(s.s();!(u=s.n()).done;)(l=u.value).name.toLowerCase().endsWith("mask_eyes")&&(f=Object(i.a)(r,2),p=f[0],b=f[1],p?mt(t,"eyes",l,p,c.eyes,b,"#ffffff"):l.setEnabled(!1)),l.name.toLowerCase().endsWith("mask_eyebrows")&&(w=Object(i.a)(a,2),v=w[0],y=w[1],v?mt(t,"eyebrows",l,v,c.hair,y,c.hair):l.setEnabled(!1)),l.name.toLowerCase().endsWith("mask_mouth")&&(m=Object(i.a)(o,2),g=m[0],O=m[1],g?mt(t,"mouth",l,g,c.skin,O,c.skin):l.setEnabled(!1))}catch(h){s.e(h)}finally{s.f()}case 2:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function mt(e,t,n,r,a,o,c){var i=new R.StandardMaterial("".concat(t,"_standard_material"),e);i.alphaMode=R.PBRMaterial.PBRMATERIAL_ALPHABLEND,i.backFaceCulling=!0,i.specularColor=R.Color3.Black(),r.hasAlpha=!0,i.sideOrientation=R.Orientation.CW,i.diffuseTexture=r,i.diffuseColor=o?R.Color3.Black():_(c),o&&(i.emissiveTexture=o,i.diffuseColor=_(a)),n.material=i}function gt(e){var t=function(e){var t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.BodyShape.MALE,r={},a=Object(d.a)(e);try{for(a.s();!(t=a.n()).done;){var o=t.value;try{var c,i=G(o,n),s=Object(d.a)(i.contents);try{for(s.s();!(c=s.n()).done;){var u=c.value;r[u.key]=u.url}}catch(f){s.e(f)}finally{s.f()}}catch(p){console.warn('Skipping generation of mappings for wearable="'.concat(o.id,'" since it lacks a representation for bodyShape="').concat(n,'"'));continue}}}catch(f){a.e(f)}finally{a.f()}return r}(e.wearable?[e.wearable].concat(Object(p.a)(e.wearables)):e.wearables,e.bodyShape);R.SceneLoader.OnPluginActivatedObservable.add((function(e){"gltf"===e.name&&(e.preprocessUrlAsync=function(){var e=Object(v.a)(h.a.mark((function e(n){var r;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return"/content/contents/",r=n.split("/content/contents/"),e.abrupt("return",r.length>0&&r[1]?t[r[1]]:n);case 3:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}())}))}var Ot="#include<pbrBlockFinalColorComposition>",Et="#include<customToonShading>";if(!R.Effect.ShadersStore.pbrPixelShader.includes(Ot))throw new Error("could not patch the pbrPixelShader");function xt(e,t){return kt.apply(this,arguments)}function kt(){return kt=Object(v.a)(h.a.mark((function e(t,n){var r,a,o,c,i,s,u,f,p,b,w,v,y,m=arguments;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(r=m.length>2&&void 0!==m[2]?m[2]:l.BodyShape.MALE,a=m.length>3?m[3]:void 0,o=m.length>4?m[4]:void 0,!K(c=G(n,r))){e.next=6;break}throw new Error('The wearable="'.concat(n.id,'" is a texture'));case 6:return i=q(c),e.next=9,tt(t,i);case 9:s=e.sent,u=Object(d.a)(s.materials);try{for(u.s();!(f=u.n()).done;)(p=f.value)instanceof R.PBRMaterial&&((b=p).specularIntensity=0,b.metallic&&(b.metallic=0,b.metallicF0Factor=0),b.name.toLowerCase().includes("hair")&&(o?(b.albedoColor=R.Color3.FromHexString(o).toLinearSpace(),b.specularIntensity=0,b.alpha=1):(b.alpha=0,t.removeMaterial(b))),b.name.toLowerCase().includes("skin")&&(a?(b.albedoColor=R.Color3.FromHexString(a).toLinearSpace(),b.specularIntensity=0,b.alpha=1):(b.alpha=0,t.removeMaterial(b))))}catch(h){u.e(h)}finally{u.f()}w=Object(d.a)(s.animationGroups);try{for(w.s();!(v=w.n()).done;)(y=v.value).stop(),y.reset(),y.dispose()}catch(h){w.e(h)}finally{w.f()}return e.abrupt("return",{container:s,wearable:n});case 15:case"end":return e.stop()}}),e)}))),kt.apply(this,arguments)}function jt(){return(jt=Object(v.a)(h.a.mark((function e(t,n){var r,a,o,c,s,u,f,p,b,w,v,y,m,g,O,E,x,k,j,S,C,T,A;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,qe(t,n);case 2:if(r=e.sent,a=Object(i.a)(r,2),o=a[0],c=a[1],e.prev=6,gt(n),u=[],n.type!==l.PreviewType.AVATAR){e.next=37;break}f=Ue(n),p=Array.from(f.values()),b=Object(d.a)(p.filter(De));try{for(b.s();!(w=b.n()).done;)v=w.value,y=xt(o,v,n.bodyShape,n.skin,n.hair).catch((function(e){console.warn(e.message)})),u.push(y)}catch(h){b.e(h)}finally{b.f()}return e.next=16,Promise.all(u);case 16:m=e.sent.filter(Ie),g=Object(d.a)(m);try{for(g.s();!(O=g.n()).done;)O.value.container.addAllToScene()}catch(h){g.e(h)}finally{g.f()}if(!(E=Ye(m))){e.next=29;break}return x=p.filter(Fe),e.next=24,ht(o,x,n.bodyShape);case 24:k=e.sent,j=k.eyes,S=k.eyebrows,C=k.mouth,vt(o,E,j,S,C,n);case 29:return e.next=31,ft(o,m,n);case 31:if(e.t0=e.sent,e.t0){e.next=34;break}e.t0=U();case 34:s=e.t0,e.next=53;break;case 37:if(!(T=n.wearable)){e.next=52;break}return e.prev=39,e.next=42,xt(o,T,n.bodyShape,n.skin,n.hair);case 42:e.sent.container.addAllToScene(),e.next=52;break;case 46:return e.prev=46,e.t1=e.catch(39),e.next=50,xt(o,T,n.bodyShape===l.BodyShape.MALE?l.BodyShape.FEMALE:l.BodyShape.MALE,n.skin,n.hair);case 50:e.sent.container.addAllToScene();case 52:s=U();case 53:return n.centerBoundingBox&&rt(o),A={scene:c,emote:s},e.abrupt("return",A);case 58:throw e.prev=58,e.t2=e.catch(6),o.clearColor=new R.Color4(0,0,0,0),e.t2;case 62:case"end":return e.stop()}}),e,null,[[6,58],[39,46]])})))).apply(this,arguments)}R.Effect.ShadersStore.pbrPixelShader.includes(Et)||(R.Effect.ShadersStore.pbrPixelShader=R.Effect.ShadersStore.pbrPixelShader.replace(Ot,Ot+"\n"+Et+"\n")),R.Effect.IncludesShadersStore.customToonShading=n(522).default;n(523);var St=n(154),Ct=function(){var e=Object(r.useState)(""),t=Object(i.a)(e,2),n=t[0],a=t[1],o=function(){var e=Object(r.useState)({width:void 0,height:void 0}),t=Object(i.a)(e,2),n=t[0],a=t[1];return Object(r.useEffect)((function(){function e(){a({width:window.innerWidth,height:window.innerHeight})}return window.addEventListener("resize",e),e(),function(){return window.removeEventListener("resize",e)}}),[]),n}(),c=o.width,s=o.height,f=Object(r.useState)({}),d=Object(i.a)(f,2),p=d[0],b=d[1],w=Object(r.useState)(!1),y=Object(i.a)(w,2),m=y[0],g=y[1],O=Object(r.useState)(!0),E=Object(i.a)(O,2),x=E[0],k=E[1],j=Object(r.useState)(!1),S=Object(i.a)(j,2),C=S[0],T=S[1],A=Object(r.useRef)(null),P=function(){var e=Object(r.useRef)();return Pe(function(){var t=Object(v.a)(h.a.mark((function t(n){var r,a,o,c,i,s,u,f;return h.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(!n.data||n.data.type!==l.PreviewMessageType.CONTROLLER_REQUEST||"object"!==typeof n.data.payload||"string"!==typeof n.data.payload.id||"string"!==typeof n.data.payload.namespace||"string"!==typeof n.data.payload.method||"object"!==typeof n.data.payload.params||!Array.isArray(n.data.payload.params)){t.next=26;break}if(r=n.data.payload,a=r.id,o=r.method,c=r.namespace,i=r.params,!e.current){t.next=25;break}if(!(c in e.current)){t.next=22;break}if(!(o in e.current[c])){t.next=19;break}return t.prev=5,s=e.current[c],u=s[o],t.next=10,u.apply(null,i);case 10:f=t.sent,Le(a,f),t.next=17;break;case 14:t.prev=14,t.t0=t.catch(5),We(a,t.t0.message);case 17:t.next=20;break;case 19:We(a,"Invalid method");case 20:t.next=23;break;case 22:We(a,"Invalid namespace");case 23:t.next=26;break;case 25:We(a,"Controller not ready");case 26:case"end":return t.stop()}}),t,null,[[5,14]])})));return function(e){return t.apply(this,arguments)}}()),e}(),B=Re(),R=Object(i.a)(B,3),L=R[0],W=R[1],M=R[2],_=Object(r.useState)(""),I=Object(i.a)(_,2),D=I[0],F=I[1],Y=Object(r.useState)(!0),N=Object(i.a)(Y,2),U=N[0],V=N[1],H=Object(r.useState)(!1),z=Object(i.a)(H,2),G=z[0],Z=z[1],X=n||M,q=(x||W)&&!X,K=!!D&&!U&&!q,J=U&&!q;return Object(r.useEffect)((function(){if(A.current&&L){var e={opacity:1};L.background.image&&(F(L.background.image),e.opacity=1,L.background.transparent||L.type!==l.PreviewType.TEXTURE||(e.backgroundColor=L.background.color)),b(e),L.type===l.PreviewType.TEXTURE?(V(!1),k(!1),T(!0)):function(e,t){return jt.apply(this,arguments)}(A.current,L).then((function(e){return P.current=e})).catch((function(e){return a(e.message)})).finally((function(){k(!1),T(!0)}))}}),[A.current,L]),Object(r.useEffect)((function(){G||(C?(Object(l.sendMessage)(window.parent,l.PreviewMessageType.LOAD,null),Z(!0)):X&&(Object(l.sendMessage)(window.parent,l.PreviewMessageType.ERROR,{message:X}),Z(!0)))}),[C,X,G]),Object(r.useEffect)((function(){if(W){var e=!1;x||(k(!0),e=!0),G&&(Z(!1),e=!0),e&&C&&T(!1)}}),[W,x,G,C]),function(){var e=Object(r.useState)(!1),t=Object(i.a)(e,2),n=t[0],a=t[1];Object(r.useEffect)((function(){n||(Object(l.sendMessage)(window.parent,l.PreviewMessageType.READY,null),a(!0))}),[n])}(),Object(St.jsxs)("div",{className:u()("Preview",{"is-dragging":m,"is-loading":q,"is-loaded":C,"is-3d":U&&(null===L||void 0===L?void 0:L.camera)===l.PreviewCamera.INTERACTIVE,"has-error":!!X}),style:p,children:[Object(St.jsx)("img",{src:D,className:u()("thumbnail",{"is-visible":K}),alt:"preview"}),Object(St.jsx)("canvas",{id:"wearable-preview",className:u()({"is-visible":J}),width:c,height:s,ref:A,onMouseDown:function(){return g(U&&!X)},onMouseUp:function(){return g(!1)}}),X&&Object(St.jsx)("div",{className:"error",children:X})]})},Tt=a.a.memo(Ct);c.a.render(Object(St.jsx)(a.a.StrictMode,{children:Object(St.jsx)(Tt,{})}),document.getElementById("root"))}},[[527,1,2]]]);
2
+ //# sourceMappingURL=main.2b7cd13e.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["lib/babylon/toon/new-pbr.hlsl","lib/sleep.ts","lib/json.ts","lib/api/nft.ts","lib/api/peer.ts","lib/color.ts","lib/emote.ts","lib/representation.ts","lib/wearable.ts","lib/zoom.ts","lib/config.ts","lib/cache.ts","hooks/useAsync.ts","hooks/useMessage.ts","hooks/useOptions.ts","hooks/useOverrides.ts","hooks/useConfig.ts","hooks/useController.ts","lib/babylon/utils.ts","lib/babylon/body.ts","lib/babylon/slots.ts","lib/babylon/camera.ts","lib/env.ts","lib/scene.ts","lib/babylon/scene.ts","lib/babylon/emote.ts","lib/babylon/face.ts","lib/babylon/mappings.ts","lib/babylon/toon/index.ts","lib/babylon/wearable.ts","lib/babylon/render.ts","components/Preview/Preview.tsx","hooks/useWindowSize.ts","hooks/useReady.ts","index.tsx"],"names":["sleep","ms","a","Promise","resolve","setTimeout","json","url","attempts","fetch","resp","ok","Error","text","nftApiByEnv","PreviewEnv","DEV","PROD","NFTApi","contractAddress","itemId","env","data","length","tokenId","nft","nftApi","peerByEnv","PeerApi","urns","map","urn","join","wearables","profile","profiles","peerApi","formatHex","color","startsWith","numberToHex","value","toString","slice","colorToHex","r","g","b","hexToColor","hex","parsed","parseHex","Color3","parseInt","isEmote","wearable","InvalidEmoteError","createInvalidEmoteController","getLength","isPlaying","goTo","play","pause","stop","is","representation","bodyShape","bodyShapes","includes","isMale","BodyShape","MALE","isFemale","FEMALE","getRepresentation","shape","representations","some","id","find","getRepresentationOrDefault","hasRepresentation","error","getContentUrl","content","contents","key","mainFile","isTexture","endsWith","getWearableByCategory","category","getFacialFeatureCategories","WearableCategory","EYEBROWS","MOUTH","EYES","getNonFacialFeatureCategories","HAIR","UPPER_BODY","LOWER_BODY","FEET","getDefaultCategories","getDefaultWearableUrn","isWearable","getBodyShape","wearabe","parseZoom","rawZoom","parsedZoom","parseFloat","isNaN","Math","min","max","getZoom","SKIN","DEFAULT_PROFILE","fetchWearable","fetchURNs","results","parseWearable","base64","JSON","parse","atob","fetchProfileWearables","avatar","filter","result","fetchWearables","fetchURLs","urls","promises","then","catch","all","profileMemo","cache","memo","fn","args","reset","createMemo","fetchProfile","avatars","console","log","fetchWearableFromContract","options","network","fetchNFT","Network","ETHEREUM","image","split","fetchAvatar","base64s","includeDefaultWearables","includeFacialFeatures","defaultWearableUrns","categories","push","defaultWearables","wearablePromise","profilePromise","skin","hair","eyes","zoom","type","PreviewType","WEARABLE","background","transparent","disableBackground","AVATAR","disableDefaultWearables","disableFace","TEXTURE","thumbnail","isStandard","Rarity","getColor","rarity","emote","PreviewEmote","IDLE","Object","values","camera","PreviewCamera","INTERACTIVE","autoRotateSpeed","centerBoundingBox","disableAutoCenter","wheelZoom","wheelPrecision","wheelStart","isNumber","blob","fromBlob","undefined","face","disableAutoRotate","offsetX","offsetY","offsetZ","URL","createObjectURL","nonces","isValid","nonce","useMessage","handler","callback","useCallback","useEffect","handleMessage","event","window","addEventListener","removeEventListener","useOptions","useState","location","search","useMemo","params","URLSearchParams","autoRotateSpeedParam","get","offsetXParam","offsetYParam","offsetZParam","wheelZoomParam","wheelPrecisionParam","wheelStartParam","bodyShapeParam","transparentBackground","has","warn","getAll","reduce","selected","overrides","setOverrides","PreviewMessageType","UPDATE","payload","equal","useOverrides","useConfig","asyncFunction","deps","isLoading","setIsLoading","setResult","setError","message","finally","useAsync","createConfig","sendResult","sendMessage","parent","CONTROLLER_RESPONSE","sendError","isCategory","isHidden","asset","hides","replaces","isSuccesful","isModel","isFacialFeature","assets","part","BODY_SHAPE","hasSkin","hideUpperBody","hideLowerBody","hideFeet","hideHead","HEAD","container","meshes","mesh","name","toLowerCase","setEnabled","categoriesHiddenBySkin","HELMET","FACIAL_HAIR","getSlots","config","slots","Map","slot","set","reverse","alreadyRemoved","Set","replaced","hidden","toRemove","Array","from","delete","add","startAutoRotateBehavior","useAutoRotationBehavior","autoRotationBehavior","idleRotationSpeed","isIOs","navigator","platform","ignoreTextureList","createSceneController","engine","scene","width","height","Tools","CreateScreenshotUsingRenderTargetAsync","triangles","total","floor","getTotalIndices","materials","textures","texture","bodies","entities","getScreenshot","getMetrics","showInspector","process","REACT_APP_DEBUG","createScene","canvas","dispose","Engine","preserveDrawingBuffer","stencil","antialias","root","Scene","autoClear","clearColor","Color4","toColor4","ambientColor","preventDefaultOnPointerDown","ArcRotateCamera","Vector3","mode","Camera","PERSPECTIVE_CAMERA","position","attachControl","offset","addInPlace","setTarget","lowerRadiusLimit","radius","upperRadiusLimit","DirectionalLight","intensity","SpotLight","PI","HemisphericLight","GlowLayer","runRenderLoop","render","debugLayer","show","showExplorer","embedMode","loadMask","file","reject","task","TextureAssetTask","onError","errorObject","onSuccess","run","loadTexture","loadAssetContainer","load","extension","SceneLoader","LoadAssetContainerAsync","center","Mesh","setParent","children","getChildren","child","boundingInfo","getBoundingInfo","boundingBox","minimumWorld","maximumWorld","i","siblingMin","siblingMax","Minimize","Maximize","setBoundingInfo","BoundingInfo","refreshBoundingInfo","size","extendSize","scale","scaling","multiply","subtractInPlace","require","loopedEmotes","MONEY","CLAP","isLooped","buildEmoteUrl","baseUrl","path","href","loadEmoteFromUrl","animationGroups","loadEmoteFromWearable","playEmote","onAnimationEnd","STATIC","cameras","loop","emoteAnimationGroup","emoteDataV0","emoteUrl","AnimationGroup","nodes","transformNodes","node","list","targetedAnimations","targetedAnimation","animation","target","newTargets","newTarget","addTargetedAnimation","onAnimationGroupEndObservable","addOnce","controller","createController","animationGroup","startFrom","hasPlayed","to","seconds","requestAnimationFrame","start","getCategoryLoader","features","feature","getFacialFeatures","loadCategory","eyebrows","mouth","applyFacialFeatures","mask","applyTextureAndMask","maskColor","newMaterial","StandardMaterial","alphaMode","PBRMaterial","PBRMATERIAL_ALPHABLEND","backFaceCulling","specularColor","Black","hasAlpha","sideOrientation","Orientation","CW","diffuseTexture","diffuseColor","emissiveTexture","material","setupMappings","mappings","createMappings","OnPluginActivatedObservable","plugin","preprocessUrlAsync","parts","needle","injection","Effect","ShadersStore","loadWearable","originalMaterial","specularIntensity","metallic","metallicF0Factor","albedoColor","FromHexString","toLinearSpace","alpha","removeMaterial","sceneController","promise","addAllToScene","emoteController","replace","IncludesShadersStore","default","Preview","previewError","setPreviewError","windowSize","setWindowSize","handleResize","innerWidth","innerHeight","useWindowSize","style","setStyle","isDragging","setIsDragging","isLoadingModel","setIsLoadingModel","isLoaded","setIsLoaded","canvasRef","useRef","controllerRef","CONTROLLER_REQUEST","namespace","method","isArray","current","apply","useController","isLoadingConfig","configError","setImage","is3D","setIs3D","isMessageSent","setIsMessageSent","showImage","showCanvas","opacity","backgroundColor","_controller","LOAD","ERROR","shouldResetIsLoaded","isReady","setIsReady","READY","useReady","className","classNames","src","alt","ref","onMouseDown","onMouseUp","React","ReactDOM","StrictMode","document","getElementById"],"mappings":"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","file":"static/js/main.2b7cd13e.chunk.js","sourcesContent":["export default \"float angleY = 3.14 / 2.0;\\n\\nmat3 rotateY = mat3(\\n cos(angleY), 0, sin(angleY),\\n 0, 1, 0,\\n -sin(angleY), 0, cos(angleY)\\n);\\n\\n// view angle DOT normal of the position\\nvec3 tray = normalize(viewDirectionW * rotateY);\\nvec3 rayDirection = normalize(tray-vPositionW);\\nfloat t=(dot(normalW,rayDirection) + 1.0) / 2.0;\\n\\nfloat ToonThresholds[3];\\nToonThresholds[0] = 0.90;\\nToonThresholds[1] = 0.80;\\nToonThresholds[2] = 0.20;\\n\\nfloat ToonBrightnessLevels[4];\\nToonBrightnessLevels[0] = 1.2;\\nToonBrightnessLevels[1] = 1.0;\\nToonBrightnessLevels[2] = 1.0;\\nToonBrightnessLevels[3] = 0.8;\\n\\nif (t > ToonThresholds[0])\\n{\\n finalColor.rgb *= ToonBrightnessLevels[0];\\n}\\nelse if (t > ToonThresholds[1])\\n{\\n finalColor.rgb *= ToonBrightnessLevels[1];\\n}\\nelse if (t > ToonThresholds[2])\\n{\\n finalColor.rgb *= ToonBrightnessLevels[2];\\n}\\nelse\\n{\\n finalColor.rgb *= ToonBrightnessLevels[3];\\n}\\n\";","export async function sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n","import { sleep } from './sleep'\n\nexport async function json<T>(url: string, attempts = 3): Promise<T> {\n try {\n const resp = await fetch(url)\n if (!resp.ok) {\n throw new Error(await resp.text())\n }\n return resp.json() as Promise<T>\n } catch (error) {\n if (attempts > 0) {\n await sleep(100)\n return json(url, attempts - 1)\n } else {\n throw error\n }\n }\n}\n","import { Item, NFT, PreviewEnv } from '@dcl/schemas'\nimport { json } from '../json'\n\nexport const nftApiByEnv: Record<PreviewEnv, string> = {\n [PreviewEnv.DEV]: 'https://nft-api.decentraland.io',\n [PreviewEnv.PROD]: 'https://nft-api.decentraland.org',\n}\n\nclass NFTApi {\n async fetchItem(contractAddress: string, itemId: string, env: PreviewEnv) {\n const { data } = await json<{ data: Item[] }>(`${nftApiByEnv[env]}/v1/items?contractAddress=${contractAddress}&itemId=${itemId}`)\n if (data.length === 0) {\n throw new Error(`Item not found for contractAddress=\"${contractAddress}\" itemId=\"${itemId}\"`)\n }\n return data[0]\n }\n async fetchNFT(contractAddress: string, tokenId: string, env: PreviewEnv) {\n const { data } = await json<{ data: { nft: NFT }[] }>(\n `${nftApiByEnv[env]}/v1/nfts?contractAddress=${contractAddress}&tokenId=${tokenId}`\n )\n if (data.length === 0) {\n throw new Error(`NFT not found for contractAddress=\"${contractAddress}\" tokenId=\"${tokenId}\"`)\n }\n return data[0].nft\n }\n}\n\nexport const nftApi = new NFTApi()\n","import { PreviewEnv, Profile, WearableDefinition } from '@dcl/schemas'\nimport { json } from '../json'\n\nexport const peerByEnv: Record<PreviewEnv, string> = {\n [PreviewEnv.DEV]: 'https://peer.decentraland.zone',\n [PreviewEnv.PROD]: 'https://peer.decentraland.org',\n}\n\nclass PeerApi {\n async fetchWearables(urns: string[], env: PreviewEnv) {\n if (urns.length === 0) {\n return []\n }\n const { wearables } = await json<{ wearables: WearableDefinition[] }>(\n `${peerByEnv[env]}/lambdas/collections/wearables?${urns.map((urn) => `wearableId=${urn}`).join('&')}`\n )\n if (wearables.length === 0) {\n throw new Error(`Wearables not found for urns=\"${urns}\"`)\n }\n return wearables\n }\n async fetchProfile(profile: string, env: PreviewEnv) {\n const profiles = await json<Profile[]>(`${peerByEnv[env]}/lambdas/profiles?id=${profile}`)\n return profiles.length > 0 ? profiles[0] : null\n }\n}\n\nexport const peerApi = new PeerApi()\n","import { Color3 } from '@babylonjs/core'\nimport { Color3 as RGB } from '@dcl/schemas'\n\nexport function formatHex(color: string) {\n return color.startsWith('#') ? color : '#' + color\n}\n\nexport function parseHex(color: string) {\n return color.startsWith('#') ? color.slice(1) : color\n}\n\nexport function numberToHex(value: number) {\n const hex = ((value * 255) | 0).toString(16)\n return ('0' + hex).slice(-2)\n}\n\nexport function colorToHex(color: RGB) {\n return numberToHex(color.r) + numberToHex(color.g) + numberToHex(color.b)\n}\n\nexport function hexToColor(hex: string) {\n const parsed = parseHex(hex)\n const color = new Color3(\n parseInt(parsed.slice(0, 2), 16) / 256,\n parseInt(parsed.slice(2, 4), 16) / 256,\n parseInt(parsed.slice(4, 6), 16) / 256\n )\n return color\n}\n","import { IEmoteController, WearableDefinition } from '@dcl/schemas'\n\nexport function isEmote(wearable: WearableDefinition) {\n return `emoteDataV0` in wearable\n}\n\nexport class InvalidEmoteError extends Error {\n constructor() {\n super(`Invalid emote`)\n }\n}\n\nexport function createInvalidEmoteController(): IEmoteController {\n return {\n getLength() {\n throw new InvalidEmoteError()\n },\n isPlaying() {\n throw new InvalidEmoteError()\n },\n goTo() {\n throw new InvalidEmoteError()\n },\n play() {\n throw new InvalidEmoteError()\n },\n pause() {\n throw new InvalidEmoteError()\n },\n stop() {\n throw new InvalidEmoteError()\n },\n }\n}\n","import { BodyShape, RepresentationDefinition, WearableDefinition } from '@dcl/schemas'\n\nexport function is(representation: RepresentationDefinition, bodyShape: BodyShape) {\n return representation.bodyShapes.includes(bodyShape)\n}\n\nexport function isMale(representation: RepresentationDefinition) {\n return is(representation, BodyShape.MALE)\n}\n\nexport function isFemale(representation: RepresentationDefinition) {\n return is(representation, BodyShape.FEMALE)\n}\n\nexport function getRepresentation(wearable: WearableDefinition, shape = BodyShape.MALE) {\n switch (shape) {\n case BodyShape.FEMALE: {\n if (!wearable.data.representations.some(isFemale)) {\n throw new Error(`Could not find a BaseFemale representation for wearable=\"${wearable.id}\"`)\n }\n return wearable.data.representations.find(isFemale)!\n }\n case BodyShape.MALE: {\n if (!wearable.data.representations.some(isMale)) {\n throw new Error(`Could not find a BaseMale representation for wearable=\"${wearable.id}\"`)\n }\n return wearable.data.representations.find(isMale)!\n }\n }\n}\n\nexport function getRepresentationOrDefault(wearable: WearableDefinition, shape = BodyShape.MALE) {\n if (hasRepresentation(wearable, shape)) {\n return getRepresentation(wearable, shape)\n }\n if (wearable.data.representations.length > 0) {\n return wearable.data.representations[0]\n }\n throw new Error(`The wearable=\"${wearable.id}\" has no representation`)\n}\n\nexport function hasRepresentation(wearable: WearableDefinition, shape = BodyShape.MALE) {\n try {\n getRepresentation(wearable, shape)\n return true\n } catch (error) {\n return false\n }\n}\n\nexport function getContentUrl(representation: RepresentationDefinition) {\n const content = representation.contents.find((content) => content.key === representation.mainFile)\n if (!content) {\n throw new Error(`Could not find main file`)\n }\n return content.url\n}\n\nexport function isTexture(representation: RepresentationDefinition) {\n return representation.mainFile.endsWith('png')\n}\n","import { BodyShape, WearableCategory, WearableDefinition } from '@dcl/schemas'\n\nexport function getWearableByCategory(wearables: WearableDefinition[], category: WearableCategory) {\n return wearables.find((wearable) => wearable.data.category === category) || null\n}\n\nexport function getFacialFeatureCategories() {\n return [WearableCategory.EYEBROWS, WearableCategory.MOUTH, WearableCategory.EYES]\n}\n\nexport function getNonFacialFeatureCategories() {\n return [WearableCategory.HAIR, WearableCategory.UPPER_BODY, WearableCategory.LOWER_BODY, WearableCategory.FEET]\n}\n\nexport function getDefaultCategories() {\n return [\n WearableCategory.EYEBROWS,\n WearableCategory.MOUTH,\n WearableCategory.EYES,\n WearableCategory.HAIR,\n WearableCategory.UPPER_BODY,\n WearableCategory.LOWER_BODY,\n WearableCategory.FEET,\n ]\n}\n\nexport function getDefaultWearableUrn(category: WearableCategory, shape: BodyShape) {\n switch (category) {\n case WearableCategory.EYEBROWS:\n return shape === BodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:eyebrows_00'\n : 'urn:decentraland:off-chain:base-avatars:f_eyebrows_00'\n case WearableCategory.MOUTH:\n return shape === BodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:mouth_00'\n : 'urn:decentraland:off-chain:base-avatars:f_mouth_00'\n case WearableCategory.EYES:\n return shape === BodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:eyes_00'\n : 'urn:decentraland:off-chain:base-avatars:f_eyes_00'\n case WearableCategory.HAIR:\n return shape === BodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:casual_hair_01'\n : 'urn:decentraland:off-chain:base-avatars:standard_hair'\n case WearableCategory.UPPER_BODY:\n return shape === BodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:green_hoodie'\n : 'urn:decentraland:off-chain:base-avatars:f_sweater'\n case WearableCategory.LOWER_BODY:\n return shape === BodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:brown_pants'\n : 'urn:decentraland:off-chain:base-avatars:f_jeans'\n case WearableCategory.FEET:\n return shape === BodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:sneakers'\n : 'urn:decentraland:off-chain:base-avatars:bun_shoes'\n default:\n throw new Error(`There is no default wearable for category=\"${category}\"`)\n }\n}\n\nexport function isWearable(value: WearableDefinition | void): value is WearableDefinition {\n return !!value\n}\n\nexport function getBodyShape(wearabe: WearableDefinition): BodyShape {\n const bodyShapes = [BodyShape.MALE, BodyShape.FEMALE]\n return (\n bodyShapes.find((bodyShape) =>\n wearabe.data.representations.some((representation) => representation.bodyShapes.includes(bodyShape))\n ) || bodyShapes[0]\n )\n}\n","import { WearableCategory, WearableDefinition } from '@dcl/schemas'\n\nexport function parseZoom(rawZoom: string | null) {\n const parsedZoom = rawZoom ? parseFloat(rawZoom) : null\n const zoom =\n parsedZoom === null || isNaN(parsedZoom) ? null : (Math.min(Math.max(parsedZoom, 0), 100) * 1.8) / 100 + 1\n return zoom\n}\n\n/**\n * Returns the right zoom for a given category\n * @param category\n * @returns\n */\nexport function getZoom(wearable?: WearableDefinition | void) {\n const category = wearable?.data.category\n switch (category) {\n case WearableCategory.UPPER_BODY:\n return 2\n case WearableCategory.SKIN:\n return 1.75\n default:\n return 1.25\n }\n}\n","import {\n Avatar,\n BodyShape,\n isStandard,\n Network,\n PreviewCamera,\n PreviewConfig,\n PreviewEmote,\n PreviewEnv,\n PreviewOptions,\n PreviewType,\n Rarity,\n WearableDefinition,\n WearableWithBlobs,\n} from '@dcl/schemas'\nimport { nftApi } from './api/nft'\nimport { peerApi } from './api/peer'\nimport { createMemo } from './cache'\nimport { colorToHex, formatHex } from './color'\nimport { isEmote } from './emote'\nimport { getRepresentationOrDefault, hasRepresentation, isTexture } from './representation'\nimport {\n getDefaultCategories,\n getDefaultWearableUrn,\n getBodyShape,\n getWearableByCategory,\n isWearable,\n getFacialFeatureCategories,\n getNonFacialFeatureCategories,\n} from './wearable'\nimport { getZoom } from './zoom'\n\nconst DEFAULT_PROFILE = 'default'\n\nasync function fetchWearable(urn: string, env: PreviewEnv) {\n const results = await fetchURNs([urn], env)\n if (results.length !== 1) {\n throw new Error(`Could not find wearable for urn=\"${urn}\"`)\n }\n return results[0]\n}\n\nfunction parseWearable(base64: string): WearableDefinition {\n return JSON.parse(atob(base64))\n}\n\nasync function fetchProfileWearables(profile: Avatar | null, env: PreviewEnv) {\n if (!profile) {\n return []\n }\n const results = await fetchURNs(profile.avatar.wearables, env)\n return results.filter((result) => !isEmote(result))\n}\n\nasync function fetchURNs(urns: string[], env: PreviewEnv) {\n if (urns.length === 0) {\n return []\n }\n return peerApi.fetchWearables(urns, env)\n}\n\nasync function fetchURLs(urls: string[]) {\n if (urls.length === 0) {\n return []\n }\n const promises = urls.map((url) =>\n fetch(url)\n .then((resp) => resp.json())\n .catch()\n )\n const results = await Promise.all(promises)\n return results.filter(isWearable)\n}\n\nexport const profileMemo = createMemo<Avatar | null>()\nasync function fetchProfile(profile: string, env: PreviewEnv) {\n return profileMemo.memo(profile, async () => {\n if (profile === DEFAULT_PROFILE) {\n return null\n }\n const resp = await peerApi\n .fetchProfile(profile, env)\n .then((profile) => (profile && profile.avatars.length > 0 ? profile.avatars[0] : null))\n .catch((error: Error) => console.log(`Failed to load profile=\"${profile}\"`, error))\n return resp || null\n })\n}\n\nasync function fetchWearableFromContract(options: {\n contractAddress: string\n itemId?: string | null\n tokenId?: string | null\n env: PreviewEnv\n}) {\n const { contractAddress, itemId, tokenId, env } = options\n if (!itemId && !tokenId) {\n throw new Error(`You need to provide an itemId or a tokenId`)\n }\n\n const network = env === PreviewEnv.PROD ? 'matic' : 'mumbai'\n let urn = `urn:decentraland:${network}:collections-v2:${contractAddress}:${itemId}`\n if (!itemId && !tokenId) {\n throw new Error(`You must provide either tokenId or itemId`)\n } else if (!itemId && tokenId) {\n const nft = await nftApi.fetchNFT(contractAddress, tokenId, env)\n urn =\n nft.network !== Network.ETHEREUM\n ? `urn:decentraland:${network}:collections-v2:${contractAddress}:${nft.itemId}`\n : nft.image.split('contents/')[1].split('/thumbnail')[0] // since the Ethereum collections have a different URN, we extract it from the image path\n }\n return fetchWearable(urn, env)\n}\n\nasync function fetchAvatar(\n profile: Avatar | null,\n urns: string[],\n urls: string[],\n base64s: string[],\n bodyShape: BodyShape,\n includeDefaultWearables: boolean,\n includeFacialFeatures: boolean,\n env: PreviewEnv\n) {\n // gather wearables from profile, urns, urls and base64s\n let wearables = [\n ...(await fetchProfileWearables(profile, env)),\n ...(await fetchURNs([bodyShape, ...urns], env)),\n ...(await fetchURLs(urls)),\n ...base64s.map(parseWearable),\n ]\n // filter out wearables that don't have a representation for the body shape\n wearables = wearables.filter((wearable) => hasRepresentation(wearable, bodyShape))\n // fill default categories\n const defaultWearableUrns: string[] = []\n const categories =\n includeDefaultWearables && includeFacialFeatures\n ? getDefaultCategories()\n : includeDefaultWearables\n ? getNonFacialFeatureCategories()\n : includeFacialFeatures\n ? getFacialFeatureCategories()\n : []\n for (const category of categories) {\n const wearable = getWearableByCategory(wearables, category)\n if (!wearable) {\n const urn = getDefaultWearableUrn(category, bodyShape)\n if (urn) {\n defaultWearableUrns.push(urn)\n } else {\n throw new Error(`Could not get default URN for category=\"${category}\"`)\n }\n }\n }\n if (defaultWearableUrns.length > 0) {\n const defaultWearables = await fetchURNs(defaultWearableUrns, env)\n wearables = [...wearables, ...defaultWearables]\n }\n\n return wearables\n}\n\nexport async function createConfig(options: PreviewOptions = {}): Promise<PreviewConfig> {\n const { contractAddress, tokenId, itemId } = options\n const env = options.env || PreviewEnv.PROD\n\n // load wearable to preview\n let wearablePromise: Promise<WearableDefinition | void> = Promise.resolve()\n if (contractAddress) {\n wearablePromise = fetchWearableFromContract({ contractAddress, tokenId, itemId, env })\n }\n\n // load profile\n const profilePromise = options.profile ? fetchProfile(options.profile, env) : Promise.resolve(null)\n\n // await promises\n const [wearable, profile] = await Promise.all([wearablePromise, profilePromise] as const)\n\n // use body shape from options, default to the profile one, if no profile default to the wearable bodyShape, if none, default to male\n const bodyShape =\n options.bodyShape ||\n (profile && (profile.avatar.bodyShape as BodyShape)) ||\n (wearable ? getBodyShape(wearable!) : BodyShape.MALE)\n\n // use colors from options, default to profile, if none, use default values\n const skin = formatHex(options.skin || (profile && colorToHex(profile.avatar.skin.color)) || 'cc9b76')\n const hair = formatHex(options.hair || (profile && colorToHex(profile.avatar.hair.color)) || '000000')\n const eyes = formatHex(options.eyes || (profile && colorToHex(profile.avatar.eyes.color)) || '000000')\n\n // merge urns from profile (if any) and extra urns\n const urns = [...(options.urns || [])]\n\n // urls to load wearables from\n const urls = options.urls || []\n\n // wearables passed as base64\n const base64s = options.base64s || []\n\n let wearables: WearableDefinition[] = []\n let zoom = 1.75\n let type = PreviewType.WEARABLE\n let background: PreviewConfig['background'] = {\n color: '#4b4852', // grey\n transparent: options.disableBackground === true,\n }\n\n // if loading multiple wearables (either from URNs or URLs), or if wearable is emote, render full avatar\n if (urns.length > 0 || urls.length > 0 || base64s.length > 0 || (wearable && isEmote(wearable)) || options.profile) {\n type = PreviewType.AVATAR\n wearables = await fetchAvatar(\n profile,\n urns,\n urls,\n base64s,\n bodyShape,\n !options.disableDefaultWearables,\n !options.disableFace,\n env\n )\n }\n\n if (wearable) {\n zoom = wearables.length > 0 ? zoom : getZoom(wearable)\n const representation = getRepresentationOrDefault(wearable)\n if (isTexture(representation) && type !== PreviewType.AVATAR) {\n type = PreviewType.TEXTURE\n }\n background = {\n ...background,\n image: wearable.thumbnail,\n }\n if (isStandard(wearable)) {\n const color = Rarity.getColor(wearable.rarity)\n background = {\n ...background,\n image: wearable.thumbnail,\n color,\n }\n }\n }\n\n let emote = PreviewEmote.IDLE\n if (options.emote && Object.values(PreviewEmote).includes(options.emote)) {\n emote = options.emote\n }\n\n let camera = PreviewCamera.INTERACTIVE\n if (options.camera && Object.values(PreviewCamera).includes(options.camera)) {\n camera = options.camera\n }\n const autoRotateSpeed =\n typeof options.autoRotateSpeed === 'number' && !isNaN(options.autoRotateSpeed) ? options.autoRotateSpeed : 0.2\n const centerBoundingBox = !options.disableAutoCenter\n\n // wheel options\n let wheelZoom = 1\n let wheelPrecision = 100\n let wheelStart = 50\n if (isNumber(options.wheelZoom)) {\n wheelZoom = Math.max(options.wheelZoom!, 1) // min value 1\n }\n if (isNumber(options.wheelPrecision)) {\n wheelPrecision = Math.max(options.wheelPrecision!, 1) // min value 1\n }\n if (isNumber(options.wheelStart)) {\n wheelStart = 100 - Math.min(Math.max(options.wheelStart!, 0), 100) // value between 0 and 100\n }\n\n // custom background color\n if (options.background) {\n background.color = options.background\n }\n\n return {\n wearable: wearable ?? (options.blob ? fromBlob(options.blob) : undefined),\n wearables,\n bodyShape,\n skin,\n hair,\n eyes,\n type,\n background,\n face: options.disableFace !== false,\n emote,\n camera,\n autoRotateSpeed: options.disableAutoRotate ? 0 : autoRotateSpeed,\n centerBoundingBox,\n offsetX: options.offsetX || 0,\n offsetY: options.offsetY || 0,\n offsetZ: options.offsetZ || 0,\n zoom: typeof options.zoom === 'number' ? options.zoom : zoom,\n wheelZoom,\n wheelPrecision,\n wheelStart,\n }\n}\n\nfunction isNumber(value: number | null | undefined): boolean {\n return typeof value === 'number' && !isNaN(value)\n}\n\nfunction fromBlob(blob: WearableWithBlobs): WearableDefinition {\n return {\n ...blob,\n data: {\n ...blob.data,\n representations: blob.data.representations.map((representation) => ({\n ...representation,\n contents: representation.contents.map((content) => ({\n key: content.key,\n url: URL.createObjectURL(content.blob),\n })),\n })),\n },\n }\n}\n","interface IMemo<T> {\n memo: (key: string, fn: (...args: any[]) => Promise<T>, ...args: any[]) => Promise<T>\n reset: () => void\n}\n\nexport function createMemo<T>(): IMemo<T> {\n const cache: Record<string, Promise<T>> = {}\n return {\n memo: async (key, fn, ...args) => {\n const exists = key in cache\n if (!exists) {\n cache[key] = fn(...args)\n }\n return cache[key]\n },\n reset: () => {\n for (const key in cache) {\n delete cache[key]\n }\n },\n }\n}\n","import { useEffect, useState } from 'react'\n\n/* \n ids and nonces are used to identity the order on which async functions are called, \n to avoid race conditions and always keep the value of the last function call, \n regardless of the order in which they resolve \n*/\nconst nonces: Record<string, number> = {}\nfunction isValid(id: string, nonce: number) {\n return nonce === nonces[id]\n}\n\nexport function useAsync<T>(id: string, asyncFunction: (...args: any[]) => Promise<T>, deps: React.DependencyList = []) {\n // initialize state\n const [isLoading, setIsLoading] = useState(false)\n const [result, setResult] = useState<T | null>(null)\n const [error, setError] = useState('')\n\n // initialize nonce for this id\n if (typeof nonces[id] === 'undefined') {\n nonces[id] = 0\n }\n\n // run async function\n useEffect(() => {\n const nonce = ++nonces[id]\n setIsLoading(true)\n asyncFunction()\n .then((result) => {\n if (isValid(id, nonce)) {\n setResult(result)\n }\n })\n .catch((error) => {\n if (isValid(id, nonce)) {\n setError(error.message)\n }\n })\n .finally(() => {\n if (isValid(id, nonce)) {\n setIsLoading(false)\n }\n })\n }, deps) // eslint-disable-line\n\n return [result, isLoading, error] as const\n}\n","import { useCallback, useEffect } from 'react'\n\nexport const useMessage = (handler: (event: MessageEvent) => void) => {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const callback = useCallback(handler, [])\n // receive message from parent window to update options\n useEffect(() => {\n function handleMessage(event: MessageEvent) {\n callback(event)\n }\n window.addEventListener('message', handleMessage)\n return () => {\n window.removeEventListener('message', handleMessage)\n }\n }, [callback])\n}\n","import { useMemo, useState } from 'react'\nimport { useOverrides } from './useOverrides'\n\nimport { BodyShape, PreviewCamera, PreviewEmote, PreviewEnv, PreviewOptions } from '@dcl/schemas'\nimport { parseZoom } from '../lib/zoom'\n\nexport const useOptions = () => {\n // get options from url params\n const [search] = useState(window.location.search.toString())\n const options = useMemo<PreviewOptions>(() => {\n const params = new URLSearchParams(search)\n const autoRotateSpeedParam = params.get('autoRotateSpeed') as string | null\n const offsetXParam = params.get('offsetX') as string | null\n const offsetYParam = params.get('offsetY') as string | null\n const offsetZParam = params.get('offsetZ') as string | null\n const wheelZoomParam = params.get('wheelZoom') as string | null\n const wheelPrecisionParam = params.get('wheelPrecision') as string | null\n const wheelStartParam = params.get('wheelStart') as string | null\n const bodyShapeParam = params.get('bodyShape')\n\n const transparentBackground = params.has('transparentBackground')\n if (transparentBackground) {\n console.warn(\n `Deprecated: you are using the query param \"transparentBackground\" that has been deprecated in favor of \"disableBackground\". Please switch to the new query param since in the future this will not be supported.`\n )\n }\n const centerBoundingBox = params.get('centerBoundingBox') !== 'false'\n if (transparentBackground) {\n console.warn(\n `Deprecated: you are using the query param \"transparentBackground\" that has been deprecated in favor of \"disableBackground\". Please switch to the new query param since in the future this will not be supported.`\n )\n }\n\n const options: PreviewOptions = {\n contractAddress: params.get('contract')!,\n tokenId: params.get('token'),\n itemId: params.get('item'),\n skin: params.get('skin'),\n hair: params.get('hair'),\n eyes: params.get('eyes'),\n emote: params.get('emote') as PreviewEmote | null,\n camera: params.get('camera') as PreviewCamera | null,\n background: params.get('background'),\n autoRotateSpeed: autoRotateSpeedParam ? parseFloat(autoRotateSpeedParam) : null,\n offsetX: offsetXParam ? parseFloat(offsetXParam) : null,\n offsetY: offsetYParam ? parseFloat(offsetYParam) : null,\n offsetZ: offsetZParam ? parseFloat(offsetZParam) : null,\n wheelZoom: wheelZoomParam ? parseFloat(wheelZoomParam) : null,\n wheelPrecision: wheelPrecisionParam ? parseFloat(wheelPrecisionParam) : null,\n wheelStart: wheelStartParam ? parseFloat(wheelStartParam) : null,\n zoom: parseZoom(params.get('zoom')),\n bodyShape:\n bodyShapeParam === 'female' || bodyShapeParam === BodyShape.FEMALE\n ? BodyShape.FEMALE\n : bodyShapeParam === 'male' || bodyShapeParam === BodyShape.MALE\n ? BodyShape.MALE\n : null,\n urns: params.getAll('urn'),\n urls: params.getAll('url'),\n base64s: params.getAll('base64'),\n profile: params.get('profile'),\n disableBackground: params.has('disableBackground') || transparentBackground,\n disableAutoCenter: params.has('disableAutoCenter') || !centerBoundingBox,\n disableAutoRotate: params.has('disableAutoRotate') || !centerBoundingBox,\n disableFace: params.has('disableFace'),\n disableDefaultWearables: params.has('disableDefaultWearables'),\n env: Object.values(PreviewEnv)\n .filter((value): value is PreviewEnv => typeof value === 'string')\n .reduce((selected, value) => (value === params.get('env') ? value : selected), PreviewEnv.PROD),\n }\n return options\n }, [search])\n\n // apply overrides\n const overrides = useOverrides()\n const optionsWithOverrides = useMemo(\n () => ({\n ...options,\n ...overrides,\n }),\n [options, overrides]\n )\n\n // return options with overrides applied (if any)\n return optionsWithOverrides\n}\n","import equal from 'deep-equal'\nimport { PreviewMessagePayload, PreviewMessageType, PreviewOptions } from '@dcl/schemas'\nimport { useMessage } from './useMessage'\nimport { useState } from 'react'\n\nexport const useOverrides = () => {\n const [overrides, setOverrides] = useState<PreviewOptions>({})\n\n // receive message from parent window to update options\n useMessage((event) => {\n if (\n event.data &&\n event.data.type === PreviewMessageType.UPDATE &&\n typeof event.data.payload === 'object' &&\n typeof event.data.payload.options === 'object'\n ) {\n const { options } = event.data.payload as PreviewMessagePayload<PreviewMessageType.UPDATE>\n if (!equal(overrides, options)) {\n setOverrides(options)\n }\n }\n })\n\n return overrides\n}\n","import { createConfig } from '../lib/config'\nimport { useAsync } from './useAsync'\nimport { useOptions } from './useOptions'\n\nexport function useConfig() {\n const options = useOptions()\n const [config, isLoading, error] = useAsync('useConfig', () => createConfig(options), [options])\n return [config, isLoading, error] as const\n}\n","import { useRef } from 'react'\nimport { IPreviewController, PreviewMessageType, sendMessage } from '@dcl/schemas'\nimport { useMessage } from './useMessage'\n\nfunction sendResult(id: string, result: any) {\n sendMessage(window.parent, PreviewMessageType.CONTROLLER_RESPONSE, { id, ok: true, result })\n}\n\nfunction sendError(id: string, error: string) {\n sendMessage(window.parent, PreviewMessageType.CONTROLLER_RESPONSE, { id, ok: false, error })\n}\n\nexport const useController = () => {\n const controllerRef = useRef<IPreviewController | undefined>()\n\n useMessage(async (event: MessageEvent) => {\n if (\n event.data &&\n event.data.type === PreviewMessageType.CONTROLLER_REQUEST &&\n typeof event.data.payload === 'object' &&\n typeof event.data.payload.id === 'string' &&\n typeof event.data.payload.namespace === 'string' &&\n typeof event.data.payload.method === 'string' &&\n typeof event.data.payload.params === 'object' &&\n Array.isArray(event.data.payload.params)\n ) {\n const { id, method, namespace, params } = event.data.payload as {\n id: string\n namespace: string\n method: string\n params: any[]\n }\n if (controllerRef.current) {\n if (namespace in controllerRef.current) {\n if (method in controllerRef.current[namespace as keyof IPreviewController]) {\n try {\n const controller = controllerRef.current[namespace as keyof IPreviewController] as any\n const fn = controller[method] as Function\n const result = await fn.apply(null, params)\n sendResult(id, result)\n } catch (error: any) {\n sendError(id, error.message)\n }\n } else {\n sendError(id, 'Invalid method')\n }\n } else {\n sendError(id, 'Invalid namespace')\n }\n } else {\n sendError(id, 'Controller not ready')\n }\n }\n })\n\n return controllerRef\n}\n","import { WearableCategory, WearableDefinition } from '@dcl/schemas'\nimport { getRepresentationOrDefault, isTexture } from '../representation'\nimport { Asset } from './scene'\n\nexport function isCategory(category: WearableCategory) {\n return (wearable: WearableDefinition) => wearable.data.category === category\n}\n\nexport function isHidden(category: WearableCategory) {\n return (asset: Asset) => {\n return (\n asset.wearable.data.category === category ||\n (asset.wearable.data.hides || []).includes(category) ||\n (asset.wearable.data.replaces || []).includes(category)\n )\n }\n}\n\nexport function isSuccesful(result: void | Asset): result is Asset {\n return !!result\n}\n\nexport function isModel(wearable: WearableDefinition): boolean {\n const representation = getRepresentationOrDefault(wearable)\n return !isTexture(representation)\n}\n\nexport function isFacialFeature(wearable: WearableDefinition): boolean {\n return !isModel(wearable)\n}\n","import { WearableCategory } from '@dcl/schemas'\nimport { Asset } from './scene'\nimport { isHidden } from './utils'\n\nexport function getBodyShape(assets: Asset[]) {\n const bodyShape = assets.find((part) => part.wearable.data.category === WearableCategory.BODY_SHAPE)\n if (!bodyShape) {\n return null\n }\n\n // hide base body parts if necessary\n const hasSkin = assets.some((part) => part.wearable.data.category === WearableCategory.SKIN)\n const hideUpperBody = hasSkin || assets.some(isHidden(WearableCategory.UPPER_BODY))\n const hideLowerBody = hasSkin || assets.some(isHidden(WearableCategory.LOWER_BODY))\n const hideFeet = hasSkin || assets.some(isHidden(WearableCategory.FEET))\n const hideHead = hasSkin || assets.some(isHidden(WearableCategory.HEAD))\n\n for (const mesh of bodyShape.container.meshes) {\n const name = mesh.name.toLowerCase()\n if (name.endsWith('ubody_basemesh') && hideUpperBody) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('lbody_basemesh') && hideLowerBody) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('feet_basemesh') && hideFeet) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('head') && hideHead) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('head_basemesh') && hideHead) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('mask_eyes') && hideHead) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('mask_eyebrows') && hideHead) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('mask_mouth') && hideHead) {\n mesh.setEnabled(false)\n }\n }\n\n return bodyShape\n}\n","import { PreviewConfig, WearableCategory, WearableDefinition } from '@dcl/schemas'\nimport { hasRepresentation } from '../representation'\nimport { isEmote } from '../emote'\n\nconst categoriesHiddenBySkin = [\n WearableCategory.HELMET,\n WearableCategory.HAIR,\n WearableCategory.FACIAL_HAIR,\n WearableCategory.MOUTH,\n WearableCategory.EYEBROWS,\n WearableCategory.EYES,\n WearableCategory.UPPER_BODY,\n WearableCategory.LOWER_BODY,\n WearableCategory.FEET,\n]\n\nexport function getSlots(config: PreviewConfig) {\n const slots = new Map<WearableCategory, WearableDefinition>()\n\n let wearables: WearableDefinition[] = config.wearables.filter((wearable) => !isEmote(wearable)) // remove emotes if any\n\n // remove other wearables that hide the equipped wearable\n if (config.wearable && !isEmote(config.wearable)) {\n wearables = config.wearables.filter((wearable) => {\n if (config.wearable) {\n const { category, hides, replaces } = config.wearable.data\n if (wearable.data.category === 'skin') {\n if (categoriesHiddenBySkin.includes(category)) {\n return false\n }\n if (hides && hides.includes(WearableCategory.HEAD)) {\n return false\n }\n if (replaces && replaces.includes(WearableCategory.HEAD)) {\n return false\n }\n }\n if (wearable.data.hides && wearable.data.hides.includes(category)) {\n return false\n }\n if (wearable.data.replaces && wearable.data.replaces.includes(category)) {\n return false\n }\n }\n return true\n })\n // add the equipped wearable at the end\n wearables.push(config.wearable)\n }\n\n // arrange wearbles in slots\n for (const wearable of wearables) {\n const slot = wearable.data.category\n if (hasRepresentation(wearable, config.bodyShape)) {\n slots.set(slot, wearable)\n }\n }\n let hasSkin = false\n // grab only the wearables that ended up in the map, and process in reverse order (last wearables can hide/replace the first ones)\n wearables = wearables.filter((wearable) => slots.get(wearable.data.category) === wearable).reverse()\n const alreadyRemoved = new Set<string>()\n for (const wearable of wearables) {\n const category = wearable.data.category\n if (alreadyRemoved.has(category)) {\n continue\n }\n const replaced = wearable.data.replaces || []\n const hidden = wearable.data.hides || []\n const toRemove = Array.from(new Set([...replaced, ...hidden]))\n for (const slot of toRemove) {\n if (slot !== category) {\n slots.delete(slot)\n alreadyRemoved.add(slot)\n }\n }\n if (wearable.data.category === WearableCategory.SKIN) {\n hasSkin = true\n }\n }\n // skins hide all the following slots\n if (hasSkin) {\n for (const category of categoriesHiddenBySkin) {\n slots.delete(category)\n }\n }\n\n return slots\n}\n","import { ArcRotateCamera } from '@babylonjs/core'\nimport { PreviewConfig } from '@dcl/schemas'\n\nexport function startAutoRotateBehavior(camera: ArcRotateCamera, config: PreviewConfig) {\n if (camera) {\n camera.useAutoRotationBehavior = true\n if (camera.autoRotationBehavior) {\n camera.autoRotationBehavior.idleRotationSpeed = config.autoRotateSpeed\n }\n }\n}\n","export function isIOs() {\n return ['iPad Simulator', 'iPhone Simulator', 'iPod Simulator', 'iPad', 'iPhone', 'iPod'].includes(navigator.platform)\n}\n","import { Camera, Engine, Scene, Tools } from '@babylonjs/core'\nimport { ISceneController } from '@dcl/schemas'\n\n// These are textures created by the preview itself so we don't count them\nconst ignoreTextureList = [\n // Ambient color\n 'data:EnvironmentBRDFTexture0',\n // Glow layer\n 'GlowLayerBlurRTT',\n 'GlowLayerBlurRTT2',\n 'HighlightLayerMainRTT',\n]\n\nexport function createSceneController(engine: Engine, scene: Scene, camera: Camera): ISceneController {\n async function getScreenshot(width: number, height: number) {\n return Tools.CreateScreenshotUsingRenderTargetAsync(engine, camera, { width, height }, undefined, undefined, true)\n }\n\n async function getMetrics() {\n const triangles = scene.meshes.reduce((total, mesh) => {\n return total + Math.floor(mesh.getTotalIndices() / 3)\n }, 0)\n const materials = scene.materials.length\n const meshes = scene.meshes.length\n const textures = scene.textures.filter(\n (texture) => texture.name && !ignoreTextureList.includes(texture.name)\n ).length\n\n return {\n triangles,\n materials,\n meshes,\n textures,\n bodies: meshes,\n entities: 1,\n }\n }\n\n return {\n getScreenshot,\n getMetrics,\n }\n}\n","import {\n ArcRotateCamera,\n AssetContainer,\n BoundingInfo,\n Camera,\n Color3,\n Color4,\n DirectionalLight,\n Engine,\n GlowLayer,\n HemisphericLight,\n Mesh,\n Scene,\n SceneLoader,\n SpotLight,\n Texture,\n TextureAssetTask,\n Vector3,\n} from '@babylonjs/core'\nimport '@babylonjs/loaders'\nimport {\n BodyShape,\n ISceneController,\n PreviewCamera,\n PreviewConfig,\n PreviewType,\n WearableDefinition,\n} from '@dcl/schemas'\nimport { hexToColor } from '../color'\nimport { isIOs } from '../env'\nimport { getRepresentation } from '../representation'\nimport { createSceneController } from '../scene'\nimport { startAutoRotateBehavior } from './camera'\n\n// needed for debugging\nconst showInspector = process.env.REACT_APP_DEBUG\nif (showInspector) {\n require('@babylonjs/inspector')\n}\n\nexport type Asset = {\n container: AssetContainer\n wearable: WearableDefinition\n}\n\n/**\n * It refreshes the bounding info of a mesh, taking into account all of its children\n * @param parent\n */\nfunction refreshBoundingInfo(parent: Mesh) {\n const children = parent.getChildren().filter((mesh) => mesh.id !== '__root__')\n if (children.length > 0) {\n const child = children[0] as Mesh\n // child.showBoundingBox = true\n let boundingInfo = child.getBoundingInfo()\n\n let min = boundingInfo.boundingBox.minimumWorld.add(child.position)\n let max = boundingInfo.boundingBox.maximumWorld.add(child.position)\n\n for (let i = 1; i < children.length; i++) {\n const child = children[i] as Mesh\n // child.showBoundingBox = true\n boundingInfo = child.getBoundingInfo()\n const siblingMin = boundingInfo.boundingBox.minimumWorld.add(child.position)\n const siblingMax = boundingInfo.boundingBox.maximumWorld.add(child.position)\n\n min = Vector3.Minimize(min, siblingMin)\n max = Vector3.Maximize(max, siblingMax)\n }\n\n parent.setBoundingInfo(new BoundingInfo(min, max))\n }\n}\n\n/**\n * Creates a Scene with the right camera, light and effects\n * @param canvas\n * @param zoom\n * @returns\n */\nlet engine: Engine\nexport async function createScene(\n canvas: HTMLCanvasElement,\n config: PreviewConfig\n): Promise<[Scene, ISceneController]> {\n // Create engine\n if (engine) {\n engine.dispose()\n }\n engine = new Engine(canvas, true, {\n preserveDrawingBuffer: true,\n stencil: true,\n antialias: true,\n })\n\n // Setup scene\n const root = new Scene(engine)\n root.autoClear = true\n root.clearColor = config.background.transparent\n ? new Color4(0, 0, 0, 0)\n : hexToColor(config.background.color).toColor4()\n root.ambientColor = new Color3(1, 1, 1)\n root.preventDefaultOnPointerDown = false\n\n // Setup Camera\n const camera = new ArcRotateCamera('camera', 0, 0, 0, new Vector3(0, 0, 0), root)\n camera.mode = Camera.PERSPECTIVE_CAMERA\n switch (config.type) {\n case PreviewType.WEARABLE: {\n startAutoRotateBehavior(camera, config)\n camera.position = new Vector3(-2, 2, 2)\n break\n }\n case PreviewType.AVATAR: {\n camera.position = new Vector3(0, 1, 3.5)\n break\n }\n }\n if (config.camera === PreviewCamera.INTERACTIVE) {\n camera.attachControl(canvas, true)\n }\n\n const offset = new Vector3(config.offsetX, config.offsetY, config.offsetZ)\n camera.position.addInPlace(offset)\n camera.setTarget(offset)\n\n // compute camera radius\n camera.lowerRadiusLimit = camera.radius / config.zoom\n camera.upperRadiusLimit = camera.lowerRadiusLimit * config.wheelZoom\n camera.radius =\n camera.lowerRadiusLimit + ((camera.upperRadiusLimit - camera.lowerRadiusLimit) * config.wheelStart) / 100\n camera.wheelPrecision = config.wheelPrecision\n\n // Setup lights\n if (config.type === PreviewType.WEARABLE) {\n const directional = new DirectionalLight('directional', new Vector3(0, 0, 1), root)\n directional.intensity = 1\n const spot = new SpotLight('spot', new Vector3(-2, 2, 2), new Vector3(2, -2, -2), Math.PI / 2, 1000, root)\n spot.intensity = 1\n }\n const top = new HemisphericLight('top', new Vector3(0, -1, 0), root)\n top.intensity = 1.0\n const bottom = new HemisphericLight('bottom', new Vector3(0, 1, 0), root)\n bottom.intensity = 1.0\n\n // Setup effects\n // Avoid ios since the glow effect breaks on safari: https://github.com/decentraland/wearable-preview/issues/11\n if (!isIOs()) {\n const glowLayer = new GlowLayer('glow', root)\n glowLayer.intensity = 2.0\n }\n\n // Render loop\n engine.runRenderLoop(() => {\n root.render()\n })\n\n // Dev tools\n if (showInspector) {\n root.debugLayer.show({ showExplorer: true, embedMode: true })\n }\n\n return [root, createSceneController(engine, root, camera)]\n}\n\nexport async function loadMask(\n scene: Scene,\n wearable: WearableDefinition,\n bodyShape: BodyShape\n): Promise<Texture | null> {\n const name = wearable.id\n const representation = getRepresentation(wearable, bodyShape)\n const file = representation.contents.find((file) => file.key.toLowerCase().endsWith('_mask.png'))\n if (file) {\n return new Promise((resolve, reject) => {\n const task = new TextureAssetTask(name, file.url, true, false)\n task.onError = () => reject(task.errorObject)\n task.onSuccess = () => {\n resolve(task.texture)\n }\n task.run(scene, () => resolve(task.texture), reject)\n })\n }\n return null\n}\n\nexport async function loadTexture(\n scene: Scene,\n wearable: WearableDefinition,\n bodyShape: BodyShape\n): Promise<Texture | null> {\n const name = wearable.id\n const representation = getRepresentation(wearable, bodyShape)\n const file = representation.contents.find(\n (file) => file.key.toLowerCase().endsWith('.png') && !file.key.toLowerCase().endsWith('_mask.png')\n )\n if (file) {\n return new Promise((resolve, reject) => {\n const task = new TextureAssetTask(name, file.url, true, false)\n task.onError = () => reject(task.errorObject)\n task.onSuccess = () => {\n resolve(task.texture)\n }\n task.run(scene, () => resolve(task.texture), reject)\n })\n }\n return null\n}\n\nexport async function loadAssetContainer(scene: Scene, url: string) {\n const load = async (url: string, extension: string) =>\n SceneLoader.LoadAssetContainerAsync(url, '', scene, null, extension)\n // try with GLB, if it fails try with GLTF\n try {\n return await load(url, '.glb')\n } catch (error) {\n return await load(url, '.gltf')\n }\n}\n\n/**\n * Center and resizes a Scene to fit in the camera view\n * @param scene\n */\n\nexport function center(scene: Scene) {\n // Setup parent\n const parent = new Mesh('parent', scene)\n for (const mesh of scene.meshes) {\n if (mesh !== parent) {\n mesh.setParent(parent)\n }\n }\n\n // resize and center\n refreshBoundingInfo(parent)\n const bounds = parent.getBoundingInfo().boundingBox.extendSize\n const size = bounds.length()\n const scale = new Vector3(1 / size, 1 / size, 1 / size)\n parent.scaling = scale\n const center = parent.getBoundingInfo().boundingBox.center.multiply(scale)\n parent.position.subtractInPlace(center)\n}\n","import { AnimationGroup, ArcRotateCamera, AssetContainer, Scene, TransformNode } from '@babylonjs/core'\nimport { IEmoteController, PreviewCamera, PreviewConfig, PreviewEmote, WearableDefinition } from '@dcl/schemas'\nimport { isEmote } from '../emote'\nimport { getRepresentation } from '../representation'\nimport { startAutoRotateBehavior } from './camera'\nimport { Asset, loadAssetContainer } from './scene'\n\nconst loopedEmotes = [PreviewEmote.IDLE, PreviewEmote.MONEY, PreviewEmote.CLAP]\n\nfunction isLooped(emote: PreviewEmote) {\n return loopedEmotes.includes(emote)\n}\n\nexport function buildEmoteUrl(emote: PreviewEmote) {\n let baseUrl = process.env.PUBLIC_URL || ''\n if (!baseUrl.endsWith('/')) {\n baseUrl += '/'\n }\n const path = `./emotes/${emote}.glb`\n const url = baseUrl.startsWith('http') ? new URL(path, baseUrl).href : path\n return url\n}\n\nexport async function loadEmoteFromUrl(scene: Scene, url: string) {\n const container = await loadAssetContainer(scene, url)\n if (container.animationGroups.length === 0) {\n throw new Error(`No animation groups found for emote with url=${url}`)\n }\n return container\n}\n\nexport async function loadEmoteFromWearable(scene: Scene, wearable: WearableDefinition, config: PreviewConfig) {\n const representation = getRepresentation(wearable, config.bodyShape)\n const content = representation.contents.find((content) => content.key === representation.mainFile)\n if (!content) {\n throw new Error(\n `Could not find a valid content in representation for wearable=${wearable.id} and bodyShape=${config.bodyShape}`\n )\n }\n return loadEmoteFromUrl(scene, content.url)\n}\n\nexport async function playEmote(scene: Scene, assets: Asset[], config: PreviewConfig) {\n // load asset container for emote\n let container: AssetContainer | undefined\n let loop = isLooped(config.emote)\n // if target wearable is emote, play that one\n if (config.wearable && isEmote(config.wearable)) {\n try {\n container = await loadEmoteFromWearable(scene, config.wearable, config)\n loop = !!config.wearable.emoteDataV0?.loop\n } catch (error) {\n console.warn(`Could not load emote=${config.wearable.id}`)\n }\n } else if (config.wearables.some(isEmote)) {\n // if there's some emote in the wearables list, play the last one\n const emote = config.wearables.reverse().find(isEmote)!\n container = await loadEmoteFromWearable(scene, emote, config)\n loop = !!emote.emoteDataV0?.loop\n }\n if (!container) {\n const emoteUrl = buildEmoteUrl(config.emote)\n container = await loadEmoteFromUrl(scene, emoteUrl)\n }\n\n const emoteAnimationGroup = new AnimationGroup('emote', scene)\n\n // start camera rotation after animation ends\n function onAnimationEnd() {\n if (config.camera !== PreviewCamera.STATIC) {\n const camera = scene.cameras[0] as ArcRotateCamera\n startAutoRotateBehavior(camera, config)\n }\n if (loop) {\n emoteAnimationGroup.play(true) // keep playing animation in loop\n }\n }\n\n // play emote animation\n try {\n for (const asset of assets) {\n // store all the transform nodes in a map, there can be repeated node ids\n // if a wearable has multiple representations, so for each id we keep an array of nodes\n const nodes = asset.container.transformNodes.reduce((map, node) => {\n const list = map.get(node.id) || []\n list.push(node)\n return map.set(node.id, list)\n }, new Map<string, TransformNode[]>())\n // apply each targeted animation from the emote asset container to the transform nodes of all the wearables\n if (container.animationGroups.length > 0) {\n for (const targetedAnimation of container.animationGroups[0].targetedAnimations) {\n const animation = targetedAnimation.animation\n const target = targetedAnimation.target as TransformNode\n const newTargets = nodes.get(target.id)\n if (newTargets && newTargets.length > 0) {\n for (const newTarget of newTargets) {\n emoteAnimationGroup.addTargetedAnimation(animation, newTarget)\n }\n }\n }\n } else {\n throw new Error(`No animationGroups found`)\n }\n }\n // play animation group and apply\n emoteAnimationGroup.onAnimationGroupEndObservable.addOnce(onAnimationEnd)\n const controller = createController(emoteAnimationGroup, loop)\n\n if (config.camera === PreviewCamera.STATIC) {\n controller.stop() // we call the stop here to freeze the animation at frame 0, otherwise the avatar would be on T-pose\n } else {\n controller.play()\n }\n\n return controller\n } catch (error) {\n console.warn(`Could not play emote=${config.emote}`, error)\n }\n}\n\nfunction createController(animationGroup: AnimationGroup, loop: boolean): IEmoteController {\n let startFrom = 0\n let hasPlayed = false\n\n async function getLength() {\n return animationGroup.to\n }\n\n async function isPlaying() {\n return animationGroup.isPlaying\n }\n\n async function goTo(seconds: number) {\n if (await isPlaying()) {\n animationGroup.pause()\n goTo(seconds)\n window.requestAnimationFrame(play)\n } else {\n // for some reason the start() method doesn't work as expected if playing, so I need to stop it first\n animationGroup.stop()\n // I had to use this hack because the native goToFrame would not work as expected :/\n animationGroup.start(false, 1, seconds, seconds, false)\n startFrom = seconds\n }\n }\n\n async function play() {\n if (!(await isPlaying())) {\n if (startFrom) {\n animationGroup.start(loop, 1, startFrom, await getLength(), false)\n startFrom = 0\n } else {\n animationGroup.play(loop)\n }\n hasPlayed = true\n }\n }\n\n async function pause() {\n if (await isPlaying()) {\n animationGroup.pause()\n }\n }\n\n async function stop() {\n if (hasPlayed) {\n goTo(0)\n window.requestAnimationFrame(pause)\n } else {\n play()\n window.requestAnimationFrame(stop)\n }\n }\n\n return {\n getLength,\n isPlaying,\n goTo,\n play,\n pause,\n stop,\n }\n}\n","import { AbstractMesh, Color3, Orientation, PBRMaterial, Scene, StandardMaterial, Texture } from '@babylonjs/core'\nimport { PreviewConfig, BodyShape, WearableCategory, WearableDefinition } from '@dcl/schemas'\nimport { hexToColor } from '../color'\nimport { Asset, loadMask, loadTexture } from './scene'\nimport { isCategory } from './utils'\n\nfunction getCategoryLoader(scene: Scene, features: WearableDefinition[], bodyShape: BodyShape) {\n return async (category: WearableCategory) => {\n const feature = features.find(isCategory(category))\n if (feature) {\n return Promise.all([loadTexture(scene, feature, bodyShape), loadMask(scene, feature, bodyShape)]) as Promise<\n [Texture | null, Texture | null]\n >\n }\n return [null, null] as [null, null]\n }\n}\n\nexport async function getFacialFeatures(scene: Scene, features: WearableDefinition[], bodyShape: BodyShape) {\n const loadCategory = getCategoryLoader(scene, features, bodyShape)\n const [eyes, eyebrows, mouth] = await Promise.all([\n loadCategory(WearableCategory.EYES),\n loadCategory(WearableCategory.EYEBROWS),\n loadCategory(WearableCategory.MOUTH),\n ])\n return { eyes, eyebrows, mouth }\n}\n\nexport async function applyFacialFeatures(\n scene: Scene,\n bodyShape: Asset,\n eyes: [Texture | null, Texture | null],\n eyebrows: [Texture | null, Texture | null],\n mouth: [Texture | null, Texture | null],\n config: PreviewConfig\n) {\n for (const mesh of bodyShape.container.meshes) {\n if (mesh.name.toLowerCase().endsWith('mask_eyes')) {\n const [texture, mask] = eyes\n if (texture) {\n applyTextureAndMask(scene, 'eyes', mesh, texture, config.eyes, mask, '#ffffff')\n } else {\n mesh.setEnabled(false)\n }\n }\n if (mesh.name.toLowerCase().endsWith('mask_eyebrows')) {\n const [texture, mask] = eyebrows\n if (texture) {\n applyTextureAndMask(scene, 'eyebrows', mesh, texture, config.hair, mask, config.hair)\n } else {\n mesh.setEnabled(false)\n }\n }\n if (mesh.name.toLowerCase().endsWith('mask_mouth')) {\n const [texture, mask] = mouth\n if (texture) {\n applyTextureAndMask(scene, 'mouth', mesh, texture, config.skin, mask, config.skin)\n } else {\n mesh.setEnabled(false)\n }\n }\n }\n}\n\nfunction applyTextureAndMask(\n scene: Scene,\n name: string,\n mesh: AbstractMesh,\n texture: Texture,\n color: string,\n mask: Texture | null,\n maskColor: string\n) {\n const newMaterial = new StandardMaterial(`${name}_standard_material`, scene)\n newMaterial.alphaMode = PBRMaterial.PBRMATERIAL_ALPHABLEND\n newMaterial.backFaceCulling = true\n newMaterial.specularColor = Color3.Black()\n texture.hasAlpha = true\n newMaterial.sideOrientation = Orientation.CW\n newMaterial.diffuseTexture = texture\n newMaterial.diffuseColor = mask ? Color3.Black() : hexToColor(maskColor)\n if (mask) {\n newMaterial.emissiveTexture = mask\n newMaterial.diffuseColor = hexToColor(color)\n }\n mesh.material = newMaterial\n}\n","import { SceneLoader } from '@babylonjs/core'\nimport { GLTFFileLoader } from '@babylonjs/loaders'\nimport { PreviewConfig, BodyShape, WearableDefinition } from '@dcl/schemas'\nimport { getRepresentation } from '../representation'\n\nexport function createMappings(wearables: WearableDefinition[], bodyShape = BodyShape.MALE) {\n const mappings: Record<string, string> = {}\n for (const wearable of wearables) {\n try {\n const representation = getRepresentation(wearable, bodyShape)\n for (const file of representation.contents) {\n mappings[file.key] = file.url\n }\n } catch (error) {\n console.warn(\n `Skipping generation of mappings for wearable=\"${wearable.id}\" since it lacks a representation for bodyShape=\"${bodyShape}\"`\n )\n continue\n }\n }\n return mappings\n}\n\n/**\n * Configures the mappings for all the relative paths within a model to the right IPFS in the catalyst\n * @param wearables\n */\nexport function setupMappings(config: PreviewConfig) {\n const wearables = config.wearable ? [config.wearable, ...config.wearables] : config.wearables\n const mappings = createMappings(wearables, config.bodyShape)\n SceneLoader.OnPluginActivatedObservable.add((plugin) => {\n if (plugin.name === 'gltf') {\n const gltf = plugin as GLTFFileLoader\n gltf.preprocessUrlAsync = async (url: string) => {\n const baseUrl = `/content/contents/`\n const parts = url.split(baseUrl)\n return parts.length > 0 && !!parts[1] ? mappings[parts[1]] : url\n }\n }\n })\n}\n","import { Effect } from '@babylonjs/core'\n\nconst needle = `#include<pbrBlockFinalColorComposition>`\nconst injection = `#include<customToonShading>`\n\nif (Effect.ShadersStore['pbrPixelShader'].includes(needle)) {\n if (!Effect.ShadersStore['pbrPixelShader'].includes(injection)) {\n Effect.ShadersStore['pbrPixelShader'] = Effect.ShadersStore['pbrPixelShader'].replace(\n needle,\n needle + '\\n' + injection + '\\n'\n )\n }\n} else {\n throw new Error('could not patch the pbrPixelShader')\n}\n\n// Monkey-patch the shaders with the corrected version for Decentraland\n// eslint-disable-next-line\nEffect.IncludesShadersStore['customToonShading'] = require('!!raw-loader!./new-pbr.hlsl').default\n","/**\n * Loads a wearable into the Scene, using a given a body shape, skin and hair color\n * @param scene\n * @param wearable\n * @param bodyShape\n * @param skin\n * @param hair\n */\n\nimport { Color3, PBRMaterial, Scene } from '@babylonjs/core'\nimport { WearableDefinition, BodyShape } from '@dcl/schemas'\nimport { getRepresentation, isTexture, getContentUrl } from '../representation'\nimport { loadAssetContainer } from './scene'\nimport './toon'\n\nexport async function loadWearable(\n scene: Scene,\n wearable: WearableDefinition,\n bodyShape = BodyShape.MALE,\n skin?: string,\n hair?: string\n) {\n const representation = getRepresentation(wearable, bodyShape)\n if (isTexture(representation)) {\n throw new Error(`The wearable=\"${wearable.id}\" is a texture`)\n }\n const url = getContentUrl(representation)\n const container = await loadAssetContainer(scene, url)\n\n // Clean up\n for (const originalMaterial of container.materials) {\n if (originalMaterial instanceof PBRMaterial) {\n const newMaterial = originalMaterial as PBRMaterial\n\n // remove metallic effect\n newMaterial.specularIntensity = 0\n if (newMaterial.metallic) {\n newMaterial.metallic = 0\n newMaterial.metallicF0Factor = 0\n }\n\n if (newMaterial.name.toLowerCase().includes('hair')) {\n if (hair) {\n newMaterial.albedoColor = Color3.FromHexString(hair).toLinearSpace()\n newMaterial.specularIntensity = 0\n newMaterial.alpha = 1\n } else {\n newMaterial.alpha = 0\n scene.removeMaterial(newMaterial)\n }\n }\n if (newMaterial.name.toLowerCase().includes('skin')) {\n if (skin) {\n newMaterial.albedoColor = Color3.FromHexString(skin).toLinearSpace()\n newMaterial.specularIntensity = 0\n newMaterial.alpha = 1\n } else {\n newMaterial.alpha = 0\n scene.removeMaterial(newMaterial)\n }\n }\n }\n }\n\n // Stop any animations\n for (const animationGroup of container.animationGroups) {\n animationGroup.stop()\n animationGroup.reset()\n animationGroup.dispose()\n }\n\n return { container, wearable }\n}\n","import { Color4 } from '@babylonjs/core'\nimport { PreviewConfig, PreviewType, BodyShape, IPreviewController, IEmoteController } from '@dcl/schemas'\nimport { getBodyShape } from './body'\nimport { getSlots } from './slots'\nimport { playEmote } from './emote'\nimport { applyFacialFeatures, getFacialFeatures } from './face'\nimport { setupMappings } from './mappings'\nimport { Asset, center, createScene } from './scene'\nimport { isFacialFeature, isModel, isSuccesful } from './utils'\nimport { loadWearable } from './wearable'\nimport { createInvalidEmoteController } from '../emote'\n\n/**\n * Initializes Babylon, creates the scene and loads a list of wearables in it\n * @param canvas\n * @param wearables\n * @param options\n */\nexport async function render(canvas: HTMLCanvasElement, config: PreviewConfig): Promise<IPreviewController> {\n // create the root scene\n const [scene, sceneController] = await createScene(canvas, config)\n try {\n // setup the mappings for all the contents\n setupMappings(config)\n\n // emote controller\n let emoteController: IEmoteController\n\n // load all the wearables into the root scene\n const promises: Promise<void | Asset>[] = []\n\n if (config.type === PreviewType.AVATAR) {\n // get slots\n const slots = getSlots(config)\n\n // get wearables\n const wearables = Array.from(slots.values())\n\n for (const wearable of wearables.filter(isModel)) {\n const promise = loadWearable(scene, wearable, config.bodyShape, config.skin, config.hair).catch((error) => {\n console.warn(error.message)\n })\n promises.push(promise)\n }\n const assets = (await Promise.all(promises)).filter(isSuccesful)\n\n // add all assets to scene\n for (const asset of assets) {\n asset.container.addAllToScene()\n }\n\n // build avatar\n const bodyShape = getBodyShape(assets)\n if (bodyShape) {\n // apply facial features\n const features = wearables.filter(isFacialFeature)\n const { eyes, eyebrows, mouth } = await getFacialFeatures(scene, features, config.bodyShape)\n applyFacialFeatures(scene, bodyShape, eyes, eyebrows, mouth, config)\n }\n\n // play emote\n emoteController = (await playEmote(scene, assets, config)) || createInvalidEmoteController() // default to invalid emote controller if there is an issue with the emote, but let the rest of the preview keep working\n } else {\n const wearable = config.wearable\n if (wearable) {\n try {\n // try loading with the required body shape\n const asset = await loadWearable(scene, wearable, config.bodyShape, config.skin, config.hair)\n asset.container.addAllToScene()\n } catch (error) {\n // default to other body shape if failed\n const asset = await loadWearable(\n scene,\n wearable,\n config.bodyShape === BodyShape.MALE ? BodyShape.FEMALE : BodyShape.MALE,\n config.skin,\n config.hair\n )\n asset.container.addAllToScene()\n }\n }\n\n // can't use emote controller if PreviewType is not \"avatar\"\n emoteController = createInvalidEmoteController()\n }\n\n // center the root scene into the camera\n if (config.centerBoundingBox) {\n center(scene)\n }\n\n // return preview controller\n const controller: IPreviewController = {\n scene: sceneController,\n emote: emoteController,\n }\n return controller\n } catch (error) {\n // remove background on error\n scene.clearColor = new Color4(0, 0, 0, 0)\n throw error\n }\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport classNames from 'classnames'\nimport { PreviewCamera, PreviewType, PreviewMessageType, sendMessage } from '@dcl/schemas'\nimport { useWindowSize } from '../../hooks/useWindowSize'\nimport { useConfig } from '../../hooks/useConfig'\nimport { useReady } from '../../hooks/useReady'\nimport { useController } from '../../hooks/useController'\nimport { render } from '../../lib/babylon/render'\nimport './Preview.css'\n\nconst Preview: React.FC = () => {\n const [previewError, setPreviewError] = useState('')\n const { width, height } = useWindowSize()\n const [style, setStyle] = useState<React.CSSProperties>({})\n const [isDragging, setIsDragging] = useState(false)\n const [isLoadingModel, setIsLoadingModel] = useState(true)\n const [isLoaded, setIsLoaded] = useState(false)\n const canvasRef = useRef<HTMLCanvasElement>(null)\n const controller = useController()\n const [config, isLoadingConfig, configError] = useConfig()\n const [image, setImage] = useState('')\n const [is3D, setIs3D] = useState(true)\n const [isMessageSent, setIsMessageSent] = useState(false)\n\n const error = previewError || configError\n const isLoading = (isLoadingModel || isLoadingConfig) && !error\n const showImage = !!image && !is3D && !isLoading\n const showCanvas = is3D && !isLoading\n\n useEffect(() => {\n if (canvasRef.current && config) {\n let style: React.CSSProperties = { opacity: 1 } // fade in effect\n\n // set background image\n if (config.background.image) {\n setImage(config.background.image)\n style.opacity = 1\n // if rendering a texture, babylon won't render the background, so we do it by css\n if (!config.background.transparent && config.type === PreviewType.TEXTURE) {\n style.backgroundColor = config.background.color\n }\n }\n\n setStyle(style)\n\n // load model or image (for texture only wearables)\n if (config.type === PreviewType.TEXTURE) {\n setIs3D(false)\n setIsLoadingModel(false)\n setIsLoaded(true)\n } else {\n // preview models\n render(canvasRef.current, config)\n .then((_controller) => (controller.current = _controller))\n .catch((error) => setPreviewError(error.message))\n .finally(() => {\n setIsLoadingModel(false)\n setIsLoaded(true)\n })\n }\n }\n }, [canvasRef.current, config]) // eslint-disable-line\n\n // send a mesasge to the parent window when loaded or error occurs\n useEffect(() => {\n if (!isMessageSent) {\n if (isLoaded) {\n sendMessage(window.parent, PreviewMessageType.LOAD, null)\n setIsMessageSent(true)\n } else if (error) {\n sendMessage(window.parent, PreviewMessageType.ERROR, { message: error })\n setIsMessageSent(true)\n }\n }\n }, [isLoaded, error, isMessageSent])\n\n // when the config is being loaded again (because the was an update to some of the options) reset all the other loading flags\n useEffect(() => {\n if (isLoadingConfig) {\n let shouldResetIsLoaded = false\n if (!isLoadingModel) {\n setIsLoadingModel(true)\n shouldResetIsLoaded = true\n }\n if (isMessageSent) {\n setIsMessageSent(false)\n shouldResetIsLoaded = true\n }\n if (shouldResetIsLoaded && isLoaded) {\n setIsLoaded(false)\n }\n }\n }, [isLoadingConfig, isLoadingModel, isMessageSent, isLoaded])\n\n // send ready message to parent\n useReady()\n\n return (\n <div\n className={classNames('Preview', {\n 'is-dragging': isDragging,\n 'is-loading': isLoading,\n 'is-loaded': isLoaded,\n 'is-3d': is3D && config?.camera === PreviewCamera.INTERACTIVE,\n 'has-error': !!error,\n })}\n style={style}\n >\n <img\n src={image}\n className={classNames('thumbnail', {\n 'is-visible': showImage,\n })}\n alt=\"preview\"\n />\n <canvas\n id=\"wearable-preview\"\n className={classNames({\n 'is-visible': showCanvas,\n })}\n width={width}\n height={height}\n ref={canvasRef}\n onMouseDown={() => setIsDragging(is3D && !error)}\n onMouseUp={() => setIsDragging(false)}\n ></canvas>\n {error && <div className=\"error\">{error}</div>}\n </div>\n )\n}\n\nexport default React.memo(Preview)\n","import { useState, useEffect } from 'react'\n\n// Define general type for useWindowSize hook, which includes width and height\ninterface Size {\n width: number | undefined\n height: number | undefined\n}\n\nexport function useWindowSize(): Size {\n // Initialize state with undefined width/height so server and client renders match\n // Learn more here: https://joshwcomeau.com/react/the-perils-of-rehydration/\n const [windowSize, setWindowSize] = useState<Size>({\n width: undefined,\n height: undefined,\n })\n useEffect(() => {\n // Handler to call on window resize\n function handleResize() {\n // Set window width/height to state\n setWindowSize({\n width: window.innerWidth,\n height: window.innerHeight,\n })\n }\n // Add event listener\n window.addEventListener('resize', handleResize)\n // Call handler right away so state gets updated with initial window size\n handleResize()\n // Remove event listener on cleanup\n return () => window.removeEventListener('resize', handleResize)\n }, []) // Empty array ensures that effect is only run on mount\n return windowSize\n}\n","import { PreviewMessageType, sendMessage } from '@dcl/schemas'\nimport { useEffect, useState } from 'react'\n\nexport const useReady = () => {\n const [isReady, setIsReady] = useState(false)\n useEffect(() => {\n if (!isReady) {\n sendMessage(window.parent, PreviewMessageType.READY, null)\n setIsReady(true)\n }\n }, [isReady])\n}\n","import React from 'react'\nimport ReactDOM from 'react-dom'\nimport './index.css'\nimport { Preview } from './components/Preview'\n\nReactDOM.render(\n <React.StrictMode>\n <Preview />\n </React.StrictMode>,\n document.getElementById('root')\n)\n"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ !function(e){function r(r){for(var n,a,u=r[0],i=r[1],c=r[2],f=0,s=[];f<u.length;f++)a=u[f],Object.prototype.hasOwnProperty.call(o,a)&&o[a]&&s.push(o[a][0]),o[a]=0;for(n in i)Object.prototype.hasOwnProperty.call(i,n)&&(e[n]=i[n]);for(p&&p(r);s.length;)s.shift()();return l.push.apply(l,c||[]),t()}function t(){for(var e,r=0;r<l.length;r++){for(var t=l[r],n=!0,u=1;u<t.length;u++){var i=t[u];0!==o[i]&&(n=!1)}n&&(l.splice(r--,1),e=a(a.s=t[0]))}return e}var n={},o={1:0},l=[];function a(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,a),t.l=!0,t.exports}a.m=e,a.c=n,a.d=function(e,r,t){a.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},a.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.t=function(e,r){if(1&r&&(e=a(e)),8&r)return e;if(4&r&&"object"===typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(a.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)a.d(t,n,function(r){return e[r]}.bind(null,n));return t},a.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(r,"a",r),r},a.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},a.p="https://cdn.decentraland.org/@dcl/wearable-preview/1.1.1-2625749587.commit-a84645b/";var u=this["webpackJsonp@dcl/wearable-preview"]=this["webpackJsonp@dcl/wearable-preview"]||[],i=u.push.bind(u);u.push=r,u=u.slice();for(var c=0;c<u.length;c++)r(u[c]);var p=i;t()}([]);
2
+ //# sourceMappingURL=runtime-main.03bb0c13.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../webpack/bootstrap"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","this","oldJsonpFunction","slice"],"mappings":"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","file":"static/js/runtime-main.8384a02d.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t1: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"https://cdn.decentraland.org/@dcl/wearable-preview/1.1.0/\";\n\n \tvar jsonpArray = this[\"webpackJsonp@dcl/wearable-preview\"] = this[\"webpackJsonp@dcl/wearable-preview\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// run deferred modules from other chunks\n \tcheckDeferredModules();\n"],"sourceRoot":""}
1
+ {"version":3,"sources":["../webpack/bootstrap"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","this","oldJsonpFunction","slice"],"mappings":"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","file":"static/js/runtime-main.03bb0c13.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t1: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"https://cdn.decentraland.org/@dcl/wearable-preview/1.1.1-2625749587.commit-a84645b/\";\n\n \tvar jsonpArray = this[\"webpackJsonp@dcl/wearable-preview\"] = this[\"webpackJsonp@dcl/wearable-preview\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// run deferred modules from other chunks\n \tcheckDeferredModules();\n"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- (this["webpackJsonp@dcl/wearable-preview"]=this["webpackJsonp@dcl/wearable-preview"]||[]).push([[0],{348:function(e,t,n){},516:function(e,t){},522:function(e,t,n){"use strict";n.r(t),t.default="float angleY = 3.14 / 2.0;\n\nmat3 rotateY = mat3(\n cos(angleY), 0, sin(angleY),\n 0, 1, 0,\n -sin(angleY), 0, cos(angleY)\n);\n\n// view angle DOT normal of the position\nvec3 tray = normalize(viewDirectionW * rotateY);\nvec3 rayDirection = normalize(tray-vPositionW);\nfloat t=(dot(normalW,rayDirection) + 1.0) / 2.0;\n\nfloat ToonThresholds[3];\nToonThresholds[0] = 0.90;\nToonThresholds[1] = 0.80;\nToonThresholds[2] = 0.20;\n\nfloat ToonBrightnessLevels[4];\nToonBrightnessLevels[0] = 1.2;\nToonBrightnessLevels[1] = 1.0;\nToonBrightnessLevels[2] = 1.0;\nToonBrightnessLevels[3] = 0.8;\n\nif (t > ToonThresholds[0])\n{\n finalColor.rgb *= ToonBrightnessLevels[0];\n}\nelse if (t > ToonThresholds[1])\n{\n finalColor.rgb *= ToonBrightnessLevels[1];\n}\nelse if (t > ToonThresholds[2])\n{\n finalColor.rgb *= ToonBrightnessLevels[2];\n}\nelse\n{\n finalColor.rgb *= ToonBrightnessLevels[3];\n}\n"},523:function(e,t,n){},527:function(e,t,n){"use strict";n.r(t);var r=n(51),a=n.n(r),o=n(339),c=n.n(o),i=(n(348),n(58)),s=n(257),u=n.n(s),l=n(20);var f,d=n(71),p=n(111),b=n(28),h=n.n(b),w=n(112),v=n(38),y=n(188),m=n(254),g=n(168);function O(e){return E.apply(this,arguments)}function E(){return(E=Object(v.a)(h.a.mark((function e(t){return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",new Promise((function(e){return setTimeout(e,t)})));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function x(e){return k.apply(this,arguments)}function k(){return k=Object(v.a)(h.a.mark((function e(t){var n,r,a=arguments;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=a.length>1&&void 0!==a[1]?a[1]:3,e.prev=1,e.next=4,fetch(t);case 4:if((r=e.sent).ok){e.next=11;break}return e.t0=Error,e.next=9,r.text();case 9:throw e.t1=e.sent,new e.t0(e.t1);case 11:return e.abrupt("return",r.json());case 14:if(e.prev=14,e.t2=e.catch(1),!(n>0)){e.next=22;break}return e.next=19,O(100);case 19:return e.abrupt("return",x(t,n-1));case 22:throw e.t2;case 23:case"end":return e.stop()}}),e,null,[[1,14]])}))),k.apply(this,arguments)}var j,S=(f={},Object(g.a)(f,l.PreviewEnv.DEV,"https://nft-api.decentraland.io"),Object(g.a)(f,l.PreviewEnv.PROD,"https://nft-api.decentraland.org"),f),C=function(){function e(){Object(y.a)(this,e)}return Object(m.a)(e,[{key:"fetchItem",value:function(){var e=Object(v.a)(h.a.mark((function e(t,n,r){var a,o;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,x("".concat(S[r],"/v1/items?contractAddress=").concat(t,"&itemId=").concat(n));case 2:if(a=e.sent,0!==(o=a.data).length){e.next=6;break}throw new Error('Item not found for contractAddress="'.concat(t,'" itemId="').concat(n,'"'));case 6:return e.abrupt("return",o[0]);case 7:case"end":return e.stop()}}),e)})));return function(t,n,r){return e.apply(this,arguments)}}()},{key:"fetchNFT",value:function(){var e=Object(v.a)(h.a.mark((function e(t,n,r){var a,o;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,x("".concat(S[r],"/v1/nfts?contractAddress=").concat(t,"&tokenId=").concat(n));case 2:if(a=e.sent,0!==(o=a.data).length){e.next=6;break}throw new Error('NFT not found for contractAddress="'.concat(t,'" tokenId="').concat(n,'"'));case 6:return e.abrupt("return",o[0].nft);case 7:case"end":return e.stop()}}),e)})));return function(t,n,r){return e.apply(this,arguments)}}()}]),e}(),T=new C,A=(j={},Object(g.a)(j,l.PreviewEnv.DEV,"https://peer.decentraland.zone"),Object(g.a)(j,l.PreviewEnv.PROD,"https://peer.decentraland.org"),j),P=function(){function e(){Object(y.a)(this,e)}return Object(m.a)(e,[{key:"fetchWearables",value:function(){var e=Object(v.a)(h.a.mark((function e(t,n){var r,a;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(0!==t.length){e.next=2;break}return e.abrupt("return",[]);case 2:return e.next=4,x("".concat(A[n],"/lambdas/collections/wearables?").concat(t.map((function(e){return"wearableId=".concat(e)})).join("&")));case 4:if(r=e.sent,0!==(a=r.wearables).length){e.next=8;break}throw new Error('Wearables not found for urns="'.concat(t,'"'));case 8:return e.abrupt("return",a);case 9:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}()},{key:"fetchProfile",value:function(){var e=Object(v.a)(h.a.mark((function e(t,n){var r;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,x("".concat(A[n],"/lambdas/profiles?id=").concat(t));case 2:return r=e.sent,e.abrupt("return",r.length>0?r[0]:null);case 4:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}()}]),e}(),B=new P;var R=n(37);function L(e){return e.startsWith("#")?e:"#"+e}function W(e){return("0"+(255*e|0).toString(16)).slice(-2)}function M(e){return W(e.r)+W(e.g)+W(e.b)}function _(e){var t=function(e){return e.startsWith("#")?e.slice(1):e}(e);return new R.Color3(parseInt(t.slice(0,2),16)/256,parseInt(t.slice(2,4),16)/256,parseInt(t.slice(4,6),16)/256)}var I=n(340),D=n(342),F=n(343);function Y(e){return"emoteDataV0"in e}var N=function(e){Object(I.a)(n,e);var t=Object(D.a)(n);function n(){return Object(y.a)(this,n),t.call(this,"Invalid emote")}return n}(Object(F.a)(Error));function U(){return{getLength:function(){throw new N},isPlaying:function(){throw new N},goTo:function(){throw new N},play:function(){throw new N},pause:function(){throw new N},stop:function(){throw new N}}}function V(e,t){return e.bodyShapes.includes(t)}function H(e){return V(e,l.BodyShape.MALE)}function z(e){return V(e,l.BodyShape.FEMALE)}function G(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.BodyShape.MALE;switch(t){case l.BodyShape.FEMALE:if(!e.data.representations.some(z))throw new Error('Could not find a BaseFemale representation for wearable="'.concat(e.id,'"'));return e.data.representations.find(z);case l.BodyShape.MALE:if(!e.data.representations.some(H))throw new Error('Could not find a BaseMale representation for wearable="'.concat(e.id,'"'));return e.data.representations.find(H)}}function Z(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.BodyShape.MALE;if(X(e,t))return G(e,t);if(e.data.representations.length>0)return e.data.representations[0];throw new Error('The wearable="'.concat(e.id,'" has no representation'))}function X(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.BodyShape.MALE;try{return G(e,t),!0}catch(n){return!1}}function q(e){var t=e.contents.find((function(t){return t.key===e.mainFile}));if(!t)throw new Error("Could not find main file");return t.url}function K(e){return e.mainFile.endsWith("png")}function J(e,t){return e.find((function(e){return e.data.category===t}))||null}function Q(){return[l.WearableCategory.EYEBROWS,l.WearableCategory.MOUTH,l.WearableCategory.EYES]}function $(){return[l.WearableCategory.HAIR,l.WearableCategory.UPPER_BODY,l.WearableCategory.LOWER_BODY,l.WearableCategory.FEET]}function ee(){return[l.WearableCategory.EYEBROWS,l.WearableCategory.MOUTH,l.WearableCategory.EYES,l.WearableCategory.HAIR,l.WearableCategory.UPPER_BODY,l.WearableCategory.LOWER_BODY,l.WearableCategory.FEET]}function te(e,t){switch(e){case l.WearableCategory.EYEBROWS:return t===l.BodyShape.MALE?"urn:decentraland:off-chain:base-avatars:eyebrows_00":"urn:decentraland:off-chain:base-avatars:f_eyebrows_00";case l.WearableCategory.MOUTH:return t===l.BodyShape.MALE?"urn:decentraland:off-chain:base-avatars:mouth_00":"urn:decentraland:off-chain:base-avatars:f_mouth_00";case l.WearableCategory.EYES:return t===l.BodyShape.MALE?"urn:decentraland:off-chain:base-avatars:eyes_00":"urn:decentraland:off-chain:base-avatars:f_eyes_00";case l.WearableCategory.HAIR:return t===l.BodyShape.MALE?"urn:decentraland:off-chain:base-avatars:casual_hair_01":"urn:decentraland:off-chain:base-avatars:standard_hair";case l.WearableCategory.UPPER_BODY:return t===l.BodyShape.MALE?"urn:decentraland:off-chain:base-avatars:green_hoodie":"urn:decentraland:off-chain:base-avatars:f_sweater";case l.WearableCategory.LOWER_BODY:return t===l.BodyShape.MALE?"urn:decentraland:off-chain:base-avatars:brown_pants":"urn:decentraland:off-chain:base-avatars:f_jeans";case l.WearableCategory.FEET:return t===l.BodyShape.MALE?"urn:decentraland:off-chain:base-avatars:sneakers":"urn:decentraland:off-chain:base-avatars:bun_shoes";default:throw new Error('There is no default wearable for category="'.concat(e,'"'))}}function ne(e){return!!e}function re(e){var t=[l.BodyShape.MALE,l.BodyShape.FEMALE];return t.find((function(t){return e.data.representations.some((function(e){return e.bodyShapes.includes(t)}))}))||t[0]}function ae(e){var t=e?parseFloat(e):null;return null===t||isNaN(t)?null:1.8*Math.min(Math.max(t,0),100)/100+1}function oe(e){switch(null===e||void 0===e?void 0:e.data.category){case l.WearableCategory.UPPER_BODY:return 2;case l.WearableCategory.SKIN:return 1.75;default:return 1.25}}var ce="default";function ie(e,t){return se.apply(this,arguments)}function se(){return(se=Object(v.a)(h.a.mark((function e(t,n){var r;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,de([t],n);case 2:if(1===(r=e.sent).length){e.next=5;break}throw new Error('Could not find wearable for urn="'.concat(t,'"'));case 5:return e.abrupt("return",r[0]);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ue(e){return JSON.parse(atob(e))}function le(e,t){return fe.apply(this,arguments)}function fe(){return(fe=Object(v.a)(h.a.mark((function e(t,n){var r;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t){e.next=2;break}return e.abrupt("return",[]);case 2:return e.next=4,de(t.avatar.wearables,n);case 4:return r=e.sent,e.abrupt("return",r.filter((function(e){return!Y(e)})));case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function de(e,t){return pe.apply(this,arguments)}function pe(){return(pe=Object(v.a)(h.a.mark((function e(t,n){return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(0!==t.length){e.next=2;break}return e.abrupt("return",[]);case 2:return e.abrupt("return",B.fetchWearables(t,n));case 3:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function be(e){return he.apply(this,arguments)}function he(){return(he=Object(v.a)(h.a.mark((function e(t){var n,r;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(0!==t.length){e.next=2;break}return e.abrupt("return",[]);case 2:return n=t.map((function(e){return fetch(e).then((function(e){return e.json()})).catch()})),e.next=5,Promise.all(n);case 5:return r=e.sent,e.abrupt("return",r.filter(ne));case 7:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var we=function(){var e={};return{memo:function(){var t=Object(v.a)(h.a.mark((function t(n,r){var a,o,c,i=arguments;return h.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(!(n in e)){for(a=i.length,o=new Array(a>2?a-2:0),c=2;c<a;c++)o[c-2]=i[c];e[n]=r.apply(void 0,o)}return t.abrupt("return",e[n]);case 3:case"end":return t.stop()}}),t)})));return function(e,n){return t.apply(this,arguments)}}(),reset:function(){for(var t in e)delete e[t]}}}();function ve(e,t){return ye.apply(this,arguments)}function ye(){return(ye=Object(v.a)(h.a.mark((function e(t,n){return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",we.memo(t,Object(v.a)(h.a.mark((function e(){var r;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t!==ce){e.next=2;break}return e.abrupt("return",null);case 2:return e.next=4,B.fetchProfile(t,n).then((function(e){return e&&e.avatars.length>0?e.avatars[0]:null})).catch((function(e){return console.log('Failed to load profile="'.concat(t,'"'),e)}));case 4:return r=e.sent,e.abrupt("return",r||null);case 6:case"end":return e.stop()}}),e)})))));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function me(e){return ge.apply(this,arguments)}function ge(){return(ge=Object(v.a)(h.a.mark((function e(t){var n,r,a,o,c,i,s;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=t.contractAddress,r=t.itemId,a=t.tokenId,o=t.env,r||a){e.next=3;break}throw new Error("You need to provide an itemId or a tokenId");case 3:if(c=o===l.PreviewEnv.PROD?"matic":"mumbai",i="urn:decentraland:".concat(c,":collections-v2:").concat(n,":").concat(r),r||a){e.next=9;break}throw new Error("You must provide either tokenId or itemId");case 9:if(r||!a){e.next=14;break}return e.next=12,T.fetchNFT(n,a,o);case 12:s=e.sent,i=s.network!==l.Network.ETHEREUM?"urn:decentraland:".concat(c,":collections-v2:").concat(n,":").concat(s.itemId):s.image.split("contents/")[1].split("/thumbnail")[0];case 14:return e.abrupt("return",ie(i,o));case 15:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Oe(e,t,n,r,a,o,c,i){return Ee.apply(this,arguments)}function Ee(){return(Ee=Object(v.a)(h.a.mark((function e(t,n,r,a,o,c,i,s){var u,l,f,b,w,v,y,m;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.t0=[],e.t1=p.a,e.next=4,le(t,s);case 4:return e.t2=e.sent,e.t3=(0,e.t1)(e.t2),e.t4=p.a,e.next=9,de([o].concat(Object(p.a)(n)),s);case 9:return e.t5=e.sent,e.t6=(0,e.t4)(e.t5),e.t7=p.a,e.next=14,be(r);case 14:e.t8=e.sent,e.t9=(0,e.t7)(e.t8),e.t10=Object(p.a)(a.map(ue)),u=(u=e.t0.concat.call(e.t0,e.t3,e.t6,e.t9,e.t10)).filter((function(e){return X(e,o)})),l=[],f=c&&i?ee():c?$():i?Q():[],b=Object(d.a)(f),e.prev=22,b.s();case 24:if((w=b.n()).done){e.next=36;break}if(v=w.value,J(u,v)){e.next=34;break}if(!(y=te(v,o))){e.next=33;break}l.push(y),e.next=34;break;case 33:throw new Error('Could not get default URN for category="'.concat(v,'"'));case 34:e.next=24;break;case 36:e.next=41;break;case 38:e.prev=38,e.t11=e.catch(22),b.e(e.t11);case 41:return e.prev=41,b.f(),e.finish(41);case 44:if(!(l.length>0)){e.next=49;break}return e.next=47,de(l,s);case 47:m=e.sent,u=[].concat(Object(p.a)(u),Object(p.a)(m));case 49:return e.abrupt("return",u);case 50:case"end":return e.stop()}}),e,null,[[22,38,41,44]])})))).apply(this,arguments)}function xe(){return xe=Object(v.a)(h.a.mark((function e(){var t,n,r,a,o,c,s,u,f,d,b,v,y,m,g,O,E,x,k,j,S,C,T,A,P,B,R,W,_,I,D=arguments;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=D.length>0&&void 0!==D[0]?D[0]:{},n=t.contractAddress,r=t.tokenId,a=t.itemId,o=t.env||l.PreviewEnv.PROD,c=Promise.resolve(),n&&(c=me({contractAddress:n,tokenId:r,itemId:a,env:o})),s=t.profile?ve(t.profile,o):Promise.resolve(null),e.next=8,Promise.all([c,s]);case 8:if(u=e.sent,f=Object(i.a)(u,2),d=f[0],b=f[1],v=t.bodyShape||b&&b.avatar.bodyShape||(d?re(d):l.BodyShape.MALE),y=L(t.skin||b&&M(b.avatar.skin.color)||"cc9b76"),m=L(t.hair||b&&M(b.avatar.hair.color)||"000000"),g=L(t.eyes||b&&M(b.avatar.eyes.color)||"000000"),O=Object(p.a)(t.urns||[]),E=t.urls||[],x=t.base64s||[],k=[],j=1.75,S=l.PreviewType.WEARABLE,C={color:"#4b4852",transparent:!0===t.disableBackground},!(O.length>0||E.length>0||x.length>0||d&&Y(d)||t.profile)){e.next=28;break}return S=l.PreviewType.AVATAR,e.next=27,Oe(b,O,E,x,v,!t.disableDefaultWearables,!t.disableFace,o);case 27:k=e.sent;case 28:return d&&(j=k.length>0?j:oe(d),K(Z(d))&&S!==l.PreviewType.AVATAR&&(S=l.PreviewType.TEXTURE),C=Object(w.a)(Object(w.a)({},C),{},{image:d.thumbnail}),Object(l.isStandard)(d)&&(T=l.Rarity.getColor(d.rarity),C=Object(w.a)(Object(w.a)({},C),{},{image:d.thumbnail,color:T}))),A=l.PreviewEmote.IDLE,t.emote&&Object.values(l.PreviewEmote).includes(t.emote)&&(A=t.emote),P=l.PreviewCamera.INTERACTIVE,t.camera&&Object.values(l.PreviewCamera).includes(t.camera)&&(P=t.camera),B="number"!==typeof t.autoRotateSpeed||isNaN(t.autoRotateSpeed)?.2:t.autoRotateSpeed,R=!t.disableAutoCenter,W=1,_=100,I=50,ke(t.wheelZoom)&&(W=Math.max(t.wheelZoom,1)),ke(t.wheelPrecision)&&(_=Math.max(t.wheelPrecision,1)),ke(t.wheelStart)&&(I=100-Math.min(Math.max(t.wheelStart,0),100)),t.background&&(C.color=t.background),e.abrupt("return",{wearable:null!==d&&void 0!==d?d:t.blob?je(t.blob):void 0,wearables:k,bodyShape:v,skin:y,hair:m,eyes:g,type:S,background:C,face:!1!==t.disableFace,emote:A,camera:P,autoRotateSpeed:t.disableAutoRotate?0:B,centerBoundingBox:R,offsetX:t.offsetX||0,offsetY:t.offsetY||0,offsetZ:t.offsetZ||0,zoom:"number"===typeof t.zoom?t.zoom/35:j,wheelZoom:W,wheelPrecision:_,wheelStart:I});case 43:case"end":return e.stop()}}),e)}))),xe.apply(this,arguments)}function ke(e){return"number"===typeof e&&!isNaN(e)}function je(e){return Object(w.a)(Object(w.a)({},e),{},{data:Object(w.a)(Object(w.a)({},e.data),{},{representations:e.data.representations.map((function(e){return Object(w.a)(Object(w.a)({},e),{},{contents:e.contents.map((function(e){return{key:e.key,url:URL.createObjectURL(e.blob)}}))})}))})})}var Se={};function Ce(e,t){return t===Se[e]}var Te=n(341),Ae=n.n(Te),Pe=function(e){var t=Object(r.useCallback)(e,[]);Object(r.useEffect)((function(){function e(e){t(e)}return window.addEventListener("message",e),function(){window.removeEventListener("message",e)}}),[t])},Be=function(){var e=Object(r.useState)(window.location.search.toString()),t=Object(i.a)(e,1)[0],n=Object(r.useMemo)((function(){var e=new URLSearchParams(t),n=e.get("autoRotateSpeed"),r=e.get("offsetX"),a=e.get("offsetY"),o=e.get("offsetZ"),c=e.get("wheelZoom"),i=e.get("wheelPrecision"),s=e.get("wheelStart"),u=e.get("bodyShape"),f=e.has("transparentBackground");f&&console.warn('Deprecated: you are using the query param "transparentBackground" that has been deprecated in favor of "disableBackground". Please switch to the new query param since in the future this will not be supported.');var d="false"!==e.get("centerBoundingBox");return f&&console.warn('Deprecated: you are using the query param "transparentBackground" that has been deprecated in favor of "disableBackground". Please switch to the new query param since in the future this will not be supported.'),{contractAddress:e.get("contract"),tokenId:e.get("token"),itemId:e.get("item"),skin:e.get("skin"),hair:e.get("hair"),eyes:e.get("eyes"),emote:e.get("emote"),camera:e.get("camera"),background:e.get("background"),autoRotateSpeed:n?parseFloat(n):null,offsetX:r?parseFloat(r):null,offsetY:a?parseFloat(a):null,offsetZ:o?parseFloat(o):null,wheelZoom:c?parseFloat(c):null,wheelPrecision:i?parseFloat(i):null,wheelStart:s?parseFloat(s):null,zoom:ae(e.get("zoom")),bodyShape:"female"===u||u===l.BodyShape.FEMALE?l.BodyShape.FEMALE:"male"===u||u===l.BodyShape.MALE?l.BodyShape.MALE:null,urns:e.getAll("urn"),urls:e.getAll("url"),base64s:e.getAll("base64"),profile:e.get("profile"),disableBackground:e.has("disableBackground")||f,disableAutoCenter:e.has("disableAutoCenter")||!d,disableAutoRotate:e.has("disableAutoRotate")||!d,disableFace:e.has("disableFace"),disableDefaultWearables:e.has("disableDefaultWearables"),env:Object.values(l.PreviewEnv).filter((function(e){return"string"===typeof e})).reduce((function(t,n){return n===e.get("env")?n:t}),l.PreviewEnv.PROD)}}),[t]),a=function(){var e=Object(r.useState)({}),t=Object(i.a)(e,2),n=t[0],a=t[1];return Pe((function(e){if(e.data&&e.data.type===l.PreviewMessageType.UPDATE&&"object"===typeof e.data.payload&&"object"===typeof e.data.payload.options){var t=e.data.payload.options;Ae()(n,t)||a(t)}})),n}();return Object(r.useMemo)((function(){return Object(w.a)(Object(w.a)({},n),a)}),[n,a])};function Re(){var e=Be(),t=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],a=Object(r.useState)(!1),o=Object(i.a)(a,2),c=o[0],s=o[1],u=Object(r.useState)(null),l=Object(i.a)(u,2),f=l[0],d=l[1],p=Object(r.useState)(""),b=Object(i.a)(p,2),h=b[0],w=b[1];return"undefined"===typeof Se[e]&&(Se[e]=0),Object(r.useEffect)((function(){var n=++Se[e];s(!0),t().then((function(t){Ce(e,n)&&d(t)})).catch((function(t){Ce(e,n)&&w(t.message)})).finally((function(){Ce(e,n)&&s(!1)}))}),n),[f,c,h]}("useConfig",(function(){return function(){return xe.apply(this,arguments)}(e)}),[e]),n=Object(i.a)(t,3);return[n[0],n[1],n[2]]}function Le(e,t){Object(l.sendMessage)(window.parent,l.PreviewMessageType.CONTROLLER_RESPONSE,{id:e,ok:!0,result:t})}function We(e,t){Object(l.sendMessage)(window.parent,l.PreviewMessageType.CONTROLLER_RESPONSE,{id:e,ok:!1,error:t})}function Me(e){return function(t){return t.data.category===e}}function _e(e){return function(t){return t.wearable.data.category===e||(t.wearable.data.hides||[]).includes(e)||(t.wearable.data.replaces||[]).includes(e)}}function Ie(e){return!!e}function De(e){return!K(Z(e))}function Fe(e){return!De(e)}function Ye(e){var t=e.find((function(e){return e.wearable.data.category===l.WearableCategory.BODY_SHAPE}));if(!t)return null;var n,r=e.some((function(e){return e.wearable.data.category===l.WearableCategory.SKIN})),a=r||e.some(_e(l.WearableCategory.UPPER_BODY)),o=r||e.some(_e(l.WearableCategory.LOWER_BODY)),c=r||e.some(_e(l.WearableCategory.FEET)),i=r||e.some(_e(l.WearableCategory.HEAD)),s=Object(d.a)(t.container.meshes);try{for(s.s();!(n=s.n()).done;){var u=n.value,f=u.name.toLowerCase();f.endsWith("ubody_basemesh")&&a&&u.setEnabled(!1),f.endsWith("lbody_basemesh")&&o&&u.setEnabled(!1),f.endsWith("feet_basemesh")&&c&&u.setEnabled(!1),f.endsWith("head")&&i&&u.setEnabled(!1),f.endsWith("head_basemesh")&&i&&u.setEnabled(!1),f.endsWith("mask_eyes")&&i&&u.setEnabled(!1),f.endsWith("mask_eyebrows")&&i&&u.setEnabled(!1),f.endsWith("mask_mouth")&&i&&u.setEnabled(!1)}}catch(p){s.e(p)}finally{s.f()}return t}var Ne=[l.WearableCategory.HELMET,l.WearableCategory.HAIR,l.WearableCategory.FACIAL_HAIR,l.WearableCategory.MOUTH,l.WearableCategory.EYEBROWS,l.WearableCategory.EYES,l.WearableCategory.UPPER_BODY,l.WearableCategory.LOWER_BODY,l.WearableCategory.FEET];function Ue(e){var t=new Map,n=e.wearables.filter((function(e){return!Y(e)}));e.wearable&&!Y(e.wearable)&&(n=e.wearables.filter((function(t){if(e.wearable){var n=e.wearable.data,r=n.category,a=n.hides,o=n.replaces;if("skin"===t.data.category){if(Ne.includes(r))return!1;if(a&&a.includes(l.WearableCategory.HEAD))return!1;if(o&&o.includes(l.WearableCategory.HEAD))return!1}if(t.data.hides&&t.data.hides.includes(r))return!1;if(t.data.replaces&&t.data.replaces.includes(r))return!1}return!0})),n.push(e.wearable));var r,a=Object(d.a)(n);try{for(a.s();!(r=a.n()).done;){var o=r.value,c=o.data.category;X(o,e.bodyShape)&&t.set(c,o)}}catch(j){a.e(j)}finally{a.f()}var i=!1;n=n.filter((function(e){return t.get(e.data.category)===e})).reverse();var s,u=new Set,f=Object(d.a)(n);try{for(f.s();!(s=f.n()).done;){var b=s.value,h=b.data.category;if(!u.has(h)){for(var w=b.data.replaces||[],v=b.data.hides||[],y=Array.from(new Set([].concat(Object(p.a)(w),Object(p.a)(v)))),m=0,g=y;m<g.length;m++){var O=g[m];O!==h&&(t.delete(O),u.add(O))}b.data.category===l.WearableCategory.SKIN&&(i=!0)}}}catch(j){f.e(j)}finally{f.f()}if(i){var E,x=Object(d.a)(Ne);try{for(x.s();!(E=x.n()).done;){var k=E.value;t.delete(k)}}catch(j){x.e(j)}finally{x.f()}}return t}function Ve(e,t){e&&(e.useAutoRotationBehavior=!0,e.autoRotationBehavior&&(e.autoRotationBehavior.idleRotationSpeed=t.autoRotateSpeed))}n(338);function He(){return["iPad Simulator","iPhone Simulator","iPod Simulator","iPad","iPhone","iPod"].includes(navigator.platform)}var ze=["data:EnvironmentBRDFTexture0","GlowLayerBlurRTT","GlowLayerBlurRTT2","HighlightLayerMainRTT"];function Ge(e,t,n){function r(){return(r=Object(v.a)(h.a.mark((function t(r,a){return h.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",R.Tools.CreateScreenshotUsingRenderTargetAsync(e,n,{width:r,height:a},void 0,void 0,!0));case 1:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function a(){return(a=Object(v.a)(h.a.mark((function e(){var n,r,a,o;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.meshes.reduce((function(e,t){return e+Math.floor(t.getTotalIndices()/3)}),0),r=t.materials.length,a=t.meshes.length,o=t.textures.filter((function(e){return e.name&&!ze.includes(e.name)})).length,e.abrupt("return",{triangles:n,materials:r,meshes:a,textures:o,bodies:a,entities:1});case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}return{getScreenshot:function(e,t){return r.apply(this,arguments)},getMetrics:function(){return a.apply(this,arguments)}}}var Ze,Xe=Object({NODE_ENV:"production",PUBLIC_URL:"https://cdn.decentraland.org/@dcl/wearable-preview/1.1.0",WDS_SOCKET_HOST:void 0,WDS_SOCKET_PATH:void 0,WDS_SOCKET_PORT:void 0,FAST_REFRESH:!0,REACT_APP_WEBSITE_VERSION:"1.1.0"}).REACT_APP_DEBUG;function qe(e,t){return Ke.apply(this,arguments)}function Ke(){return(Ke=Object(v.a)(h.a.mark((function e(t,n){var r,a,o;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:Ze&&Ze.dispose(),Ze=new R.Engine(t,!0,{preserveDrawingBuffer:!0,stencil:!0,antialias:!0}),(r=new R.Scene(Ze)).autoClear=!0,r.clearColor=n.background.transparent?new R.Color4(0,0,0,0):_(n.background.color).toColor4(),r.ambientColor=new R.Color3(1,1,1),r.preventDefaultOnPointerDown=!1,(a=new R.ArcRotateCamera("camera",0,0,0,new R.Vector3(0,0,0),r)).mode=R.Camera.PERSPECTIVE_CAMERA,e.t0=n.type,e.next=e.t0===l.PreviewType.WEARABLE?12:e.t0===l.PreviewType.AVATAR?15:17;break;case 12:return Ve(a,n),a.position=new R.Vector3(-2,2,2),e.abrupt("break",17);case 15:return a.position=new R.Vector3(0,1,3.5),e.abrupt("break",17);case 17:return n.camera===l.PreviewCamera.INTERACTIVE&&a.attachControl(t,!0),o=new R.Vector3(n.offsetX,n.offsetY,n.offsetZ),a.position.addInPlace(o),a.setTarget(o),a.lowerRadiusLimit=a.radius/n.zoom,a.upperRadiusLimit=a.lowerRadiusLimit*n.wheelZoom,a.radius=a.lowerRadiusLimit+(a.upperRadiusLimit-a.lowerRadiusLimit)*n.wheelStart/100,a.wheelPrecision=n.wheelPrecision,n.type===l.PreviewType.WEARABLE&&(new R.DirectionalLight("directional",new R.Vector3(0,0,1),r).intensity=1,new R.SpotLight("spot",new R.Vector3(-2,2,2),new R.Vector3(2,-2,-2),Math.PI/2,1e3,r).intensity=1),new R.HemisphericLight("top",new R.Vector3(0,-1,0),r).intensity=1,new R.HemisphericLight("bottom",new R.Vector3(0,1,0),r).intensity=1,He()||(new R.GlowLayer("glow",r).intensity=2),Ze.runRenderLoop((function(){r.render()})),Xe&&r.debugLayer.show({showExplorer:!0,embedMode:!0}),e.abrupt("return",[r,Ge(Ze,r,a)]);case 34:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Je(e,t,n){return Qe.apply(this,arguments)}function Qe(){return(Qe=Object(v.a)(h.a.mark((function e(t,n,r){var a,o,c;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=n.id,o=G(n,r),!(c=o.contents.find((function(e){return e.key.toLowerCase().endsWith("_mask.png")})))){e.next=5;break}return e.abrupt("return",new Promise((function(e,n){var r=new R.TextureAssetTask(a,c.url,!0,!1);r.onError=function(){return n(r.errorObject)},r.onSuccess=function(){e(r.texture)},r.run(t,(function(){return e(r.texture)}),n)})));case 5:return e.abrupt("return",null);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function $e(e,t,n){return et.apply(this,arguments)}function et(){return(et=Object(v.a)(h.a.mark((function e(t,n,r){var a,o,c;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=n.id,o=G(n,r),!(c=o.contents.find((function(e){return e.key.toLowerCase().endsWith(".png")&&!e.key.toLowerCase().endsWith("_mask.png")})))){e.next=5;break}return e.abrupt("return",new Promise((function(e,n){var r=new R.TextureAssetTask(a,c.url,!0,!1);r.onError=function(){return n(r.errorObject)},r.onSuccess=function(){e(r.texture)},r.run(t,(function(){return e(r.texture)}),n)})));case 5:return e.abrupt("return",null);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function tt(e,t){return nt.apply(this,arguments)}function nt(){return nt=Object(v.a)(h.a.mark((function e(t,n){var r;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=function(){var e=Object(v.a)(h.a.mark((function e(n,r){return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",R.SceneLoader.LoadAssetContainerAsync(n,"",t,null,r));case 1:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}(),e.prev=1,e.next=4,r(n,".glb");case 4:case 11:return e.abrupt("return",e.sent);case 7:return e.prev=7,e.t0=e.catch(1),e.next=11,r(n,".gltf");case 12:case"end":return e.stop()}}),e,null,[[1,7]])}))),nt.apply(this,arguments)}function rt(e){var t,n=new R.Mesh("parent",e),r=Object(d.a)(e.meshes);try{for(r.s();!(t=r.n()).done;){var a=t.value;a!==n&&a.setParent(n)}}catch(s){r.e(s)}finally{r.f()}!function(e){var t=e.getChildren().filter((function(e){return"__root__"!==e.id}));if(t.length>0){for(var n=t[0],r=n.getBoundingInfo(),a=r.boundingBox.minimumWorld.add(n.position),o=r.boundingBox.maximumWorld.add(n.position),c=1;c<t.length;c++){var i=t[c],s=(r=i.getBoundingInfo()).boundingBox.minimumWorld.add(i.position),u=r.boundingBox.maximumWorld.add(i.position);a=R.Vector3.Minimize(a,s),o=R.Vector3.Maximize(o,u)}e.setBoundingInfo(new R.BoundingInfo(a,o))}}(n);var o=n.getBoundingInfo().boundingBox.extendSize.length(),c=new R.Vector3(1/o,1/o,1/o);n.scaling=c;var i=n.getBoundingInfo().boundingBox.center.multiply(c);n.position.subtractInPlace(i)}Xe&&n(521);var at=[l.PreviewEmote.IDLE,l.PreviewEmote.MONEY,l.PreviewEmote.CLAP];function ot(e){return at.includes(e)}function ct(e){var t="https://cdn.decentraland.org/@dcl/wearable-preview/1.1.0";t.endsWith("/")||(t+="/");var n="./emotes/".concat(e,".glb");return t.startsWith("http")?new URL(n,t).href:n}function it(e,t){return st.apply(this,arguments)}function st(){return(st=Object(v.a)(h.a.mark((function e(t,n){var r;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,tt(t,n);case 2:if(0!==(r=e.sent).animationGroups.length){e.next=5;break}throw new Error("No animation groups found for emote with url=".concat(n));case 5:return e.abrupt("return",r);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ut(e,t,n){return lt.apply(this,arguments)}function lt(){return(lt=Object(v.a)(h.a.mark((function e(t,n,r){var a,o;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=G(n,r.bodyShape),o=a.contents.find((function(e){return e.key===a.mainFile}))){e.next=4;break}throw new Error("Could not find a valid content in representation for wearable=".concat(n.id," and bodyShape=").concat(r.bodyShape));case 4:return e.abrupt("return",it(t,o.url));case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ft(e,t,n){return dt.apply(this,arguments)}function dt(){return(dt=Object(v.a)(h.a.mark((function e(t,n,r){var a,o,c,i,s,u,f,p,b,w,v,y,m,g,O,E,x,k,j,S,C,T;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(p=function(){r.camera!==l.PreviewCamera.STATIC&&Ve(t.cameras[0],r);o&&f.play(!0)},o=ot(r.emote),!r.wearable||!Y(r.wearable)){e.next=15;break}return e.prev=3,e.next=6,ut(t,r.wearable,r);case 6:a=e.sent,o=!!(null===(c=r.wearable.emoteDataV0)||void 0===c?void 0:c.loop),e.next=13;break;case 10:e.prev=10,e.t0=e.catch(3),console.warn("Could not load emote=".concat(r.wearable.id));case 13:e.next=21;break;case 15:if(!r.wearables.some(Y)){e.next=21;break}return s=r.wearables.reverse().find(Y),e.next=19,ut(t,s,r);case 19:a=e.sent,o=!!(null===(i=s.emoteDataV0)||void 0===i?void 0:i.loop);case 21:if(a){e.next=26;break}return u=ct(r.emote),e.next=25,it(t,u);case 25:a=e.sent;case 26:f=new R.AnimationGroup("emote",t),e.prev=27,b=Object(d.a)(n),e.prev=29,b.s();case 31:if((w=b.n()).done){e.next=42;break}if(v=w.value,y=v.container.transformNodes.reduce((function(e,t){var n=e.get(t.id)||[];return n.push(t),e.set(t.id,n)}),new Map),!(a.animationGroups.length>0)){e.next=39;break}m=Object(d.a)(a.animationGroups[0].targetedAnimations);try{for(m.s();!(g=m.n()).done;)if(O=g.value,E=O.animation,x=O.target,(k=y.get(x.id))&&k.length>0){j=Object(d.a)(k);try{for(j.s();!(S=j.n()).done;)C=S.value,f.addTargetedAnimation(E,C)}catch(h){j.e(h)}finally{j.f()}}}catch(h){m.e(h)}finally{m.f()}e.next=40;break;case 39:throw new Error("No animationGroups found");case 40:e.next=31;break;case 42:e.next=47;break;case 44:e.prev=44,e.t1=e.catch(29),b.e(e.t1);case 47:return e.prev=47,b.f(),e.finish(47);case 50:return f.onAnimationGroupEndObservable.addOnce(p),T=pt(f,o),r.camera===l.PreviewCamera.STATIC?T.stop():T.play(),e.abrupt("return",T);case 56:e.prev=56,e.t2=e.catch(27),console.warn("Could not play emote=".concat(r.emote),e.t2);case 59:case"end":return e.stop()}}),e,null,[[3,10],[27,56],[29,44,47,50]])})))).apply(this,arguments)}function pt(e,t){var n=0,r=!1;function a(){return o.apply(this,arguments)}function o(){return(o=Object(v.a)(h.a.mark((function t(){return h.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",e.to);case 1:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function c(){return i.apply(this,arguments)}function i(){return(i=Object(v.a)(h.a.mark((function t(){return h.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",e.isPlaying);case 1:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function s(e){return u.apply(this,arguments)}function u(){return(u=Object(v.a)(h.a.mark((function t(r){return h.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,c();case 2:if(!t.sent){t.next=8;break}e.pause(),s(r),window.requestAnimationFrame(l),t.next=11;break;case 8:e.stop(),e.start(!1,1,r,r,!1),n=r;case 11:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function l(){return f.apply(this,arguments)}function f(){return(f=Object(v.a)(h.a.mark((function o(){return h.a.wrap((function(o){for(;;)switch(o.prev=o.next){case 0:return o.next=2,c();case 2:if(o.sent){o.next=16;break}if(!n){o.next=14;break}return o.t0=e,o.t1=t,o.t2=n,o.next=9,a();case 9:o.t3=o.sent,o.t0.start.call(o.t0,o.t1,1,o.t2,o.t3,!1),n=0,o.next=15;break;case 14:e.play(t);case 15:r=!0;case 16:case"end":return o.stop()}}),o)})))).apply(this,arguments)}function d(){return p.apply(this,arguments)}function p(){return(p=Object(v.a)(h.a.mark((function t(){return h.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,c();case 2:if(!t.sent){t.next=4;break}e.pause();case 4:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function b(){return w.apply(this,arguments)}function w(){return(w=Object(v.a)(h.a.mark((function e(){return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:r?(s(0),window.requestAnimationFrame(d)):(l(),window.requestAnimationFrame(b));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}return{getLength:a,isPlaying:c,goTo:s,play:l,pause:d,stop:b}}function bt(e,t,n){return function(){var r=Object(v.a)(h.a.mark((function r(a){var o;return h.a.wrap((function(r){for(;;)switch(r.prev=r.next){case 0:if(!(o=t.find(Me(a)))){r.next=3;break}return r.abrupt("return",Promise.all([$e(e,o,n),Je(e,o,n)]));case 3:return r.abrupt("return",[null,null]);case 4:case"end":return r.stop()}}),r)})));return function(e){return r.apply(this,arguments)}}()}function ht(e,t,n){return wt.apply(this,arguments)}function wt(){return(wt=Object(v.a)(h.a.mark((function e(t,n,r){var a,o,c,s,u,f;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=bt(t,n,r),e.next=3,Promise.all([a(l.WearableCategory.EYES),a(l.WearableCategory.EYEBROWS),a(l.WearableCategory.MOUTH)]);case 3:return o=e.sent,c=Object(i.a)(o,3),s=c[0],u=c[1],f=c[2],e.abrupt("return",{eyes:s,eyebrows:u,mouth:f});case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function vt(e,t,n,r,a,o){return yt.apply(this,arguments)}function yt(){return(yt=Object(v.a)(h.a.mark((function e(t,n,r,a,o,c){var s,u,l,f,p,b,w,v,y,m,g,O;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:s=Object(d.a)(n.container.meshes);try{for(s.s();!(u=s.n()).done;)(l=u.value).name.toLowerCase().endsWith("mask_eyes")&&(f=Object(i.a)(r,2),p=f[0],b=f[1],p?mt(t,"eyes",l,p,c.eyes,b,"#ffffff"):l.setEnabled(!1)),l.name.toLowerCase().endsWith("mask_eyebrows")&&(w=Object(i.a)(a,2),v=w[0],y=w[1],v?mt(t,"eyebrows",l,v,c.hair,y,c.hair):l.setEnabled(!1)),l.name.toLowerCase().endsWith("mask_mouth")&&(m=Object(i.a)(o,2),g=m[0],O=m[1],g?mt(t,"mouth",l,g,c.skin,O,c.skin):l.setEnabled(!1))}catch(h){s.e(h)}finally{s.f()}case 2:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function mt(e,t,n,r,a,o,c){var i=new R.StandardMaterial("".concat(t,"_standard_material"),e);i.alphaMode=R.PBRMaterial.PBRMATERIAL_ALPHABLEND,i.backFaceCulling=!0,i.specularColor=R.Color3.Black(),r.hasAlpha=!0,i.sideOrientation=R.Orientation.CW,i.diffuseTexture=r,i.diffuseColor=o?R.Color3.Black():_(c),o&&(i.emissiveTexture=o,i.diffuseColor=_(a)),n.material=i}function gt(e){var t=function(e){var t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.BodyShape.MALE,r={},a=Object(d.a)(e);try{for(a.s();!(t=a.n()).done;){var o=t.value;try{var c,i=G(o,n),s=Object(d.a)(i.contents);try{for(s.s();!(c=s.n()).done;){var u=c.value;r[u.key]=u.url}}catch(f){s.e(f)}finally{s.f()}}catch(p){console.warn('Skipping generation of mappings for wearable="'.concat(o.id,'" since it lacks a representation for bodyShape="').concat(n,'"'));continue}}}catch(f){a.e(f)}finally{a.f()}return r}(e.wearable?[e.wearable].concat(Object(p.a)(e.wearables)):e.wearables,e.bodyShape);R.SceneLoader.OnPluginActivatedObservable.add((function(e){"gltf"===e.name&&(e.preprocessUrlAsync=function(){var e=Object(v.a)(h.a.mark((function e(n){var r;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return"/content/contents/",r=n.split("/content/contents/"),e.abrupt("return",r.length>0&&r[1]?t[r[1]]:n);case 3:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}())}))}var Ot="#include<pbrBlockFinalColorComposition>",Et="#include<customToonShading>";if(!R.Effect.ShadersStore.pbrPixelShader.includes(Ot))throw new Error("could not patch the pbrPixelShader");function xt(e,t){return kt.apply(this,arguments)}function kt(){return kt=Object(v.a)(h.a.mark((function e(t,n){var r,a,o,c,i,s,u,f,p,b,w,v,y,m=arguments;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(r=m.length>2&&void 0!==m[2]?m[2]:l.BodyShape.MALE,a=m.length>3?m[3]:void 0,o=m.length>4?m[4]:void 0,!K(c=G(n,r))){e.next=6;break}throw new Error('The wearable="'.concat(n.id,'" is a texture'));case 6:return i=q(c),e.next=9,tt(t,i);case 9:s=e.sent,u=Object(d.a)(s.materials);try{for(u.s();!(f=u.n()).done;)(p=f.value)instanceof R.PBRMaterial&&((b=p).specularIntensity=0,b.metallic&&(b.metallic=0,b.metallicF0Factor=0),b.name.toLowerCase().includes("hair")&&(o?(b.albedoColor=R.Color3.FromHexString(o).toLinearSpace(),b.specularIntensity=0,b.alpha=1):(b.alpha=0,t.removeMaterial(b))),b.name.toLowerCase().includes("skin")&&(a?(b.albedoColor=R.Color3.FromHexString(a).toLinearSpace(),b.specularIntensity=0,b.alpha=1):(b.alpha=0,t.removeMaterial(b))))}catch(h){u.e(h)}finally{u.f()}w=Object(d.a)(s.animationGroups);try{for(w.s();!(v=w.n()).done;)(y=v.value).stop(),y.reset(),y.dispose()}catch(h){w.e(h)}finally{w.f()}return e.abrupt("return",{container:s,wearable:n});case 15:case"end":return e.stop()}}),e)}))),kt.apply(this,arguments)}function jt(){return(jt=Object(v.a)(h.a.mark((function e(t,n){var r,a,o,c,s,u,f,p,b,w,v,y,m,g,O,E,x,k,j,S,C,T,A;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,qe(t,n);case 2:if(r=e.sent,a=Object(i.a)(r,2),o=a[0],c=a[1],e.prev=6,gt(n),u=[],n.type!==l.PreviewType.AVATAR){e.next=37;break}f=Ue(n),p=Array.from(f.values()),b=Object(d.a)(p.filter(De));try{for(b.s();!(w=b.n()).done;)v=w.value,y=xt(o,v,n.bodyShape,n.skin,n.hair).catch((function(e){console.warn(e.message)})),u.push(y)}catch(h){b.e(h)}finally{b.f()}return e.next=16,Promise.all(u);case 16:m=e.sent.filter(Ie),g=Object(d.a)(m);try{for(g.s();!(O=g.n()).done;)O.value.container.addAllToScene()}catch(h){g.e(h)}finally{g.f()}if(!(E=Ye(m))){e.next=29;break}return x=p.filter(Fe),e.next=24,ht(o,x,n.bodyShape);case 24:k=e.sent,j=k.eyes,S=k.eyebrows,C=k.mouth,vt(o,E,j,S,C,n);case 29:return e.next=31,ft(o,m,n);case 31:if(e.t0=e.sent,e.t0){e.next=34;break}e.t0=U();case 34:s=e.t0,e.next=53;break;case 37:if(!(T=n.wearable)){e.next=52;break}return e.prev=39,e.next=42,xt(o,T,n.bodyShape,n.skin,n.hair);case 42:e.sent.container.addAllToScene(),e.next=52;break;case 46:return e.prev=46,e.t1=e.catch(39),e.next=50,xt(o,T,n.bodyShape===l.BodyShape.MALE?l.BodyShape.FEMALE:l.BodyShape.MALE,n.skin,n.hair);case 50:e.sent.container.addAllToScene();case 52:s=U();case 53:return n.centerBoundingBox&&rt(o),A={scene:c,emote:s},e.abrupt("return",A);case 58:throw e.prev=58,e.t2=e.catch(6),o.clearColor=new R.Color4(0,0,0,0),e.t2;case 62:case"end":return e.stop()}}),e,null,[[6,58],[39,46]])})))).apply(this,arguments)}R.Effect.ShadersStore.pbrPixelShader.includes(Et)||(R.Effect.ShadersStore.pbrPixelShader=R.Effect.ShadersStore.pbrPixelShader.replace(Ot,Ot+"\n"+Et+"\n")),R.Effect.IncludesShadersStore.customToonShading=n(522).default;n(523);var St=n(154),Ct=function(){var e=Object(r.useState)(""),t=Object(i.a)(e,2),n=t[0],a=t[1],o=function(){var e=Object(r.useState)({width:void 0,height:void 0}),t=Object(i.a)(e,2),n=t[0],a=t[1];return Object(r.useEffect)((function(){function e(){a({width:window.innerWidth,height:window.innerHeight})}return window.addEventListener("resize",e),e(),function(){return window.removeEventListener("resize",e)}}),[]),n}(),c=o.width,s=o.height,f=Object(r.useState)({}),d=Object(i.a)(f,2),p=d[0],b=d[1],w=Object(r.useState)(!1),y=Object(i.a)(w,2),m=y[0],g=y[1],O=Object(r.useState)(!0),E=Object(i.a)(O,2),x=E[0],k=E[1],j=Object(r.useState)(!1),S=Object(i.a)(j,2),C=S[0],T=S[1],A=Object(r.useRef)(null),P=function(){var e=Object(r.useRef)();return Pe(function(){var t=Object(v.a)(h.a.mark((function t(n){var r,a,o,c,i,s,u,f;return h.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(!n.data||n.data.type!==l.PreviewMessageType.CONTROLLER_REQUEST||"object"!==typeof n.data.payload||"string"!==typeof n.data.payload.id||"string"!==typeof n.data.payload.namespace||"string"!==typeof n.data.payload.method||"object"!==typeof n.data.payload.params||!Array.isArray(n.data.payload.params)){t.next=26;break}if(r=n.data.payload,a=r.id,o=r.method,c=r.namespace,i=r.params,!e.current){t.next=25;break}if(!(c in e.current)){t.next=22;break}if(!(o in e.current[c])){t.next=19;break}return t.prev=5,s=e.current[c],u=s[o],t.next=10,u.apply(null,i);case 10:f=t.sent,Le(a,f),t.next=17;break;case 14:t.prev=14,t.t0=t.catch(5),We(a,t.t0.message);case 17:t.next=20;break;case 19:We(a,"Invalid method");case 20:t.next=23;break;case 22:We(a,"Invalid namespace");case 23:t.next=26;break;case 25:We(a,"Controller not ready");case 26:case"end":return t.stop()}}),t,null,[[5,14]])})));return function(e){return t.apply(this,arguments)}}()),e}(),B=Re(),R=Object(i.a)(B,3),L=R[0],W=R[1],M=R[2],_=Object(r.useState)(""),I=Object(i.a)(_,2),D=I[0],F=I[1],Y=Object(r.useState)(!0),N=Object(i.a)(Y,2),U=N[0],V=N[1],H=Object(r.useState)(!1),z=Object(i.a)(H,2),G=z[0],Z=z[1],X=n||M,q=(x||W)&&!X,K=!!D&&!U&&!q,J=U&&!q;return Object(r.useEffect)((function(){if(A.current&&L){var e={opacity:1};L.background.image&&(F(L.background.image),e.opacity=1,L.background.transparent||L.type!==l.PreviewType.TEXTURE||(e.backgroundColor=L.background.color)),b(e),L.type===l.PreviewType.TEXTURE?(V(!1),k(!1),T(!0)):function(e,t){return jt.apply(this,arguments)}(A.current,L).then((function(e){return P.current=e})).catch((function(e){return a(e.message)})).finally((function(){k(!1),T(!0)}))}}),[A.current,L]),Object(r.useEffect)((function(){G||(C?(Object(l.sendMessage)(window.parent,l.PreviewMessageType.LOAD,null),Z(!0)):X&&(Object(l.sendMessage)(window.parent,l.PreviewMessageType.ERROR,{message:X}),Z(!0)))}),[C,X,G]),Object(r.useEffect)((function(){if(W){var e=!1;x||(k(!0),e=!0),G&&(Z(!1),e=!0),e&&C&&T(!1)}}),[W,x,G,C]),function(){var e=Object(r.useState)(!1),t=Object(i.a)(e,2),n=t[0],a=t[1];Object(r.useEffect)((function(){n||(Object(l.sendMessage)(window.parent,l.PreviewMessageType.READY,null),a(!0))}),[n])}(),Object(St.jsxs)("div",{className:u()("Preview",{"is-dragging":m,"is-loading":q,"is-loaded":C,"is-3d":U&&(null===L||void 0===L?void 0:L.camera)===l.PreviewCamera.INTERACTIVE,"has-error":!!X}),style:p,children:[Object(St.jsx)("img",{src:D,className:u()("thumbnail",{"is-visible":K}),alt:"preview"}),Object(St.jsx)("canvas",{id:"wearable-preview",className:u()({"is-visible":J}),width:c,height:s,ref:A,onMouseDown:function(){return g(U&&!X)},onMouseUp:function(){return g(!1)}}),X&&Object(St.jsx)("div",{className:"error",children:X})]})},Tt=a.a.memo(Ct);c.a.render(Object(St.jsx)(a.a.StrictMode,{children:Object(St.jsx)(Tt,{})}),document.getElementById("root"))}},[[527,1,2]]]);
2
- //# sourceMappingURL=main.c1df60f9.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["lib/babylon/toon/new-pbr.hlsl","lib/sleep.ts","lib/json.ts","lib/api/nft.ts","lib/api/peer.ts","lib/color.ts","lib/emote.ts","lib/representation.ts","lib/wearable.ts","lib/zoom.ts","lib/config.ts","lib/cache.ts","hooks/useAsync.ts","hooks/useMessage.ts","hooks/useOptions.ts","hooks/useOverrides.ts","hooks/useConfig.ts","hooks/useController.ts","lib/babylon/utils.ts","lib/babylon/body.ts","lib/babylon/slots.ts","lib/babylon/camera.ts","lib/env.ts","lib/scene.ts","lib/babylon/scene.ts","lib/babylon/emote.ts","lib/babylon/face.ts","lib/babylon/mappings.ts","lib/babylon/toon/index.ts","lib/babylon/wearable.ts","lib/babylon/render.ts","components/Preview/Preview.tsx","hooks/useWindowSize.ts","hooks/useReady.ts","index.tsx"],"names":["sleep","ms","a","Promise","resolve","setTimeout","json","url","attempts","fetch","resp","ok","Error","text","nftApiByEnv","PreviewEnv","DEV","PROD","NFTApi","contractAddress","itemId","env","data","length","tokenId","nft","nftApi","peerByEnv","PeerApi","urns","map","urn","join","wearables","profile","profiles","peerApi","formatHex","color","startsWith","numberToHex","value","toString","slice","colorToHex","r","g","b","hexToColor","hex","parsed","parseHex","Color3","parseInt","isEmote","wearable","InvalidEmoteError","createInvalidEmoteController","getLength","isPlaying","goTo","play","pause","stop","is","representation","bodyShape","bodyShapes","includes","isMale","BodyShape","MALE","isFemale","FEMALE","getRepresentation","shape","representations","some","id","find","getRepresentationOrDefault","hasRepresentation","error","getContentUrl","content","contents","key","mainFile","isTexture","endsWith","getWearableByCategory","category","getFacialFeatureCategories","WearableCategory","EYEBROWS","MOUTH","EYES","getNonFacialFeatureCategories","HAIR","UPPER_BODY","LOWER_BODY","FEET","getDefaultCategories","getDefaultWearableUrn","isWearable","getBodyShape","wearabe","parseZoom","rawZoom","parsedZoom","parseFloat","isNaN","Math","min","max","getZoom","SKIN","DEFAULT_PROFILE","fetchWearable","fetchURNs","results","parseWearable","base64","JSON","parse","atob","fetchProfileWearables","avatar","filter","result","fetchWearables","fetchURLs","urls","promises","then","catch","all","profileMemo","cache","memo","fn","args","reset","createMemo","fetchProfile","avatars","console","log","fetchWearableFromContract","options","network","fetchNFT","Network","ETHEREUM","image","split","fetchAvatar","base64s","includeDefaultWearables","includeFacialFeatures","defaultWearableUrns","categories","push","defaultWearables","wearablePromise","profilePromise","skin","hair","eyes","zoom","type","PreviewType","WEARABLE","background","transparent","disableBackground","AVATAR","disableDefaultWearables","disableFace","TEXTURE","thumbnail","isStandard","Rarity","getColor","rarity","emote","PreviewEmote","IDLE","Object","values","camera","PreviewCamera","INTERACTIVE","autoRotateSpeed","centerBoundingBox","disableAutoCenter","wheelZoom","wheelPrecision","wheelStart","isNumber","blob","fromBlob","undefined","face","disableAutoRotate","offsetX","offsetY","offsetZ","URL","createObjectURL","nonces","isValid","nonce","useMessage","handler","callback","useCallback","useEffect","handleMessage","event","window","addEventListener","removeEventListener","useOptions","useState","location","search","useMemo","params","URLSearchParams","autoRotateSpeedParam","get","offsetXParam","offsetYParam","offsetZParam","wheelZoomParam","wheelPrecisionParam","wheelStartParam","bodyShapeParam","transparentBackground","has","warn","getAll","reduce","selected","overrides","setOverrides","PreviewMessageType","UPDATE","payload","equal","useOverrides","useConfig","asyncFunction","deps","isLoading","setIsLoading","setResult","setError","message","finally","useAsync","createConfig","sendResult","sendMessage","parent","CONTROLLER_RESPONSE","sendError","isCategory","isHidden","asset","hides","replaces","isSuccesful","isModel","isFacialFeature","assets","part","BODY_SHAPE","hasSkin","hideUpperBody","hideLowerBody","hideFeet","hideHead","HEAD","container","meshes","mesh","name","toLowerCase","setEnabled","categoriesHiddenBySkin","HELMET","FACIAL_HAIR","getSlots","config","slots","Map","slot","set","reverse","alreadyRemoved","Set","replaced","hidden","toRemove","Array","from","delete","add","startAutoRotateBehavior","useAutoRotationBehavior","autoRotationBehavior","idleRotationSpeed","isIOs","navigator","platform","ignoreTextureList","createSceneController","engine","scene","width","height","Tools","CreateScreenshotUsingRenderTargetAsync","triangles","total","floor","getTotalIndices","materials","textures","texture","bodies","entities","getScreenshot","getMetrics","showInspector","process","REACT_APP_DEBUG","createScene","canvas","dispose","Engine","preserveDrawingBuffer","stencil","antialias","root","Scene","autoClear","clearColor","Color4","toColor4","ambientColor","preventDefaultOnPointerDown","ArcRotateCamera","Vector3","mode","Camera","PERSPECTIVE_CAMERA","position","attachControl","offset","addInPlace","setTarget","lowerRadiusLimit","radius","upperRadiusLimit","DirectionalLight","intensity","SpotLight","PI","HemisphericLight","GlowLayer","runRenderLoop","render","debugLayer","show","showExplorer","embedMode","loadMask","file","reject","task","TextureAssetTask","onError","errorObject","onSuccess","run","loadTexture","loadAssetContainer","load","extension","SceneLoader","LoadAssetContainerAsync","center","Mesh","setParent","children","getChildren","child","boundingInfo","getBoundingInfo","boundingBox","minimumWorld","maximumWorld","i","siblingMin","siblingMax","Minimize","Maximize","setBoundingInfo","BoundingInfo","refreshBoundingInfo","size","extendSize","scale","scaling","multiply","subtractInPlace","require","loopedEmotes","MONEY","CLAP","isLooped","buildEmoteUrl","baseUrl","path","href","loadEmoteFromUrl","animationGroups","loadEmoteFromWearable","playEmote","onAnimationEnd","STATIC","cameras","loop","emoteAnimationGroup","emoteDataV0","emoteUrl","AnimationGroup","nodes","transformNodes","node","list","targetedAnimations","targetedAnimation","animation","target","newTargets","newTarget","addTargetedAnimation","onAnimationGroupEndObservable","addOnce","controller","createController","animationGroup","startFrom","hasPlayed","to","seconds","requestAnimationFrame","start","getCategoryLoader","features","feature","getFacialFeatures","loadCategory","eyebrows","mouth","applyFacialFeatures","mask","applyTextureAndMask","maskColor","newMaterial","StandardMaterial","alphaMode","PBRMaterial","PBRMATERIAL_ALPHABLEND","backFaceCulling","specularColor","Black","hasAlpha","sideOrientation","Orientation","CW","diffuseTexture","diffuseColor","emissiveTexture","material","setupMappings","mappings","createMappings","OnPluginActivatedObservable","plugin","preprocessUrlAsync","parts","needle","injection","Effect","ShadersStore","loadWearable","originalMaterial","specularIntensity","metallic","metallicF0Factor","albedoColor","FromHexString","toLinearSpace","alpha","removeMaterial","sceneController","promise","addAllToScene","emoteController","replace","IncludesShadersStore","default","Preview","previewError","setPreviewError","windowSize","setWindowSize","handleResize","innerWidth","innerHeight","useWindowSize","style","setStyle","isDragging","setIsDragging","isLoadingModel","setIsLoadingModel","isLoaded","setIsLoaded","canvasRef","useRef","controllerRef","CONTROLLER_REQUEST","namespace","method","isArray","current","apply","useController","isLoadingConfig","configError","setImage","is3D","setIs3D","isMessageSent","setIsMessageSent","showImage","showCanvas","opacity","backgroundColor","_controller","LOAD","ERROR","shouldResetIsLoaded","isReady","setIsReady","READY","useReady","className","classNames","src","alt","ref","onMouseDown","onMouseUp","React","ReactDOM","StrictMode","document","getElementById"],"mappings":"gLAAA,OAAe,w5B,oOCAR,SAAeA,EAAtB,kC,4CAAO,WAAqBC,GAArB,SAAAC,EAAA,+EACE,IAAIC,SAAQ,SAACC,GAAD,OAAaC,WAAWD,EAASH,OAD/C,4C,sBCEA,SAAeK,EAAtB,kC,4CAAO,WAAuBC,GAAvB,6BAAAL,EAAA,6DAAoCM,EAApC,+BAA+C,EAA/C,kBAEgBC,MAAMF,GAFtB,WAEGG,EAFH,QAGOC,GAHP,6BAISC,MAJT,SAIqBF,EAAKG,OAJ1B,yEAMIH,EAAKJ,QANT,uCAQCE,EAAW,GARZ,kCASKR,EAAM,KATX,iCAUMM,EAAKC,EAAKC,EAAW,IAV3B,6E,wBCCA,I,EAAMM,GAAuC,mBACjDC,aAAWC,IAAM,mCADgC,cAEjDD,aAAWE,KAAO,oCAF+B,GAK9CC,E,gIACJ,WAAgBC,EAAyBC,EAAgBC,GAAzD,iBAAAnB,EAAA,sEACyBI,EAAI,UAAsBQ,EAAYO,GAAlC,qCAAmEF,EAAnE,mBAA6FC,IAD1H,mBAEsB,KADZE,EADV,EACUA,MACCC,OAFX,sBAGU,IAAIX,MAAJ,8CAAiDO,EAAjD,qBAA6EC,EAA7E,MAHV,gCAKSE,EAAK,IALd,2C,wHAOA,WAAeH,EAAyBK,EAAiBH,GAAzD,iBAAAnB,EAAA,sEACyBI,EAAI,UACtBQ,EAAYO,GADU,oCACsBF,EADtB,oBACiDK,IAF9E,mBAIsB,KAHZF,EADV,EACUA,MAGCC,OAJX,sBAKU,IAAIX,MAAJ,6CAAgDO,EAAhD,sBAA6EK,EAA7E,MALV,gCAOSF,EAAK,GAAGG,KAPjB,2C,kEAWWC,EAAS,IAAIR,ECxBbS,GAAqC,mBAC/CZ,aAAWC,IAAM,kCAD8B,cAE/CD,aAAWE,KAAO,iCAF6B,GAK5CW,E,qIACJ,WAAqBC,EAAgBR,GAArC,iBAAAnB,EAAA,yDACsB,IAAhB2B,EAAKN,OADX,yCAEW,IAFX,uBAI8BjB,EAAI,UAC3BqB,EAAUN,GADiB,0CACqBQ,EAAKC,KAAI,SAACC,GAAD,2BAAuBA,MAAOC,KAAK,OALnG,mBAO2B,KAHjBC,EAJV,EAIUA,WAGMV,OAPhB,sBAQU,IAAIX,MAAJ,wCAA2CiB,EAA3C,MARV,gCAUSI,GAVT,2C,0HAYA,WAAmBC,EAAiBb,GAApC,eAAAnB,EAAA,sEACyBI,EAAI,UAAeqB,EAAUN,GAAzB,gCAAqDa,IADlF,cACQC,EADR,yBAESA,EAASZ,OAAS,EAAIY,EAAS,GAAK,MAF7C,2C,gEAMWC,EAAU,IAAIR,E,YCxBpB,SAASS,EAAUC,GACxB,OAAOA,EAAMC,WAAW,KAAOD,EAAQ,IAAMA,EAOxC,SAASE,EAAYC,GAE1B,OAAQ,KADc,IAARA,EAAe,GAAGC,SAAS,KACtBC,OAAO,GAGrB,SAASC,EAAWN,GACzB,OAAOE,EAAYF,EAAMO,GAAKL,EAAYF,EAAMQ,GAAKN,EAAYF,EAAMS,GAGlE,SAASC,EAAWC,GACzB,IAAMC,EAdD,SAAkBZ,GACvB,OAAOA,EAAMC,WAAW,KAAOD,EAAMK,MAAM,GAAKL,EAajCa,CAASF,GAMxB,OALc,IAAIG,SAChBC,SAASH,EAAOP,MAAM,EAAG,GAAI,IAAM,IACnCU,SAASH,EAAOP,MAAM,EAAG,GAAI,IAAM,IACnCU,SAASH,EAAOP,MAAM,EAAG,GAAI,IAAM,K,+BCvBhC,SAASW,EAAQC,GACtB,MAAO,gBAAiBA,EAGnB,IAAMC,EAAb,kDACE,aAAe,wDADjB,sBAAuC5C,QAMhC,SAAS6C,IACd,MAAO,CACLC,UADK,WAEH,MAAM,IAAIF,GAEZG,UAJK,WAKH,MAAM,IAAIH,GAEZI,KAPK,WAQH,MAAM,IAAIJ,GAEZK,KAVK,WAWH,MAAM,IAAIL,GAEZM,MAbK,WAcH,MAAM,IAAIN,GAEZO,KAhBK,WAiBH,MAAM,IAAIP,IC5BT,SAASQ,EAAGC,EAA0CC,GAC3D,OAAOD,EAAeE,WAAWC,SAASF,GAGrC,SAASG,EAAOJ,GACrB,OAAOD,EAAGC,EAAgBK,YAAUC,MAG/B,SAASC,EAASP,GACvB,OAAOD,EAAGC,EAAgBK,YAAUG,QAG/B,SAASC,EAAkBnB,GAAuD,IAAzBoB,EAAwB,uDAAhBL,YAAUC,KAChF,OAAQI,GACN,KAAKL,YAAUG,OACb,IAAKlB,EAASjC,KAAKsD,gBAAgBC,KAAKL,GACtC,MAAM,IAAI5D,MAAJ,mEAAsE2C,EAASuB,GAA/E,MAER,OAAOvB,EAASjC,KAAKsD,gBAAgBG,KAAKP,GAE5C,KAAKF,YAAUC,KACb,IAAKhB,EAASjC,KAAKsD,gBAAgBC,KAAKR,GACtC,MAAM,IAAIzD,MAAJ,iEAAoE2C,EAASuB,GAA7E,MAER,OAAOvB,EAASjC,KAAKsD,gBAAgBG,KAAKV,IAKzC,SAASW,EAA2BzB,GAAuD,IAAzBoB,EAAwB,uDAAhBL,YAAUC,KACzF,GAAIU,EAAkB1B,EAAUoB,GAC9B,OAAOD,EAAkBnB,EAAUoB,GAErC,GAAIpB,EAASjC,KAAKsD,gBAAgBrD,OAAS,EACzC,OAAOgC,EAASjC,KAAKsD,gBAAgB,GAEvC,MAAM,IAAIhE,MAAJ,wBAA2B2C,EAASuB,GAApC,4BAGD,SAASG,EAAkB1B,GAAuD,IAAzBoB,EAAwB,uDAAhBL,YAAUC,KAChF,IAEE,OADAG,EAAkBnB,EAAUoB,IACrB,EACP,MAAOO,GACP,OAAO,GAIJ,SAASC,EAAclB,GAC5B,IAAMmB,EAAUnB,EAAeoB,SAASN,MAAK,SAACK,GAAD,OAAaA,EAAQE,MAAQrB,EAAesB,YACzF,IAAKH,EACH,MAAM,IAAIxE,MAAJ,4BAER,OAAOwE,EAAQ7E,IAGV,SAASiF,EAAUvB,GACxB,OAAOA,EAAesB,SAASE,SAAS,OCzDnC,SAASC,EAAsBzD,EAAiC0D,GACrE,OAAO1D,EAAU8C,MAAK,SAACxB,GAAD,OAAcA,EAASjC,KAAKqE,WAAaA,MAAa,KAGvE,SAASC,IACd,MAAO,CAACC,mBAAiBC,SAAUD,mBAAiBE,MAAOF,mBAAiBG,MAGvE,SAASC,IACd,MAAO,CAACJ,mBAAiBK,KAAML,mBAAiBM,WAAYN,mBAAiBO,WAAYP,mBAAiBQ,MAGrG,SAASC,KACd,MAAO,CACLT,mBAAiBC,SACjBD,mBAAiBE,MACjBF,mBAAiBG,KACjBH,mBAAiBK,KACjBL,mBAAiBM,WACjBN,mBAAiBO,WACjBP,mBAAiBQ,MAId,SAASE,GAAsBZ,EAA4BhB,GAChE,OAAQgB,GACN,KAAKE,mBAAiBC,SACpB,OAAOnB,IAAUL,YAAUC,KACvB,sDACA,wDACN,KAAKsB,mBAAiBE,MACpB,OAAOpB,IAAUL,YAAUC,KACvB,mDACA,qDACN,KAAKsB,mBAAiBG,KACpB,OAAOrB,IAAUL,YAAUC,KACvB,kDACA,oDACN,KAAKsB,mBAAiBK,KACpB,OAAOvB,IAAUL,YAAUC,KACvB,yDACA,wDACN,KAAKsB,mBAAiBM,WACpB,OAAOxB,IAAUL,YAAUC,KACvB,uDACA,oDACN,KAAKsB,mBAAiBO,WACpB,OAAOzB,IAAUL,YAAUC,KACvB,sDACA,kDACN,KAAKsB,mBAAiBQ,KACpB,OAAO1B,IAAUL,YAAUC,KACvB,mDACA,oDACN,QACE,MAAM,IAAI3D,MAAJ,qDAAwD+E,EAAxD,OAIL,SAASa,GAAW/D,GACzB,QAASA,EAGJ,SAASgE,GAAaC,GAC3B,IAAMvC,EAAa,CAACG,YAAUC,KAAMD,YAAUG,QAC9C,OACEN,EAAWY,MAAK,SAACb,GAAD,OACdwC,EAAQpF,KAAKsD,gBAAgBC,MAAK,SAACZ,GAAD,OAAoBA,EAAeE,WAAWC,SAASF,UACtFC,EAAW,GCpEb,SAASwC,GAAUC,GACxB,IAAMC,EAAaD,EAAUE,WAAWF,GAAW,KAGnD,OADiB,OAAfC,GAAuBE,MAAMF,GAAc,KAAiD,IAAzCG,KAAKC,IAAID,KAAKE,IAAIL,EAAY,GAAI,KAAc,IAAM,EAStG,SAASM,GAAQ5D,GAEtB,OADc,OAAGA,QAAH,IAAGA,OAAH,EAAGA,EAAUjC,KAAKqE,UAE9B,KAAKE,mBAAiBM,WACpB,OAAO,EACT,KAAKN,mBAAiBuB,KACpB,OAAO,KACT,QACE,OAAO,MCUb,IAAMC,GAAkB,U,SAETC,G,mFAAf,WAA6BvF,EAAaV,GAA1C,eAAAnB,EAAA,sEACwBqH,GAAU,CAACxF,GAAMV,GADzC,UAEyB,KADjBmG,EADR,QAEcjG,OAFd,sBAGU,IAAIX,MAAJ,2CAA8CmB,EAA9C,MAHV,gCAKSyF,EAAQ,IALjB,4C,sBAQA,SAASC,GAAcC,GACrB,OAAOC,KAAKC,MAAMC,KAAKH,I,SAGVI,G,mFAAf,WAAqC5F,EAAwBb,GAA7D,eAAAnB,EAAA,yDACOgC,EADP,yCAEW,IAFX,uBAIwBqF,GAAUrF,EAAQ6F,OAAO9F,UAAWZ,GAJ5D,cAIQmG,EAJR,yBAKSA,EAAQQ,QAAO,SAACC,GAAD,OAAa3E,EAAQ2E,OAL7C,4C,+BAQeV,G,mFAAf,WAAyB1F,EAAgBR,GAAzC,SAAAnB,EAAA,yDACsB,IAAhB2B,EAAKN,OADX,yCAEW,IAFX,gCAISa,EAAQ8F,eAAerG,EAAMR,IAJtC,4C,+BAOe8G,G,iFAAf,WAAyBC,GAAzB,iBAAAlI,EAAA,yDACsB,IAAhBkI,EAAK7G,OADX,yCAEW,IAFX,cAIQ8G,EAAWD,EAAKtG,KAAI,SAACvB,GAAD,OACxBE,MAAMF,GACH+H,MAAK,SAAC5H,GAAD,OAAUA,EAAKJ,UACpBiI,WAPP,SASwBpI,QAAQqI,IAAIH,GATpC,cASQb,EATR,yBAUSA,EAAQQ,OAAOxB,KAVxB,4C,sBAaO,IAAMiC,GCrEN,WACL,IAAMC,EAAoC,GAC1C,MAAO,CACLC,KAAK,WAAD,4BAAE,WAAOrD,EAAKsD,GAAZ,+BAAA1I,EAAA,sDAEJ,KADeoF,KAAOoD,GACT,CAAC,IAAD,WAFUG,EAEV,iCAFUA,EAEV,UACXH,EAAMpD,GAAOsD,EAAE,WAAF,EAAMC,GAHjB,yBAKGH,EAAMpD,IALT,2CAAF,qDAAC,GAOLwD,MAAO,WACL,IAAK,IAAMxD,KAAOoD,SACTA,EAAMpD,KDyDMyD,G,SACZC,G,mFAAf,WAA4B9G,EAAiBb,GAA7C,SAAAnB,EAAA,+EACSuI,GAAYE,KAAKzG,EAAjB,sBAA0B,4BAAAhC,EAAA,yDAC3BgC,IAAYmF,GADe,yCAEtB,MAFsB,uBAIZjF,EAChB4G,aAAa9G,EAASb,GACtBiH,MAAK,SAACpG,GAAD,OAAcA,GAAWA,EAAQ+G,QAAQ1H,OAAS,EAAIW,EAAQ+G,QAAQ,GAAK,QAChFV,OAAM,SAACrD,GAAD,OAAkBgE,QAAQC,IAAR,kCAAuCjH,EAAvC,KAAmDgD,MAP/C,cAIzBxE,EAJyB,yBAQxBA,GAAQ,MARgB,6CADnC,4C,+BAae0I,G,iFAAf,WAAyCC,GAAzC,2BAAAnJ,EAAA,yDAMUiB,EAA0CkI,EAA1ClI,gBAAiBC,EAAyBiI,EAAzBjI,OAAQI,EAAiB6H,EAAjB7H,QAASH,EAAQgI,EAARhI,IACrCD,GAAWI,EAPlB,sBAQU,IAAIZ,MAAJ,8CARV,UAWQ0I,EAAUjI,IAAQN,aAAWE,KAAO,QAAU,SAChDc,EAZN,2BAYgCuH,EAZhC,2BAY0DnI,EAZ1D,YAY6EC,GACtEA,GAAWI,EAblB,sBAcU,IAAIZ,MAAJ,6CAdV,UAecQ,IAAUI,EAfxB,kCAgBsBE,EAAO6H,SAASpI,EAAiBK,EAASH,GAhBhE,QAgBUI,EAhBV,OAiBIM,EACEN,EAAI6H,UAAYE,UAAQC,SAAxB,2BACwBH,EADxB,2BACkDnI,EADlD,YACqEM,EAAIL,QACrEK,EAAIiI,MAAMC,MAAM,aAAa,GAAGA,MAAM,cAAc,GApB9D,iCAsBSrC,GAAcvF,EAAKV,IAtB5B,6C,+BAyBeuI,G,+FAAf,WACE1H,EACAL,EACAuG,EACAyB,EACA3F,EACA4F,EACAC,EACA1I,GARF,6BAAAnB,EAAA,uFAYc4H,GAAsB5F,EAASb,GAZ7C,gEAackG,GAAU,CAACrD,GAAF,mBAAgBrC,IAAOR,GAb9C,iEAcc8G,GAAUC,GAdxB,0DAeOyB,EAAQ/H,IAAI2F,KAGjBxF,GAPIA,EAXN,6CAkBwB+F,QAAO,SAACzE,GAAD,OAAc0B,EAAkB1B,EAAUW,MAEjE8F,EAAgC,GAChCC,EACJH,GAA2BC,EACvBzD,KACAwD,EACA7D,IACA8D,EACAnE,IACA,GA5BR,cA6ByBqE,GA7BzB,8DA6BatE,EA7Bb,QA8BqBD,EAAsBzD,EAAW0D,GA9BtD,sBAgCY5D,EAAMwE,GAAsBZ,EAAUzB,IAhClD,iBAkCQ8F,EAAoBE,KAAKnI,GAlCjC,8BAoCc,IAAInB,MAAJ,kDAAqD+E,EAArD,MApCd,wJAwCMqE,EAAoBzI,OAAS,GAxCnC,kCAyCmCgG,GAAUyC,EAAqB3I,GAzClE,QAyCU8I,EAzCV,OA0CIlI,EAAS,sBAAOA,GAAP,YAAqBkI,IA1ClC,iCA6CSlI,GA7CT,kE,oEAgDO,kGAAA/B,EAAA,6DAA4BmJ,EAA5B,+BAAsD,GACnDlI,EAAqCkI,EAArClI,gBAAiBK,EAAoB6H,EAApB7H,QAASJ,EAAWiI,EAAXjI,OAC5BC,EAAMgI,EAAQhI,KAAON,aAAWE,KAGlCmJ,EAAsDjK,QAAQC,UAC9De,IACFiJ,EAAkBhB,GAA0B,CAAEjI,kBAAiBK,UAASJ,SAAQC,SAI5EgJ,EAAiBhB,EAAQnH,QAAU8G,GAAaK,EAAQnH,QAASb,GAAOlB,QAAQC,QAAQ,MAXzF,SAc6BD,QAAQqI,IAAI,CAAC4B,EAAiBC,IAd3D,sCAcE9G,EAdF,KAcYrB,EAdZ,KAiBCgC,EACJmF,EAAQnF,WACPhC,GAAYA,EAAQ6F,OAAO7D,YAC3BX,EAAWkD,GAAalD,GAAae,YAAUC,MAG5C+F,EAAOjI,EAAUgH,EAAQiB,MAASpI,GAAWU,EAAWV,EAAQ6F,OAAOuC,KAAKhI,QAAW,UACvFiI,EAAOlI,EAAUgH,EAAQkB,MAASrI,GAAWU,EAAWV,EAAQ6F,OAAOwC,KAAKjI,QAAW,UACvFkI,EAAOnI,EAAUgH,EAAQmB,MAAStI,GAAWU,EAAWV,EAAQ6F,OAAOyC,KAAKlI,QAAW,UAGvFT,EA5BD,YA4BawH,EAAQxH,MAAQ,IAG5BuG,EAAOiB,EAAQjB,MAAQ,GAGvByB,EAAUR,EAAQQ,SAAW,GAE/B5H,EAAkC,GAClCwI,EAAO,KACPC,EAAOC,cAAYC,SACnBC,EAA0C,CAC5CvI,MAAO,UACPwI,aAA2C,IAA9BzB,EAAQ0B,qBAInBlJ,EAAKN,OAAS,GAAK6G,EAAK7G,OAAS,GAAKsI,EAAQtI,OAAS,GAAMgC,GAAYD,EAAQC,IAAc8F,EAAQnH,SA7CtG,wBA8CHwI,EAAOC,cAAYK,OA9ChB,UA+CepB,GAChB1H,EACAL,EACAuG,EACAyB,EACA3F,GACCmF,EAAQ4B,yBACR5B,EAAQ6B,YACT7J,GAvDC,QA+CHY,EA/CG,sBA2DDsB,IACFkH,EAAOxI,EAAUV,OAAS,EAAIkJ,EAAOtD,GAAQ5D,GAEzCiC,EADmBR,EAA2BzB,KACjBmH,IAASC,cAAYK,SACpDN,EAAOC,cAAYQ,SAErBN,EAAU,2BACLA,GADK,IAERnB,MAAOnG,EAAS6H,YAEdC,qBAAW9H,KACPjB,EAAQgJ,SAAOC,SAAShI,EAASiI,QACvCX,EAAU,2BACLA,GADK,IAERnB,MAAOnG,EAAS6H,UAChB9I,YAKFmJ,EAAQC,eAAaC,KACrBtC,EAAQoC,OAASG,OAAOC,OAAOH,gBAActH,SAASiF,EAAQoC,SAChEA,EAAQpC,EAAQoC,OAGdK,EAASC,gBAAcC,YACvB3C,EAAQyC,QAAUF,OAAOC,OAAOE,iBAAe3H,SAASiF,EAAQyC,UAClEA,EAASzC,EAAQyC,QAEbG,EAC+B,kBAA5B5C,EAAQ4C,iBAAiClF,MAAMsC,EAAQ4C,iBAA6C,GAA1B5C,EAAQ4C,gBACrFC,GAAqB7C,EAAQ8C,kBAG/BC,EAAY,EACZC,EAAiB,IACjBC,EAAa,GACbC,GAASlD,EAAQ+C,aACnBA,EAAYpF,KAAKE,IAAImC,EAAQ+C,UAAY,IAEvCG,GAASlD,EAAQgD,kBACnBA,EAAiBrF,KAAKE,IAAImC,EAAQgD,eAAiB,IAEjDE,GAASlD,EAAQiD,cACnBA,EAAa,IAAMtF,KAAKC,IAAID,KAAKE,IAAImC,EAAQiD,WAAa,GAAI,MAI5DjD,EAAQwB,aACVA,EAAWvI,MAAQ+G,EAAQwB,YA5GxB,kBA+GE,CACLtH,SAAQ,OAAEA,QAAF,IAAEA,IAAa8F,EAAQmD,KAAOC,GAASpD,EAAQmD,WAAQE,EAC/DzK,YACAiC,YACAoG,OACAC,OACAC,OACAE,OACAG,aACA8B,MAA8B,IAAxBtD,EAAQ6B,YACdO,QACAK,SACAG,gBAAiB5C,EAAQuD,kBAAoB,EAAIX,EACjDC,oBACAW,QAASxD,EAAQwD,SAAW,EAC5BC,QAASzD,EAAQyD,SAAW,EAC5BC,QAAS1D,EAAQ0D,SAAW,EAC5BtC,KAA8B,kBAAjBpB,EAAQoB,KAAoBpB,EAAQoB,KAAO,GAAKA,EAC7D2B,YACAC,iBACAC,eAnIG,4C,yBAuIP,SAASC,GAAS9J,GAChB,MAAwB,kBAAVA,IAAuBsE,MAAMtE,GAG7C,SAASgK,GAASD,GAChB,OAAO,2BACFA,GADL,IAEElL,KAAK,2BACAkL,EAAKlL,MADN,IAEFsD,gBAAiB4H,EAAKlL,KAAKsD,gBAAgB9C,KAAI,SAACmC,GAAD,mBAAC,eAC3CA,GAD0C,IAE7CoB,SAAUpB,EAAeoB,SAASvD,KAAI,SAACsD,GAAD,MAAc,CAClDE,IAAKF,EAAQE,IACb/E,IAAKyM,IAAIC,gBAAgB7H,EAAQoH,mBE9S3C,IAAMU,GAAiC,GACvC,SAASC,GAAQrI,EAAYsI,GAC3B,OAAOA,IAAUF,GAAOpI,G,yBCPbuI,GAAa,SAACC,GAEzB,IAAMC,EAAWC,sBAAYF,EAAS,IAEtCG,qBAAU,WACR,SAASC,EAAcC,GACrBJ,EAASI,GAGX,OADAC,OAAOC,iBAAiB,UAAWH,GAC5B,WACLE,OAAOE,oBAAoB,UAAWJ,MAEvC,CAACH,KCROQ,GAAa,WAExB,MAAiBC,mBAASJ,OAAOK,SAASC,OAAOxL,YAA1CwL,EAAP,oBACM7E,EAAU8E,mBAAwB,WACtC,IAAMC,EAAS,IAAIC,gBAAgBH,GAC7BI,EAAuBF,EAAOG,IAAI,mBAClCC,EAAeJ,EAAOG,IAAI,WAC1BE,EAAeL,EAAOG,IAAI,WAC1BG,EAAeN,EAAOG,IAAI,WAC1BI,EAAiBP,EAAOG,IAAI,aAC5BK,EAAsBR,EAAOG,IAAI,kBACjCM,EAAkBT,EAAOG,IAAI,cAC7BO,EAAiBV,EAAOG,IAAI,aAE5BQ,EAAwBX,EAAOY,IAAI,yBACrCD,GACF7F,QAAQ+F,KAAR,oNAIF,IAAM/C,EAAwD,UAApCkC,EAAOG,IAAI,qBA4CrC,OA3CIQ,GACF7F,QAAQ+F,KAAR,oNAK8B,CAC9B9N,gBAAiBiN,EAAOG,IAAI,YAC5B/M,QAAS4M,EAAOG,IAAI,SACpBnN,OAAQgN,EAAOG,IAAI,QACnBjE,KAAM8D,EAAOG,IAAI,QACjBhE,KAAM6D,EAAOG,IAAI,QACjB/D,KAAM4D,EAAOG,IAAI,QACjB9C,MAAO2C,EAAOG,IAAI,SAClBzC,OAAQsC,EAAOG,IAAI,UACnB1D,WAAYuD,EAAOG,IAAI,cACvBtC,gBAAiBqC,EAAuBxH,WAAWwH,GAAwB,KAC3EzB,QAAS2B,EAAe1H,WAAW0H,GAAgB,KACnD1B,QAAS2B,EAAe3H,WAAW2H,GAAgB,KACnD1B,QAAS2B,EAAe5H,WAAW4H,GAAgB,KACnDtC,UAAWuC,EAAiB7H,WAAW6H,GAAkB,KACzDtC,eAAgBuC,EAAsB9H,WAAW8H,GAAuB,KACxEtC,WAAYuC,EAAkB/H,WAAW+H,GAAmB,KAC5DpE,KAAM9D,GAAUyH,EAAOG,IAAI,SAC3BrK,UACqB,WAAnB4K,GAA+BA,IAAmBxK,YAAUG,OACxDH,YAAUG,OACS,SAAnBqK,GAA6BA,IAAmBxK,YAAUC,KAC1DD,YAAUC,KACV,KACN1C,KAAMuM,EAAOc,OAAO,OACpB9G,KAAMgG,EAAOc,OAAO,OACpBrF,QAASuE,EAAOc,OAAO,UACvBhN,QAASkM,EAAOG,IAAI,WACpBxD,kBAAmBqD,EAAOY,IAAI,sBAAwBD,EACtD5C,kBAAmBiC,EAAOY,IAAI,uBAAyB9C,EACvDU,kBAAmBwB,EAAOY,IAAI,uBAAyB9C,EACvDhB,YAAakD,EAAOY,IAAI,eACxB/D,wBAAyBmD,EAAOY,IAAI,2BACpC3N,IAAKuK,OAAOC,OAAO9K,cAChBiH,QAAO,SAACvF,GAAD,MAAiD,kBAAVA,KAC9C0M,QAAO,SAACC,EAAU3M,GAAX,OAAsBA,IAAU2L,EAAOG,IAAI,OAAS9L,EAAQ2M,IAAWrO,aAAWE,SAG7F,CAACiN,IAGEmB,ECrEoB,WAC1B,MAAkCrB,mBAAyB,IAA3D,mBAAOqB,EAAP,KAAkBC,EAAlB,KAiBA,OAdAjC,IAAW,SAACM,GACV,GACEA,EAAMrM,MACNqM,EAAMrM,KAAKoJ,OAAS6E,qBAAmBC,QACT,kBAAvB7B,EAAMrM,KAAKmO,SACoB,kBAA/B9B,EAAMrM,KAAKmO,QAAQpG,QAC1B,CACA,IAAQA,EAAYsE,EAAMrM,KAAKmO,QAAvBpG,QACHqG,KAAML,EAAWhG,IACpBiG,EAAajG,OAKZgG,EDmDWM,GAUlB,OAT6BxB,mBAC3B,8BAAC,eACI9E,GACAgG,KAEL,CAAChG,EAASgG,KE5EP,SAASO,KACd,IAAMvG,EAAU0E,KAChB,EJMK,SAAqBjJ,EAAY+K,GAAiF,IAAlCC,EAAiC,uDAAJ,GAElH,EAAkC9B,oBAAS,GAA3C,mBAAO+B,EAAP,KAAkBC,EAAlB,KACA,EAA4BhC,mBAAmB,MAA/C,mBAAO/F,EAAP,KAAegI,EAAf,KACA,EAA0BjC,mBAAS,IAAnC,mBAAO9I,EAAP,KAAcgL,EAAd,KA6BA,MA1B0B,qBAAfhD,GAAOpI,KAChBoI,GAAOpI,GAAM,GAIf2I,qBAAU,WACR,IAAML,IAAUF,GAAOpI,GACvBkL,GAAa,GACbH,IACGvH,MAAK,SAACL,GACDkF,GAAQrI,EAAIsI,IACd6C,EAAUhI,MAGbM,OAAM,SAACrD,GACFiI,GAAQrI,EAAIsI,IACd8C,EAAShL,EAAMiL,YAGlBC,SAAQ,WACHjD,GAAQrI,EAAIsI,IACd4C,GAAa,QAGlBF,GAEI,CAAC7H,EAAQ8H,EAAW7K,GIvCQmL,CAAS,aAAa,kBN2JpD,WAAP,gCM3JiEC,CAAajH,KAAU,CAACA,IAAvF,mBACA,MAAO,CADP,gBCFF,SAASkH,GAAWzL,EAAYmD,GAC9BuI,sBAAY5C,OAAO6C,OAAQlB,qBAAmBmB,oBAAqB,CAAE5L,KAAInE,IAAI,EAAMsH,WAGrF,SAAS0I,GAAU7L,EAAYI,GAC7BsL,sBAAY5C,OAAO6C,OAAQlB,qBAAmBmB,oBAAqB,CAAE5L,KAAInE,IAAI,EAAOuE,UCL/E,SAAS0L,GAAWjL,GACzB,OAAO,SAACpC,GAAD,OAAkCA,EAASjC,KAAKqE,WAAaA,GAG/D,SAASkL,GAASlL,GACvB,OAAO,SAACmL,GACN,OACEA,EAAMvN,SAASjC,KAAKqE,WAAaA,IAChCmL,EAAMvN,SAASjC,KAAKyP,OAAS,IAAI3M,SAASuB,KAC1CmL,EAAMvN,SAASjC,KAAK0P,UAAY,IAAI5M,SAASuB,IAK7C,SAASsL,GAAYhJ,GAC1B,QAASA,EAGJ,SAASiJ,GAAQ3N,GAEtB,OAAQiC,EADeR,EAA2BzB,IAI7C,SAAS4N,GAAgB5N,GAC9B,OAAQ2N,GAAQ3N,GCxBX,SAASkD,GAAa2K,GAC3B,IAAMlN,EAAYkN,EAAOrM,MAAK,SAACsM,GAAD,OAAUA,EAAK9N,SAASjC,KAAKqE,WAAaE,mBAAiByL,cACzF,IAAKpN,EACH,OAAO,KAIT,IAP4C,EAOtCqN,EAAUH,EAAOvM,MAAK,SAACwM,GAAD,OAAUA,EAAK9N,SAASjC,KAAKqE,WAAaE,mBAAiBuB,QACjFoK,EAAgBD,GAAWH,EAAOvM,KAAKgM,GAAShL,mBAAiBM,aACjEsL,EAAgBF,GAAWH,EAAOvM,KAAKgM,GAAShL,mBAAiBO,aACjEsL,EAAWH,GAAWH,EAAOvM,KAAKgM,GAAShL,mBAAiBQ,OAC5DsL,EAAWJ,GAAWH,EAAOvM,KAAKgM,GAAShL,mBAAiB+L,OAXtB,cAazB1N,EAAU2N,UAAUC,QAbK,IAa5C,2BAA+C,CAAC,IAArCC,EAAoC,QACvCC,EAAOD,EAAKC,KAAKC,cACnBD,EAAKvM,SAAS,mBAAqB+L,GACrCO,EAAKG,YAAW,GAEdF,EAAKvM,SAAS,mBAAqBgM,GACrCM,EAAKG,YAAW,GAEdF,EAAKvM,SAAS,kBAAoBiM,GACpCK,EAAKG,YAAW,GAEdF,EAAKvM,SAAS,SAAWkM,GAC3BI,EAAKG,YAAW,GAEdF,EAAKvM,SAAS,kBAAoBkM,GACpCI,EAAKG,YAAW,GAEdF,EAAKvM,SAAS,cAAgBkM,GAChCI,EAAKG,YAAW,GAEdF,EAAKvM,SAAS,kBAAoBkM,GACpCI,EAAKG,YAAW,GAEdF,EAAKvM,SAAS,eAAiBkM,GACjCI,EAAKG,YAAW,IArCwB,8BAyC5C,OAAOhO,ECzCT,IAAMiO,GAAyB,CAC7BtM,mBAAiBuM,OACjBvM,mBAAiBK,KACjBL,mBAAiBwM,YACjBxM,mBAAiBE,MACjBF,mBAAiBC,SACjBD,mBAAiBG,KACjBH,mBAAiBM,WACjBN,mBAAiBO,WACjBP,mBAAiBQ,MAGZ,SAASiM,GAASC,GACvB,IAAMC,EAAQ,IAAIC,IAEdxQ,EAAkCsQ,EAAOtQ,UAAU+F,QAAO,SAACzE,GAAD,OAAeD,EAAQC,MAGjFgP,EAAOhP,WAAaD,EAAQiP,EAAOhP,YACrCtB,EAAYsQ,EAAOtQ,UAAU+F,QAAO,SAACzE,GACnC,GAAIgP,EAAOhP,SAAU,CACnB,MAAsCgP,EAAOhP,SAASjC,KAA9CqE,EAAR,EAAQA,SAAUoL,EAAlB,EAAkBA,MAAOC,EAAzB,EAAyBA,SACzB,GAA+B,SAA3BzN,EAASjC,KAAKqE,SAAqB,CACrC,GAAIwM,GAAuB/N,SAASuB,GAClC,OAAO,EAET,GAAIoL,GAASA,EAAM3M,SAASyB,mBAAiB+L,MAC3C,OAAO,EAET,GAAIZ,GAAYA,EAAS5M,SAASyB,mBAAiB+L,MACjD,OAAO,EAGX,GAAIrO,EAASjC,KAAKyP,OAASxN,EAASjC,KAAKyP,MAAM3M,SAASuB,GACtD,OAAO,EAET,GAAIpC,EAASjC,KAAK0P,UAAYzN,EAASjC,KAAK0P,SAAS5M,SAASuB,GAC5D,OAAO,EAGX,OAAO,KAGT1D,EAAUiI,KAAKqI,EAAOhP,WA/BsB,oBAmCvBtB,GAnCuB,IAmC9C,2BAAkC,CAAC,IAAxBsB,EAAuB,QAC1BmP,EAAOnP,EAASjC,KAAKqE,SACvBV,EAAkB1B,EAAUgP,EAAOrO,YACrCsO,EAAMG,IAAID,EAAMnP,IAtC0B,8BAyC9C,IAAIgO,GAAU,EAEdtP,EAAYA,EAAU+F,QAAO,SAACzE,GAAD,OAAciP,EAAMjE,IAAIhL,EAASjC,KAAKqE,YAAcpC,KAAUqP,UAC3F,IA5C8C,EA4CxCC,EAAiB,IAAIC,IA5CmB,cA6CvB7Q,GA7CuB,IA6C9C,2BAAkC,CAAC,IAAxBsB,EAAuB,QAC1BoC,EAAWpC,EAASjC,KAAKqE,SAC/B,IAAIkN,EAAe7D,IAAIrJ,GAAvB,CAMA,IAHA,IAAMoN,EAAWxP,EAASjC,KAAK0P,UAAY,GACrCgC,EAASzP,EAASjC,KAAKyP,OAAS,GAChCkC,EAAWC,MAAMC,KAAK,IAAIL,IAAJ,sBAAYC,GAAZ,YAAyBC,MACrD,MAAmBC,EAAnB,eAA6B,CAAxB,IAAMP,EAAI,KACTA,IAAS/M,IACX6M,EAAMY,OAAOV,GACbG,EAAeQ,IAAIX,IAGnBnP,EAASjC,KAAKqE,WAAaE,mBAAiBuB,OAC9CmK,GAAU,KA5DgC,8BAgE9C,GAAIA,EAAS,CAAC,IAAD,gBACYY,IADZ,IACX,2BAA+C,CAAC,IAArCxM,EAAoC,QAC7C6M,EAAMY,OAAOzN,IAFJ,+BAMb,OAAO6M,ECnFF,SAASc,GAAwBxH,EAAyByG,GAC3DzG,IACFA,EAAOyH,yBAA0B,EAC7BzH,EAAO0H,uBACT1H,EAAO0H,qBAAqBC,kBAAoBlB,EAAOtG,kB,OCPtD,SAASyH,KACd,MAAO,CAAC,iBAAkB,mBAAoB,iBAAkB,OAAQ,SAAU,QAAQtP,SAASuP,UAAUC,UCG/G,IAAMC,GAAoB,CAExB,+BAEA,mBACA,oBACA,yBAGK,SAASC,GAAsBC,EAAgBC,EAAclI,GAAkC,4CACpG,WAA6BmI,EAAeC,GAA5C,SAAAhU,EAAA,+EACSiU,QAAMC,uCAAuCL,EAAQjI,EAAQ,CAAEmI,QAAOC,eAAUxH,OAAWA,GAAW,IAD/G,4CADoG,kEAKpG,kCAAAxM,EAAA,6DACQmU,EAAYL,EAAMlC,OAAO3C,QAAO,SAACmF,EAAOvC,GAC5C,OAAOuC,EAAQtN,KAAKuN,MAAMxC,EAAKyC,kBAAoB,KAClD,GACGC,EAAYT,EAAMS,UAAUlT,OAC5BuQ,EAASkC,EAAMlC,OAAOvQ,OACtBmT,EAAWV,EAAMU,SAAS1M,QAC9B,SAAC2M,GAAD,OAAaA,EAAQ3C,OAAS6B,GAAkBzP,SAASuQ,EAAQ3C,SACjEzQ,OARJ,kBAUS,CACL8S,YACAI,YACA3C,SACA4C,WACAE,OAAQ9C,EACR+C,SAAU,IAhBd,4CALoG,sBAyBpG,MAAO,CACLC,cA1BmG,SAAD,qCA2BlGC,WA3BkG,4CCsBtG,IA6CIhB,GA7CEiB,GAAgBC,6NAAYC,gBA8C3B,SAAeC,GAAtB,qC,8CAAO,WACLC,EACA7C,GAFK,mBAAArS,EAAA,sDAKD6T,IACFA,GAAOsB,UAETtB,GAAS,IAAIuB,SAAOF,GAAQ,EAAM,CAChCG,uBAAuB,EACvBC,SAAS,EACTC,WAAW,KAIPC,EAAO,IAAIC,QAAM5B,KAClB6B,WAAY,EACjBF,EAAKG,WAAatD,EAAO1H,WAAWC,YAChC,IAAIgL,SAAO,EAAG,EAAG,EAAG,GACpB9S,EAAWuP,EAAO1H,WAAWvI,OAAOyT,WACxCL,EAAKM,aAAe,IAAI5S,SAAO,EAAG,EAAG,GACrCsS,EAAKO,6BAA8B,GAG7BnK,EAAS,IAAIoK,kBAAgB,SAAU,EAAG,EAAG,EAAG,IAAIC,UAAQ,EAAG,EAAG,GAAIT,IACrEU,KAAOC,SAAOC,mBAzBhB,KA0BG/D,EAAO7H,KA1BV,cA2BEC,cAAYC,SA3Bd,UAgCED,cAAYK,OAhCd,2BA4BDsI,GAAwBxH,EAAQyG,GAChCzG,EAAOyK,SAAW,IAAIJ,WAAS,EAAG,EAAG,GA7BpC,oCAiCDrK,EAAOyK,SAAW,IAAIJ,UAAQ,EAAG,EAAG,KAjCnC,oCAqCD5D,EAAOzG,SAAWC,gBAAcC,aAClCF,EAAO0K,cAAcpB,GAAQ,GAGzBqB,EAAS,IAAIN,UAAQ5D,EAAO1F,QAAS0F,EAAOzF,QAASyF,EAAOxF,SAClEjB,EAAOyK,SAASG,WAAWD,GAC3B3K,EAAO6K,UAAUF,GAGjB3K,EAAO8K,iBAAmB9K,EAAO+K,OAAStE,EAAO9H,KACjDqB,EAAOgL,iBAAmBhL,EAAO8K,iBAAmBrE,EAAOnG,UAC3DN,EAAO+K,OACL/K,EAAO8K,kBAAqB9K,EAAOgL,iBAAmBhL,EAAO8K,kBAAoBrE,EAAOjG,WAAc,IACxGR,EAAOO,eAAiBkG,EAAOlG,eAG3BkG,EAAO7H,OAASC,cAAYC,WACV,IAAImM,mBAAiB,cAAe,IAAIZ,UAAQ,EAAG,EAAG,GAAIT,GAClEsB,UAAY,EACX,IAAIC,YAAU,OAAQ,IAAId,WAAS,EAAG,EAAG,GAAI,IAAIA,UAAQ,GAAI,GAAI,GAAInP,KAAKkQ,GAAK,EAAG,IAAMxB,GAChGsB,UAAY,GAEP,IAAIG,mBAAiB,MAAO,IAAIhB,UAAQ,GAAI,EAAG,GAAIT,GAC3DsB,UAAY,EACD,IAAIG,mBAAiB,SAAU,IAAIhB,UAAQ,EAAG,EAAG,GAAIT,GAC7DsB,UAAY,EAIdtD,OACe,IAAI0D,YAAU,OAAQ1B,GAC9BsB,UAAY,GAIxBjD,GAAOsD,eAAc,WACnB3B,EAAK4B,YAIHtC,IACFU,EAAK6B,WAAWC,KAAK,CAAEC,cAAc,EAAMC,WAAW,IA9EnD,kBAiFE,CAAChC,EAAM5B,GAAsBC,GAAQ2B,EAAM5J,KAjF7C,6C,sBAoFA,SAAe6L,GAAtB,uC,8CAAO,WACL3D,EACAzQ,EACAW,GAHK,mBAAAhE,EAAA,yDAKC8R,EAAOzO,EAASuB,GAChBb,EAAiBS,EAAkBnB,EAAUW,KAC7C0T,EAAO3T,EAAeoB,SAASN,MAAK,SAAC6S,GAAD,OAAUA,EAAKtS,IAAI2M,cAAcxM,SAAS,iBAP/E,yCASI,IAAItF,SAAQ,SAACC,EAASyX,GAC3B,IAAMC,EAAO,IAAIC,mBAAiB/F,EAAM4F,EAAKrX,KAAK,GAAM,GACxDuX,EAAKE,QAAU,kBAAMH,EAAOC,EAAKG,cACjCH,EAAKI,UAAY,WACf9X,EAAQ0X,EAAKnD,UAEfmD,EAAKK,IAAInE,GAAO,kBAAM5T,EAAQ0X,EAAKnD,WAAUkD,OAf5C,gCAkBE,MAlBF,4C,sBAqBA,SAAeO,GAAtB,uC,8CAAO,WACLpE,EACAzQ,EACAW,GAHK,mBAAAhE,EAAA,yDAKC8R,EAAOzO,EAASuB,GAChBb,EAAiBS,EAAkBnB,EAAUW,KAC7C0T,EAAO3T,EAAeoB,SAASN,MACnC,SAAC6S,GAAD,OAAUA,EAAKtS,IAAI2M,cAAcxM,SAAS,UAAYmS,EAAKtS,IAAI2M,cAAcxM,SAAS,iBARnF,yCAWI,IAAItF,SAAQ,SAACC,EAASyX,GAC3B,IAAMC,EAAO,IAAIC,mBAAiB/F,EAAM4F,EAAKrX,KAAK,GAAM,GACxDuX,EAAKE,QAAU,kBAAMH,EAAOC,EAAKG,cACjCH,EAAKI,UAAY,WACf9X,EAAQ0X,EAAKnD,UAEfmD,EAAKK,IAAInE,GAAO,kBAAM5T,EAAQ0X,EAAKnD,WAAUkD,OAjB5C,gCAoBE,MApBF,4C,sBAuBA,SAAeQ,GAAtB,qC,8CAAO,WAAkCrE,EAAczT,GAAhD,eAAAL,EAAA,6DACCoY,EADD,+BAAApY,EAAA,MACQ,WAAOK,EAAagY,GAApB,SAAArY,EAAA,+EACXsY,cAAYC,wBAAwBlY,EAAK,GAAIyT,EAAO,KAAMuE,IAD/C,2CADR,0EAKUD,EAAK/X,EAAK,QALpB,iGAOU+X,EAAK/X,EAAK,SAPpB,yD,yBAgBA,SAASmY,GAAO1E,GAErB,IAFmC,EAE7BvD,EAAS,IAAIkI,OAAK,SAAU3E,GAFC,cAGhBA,EAAMlC,QAHU,IAGnC,2BAAiC,CAAC,IAAvBC,EAAsB,QAC3BA,IAAStB,GACXsB,EAAK6G,UAAUnI,IALgB,+BAhLrC,SAA6BA,GAC3B,IAAMoI,EAAWpI,EAAOqI,cAAc9Q,QAAO,SAAC+J,GAAD,MAAsB,aAAZA,EAAKjN,MAC5D,GAAI+T,EAAStX,OAAS,EAAG,CAQvB,IAPA,IAAMwX,EAAQF,EAAS,GAEnBG,EAAeD,EAAME,kBAErBhS,EAAM+R,EAAaE,YAAYC,aAAa9F,IAAI0F,EAAMxC,UACtDrP,EAAM8R,EAAaE,YAAYE,aAAa/F,IAAI0F,EAAMxC,UAEjD8C,EAAI,EAAGA,EAAIR,EAAStX,OAAQ8X,IAAK,CACxC,IAAMN,EAAQF,EAASQ,GAGjBC,GADNN,EAAeD,EAAME,mBACWC,YAAYC,aAAa9F,IAAI0F,EAAMxC,UAC7DgD,EAAaP,EAAaE,YAAYE,aAAa/F,IAAI0F,EAAMxC,UAEnEtP,EAAMkP,UAAQqD,SAASvS,EAAKqS,GAC5BpS,EAAMiP,UAAQsD,SAASvS,EAAKqS,GAG9B9I,EAAOiJ,gBAAgB,IAAIC,eAAa1S,EAAKC,KAqK/C0S,CAAoBnJ,GACpB,IACMoJ,EADSpJ,EAAOwI,kBAAkBC,YAAYY,WAChCvY,SACdwY,EAAQ,IAAI5D,UAAQ,EAAI0D,EAAM,EAAIA,EAAM,EAAIA,GAClDpJ,EAAOuJ,QAAUD,EACjB,IAAMrB,EAASjI,EAAOwI,kBAAkBC,YAAYR,OAAOuB,SAASF,GACpEtJ,EAAO8F,SAAS2D,gBAAgBxB,GA7M9B1D,IACFmF,EAAQ,KC9BV,IAAMC,GAAe,CAAC1O,eAAaC,KAAMD,eAAa2O,MAAO3O,eAAa4O,MAE1E,SAASC,GAAS9O,GAChB,OAAO2O,GAAahW,SAASqH,GAGxB,SAAS+O,GAAc/O,GAC5B,IAAIgP,EAAUxF,2DACTwF,EAAQhV,SAAS,OACpBgV,GAAW,KAEb,IAAMC,EAAI,mBAAejP,EAAf,QAEV,OADYgP,EAAQlY,WAAW,QAAU,IAAIyK,IAAI0N,EAAMD,GAASE,KAAOD,EAIlE,SAAeE,GAAtB,qC,8CAAO,WAAgC5G,EAAczT,GAA9C,eAAAL,EAAA,sEACmBmY,GAAmBrE,EAAOzT,GAD7C,UAEoC,KADnCsR,EADD,QAESgJ,gBAAgBtZ,OAFzB,sBAGG,IAAIX,MAAJ,uDAA0DL,IAH7D,gCAKEsR,GALF,4C,sBAQA,SAAeiJ,GAAtB,uC,8CAAO,WAAqC9G,EAAczQ,EAA8BgP,GAAjF,iBAAArS,EAAA,yDACC+D,EAAiBS,EAAkBnB,EAAUgP,EAAOrO,WACpDkB,EAAUnB,EAAeoB,SAASN,MAAK,SAACK,GAAD,OAAaA,EAAQE,MAAQrB,EAAesB,YAFpF,sBAIG,IAAI3E,MAAJ,wEAC6D2C,EAASuB,GADtE,0BAC0FyN,EAAOrO,YALpG,gCAQE0W,GAAiB5G,EAAO5O,EAAQ7E,MARlC,4C,sBAWA,SAAewa,GAAtB,uC,8CAAO,WAAyB/G,EAAc5C,EAAiBmB,GAAxD,kBA0BIyI,EA1BJ,qCAAA9a,EAAA,yDA0BI8a,EA1BJ,WA2BCzI,EAAOzG,SAAWC,gBAAckP,QAElC3H,GADeU,EAAMkH,QAAQ,GACG3I,GAE9B4I,GACFC,EAAoBvX,MAAK,IA7BzBsX,EAAOZ,GAAShI,EAAO9G,QAEvB8G,EAAOhP,WAAYD,EAAQiP,EAAOhP,UALjC,0CAOiBuX,GAAsB9G,EAAOzB,EAAOhP,SAAUgP,GAP/D,OAODV,EAPC,OAQDsJ,KAAQ,UAAC5I,EAAOhP,SAAS8X,mBAAjB,aAAC,EAA6BF,MARrC,kDAUDjS,QAAQ+F,KAAR,+BAAqCsD,EAAOhP,SAASuB,KAVpD,oCAYMyN,EAAOtQ,UAAU4C,KAAKvB,GAZ5B,wBAcGmI,EAAQ8G,EAAOtQ,UAAU2Q,UAAU7N,KAAKzB,GAd3C,UAeewX,GAAsB9G,EAAOvI,EAAO8G,GAfnD,QAeHV,EAfG,OAgBHsJ,KAAQ,UAAC1P,EAAM4P,mBAAP,aAAC,EAAmBF,MAhBzB,WAkBAtJ,EAlBA,wBAmBGyJ,EAAWd,GAAcjI,EAAO9G,OAnBnC,UAoBemP,GAAiB5G,EAAOsH,GApBvC,QAoBHzJ,EApBG,eAuBCuJ,EAAsB,IAAIG,iBAAe,QAASvH,GAvBnD,wBAsCiB5C,GAtCjB,8DAsCQN,EAtCR,QAyCK0K,EAAQ1K,EAAMe,UAAU4J,eAAetM,QAAO,SAACrN,EAAK4Z,GACxD,IAAMC,EAAO7Z,EAAIyM,IAAImN,EAAK5W,KAAO,GAEjC,OADA6W,EAAKzR,KAAKwR,GACH5Z,EAAI6Q,IAAI+I,EAAK5W,GAAI6W,KACvB,IAAIlJ,OAEHZ,EAAUgJ,gBAAgBtZ,OAAS,GA/CtC,+BAgDiCsQ,EAAUgJ,gBAAgB,GAAGe,oBAhD9D,IAgDC,2BAIE,GAJSC,EAAsE,QACzEC,EAAYD,EAAkBC,UAC9BC,EAASF,EAAkBE,QAC3BC,EAAaR,EAAMjN,IAAIwN,EAAOjX,MAClBkX,EAAWza,OAAS,EAAG,CAAC,EAAD,YACfya,GADe,IACvC,2BAAWC,EAAyB,QAClCb,EAAoBc,qBAAqBJ,EAAWG,GAFf,gCApD5C,4DA2DO,IAAIrb,MAAJ,4BA3DP,wJA+DHwa,EAAoBe,8BAA8BC,QAAQpB,GACpDqB,EAAaC,GAAiBlB,EAAqBD,GAErD5I,EAAOzG,SAAWC,gBAAckP,OAClCoB,EAAWtY,OAEXsY,EAAWxY,OArEV,kBAwEIwY,GAxEJ,mCA0EHnT,QAAQ+F,KAAR,+BAAqCsD,EAAO9G,OAA5C,MA1EG,iF,sBA8EP,SAAS6Q,GAAiBC,EAAgCpB,GACxD,IAAIqB,EAAY,EACZC,GAAY,EAFyE,SAI1E/Y,IAJ0E,2EAIzF,sBAAAxD,EAAA,+EACSqc,EAAeG,IADxB,4CAJyF,+BAQ1E/Y,IAR0E,2EAQzF,sBAAAzD,EAAA,+EACSqc,EAAe5Y,WADxB,4CARyF,+BAY1EC,EAZ0E,8EAYzF,WAAoB+Y,GAApB,SAAAzc,EAAA,sEACYyD,IADZ,kCAEI4Y,EAAezY,QACfF,EAAK+Y,GACL/O,OAAOgP,sBAAsB/Y,GAJjC,uBAOI0Y,EAAexY,OAEfwY,EAAeM,OAAM,EAAO,EAAGF,EAASA,GAAS,GACjDH,EAAYG,EAVhB,6CAZyF,+BA0B1E9Y,IA1B0E,2EA0BzF,sBAAA3D,EAAA,sEACcyD,IADd,sCAEQ6Y,EAFR,6BAGMD,EAHN,KAG2BpB,EAH3B,KAGoCqB,EAHpC,SAGqD9Y,IAHrD,wBAGqBmZ,MAHrB,eAGiC,EAHjC,WAGkE,GAC5DL,EAAY,EAJlB,wBAMMD,EAAe1Y,KAAKsX,GAN1B,QAQIsB,GAAY,EARhB,6CA1ByF,+BAsC1E3Y,IAtC0E,2EAsCzF,sBAAA5D,EAAA,sEACYyD,IADZ,kCAEI4Y,EAAezY,QAFnB,4CAtCyF,+BA4C1EC,IA5C0E,2EA4CzF,sBAAA7D,EAAA,sDACMuc,GACF7Y,EAAK,GACLgK,OAAOgP,sBAAsB9Y,KAE7BD,IACA+J,OAAOgP,sBAAsB7Y,IANjC,4CA5CyF,sBAsDzF,MAAO,CACLL,YACAC,YACAC,OACAC,OACAC,QACAC,QC9KJ,SAAS+Y,GAAkB9I,EAAc+I,EAAgC7Y,GACvE,8CAAO,WAAOyB,GAAP,eAAAzF,EAAA,2DACC8c,EAAUD,EAAShY,KAAK6L,GAAWjL,KADpC,yCAGIxF,QAAQqI,IAAI,CAAC4P,GAAYpE,EAAOgJ,EAAS9Y,GAAYyT,GAAS3D,EAAOgJ,EAAS9Y,MAHlF,gCAOE,CAAC,KAAM,OAPT,2CAAP,sDAWK,SAAe+Y,GAAtB,uC,8CAAO,WAAiCjJ,EAAc+I,EAAgC7Y,GAA/E,yBAAAhE,EAAA,6DACCgd,EAAeJ,GAAkB9I,EAAO+I,EAAU7Y,GADnD,SAEiC/D,QAAQqI,IAAI,CAChD0U,EAAarX,mBAAiBG,MAC9BkX,EAAarX,mBAAiBC,UAC9BoX,EAAarX,mBAAiBE,SAL3B,0CAEEyE,EAFF,KAEQ2S,EAFR,KAEkBC,EAFlB,uBAOE,CAAE5S,OAAM2S,WAAUC,UAPpB,4C,sBAUA,SAAeC,GAAtB,6C,8CAAO,WACLrJ,EACA9P,EACAsG,EACA2S,EACAC,EACA7K,GANK,qCAAArS,EAAA,oEAQcgE,EAAU2N,UAAUC,QARlC,IAQL,4BAAWC,EAAoC,SACpCC,KAAKC,cAAcxM,SAAS,eAAe,EAAD,YACzB+E,EADyB,GAC1CmK,EAD0C,KACjC2I,EADiC,KAE7C3I,EACF4I,GAAoBvJ,EAAO,OAAQjC,EAAM4C,EAASpC,EAAO/H,KAAM8S,EAAM,WAErEvL,EAAKG,YAAW,IAGhBH,EAAKC,KAAKC,cAAcxM,SAAS,mBAAmB,EAAD,YAC7B0X,EAD6B,GAC9CxI,EAD8C,KACrC2I,EADqC,KAEjD3I,EACF4I,GAAoBvJ,EAAO,WAAYjC,EAAM4C,EAASpC,EAAOhI,KAAM+S,EAAM/K,EAAOhI,MAEhFwH,EAAKG,YAAW,IAGhBH,EAAKC,KAAKC,cAAcxM,SAAS,gBAAgB,EAAD,YAC1B2X,EAD0B,GAC3CzI,EAD2C,KAClC2I,EADkC,KAE9C3I,EACF4I,GAAoBvJ,EAAO,QAASjC,EAAM4C,EAASpC,EAAOjI,KAAMgT,EAAM/K,EAAOjI,MAE7EyH,EAAKG,YAAW,IA9BjB,0E,sBAoCP,SAASqL,GACPvJ,EACAhC,EACAD,EACA4C,EACArS,EACAgb,EACAE,GAEA,IAAMC,EAAc,IAAIC,mBAAJ,UAAwB1L,EAAxB,sBAAkDgC,GACtEyJ,EAAYE,UAAYC,cAAYC,uBACpCJ,EAAYK,iBAAkB,EAC9BL,EAAYM,cAAgB3a,SAAO4a,QACnCrJ,EAAQsJ,UAAW,EACnBR,EAAYS,gBAAkBC,cAAYC,GAC1CX,EAAYY,eAAiB1J,EAC7B8I,EAAYa,aAAehB,EAAOla,SAAO4a,QAAUhb,EAAWwa,GAC1DF,IACFG,EAAYc,gBAAkBjB,EAC9BG,EAAYa,aAAetb,EAAWV,IAExCyP,EAAKyM,SAAWf,EC1DX,SAASgB,GAAclM,GAC5B,IACMmM,EAxBD,SAAwBzc,GAA8D,IAAD,EAA5BiC,EAA4B,uDAAhBI,YAAUC,KAC9Ema,EAAmC,GADiD,cAEnEzc,GAFmE,IAE1F,2BAAkC,CAAC,IAAxBsB,EAAuB,QAChC,IACE,IADE,EACIU,EAAiBS,EAAkBnB,EAAUW,GADjD,cAEiBD,EAAeoB,UAFhC,IAEF,2BAA4C,CAAC,IAAlCuS,EAAiC,QAC1C8G,EAAS9G,EAAKtS,KAAOsS,EAAKrX,KAH1B,+BAKF,MAAO2E,GACPgE,QAAQ+F,KAAR,wDACmD1L,EAASuB,GAD5D,4DACkHZ,EADlH,MAGA,WAZsF,8BAe1F,OAAOwa,EASUC,CADCpM,EAAOhP,SAAP,CAAmBgP,EAAOhP,UAA1B,mBAAuCgP,EAAOtQ,YAAasQ,EAAOtQ,UACzCsQ,EAAOrO,WAClDsU,cAAYoG,4BAA4BvL,KAAI,SAACwL,GACvB,SAAhBA,EAAO7M,OACI6M,EACRC,mBAAL,uCAA0B,WAAOve,GAAP,eAAAL,EAAA,iFAElB6e,EAAQxe,EAAIoJ,MAFM,wCAGjBoV,EAAMxd,OAAS,GAAOwd,EAAM,GAAKL,EAASK,EAAM,IAAMxe,GAHrC,2CAA1B,0DC/BN,IAAMye,GAAM,0CACNC,GAAS,8BAEf,IAAIC,SAAOC,aAAP,eAAsC/a,SAAS4a,IAQjD,MAAM,IAAIpe,MAAM,sCCEX,SAAewe,GAAtB,qC,8CAAO,WACLpL,EACAzQ,GAFK,mDAAArD,EAAA,yDAGLgE,EAHK,+BAGOI,YAAUC,KACtB+F,EAJK,uBAKLC,EALK,wBAQD/E,EADEvB,EAAiBS,EAAkBnB,EAAUW,IAP9C,sBASG,IAAItD,MAAJ,wBAA2B2C,EAASuB,GAApC,mBATH,cAWCvE,EAAM4E,EAAclB,GAXrB,SAYmBoU,GAAmBrE,EAAOzT,GAZ7C,OAYCsR,EAZD,qBAe0BA,EAAU4C,WAfpC,IAeL,4BAAW4K,EAAyC,mBAClBzB,iBACxBH,EAAc4B,GAGRC,kBAAoB,EAC5B7B,EAAY8B,WACd9B,EAAY8B,SAAW,EACvB9B,EAAY+B,iBAAmB,GAG7B/B,EAAYzL,KAAKC,cAAc7N,SAAS,UACtCmG,GACFkT,EAAYgC,YAAcrc,SAAOsc,cAAcnV,GAAMoV,gBACrDlC,EAAY6B,kBAAoB,EAChC7B,EAAYmC,MAAQ,IAEpBnC,EAAYmC,MAAQ,EACpB5L,EAAM6L,eAAepC,KAGrBA,EAAYzL,KAAKC,cAAc7N,SAAS,UACtCkG,GACFmT,EAAYgC,YAAcrc,SAAOsc,cAAcpV,GAAMqV,gBACrDlC,EAAY6B,kBAAoB,EAChC7B,EAAYmC,MAAQ,IAEpBnC,EAAYmC,MAAQ,EACpB5L,EAAM6L,eAAepC,MA3CxB,4CAkDwB5L,EAAUgJ,iBAlDlC,IAkDL,4BAAW0B,EAA6C,SACvCxY,OACfwY,EAAezT,QACfyT,EAAelH,UArDZ,uDAwDE,CAAExD,YAAWtO,aAxDf,4C,uECGA,WAAsB6R,EAA2B7C,GAAjD,2DAAArS,EAAA,sEAEkCiV,GAAYC,EAAQ7C,GAFtD,sCAEEyB,EAFF,KAES8L,EAFT,cAKHrB,GAAclM,GAMRlK,EAAoC,GAEtCkK,EAAO7H,OAASC,cAAYK,OAb7B,iBAeKwH,EAAQF,GAASC,GAGjBtQ,EAAYiR,MAAMC,KAAKX,EAAM3G,UAlBlC,cAoBsB5J,EAAU+F,OAAOkJ,KApBvC,IAoBD,2BAAW3N,EAAuC,QAC1Cwc,EAAUX,GAAapL,EAAOzQ,EAAUgP,EAAOrO,UAAWqO,EAAOjI,KAAMiI,EAAOhI,MAAMhC,OAAM,SAACrD,GAC/FgE,QAAQ+F,KAAK/J,EAAMiL,YAErB9H,EAAS6B,KAAK6V,GAxBf,+CA0BqB5f,QAAQqI,IAAIH,GA1BjC,QA0BK+I,EA1BL,OA0B4CpJ,OAAOiJ,IA1BnD,cA6BmBG,GA7BnB,IA6BD,2BAA4B,QACpBS,UAAUmO,gBA9BjB,mCAkCK9b,EAAYuC,GAAa2K,IAlC9B,wBAqCO2L,EAAW9a,EAAU+F,OAAOmJ,IArCnC,UAsCyC8L,GAAkBjJ,EAAO+I,EAAUxK,EAAOrO,WAtCnF,iBAsCSsG,EAtCT,EAsCSA,KAAM2S,EAtCf,EAsCeA,SAAUC,EAtCzB,EAsCyBA,MACxBC,GAAoBrJ,EAAO9P,EAAWsG,EAAM2S,EAAUC,EAAO7K,GAvC9D,yBA2CwBwI,GAAU/G,EAAO5C,EAAQmB,GA3CjD,kDA2C6D9O,IA3C7D,QA2CDwc,EA3CC,kCA6CK1c,EAAWgP,EAAOhP,UA7CvB,4CAiDuB6b,GAAapL,EAAOzQ,EAAUgP,EAAOrO,UAAWqO,EAAOjI,KAAMiI,EAAOhI,MAjD3F,eAkDSsH,UAAUmO,gBAlDnB,oEAqDuBZ,GAClBpL,EACAzQ,EACAgP,EAAOrO,YAAcI,YAAUC,KAAOD,YAAUG,OAASH,YAAUC,KACnEgO,EAAOjI,KACPiI,EAAOhI,MA1DZ,eA4DSsH,UAAUmO,gBA5DnB,QAiEDC,EAAkBxc,IAjEjB,eAqEC8O,EAAOrG,mBACTwM,GAAO1E,GAIHqI,EAAiC,CACrCrI,MAAO8L,EACPrU,MAAOwU,GA5EN,kBA8EI5D,GA9EJ,wCAiFHrI,EAAM6B,WAAa,IAAIC,SAAO,EAAG,EAAG,EAAG,GAjFpC,wE,sBFZAoJ,SAAOC,aAAP,eAAsC/a,SAAS6a,MAClDC,SAAOC,aAAP,eAAwCD,SAAOC,aAAP,eAAsCe,QAC5ElB,GACAA,GAAS,KAAOC,GAAY,OASlCC,SAAOiB,qBAAP,kBAAmDhG,EAAQ,KAA+BiG,Q,qBGRpFC,GAAoB,WACxB,MAAwCrS,mBAAS,IAAjD,mBAAOsS,EAAP,KAAqBC,EAArB,KACA,ECJK,WAGL,MAAoCvS,mBAAe,CACjDiG,WAAOvH,EACPwH,YAAQxH,IAFV,mBAAO8T,EAAP,KAAmBC,EAAnB,KAoBA,OAhBAhT,qBAAU,WAER,SAASiT,IAEPD,EAAc,CACZxM,MAAOrG,OAAO+S,WACdzM,OAAQtG,OAAOgT,cAQnB,OAJAhT,OAAOC,iBAAiB,SAAU6S,GAElCA,IAEO,kBAAM9S,OAAOE,oBAAoB,SAAU4S,MACjD,IACIF,EDnBmBK,GAAlB5M,EAAR,EAAQA,MAAOC,EAAf,EAAeA,OACf,EAA0BlG,mBAA8B,IAAxD,mBAAO8S,EAAP,KAAcC,EAAd,KACA,EAAoC/S,oBAAS,GAA7C,mBAAOgT,EAAP,KAAmBC,EAAnB,KACA,EAA4CjT,oBAAS,GAArD,mBAAOkT,EAAP,KAAuBC,EAAvB,KACA,EAAgCnT,oBAAS,GAAzC,mBAAOoT,EAAP,KAAiBC,EAAjB,KACMC,EAAYC,iBAA0B,MACtClF,EdNqB,WAC3B,IAAMmF,EAAgBD,mBA0CtB,OAxCAlU,GAAU,uCAAC,WAAOM,GAAP,6BAAAzN,EAAA,0DAEPyN,EAAMrM,MACNqM,EAAMrM,KAAKoJ,OAAS6E,qBAAmBkS,oBACT,kBAAvB9T,EAAMrM,KAAKmO,SACe,kBAA1B9B,EAAMrM,KAAKmO,QAAQ3K,IACc,kBAAjC6I,EAAMrM,KAAKmO,QAAQiS,WACW,kBAA9B/T,EAAMrM,KAAKmO,QAAQkS,QACW,kBAA9BhU,EAAMrM,KAAKmO,QAAQrB,SAC1B8E,MAAM0O,QAAQjU,EAAMrM,KAAKmO,QAAQrB,QAT1B,sBAWmCT,EAAMrM,KAAKmO,QAA7C3K,EAXD,EAWCA,GAAI6c,EAXL,EAWKA,OAAQD,EAXb,EAWaA,UAAWtT,EAXxB,EAWwBA,QAM3BoT,EAAcK,QAjBX,sBAkBDH,KAAaF,EAAcK,SAlB1B,sBAmBCF,KAAUH,EAAcK,QAAQH,IAnBjC,iCAqBOrF,EAAamF,EAAcK,QAAQH,GACnC9Y,EAAKyT,EAAWsF,GAtBvB,UAuBsB/Y,EAAGkZ,MAAM,KAAM1T,GAvBrC,QAuBOnG,EAvBP,OAwBCsI,GAAWzL,EAAImD,GAxBhB,kDA0BC0I,GAAU7L,EAAI,KAAMqL,SA1BrB,gCA6BDQ,GAAU7L,EAAI,kBA7Bb,gCAgCH6L,GAAU7L,EAAI,qBAhCX,gCAmCL6L,GAAU7L,EAAI,wBAnCT,0DAAD,uDAwCH0c,EcrCYO,GACnB,EAA+CnS,KAA/C,mBAAO2C,EAAP,KAAeyP,EAAf,KAAgCC,EAAhC,KACA,EAA0BjU,mBAAS,IAAnC,mBAAOtE,EAAP,KAAcwY,EAAd,KACA,EAAwBlU,oBAAS,GAAjC,mBAAOmU,EAAP,KAAaC,EAAb,KACA,EAA0CpU,oBAAS,GAAnD,mBAAOqU,EAAP,KAAsBC,EAAtB,KAEMpd,EAAQob,GAAgB2B,EACxBlS,GAAamR,GAAkBc,KAAqB9c,EACpDqd,IAAc7Y,IAAUyY,IAASpS,EACjCyS,EAAaL,IAASpS,EAsE5B,OApEAtC,qBAAU,WACR,GAAI6T,EAAUO,SAAWtP,EAAQ,CAC/B,IAAIuO,EAA6B,CAAE2B,QAAS,GAGxClQ,EAAO1H,WAAWnB,QACpBwY,EAAS3P,EAAO1H,WAAWnB,OAC3BoX,EAAM2B,QAAU,EAEXlQ,EAAO1H,WAAWC,aAAeyH,EAAO7H,OAASC,cAAYQ,UAChE2V,EAAM4B,gBAAkBnQ,EAAO1H,WAAWvI,QAI9Cye,EAASD,GAGLvO,EAAO7H,OAASC,cAAYQ,SAC9BiX,GAAQ,GACRjB,GAAkB,GAClBE,GAAY,ID/Bb,SAAP,qCCkCQ/J,CAAOgK,EAAUO,QAAStP,GACvBjK,MAAK,SAACqa,GAAD,OAAkBtG,EAAWwF,QAAUc,KAC5Cpa,OAAM,SAACrD,GAAD,OAAWqb,EAAgBrb,EAAMiL,YACvCC,SAAQ,WACP+Q,GAAkB,GAClBE,GAAY,SAInB,CAACC,EAAUO,QAAStP,IAGvB9E,qBAAU,WACH4U,IACCjB,GACF5Q,sBAAY5C,OAAO6C,OAAQlB,qBAAmBqT,KAAM,MACpDN,GAAiB,IACRpd,IACTsL,sBAAY5C,OAAO6C,OAAQlB,qBAAmBsT,MAAO,CAAE1S,QAASjL,IAChEod,GAAiB,OAGpB,CAAClB,EAAUlc,EAAOmd,IAGrB5U,qBAAU,WACR,GAAIuU,EAAiB,CACnB,IAAIc,GAAsB,EACrB5B,IACHC,GAAkB,GAClB2B,GAAsB,GAEpBT,IACFC,GAAiB,GACjBQ,GAAsB,GAEpBA,GAAuB1B,GACzBC,GAAY,MAGf,CAACW,EAAiBd,EAAgBmB,EAAejB,IEzF9B,WACtB,MAA8BpT,oBAAS,GAAvC,mBAAO+U,EAAP,KAAgBC,EAAhB,KACAvV,qBAAU,WACHsV,IACHvS,sBAAY5C,OAAO6C,OAAQlB,qBAAmB0T,MAAO,MACrDD,GAAW,MAEZ,CAACD,IFqFJG,GAGE,uBACEC,UAAWC,IAAW,UAAW,CAC/B,cAAepC,EACf,aAAcjR,EACd,YAAaqR,EACb,QAASe,IAAc,OAAN5P,QAAM,IAANA,OAAA,EAAAA,EAAQzG,UAAWC,gBAAcC,YAClD,cAAe9G,IAEjB4b,MAAOA,EART,UAUE,sBACEuC,IAAK3Z,EACLyZ,UAAWC,IAAW,YAAa,CACjC,aAAcb,IAEhBe,IAAI,YAEN,yBACExe,GAAG,mBACHqe,UAAWC,IAAW,CACpB,aAAcZ,IAEhBvO,MAAOA,EACPC,OAAQA,EACRqP,IAAKjC,EACLkC,YAAa,kBAAMvC,EAAckB,IAASjd,IAC1Cue,UAAW,kBAAMxC,GAAc,MAEhC/b,GAAS,sBAAKie,UAAU,QAAf,SAAwBje,QAKzBwe,OAAM/a,KAAK0X,IG9H1BsD,IAASrM,OACP,eAAC,IAAMsM,WAAP,UACE,eAAC,GAAD,MAEFC,SAASC,eAAe,W","file":"static/js/main.c1df60f9.chunk.js","sourcesContent":["export default \"float angleY = 3.14 / 2.0;\\n\\nmat3 rotateY = mat3(\\n cos(angleY), 0, sin(angleY),\\n 0, 1, 0,\\n -sin(angleY), 0, cos(angleY)\\n);\\n\\n// view angle DOT normal of the position\\nvec3 tray = normalize(viewDirectionW * rotateY);\\nvec3 rayDirection = normalize(tray-vPositionW);\\nfloat t=(dot(normalW,rayDirection) + 1.0) / 2.0;\\n\\nfloat ToonThresholds[3];\\nToonThresholds[0] = 0.90;\\nToonThresholds[1] = 0.80;\\nToonThresholds[2] = 0.20;\\n\\nfloat ToonBrightnessLevels[4];\\nToonBrightnessLevels[0] = 1.2;\\nToonBrightnessLevels[1] = 1.0;\\nToonBrightnessLevels[2] = 1.0;\\nToonBrightnessLevels[3] = 0.8;\\n\\nif (t > ToonThresholds[0])\\n{\\n finalColor.rgb *= ToonBrightnessLevels[0];\\n}\\nelse if (t > ToonThresholds[1])\\n{\\n finalColor.rgb *= ToonBrightnessLevels[1];\\n}\\nelse if (t > ToonThresholds[2])\\n{\\n finalColor.rgb *= ToonBrightnessLevels[2];\\n}\\nelse\\n{\\n finalColor.rgb *= ToonBrightnessLevels[3];\\n}\\n\";","export async function sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n","import { sleep } from './sleep'\n\nexport async function json<T>(url: string, attempts = 3): Promise<T> {\n try {\n const resp = await fetch(url)\n if (!resp.ok) {\n throw new Error(await resp.text())\n }\n return resp.json() as Promise<T>\n } catch (error) {\n if (attempts > 0) {\n await sleep(100)\n return json(url, attempts - 1)\n } else {\n throw error\n }\n }\n}\n","import { Item, NFT, PreviewEnv } from '@dcl/schemas'\nimport { json } from '../json'\n\nexport const nftApiByEnv: Record<PreviewEnv, string> = {\n [PreviewEnv.DEV]: 'https://nft-api.decentraland.io',\n [PreviewEnv.PROD]: 'https://nft-api.decentraland.org',\n}\n\nclass NFTApi {\n async fetchItem(contractAddress: string, itemId: string, env: PreviewEnv) {\n const { data } = await json<{ data: Item[] }>(`${nftApiByEnv[env]}/v1/items?contractAddress=${contractAddress}&itemId=${itemId}`)\n if (data.length === 0) {\n throw new Error(`Item not found for contractAddress=\"${contractAddress}\" itemId=\"${itemId}\"`)\n }\n return data[0]\n }\n async fetchNFT(contractAddress: string, tokenId: string, env: PreviewEnv) {\n const { data } = await json<{ data: { nft: NFT }[] }>(\n `${nftApiByEnv[env]}/v1/nfts?contractAddress=${contractAddress}&tokenId=${tokenId}`\n )\n if (data.length === 0) {\n throw new Error(`NFT not found for contractAddress=\"${contractAddress}\" tokenId=\"${tokenId}\"`)\n }\n return data[0].nft\n }\n}\n\nexport const nftApi = new NFTApi()\n","import { PreviewEnv, Profile, WearableDefinition } from '@dcl/schemas'\nimport { json } from '../json'\n\nexport const peerByEnv: Record<PreviewEnv, string> = {\n [PreviewEnv.DEV]: 'https://peer.decentraland.zone',\n [PreviewEnv.PROD]: 'https://peer.decentraland.org',\n}\n\nclass PeerApi {\n async fetchWearables(urns: string[], env: PreviewEnv) {\n if (urns.length === 0) {\n return []\n }\n const { wearables } = await json<{ wearables: WearableDefinition[] }>(\n `${peerByEnv[env]}/lambdas/collections/wearables?${urns.map((urn) => `wearableId=${urn}`).join('&')}`\n )\n if (wearables.length === 0) {\n throw new Error(`Wearables not found for urns=\"${urns}\"`)\n }\n return wearables\n }\n async fetchProfile(profile: string, env: PreviewEnv) {\n const profiles = await json<Profile[]>(`${peerByEnv[env]}/lambdas/profiles?id=${profile}`)\n return profiles.length > 0 ? profiles[0] : null\n }\n}\n\nexport const peerApi = new PeerApi()\n","import { Color3 } from '@babylonjs/core'\nimport { Color3 as RGB } from '@dcl/schemas'\n\nexport function formatHex(color: string) {\n return color.startsWith('#') ? color : '#' + color\n}\n\nexport function parseHex(color: string) {\n return color.startsWith('#') ? color.slice(1) : color\n}\n\nexport function numberToHex(value: number) {\n const hex = ((value * 255) | 0).toString(16)\n return ('0' + hex).slice(-2)\n}\n\nexport function colorToHex(color: RGB) {\n return numberToHex(color.r) + numberToHex(color.g) + numberToHex(color.b)\n}\n\nexport function hexToColor(hex: string) {\n const parsed = parseHex(hex)\n const color = new Color3(\n parseInt(parsed.slice(0, 2), 16) / 256,\n parseInt(parsed.slice(2, 4), 16) / 256,\n parseInt(parsed.slice(4, 6), 16) / 256\n )\n return color\n}\n","import { IEmoteController, WearableDefinition } from '@dcl/schemas'\n\nexport function isEmote(wearable: WearableDefinition) {\n return `emoteDataV0` in wearable\n}\n\nexport class InvalidEmoteError extends Error {\n constructor() {\n super(`Invalid emote`)\n }\n}\n\nexport function createInvalidEmoteController(): IEmoteController {\n return {\n getLength() {\n throw new InvalidEmoteError()\n },\n isPlaying() {\n throw new InvalidEmoteError()\n },\n goTo() {\n throw new InvalidEmoteError()\n },\n play() {\n throw new InvalidEmoteError()\n },\n pause() {\n throw new InvalidEmoteError()\n },\n stop() {\n throw new InvalidEmoteError()\n },\n }\n}\n","import { BodyShape, RepresentationDefinition, WearableDefinition } from '@dcl/schemas'\n\nexport function is(representation: RepresentationDefinition, bodyShape: BodyShape) {\n return representation.bodyShapes.includes(bodyShape)\n}\n\nexport function isMale(representation: RepresentationDefinition) {\n return is(representation, BodyShape.MALE)\n}\n\nexport function isFemale(representation: RepresentationDefinition) {\n return is(representation, BodyShape.FEMALE)\n}\n\nexport function getRepresentation(wearable: WearableDefinition, shape = BodyShape.MALE) {\n switch (shape) {\n case BodyShape.FEMALE: {\n if (!wearable.data.representations.some(isFemale)) {\n throw new Error(`Could not find a BaseFemale representation for wearable=\"${wearable.id}\"`)\n }\n return wearable.data.representations.find(isFemale)!\n }\n case BodyShape.MALE: {\n if (!wearable.data.representations.some(isMale)) {\n throw new Error(`Could not find a BaseMale representation for wearable=\"${wearable.id}\"`)\n }\n return wearable.data.representations.find(isMale)!\n }\n }\n}\n\nexport function getRepresentationOrDefault(wearable: WearableDefinition, shape = BodyShape.MALE) {\n if (hasRepresentation(wearable, shape)) {\n return getRepresentation(wearable, shape)\n }\n if (wearable.data.representations.length > 0) {\n return wearable.data.representations[0]\n }\n throw new Error(`The wearable=\"${wearable.id}\" has no representation`)\n}\n\nexport function hasRepresentation(wearable: WearableDefinition, shape = BodyShape.MALE) {\n try {\n getRepresentation(wearable, shape)\n return true\n } catch (error) {\n return false\n }\n}\n\nexport function getContentUrl(representation: RepresentationDefinition) {\n const content = representation.contents.find((content) => content.key === representation.mainFile)\n if (!content) {\n throw new Error(`Could not find main file`)\n }\n return content.url\n}\n\nexport function isTexture(representation: RepresentationDefinition) {\n return representation.mainFile.endsWith('png')\n}\n","import { BodyShape, WearableCategory, WearableDefinition } from '@dcl/schemas'\n\nexport function getWearableByCategory(wearables: WearableDefinition[], category: WearableCategory) {\n return wearables.find((wearable) => wearable.data.category === category) || null\n}\n\nexport function getFacialFeatureCategories() {\n return [WearableCategory.EYEBROWS, WearableCategory.MOUTH, WearableCategory.EYES]\n}\n\nexport function getNonFacialFeatureCategories() {\n return [WearableCategory.HAIR, WearableCategory.UPPER_BODY, WearableCategory.LOWER_BODY, WearableCategory.FEET]\n}\n\nexport function getDefaultCategories() {\n return [\n WearableCategory.EYEBROWS,\n WearableCategory.MOUTH,\n WearableCategory.EYES,\n WearableCategory.HAIR,\n WearableCategory.UPPER_BODY,\n WearableCategory.LOWER_BODY,\n WearableCategory.FEET,\n ]\n}\n\nexport function getDefaultWearableUrn(category: WearableCategory, shape: BodyShape) {\n switch (category) {\n case WearableCategory.EYEBROWS:\n return shape === BodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:eyebrows_00'\n : 'urn:decentraland:off-chain:base-avatars:f_eyebrows_00'\n case WearableCategory.MOUTH:\n return shape === BodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:mouth_00'\n : 'urn:decentraland:off-chain:base-avatars:f_mouth_00'\n case WearableCategory.EYES:\n return shape === BodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:eyes_00'\n : 'urn:decentraland:off-chain:base-avatars:f_eyes_00'\n case WearableCategory.HAIR:\n return shape === BodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:casual_hair_01'\n : 'urn:decentraland:off-chain:base-avatars:standard_hair'\n case WearableCategory.UPPER_BODY:\n return shape === BodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:green_hoodie'\n : 'urn:decentraland:off-chain:base-avatars:f_sweater'\n case WearableCategory.LOWER_BODY:\n return shape === BodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:brown_pants'\n : 'urn:decentraland:off-chain:base-avatars:f_jeans'\n case WearableCategory.FEET:\n return shape === BodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:sneakers'\n : 'urn:decentraland:off-chain:base-avatars:bun_shoes'\n default:\n throw new Error(`There is no default wearable for category=\"${category}\"`)\n }\n}\n\nexport function isWearable(value: WearableDefinition | void): value is WearableDefinition {\n return !!value\n}\n\nexport function getBodyShape(wearabe: WearableDefinition): BodyShape {\n const bodyShapes = [BodyShape.MALE, BodyShape.FEMALE]\n return (\n bodyShapes.find((bodyShape) =>\n wearabe.data.representations.some((representation) => representation.bodyShapes.includes(bodyShape))\n ) || bodyShapes[0]\n )\n}\n","import { WearableCategory, WearableDefinition } from '@dcl/schemas'\n\nexport function parseZoom(rawZoom: string | null) {\n const parsedZoom = rawZoom ? parseFloat(rawZoom) : null\n const zoom =\n parsedZoom === null || isNaN(parsedZoom) ? null : (Math.min(Math.max(parsedZoom, 0), 100) * 1.8) / 100 + 1\n return zoom\n}\n\n/**\n * Returns the right zoom for a given category\n * @param category\n * @returns\n */\nexport function getZoom(wearable?: WearableDefinition | void) {\n const category = wearable?.data.category\n switch (category) {\n case WearableCategory.UPPER_BODY:\n return 2\n case WearableCategory.SKIN:\n return 1.75\n default:\n return 1.25\n }\n}\n","import {\n Avatar,\n BodyShape,\n isStandard,\n Network,\n PreviewCamera,\n PreviewConfig,\n PreviewEmote,\n PreviewEnv,\n PreviewOptions,\n PreviewType,\n Rarity,\n WearableDefinition,\n WearableWithBlobs,\n} from '@dcl/schemas'\nimport { nftApi } from './api/nft'\nimport { peerApi } from './api/peer'\nimport { createMemo } from './cache'\nimport { colorToHex, formatHex } from './color'\nimport { isEmote } from './emote'\nimport { getRepresentationOrDefault, hasRepresentation, isTexture } from './representation'\nimport {\n getDefaultCategories,\n getDefaultWearableUrn,\n getBodyShape,\n getWearableByCategory,\n isWearable,\n getFacialFeatureCategories,\n getNonFacialFeatureCategories,\n} from './wearable'\nimport { getZoom } from './zoom'\n\nconst DEFAULT_PROFILE = 'default'\n\nasync function fetchWearable(urn: string, env: PreviewEnv) {\n const results = await fetchURNs([urn], env)\n if (results.length !== 1) {\n throw new Error(`Could not find wearable for urn=\"${urn}\"`)\n }\n return results[0]\n}\n\nfunction parseWearable(base64: string): WearableDefinition {\n return JSON.parse(atob(base64))\n}\n\nasync function fetchProfileWearables(profile: Avatar | null, env: PreviewEnv) {\n if (!profile) {\n return []\n }\n const results = await fetchURNs(profile.avatar.wearables, env)\n return results.filter((result) => !isEmote(result))\n}\n\nasync function fetchURNs(urns: string[], env: PreviewEnv) {\n if (urns.length === 0) {\n return []\n }\n return peerApi.fetchWearables(urns, env)\n}\n\nasync function fetchURLs(urls: string[]) {\n if (urls.length === 0) {\n return []\n }\n const promises = urls.map((url) =>\n fetch(url)\n .then((resp) => resp.json())\n .catch()\n )\n const results = await Promise.all(promises)\n return results.filter(isWearable)\n}\n\nexport const profileMemo = createMemo<Avatar | null>()\nasync function fetchProfile(profile: string, env: PreviewEnv) {\n return profileMemo.memo(profile, async () => {\n if (profile === DEFAULT_PROFILE) {\n return null\n }\n const resp = await peerApi\n .fetchProfile(profile, env)\n .then((profile) => (profile && profile.avatars.length > 0 ? profile.avatars[0] : null))\n .catch((error: Error) => console.log(`Failed to load profile=\"${profile}\"`, error))\n return resp || null\n })\n}\n\nasync function fetchWearableFromContract(options: {\n contractAddress: string\n itemId?: string | null\n tokenId?: string | null\n env: PreviewEnv\n}) {\n const { contractAddress, itemId, tokenId, env } = options\n if (!itemId && !tokenId) {\n throw new Error(`You need to provide an itemId or a tokenId`)\n }\n\n const network = env === PreviewEnv.PROD ? 'matic' : 'mumbai'\n let urn = `urn:decentraland:${network}:collections-v2:${contractAddress}:${itemId}`\n if (!itemId && !tokenId) {\n throw new Error(`You must provide either tokenId or itemId`)\n } else if (!itemId && tokenId) {\n const nft = await nftApi.fetchNFT(contractAddress, tokenId, env)\n urn =\n nft.network !== Network.ETHEREUM\n ? `urn:decentraland:${network}:collections-v2:${contractAddress}:${nft.itemId}`\n : nft.image.split('contents/')[1].split('/thumbnail')[0] // since the Ethereum collections have a different URN, we extract it from the image path\n }\n return fetchWearable(urn, env)\n}\n\nasync function fetchAvatar(\n profile: Avatar | null,\n urns: string[],\n urls: string[],\n base64s: string[],\n bodyShape: BodyShape,\n includeDefaultWearables: boolean,\n includeFacialFeatures: boolean,\n env: PreviewEnv\n) {\n // gather wearables from profile, urns, urls and base64s\n let wearables = [\n ...(await fetchProfileWearables(profile, env)),\n ...(await fetchURNs([bodyShape, ...urns], env)),\n ...(await fetchURLs(urls)),\n ...base64s.map(parseWearable),\n ]\n // filter out wearables that don't have a representation for the body shape\n wearables = wearables.filter((wearable) => hasRepresentation(wearable, bodyShape))\n // fill default categories\n const defaultWearableUrns: string[] = []\n const categories =\n includeDefaultWearables && includeFacialFeatures\n ? getDefaultCategories()\n : includeDefaultWearables\n ? getNonFacialFeatureCategories()\n : includeFacialFeatures\n ? getFacialFeatureCategories()\n : []\n for (const category of categories) {\n const wearable = getWearableByCategory(wearables, category)\n if (!wearable) {\n const urn = getDefaultWearableUrn(category, bodyShape)\n if (urn) {\n defaultWearableUrns.push(urn)\n } else {\n throw new Error(`Could not get default URN for category=\"${category}\"`)\n }\n }\n }\n if (defaultWearableUrns.length > 0) {\n const defaultWearables = await fetchURNs(defaultWearableUrns, env)\n wearables = [...wearables, ...defaultWearables]\n }\n\n return wearables\n}\n\nexport async function createConfig(options: PreviewOptions = {}): Promise<PreviewConfig> {\n const { contractAddress, tokenId, itemId } = options\n const env = options.env || PreviewEnv.PROD\n\n // load wearable to preview\n let wearablePromise: Promise<WearableDefinition | void> = Promise.resolve()\n if (contractAddress) {\n wearablePromise = fetchWearableFromContract({ contractAddress, tokenId, itemId, env })\n }\n\n // load profile\n const profilePromise = options.profile ? fetchProfile(options.profile, env) : Promise.resolve(null)\n\n // await promises\n const [wearable, profile] = await Promise.all([wearablePromise, profilePromise] as const)\n\n // use body shape from options, default to the profile one, if no profile default to the wearable bodyShape, if none, default to male\n const bodyShape =\n options.bodyShape ||\n (profile && (profile.avatar.bodyShape as BodyShape)) ||\n (wearable ? getBodyShape(wearable!) : BodyShape.MALE)\n\n // use colors from options, default to profile, if none, use default values\n const skin = formatHex(options.skin || (profile && colorToHex(profile.avatar.skin.color)) || 'cc9b76')\n const hair = formatHex(options.hair || (profile && colorToHex(profile.avatar.hair.color)) || '000000')\n const eyes = formatHex(options.eyes || (profile && colorToHex(profile.avatar.eyes.color)) || '000000')\n\n // merge urns from profile (if any) and extra urns\n const urns = [...(options.urns || [])]\n\n // urls to load wearables from\n const urls = options.urls || []\n\n // wearables passed as base64\n const base64s = options.base64s || []\n\n let wearables: WearableDefinition[] = []\n let zoom = 1.75\n let type = PreviewType.WEARABLE\n let background: PreviewConfig['background'] = {\n color: '#4b4852', // grey\n transparent: options.disableBackground === true,\n }\n\n // if loading multiple wearables (either from URNs or URLs), or if wearable is emote, render full avatar\n if (urns.length > 0 || urls.length > 0 || base64s.length > 0 || (wearable && isEmote(wearable)) || options.profile) {\n type = PreviewType.AVATAR\n wearables = await fetchAvatar(\n profile,\n urns,\n urls,\n base64s,\n bodyShape,\n !options.disableDefaultWearables,\n !options.disableFace,\n env\n )\n }\n\n if (wearable) {\n zoom = wearables.length > 0 ? zoom : getZoom(wearable)\n const representation = getRepresentationOrDefault(wearable)\n if (isTexture(representation) && type !== PreviewType.AVATAR) {\n type = PreviewType.TEXTURE\n }\n background = {\n ...background,\n image: wearable.thumbnail,\n }\n if (isStandard(wearable)) {\n const color = Rarity.getColor(wearable.rarity)\n background = {\n ...background,\n image: wearable.thumbnail,\n color,\n }\n }\n }\n\n let emote = PreviewEmote.IDLE\n if (options.emote && Object.values(PreviewEmote).includes(options.emote)) {\n emote = options.emote\n }\n\n let camera = PreviewCamera.INTERACTIVE\n if (options.camera && Object.values(PreviewCamera).includes(options.camera)) {\n camera = options.camera\n }\n const autoRotateSpeed =\n typeof options.autoRotateSpeed === 'number' && !isNaN(options.autoRotateSpeed) ? options.autoRotateSpeed : 0.2\n const centerBoundingBox = !options.disableAutoCenter\n\n // wheel options\n let wheelZoom = 1\n let wheelPrecision = 100\n let wheelStart = 50\n if (isNumber(options.wheelZoom)) {\n wheelZoom = Math.max(options.wheelZoom!, 1) // min value 1\n }\n if (isNumber(options.wheelPrecision)) {\n wheelPrecision = Math.max(options.wheelPrecision!, 1) // min value 1\n }\n if (isNumber(options.wheelStart)) {\n wheelStart = 100 - Math.min(Math.max(options.wheelStart!, 0), 100) // value between 0 and 100\n }\n\n // custom background color\n if (options.background) {\n background.color = options.background\n }\n\n return {\n wearable: wearable ?? (options.blob ? fromBlob(options.blob) : undefined),\n wearables,\n bodyShape,\n skin,\n hair,\n eyes,\n type,\n background,\n face: options.disableFace !== false,\n emote,\n camera,\n autoRotateSpeed: options.disableAutoRotate ? 0 : autoRotateSpeed,\n centerBoundingBox,\n offsetX: options.offsetX || 0,\n offsetY: options.offsetY || 0,\n offsetZ: options.offsetZ || 0,\n zoom: typeof options.zoom === 'number' ? options.zoom / 35 : zoom,\n wheelZoom,\n wheelPrecision,\n wheelStart,\n }\n}\n\nfunction isNumber(value: number | null | undefined): boolean {\n return typeof value === 'number' && !isNaN(value)\n}\n\nfunction fromBlob(blob: WearableWithBlobs): WearableDefinition {\n return {\n ...blob,\n data: {\n ...blob.data,\n representations: blob.data.representations.map((representation) => ({\n ...representation,\n contents: representation.contents.map((content) => ({\n key: content.key,\n url: URL.createObjectURL(content.blob),\n })),\n })),\n },\n }\n}\n","interface IMemo<T> {\n memo: (key: string, fn: (...args: any[]) => Promise<T>, ...args: any[]) => Promise<T>\n reset: () => void\n}\n\nexport function createMemo<T>(): IMemo<T> {\n const cache: Record<string, Promise<T>> = {}\n return {\n memo: async (key, fn, ...args) => {\n const exists = key in cache\n if (!exists) {\n cache[key] = fn(...args)\n }\n return cache[key]\n },\n reset: () => {\n for (const key in cache) {\n delete cache[key]\n }\n },\n }\n}\n","import { useEffect, useState } from 'react'\n\n/* \n ids and nonces are used to identity the order on which async functions are called, \n to avoid race conditions and always keep the value of the last function call, \n regardless of the order in which they resolve \n*/\nconst nonces: Record<string, number> = {}\nfunction isValid(id: string, nonce: number) {\n return nonce === nonces[id]\n}\n\nexport function useAsync<T>(id: string, asyncFunction: (...args: any[]) => Promise<T>, deps: React.DependencyList = []) {\n // initialize state\n const [isLoading, setIsLoading] = useState(false)\n const [result, setResult] = useState<T | null>(null)\n const [error, setError] = useState('')\n\n // initialize nonce for this id\n if (typeof nonces[id] === 'undefined') {\n nonces[id] = 0\n }\n\n // run async function\n useEffect(() => {\n const nonce = ++nonces[id]\n setIsLoading(true)\n asyncFunction()\n .then((result) => {\n if (isValid(id, nonce)) {\n setResult(result)\n }\n })\n .catch((error) => {\n if (isValid(id, nonce)) {\n setError(error.message)\n }\n })\n .finally(() => {\n if (isValid(id, nonce)) {\n setIsLoading(false)\n }\n })\n }, deps) // eslint-disable-line\n\n return [result, isLoading, error] as const\n}\n","import { useCallback, useEffect } from 'react'\n\nexport const useMessage = (handler: (event: MessageEvent) => void) => {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const callback = useCallback(handler, [])\n // receive message from parent window to update options\n useEffect(() => {\n function handleMessage(event: MessageEvent) {\n callback(event)\n }\n window.addEventListener('message', handleMessage)\n return () => {\n window.removeEventListener('message', handleMessage)\n }\n }, [callback])\n}\n","import { useMemo, useState } from 'react'\nimport { useOverrides } from './useOverrides'\n\nimport { BodyShape, PreviewCamera, PreviewEmote, PreviewEnv, PreviewOptions } from '@dcl/schemas'\nimport { parseZoom } from '../lib/zoom'\n\nexport const useOptions = () => {\n // get options from url params\n const [search] = useState(window.location.search.toString())\n const options = useMemo<PreviewOptions>(() => {\n const params = new URLSearchParams(search)\n const autoRotateSpeedParam = params.get('autoRotateSpeed') as string | null\n const offsetXParam = params.get('offsetX') as string | null\n const offsetYParam = params.get('offsetY') as string | null\n const offsetZParam = params.get('offsetZ') as string | null\n const wheelZoomParam = params.get('wheelZoom') as string | null\n const wheelPrecisionParam = params.get('wheelPrecision') as string | null\n const wheelStartParam = params.get('wheelStart') as string | null\n const bodyShapeParam = params.get('bodyShape')\n\n const transparentBackground = params.has('transparentBackground')\n if (transparentBackground) {\n console.warn(\n `Deprecated: you are using the query param \"transparentBackground\" that has been deprecated in favor of \"disableBackground\". Please switch to the new query param since in the future this will not be supported.`\n )\n }\n const centerBoundingBox = params.get('centerBoundingBox') !== 'false'\n if (transparentBackground) {\n console.warn(\n `Deprecated: you are using the query param \"transparentBackground\" that has been deprecated in favor of \"disableBackground\". Please switch to the new query param since in the future this will not be supported.`\n )\n }\n\n const options: PreviewOptions = {\n contractAddress: params.get('contract')!,\n tokenId: params.get('token'),\n itemId: params.get('item'),\n skin: params.get('skin'),\n hair: params.get('hair'),\n eyes: params.get('eyes'),\n emote: params.get('emote') as PreviewEmote | null,\n camera: params.get('camera') as PreviewCamera | null,\n background: params.get('background'),\n autoRotateSpeed: autoRotateSpeedParam ? parseFloat(autoRotateSpeedParam) : null,\n offsetX: offsetXParam ? parseFloat(offsetXParam) : null,\n offsetY: offsetYParam ? parseFloat(offsetYParam) : null,\n offsetZ: offsetZParam ? parseFloat(offsetZParam) : null,\n wheelZoom: wheelZoomParam ? parseFloat(wheelZoomParam) : null,\n wheelPrecision: wheelPrecisionParam ? parseFloat(wheelPrecisionParam) : null,\n wheelStart: wheelStartParam ? parseFloat(wheelStartParam) : null,\n zoom: parseZoom(params.get('zoom')),\n bodyShape:\n bodyShapeParam === 'female' || bodyShapeParam === BodyShape.FEMALE\n ? BodyShape.FEMALE\n : bodyShapeParam === 'male' || bodyShapeParam === BodyShape.MALE\n ? BodyShape.MALE\n : null,\n urns: params.getAll('urn'),\n urls: params.getAll('url'),\n base64s: params.getAll('base64'),\n profile: params.get('profile'),\n disableBackground: params.has('disableBackground') || transparentBackground,\n disableAutoCenter: params.has('disableAutoCenter') || !centerBoundingBox,\n disableAutoRotate: params.has('disableAutoRotate') || !centerBoundingBox,\n disableFace: params.has('disableFace'),\n disableDefaultWearables: params.has('disableDefaultWearables'),\n env: Object.values(PreviewEnv)\n .filter((value): value is PreviewEnv => typeof value === 'string')\n .reduce((selected, value) => (value === params.get('env') ? value : selected), PreviewEnv.PROD),\n }\n return options\n }, [search])\n\n // apply overrides\n const overrides = useOverrides()\n const optionsWithOverrides = useMemo(\n () => ({\n ...options,\n ...overrides,\n }),\n [options, overrides]\n )\n\n // return options with overrides applied (if any)\n return optionsWithOverrides\n}\n","import equal from 'deep-equal'\nimport { PreviewMessagePayload, PreviewMessageType, PreviewOptions } from '@dcl/schemas'\nimport { useMessage } from './useMessage'\nimport { useState } from 'react'\n\nexport const useOverrides = () => {\n const [overrides, setOverrides] = useState<PreviewOptions>({})\n\n // receive message from parent window to update options\n useMessage((event) => {\n if (\n event.data &&\n event.data.type === PreviewMessageType.UPDATE &&\n typeof event.data.payload === 'object' &&\n typeof event.data.payload.options === 'object'\n ) {\n const { options } = event.data.payload as PreviewMessagePayload<PreviewMessageType.UPDATE>\n if (!equal(overrides, options)) {\n setOverrides(options)\n }\n }\n })\n\n return overrides\n}\n","import { createConfig } from '../lib/config'\nimport { useAsync } from './useAsync'\nimport { useOptions } from './useOptions'\n\nexport function useConfig() {\n const options = useOptions()\n const [config, isLoading, error] = useAsync('useConfig', () => createConfig(options), [options])\n return [config, isLoading, error] as const\n}\n","import { useRef } from 'react'\nimport { IPreviewController, PreviewMessageType, sendMessage } from '@dcl/schemas'\nimport { useMessage } from './useMessage'\n\nfunction sendResult(id: string, result: any) {\n sendMessage(window.parent, PreviewMessageType.CONTROLLER_RESPONSE, { id, ok: true, result })\n}\n\nfunction sendError(id: string, error: string) {\n sendMessage(window.parent, PreviewMessageType.CONTROLLER_RESPONSE, { id, ok: false, error })\n}\n\nexport const useController = () => {\n const controllerRef = useRef<IPreviewController | undefined>()\n\n useMessage(async (event: MessageEvent) => {\n if (\n event.data &&\n event.data.type === PreviewMessageType.CONTROLLER_REQUEST &&\n typeof event.data.payload === 'object' &&\n typeof event.data.payload.id === 'string' &&\n typeof event.data.payload.namespace === 'string' &&\n typeof event.data.payload.method === 'string' &&\n typeof event.data.payload.params === 'object' &&\n Array.isArray(event.data.payload.params)\n ) {\n const { id, method, namespace, params } = event.data.payload as {\n id: string\n namespace: string\n method: string\n params: any[]\n }\n if (controllerRef.current) {\n if (namespace in controllerRef.current) {\n if (method in controllerRef.current[namespace as keyof IPreviewController]) {\n try {\n const controller = controllerRef.current[namespace as keyof IPreviewController] as any\n const fn = controller[method] as Function\n const result = await fn.apply(null, params)\n sendResult(id, result)\n } catch (error: any) {\n sendError(id, error.message)\n }\n } else {\n sendError(id, 'Invalid method')\n }\n } else {\n sendError(id, 'Invalid namespace')\n }\n } else {\n sendError(id, 'Controller not ready')\n }\n }\n })\n\n return controllerRef\n}\n","import { WearableCategory, WearableDefinition } from '@dcl/schemas'\nimport { getRepresentationOrDefault, isTexture } from '../representation'\nimport { Asset } from './scene'\n\nexport function isCategory(category: WearableCategory) {\n return (wearable: WearableDefinition) => wearable.data.category === category\n}\n\nexport function isHidden(category: WearableCategory) {\n return (asset: Asset) => {\n return (\n asset.wearable.data.category === category ||\n (asset.wearable.data.hides || []).includes(category) ||\n (asset.wearable.data.replaces || []).includes(category)\n )\n }\n}\n\nexport function isSuccesful(result: void | Asset): result is Asset {\n return !!result\n}\n\nexport function isModel(wearable: WearableDefinition): boolean {\n const representation = getRepresentationOrDefault(wearable)\n return !isTexture(representation)\n}\n\nexport function isFacialFeature(wearable: WearableDefinition): boolean {\n return !isModel(wearable)\n}\n","import { WearableCategory } from '@dcl/schemas'\nimport { Asset } from './scene'\nimport { isHidden } from './utils'\n\nexport function getBodyShape(assets: Asset[]) {\n const bodyShape = assets.find((part) => part.wearable.data.category === WearableCategory.BODY_SHAPE)\n if (!bodyShape) {\n return null\n }\n\n // hide base body parts if necessary\n const hasSkin = assets.some((part) => part.wearable.data.category === WearableCategory.SKIN)\n const hideUpperBody = hasSkin || assets.some(isHidden(WearableCategory.UPPER_BODY))\n const hideLowerBody = hasSkin || assets.some(isHidden(WearableCategory.LOWER_BODY))\n const hideFeet = hasSkin || assets.some(isHidden(WearableCategory.FEET))\n const hideHead = hasSkin || assets.some(isHidden(WearableCategory.HEAD))\n\n for (const mesh of bodyShape.container.meshes) {\n const name = mesh.name.toLowerCase()\n if (name.endsWith('ubody_basemesh') && hideUpperBody) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('lbody_basemesh') && hideLowerBody) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('feet_basemesh') && hideFeet) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('head') && hideHead) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('head_basemesh') && hideHead) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('mask_eyes') && hideHead) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('mask_eyebrows') && hideHead) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('mask_mouth') && hideHead) {\n mesh.setEnabled(false)\n }\n }\n\n return bodyShape\n}\n","import { PreviewConfig, WearableCategory, WearableDefinition } from '@dcl/schemas'\nimport { hasRepresentation } from '../representation'\nimport { isEmote } from '../emote'\n\nconst categoriesHiddenBySkin = [\n WearableCategory.HELMET,\n WearableCategory.HAIR,\n WearableCategory.FACIAL_HAIR,\n WearableCategory.MOUTH,\n WearableCategory.EYEBROWS,\n WearableCategory.EYES,\n WearableCategory.UPPER_BODY,\n WearableCategory.LOWER_BODY,\n WearableCategory.FEET,\n]\n\nexport function getSlots(config: PreviewConfig) {\n const slots = new Map<WearableCategory, WearableDefinition>()\n\n let wearables: WearableDefinition[] = config.wearables.filter((wearable) => !isEmote(wearable)) // remove emotes if any\n\n // remove other wearables that hide the equipped wearable\n if (config.wearable && !isEmote(config.wearable)) {\n wearables = config.wearables.filter((wearable) => {\n if (config.wearable) {\n const { category, hides, replaces } = config.wearable.data\n if (wearable.data.category === 'skin') {\n if (categoriesHiddenBySkin.includes(category)) {\n return false\n }\n if (hides && hides.includes(WearableCategory.HEAD)) {\n return false\n }\n if (replaces && replaces.includes(WearableCategory.HEAD)) {\n return false\n }\n }\n if (wearable.data.hides && wearable.data.hides.includes(category)) {\n return false\n }\n if (wearable.data.replaces && wearable.data.replaces.includes(category)) {\n return false\n }\n }\n return true\n })\n // add the equipped wearable at the end\n wearables.push(config.wearable)\n }\n\n // arrange wearbles in slots\n for (const wearable of wearables) {\n const slot = wearable.data.category\n if (hasRepresentation(wearable, config.bodyShape)) {\n slots.set(slot, wearable)\n }\n }\n let hasSkin = false\n // grab only the wearables that ended up in the map, and process in reverse order (last wearables can hide/replace the first ones)\n wearables = wearables.filter((wearable) => slots.get(wearable.data.category) === wearable).reverse()\n const alreadyRemoved = new Set<string>()\n for (const wearable of wearables) {\n const category = wearable.data.category\n if (alreadyRemoved.has(category)) {\n continue\n }\n const replaced = wearable.data.replaces || []\n const hidden = wearable.data.hides || []\n const toRemove = Array.from(new Set([...replaced, ...hidden]))\n for (const slot of toRemove) {\n if (slot !== category) {\n slots.delete(slot)\n alreadyRemoved.add(slot)\n }\n }\n if (wearable.data.category === WearableCategory.SKIN) {\n hasSkin = true\n }\n }\n // skins hide all the following slots\n if (hasSkin) {\n for (const category of categoriesHiddenBySkin) {\n slots.delete(category)\n }\n }\n\n return slots\n}\n","import { ArcRotateCamera } from '@babylonjs/core'\nimport { PreviewConfig } from '@dcl/schemas'\n\nexport function startAutoRotateBehavior(camera: ArcRotateCamera, config: PreviewConfig) {\n if (camera) {\n camera.useAutoRotationBehavior = true\n if (camera.autoRotationBehavior) {\n camera.autoRotationBehavior.idleRotationSpeed = config.autoRotateSpeed\n }\n }\n}\n","export function isIOs() {\n return ['iPad Simulator', 'iPhone Simulator', 'iPod Simulator', 'iPad', 'iPhone', 'iPod'].includes(navigator.platform)\n}\n","import { Camera, Engine, Scene, Tools } from '@babylonjs/core'\nimport { ISceneController } from '@dcl/schemas'\n\n// These are textures created by the preview itself so we don't count them\nconst ignoreTextureList = [\n // Ambient color\n 'data:EnvironmentBRDFTexture0',\n // Glow layer\n 'GlowLayerBlurRTT',\n 'GlowLayerBlurRTT2',\n 'HighlightLayerMainRTT',\n]\n\nexport function createSceneController(engine: Engine, scene: Scene, camera: Camera): ISceneController {\n async function getScreenshot(width: number, height: number) {\n return Tools.CreateScreenshotUsingRenderTargetAsync(engine, camera, { width, height }, undefined, undefined, true)\n }\n\n async function getMetrics() {\n const triangles = scene.meshes.reduce((total, mesh) => {\n return total + Math.floor(mesh.getTotalIndices() / 3)\n }, 0)\n const materials = scene.materials.length\n const meshes = scene.meshes.length\n const textures = scene.textures.filter(\n (texture) => texture.name && !ignoreTextureList.includes(texture.name)\n ).length\n\n return {\n triangles,\n materials,\n meshes,\n textures,\n bodies: meshes,\n entities: 1,\n }\n }\n\n return {\n getScreenshot,\n getMetrics,\n }\n}\n","import {\n ArcRotateCamera,\n AssetContainer,\n BoundingInfo,\n Camera,\n Color3,\n Color4,\n DirectionalLight,\n Engine,\n GlowLayer,\n HemisphericLight,\n Mesh,\n Scene,\n SceneLoader,\n SpotLight,\n Texture,\n TextureAssetTask,\n Vector3,\n} from '@babylonjs/core'\nimport '@babylonjs/loaders'\nimport {\n BodyShape,\n ISceneController,\n PreviewCamera,\n PreviewConfig,\n PreviewType,\n WearableDefinition,\n} from '@dcl/schemas'\nimport { hexToColor } from '../color'\nimport { isIOs } from '../env'\nimport { getRepresentation } from '../representation'\nimport { createSceneController } from '../scene'\nimport { startAutoRotateBehavior } from './camera'\n\n// needed for debugging\nconst showInspector = process.env.REACT_APP_DEBUG\nif (showInspector) {\n require('@babylonjs/inspector')\n}\n\nexport type Asset = {\n container: AssetContainer\n wearable: WearableDefinition\n}\n\n/**\n * It refreshes the bounding info of a mesh, taking into account all of its children\n * @param parent\n */\nfunction refreshBoundingInfo(parent: Mesh) {\n const children = parent.getChildren().filter((mesh) => mesh.id !== '__root__')\n if (children.length > 0) {\n const child = children[0] as Mesh\n // child.showBoundingBox = true\n let boundingInfo = child.getBoundingInfo()\n\n let min = boundingInfo.boundingBox.minimumWorld.add(child.position)\n let max = boundingInfo.boundingBox.maximumWorld.add(child.position)\n\n for (let i = 1; i < children.length; i++) {\n const child = children[i] as Mesh\n // child.showBoundingBox = true\n boundingInfo = child.getBoundingInfo()\n const siblingMin = boundingInfo.boundingBox.minimumWorld.add(child.position)\n const siblingMax = boundingInfo.boundingBox.maximumWorld.add(child.position)\n\n min = Vector3.Minimize(min, siblingMin)\n max = Vector3.Maximize(max, siblingMax)\n }\n\n parent.setBoundingInfo(new BoundingInfo(min, max))\n }\n}\n\n/**\n * Creates a Scene with the right camera, light and effects\n * @param canvas\n * @param zoom\n * @returns\n */\nlet engine: Engine\nexport async function createScene(\n canvas: HTMLCanvasElement,\n config: PreviewConfig\n): Promise<[Scene, ISceneController]> {\n // Create engine\n if (engine) {\n engine.dispose()\n }\n engine = new Engine(canvas, true, {\n preserveDrawingBuffer: true,\n stencil: true,\n antialias: true,\n })\n\n // Setup scene\n const root = new Scene(engine)\n root.autoClear = true\n root.clearColor = config.background.transparent\n ? new Color4(0, 0, 0, 0)\n : hexToColor(config.background.color).toColor4()\n root.ambientColor = new Color3(1, 1, 1)\n root.preventDefaultOnPointerDown = false\n\n // Setup Camera\n const camera = new ArcRotateCamera('camera', 0, 0, 0, new Vector3(0, 0, 0), root)\n camera.mode = Camera.PERSPECTIVE_CAMERA\n switch (config.type) {\n case PreviewType.WEARABLE: {\n startAutoRotateBehavior(camera, config)\n camera.position = new Vector3(-2, 2, 2)\n break\n }\n case PreviewType.AVATAR: {\n camera.position = new Vector3(0, 1, 3.5)\n break\n }\n }\n if (config.camera === PreviewCamera.INTERACTIVE) {\n camera.attachControl(canvas, true)\n }\n\n const offset = new Vector3(config.offsetX, config.offsetY, config.offsetZ)\n camera.position.addInPlace(offset)\n camera.setTarget(offset)\n\n // compute camera radius\n camera.lowerRadiusLimit = camera.radius / config.zoom\n camera.upperRadiusLimit = camera.lowerRadiusLimit * config.wheelZoom\n camera.radius =\n camera.lowerRadiusLimit + ((camera.upperRadiusLimit - camera.lowerRadiusLimit) * config.wheelStart) / 100\n camera.wheelPrecision = config.wheelPrecision\n\n // Setup lights\n if (config.type === PreviewType.WEARABLE) {\n const directional = new DirectionalLight('directional', new Vector3(0, 0, 1), root)\n directional.intensity = 1\n const spot = new SpotLight('spot', new Vector3(-2, 2, 2), new Vector3(2, -2, -2), Math.PI / 2, 1000, root)\n spot.intensity = 1\n }\n const top = new HemisphericLight('top', new Vector3(0, -1, 0), root)\n top.intensity = 1.0\n const bottom = new HemisphericLight('bottom', new Vector3(0, 1, 0), root)\n bottom.intensity = 1.0\n\n // Setup effects\n // Avoid ios since the glow effect breaks on safari: https://github.com/decentraland/wearable-preview/issues/11\n if (!isIOs()) {\n const glowLayer = new GlowLayer('glow', root)\n glowLayer.intensity = 2.0\n }\n\n // Render loop\n engine.runRenderLoop(() => {\n root.render()\n })\n\n // Dev tools\n if (showInspector) {\n root.debugLayer.show({ showExplorer: true, embedMode: true })\n }\n\n return [root, createSceneController(engine, root, camera)]\n}\n\nexport async function loadMask(\n scene: Scene,\n wearable: WearableDefinition,\n bodyShape: BodyShape\n): Promise<Texture | null> {\n const name = wearable.id\n const representation = getRepresentation(wearable, bodyShape)\n const file = representation.contents.find((file) => file.key.toLowerCase().endsWith('_mask.png'))\n if (file) {\n return new Promise((resolve, reject) => {\n const task = new TextureAssetTask(name, file.url, true, false)\n task.onError = () => reject(task.errorObject)\n task.onSuccess = () => {\n resolve(task.texture)\n }\n task.run(scene, () => resolve(task.texture), reject)\n })\n }\n return null\n}\n\nexport async function loadTexture(\n scene: Scene,\n wearable: WearableDefinition,\n bodyShape: BodyShape\n): Promise<Texture | null> {\n const name = wearable.id\n const representation = getRepresentation(wearable, bodyShape)\n const file = representation.contents.find(\n (file) => file.key.toLowerCase().endsWith('.png') && !file.key.toLowerCase().endsWith('_mask.png')\n )\n if (file) {\n return new Promise((resolve, reject) => {\n const task = new TextureAssetTask(name, file.url, true, false)\n task.onError = () => reject(task.errorObject)\n task.onSuccess = () => {\n resolve(task.texture)\n }\n task.run(scene, () => resolve(task.texture), reject)\n })\n }\n return null\n}\n\nexport async function loadAssetContainer(scene: Scene, url: string) {\n const load = async (url: string, extension: string) =>\n SceneLoader.LoadAssetContainerAsync(url, '', scene, null, extension)\n // try with GLB, if it fails try with GLTF\n try {\n return await load(url, '.glb')\n } catch (error) {\n return await load(url, '.gltf')\n }\n}\n\n/**\n * Center and resizes a Scene to fit in the camera view\n * @param scene\n */\n\nexport function center(scene: Scene) {\n // Setup parent\n const parent = new Mesh('parent', scene)\n for (const mesh of scene.meshes) {\n if (mesh !== parent) {\n mesh.setParent(parent)\n }\n }\n\n // resize and center\n refreshBoundingInfo(parent)\n const bounds = parent.getBoundingInfo().boundingBox.extendSize\n const size = bounds.length()\n const scale = new Vector3(1 / size, 1 / size, 1 / size)\n parent.scaling = scale\n const center = parent.getBoundingInfo().boundingBox.center.multiply(scale)\n parent.position.subtractInPlace(center)\n}\n","import { AnimationGroup, ArcRotateCamera, AssetContainer, Scene, TransformNode } from '@babylonjs/core'\nimport { IEmoteController, PreviewCamera, PreviewConfig, PreviewEmote, WearableDefinition } from '@dcl/schemas'\nimport { isEmote } from '../emote'\nimport { getRepresentation } from '../representation'\nimport { startAutoRotateBehavior } from './camera'\nimport { Asset, loadAssetContainer } from './scene'\n\nconst loopedEmotes = [PreviewEmote.IDLE, PreviewEmote.MONEY, PreviewEmote.CLAP]\n\nfunction isLooped(emote: PreviewEmote) {\n return loopedEmotes.includes(emote)\n}\n\nexport function buildEmoteUrl(emote: PreviewEmote) {\n let baseUrl = process.env.PUBLIC_URL || ''\n if (!baseUrl.endsWith('/')) {\n baseUrl += '/'\n }\n const path = `./emotes/${emote}.glb`\n const url = baseUrl.startsWith('http') ? new URL(path, baseUrl).href : path\n return url\n}\n\nexport async function loadEmoteFromUrl(scene: Scene, url: string) {\n const container = await loadAssetContainer(scene, url)\n if (container.animationGroups.length === 0) {\n throw new Error(`No animation groups found for emote with url=${url}`)\n }\n return container\n}\n\nexport async function loadEmoteFromWearable(scene: Scene, wearable: WearableDefinition, config: PreviewConfig) {\n const representation = getRepresentation(wearable, config.bodyShape)\n const content = representation.contents.find((content) => content.key === representation.mainFile)\n if (!content) {\n throw new Error(\n `Could not find a valid content in representation for wearable=${wearable.id} and bodyShape=${config.bodyShape}`\n )\n }\n return loadEmoteFromUrl(scene, content.url)\n}\n\nexport async function playEmote(scene: Scene, assets: Asset[], config: PreviewConfig) {\n // load asset container for emote\n let container: AssetContainer | undefined\n let loop = isLooped(config.emote)\n // if target wearable is emote, play that one\n if (config.wearable && isEmote(config.wearable)) {\n try {\n container = await loadEmoteFromWearable(scene, config.wearable, config)\n loop = !!config.wearable.emoteDataV0?.loop\n } catch (error) {\n console.warn(`Could not load emote=${config.wearable.id}`)\n }\n } else if (config.wearables.some(isEmote)) {\n // if there's some emote in the wearables list, play the last one\n const emote = config.wearables.reverse().find(isEmote)!\n container = await loadEmoteFromWearable(scene, emote, config)\n loop = !!emote.emoteDataV0?.loop\n }\n if (!container) {\n const emoteUrl = buildEmoteUrl(config.emote)\n container = await loadEmoteFromUrl(scene, emoteUrl)\n }\n\n const emoteAnimationGroup = new AnimationGroup('emote', scene)\n\n // start camera rotation after animation ends\n function onAnimationEnd() {\n if (config.camera !== PreviewCamera.STATIC) {\n const camera = scene.cameras[0] as ArcRotateCamera\n startAutoRotateBehavior(camera, config)\n }\n if (loop) {\n emoteAnimationGroup.play(true) // keep playing animation in loop\n }\n }\n\n // play emote animation\n try {\n for (const asset of assets) {\n // store all the transform nodes in a map, there can be repeated node ids\n // if a wearable has multiple representations, so for each id we keep an array of nodes\n const nodes = asset.container.transformNodes.reduce((map, node) => {\n const list = map.get(node.id) || []\n list.push(node)\n return map.set(node.id, list)\n }, new Map<string, TransformNode[]>())\n // apply each targeted animation from the emote asset container to the transform nodes of all the wearables\n if (container.animationGroups.length > 0) {\n for (const targetedAnimation of container.animationGroups[0].targetedAnimations) {\n const animation = targetedAnimation.animation\n const target = targetedAnimation.target as TransformNode\n const newTargets = nodes.get(target.id)\n if (newTargets && newTargets.length > 0) {\n for (const newTarget of newTargets) {\n emoteAnimationGroup.addTargetedAnimation(animation, newTarget)\n }\n }\n }\n } else {\n throw new Error(`No animationGroups found`)\n }\n }\n // play animation group and apply\n emoteAnimationGroup.onAnimationGroupEndObservable.addOnce(onAnimationEnd)\n const controller = createController(emoteAnimationGroup, loop)\n\n if (config.camera === PreviewCamera.STATIC) {\n controller.stop() // we call the stop here to freeze the animation at frame 0, otherwise the avatar would be on T-pose\n } else {\n controller.play()\n }\n\n return controller\n } catch (error) {\n console.warn(`Could not play emote=${config.emote}`, error)\n }\n}\n\nfunction createController(animationGroup: AnimationGroup, loop: boolean): IEmoteController {\n let startFrom = 0\n let hasPlayed = false\n\n async function getLength() {\n return animationGroup.to\n }\n\n async function isPlaying() {\n return animationGroup.isPlaying\n }\n\n async function goTo(seconds: number) {\n if (await isPlaying()) {\n animationGroup.pause()\n goTo(seconds)\n window.requestAnimationFrame(play)\n } else {\n // for some reason the start() method doesn't work as expected if playing, so I need to stop it first\n animationGroup.stop()\n // I had to use this hack because the native goToFrame would not work as expected :/\n animationGroup.start(false, 1, seconds, seconds, false)\n startFrom = seconds\n }\n }\n\n async function play() {\n if (!(await isPlaying())) {\n if (startFrom) {\n animationGroup.start(loop, 1, startFrom, await getLength(), false)\n startFrom = 0\n } else {\n animationGroup.play(loop)\n }\n hasPlayed = true\n }\n }\n\n async function pause() {\n if (await isPlaying()) {\n animationGroup.pause()\n }\n }\n\n async function stop() {\n if (hasPlayed) {\n goTo(0)\n window.requestAnimationFrame(pause)\n } else {\n play()\n window.requestAnimationFrame(stop)\n }\n }\n\n return {\n getLength,\n isPlaying,\n goTo,\n play,\n pause,\n stop,\n }\n}\n","import { AbstractMesh, Color3, Orientation, PBRMaterial, Scene, StandardMaterial, Texture } from '@babylonjs/core'\nimport { PreviewConfig, BodyShape, WearableCategory, WearableDefinition } from '@dcl/schemas'\nimport { hexToColor } from '../color'\nimport { Asset, loadMask, loadTexture } from './scene'\nimport { isCategory } from './utils'\n\nfunction getCategoryLoader(scene: Scene, features: WearableDefinition[], bodyShape: BodyShape) {\n return async (category: WearableCategory) => {\n const feature = features.find(isCategory(category))\n if (feature) {\n return Promise.all([loadTexture(scene, feature, bodyShape), loadMask(scene, feature, bodyShape)]) as Promise<\n [Texture | null, Texture | null]\n >\n }\n return [null, null] as [null, null]\n }\n}\n\nexport async function getFacialFeatures(scene: Scene, features: WearableDefinition[], bodyShape: BodyShape) {\n const loadCategory = getCategoryLoader(scene, features, bodyShape)\n const [eyes, eyebrows, mouth] = await Promise.all([\n loadCategory(WearableCategory.EYES),\n loadCategory(WearableCategory.EYEBROWS),\n loadCategory(WearableCategory.MOUTH),\n ])\n return { eyes, eyebrows, mouth }\n}\n\nexport async function applyFacialFeatures(\n scene: Scene,\n bodyShape: Asset,\n eyes: [Texture | null, Texture | null],\n eyebrows: [Texture | null, Texture | null],\n mouth: [Texture | null, Texture | null],\n config: PreviewConfig\n) {\n for (const mesh of bodyShape.container.meshes) {\n if (mesh.name.toLowerCase().endsWith('mask_eyes')) {\n const [texture, mask] = eyes\n if (texture) {\n applyTextureAndMask(scene, 'eyes', mesh, texture, config.eyes, mask, '#ffffff')\n } else {\n mesh.setEnabled(false)\n }\n }\n if (mesh.name.toLowerCase().endsWith('mask_eyebrows')) {\n const [texture, mask] = eyebrows\n if (texture) {\n applyTextureAndMask(scene, 'eyebrows', mesh, texture, config.hair, mask, config.hair)\n } else {\n mesh.setEnabled(false)\n }\n }\n if (mesh.name.toLowerCase().endsWith('mask_mouth')) {\n const [texture, mask] = mouth\n if (texture) {\n applyTextureAndMask(scene, 'mouth', mesh, texture, config.skin, mask, config.skin)\n } else {\n mesh.setEnabled(false)\n }\n }\n }\n}\n\nfunction applyTextureAndMask(\n scene: Scene,\n name: string,\n mesh: AbstractMesh,\n texture: Texture,\n color: string,\n mask: Texture | null,\n maskColor: string\n) {\n const newMaterial = new StandardMaterial(`${name}_standard_material`, scene)\n newMaterial.alphaMode = PBRMaterial.PBRMATERIAL_ALPHABLEND\n newMaterial.backFaceCulling = true\n newMaterial.specularColor = Color3.Black()\n texture.hasAlpha = true\n newMaterial.sideOrientation = Orientation.CW\n newMaterial.diffuseTexture = texture\n newMaterial.diffuseColor = mask ? Color3.Black() : hexToColor(maskColor)\n if (mask) {\n newMaterial.emissiveTexture = mask\n newMaterial.diffuseColor = hexToColor(color)\n }\n mesh.material = newMaterial\n}\n","import { SceneLoader } from '@babylonjs/core'\nimport { GLTFFileLoader } from '@babylonjs/loaders'\nimport { PreviewConfig, BodyShape, WearableDefinition } from '@dcl/schemas'\nimport { getRepresentation } from '../representation'\n\nexport function createMappings(wearables: WearableDefinition[], bodyShape = BodyShape.MALE) {\n const mappings: Record<string, string> = {}\n for (const wearable of wearables) {\n try {\n const representation = getRepresentation(wearable, bodyShape)\n for (const file of representation.contents) {\n mappings[file.key] = file.url\n }\n } catch (error) {\n console.warn(\n `Skipping generation of mappings for wearable=\"${wearable.id}\" since it lacks a representation for bodyShape=\"${bodyShape}\"`\n )\n continue\n }\n }\n return mappings\n}\n\n/**\n * Configures the mappings for all the relative paths within a model to the right IPFS in the catalyst\n * @param wearables\n */\nexport function setupMappings(config: PreviewConfig) {\n const wearables = config.wearable ? [config.wearable, ...config.wearables] : config.wearables\n const mappings = createMappings(wearables, config.bodyShape)\n SceneLoader.OnPluginActivatedObservable.add((plugin) => {\n if (plugin.name === 'gltf') {\n const gltf = plugin as GLTFFileLoader\n gltf.preprocessUrlAsync = async (url: string) => {\n const baseUrl = `/content/contents/`\n const parts = url.split(baseUrl)\n return parts.length > 0 && !!parts[1] ? mappings[parts[1]] : url\n }\n }\n })\n}\n","import { Effect } from '@babylonjs/core'\n\nconst needle = `#include<pbrBlockFinalColorComposition>`\nconst injection = `#include<customToonShading>`\n\nif (Effect.ShadersStore['pbrPixelShader'].includes(needle)) {\n if (!Effect.ShadersStore['pbrPixelShader'].includes(injection)) {\n Effect.ShadersStore['pbrPixelShader'] = Effect.ShadersStore['pbrPixelShader'].replace(\n needle,\n needle + '\\n' + injection + '\\n'\n )\n }\n} else {\n throw new Error('could not patch the pbrPixelShader')\n}\n\n// Monkey-patch the shaders with the corrected version for Decentraland\n// eslint-disable-next-line\nEffect.IncludesShadersStore['customToonShading'] = require('!!raw-loader!./new-pbr.hlsl').default\n","/**\n * Loads a wearable into the Scene, using a given a body shape, skin and hair color\n * @param scene\n * @param wearable\n * @param bodyShape\n * @param skin\n * @param hair\n */\n\nimport { Color3, PBRMaterial, Scene } from '@babylonjs/core'\nimport { WearableDefinition, BodyShape } from '@dcl/schemas'\nimport { getRepresentation, isTexture, getContentUrl } from '../representation'\nimport { loadAssetContainer } from './scene'\nimport './toon'\n\nexport async function loadWearable(\n scene: Scene,\n wearable: WearableDefinition,\n bodyShape = BodyShape.MALE,\n skin?: string,\n hair?: string\n) {\n const representation = getRepresentation(wearable, bodyShape)\n if (isTexture(representation)) {\n throw new Error(`The wearable=\"${wearable.id}\" is a texture`)\n }\n const url = getContentUrl(representation)\n const container = await loadAssetContainer(scene, url)\n\n // Clean up\n for (const originalMaterial of container.materials) {\n if (originalMaterial instanceof PBRMaterial) {\n const newMaterial = originalMaterial as PBRMaterial\n\n // remove metallic effect\n newMaterial.specularIntensity = 0\n if (newMaterial.metallic) {\n newMaterial.metallic = 0\n newMaterial.metallicF0Factor = 0\n }\n\n if (newMaterial.name.toLowerCase().includes('hair')) {\n if (hair) {\n newMaterial.albedoColor = Color3.FromHexString(hair).toLinearSpace()\n newMaterial.specularIntensity = 0\n newMaterial.alpha = 1\n } else {\n newMaterial.alpha = 0\n scene.removeMaterial(newMaterial)\n }\n }\n if (newMaterial.name.toLowerCase().includes('skin')) {\n if (skin) {\n newMaterial.albedoColor = Color3.FromHexString(skin).toLinearSpace()\n newMaterial.specularIntensity = 0\n newMaterial.alpha = 1\n } else {\n newMaterial.alpha = 0\n scene.removeMaterial(newMaterial)\n }\n }\n }\n }\n\n // Stop any animations\n for (const animationGroup of container.animationGroups) {\n animationGroup.stop()\n animationGroup.reset()\n animationGroup.dispose()\n }\n\n return { container, wearable }\n}\n","import { Color4 } from '@babylonjs/core'\nimport { PreviewConfig, PreviewType, BodyShape, IPreviewController, IEmoteController } from '@dcl/schemas'\nimport { getBodyShape } from './body'\nimport { getSlots } from './slots'\nimport { playEmote } from './emote'\nimport { applyFacialFeatures, getFacialFeatures } from './face'\nimport { setupMappings } from './mappings'\nimport { Asset, center, createScene } from './scene'\nimport { isFacialFeature, isModel, isSuccesful } from './utils'\nimport { loadWearable } from './wearable'\nimport { createInvalidEmoteController } from '../emote'\n\n/**\n * Initializes Babylon, creates the scene and loads a list of wearables in it\n * @param canvas\n * @param wearables\n * @param options\n */\nexport async function render(canvas: HTMLCanvasElement, config: PreviewConfig): Promise<IPreviewController> {\n // create the root scene\n const [scene, sceneController] = await createScene(canvas, config)\n try {\n // setup the mappings for all the contents\n setupMappings(config)\n\n // emote controller\n let emoteController: IEmoteController\n\n // load all the wearables into the root scene\n const promises: Promise<void | Asset>[] = []\n\n if (config.type === PreviewType.AVATAR) {\n // get slots\n const slots = getSlots(config)\n\n // get wearables\n const wearables = Array.from(slots.values())\n\n for (const wearable of wearables.filter(isModel)) {\n const promise = loadWearable(scene, wearable, config.bodyShape, config.skin, config.hair).catch((error) => {\n console.warn(error.message)\n })\n promises.push(promise)\n }\n const assets = (await Promise.all(promises)).filter(isSuccesful)\n\n // add all assets to scene\n for (const asset of assets) {\n asset.container.addAllToScene()\n }\n\n // build avatar\n const bodyShape = getBodyShape(assets)\n if (bodyShape) {\n // apply facial features\n const features = wearables.filter(isFacialFeature)\n const { eyes, eyebrows, mouth } = await getFacialFeatures(scene, features, config.bodyShape)\n applyFacialFeatures(scene, bodyShape, eyes, eyebrows, mouth, config)\n }\n\n // play emote\n emoteController = (await playEmote(scene, assets, config)) || createInvalidEmoteController() // default to invalid emote controller if there is an issue with the emote, but let the rest of the preview keep working\n } else {\n const wearable = config.wearable\n if (wearable) {\n try {\n // try loading with the required body shape\n const asset = await loadWearable(scene, wearable, config.bodyShape, config.skin, config.hair)\n asset.container.addAllToScene()\n } catch (error) {\n // default to other body shape if failed\n const asset = await loadWearable(\n scene,\n wearable,\n config.bodyShape === BodyShape.MALE ? BodyShape.FEMALE : BodyShape.MALE,\n config.skin,\n config.hair\n )\n asset.container.addAllToScene()\n }\n }\n\n // can't use emote controller if PreviewType is not \"avatar\"\n emoteController = createInvalidEmoteController()\n }\n\n // center the root scene into the camera\n if (config.centerBoundingBox) {\n center(scene)\n }\n\n // return preview controller\n const controller: IPreviewController = {\n scene: sceneController,\n emote: emoteController,\n }\n return controller\n } catch (error) {\n // remove background on error\n scene.clearColor = new Color4(0, 0, 0, 0)\n throw error\n }\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport classNames from 'classnames'\nimport { PreviewCamera, PreviewType, PreviewMessageType, sendMessage } from '@dcl/schemas'\nimport { useWindowSize } from '../../hooks/useWindowSize'\nimport { useConfig } from '../../hooks/useConfig'\nimport { useReady } from '../../hooks/useReady'\nimport { useController } from '../../hooks/useController'\nimport { render } from '../../lib/babylon/render'\nimport './Preview.css'\n\nconst Preview: React.FC = () => {\n const [previewError, setPreviewError] = useState('')\n const { width, height } = useWindowSize()\n const [style, setStyle] = useState<React.CSSProperties>({})\n const [isDragging, setIsDragging] = useState(false)\n const [isLoadingModel, setIsLoadingModel] = useState(true)\n const [isLoaded, setIsLoaded] = useState(false)\n const canvasRef = useRef<HTMLCanvasElement>(null)\n const controller = useController()\n const [config, isLoadingConfig, configError] = useConfig()\n const [image, setImage] = useState('')\n const [is3D, setIs3D] = useState(true)\n const [isMessageSent, setIsMessageSent] = useState(false)\n\n const error = previewError || configError\n const isLoading = (isLoadingModel || isLoadingConfig) && !error\n const showImage = !!image && !is3D && !isLoading\n const showCanvas = is3D && !isLoading\n\n useEffect(() => {\n if (canvasRef.current && config) {\n let style: React.CSSProperties = { opacity: 1 } // fade in effect\n\n // set background image\n if (config.background.image) {\n setImage(config.background.image)\n style.opacity = 1\n // if rendering a texture, babylon won't render the background, so we do it by css\n if (!config.background.transparent && config.type === PreviewType.TEXTURE) {\n style.backgroundColor = config.background.color\n }\n }\n\n setStyle(style)\n\n // load model or image (for texture only wearables)\n if (config.type === PreviewType.TEXTURE) {\n setIs3D(false)\n setIsLoadingModel(false)\n setIsLoaded(true)\n } else {\n // preview models\n render(canvasRef.current, config)\n .then((_controller) => (controller.current = _controller))\n .catch((error) => setPreviewError(error.message))\n .finally(() => {\n setIsLoadingModel(false)\n setIsLoaded(true)\n })\n }\n }\n }, [canvasRef.current, config]) // eslint-disable-line\n\n // send a mesasge to the parent window when loaded or error occurs\n useEffect(() => {\n if (!isMessageSent) {\n if (isLoaded) {\n sendMessage(window.parent, PreviewMessageType.LOAD, null)\n setIsMessageSent(true)\n } else if (error) {\n sendMessage(window.parent, PreviewMessageType.ERROR, { message: error })\n setIsMessageSent(true)\n }\n }\n }, [isLoaded, error, isMessageSent])\n\n // when the config is being loaded again (because the was an update to some of the options) reset all the other loading flags\n useEffect(() => {\n if (isLoadingConfig) {\n let shouldResetIsLoaded = false\n if (!isLoadingModel) {\n setIsLoadingModel(true)\n shouldResetIsLoaded = true\n }\n if (isMessageSent) {\n setIsMessageSent(false)\n shouldResetIsLoaded = true\n }\n if (shouldResetIsLoaded && isLoaded) {\n setIsLoaded(false)\n }\n }\n }, [isLoadingConfig, isLoadingModel, isMessageSent, isLoaded])\n\n // send ready message to parent\n useReady()\n\n return (\n <div\n className={classNames('Preview', {\n 'is-dragging': isDragging,\n 'is-loading': isLoading,\n 'is-loaded': isLoaded,\n 'is-3d': is3D && config?.camera === PreviewCamera.INTERACTIVE,\n 'has-error': !!error,\n })}\n style={style}\n >\n <img\n src={image}\n className={classNames('thumbnail', {\n 'is-visible': showImage,\n })}\n alt=\"preview\"\n />\n <canvas\n id=\"wearable-preview\"\n className={classNames({\n 'is-visible': showCanvas,\n })}\n width={width}\n height={height}\n ref={canvasRef}\n onMouseDown={() => setIsDragging(is3D && !error)}\n onMouseUp={() => setIsDragging(false)}\n ></canvas>\n {error && <div className=\"error\">{error}</div>}\n </div>\n )\n}\n\nexport default React.memo(Preview)\n","import { useState, useEffect } from 'react'\n\n// Define general type for useWindowSize hook, which includes width and height\ninterface Size {\n width: number | undefined\n height: number | undefined\n}\n\nexport function useWindowSize(): Size {\n // Initialize state with undefined width/height so server and client renders match\n // Learn more here: https://joshwcomeau.com/react/the-perils-of-rehydration/\n const [windowSize, setWindowSize] = useState<Size>({\n width: undefined,\n height: undefined,\n })\n useEffect(() => {\n // Handler to call on window resize\n function handleResize() {\n // Set window width/height to state\n setWindowSize({\n width: window.innerWidth,\n height: window.innerHeight,\n })\n }\n // Add event listener\n window.addEventListener('resize', handleResize)\n // Call handler right away so state gets updated with initial window size\n handleResize()\n // Remove event listener on cleanup\n return () => window.removeEventListener('resize', handleResize)\n }, []) // Empty array ensures that effect is only run on mount\n return windowSize\n}\n","import { PreviewMessageType, sendMessage } from '@dcl/schemas'\nimport { useEffect, useState } from 'react'\n\nexport const useReady = () => {\n const [isReady, setIsReady] = useState(false)\n useEffect(() => {\n if (!isReady) {\n sendMessage(window.parent, PreviewMessageType.READY, null)\n setIsReady(true)\n }\n }, [isReady])\n}\n","import React from 'react'\nimport ReactDOM from 'react-dom'\nimport './index.css'\nimport { Preview } from './components/Preview'\n\nReactDOM.render(\n <React.StrictMode>\n <Preview />\n </React.StrictMode>,\n document.getElementById('root')\n)\n"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- !function(e){function r(r){for(var n,u,a=r[0],i=r[1],p=r[2],f=0,s=[];f<a.length;f++)u=a[f],Object.prototype.hasOwnProperty.call(o,u)&&o[u]&&s.push(o[u][0]),o[u]=0;for(n in i)Object.prototype.hasOwnProperty.call(i,n)&&(e[n]=i[n]);for(c&&c(r);s.length;)s.shift()();return l.push.apply(l,p||[]),t()}function t(){for(var e,r=0;r<l.length;r++){for(var t=l[r],n=!0,a=1;a<t.length;a++){var i=t[a];0!==o[i]&&(n=!1)}n&&(l.splice(r--,1),e=u(u.s=t[0]))}return e}var n={},o={1:0},l=[];function u(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,u),t.l=!0,t.exports}u.m=e,u.c=n,u.d=function(e,r,t){u.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},u.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},u.t=function(e,r){if(1&r&&(e=u(e)),8&r)return e;if(4&r&&"object"===typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(u.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)u.d(t,n,function(r){return e[r]}.bind(null,n));return t},u.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return u.d(r,"a",r),r},u.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},u.p="https://cdn.decentraland.org/@dcl/wearable-preview/1.1.0/";var a=this["webpackJsonp@dcl/wearable-preview"]=this["webpackJsonp@dcl/wearable-preview"]||[],i=a.push.bind(a);a.push=r,a=a.slice();for(var p=0;p<a.length;p++)r(a[p]);var c=i;t()}([]);
2
- //# sourceMappingURL=runtime-main.8384a02d.js.map