# After obfuscation there is a performance drop for Mirrors

**URL:** <https://discourse.threejs.org/t/after-obfuscation-there-is-a-performance-drop-for-mirrors/47845>\
**Category:** Questions\
**Tags:** performance\
**Created:** [February 10, 2023, 2:45am UTC](https://discourse.threejs.org/t/after-obfuscation-there-is-a-performance-drop-for-mirrors/47845 "2023-02-10T02:45:46Z")\
**Posts on this page:** 18\
**Page:** 1

<div class="post-metadata">

**Author:** ![FuzzyWobble](https://yyz1.discourse-cdn.com/flex035/user_avatar/discourse.threejs.org/fuzzywobble/32/15221_2.png) [@FuzzyWobble](https://discourse.threejs.org/u/FuzzyWobble)\
**Post date:** [February 10, 2023, 2:45am UTC](https://discourse.threejs.org/t/after-obfuscation-there-is-a-performance-drop-for-mirrors/47845/1 "2023-02-10T02:45:46Z")

</div>

> **[@rbf/parcel-optimizer-javascript-obfuscator](https://www.npmjs.com/package/@rbf/parcel-optimizer-javascript-obfuscator)**
>
> Optimizer plugin for Parcel v2 to obfuscate JavaScript files using javascript-obfuscator.. Latest version: 0.2.2, last published: a year ago. Start using @rbf/parcel-optimizer-javascript-obfuscator in your project by running \`npm i...

After using this obfuscation above there appears to be an extreme performance dip using Mirrors. Any idea why? Anyone else encounter this?

---

<div class="post-metadata">

**Author:** ![drcmda](https://avatars.discourse-cdn.com/v4/letter/d/91b2a8/32.png) [@drcmda](https://discourse.threejs.org/u/drcmda)\
**Post date:** [February 10, 2023, 10:17am UTC](https://discourse.threejs.org/t/after-obfuscation-there-is-a-performance-drop-for-mirrors/47845/2 "2023-02-10T10:17:09Z")

</div>

obfuscation will de-optimise your critical loop code and turn it into slow performing junk code. doing this will threejs, not good!

it wards off some lazy people but if someone really wants your code they get it. the obfuscator is oss and can be reversed, there are even projects out there called “un-obfuscator”.

---

<div class="post-metadata">

**Author:** ![drcmda](https://avatars.discourse-cdn.com/v4/letter/d/91b2a8/32.png) [@drcmda](https://discourse.threejs.org/u/drcmda)\
**Post date:** [February 10, 2023, 10:21am UTC](https://discourse.threejs.org/t/after-obfuscation-there-is-a-performance-drop-for-mirrors/47845/3 "2023-02-10T10:21:49Z")

</div>

btw this code:

```javascript
var variable1 = '5' - 3
var variable2 = '5' + 3
var variable3 = '5' + -'2'
var variable4 = ['10', '10', '10', '10', '10'].map(parseInt)
var variable5 = 'foo ' + 1 + 1
console.log(variable1)
console.log(variable2)
console.log(variable3)
console.log(variable4)
console.log(variable5)

```

turns into this, it’s no wonder it runs slower

```javascript
var _0x9947 = [
  'map',
  'log',
  'foo\x20',
  'bvmqO',
  '133039ViRMWR',
  'xPfLC',
  'ytpdx',
  '1243717qSZCyh',
  '2|7|4|6|9|',
  '1ErtbCr',
  '1608314VKvthn',
  '1ZRaFKN',
  'XBoAA',
  '423266kQOYHV',
  '3|0|5|8|1',
  '235064xPNdKe',
  '13RUDZfG',
  '157gNPQGm',
  '1639212MvnHZL',
  'rDjOa',
  'iBHph',
  '9926iRHoRl',
  'split',
]
function _0x33e4(_0x1809b5, _0x37ef6e) {
  return (
    (_0x33e4 = function (_0x338a69, _0x39ad79) {
      _0x338a69 = _0x338a69 - (0x1939 + -0xf * 0x1f3 + 0x1 * 0x469)
      var _0x2b223a = _0x9947[_0x338a69]
      return _0x2b223a
    }),
    _0x33e4(_0x1809b5, _0x37ef6e)
  )
}
;(function (_0x431d87, _0x156c7f) {
  var _0x10cf6e = _0x33e4
  while (!![]) {
    try {
      var _0x330ad1 =
        -parseInt(_0x10cf6e(0x6c)) * -parseInt(_0x10cf6e(0x6d)) +
        -parseInt(_0x10cf6e(0x74)) * -parseInt(_0x10cf6e(0x78)) +
        parseInt(_0x10cf6e(0x6a)) +
        -parseInt(_0x10cf6e(0x70)) +
        parseInt(_0x10cf6e(0x6e)) * -parseInt(_0x10cf6e(0x75)) +
        parseInt(_0x10cf6e(0x72)) +
        -parseInt(_0x10cf6e(0x67)) * parseInt(_0x10cf6e(0x73))
      if (_0x330ad1 === _0x156c7f) break
      else _0x431d87['push'](_0x431d87['shift']())
    } catch (_0x9f878) {
      _0x431d87['push'](_0x431d87['shift']())
    }
  }
})(_0x9947, -0xb6270 + 0x4dfd2 * 0x2 + 0x75460 * 0x2),
  (function () {
    var _0x1f346d = _0x33e4,
      _0x860db8 = {
        ytpdx: _0x1f346d(0x6b) + _0x1f346d(0x71),
        bvmqO: function (_0x560787, _0x519b9e) {
          return _0x560787 - _0x519b9e
        },
        rDjOa: function (_0x4501fe, _0x2b07a3) {
          return _0x4501fe + _0x2b07a3
        },
        xPfLC: function (_0x5f3c9b, _0x434936) {
          return _0x5f3c9b + _0x434936
        },
        XBoAA: function (_0x535b8a, _0x42eef4) {
          return _0x535b8a + _0x42eef4
        },
        iBHph: _0x1f346d(0x65),
      },
      _0x346c55 = _0x860db8[_0x1f346d(0x69)][_0x1f346d(0x79)]('|'),
      _0x3bf817 = 0x4bb * 0x1 + 0x801 + -0xcbc
    while (!![]) {
      switch (_0x346c55[_0x3bf817++]) {
        case '0':
          console[_0x1f346d(0x7b)](_0x4c96d8)
          continue
        case '1':
          console[_0x1f346d(0x7b)](_0x101028)
          continue
        case '2':
          var _0x65977d = _0x860db8[_0x1f346d(0x66)]('5', -0x586 + -0x2195 + -0x6 * -0x685)
          continue
        case '3':
          console[_0x1f346d(0x7b)](_0x65977d)
          continue
        case '4':
          var _0x56d39b = _0x860db8[_0x1f346d(0x76)]('5', -'2')
          continue
        case '5':
          console[_0x1f346d(0x7b)](_0x56d39b)
          continue
        case '6':
          var _0x544285 = ['10', '10', '10', '10', '10'][_0x1f346d(0x7a)](parseInt)
          continue
        case '7':
          var _0x4c96d8 = _0x860db8[_0x1f346d(0x68)]('5', 0x622 * -0x6 + 0x4a * 0x3 + 0x1 * 0x23f1)
          continue
        case '8':
          console[_0x1f346d(0x7b)](_0x544285)
          continue
        case '9':
          var _0x101028 = _0x860db8[_0x1f346d(0x6f)](
            _0x860db8[_0x1f346d(0x6f)](_0x860db8[_0x1f346d(0x77)], 0x6fb * 0x5 + 0x1ebf * 0x1 + -0x41a5),
            0x209 * 0xa + 0x1314 + -0x276d
          )
          continue
      }
      break
    }
  })()

```

---

<div class="post-metadata">

**Author:** ![Lawrence3DPK](https://yyz1.discourse-cdn.com/flex035/user_avatar/discourse.threejs.org/lawrence3dpk/32/29184_2.png) [@Lawrence3DPK](https://discourse.threejs.org/u/Lawrence3DPK)\
**Post date:** [February 10, 2023, 11:05am UTC](https://discourse.threejs.org/t/after-obfuscation-there-is-a-performance-drop-for-mirrors/47845/4 "2023-02-10T11:05:42Z")

</div>

I get that obfuscation **can** be detrimental to performance and I agree that it is a bit ott but are you saying you can deobfuscate the obfuscated code you’ve shared to read as the original you posted above it? I’ve tried with a few online tools with little to no improvement of readability, definitely nothing like the original code snippet you posted…

@FuzzyWobble you can try setting “splitStrings” to false, it’s likely that there’s shaders defined as strings in the `mirror` class which are all going to be broken into smaller nightmare chunks, it’s worth playing around with the settings of the obfuscator you’re using, you can also try only obfuscating certain important parts of your code too maybe…

@drcmda I think obfuscation can be a very important tool, especially if working and sharing code that might be contractual, it can add a level of security so working environments can be experienced and navigated until the contract is fulfilled, at which point the source can be released… Its definitely not optimal or something you’d want to push to deployment builds though unless very subtle settings are used which simply shorten variable and function names

---

<div class="post-metadata">

**Author:** ![drcmda](https://avatars.discourse-cdn.com/v4/letter/d/91b2a8/32.png) [@drcmda](https://discourse.threejs.org/u/drcmda)\
**Post date:** [February 10, 2023, 11:25am UTC](https://discourse.threejs.org/t/after-obfuscation-there-is-a-performance-drop-for-mirrors/47845/5 "2023-02-10T11:25:27Z")

</div>

here: [https://deobfuscate.relative.im](https://deobfuscate.relative.im)

so easy, now i have your code.

```plaintext
  var _0x65977d = '5' - 3
  var _0x4c96d8 = '5' + 3
  var _0x56d39b = '5' + -'2'
  var _0x544285 = ['10', '10', '10', '10', '10'].map(parseInt)
  var _0x101028 = 'foo ' + 1 + 1
  console.log(_0x65977d)
  console.log(_0x4c96d8)
  console.log(_0x56d39b)
  console.log(_0x544285)
  console.log(_0x101028)

```

at best obfuscation stops casuals. and if that tool above didn’t exist, since the obfuscator is open source really all you’d need to do is reverse it. an afternoon of work. even if the obfuscator is proprietory, AI will have a field day with this.

---

<div class="post-metadata">

**Author:** ![FuzzyWobble](https://yyz1.discourse-cdn.com/flex035/user_avatar/discourse.threejs.org/fuzzywobble/32/15221_2.png) [@FuzzyWobble](https://discourse.threejs.org/u/FuzzyWobble)\
**Post date:** [February 10, 2023, 11:34am UTC](https://discourse.threejs.org/t/after-obfuscation-there-is-a-performance-drop-for-mirrors/47845/6 "2023-02-10T11:34:02Z")

</div>

I ran the deobfuscator on some previously obfuscated code and it outputs this:

 ![Screen Shot 2023-02-10 at 7.30.40 PM](https://canada1.discourse-cdn.com/flex035/uploads/threejs/original/3X/c/0/c0318dd157b1f5497e680743bbfb6e88e7b5cfe5.png)  
So yes it definitely deobfuscates the code very well, but the final output is still quite annoying to make sense of with the variable names turned to nonsense, so I guess it’s better than nothing…

---

<div class="post-metadata">

**Author:** ![drcmda](https://avatars.discourse-cdn.com/v4/letter/d/91b2a8/32.png) [@drcmda](https://discourse.threejs.org/u/drcmda)\
**Post date:** [February 10, 2023, 11:37am UTC](https://discourse.threejs.org/t/after-obfuscation-there-is-a-performance-drop-for-mirrors/47845/7 "2023-02-10T11:37:18Z")

</div>

imo not annoying at all. code’s there. add something that re-establishes the variable names and it may be better then the original:

 ![Screenshot 2023-02-10 at 12.42.46](https://canada1.discourse-cdn.com/flex035/uploads/threejs/original/3X/7/0/705056f1fdee2ec3a6358d8eda1f130a229977a0.png)

it is what it is, if a 100x negative performance impact is worth it so that a casual won’t be able to read it, go for it.

---

<div class="post-metadata">

**Author:** ![Lawrence3DPK](https://yyz1.discourse-cdn.com/flex035/user_avatar/discourse.threejs.org/lawrence3dpk/32/29184_2.png) [@Lawrence3DPK](https://discourse.threejs.org/u/Lawrence3DPK)\
**Post date:** [February 10, 2023, 11:58am UTC](https://discourse.threejs.org/t/after-obfuscation-there-is-a-performance-drop-for-mirrors/47845/8 "2023-02-10T11:58:49Z")

</div>

Interesting, I tried with one of my projects and got the following result…

```javascript
Starting deobfuscation with timeout of 2 minutes
Deobfuscation error! SyntaxError: 'import' and 'export' may appear only with 'sourceType: module' (1:1449)

```

---

<div class="post-metadata">

**Author:** ![drcmda](https://avatars.discourse-cdn.com/v4/letter/d/91b2a8/32.png) [@drcmda](https://discourse.threejs.org/u/drcmda)\
**Post date:** [February 10, 2023, 12:20pm UTC](https://discourse.threejs.org/t/after-obfuscation-there-is-a-performance-drop-for-mirrors/47845/9 "2023-02-10T12:20:05Z")

</div>

looks like you have to use the cli tool directly, it has more options. but im not familiar with it, was just the first thing i found.

---

<div class="post-metadata">

**Author:** ![PavelBoytchev](https://yyz1.discourse-cdn.com/flex035/user_avatar/discourse.threejs.org/pavelboytchev/32/38639_2.png) [@PavelBoytchev](https://discourse.threejs.org/u/PavelBoytchev)\
**Post date:** [February 10, 2023, 12:21pm UTC](https://discourse.threejs.org/t/after-obfuscation-there-is-a-performance-drop-for-mirrors/47845/10 "2023-02-10T12:21:11Z")

</div>

> [@FuzzyWobble](#):
>
> Any idea why?

The goal of obfuscators is to obfuscate, i.e. to deform the code to a point it is incomprehensible by humans, but still keep it working. The cost for this is often performance. In most cases this lost of performance is not noticeable, but is some time-critical and performance-critical situations (as in 3D graphics) obfuscation has a pretty negative impact. For example, I’ve seen obfuscators that decompose constants and function calls and then composing them back in real-time. This kills all possible optimizations.

> [@FuzzyWobble](#):
>
> Anyone else encounter this?

No, when I meet obfuscated code, it is usually in some simple cases. And I have never obfuscated my own code too. In the past I thought of doing it – it was for a 3D interactive student assessment tool. I didn’t want the students to easily see the code. But then I told myself, hey, if they look in the source, they will more than simply studying for the exam. So I just minified the source, keeping the actual (and long) names of variables… + I also gave the students the original source code. And I have never felt sorry for this.

---

<div class="post-metadata">

**Author:** ![FuzzyWobble](https://yyz1.discourse-cdn.com/flex035/user_avatar/discourse.threejs.org/fuzzywobble/32/15221_2.png) [@FuzzyWobble](https://discourse.threejs.org/u/FuzzyWobble)\
**Post date:** [February 10, 2023, 12:40pm UTC](https://discourse.threejs.org/t/after-obfuscation-there-is-a-performance-drop-for-mirrors/47845/11 "2023-02-10T12:40:47Z")

</div>

@drcmda thanks for your brutally passive agressive help 🫠

---

<div class="post-metadata">

**Author:** ![drcmda](https://avatars.discourse-cdn.com/v4/letter/d/91b2a8/32.png) [@drcmda](https://discourse.threejs.org/u/drcmda)\
**Post date:** [February 10, 2023, 7:17pm UTC](https://discourse.threejs.org/t/after-obfuscation-there-is-a-performance-drop-for-mirrors/47845/12 "2023-02-10T19:17:46Z")

</div>

haha, that’s me in a nutshell 😂  
but i do hope it helped to at least get another perspective. in a company i’ve worked for we got our obfuscated code stolen. there is very little safety in that.

---

<div class="post-metadata">

**Author:** ![Lawrence3DPK](https://yyz1.discourse-cdn.com/flex035/user_avatar/discourse.threejs.org/lawrence3dpk/32/29184_2.png) [@Lawrence3DPK](https://discourse.threejs.org/u/Lawrence3DPK)\
**Post date:** [February 10, 2023, 10:04pm UTC](https://discourse.threejs.org/t/after-obfuscation-there-is-a-performance-drop-for-mirrors/47845/13 "2023-02-10T22:04:50Z")

</div>

[![](https://img.youtube.com/vi/V-fRuoMIfpw/maxresdefault.jpg "MY BRAND!") ](https://www.youtube.com/watch?v=V-fRuoMIfpw)

---

<div class="post-metadata">

**Author:** ![Lawrence3DPK](https://yyz1.discourse-cdn.com/flex035/user_avatar/discourse.threejs.org/lawrence3dpk/32/29184_2.png) [@Lawrence3DPK](https://discourse.threejs.org/u/Lawrence3DPK)\
**Post date:** [September 17, 2024, 11:38pm UTC](https://discourse.threejs.org/t/after-obfuscation-there-is-a-performance-drop-for-mirrors/47845/14 "2024-09-17T23:38:54Z")

</div>

> [@drcmda](#):
>
> in a company i’ve worked for we got our obfuscated code stolen. there is very little safety in that.

@drcmda I just realised something that made my eyes water a little on seeing the result 😂

 ![Screenshot_20240918_002528](https://canada1.discourse-cdn.com/flex035/uploads/threejs/original/3X/f/9/f9ca1ac3fd05121c3a6a949d41d890379874249d.jpeg)

…the result…

Original…

```javascript
Obfuscate the following code so it is painfully difficult to decript for yourself and humans.... 

// create a camera
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);

// position the camera to the right of the cube
camera.position.x = 1;
camera.lookAt(new THREE.Vector3(0, 0, 0));

// render the scene
renderer.render(scene, camera);

// change the camera position to the top of the cube
camera.position.y = 1;
camera.lookAt(new THREE.Vector3(0, 0, 0));

// render the scene again
renderer.render(scene, camera);

```

The obfuscation…

```javascript
(function(){var 𝓯=["P","e","r","s","p","e","c","t","i","v","e","C","a","m","a"];var ₥=𝓯.join("")+"mera";var 🧿=window["in"+"ne"+"rW"+"idt"+"h"],🐉=window["inn"+"erHe"+"ight"],∑=0.1,ℵ=1000;var ✡=function(a,b,c){return new a(b,c,∑,ℵ)};var 🎥=new (THREE[₥])(75,🧿/🐉,∑,ℵ);var 🧩="pos"+"it"+"ion",📏=🎥[🧩];📏.x=1;var 🌟=function(a,b,c){return new a(b,c,0)};var 🔭="lo"+"okA"+"t";🎥[🔭](new (THREE["Vec"+"tor"+"3"])(0,0,0));var 🧊=function(a,b){a.render(b,🎥)};var 🧚="rend"+"er";renderer[🧚](scene,🎥);📏.y=1;🎥[🔭](🌟(THREE["Vec"+"tor"+"3"],0,0));renderer[🧚](scene,🎥)})();

```

> [@drcmda](#):
>
> add something that re-establishes the variable names and it may be better then the original:

The deobfuscation of the above encryption…

```javascript
(function(){
    // Define parts of the PerspectiveCamera class name
    var perspectiveArray = ["P", "e", "r", "s", "p", "e", "c", "t", "i", "v", "e", "C", "a", "m", "e", "r", "a"];
    var cameraType = perspectiveArray.join(""); // Result: "PerspectiveCamera"

    // Window dimensions for aspect ratio
    var windowWidth = window.innerWidth;
    var windowHeight = window.innerHeight;

    // Camera parameters: field of view, near clipping plane, far clipping plane
    var fov = 75;
    var nearPlane = 0.1;
    var farPlane = 1000;

    // Create a perspective camera
    var createCamera = function(THREE, fov, aspectRatio, near, far) {
        return new THREE.PerspectiveCamera(fov, aspectRatio, near, far);
    };
    
    // Initialize camera
    var camera = new (THREE[cameraType])(fov, windowWidth / windowHeight, nearPlane, farPlane);

    // Set camera position
    var positionKey = "position";
    var cameraPosition = camera[positionKey];
    cameraPosition.x = 1;
    cameraPosition.y = 1;

    // Look at a point (0, 0, 0) in the scene
    var lookAtKey = "lookAt";
    camera[lookAtKey](new THREE.Vector3(0, 0, 0));

    // Render function that uses a scene and a camera
    var renderScene = function(renderer, scene) {
        renderer.render(scene, camera);
    };

    // Initial render call
    renderer.render(scene, camera);

    // Update lookAt and re-render
    camera[lookAtKey](new THREE.Vector3(0, 0, 0));
    renderer.render(scene, camera);
})();

```

EDIT: merely prompting “more” a few times gives the following 😅🤣…

```javascript
(function(){
    var 👽=function(x){return String.fromCharCode.apply(null,x);};
    var 💾=function(){return [84,72,82,69,69];};
    var 🕸=[80,101,114,115,112,101,99,116,105,118,101,67,97,109,101,114,97];
    var 🎃=function(a,b){return a+b;};
    var 📜=function(arr,func){return arr.map(func);};
    var 🔍=function(v){return eval(v);};
    var 🐉=function(d){return d.map(function(x){return 👽([x]);}).join('');};
    var 🔮=function(v){return eval(v);};
    var 📟=function(){return 📜([0,1],(function(a,b){return b-a;})).reduce(🎃);};
    var 🧠=[(function(){return function(x,y){return x/y;};})()](window[["inn","erW","idt","h"].join("")],window[["inn","erH","eig","ht"].join("")]);
    var 🔧=function(x){return x;};
    var 🔩=[0.1, 1000];
    var 🌀=🔮("[" + 💾

```

Having gpt try to unravel this leads to suboptimal “three.js” however, seems to make an OK attempt at refactoring…

```javascript
(function(){
    var fromCharCodeFunc = function(x){ return String.fromCharCode.apply(null,x); };
    var getThree = function(){ return [84, 72, 82, 69, 69]; }; // Returns [84,72,82,69,69] -> "THREE"
    var perspectiveCamera = [80, 101, 114, 115, 112, 101, 99, 116, 105, 118, 101, 67, 97, 109, 101, 114, 97]; // ASCII for "PerspectiveCamera"
    var addFunc = function(a, b){ return a + b; };
    var mapFunc = function(arr, func){ return arr.map(func); };
    var evalFunc = function(v){ return eval(v); };
    var mapAndJoinFunc = function(d){ return d.map(function(x){ return fromCharCodeFunc([x]); }).join(''); };
    var evalFunc2 = function(v){ return eval(v); };
    var reduceFunc = function(){ return mapFunc([0, 1], function(a, b){ return b - a; }).reduce(addFunc); }; // Returns 1
    var windowRatio = [function(x, y){ return x / y; }](window.innerWidth, window.innerHeight); // Calculates window.innerWidth / window.innerHeight
    var identityFunc = function(x){ return x; };
    var valuesArray = [0.1, 1000];
    
    var result = evalFunc2("[" + getThree());
})();

```

---

<div class="post-metadata">

**Author:** ![Loke\_Lok](https://yyz1.discourse-cdn.com/flex035/user_avatar/discourse.threejs.org/loke_lok/32/54115_2.png) [@Loke\_Lok](https://discourse.threejs.org/u/Loke_Lok)\
**Post date:** [December 2, 2024, 11:59pm UTC](https://discourse.threejs.org/t/after-obfuscation-there-is-a-performance-drop-for-mirrors/47845/15 "2024-12-02T23:59:23Z")

</div>

yo can somebody help me deobfuscate this code?

---

<div class="post-metadata">

**Author:** ![Loke\_Lok](https://yyz1.discourse-cdn.com/flex035/user_avatar/discourse.threejs.org/loke_lok/32/54115_2.png) [@Loke\_Lok](https://discourse.threejs.org/u/Loke_Lok)\
**Post date:** [December 2, 2024, 11:59pm UTC](https://discourse.threejs.org/t/after-obfuscation-there-is-a-performance-drop-for-mirrors/47845/16 "2024-12-02T23:59:53Z")

</div>

PK  
UrY Appraisal Macro V3/PK KxqY@a¡P X Appraisal Macro V3/Abyssal.pngëðsçå’âb`àõôp	Òœ@ÌÆÁ$o9 ¤‹ƒÜÖ“y	ä°¤;ú:20lìçþ“È R]àYÌÀÀw„wLÌ~äKðLóõeÐ²9 àRðd yÙÓÅ1D"œ·ÏÐÉQÄáþ™7LÖa· ,îeé]±Ñð „_ÃÞ)&Ç”+¸£«­¹Oí\šþ€áØ-5•†”ÎwVŸçþÛ;}¹\¿~Jüõ•÷þLÚ¸F2ÔÒ=ÓM³qù¡‰%JßÍYU#xrC›d½¶Sì “übÂsVM64]IUþSóä®×Ïøî^ùô´>0½=÷å+¶éVé³[ªßÏèVŸsSl·'¯­¥±Íû‡³m§^ –dÞÛøYuýkIvOæ¯E—¦çj>zR<Ã˜Õ<­;Î&æè£ÃY‡ìz|=ÙzäKOW?—uN	M PK 0qY°9¸í› V$ ) Appraisal Macro V3/Appraisal Macro V3.ahkíYënÛ6þzaÂ«\”V’íøÒåG®mz jÍ†ƒ,³¶Y4$ºµ{y²ýØ#íÆCŠ’l‰J´ÍY€¤Aëœï|äáG‘ç8ýñç/˜øøMQ'p1º$¡‹u-Âô¯ÆØwV:´¸aF^7êN}/À‘0 0zÔÇ}°÷É#[×tíŒpâSon ÷ŒˆzŸðš÷Ê[b_áëÃðYŸ®½<Þö¿—0Ì¥Ma>¡¨wŒš`xÙj…ôÖŒvË4YòÞ¶Žnˆg8àXž»XßaèM&8„LÀCÃO`0wÂe¶~0~tüˆYaS/Xež_ã%§A'£U9~jè¯èÔs?òÊsšy>õ²d†‡\wæn™ñà9+ŸBÎÏ$g—Ê9ø´rV6¹œíÞ¤=s|weŠQO×>xÁ‰Ëv—Ca§‘‘O–ºæ}DÒŽwkÂZÛÓµ¯ì?ó¼ÂT8aÔ¡ìEào€1còùƒ7¦Sùð{“)•OoñÇäóÌÙw]Ã\"N=‹&#²4Ðç)1 ù¸h.¦Ì‡—uæqLüN]ÃêeF}a›‰Ïßnv/ì½Ã]ÛÜïî% [	ê¤ †ÔNAM%è(µ” V :R‚š)¨­5RPG	²SPW	²Re¡Rwábl’ØJT–«¡DeR³šJTf•¬–Å<F)Q ®Qy‚÷v˜®ÐI4Ÿ:>=snÒóý:ùdÈÊ]…8ŠPíª†(A8EblÙù˜w<†ÿÄ5ÔÈaõyÐ{] BšjæC~á!C…´ÔÊ„Ô~­_,çN0þV»®¦¡Ü„èH×øY²›úÇâ—gIÂš".gäã¢tÛj‹×ŸsÂ¹­æã^5WÇ@”‹ŸöJ.áUsu ÔM¹â;BÉ&ýj>ËdeÈLåí¢¤L %œ°)­”SÜ—1aŽPxKØØvµì” n[øJ˜Ø¶‚)Ät°g¾ôØÍä’E@tWaLç„]5Kþ{Å~ë\'ðê‚íp­ÙçÁ¬l—YB !ìÀJÉqJ(%3‰)&I²}n qÉ1Z–Y{ÝÅ§#}¢01óv#¥Û6³ËµL–ëðPÂÐÇÈ”zK6–…UZ]©XÝg¤×C!?ƒÙÃŒ=$¥È³9¬ü„D‹ÊÖUvñcµó¦NÞÔÍ™l3S}÷n9MßÌœ	`'t§»¶Xe)î×óqÕO~¸¡7§ç^Xÿ-A<ŸaFc_„!	ßâO˜ŸF|wñ¡Nòº|÷óOçêƒ|ç’É;Nði}¿Ã‡Ê·™t3å lâ¸ˆTÏE,ûXi>qÿ ÆX¯U7„e>]rkUÓ Ôš·š^‘Õªð¢Œsì6tÞrŠçqw}:ºVœD–T•´áJm¸·’6<B­M\xˆ¼8vÚpÞrmŠçqwmººVœD–VU•Ô‰9”úÄþX¡»)Ç¨5JŠ9‘aŒß‚N1s¹RêÙÜ]-¿ž,©Iÿb’D)™TÒL•ˆ&«e‘§Ø‚j’úÙÔó© ›¥kÊ|Rá6:ƒ gPJÆ½•ôâ%bÉfD$ÇÑ[PŠóÞ"“b&4²u­8 U6[•äÉ~û¸)óU’†áK„‘½ÈæýßËÂgP*Já,*H±—ù¾Ë/76ª¾8äc”)8rfq×åÌòLÍ9’—6ç[%g^ß'ÉbÂ_1äkƒ%ùÏÙnJc]~ñ_/òº¾çÞ$ŽzöouhƒøwUÜÆû¦Õ½6GöãéŽþ¿†çÑ7<O=Ì½ö0´-ymÉS§ñ@:‡Û<<‚æá©¸¯~àa–ø;w©ví¿PK õxqYÿžM€a Appraisal Macro V3/Big.pngëðsçå’âb`àõôp Ò@ÌÊÁ$+&®  
RŒÅAîNëÎÉ¼rXÒ}6ösÿIdò9\<"‹ø€0cÖµNN à|OÇ‰ðäœªÐÿõþÂÚæË×eýÈáH³˜°¹ûáá·å\<ËBÃxÎ÷Ù§&$%¤04Ûß¯7þSñ½¹qj{oclGsãÄÖÎÆÞé¼+XºþÕü=ûá×n¶ÇAÅlß]ëºW¿3ÞÐé ÚãÓÃ3)Ìˆ§zÒ6£šêŸSeÚ3Þ\_ÿ\_"âßÖM  
.ûvk;˜]ªÀÌm®}xÿýÿ÷bë30$çXÈzò5ï:•ÁÓÕÏeSB PK  
ýxqY$)×-p p Appraisal Macro V3/Giant.png‰PNG

