| 'use strict'; | 
| // TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env` | 
| require('../modules/es.string.iterator'); | 
| var $ = require('../internals/export'); | 
| var DESCRIPTORS = require('../internals/descriptors'); | 
| var USE_NATIVE_URL = require('../internals/url-constructor-detection'); | 
| var globalThis = require('../internals/global-this'); | 
| var bind = require('../internals/function-bind-context'); | 
| var uncurryThis = require('../internals/function-uncurry-this'); | 
| var defineBuiltIn = require('../internals/define-built-in'); | 
| var defineBuiltInAccessor = require('../internals/define-built-in-accessor'); | 
| var anInstance = require('../internals/an-instance'); | 
| var hasOwn = require('../internals/has-own-property'); | 
| var assign = require('../internals/object-assign'); | 
| var arrayFrom = require('../internals/array-from'); | 
| var arraySlice = require('../internals/array-slice'); | 
| var codeAt = require('../internals/string-multibyte').codeAt; | 
| var toASCII = require('../internals/string-punycode-to-ascii'); | 
| var $toString = require('../internals/to-string'); | 
| var setToStringTag = require('../internals/set-to-string-tag'); | 
| var validateArgumentsLength = require('../internals/validate-arguments-length'); | 
| var URLSearchParamsModule = require('../modules/web.url-search-params.constructor'); | 
| var InternalStateModule = require('../internals/internal-state'); | 
|   | 
| var setInternalState = InternalStateModule.set; | 
| var getInternalURLState = InternalStateModule.getterFor('URL'); | 
| var URLSearchParams = URLSearchParamsModule.URLSearchParams; | 
| var getInternalSearchParamsState = URLSearchParamsModule.getState; | 
|   | 
| var NativeURL = globalThis.URL; | 
| var TypeError = globalThis.TypeError; | 
| var parseInt = globalThis.parseInt; | 
| var floor = Math.floor; | 
| var pow = Math.pow; | 
| var charAt = uncurryThis(''.charAt); | 
| var exec = uncurryThis(/./.exec); | 
| var join = uncurryThis([].join); | 
| var numberToString = uncurryThis(1.0.toString); | 
| var pop = uncurryThis([].pop); | 
| var push = uncurryThis([].push); | 
| var replace = uncurryThis(''.replace); | 
| var shift = uncurryThis([].shift); | 
| var split = uncurryThis(''.split); | 
| var stringSlice = uncurryThis(''.slice); | 
| var toLowerCase = uncurryThis(''.toLowerCase); | 
| var unshift = uncurryThis([].unshift); | 
|   | 
| var INVALID_AUTHORITY = 'Invalid authority'; | 
| var INVALID_SCHEME = 'Invalid scheme'; | 
| var INVALID_HOST = 'Invalid host'; | 
| var INVALID_PORT = 'Invalid port'; | 
|   | 
| var ALPHA = /[a-z]/i; | 
| // eslint-disable-next-line regexp/no-obscure-range -- safe | 
| var ALPHANUMERIC = /[\d+-.a-z]/i; | 
| var DIGIT = /\d/; | 
| var HEX_START = /^0x/i; | 
| var OCT = /^[0-7]+$/; | 
| var DEC = /^\d+$/; | 
| var HEX = /^[\da-f]+$/i; | 
| /* eslint-disable regexp/no-control-character -- safe */ | 
| var FORBIDDEN_HOST_CODE_POINT = /[\0\t\n\r #%/:<>?@[\\\]^|]/; | 
| var FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT = /[\0\t\n\r #/:<>?@[\\\]^|]/; | 
| var LEADING_C0_CONTROL_OR_SPACE = /^[\u0000-\u0020]+/; | 
| var TRAILING_C0_CONTROL_OR_SPACE = /(^|[^\u0000-\u0020])[\u0000-\u0020]+$/; | 
| var TAB_AND_NEW_LINE = /[\t\n\r]/g; | 
| /* eslint-enable regexp/no-control-character -- safe */ | 
| var EOF; | 
|   | 
| // https://url.spec.whatwg.org/#ipv4-number-parser | 
| var parseIPv4 = function (input) { | 
|   var parts = split(input, '.'); | 
|   var partsLength, numbers, index, part, radix, number, ipv4; | 
|   if (parts.length && parts[parts.length - 1] === '') { | 
|     parts.length--; | 
|   } | 
|   partsLength = parts.length; | 
|   if (partsLength > 4) return input; | 
|   numbers = []; | 
|   for (index = 0; index < partsLength; index++) { | 
|     part = parts[index]; | 
|     if (part === '') return input; | 
|     radix = 10; | 
|     if (part.length > 1 && charAt(part, 0) === '0') { | 
|       radix = exec(HEX_START, part) ? 16 : 8; | 
|       part = stringSlice(part, radix === 8 ? 1 : 2); | 
|     } | 
|     if (part === '') { | 
|       number = 0; | 
|     } else { | 
|       if (!exec(radix === 10 ? DEC : radix === 8 ? OCT : HEX, part)) return input; | 
|       number = parseInt(part, radix); | 
|     } | 
|     push(numbers, number); | 
|   } | 
|   for (index = 0; index < partsLength; index++) { | 
|     number = numbers[index]; | 
|     if (index === partsLength - 1) { | 
|       if (number >= pow(256, 5 - partsLength)) return null; | 
|     } else if (number > 255) return null; | 
|   } | 
|   ipv4 = pop(numbers); | 
|   for (index = 0; index < numbers.length; index++) { | 
|     ipv4 += numbers[index] * pow(256, 3 - index); | 
|   } | 
|   return ipv4; | 
| }; | 
|   | 
| // https://url.spec.whatwg.org/#concept-ipv6-parser | 
| // eslint-disable-next-line max-statements -- TODO | 
| var parseIPv6 = function (input) { | 
|   var address = [0, 0, 0, 0, 0, 0, 0, 0]; | 
|   var pieceIndex = 0; | 
|   var compress = null; | 
|   var pointer = 0; | 
|   var value, length, numbersSeen, ipv4Piece, number, swaps, swap; | 
|   | 
|   var chr = function () { | 
|     return charAt(input, pointer); | 
|   }; | 
|   | 
|   if (chr() === ':') { | 
|     if (charAt(input, 1) !== ':') return; | 
|     pointer += 2; | 
|     pieceIndex++; | 
|     compress = pieceIndex; | 
|   } | 
|   while (chr()) { | 
|     if (pieceIndex === 8) return; | 
|     if (chr() === ':') { | 
|       if (compress !== null) return; | 
|       pointer++; | 
|       pieceIndex++; | 
|       compress = pieceIndex; | 
|       continue; | 
|     } | 
|     value = length = 0; | 
|     while (length < 4 && exec(HEX, chr())) { | 
|       value = value * 16 + parseInt(chr(), 16); | 
|       pointer++; | 
|       length++; | 
|     } | 
|     if (chr() === '.') { | 
|       if (length === 0) return; | 
|       pointer -= length; | 
|       if (pieceIndex > 6) return; | 
|       numbersSeen = 0; | 
|       while (chr()) { | 
|         ipv4Piece = null; | 
|         if (numbersSeen > 0) { | 
|           if (chr() === '.' && numbersSeen < 4) pointer++; | 
|           else return; | 
|         } | 
|         if (!exec(DIGIT, chr())) return; | 
|         while (exec(DIGIT, chr())) { | 
|           number = parseInt(chr(), 10); | 
|           if (ipv4Piece === null) ipv4Piece = number; | 
|           else if (ipv4Piece === 0) return; | 
|           else ipv4Piece = ipv4Piece * 10 + number; | 
|           if (ipv4Piece > 255) return; | 
|           pointer++; | 
|         } | 
|         address[pieceIndex] = address[pieceIndex] * 256 + ipv4Piece; | 
|         numbersSeen++; | 
|         if (numbersSeen === 2 || numbersSeen === 4) pieceIndex++; | 
|       } | 
|       if (numbersSeen !== 4) return; | 
|       break; | 
|     } else if (chr() === ':') { | 
|       pointer++; | 
|       if (!chr()) return; | 
|     } else if (chr()) return; | 
|     address[pieceIndex++] = value; | 
|   } | 
|   if (compress !== null) { | 
|     swaps = pieceIndex - compress; | 
|     pieceIndex = 7; | 
|     while (pieceIndex !== 0 && swaps > 0) { | 
|       swap = address[pieceIndex]; | 
|       address[pieceIndex--] = address[compress + swaps - 1]; | 
|       address[compress + --swaps] = swap; | 
|     } | 
|   } else if (pieceIndex !== 8) return; | 
|   return address; | 
| }; | 
|   | 
| var findLongestZeroSequence = function (ipv6) { | 
|   var maxIndex = null; | 
|   var maxLength = 1; | 
|   var currStart = null; | 
|   var currLength = 0; | 
|   var index = 0; | 
|   for (; index < 8; index++) { | 
|     if (ipv6[index] !== 0) { | 
|       if (currLength > maxLength) { | 
|         maxIndex = currStart; | 
|         maxLength = currLength; | 
|       } | 
|       currStart = null; | 
|       currLength = 0; | 
|     } else { | 
|       if (currStart === null) currStart = index; | 
|       ++currLength; | 
|     } | 
|   } | 
|   return currLength > maxLength ? currStart : maxIndex; | 
| }; | 
|   | 
| // https://url.spec.whatwg.org/#host-serializing | 
| var serializeHost = function (host) { | 
|   var result, index, compress, ignore0; | 
|   | 
|   // ipv4 | 
|   if (typeof host == 'number') { | 
|     result = []; | 
|     for (index = 0; index < 4; index++) { | 
|       unshift(result, host % 256); | 
|       host = floor(host / 256); | 
|     } | 
|     return join(result, '.'); | 
|   } | 
|   | 
|   // ipv6 | 
|   if (typeof host == 'object') { | 
|     result = ''; | 
|     compress = findLongestZeroSequence(host); | 
|     for (index = 0; index < 8; index++) { | 
|       if (ignore0 && host[index] === 0) continue; | 
|       if (ignore0) ignore0 = false; | 
|       if (compress === index) { | 
|         result += index ? ':' : '::'; | 
|         ignore0 = true; | 
|       } else { | 
|         result += numberToString(host[index], 16); | 
|         if (index < 7) result += ':'; | 
|       } | 
|     } | 
|     return '[' + result + ']'; | 
|   } | 
|   | 
|   return host; | 
| }; | 
|   | 
| var C0ControlPercentEncodeSet = {}; | 
| var fragmentPercentEncodeSet = assign({}, C0ControlPercentEncodeSet, { | 
|   ' ': 1, '"': 1, '<': 1, '>': 1, '`': 1 | 
| }); | 
| var pathPercentEncodeSet = assign({}, fragmentPercentEncodeSet, { | 
|   '#': 1, '?': 1, '{': 1, '}': 1 | 
| }); | 
| var userinfoPercentEncodeSet = assign({}, pathPercentEncodeSet, { | 
|   '/': 1, ':': 1, ';': 1, '=': 1, '@': 1, '[': 1, '\\': 1, ']': 1, '^': 1, '|': 1 | 
| }); | 
|   | 
| var percentEncode = function (chr, set) { | 
|   var code = codeAt(chr, 0); | 
|   return code > 0x20 && code < 0x7F && !hasOwn(set, chr) ? chr : encodeURIComponent(chr); | 
| }; | 
|   | 
| // https://url.spec.whatwg.org/#special-scheme | 
| var specialSchemes = { | 
|   ftp: 21, | 
|   file: null, | 
|   http: 80, | 
|   https: 443, | 
|   ws: 80, | 
|   wss: 443 | 
| }; | 
|   | 
| // https://url.spec.whatwg.org/#windows-drive-letter | 
| var isWindowsDriveLetter = function (string, normalized) { | 
|   var second; | 
|   return string.length === 2 && exec(ALPHA, charAt(string, 0)) | 
|     && ((second = charAt(string, 1)) === ':' || (!normalized && second === '|')); | 
| }; | 
|   | 
| // https://url.spec.whatwg.org/#start-with-a-windows-drive-letter | 
| var startsWithWindowsDriveLetter = function (string) { | 
|   var third; | 
|   return string.length > 1 && isWindowsDriveLetter(stringSlice(string, 0, 2)) && ( | 
|     string.length === 2 || | 
|     ((third = charAt(string, 2)) === '/' || third === '\\' || third === '?' || third === '#') | 
|   ); | 
| }; | 
|   | 
| // https://url.spec.whatwg.org/#single-dot-path-segment | 
| var isSingleDot = function (segment) { | 
|   return segment === '.' || toLowerCase(segment) === '%2e'; | 
| }; | 
|   | 
| // https://url.spec.whatwg.org/#double-dot-path-segment | 
| var isDoubleDot = function (segment) { | 
|   segment = toLowerCase(segment); | 
|   return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e'; | 
| }; | 
|   | 
| // States: | 
| var SCHEME_START = {}; | 
| var SCHEME = {}; | 
| var NO_SCHEME = {}; | 
| var SPECIAL_RELATIVE_OR_AUTHORITY = {}; | 
| var PATH_OR_AUTHORITY = {}; | 
| var RELATIVE = {}; | 
| var RELATIVE_SLASH = {}; | 
| var SPECIAL_AUTHORITY_SLASHES = {}; | 
| var SPECIAL_AUTHORITY_IGNORE_SLASHES = {}; | 
| var AUTHORITY = {}; | 
| var HOST = {}; | 
| var HOSTNAME = {}; | 
| var PORT = {}; | 
| var FILE = {}; | 
| var FILE_SLASH = {}; | 
| var FILE_HOST = {}; | 
| var PATH_START = {}; | 
| var PATH = {}; | 
| var CANNOT_BE_A_BASE_URL_PATH = {}; | 
| var QUERY = {}; | 
| var FRAGMENT = {}; | 
|   | 
| var URLState = function (url, isBase, base) { | 
|   var urlString = $toString(url); | 
|   var baseState, failure, searchParams; | 
|   if (isBase) { | 
|     failure = this.parse(urlString); | 
|     if (failure) throw new TypeError(failure); | 
|     this.searchParams = null; | 
|   } else { | 
|     if (base !== undefined) baseState = new URLState(base, true); | 
|     failure = this.parse(urlString, null, baseState); | 
|     if (failure) throw new TypeError(failure); | 
|     searchParams = getInternalSearchParamsState(new URLSearchParams()); | 
|     searchParams.bindURL(this); | 
|     this.searchParams = searchParams; | 
|   } | 
| }; | 
|   | 
| URLState.prototype = { | 
|   type: 'URL', | 
|   // https://url.spec.whatwg.org/#url-parsing | 
|   // eslint-disable-next-line max-statements -- TODO | 
|   parse: function (input, stateOverride, base) { | 
|     var url = this; | 
|     var state = stateOverride || SCHEME_START; | 
|     var pointer = 0; | 
|     var buffer = ''; | 
|     var seenAt = false; | 
|     var seenBracket = false; | 
|     var seenPasswordToken = false; | 
|     var codePoints, chr, bufferCodePoints, failure; | 
|   | 
|     input = $toString(input); | 
|   | 
|     if (!stateOverride) { | 
|       url.scheme = ''; | 
|       url.username = ''; | 
|       url.password = ''; | 
|       url.host = null; | 
|       url.port = null; | 
|       url.path = []; | 
|       url.query = null; | 
|       url.fragment = null; | 
|       url.cannotBeABaseURL = false; | 
|       input = replace(input, LEADING_C0_CONTROL_OR_SPACE, ''); | 
|       input = replace(input, TRAILING_C0_CONTROL_OR_SPACE, '$1'); | 
|     } | 
|   | 
|     input = replace(input, TAB_AND_NEW_LINE, ''); | 
|   | 
|     codePoints = arrayFrom(input); | 
|   | 
|     while (pointer <= codePoints.length) { | 
|       chr = codePoints[pointer]; | 
|       switch (state) { | 
|         case SCHEME_START: | 
|           if (chr && exec(ALPHA, chr)) { | 
|             buffer += toLowerCase(chr); | 
|             state = SCHEME; | 
|           } else if (!stateOverride) { | 
|             state = NO_SCHEME; | 
|             continue; | 
|           } else return INVALID_SCHEME; | 
|           break; | 
|   | 
|         case SCHEME: | 
|           if (chr && (exec(ALPHANUMERIC, chr) || chr === '+' || chr === '-' || chr === '.')) { | 
|             buffer += toLowerCase(chr); | 
|           } else if (chr === ':') { | 
|             if (stateOverride && ( | 
|               (url.isSpecial() !== hasOwn(specialSchemes, buffer)) || | 
|               (buffer === 'file' && (url.includesCredentials() || url.port !== null)) || | 
|               (url.scheme === 'file' && !url.host) | 
|             )) return; | 
|             url.scheme = buffer; | 
|             if (stateOverride) { | 
|               if (url.isSpecial() && specialSchemes[url.scheme] === url.port) url.port = null; | 
|               return; | 
|             } | 
|             buffer = ''; | 
|             if (url.scheme === 'file') { | 
|               state = FILE; | 
|             } else if (url.isSpecial() && base && base.scheme === url.scheme) { | 
|               state = SPECIAL_RELATIVE_OR_AUTHORITY; | 
|             } else if (url.isSpecial()) { | 
|               state = SPECIAL_AUTHORITY_SLASHES; | 
|             } else if (codePoints[pointer + 1] === '/') { | 
|               state = PATH_OR_AUTHORITY; | 
|               pointer++; | 
|             } else { | 
|               url.cannotBeABaseURL = true; | 
|               push(url.path, ''); | 
|               state = CANNOT_BE_A_BASE_URL_PATH; | 
|             } | 
|           } else if (!stateOverride) { | 
|             buffer = ''; | 
|             state = NO_SCHEME; | 
|             pointer = 0; | 
|             continue; | 
|           } else return INVALID_SCHEME; | 
|           break; | 
|   | 
|         case NO_SCHEME: | 
|           if (!base || (base.cannotBeABaseURL && chr !== '#')) return INVALID_SCHEME; | 
|           if (base.cannotBeABaseURL && chr === '#') { | 
|             url.scheme = base.scheme; | 
|             url.path = arraySlice(base.path); | 
|             url.query = base.query; | 
|             url.fragment = ''; | 
|             url.cannotBeABaseURL = true; | 
|             state = FRAGMENT; | 
|             break; | 
|           } | 
|           state = base.scheme === 'file' ? FILE : RELATIVE; | 
|           continue; | 
|   | 
|         case SPECIAL_RELATIVE_OR_AUTHORITY: | 
|           if (chr === '/' && codePoints[pointer + 1] === '/') { | 
|             state = SPECIAL_AUTHORITY_IGNORE_SLASHES; | 
|             pointer++; | 
|           } else { | 
|             state = RELATIVE; | 
|             continue; | 
|           } break; | 
|   | 
|         case PATH_OR_AUTHORITY: | 
|           if (chr === '/') { | 
|             state = AUTHORITY; | 
|             break; | 
|           } else { | 
|             state = PATH; | 
|             continue; | 
|           } | 
|   | 
|         case RELATIVE: | 
|           url.scheme = base.scheme; | 
|           if (chr === EOF) { | 
|             url.username = base.username; | 
|             url.password = base.password; | 
|             url.host = base.host; | 
|             url.port = base.port; | 
|             url.path = arraySlice(base.path); | 
|             url.query = base.query; | 
|           } else if (chr === '/' || (chr === '\\' && url.isSpecial())) { | 
|             state = RELATIVE_SLASH; | 
|           } else if (chr === '?') { | 
|             url.username = base.username; | 
|             url.password = base.password; | 
|             url.host = base.host; | 
|             url.port = base.port; | 
|             url.path = arraySlice(base.path); | 
|             url.query = ''; | 
|             state = QUERY; | 
|           } else if (chr === '#') { | 
|             url.username = base.username; | 
|             url.password = base.password; | 
|             url.host = base.host; | 
|             url.port = base.port; | 
|             url.path = arraySlice(base.path); | 
|             url.query = base.query; | 
|             url.fragment = ''; | 
|             state = FRAGMENT; | 
|           } else { | 
|             url.username = base.username; | 
|             url.password = base.password; | 
|             url.host = base.host; | 
|             url.port = base.port; | 
|             url.path = arraySlice(base.path); | 
|             url.path.length--; | 
|             state = PATH; | 
|             continue; | 
|           } break; | 
|   | 
|         case RELATIVE_SLASH: | 
|           if (url.isSpecial() && (chr === '/' || chr === '\\')) { | 
|             state = SPECIAL_AUTHORITY_IGNORE_SLASHES; | 
|           } else if (chr === '/') { | 
|             state = AUTHORITY; | 
|           } else { | 
|             url.username = base.username; | 
|             url.password = base.password; | 
|             url.host = base.host; | 
|             url.port = base.port; | 
|             state = PATH; | 
|             continue; | 
|           } break; | 
|   | 
|         case SPECIAL_AUTHORITY_SLASHES: | 
|           state = SPECIAL_AUTHORITY_IGNORE_SLASHES; | 
|           if (chr !== '/' || charAt(buffer, pointer + 1) !== '/') continue; | 
|           pointer++; | 
|           break; | 
|   | 
|         case SPECIAL_AUTHORITY_IGNORE_SLASHES: | 
|           if (chr !== '/' && chr !== '\\') { | 
|             state = AUTHORITY; | 
|             continue; | 
|           } break; | 
|   | 
|         case AUTHORITY: | 
|           if (chr === '@') { | 
|             if (seenAt) buffer = '%40' + buffer; | 
|             seenAt = true; | 
|             bufferCodePoints = arrayFrom(buffer); | 
|             for (var i = 0; i < bufferCodePoints.length; i++) { | 
|               var codePoint = bufferCodePoints[i]; | 
|               if (codePoint === ':' && !seenPasswordToken) { | 
|                 seenPasswordToken = true; | 
|                 continue; | 
|               } | 
|               var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet); | 
|               if (seenPasswordToken) url.password += encodedCodePoints; | 
|               else url.username += encodedCodePoints; | 
|             } | 
|             buffer = ''; | 
|           } else if ( | 
|             chr === EOF || chr === '/' || chr === '?' || chr === '#' || | 
|             (chr === '\\' && url.isSpecial()) | 
|           ) { | 
|             if (seenAt && buffer === '') return INVALID_AUTHORITY; | 
|             pointer -= arrayFrom(buffer).length + 1; | 
|             buffer = ''; | 
|             state = HOST; | 
|           } else buffer += chr; | 
|           break; | 
|   | 
|         case HOST: | 
|         case HOSTNAME: | 
|           if (stateOverride && url.scheme === 'file') { | 
|             state = FILE_HOST; | 
|             continue; | 
|           } else if (chr === ':' && !seenBracket) { | 
|             if (buffer === '') return INVALID_HOST; | 
|             failure = url.parseHost(buffer); | 
|             if (failure) return failure; | 
|             buffer = ''; | 
|             state = PORT; | 
|             if (stateOverride === HOSTNAME) return; | 
|           } else if ( | 
|             chr === EOF || chr === '/' || chr === '?' || chr === '#' || | 
|             (chr === '\\' && url.isSpecial()) | 
|           ) { | 
|             if (url.isSpecial() && buffer === '') return INVALID_HOST; | 
|             if (stateOverride && buffer === '' && (url.includesCredentials() || url.port !== null)) return; | 
|             failure = url.parseHost(buffer); | 
|             if (failure) return failure; | 
|             buffer = ''; | 
|             state = PATH_START; | 
|             if (stateOverride) return; | 
|             continue; | 
|           } else { | 
|             if (chr === '[') seenBracket = true; | 
|             else if (chr === ']') seenBracket = false; | 
|             buffer += chr; | 
|           } break; | 
|   | 
|         case PORT: | 
|           if (exec(DIGIT, chr)) { | 
|             buffer += chr; | 
|           } else if ( | 
|             chr === EOF || chr === '/' || chr === '?' || chr === '#' || | 
|             (chr === '\\' && url.isSpecial()) || | 
|             stateOverride | 
|           ) { | 
|             if (buffer !== '') { | 
|               var port = parseInt(buffer, 10); | 
|               if (port > 0xFFFF) return INVALID_PORT; | 
|               url.port = (url.isSpecial() && port === specialSchemes[url.scheme]) ? null : port; | 
|               buffer = ''; | 
|             } | 
|             if (stateOverride) return; | 
|             state = PATH_START; | 
|             continue; | 
|           } else return INVALID_PORT; | 
|           break; | 
|   | 
|         case FILE: | 
|           url.scheme = 'file'; | 
|           if (chr === '/' || chr === '\\') state = FILE_SLASH; | 
|           else if (base && base.scheme === 'file') { | 
|             switch (chr) { | 
|               case EOF: | 
|                 url.host = base.host; | 
|                 url.path = arraySlice(base.path); | 
|                 url.query = base.query; | 
|                 break; | 
|               case '?': | 
|                 url.host = base.host; | 
|                 url.path = arraySlice(base.path); | 
|                 url.query = ''; | 
|                 state = QUERY; | 
|                 break; | 
|               case '#': | 
|                 url.host = base.host; | 
|                 url.path = arraySlice(base.path); | 
|                 url.query = base.query; | 
|                 url.fragment = ''; | 
|                 state = FRAGMENT; | 
|                 break; | 
|               default: | 
|                 if (!startsWithWindowsDriveLetter(join(arraySlice(codePoints, pointer), ''))) { | 
|                   url.host = base.host; | 
|                   url.path = arraySlice(base.path); | 
|                   url.shortenPath(); | 
|                 } | 
|                 state = PATH; | 
|                 continue; | 
|             } | 
|           } else { | 
|             state = PATH; | 
|             continue; | 
|           } break; | 
|   | 
|         case FILE_SLASH: | 
|           if (chr === '/' || chr === '\\') { | 
|             state = FILE_HOST; | 
|             break; | 
|           } | 
|           if (base && base.scheme === 'file' && !startsWithWindowsDriveLetter(join(arraySlice(codePoints, pointer), ''))) { | 
|             if (isWindowsDriveLetter(base.path[0], true)) push(url.path, base.path[0]); | 
|             else url.host = base.host; | 
|           } | 
|           state = PATH; | 
|           continue; | 
|   | 
|         case FILE_HOST: | 
|           if (chr === EOF || chr === '/' || chr === '\\' || chr === '?' || chr === '#') { | 
|             if (!stateOverride && isWindowsDriveLetter(buffer)) { | 
|               state = PATH; | 
|             } else if (buffer === '') { | 
|               url.host = ''; | 
|               if (stateOverride) return; | 
|               state = PATH_START; | 
|             } else { | 
|               failure = url.parseHost(buffer); | 
|               if (failure) return failure; | 
|               if (url.host === 'localhost') url.host = ''; | 
|               if (stateOverride) return; | 
|               buffer = ''; | 
|               state = PATH_START; | 
|             } continue; | 
|           } else buffer += chr; | 
|           break; | 
|   | 
|         case PATH_START: | 
|           if (url.isSpecial()) { | 
|             state = PATH; | 
|             if (chr !== '/' && chr !== '\\') continue; | 
|           } else if (!stateOverride && chr === '?') { | 
|             url.query = ''; | 
|             state = QUERY; | 
|           } else if (!stateOverride && chr === '#') { | 
|             url.fragment = ''; | 
|             state = FRAGMENT; | 
|           } else if (chr !== EOF) { | 
|             state = PATH; | 
|             if (chr !== '/') continue; | 
|           } break; | 
|   | 
|         case PATH: | 
|           if ( | 
|             chr === EOF || chr === '/' || | 
|             (chr === '\\' && url.isSpecial()) || | 
|             (!stateOverride && (chr === '?' || chr === '#')) | 
|           ) { | 
|             if (isDoubleDot(buffer)) { | 
|               url.shortenPath(); | 
|               if (chr !== '/' && !(chr === '\\' && url.isSpecial())) { | 
|                 push(url.path, ''); | 
|               } | 
|             } else if (isSingleDot(buffer)) { | 
|               if (chr !== '/' && !(chr === '\\' && url.isSpecial())) { | 
|                 push(url.path, ''); | 
|               } | 
|             } else { | 
|               if (url.scheme === 'file' && !url.path.length && isWindowsDriveLetter(buffer)) { | 
|                 if (url.host) url.host = ''; | 
|                 buffer = charAt(buffer, 0) + ':'; // normalize windows drive letter | 
|               } | 
|               push(url.path, buffer); | 
|             } | 
|             buffer = ''; | 
|             if (url.scheme === 'file' && (chr === EOF || chr === '?' || chr === '#')) { | 
|               while (url.path.length > 1 && url.path[0] === '') { | 
|                 shift(url.path); | 
|               } | 
|             } | 
|             if (chr === '?') { | 
|               url.query = ''; | 
|               state = QUERY; | 
|             } else if (chr === '#') { | 
|               url.fragment = ''; | 
|               state = FRAGMENT; | 
|             } | 
|           } else { | 
|             buffer += percentEncode(chr, pathPercentEncodeSet); | 
|           } break; | 
|   | 
|         case CANNOT_BE_A_BASE_URL_PATH: | 
|           if (chr === '?') { | 
|             url.query = ''; | 
|             state = QUERY; | 
|           } else if (chr === '#') { | 
|             url.fragment = ''; | 
|             state = FRAGMENT; | 
|           } else if (chr !== EOF) { | 
|             url.path[0] += percentEncode(chr, C0ControlPercentEncodeSet); | 
|           } break; | 
|   | 
|         case QUERY: | 
|           if (!stateOverride && chr === '#') { | 
|             url.fragment = ''; | 
|             state = FRAGMENT; | 
|           } else if (chr !== EOF) { | 
|             if (chr === "'" && url.isSpecial()) url.query += '%27'; | 
|             else if (chr === '#') url.query += '%23'; | 
|             else url.query += percentEncode(chr, C0ControlPercentEncodeSet); | 
|           } break; | 
|   | 
|         case FRAGMENT: | 
|           if (chr !== EOF) url.fragment += percentEncode(chr, fragmentPercentEncodeSet); | 
|           break; | 
|       } | 
|   | 
|       pointer++; | 
|     } | 
|   }, | 
|   // https://url.spec.whatwg.org/#host-parsing | 
|   parseHost: function (input) { | 
|     var result, codePoints, index; | 
|     if (charAt(input, 0) === '[') { | 
|       if (charAt(input, input.length - 1) !== ']') return INVALID_HOST; | 
|       result = parseIPv6(stringSlice(input, 1, -1)); | 
|       if (!result) return INVALID_HOST; | 
|       this.host = result; | 
|     // opaque host | 
|     } else if (!this.isSpecial()) { | 
|       if (exec(FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT, input)) return INVALID_HOST; | 
|       result = ''; | 
|       codePoints = arrayFrom(input); | 
|       for (index = 0; index < codePoints.length; index++) { | 
|         result += percentEncode(codePoints[index], C0ControlPercentEncodeSet); | 
|       } | 
|       this.host = result; | 
|     } else { | 
|       input = toASCII(input); | 
|       if (exec(FORBIDDEN_HOST_CODE_POINT, input)) return INVALID_HOST; | 
|       result = parseIPv4(input); | 
|       if (result === null) return INVALID_HOST; | 
|       this.host = result; | 
|     } | 
|   }, | 
|   // https://url.spec.whatwg.org/#cannot-have-a-username-password-port | 
|   cannotHaveUsernamePasswordPort: function () { | 
|     return !this.host || this.cannotBeABaseURL || this.scheme === 'file'; | 
|   }, | 
|   // https://url.spec.whatwg.org/#include-credentials | 
|   includesCredentials: function () { | 
|     return this.username !== '' || this.password !== ''; | 
|   }, | 
|   // https://url.spec.whatwg.org/#is-special | 
|   isSpecial: function () { | 
|     return hasOwn(specialSchemes, this.scheme); | 
|   }, | 
|   // https://url.spec.whatwg.org/#shorten-a-urls-path | 
|   shortenPath: function () { | 
|     var path = this.path; | 
|     var pathSize = path.length; | 
|     if (pathSize && (this.scheme !== 'file' || pathSize !== 1 || !isWindowsDriveLetter(path[0], true))) { | 
|       path.length--; | 
|     } | 
|   }, | 
|   // https://url.spec.whatwg.org/#concept-url-serializer | 
|   serialize: function () { | 
|     var url = this; | 
|     var scheme = url.scheme; | 
|     var username = url.username; | 
|     var password = url.password; | 
|     var host = url.host; | 
|     var port = url.port; | 
|     var path = url.path; | 
|     var query = url.query; | 
|     var fragment = url.fragment; | 
|     var output = scheme + ':'; | 
|     if (host !== null) { | 
|       output += '//'; | 
|       if (url.includesCredentials()) { | 
|         output += username + (password ? ':' + password : '') + '@'; | 
|       } | 
|       output += serializeHost(host); | 
|       if (port !== null) output += ':' + port; | 
|     } else if (scheme === 'file') output += '//'; | 
|     output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + join(path, '/') : ''; | 
|     if (query !== null) output += '?' + query; | 
|     if (fragment !== null) output += '#' + fragment; | 
|     return output; | 
|   }, | 
|   // https://url.spec.whatwg.org/#dom-url-href | 
|   setHref: function (href) { | 
|     var failure = this.parse(href); | 
|     if (failure) throw new TypeError(failure); | 
|     this.searchParams.update(); | 
|   }, | 
|   // https://url.spec.whatwg.org/#dom-url-origin | 
|   getOrigin: function () { | 
|     var scheme = this.scheme; | 
|     var port = this.port; | 
|     if (scheme === 'blob') try { | 
|       return new URLConstructor(scheme.path[0]).origin; | 
|     } catch (error) { | 
|       return 'null'; | 
|     } | 
|     if (scheme === 'file' || !this.isSpecial()) return 'null'; | 
|     return scheme + '://' + serializeHost(this.host) + (port !== null ? ':' + port : ''); | 
|   }, | 
|   // https://url.spec.whatwg.org/#dom-url-protocol | 
|   getProtocol: function () { | 
|     return this.scheme + ':'; | 
|   }, | 
|   setProtocol: function (protocol) { | 
|     this.parse($toString(protocol) + ':', SCHEME_START); | 
|   }, | 
|   // https://url.spec.whatwg.org/#dom-url-username | 
|   getUsername: function () { | 
|     return this.username; | 
|   }, | 
|   setUsername: function (username) { | 
|     var codePoints = arrayFrom($toString(username)); | 
|     if (this.cannotHaveUsernamePasswordPort()) return; | 
|     this.username = ''; | 
|     for (var i = 0; i < codePoints.length; i++) { | 
|       this.username += percentEncode(codePoints[i], userinfoPercentEncodeSet); | 
|     } | 
|   }, | 
|   // https://url.spec.whatwg.org/#dom-url-password | 
|   getPassword: function () { | 
|     return this.password; | 
|   }, | 
|   setPassword: function (password) { | 
|     var codePoints = arrayFrom($toString(password)); | 
|     if (this.cannotHaveUsernamePasswordPort()) return; | 
|     this.password = ''; | 
|     for (var i = 0; i < codePoints.length; i++) { | 
|       this.password += percentEncode(codePoints[i], userinfoPercentEncodeSet); | 
|     } | 
|   }, | 
|   // https://url.spec.whatwg.org/#dom-url-host | 
|   getHost: function () { | 
|     var host = this.host; | 
|     var port = this.port; | 
|     return host === null ? '' | 
|       : port === null ? serializeHost(host) | 
|       : serializeHost(host) + ':' + port; | 
|   }, | 
|   setHost: function (host) { | 
|     if (this.cannotBeABaseURL) return; | 
|     this.parse(host, HOST); | 
|   }, | 
|   // https://url.spec.whatwg.org/#dom-url-hostname | 
|   getHostname: function () { | 
|     var host = this.host; | 
|     return host === null ? '' : serializeHost(host); | 
|   }, | 
|   setHostname: function (hostname) { | 
|     if (this.cannotBeABaseURL) return; | 
|     this.parse(hostname, HOSTNAME); | 
|   }, | 
|   // https://url.spec.whatwg.org/#dom-url-port | 
|   getPort: function () { | 
|     var port = this.port; | 
|     return port === null ? '' : $toString(port); | 
|   }, | 
|   setPort: function (port) { | 
|     if (this.cannotHaveUsernamePasswordPort()) return; | 
|     port = $toString(port); | 
|     if (port === '') this.port = null; | 
|     else this.parse(port, PORT); | 
|   }, | 
|   // https://url.spec.whatwg.org/#dom-url-pathname | 
|   getPathname: function () { | 
|     var path = this.path; | 
|     return this.cannotBeABaseURL ? path[0] : path.length ? '/' + join(path, '/') : ''; | 
|   }, | 
|   setPathname: function (pathname) { | 
|     if (this.cannotBeABaseURL) return; | 
|     this.path = []; | 
|     this.parse(pathname, PATH_START); | 
|   }, | 
|   // https://url.spec.whatwg.org/#dom-url-search | 
|   getSearch: function () { | 
|     var query = this.query; | 
|     return query ? '?' + query : ''; | 
|   }, | 
|   setSearch: function (search) { | 
|     search = $toString(search); | 
|     if (search === '') { | 
|       this.query = null; | 
|     } else { | 
|       if (charAt(search, 0) === '?') search = stringSlice(search, 1); | 
|       this.query = ''; | 
|       this.parse(search, QUERY); | 
|     } | 
|     this.searchParams.update(); | 
|   }, | 
|   // https://url.spec.whatwg.org/#dom-url-searchparams | 
|   getSearchParams: function () { | 
|     return this.searchParams.facade; | 
|   }, | 
|   // https://url.spec.whatwg.org/#dom-url-hash | 
|   getHash: function () { | 
|     var fragment = this.fragment; | 
|     return fragment ? '#' + fragment : ''; | 
|   }, | 
|   setHash: function (hash) { | 
|     hash = $toString(hash); | 
|     if (hash === '') { | 
|       this.fragment = null; | 
|       return; | 
|     } | 
|     if (charAt(hash, 0) === '#') hash = stringSlice(hash, 1); | 
|     this.fragment = ''; | 
|     this.parse(hash, FRAGMENT); | 
|   }, | 
|   update: function () { | 
|     this.query = this.searchParams.serialize() || null; | 
|   } | 
| }; | 
|   | 
| // `URL` constructor | 
| // https://url.spec.whatwg.org/#url-class | 
| var URLConstructor = function URL(url /* , base */) { | 
|   var that = anInstance(this, URLPrototype); | 
|   var base = validateArgumentsLength(arguments.length, 1) > 1 ? arguments[1] : undefined; | 
|   var state = setInternalState(that, new URLState(url, false, base)); | 
|   if (!DESCRIPTORS) { | 
|     that.href = state.serialize(); | 
|     that.origin = state.getOrigin(); | 
|     that.protocol = state.getProtocol(); | 
|     that.username = state.getUsername(); | 
|     that.password = state.getPassword(); | 
|     that.host = state.getHost(); | 
|     that.hostname = state.getHostname(); | 
|     that.port = state.getPort(); | 
|     that.pathname = state.getPathname(); | 
|     that.search = state.getSearch(); | 
|     that.searchParams = state.getSearchParams(); | 
|     that.hash = state.getHash(); | 
|   } | 
| }; | 
|   | 
| var URLPrototype = URLConstructor.prototype; | 
|   | 
| var accessorDescriptor = function (getter, setter) { | 
|   return { | 
|     get: function () { | 
|       return getInternalURLState(this)[getter](); | 
|     }, | 
|     set: setter && function (value) { | 
|       return getInternalURLState(this)[setter](value); | 
|     }, | 
|     configurable: true, | 
|     enumerable: true | 
|   }; | 
| }; | 
|   | 
| if (DESCRIPTORS) { | 
|   // `URL.prototype.href` accessors pair | 
|   // https://url.spec.whatwg.org/#dom-url-href | 
|   defineBuiltInAccessor(URLPrototype, 'href', accessorDescriptor('serialize', 'setHref')); | 
|   // `URL.prototype.origin` getter | 
|   // https://url.spec.whatwg.org/#dom-url-origin | 
|   defineBuiltInAccessor(URLPrototype, 'origin', accessorDescriptor('getOrigin')); | 
|   // `URL.prototype.protocol` accessors pair | 
|   // https://url.spec.whatwg.org/#dom-url-protocol | 
|   defineBuiltInAccessor(URLPrototype, 'protocol', accessorDescriptor('getProtocol', 'setProtocol')); | 
|   // `URL.prototype.username` accessors pair | 
|   // https://url.spec.whatwg.org/#dom-url-username | 
|   defineBuiltInAccessor(URLPrototype, 'username', accessorDescriptor('getUsername', 'setUsername')); | 
|   // `URL.prototype.password` accessors pair | 
|   // https://url.spec.whatwg.org/#dom-url-password | 
|   defineBuiltInAccessor(URLPrototype, 'password', accessorDescriptor('getPassword', 'setPassword')); | 
|   // `URL.prototype.host` accessors pair | 
|   // https://url.spec.whatwg.org/#dom-url-host | 
|   defineBuiltInAccessor(URLPrototype, 'host', accessorDescriptor('getHost', 'setHost')); | 
|   // `URL.prototype.hostname` accessors pair | 
|   // https://url.spec.whatwg.org/#dom-url-hostname | 
|   defineBuiltInAccessor(URLPrototype, 'hostname', accessorDescriptor('getHostname', 'setHostname')); | 
|   // `URL.prototype.port` accessors pair | 
|   // https://url.spec.whatwg.org/#dom-url-port | 
|   defineBuiltInAccessor(URLPrototype, 'port', accessorDescriptor('getPort', 'setPort')); | 
|   // `URL.prototype.pathname` accessors pair | 
|   // https://url.spec.whatwg.org/#dom-url-pathname | 
|   defineBuiltInAccessor(URLPrototype, 'pathname', accessorDescriptor('getPathname', 'setPathname')); | 
|   // `URL.prototype.search` accessors pair | 
|   // https://url.spec.whatwg.org/#dom-url-search | 
|   defineBuiltInAccessor(URLPrototype, 'search', accessorDescriptor('getSearch', 'setSearch')); | 
|   // `URL.prototype.searchParams` getter | 
|   // https://url.spec.whatwg.org/#dom-url-searchparams | 
|   defineBuiltInAccessor(URLPrototype, 'searchParams', accessorDescriptor('getSearchParams')); | 
|   // `URL.prototype.hash` accessors pair | 
|   // https://url.spec.whatwg.org/#dom-url-hash | 
|   defineBuiltInAccessor(URLPrototype, 'hash', accessorDescriptor('getHash', 'setHash')); | 
| } | 
|   | 
| // `URL.prototype.toJSON` method | 
| // https://url.spec.whatwg.org/#dom-url-tojson | 
| defineBuiltIn(URLPrototype, 'toJSON', function toJSON() { | 
|   return getInternalURLState(this).serialize(); | 
| }, { enumerable: true }); | 
|   | 
| // `URL.prototype.toString` method | 
| // https://url.spec.whatwg.org/#URL-stringification-behavior | 
| defineBuiltIn(URLPrototype, 'toString', function toString() { | 
|   return getInternalURLState(this).serialize(); | 
| }, { enumerable: true }); | 
|   | 
| if (NativeURL) { | 
|   var nativeCreateObjectURL = NativeURL.createObjectURL; | 
|   var nativeRevokeObjectURL = NativeURL.revokeObjectURL; | 
|   // `URL.createObjectURL` method | 
|   // https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL | 
|   if (nativeCreateObjectURL) defineBuiltIn(URLConstructor, 'createObjectURL', bind(nativeCreateObjectURL, NativeURL)); | 
|   // `URL.revokeObjectURL` method | 
|   // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL | 
|   if (nativeRevokeObjectURL) defineBuiltIn(URLConstructor, 'revokeObjectURL', bind(nativeRevokeObjectURL, NativeURL)); | 
| } | 
|   | 
| setToStringTag(URLConstructor, 'URL'); | 
|   | 
| $({ global: true, constructor: true, forced: !USE_NATIVE_URL, sham: !DESCRIPTORS }, { | 
|   URL: URLConstructor | 
| }); |