/* */ 
var $ = require("./$"),
    cof = require("./$.cof"),
    $RegExp = $.g.RegExp,
    Base = $RegExp,
    proto = $RegExp.prototype,
    re = /a/g,
    CORRECT_NEW = new $RegExp(re) !== re,
    ALLOWS_RE_WITH_FLAGS = function() {
      try {
        return $RegExp(re, 'i') == '/a/i';
      } catch (e) {}
    }();
if ($.FW && $.DESC) {
  if (!CORRECT_NEW || !ALLOWS_RE_WITH_FLAGS) {
    $RegExp = function RegExp(pattern, flags) {
      var patternIsRegExp = cof(pattern) == 'RegExp',
          flagsIsUndefined = flags === undefined;
      if (!(this instanceof $RegExp) && patternIsRegExp && flagsIsUndefined)
        return pattern;
      return CORRECT_NEW ? new Base(patternIsRegExp && !flagsIsUndefined ? pattern.source : pattern, flags) : new Base(patternIsRegExp ? pattern.source : pattern, patternIsRegExp && flagsIsUndefined ? pattern.flags : flags);
    };
    $.each.call($.getNames(Base), function(key) {
      key in $RegExp || $.setDesc($RegExp, key, {
        configurable: true,
        get: function() {
          return Base[key];
        },
        set: function(it) {
          Base[key] = it;
        }
      });
    });
    proto.constructor = $RegExp;
    $RegExp.prototype = proto;
    require("./$.redef")($.g, 'RegExp', $RegExp);
  }
  if (/./g.flags != 'g')
    $.setDesc(proto, 'flags', {
      configurable: true,
      get: require("./$.replacer")(/^.*\/(\w*)$/, '$1')
    });
}
require("./$.species")($RegExp);
