| 'use strict'; | 
| var $ = require('../internals/export'); | 
| var uncurryThis = require('../internals/function-uncurry-this'); | 
| var hiddenKeys = require('../internals/hidden-keys'); | 
| var isObject = require('../internals/is-object'); | 
| var hasOwn = require('../internals/has-own-property'); | 
| var defineProperty = require('../internals/object-define-property').f; | 
| var getOwnPropertyNamesModule = require('../internals/object-get-own-property-names'); | 
| var getOwnPropertyNamesExternalModule = require('../internals/object-get-own-property-names-external'); | 
| var isExtensible = require('../internals/object-is-extensible'); | 
| var uid = require('../internals/uid'); | 
| var FREEZING = require('../internals/freezing'); | 
|   | 
| var REQUIRED = false; | 
| var METADATA = uid('meta'); | 
| var id = 0; | 
|   | 
| var setMetadata = function (it) { | 
|   defineProperty(it, METADATA, { value: { | 
|     objectID: 'O' + id++, // object ID | 
|     weakData: {}          // weak collections IDs | 
|   } }); | 
| }; | 
|   | 
| var fastKey = function (it, create) { | 
|   // return a primitive with prefix | 
|   if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it; | 
|   if (!hasOwn(it, METADATA)) { | 
|     // can't set metadata to uncaught frozen object | 
|     if (!isExtensible(it)) return 'F'; | 
|     // not necessary to add metadata | 
|     if (!create) return 'E'; | 
|     // add missing metadata | 
|     setMetadata(it); | 
|   // return object ID | 
|   } return it[METADATA].objectID; | 
| }; | 
|   | 
| var getWeakData = function (it, create) { | 
|   if (!hasOwn(it, METADATA)) { | 
|     // can't set metadata to uncaught frozen object | 
|     if (!isExtensible(it)) return true; | 
|     // not necessary to add metadata | 
|     if (!create) return false; | 
|     // add missing metadata | 
|     setMetadata(it); | 
|   // return the store of weak collections IDs | 
|   } return it[METADATA].weakData; | 
| }; | 
|   | 
| // add metadata on freeze-family methods calling | 
| var onFreeze = function (it) { | 
|   if (FREEZING && REQUIRED && isExtensible(it) && !hasOwn(it, METADATA)) setMetadata(it); | 
|   return it; | 
| }; | 
|   | 
| var enable = function () { | 
|   meta.enable = function () { /* empty */ }; | 
|   REQUIRED = true; | 
|   var getOwnPropertyNames = getOwnPropertyNamesModule.f; | 
|   var splice = uncurryThis([].splice); | 
|   var test = {}; | 
|   test[METADATA] = 1; | 
|   | 
|   // prevent exposing of metadata key | 
|   if (getOwnPropertyNames(test).length) { | 
|     getOwnPropertyNamesModule.f = function (it) { | 
|       var result = getOwnPropertyNames(it); | 
|       for (var i = 0, length = result.length; i < length; i++) { | 
|         if (result[i] === METADATA) { | 
|           splice(result, i, 1); | 
|           break; | 
|         } | 
|       } return result; | 
|     }; | 
|   | 
|     $({ target: 'Object', stat: true, forced: true }, { | 
|       getOwnPropertyNames: getOwnPropertyNamesExternalModule.f | 
|     }); | 
|   } | 
| }; | 
|   | 
| var meta = module.exports = { | 
|   enable: enable, | 
|   fastKey: fastKey, | 
|   getWeakData: getWeakData, | 
|   onFreeze: onFreeze | 
| }; | 
|   | 
| hiddenKeys[METADATA] = true; |