IHDR ÷î sRGB ®Îé gAMA ±üa pHYs À ÀjÖ‰ IDAT(S5ŽÏ+DQÇ?ïŽešÅ4¦ôbãO ‘YÌjVVÊŠ½”ÿaV6òØØK©QØLù1³AHiäMÆíÑeæ^÷yãÔ÷œÎé|8ù•YãÆéKõóårR,óvñŠþÑ,V—¹Ú:'=5‚;äò|VG)¨¬³·´CðÍ"a$ÆáÐ3ØËÑjÉbŸôd†.ÿÆÇ+Œ1\<‘"é%©•ŸpdâÕõö%ª®P5E+h!r›y\>›®•¨nœªÐ¾t‡ íÐ¶™6¦›!a÷ˆî™é,Òãü;£-!Ftïw  
æw˜)ÎÑ¸õ­íw¬)·;Êv‰M[óéy…ø;Å-È IEND®B`‚PK  
UrYøy©w¨ ¨ Appraisal Macro V3/Mythical.png‰PNG

IHDR ÙÄ‚ sRGB ®Îé gAMA ±üa pHYs Á Á¸‘kí =IDAT(SÍ+DQÆ÷ºÜd˜3¾%ÊÇH$I²#d¥ÈÒ€ÿEYËld#IÊÂbÊ5£)+ù613Ü¹ãž{sŸzÏûœÎó\>ïûmslÅÛz8§ì:Ì6°Ü2Ì¯øc©uËýãÇ±Y¼Üálrƒøs’©pmf‰üÆl¤Ÿx6‰¨XÌDûH9Êeè¬  
±ŸMq,yY8(´›AÖ3a4ÕÔ±;ºŠ^ñCV†ÉXCa©Ò6š¦Q¥«ÐÑ%WØ~º gI^)  
eýðýšùHŒ©P7·ÖayÇÂÃEÉ  
Y¨C—fHŽŸÕ!\<ýäó†‰`sÑ‰¯{¹gÅïú-ÊÄ-4›õTk²JBM Þöþ]‰2¥7¦Ã½¤‹¯þgIkö²W,D9_ó×r=áÊ™d(ÏåE{=e‡• IEND®B`‚PK   
yqY†\<­ Appraisal Macro V3/Shiny.pngëðsçå’âb``àõôp Ò@ÌÆÁ$ÿ±Þÿ  
¤‹ƒÜÖ“y ä°¤;ú:20lìçþ“È  
äsxD30ð aÆ¬kœ@Áž.Ž!áÉ5•Õgÿ·z—eEÌÈ4ôèà4’±¯ì]XJª-|ý=ã9ö†³e;9TŽ¶J|ò^fðDÄ7iÃö«éâÂI )I,žŽ"g¢·0¯y|ij5Oü¾ºôaŸ¦$$1y;Š4¨`úÿïó&‰ƒìëÿiXºP‚¥ÁDàï¯Ÿí/õØ=ÔCf\<|¿¿žÇAp‚"¼Ýß†‰þ¶å.– å@72xºú¹¬sJh PK  
ayqY\*í›I  Appraisal Macro V3/Sparkling.png‰PNG

IHDR ÷î sRGB ®Îé gAMA ±üa pHYs À ÀjÖ‰ $IDAT(SÎÍ+Ã Æñïo³ÍÞ²™V‹qd’äejå ¤äP”‹aÚ•BÄ¬Ü¦då¬e)ó²¶fµ—¼Ôš66›ßûóôÒ‘£êñI€n[ez–§çÛn?‰dš©Iaã£}˜Lz^ßr¬®{‘ˆ!—ËX\Þg~aa‹¥Ç`µ™LÊÖ®™¹ ²ÙFœvjóŸ]’É¼S.W†î1›eP«k‰D“LŒõÓÙÑL«ÕLè:ŒªH¤~*UAø.¾¨7Ô±¹6Kâ%ÃÒŠa÷Þ)ù|ño ÎáŒFöÞv†DÎÃcƒ^K.÷ÉEà…HvØP©"© Ö–&|^¥RÏÁ9Á«0Åâ7Ó±¾C±xŠ›Û(’_\ìcP»ˆ> IEND®B`‚PK  
UrY Appraisal Macro V3/ ßÐ4c9ÛB4c9Û„öôB¾8ÛPK KxqY@a¡P X 1 Appraisal Macro V3/Abyssal.png  
 ¼ê€¦¾8Û¼ê€¦¾8Û…Ñ[v¾8ÛPK 0qY°9¸í› V$ ) ½ Appraisal Macro V3/Appraisal Macro V3.ahk ƒÛ6[Æ8ÛæW»)ù8ÛíXõB¾8ÛPK õxqYÿžM€a Ÿa Appraisal Macro V3/Big.png  
 µQe¿8ÛµQe¿8ÛûõB¾8ÛPK  
ýxqY$)×-p p Þ Appraisal Macro V3/Giant.png ÇJºn¿8ÛÇJºn¿8Û §õB¾8ÛPK UrYøy©w¨ ¨ ˆ  
Appraisal Macro V3/Mythical.png  
 KÞ4c9ÛKÞ4c9Û ñy/ÛPK   
yqY†\<­ m Appraisal Macro V3/Shiny.png ^0D|¿8Û^0D|¿8ÛÎõB¾8ÛPK ayqY\*í›I  §  
Appraisal Macro V3/Sparkling.png  
 jØðx¿8ÛjØðx¿8Û1õõB¾8ÛPK { t

---

<div class="post-metadata">

**Author:** ![manthrax](https://yyz1.discourse-cdn.com/flex035/user_avatar/discourse.threejs.org/manthrax/32/2596_2.png) [@manthrax](https://discourse.threejs.org/u/manthrax)\
**Post date:** [December 3, 2024, 10:55am UTC](https://discourse.threejs.org/t/after-obfuscation-there-is-a-performance-drop-for-mirrors/47845/17 "2024-12-03T10:55:18Z")

</div>

It decompiles to:

```javascript
console.log( "Be sure to drink your Ovaltine!");

```

---

<div class="post-metadata">

**Author:** ![Lawrence3DPK](https://yyz1.discourse-cdn.com/flex035/user_avatar/discourse.threejs.org/lawrence3dpk/32/29184_2.png) [@Lawrence3DPK](https://discourse.threejs.org/u/Lawrence3DPK)\
**Post date:** [December 3, 2024, 11:14am UTC](https://discourse.threejs.org/t/after-obfuscation-there-is-a-performance-drop-for-mirrors/47845/18 "2024-12-03T11:14:30Z")

</div>

🤣

Also this…

 ![Screenshot_20241203_111322](https://canada1.discourse-cdn.com/flex035/uploads/threejs/original/3X/3/3/336c7a2af06b25419e7c596fa54702d37c669d92.jpeg)

Eg… Open in notepad++, save as .zip, use 7zip to extract the goods 🤔😅
