'use strict'; 
 | 
var $ = require('../internals/export'); 
 | 
var FREEZING = require('../internals/freezing'); 
 | 
var NATIVE_RAW_JSON = require('../internals/native-raw-json'); 
 | 
var getBuiltIn = require('../internals/get-built-in'); 
 | 
var call = require('../internals/function-call'); 
 | 
var uncurryThis = require('../internals/function-uncurry-this'); 
 | 
var isCallable = require('../internals/is-callable'); 
 | 
var isRawJSON = require('../internals/is-raw-json'); 
 | 
var toString = require('../internals/to-string'); 
 | 
var createProperty = require('../internals/create-property'); 
 | 
var parseJSONString = require('../internals/parse-json-string'); 
 | 
var getReplacerFunction = require('../internals/get-json-replacer-function'); 
 | 
var uid = require('../internals/uid'); 
 | 
var setInternalState = require('../internals/internal-state').set; 
 | 
  
 | 
var $String = String; 
 | 
var $SyntaxError = SyntaxError; 
 | 
var parse = getBuiltIn('JSON', 'parse'); 
 | 
var $stringify = getBuiltIn('JSON', 'stringify'); 
 | 
var create = getBuiltIn('Object', 'create'); 
 | 
var freeze = getBuiltIn('Object', 'freeze'); 
 | 
var at = uncurryThis(''.charAt); 
 | 
var slice = uncurryThis(''.slice); 
 | 
var push = uncurryThis([].push); 
 | 
  
 | 
var MARK = uid(); 
 | 
var MARK_LENGTH = MARK.length; 
 | 
var ERROR_MESSAGE = 'Unacceptable as raw JSON'; 
 | 
  
 | 
var isWhitespace = function (it) { 
 | 
  return it === ' ' || it === '\t' || it === '\n' || it === '\r'; 
 | 
}; 
 | 
  
 | 
// `JSON.parse` method 
 | 
// https://tc39.es/proposal-json-parse-with-source/#sec-json.israwjson 
 | 
// https://github.com/tc39/proposal-json-parse-with-source 
 | 
$({ target: 'JSON', stat: true, forced: !NATIVE_RAW_JSON }, { 
 | 
  rawJSON: function rawJSON(text) { 
 | 
    var jsonString = toString(text); 
 | 
    if (jsonString === '' || isWhitespace(at(jsonString, 0)) || isWhitespace(at(jsonString, jsonString.length - 1))) { 
 | 
      throw new $SyntaxError(ERROR_MESSAGE); 
 | 
    } 
 | 
    var parsed = parse(jsonString); 
 | 
    if (typeof parsed == 'object' && parsed !== null) throw new $SyntaxError(ERROR_MESSAGE); 
 | 
    var obj = create(null); 
 | 
    setInternalState(obj, { type: 'RawJSON' }); 
 | 
    createProperty(obj, 'rawJSON', jsonString); 
 | 
    return FREEZING ? freeze(obj) : obj; 
 | 
  } 
 | 
}); 
 | 
  
 | 
// `JSON.stringify` method 
 | 
// https://tc39.es/ecma262/#sec-json.stringify 
 | 
// https://github.com/tc39/proposal-json-parse-with-source 
 | 
if ($stringify) $({ target: 'JSON', stat: true, arity: 3, forced: !NATIVE_RAW_JSON }, { 
 | 
  stringify: function stringify(text, replacer, space) { 
 | 
    var replacerFunction = getReplacerFunction(replacer); 
 | 
    var rawStrings = []; 
 | 
  
 | 
    var json = $stringify(text, function (key, value) { 
 | 
      // some old implementations (like WebKit) could pass numbers as keys 
 | 
      var v = isCallable(replacerFunction) ? call(replacerFunction, this, $String(key), value) : value; 
 | 
      return isRawJSON(v) ? MARK + (push(rawStrings, v.rawJSON) - 1) : v; 
 | 
    }, space); 
 | 
  
 | 
    if (typeof json != 'string') return json; 
 | 
  
 | 
    var result = ''; 
 | 
    var length = json.length; 
 | 
  
 | 
    for (var i = 0; i < length; i++) { 
 | 
      var chr = at(json, i); 
 | 
      if (chr === '"') { 
 | 
        var end = parseJSONString(json, ++i).end - 1; 
 | 
        var string = slice(json, i, end); 
 | 
        result += slice(string, 0, MARK_LENGTH) === MARK 
 | 
          ? rawStrings[slice(string, MARK_LENGTH)] 
 | 
          : '"' + string + '"'; 
 | 
        i = end; 
 | 
      } else result += chr; 
 | 
    } 
 | 
  
 | 
    return result; 
 | 
  } 
 | 
}); 
 |