exacturi 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +7 -0
- package/README.md +2 -0
- package/dist/cjs/errors.d.ts +11 -0
- package/dist/cjs/errors.d.ts.map +1 -0
- package/dist/cjs/errors.js +39 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/exacturi.d.ts +91 -0
- package/dist/cjs/exacturi.d.ts.map +1 -0
- package/dist/cjs/exacturi.js +332 -0
- package/dist/cjs/exacturi.js.map +1 -0
- package/dist/cjs/index.d.ts +29 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +19 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/parts.d.ts +15 -0
- package/dist/cjs/parts.d.ts.map +1 -0
- package/dist/cjs/parts.js +3 -0
- package/dist/cjs/parts.js.map +1 -0
- package/dist/cjs/reuri.d.ts +92 -0
- package/dist/cjs/reuri.d.ts.map +1 -0
- package/dist/cjs/reuri.js +345 -0
- package/dist/cjs/reuri.js.map +1 -0
- package/dist/cjs/utils.d.ts +3 -0
- package/dist/cjs/utils.d.ts.map +1 -0
- package/dist/cjs/utils.js +45 -0
- package/dist/cjs/utils.js.map +1 -0
- package/dist/esm/errors.d.ts +11 -0
- package/dist/esm/errors.d.ts.map +1 -0
- package/dist/esm/errors.js +28 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/exacturi.d.ts +91 -0
- package/dist/esm/exacturi.d.ts.map +1 -0
- package/dist/esm/exacturi.js +328 -0
- package/dist/esm/exacturi.js.map +1 -0
- package/dist/esm/index.d.ts +29 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +13 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/parts.d.ts +15 -0
- package/dist/esm/parts.d.ts.map +1 -0
- package/dist/esm/parts.js +2 -0
- package/dist/esm/parts.js.map +1 -0
- package/dist/esm/reuri.d.ts +92 -0
- package/dist/esm/reuri.d.ts.map +1 -0
- package/dist/esm/reuri.js +341 -0
- package/dist/esm/reuri.js.map +1 -0
- package/dist/esm/utils.d.ts +3 -0
- package/dist/esm/utils.d.ts.map +1 -0
- package/dist/esm/utils.js +41 -0
- package/dist/esm/utils.js.map +1 -0
- package/dist/lib/errors.d.ts +14 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +52 -0
- package/dist/lib/index.d.ts +31 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +20 -0
- package/dist/lib/parts.d.ts +18 -0
- package/dist/lib/parts.d.ts.map +1 -0
- package/dist/lib/parts.js +3 -0
- package/dist/lib/payload.d.ts +17 -0
- package/dist/lib/payload.d.ts.map +1 -0
- package/dist/lib/payload.js +126 -0
- package/dist/lib/reuri.d.ts +127 -0
- package/dist/lib/reuri.d.ts.map +1 -0
- package/dist/lib/reuri.js +457 -0
- package/dist/lib/utils.d.ts +2 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +26 -0
- package/dist/test/basic.test.js +319 -0
- package/dist/test/basic.test.js.map +1 -0
- package/dist/test/extras.test.js +77 -0
- package/dist/test/extras.test.js.map +1 -0
- package/dist/test/matching.test.js +80 -0
- package/dist/test/matching.test.js.map +1 -0
- package/package.json +101 -0
- package/src/errors.ts +31 -0
- package/src/exacturi.ts +444 -0
- package/src/index.ts +37 -0
- package/src/parts.ts +29 -0
- package/src/utils.ts +42 -0
|
@@ -0,0 +1,457 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.ReUri = exports.DEBUG = void 0;
|
|
5
|
+
const errors_js_1 = require("./errors.js");
|
|
6
|
+
const utils_js_1 = require("./utils.js");
|
|
7
|
+
const types_1 = require("@reflectiz/types");
|
|
8
|
+
const payload_1 = require("./payload");
|
|
9
|
+
exports.DEBUG = Symbol("debug");
|
|
10
|
+
/**
|
|
11
|
+
* Represents a URI and allows performing operations and inspecting it.
|
|
12
|
+
*
|
|
13
|
+
* This class is immutable.
|
|
14
|
+
*/
|
|
15
|
+
class ReUri {
|
|
16
|
+
// Lots of params needed here
|
|
17
|
+
// eslint-disable-next-line max-params
|
|
18
|
+
constructor(_protocol, _hostname, _path, _query, _hash, _payload, _trace, _parsed, _port) {
|
|
19
|
+
this._protocol = _protocol;
|
|
20
|
+
this._hostname = _hostname;
|
|
21
|
+
this._path = _path;
|
|
22
|
+
this._query = _query;
|
|
23
|
+
this._hash = _hash;
|
|
24
|
+
this._payload = _payload;
|
|
25
|
+
this._trace = _trace;
|
|
26
|
+
this._parsed = _parsed;
|
|
27
|
+
this._port = _port;
|
|
28
|
+
if (_hostname) {
|
|
29
|
+
this._hostname = _hostname.replace("_", ".");
|
|
30
|
+
if (this._hostname.includes("_")) {
|
|
31
|
+
console.warn(`The hostname contains multiple underscores, which might not be intended. Current hostname: ${this._hostname}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
this[0] = this._print(false);
|
|
35
|
+
}
|
|
36
|
+
static isReuri(other) {
|
|
37
|
+
return !!(other &&
|
|
38
|
+
typeof other === "object" &&
|
|
39
|
+
other.constructor &&
|
|
40
|
+
"__isReuri" in other.constructor);
|
|
41
|
+
}
|
|
42
|
+
segments(overwrite) {
|
|
43
|
+
if (arguments.length === 0) {
|
|
44
|
+
return this._path.split("/");
|
|
45
|
+
}
|
|
46
|
+
const clone = this._noCopyClone();
|
|
47
|
+
clone._path = overwrite.join("/");
|
|
48
|
+
return clone;
|
|
49
|
+
}
|
|
50
|
+
merge(other) {
|
|
51
|
+
if (typeof other === "string") {
|
|
52
|
+
return this.merge(ReUri.parse(other));
|
|
53
|
+
}
|
|
54
|
+
const mergedParts = {
|
|
55
|
+
hash: other._hash || this._hash,
|
|
56
|
+
hostname: other._hostname || this._hostname,
|
|
57
|
+
path: other._path || this._path,
|
|
58
|
+
port: other._port || this._port,
|
|
59
|
+
protocol: other._protocol || this._protocol,
|
|
60
|
+
query: other._query || this._query,
|
|
61
|
+
trace: other._trace || this._trace
|
|
62
|
+
};
|
|
63
|
+
return this.parts(mergedParts).payloadMerge(other.payload()).trace(other.trace());
|
|
64
|
+
}
|
|
65
|
+
pick(...keys) {
|
|
66
|
+
let result = ReUri.empty();
|
|
67
|
+
for (const key of keys) {
|
|
68
|
+
result = result.part(key, this.part(key));
|
|
69
|
+
}
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
parts(overwrite) {
|
|
73
|
+
if (arguments.length === 0) {
|
|
74
|
+
return {
|
|
75
|
+
protocol: this._protocol,
|
|
76
|
+
hostname: this._hostname,
|
|
77
|
+
port: this._port,
|
|
78
|
+
path: this._path,
|
|
79
|
+
query: this._query,
|
|
80
|
+
hash: this._hash,
|
|
81
|
+
payload: this._payload,
|
|
82
|
+
trace: this._trace
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
if (!overwrite) {
|
|
86
|
+
return this;
|
|
87
|
+
}
|
|
88
|
+
const clone = this._noCopyClone();
|
|
89
|
+
clone._protocol = "protocol" in overwrite ? overwrite.protocol : clone._protocol;
|
|
90
|
+
clone._hostname = "hostname" in overwrite ? overwrite.hostname : clone._hostname;
|
|
91
|
+
clone._port = "port" in overwrite ? overwrite.port : clone._port;
|
|
92
|
+
clone._path = "path" in overwrite ? overwrite.path : clone._path;
|
|
93
|
+
clone._query = "query" in overwrite ? overwrite.query : clone._query;
|
|
94
|
+
clone._hash = "hash" in overwrite ? overwrite.hash : clone._hash;
|
|
95
|
+
clone._payload = "payload" in overwrite ? overwrite.payload : clone._payload;
|
|
96
|
+
clone._trace = "trace" in overwrite ? overwrite.trace : clone._trace;
|
|
97
|
+
return clone;
|
|
98
|
+
}
|
|
99
|
+
part(key, value) {
|
|
100
|
+
if (arguments.length === 1) {
|
|
101
|
+
const result = this[key]();
|
|
102
|
+
return typeof result === "object" ? result : (0, types_1.str)(result);
|
|
103
|
+
}
|
|
104
|
+
return this[key](value);
|
|
105
|
+
}
|
|
106
|
+
address(address) {
|
|
107
|
+
if (arguments.length === 1) {
|
|
108
|
+
const parsed = ReUri.parse(address);
|
|
109
|
+
return parsed.parts({
|
|
110
|
+
protocol: this._protocol
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
return this.parts({
|
|
114
|
+
protocol: undefined
|
|
115
|
+
}).href;
|
|
116
|
+
}
|
|
117
|
+
resource(resource) {
|
|
118
|
+
if (arguments.length === 1) {
|
|
119
|
+
const parsed = ReUri.parse(resource);
|
|
120
|
+
return parsed.parts({
|
|
121
|
+
protocol: this._protocol,
|
|
122
|
+
hostname: this._hostname,
|
|
123
|
+
port: this._port
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
return this.parts({
|
|
127
|
+
protocol: undefined,
|
|
128
|
+
hostname: undefined,
|
|
129
|
+
port: undefined
|
|
130
|
+
}).href;
|
|
131
|
+
}
|
|
132
|
+
origin(origin) {
|
|
133
|
+
if (arguments.length === 1) {
|
|
134
|
+
const parsed = ReUri.parse(origin);
|
|
135
|
+
return this.parts({
|
|
136
|
+
protocol: parsed._protocol,
|
|
137
|
+
hostname: parsed._hostname,
|
|
138
|
+
port: parsed._port
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
const parts = this.parts();
|
|
142
|
+
return (ReUri.empty().parts({
|
|
143
|
+
protocol: parts.protocol,
|
|
144
|
+
hostname: parts.hostname,
|
|
145
|
+
port: parts.port
|
|
146
|
+
}).href || undefined);
|
|
147
|
+
}
|
|
148
|
+
segment(index, value) {
|
|
149
|
+
if (arguments.length === 0) {
|
|
150
|
+
throw new errors_js_1.ReUriError(`You must provide an index.`);
|
|
151
|
+
}
|
|
152
|
+
if (arguments.length === 1) {
|
|
153
|
+
return this._path.split("/")[index];
|
|
154
|
+
}
|
|
155
|
+
const segments = this.segments();
|
|
156
|
+
segments[index] = value;
|
|
157
|
+
return this.segments(segments);
|
|
158
|
+
}
|
|
159
|
+
path(path) {
|
|
160
|
+
if (arguments.length === 0) {
|
|
161
|
+
return this._path;
|
|
162
|
+
}
|
|
163
|
+
const clone = this._noCopyClone();
|
|
164
|
+
clone._path = path ?? "";
|
|
165
|
+
return clone;
|
|
166
|
+
}
|
|
167
|
+
port(port) {
|
|
168
|
+
if (arguments.length === 0) {
|
|
169
|
+
return (0, types_1.int)(this._port);
|
|
170
|
+
}
|
|
171
|
+
if (port === true) {
|
|
172
|
+
return this._port;
|
|
173
|
+
}
|
|
174
|
+
const clone = this._noCopyClone();
|
|
175
|
+
clone._port = (0, types_1.str)(port) ?? undefined;
|
|
176
|
+
return clone;
|
|
177
|
+
}
|
|
178
|
+
protocol(proto) {
|
|
179
|
+
if (arguments.length === 0) {
|
|
180
|
+
return this._protocol;
|
|
181
|
+
}
|
|
182
|
+
const clone = this._noCopyClone();
|
|
183
|
+
clone._protocol = proto ?? undefined;
|
|
184
|
+
return clone;
|
|
185
|
+
}
|
|
186
|
+
host(host) {
|
|
187
|
+
if (arguments.length === 0) {
|
|
188
|
+
return (ReUri.empty().hostname(this._hostname).port(this._port).href.slice(2) || undefined);
|
|
189
|
+
}
|
|
190
|
+
if (host == null) {
|
|
191
|
+
return this.hostname(null).port(null);
|
|
192
|
+
}
|
|
193
|
+
const parsed = ReUri.parse(`//${host}`);
|
|
194
|
+
return this.hostname(parsed._hostname).port(parsed._port);
|
|
195
|
+
}
|
|
196
|
+
hostname(hostname) {
|
|
197
|
+
if (arguments.length === 0) {
|
|
198
|
+
return this._hostname;
|
|
199
|
+
}
|
|
200
|
+
const clone = this._noCopyClone();
|
|
201
|
+
clone._hostname = hostname ?? undefined;
|
|
202
|
+
return clone;
|
|
203
|
+
}
|
|
204
|
+
query(query) {
|
|
205
|
+
if (arguments.length === 0) {
|
|
206
|
+
return this._query;
|
|
207
|
+
}
|
|
208
|
+
const clone = this._noCopyClone();
|
|
209
|
+
clone._query = query ?? undefined;
|
|
210
|
+
return clone;
|
|
211
|
+
}
|
|
212
|
+
hash(hash) {
|
|
213
|
+
if (arguments.length === 0) {
|
|
214
|
+
return this._hash;
|
|
215
|
+
}
|
|
216
|
+
const clone = this._noCopyClone();
|
|
217
|
+
clone._hash = hash ?? undefined;
|
|
218
|
+
return clone;
|
|
219
|
+
}
|
|
220
|
+
_getEncodedPath(skipPayload = false) {
|
|
221
|
+
if (skipPayload) {
|
|
222
|
+
return this._path;
|
|
223
|
+
}
|
|
224
|
+
return (0, payload_1.getEncodedPath)(this._path, this._payload, this._trace);
|
|
225
|
+
}
|
|
226
|
+
_noCopyClone() {
|
|
227
|
+
return new ReUri(this._protocol, this._hostname, this._path, this._query, this._hash, this._payload, this._trace, this._parsed, this._port);
|
|
228
|
+
}
|
|
229
|
+
// Does this URL have a web protocol?
|
|
230
|
+
get isWeb() {
|
|
231
|
+
return !!this._protocol && webProtocols.has(this._protocol);
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Gets a clone of this instance. The payload is also cloned.
|
|
235
|
+
*/
|
|
236
|
+
clone() {
|
|
237
|
+
return new ReUri(this._protocol, this._hostname, this._path, this._query, this._hash, this._payload && { ...this._payload }, this._trace && { ...this._trace }, this._parsed, this._port);
|
|
238
|
+
}
|
|
239
|
+
static empty(payload) {
|
|
240
|
+
return new ReUri(undefined, undefined, "", undefined, undefined, payload, undefined, undefined, undefined);
|
|
241
|
+
}
|
|
242
|
+
static parse(input) {
|
|
243
|
+
if (input == null) {
|
|
244
|
+
return ReUri.empty();
|
|
245
|
+
}
|
|
246
|
+
if (input instanceof ReUri) {
|
|
247
|
+
return input;
|
|
248
|
+
}
|
|
249
|
+
if (typeof input === "object") {
|
|
250
|
+
return ReUri.empty().parts(input);
|
|
251
|
+
}
|
|
252
|
+
if (typeof input !== "string") {
|
|
253
|
+
throw (0, errors_js_1.inputMustBeString)(input);
|
|
254
|
+
}
|
|
255
|
+
const r = urlRegexp.exec(input);
|
|
256
|
+
if (!r) {
|
|
257
|
+
throw (0, errors_js_1.inputMustBeUrl)(input);
|
|
258
|
+
}
|
|
259
|
+
let [, proto, hostname, port, pathWithPayload, query, fragment] = r;
|
|
260
|
+
if (port != null && (Number.isNaN(+port) || port === "")) {
|
|
261
|
+
throw (0, errors_js_1.portMustBeNumeric)(input);
|
|
262
|
+
}
|
|
263
|
+
let { payload, tracePayload, path } = (0, payload_1.extractPayload)(pathWithPayload);
|
|
264
|
+
const somePayload = payload || tracePayload;
|
|
265
|
+
if (somePayload?.__trim) {
|
|
266
|
+
// This will only be set if the path is fake and only created for the payload
|
|
267
|
+
path = "";
|
|
268
|
+
delete somePayload.__trim;
|
|
269
|
+
}
|
|
270
|
+
if (somePayload) {
|
|
271
|
+
hostname = hostname?.replace(/_([^.]*)$/, ".$1");
|
|
272
|
+
}
|
|
273
|
+
return new ReUri(proto?.trim(), hostname?.trim(), path?.trim(), query?.trim(), fragment?.trim(), payload, tracePayload, input, port);
|
|
274
|
+
}
|
|
275
|
+
payloadMerge(more) {
|
|
276
|
+
const payload = Object.assign({}, this._payload, more);
|
|
277
|
+
return this.payload(payload);
|
|
278
|
+
}
|
|
279
|
+
trace(something) {
|
|
280
|
+
if (arguments.length === 0) {
|
|
281
|
+
return (this._trace && {
|
|
282
|
+
...this._trace
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
if (something == null) {
|
|
286
|
+
return this;
|
|
287
|
+
}
|
|
288
|
+
(0, errors_js_1.payloadMustBeObject)(something);
|
|
289
|
+
const tracePayload = something instanceof ReUri ? something.trace() : something;
|
|
290
|
+
(0, payload_1.mustValidatePayload)(tracePayload);
|
|
291
|
+
const clone = this._noCopyClone();
|
|
292
|
+
clone._trace = {
|
|
293
|
+
...this._trace,
|
|
294
|
+
...tracePayload
|
|
295
|
+
};
|
|
296
|
+
return clone;
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Checks if this URI (CHILD) matches another URI (PARENT). The parent can be a string,
|
|
300
|
+
* a {@link ReUri} or, or an object describing the parts of a URI -- a {@link ReUriParts}.
|
|
301
|
+
*
|
|
302
|
+
* CHILD is considered to be a child of PARENT if:
|
|
303
|
+
* 1. If PARENT has a protocol, it must equal CHILD protocol.
|
|
304
|
+
* 2. If PARENT has a hostname, it must be a parent of CHILD's hostname.
|
|
305
|
+
* 3. If PARENT has a port, it must equal CHILD's port.
|
|
306
|
+
* 4. If PARENT has a path, it must be a parent of CHILD's path.
|
|
307
|
+
* 5. If PARENT has a query, it must equal CHILD's query.
|
|
308
|
+
* 6. If PARENT has a hash, it must equal CHILD's hash.
|
|
309
|
+
* 7. If PARENT has a payload, its properties must match CHILD's payload.
|
|
310
|
+
* 8. The trace payload is ignored.
|
|
311
|
+
* @param parent The parent URI to check against.
|
|
312
|
+
*
|
|
313
|
+
*/
|
|
314
|
+
matches(parent) {
|
|
315
|
+
parent = ReUri.parse(parent);
|
|
316
|
+
if (parent._protocol && parent._protocol !== this._protocol) {
|
|
317
|
+
return false;
|
|
318
|
+
}
|
|
319
|
+
if (parent._hostname && !(0, payload_1.hostnameContains)(this._hostname, parent._hostname)) {
|
|
320
|
+
return false;
|
|
321
|
+
}
|
|
322
|
+
if (parent._port && parent._port !== this._port) {
|
|
323
|
+
return false;
|
|
324
|
+
}
|
|
325
|
+
if (parent._query && parent._query !== this._query) {
|
|
326
|
+
return false;
|
|
327
|
+
}
|
|
328
|
+
if (parent._hash && parent._hash !== this._hash) {
|
|
329
|
+
return false;
|
|
330
|
+
}
|
|
331
|
+
if (parent._payload && !(0, payload_1.payloadContains)(this._payload, parent._payload)) {
|
|
332
|
+
return false;
|
|
333
|
+
}
|
|
334
|
+
const parentSegments = parent.segments();
|
|
335
|
+
const childSegments = this.segments();
|
|
336
|
+
for (let i = 0; i < parentSegments.length; i++) {
|
|
337
|
+
if (parentSegments[i] !== childSegments[i]) {
|
|
338
|
+
return false;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
return true;
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Checks if this URI equals another URI, which can be given as a string, a {@link ReUri} or, or an object describing the parts of a URI -- a
|
|
345
|
+
* {@link ReUriParts}.
|
|
346
|
+
* @param other The other URI to check against.
|
|
347
|
+
* @param skipPayload If true, the payload is ignored.
|
|
348
|
+
*/
|
|
349
|
+
equal(other, skipPayload = false) {
|
|
350
|
+
if (this === other) {
|
|
351
|
+
return true;
|
|
352
|
+
}
|
|
353
|
+
other = ReUri.parse(other);
|
|
354
|
+
const myParts = this.parts();
|
|
355
|
+
const otherParts = other.parts();
|
|
356
|
+
for (const key of ["protocol", "hostname", "port", "path", "query", "hash"]) {
|
|
357
|
+
if (myParts[key] !== otherParts[key]) {
|
|
358
|
+
return false;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
if (skipPayload) {
|
|
362
|
+
return true;
|
|
363
|
+
}
|
|
364
|
+
if (!this._payload || !other._payload) {
|
|
365
|
+
return this._payload === other._payload;
|
|
366
|
+
}
|
|
367
|
+
return (0, utils_js_1.equal)(this._payload, other._payload);
|
|
368
|
+
}
|
|
369
|
+
// An artificial URI is one that can't have been parsed from a string due to an invalid combination of components. For example,
|
|
370
|
+
// 1. A URL with a port but no hostname.
|
|
371
|
+
// 2. A URL with a hostname but no protocol.
|
|
372
|
+
// 3. A URL with
|
|
373
|
+
get isArtificial() {
|
|
374
|
+
return !ReUri.parse(this._print(true)).equal(this, true);
|
|
375
|
+
}
|
|
376
|
+
payload(something) {
|
|
377
|
+
if (arguments.length === 0) {
|
|
378
|
+
return (this._payload && {
|
|
379
|
+
...this._payload
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
if (this._protocol === "data") {
|
|
383
|
+
return this;
|
|
384
|
+
}
|
|
385
|
+
let payload;
|
|
386
|
+
payload = something instanceof ReUri ? something.payload() : something;
|
|
387
|
+
if (payload == null) {
|
|
388
|
+
payload = undefined;
|
|
389
|
+
}
|
|
390
|
+
else {
|
|
391
|
+
(0, errors_js_1.payloadMustBeObject)(something);
|
|
392
|
+
(0, payload_1.mustValidatePayload)(payload);
|
|
393
|
+
}
|
|
394
|
+
const clone = this._noCopyClone();
|
|
395
|
+
clone._payload = payload && {
|
|
396
|
+
...payload
|
|
397
|
+
};
|
|
398
|
+
return clone;
|
|
399
|
+
}
|
|
400
|
+
_print(skipPayload = false) {
|
|
401
|
+
let { _protocol, _hostname, _query, _hash, _port } = this;
|
|
402
|
+
const somePayload = this._payload || this._trace;
|
|
403
|
+
skipPayload = skipPayload || ReUri[exports.DEBUG].dontEncodePayloads || false;
|
|
404
|
+
// If we have a payload, we need to mangle the hostname so payloaded requests don't get sent out to servers.
|
|
405
|
+
if (somePayload && _hostname != null && !skipPayload && !ReUri[exports.DEBUG].dontEncodePayloads) {
|
|
406
|
+
_hostname = _hostname.replace(/\.([^.]*)$/, "_$1");
|
|
407
|
+
}
|
|
408
|
+
_protocol = _protocol != null ? `${_protocol}:` : _protocol;
|
|
409
|
+
_hostname = _hostname != null ? `//${_hostname}` : "";
|
|
410
|
+
_query = _query != null ? `?${_query}` : "";
|
|
411
|
+
_hash = _hash != null ? `#${_hash}` : "";
|
|
412
|
+
const strPort = _port != null ? `:${_port}` : "";
|
|
413
|
+
const path = this._getEncodedPath(skipPayload);
|
|
414
|
+
return [_protocol, _hostname, strPort, path, _query, _hash].join("");
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Is this a fake URL generated by reflectiz?
|
|
418
|
+
*/
|
|
419
|
+
get isReflectiz() {
|
|
420
|
+
return !!this._protocol && riProtocols.has(this._protocol);
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* Does this URL have a non-web protocol?
|
|
424
|
+
*/
|
|
425
|
+
get isNonWeb() {
|
|
426
|
+
return !!this._protocol && !webProtocols.has(this._protocol);
|
|
427
|
+
}
|
|
428
|
+
/**
|
|
429
|
+
* Gets the full URI, including the payload.
|
|
430
|
+
*/
|
|
431
|
+
get href() {
|
|
432
|
+
return this._print(false);
|
|
433
|
+
}
|
|
434
|
+
/**
|
|
435
|
+
* Gets the full URI, minus the payload.
|
|
436
|
+
*/
|
|
437
|
+
get canonical() {
|
|
438
|
+
return this._print(true);
|
|
439
|
+
}
|
|
440
|
+
get [(_a = exports.DEBUG, Symbol.toStringTag)]() {
|
|
441
|
+
return this.href;
|
|
442
|
+
}
|
|
443
|
+
toString() {
|
|
444
|
+
return this.href;
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
exports.ReUri = ReUri;
|
|
448
|
+
ReUri[_a] = {
|
|
449
|
+
dontEncodePayloads: false
|
|
450
|
+
};
|
|
451
|
+
const urlRegexp = /^(?:([a-zA-Z][A-Za-z\d+-.]*):)?(?:\/\/([^/?#:]*)(?::([^/?#]*))?)?([^?#]*)?(?:\?([^#]*))?(?:#(.*))?$/;
|
|
452
|
+
const webProtocols = new Set(["http", "ws", "https", "wss"]);
|
|
453
|
+
const riProtocols = new Set(["inline", "dynamic", "reflectiz"]);
|
|
454
|
+
Object.defineProperty(ReUri, "__isReuri", {
|
|
455
|
+
value: true
|
|
456
|
+
});
|
|
457
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV1cmkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL3JldXJpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSwyQ0FNcUI7QUFDckIseUNBQW1DO0FBQ25DLDRDQUE0QztBQUM1Qyx1Q0FRbUI7QUFPTixRQUFBLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7QUFFckM7Ozs7R0FJRztBQUNILE1BQWEsS0FBSztJQUtkLDZCQUE2QjtJQUM3QixzQ0FBc0M7SUFDdEMsWUFDWSxTQUErQixFQUMvQixTQUE2QixFQUM3QixLQUFhLEVBQ2IsTUFBMEIsRUFDMUIsS0FBeUIsRUFDekIsUUFBYyxFQUNkLE1BQTJCLEVBQzNCLE9BQTJCLEVBQzNCLEtBQXlCO1FBUnpCLGNBQVMsR0FBVCxTQUFTLENBQXNCO1FBQy9CLGNBQVMsR0FBVCxTQUFTLENBQW9CO1FBQzdCLFVBQUssR0FBTCxLQUFLLENBQVE7UUFDYixXQUFNLEdBQU4sTUFBTSxDQUFvQjtRQUMxQixVQUFLLEdBQUwsS0FBSyxDQUFvQjtRQUN6QixhQUFRLEdBQVIsUUFBUSxDQUFNO1FBQ2QsV0FBTSxHQUFOLE1BQU0sQ0FBcUI7UUFDM0IsWUFBTyxHQUFQLE9BQU8sQ0FBb0I7UUFDM0IsVUFBSyxHQUFMLEtBQUssQ0FBb0I7UUFFakMsSUFBSSxTQUFTLEVBQUU7WUFDWCxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzdDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzlCLE9BQU8sQ0FBQyxJQUFJLENBQ1IsOEZBQThGLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FDakgsQ0FBQzthQUNMO1NBQ0o7UUFFRCxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNq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LFNBQU8sR0FBc0I7SUFDekMsa0JBQWtCLEVBQUUsS0FBSztDQUM1QixDQUFDO0FBNmxCTixNQUFNLFNBQVMsR0FDWCxxR0FBcUcsQ0FBQztBQUUxRyxNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFFN0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7QUFFaEUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFO0lBQ3RDLEtBQUssRUFBRSxJQUFJO0NBQ2QsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBpbnB1dE11c3RCZVN0cmluZyxcbiAgICBpbnB1dE11c3RCZVVybCxcbiAgICBwYXlsb2FkTXVzdEJlT2JqZWN0LFxuICAgIHBvcnRNdXN0QmVOdW1lcmljLFxuICAgIFJlVXJpRXJyb3Jcbn0gZnJvbSBcIi4vZXJyb3JzLmpzXCI7XG5pbXBvcnQgeyBlcXVhbCB9IGZyb20gXCIuL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBpbnQsIHN0ciB9IGZyb20gXCJAcmVmbGVjdGl6L3R5cGVzXCI7XG5pbXBvcnQge1xuICAgIGV4dHJhY3RQYXlsb2FkLFxuICAgIGdldEVuY29kZWRQYXRoLFxuICAgIGhvc3RuYW1lQ29udGFpbnMsXG4gICAgbXVzdFZhbGlkYXRlUGF5bG9hZCxcbiAgICBQYXlsb2FkLFxuICAgIHBheWxvYWRDb250YWlucyxcbiAgICBQYXlsb2FkT3JEZWZhdWx0XG59IGZyb20gXCIuL3BheWxvYWRcIjtcbmltcG9ydCB7IFByb3RvY29sLCBSZVVyaUNvbXBvdW5kTmFtZXMsIFJlVXJpUGFydHMsIFJlVXJpUGF0aEtleSB9IGZyb20gXCIuL3BhcnRzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVVcmlEZWJ1Z09wdGlvbnMge1xuICAgIGRvbnRFbmNvZGVQYXlsb2Fkcz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBERUJVRyA9IFN5bWJvbChcImRlYnVnXCIpO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBVUkkgYW5kIGFsbG93cyBwZXJmb3JtaW5nIG9wZXJhdGlvbnMgYW5kIGluc3BlY3RpbmcgaXQuXG4gKlxuICogVGhpcyBjbGFzcyBpcyBpbW11dGFibGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZVVyaTxUUGF5IGV4dGVuZHMgUGF5bG9hZCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZD4ge1xuICAgIHN0YXRpYyByZWFkb25seSBbREVCVUddOiBSZVVyaURlYnVnT3B0aW9ucyA9IHtcbiAgICAgICAgZG9udEVuY29kZVBheWxvYWRzOiBmYWxzZVxuICAgIH07XG4gICAgcHJpdmF0ZSAwOiBzdHJpbmc7XG4gICAgLy8gTG90cyBvZiBwYXJhbXMgbmVlZGVkIGhlcmVcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXBhcmFtc1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIF9wcm90b2NvbDogUHJvdG9jb2wgfCB1bmRlZmluZWQsXG4gICAgICAgIHByaXZhdGUgX2hvc3RuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgIHByaXZhdGUgX3BhdGg6IHN0cmluZyxcbiAgICAgICAgcHJpdmF0ZSBfcXVlcnk6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgcHJpdmF0ZSBfaGFzaDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICBwcml2YXRlIF9wYXlsb2FkOiBUUGF5LFxuICAgICAgICBwcml2YXRlIF90cmFjZTogUGF5bG9hZCB8IHVuZGVmaW5lZCxcbiAgICAgICAgcHJpdmF0ZSBfcGFyc2VkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgIHByaXZhdGUgX3BvcnQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgICBpZiAoX2hvc3RuYW1lKSB7XG4gICAgICAgICAgICB0aGlzLl9ob3N0bmFtZSA9IF9ob3N0bmFtZS5yZXBsYWNlKFwiX1wiLCBcIi5cIik7XG4gICAgICAgICAgICBpZiAodGhpcy5faG9zdG5hbWUuaW5jbHVkZXMoXCJfXCIpKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgICBgVGhlIGhvc3RuYW1lIGNvbnRhaW5zIG11bHRpcGxlIHVuZGVyc2NvcmVzLCB3aGljaCBtaWdodCBub3QgYmUgaW50ZW5kZWQuIEN1cnJlbnQgaG9zdG5hbWU6ICR7dGhpcy5faG9zdG5hbWV9YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzWzBdID0gdGhpcy5fcHJpbnQoZmFsc2UpO1xuICAgIH1cblxuICAgIHN0YXRpYyBpc1JldXJpKG90aGVyOiB1bmtub3duKSB7XG4gICAgICAgIHJldHVybiAhIShcbiAgICAgICAgICAgIG90aGVyICYmXG4gICAgICAgICAgICB0eXBlb2Ygb3RoZXIgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIG90aGVyLmNvbnN0cnVjdG9yICYmXG4gICAgICAgICAgICBcIl9faXNSZXVyaVwiIGluIG90aGVyLmNvbnN0cnVjdG9yXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc2VnbWVudHMoKTogc3RyaW5nW107XG4gICAgc2VnbWVudHMob3ZlcndyaXRlOiBzdHJpbmdbXSk6IFJlVXJpPFRQYXk+O1xuICAgIHNlZ21lbnRzKG92ZXJ3cml0ZT86IHN0cmluZ1tdKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcGF0aC5zcGxpdChcIi9cIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2xvbmUgPSB0aGlzLl9ub0NvcHlDbG9uZSgpO1xuICAgICAgICBjbG9uZS5fcGF0aCA9IG92ZXJ3cml0ZSEuam9pbihcIi9cIik7XG4gICAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9XG5cbiAgICBtZXJnZShvdGhlcjogc3RyaW5nKTogUmVVcmk8VFBheT47XG4gICAgbWVyZ2Uob3RoZXI6IFJlVXJpPGFueT4pOiBSZVVyaTxUUGF5PjtcbiAgICBtZXJnZShvdGhlcjogUmVVcmk8YW55PiB8IHN0cmluZyk6IFJlVXJpPFRQYXk+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBvdGhlciA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWVyZ2UoUmVVcmkucGFyc2Uob3RoZXIpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXJnZWRQYXJ0czogUmVVcmlQYXJ0cyA9IHtcbiAgICAgICAgICAgIGhhc2g6IG90aGVyLl9oYXNoIHx8IHRoaXMuX2hhc2gsXG4gICAgICAgICAgICBob3N0bmFtZTogb3RoZXIuX2hvc3RuYW1lIHx8IHRoaXMuX2hvc3RuYW1lLFxuICAgICAgICAgICAgcGF0aDogb3RoZXIuX3BhdGggfHwgdGhpcy5fcGF0aCxcbiAgICAgICAgICAgIHBvcnQ6IG90aGVyLl9wb3J0IHx8IHRoaXMuX3BvcnQsXG4gICAgICAgICAgICBwcm90b2NvbDogb3RoZXIuX3Byb3RvY29sIHx8IHRoaXMuX3Byb3RvY29sLFxuICAgICAgICAgICAgcXVlcnk6IG90aGVyLl9xdWVyeSB8fCB0aGlzLl9xdWVyeSxcbiAgICAgICAgICAgIHRyYWNlOiBvdGhlci5fdHJhY2UgfHwgdGhpcy5fdHJhY2VcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFydHMobWVyZ2VkUGFydHMpLnBheWxvYWRNZXJnZShvdGhlci5wYXlsb2FkKCkpLnRyYWNlKG90aGVyLnRyYWNlKCkpO1xuICAgIH1cblxuICAgIHBpY2soLi4ua2V5czogUmVVcmlQYXRoS2V5W10pOiBSZVVyaTxUUGF5PiB7XG4gICAgICAgIGxldCByZXN1bHQgPSBSZVVyaS5lbXB0eSgpIGFzIFJlVXJpPFRQYXk+O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucGFydChrZXksIHRoaXMucGFydChrZXkgYXMgUmVVcmlDb21wb3VuZE5hbWVzKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwYXJ0cygpOiBSZVVyaVBhcnRzPFRQYXk+O1xuICAgIHBhcnRzPFRQYXkyIGV4dGVuZHMgUGF5bG9hZCB8IHVuZGVmaW5lZCA9IFRQYXk+KFxuICAgICAgICBvdmVyd3JpdGU6IFBhcnRpYWw8UmVVcmlQYXJ0czxQYXlsb2FkPj5cbiAgICApOiBSZVVyaTxUUGF5Mj47XG4gICAgcGFydHMob3ZlcndyaXRlPzogUGFydGlhbDxSZVVyaVBhcnRzPFBheWxvYWQ+Pik6IGFueSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHByb3RvY29sOiB0aGlzLl9wcm90b2NvbCxcbiAgICAgICAgICAgICAgICBob3N0bmFtZTogdGhpcy5faG9zdG5hbWUsXG4gICAgICAgICAgICAgICAgcG9ydDogdGhpcy5fcG9ydCxcbiAgICAgICAgICAgICAgICBwYXRoOiB0aGlzLl9wYXRoLFxuICAgICAgICAgICAgICAgIHF1ZXJ5OiB0aGlzLl9xdWVyeSxcbiAgICAgICAgICAgICAgICBoYXNoOiB0aGlzLl9oYXNoLFxuICAgICAgICAgICAgICAgIHBheWxvYWQ6IHRoaXMuX3BheWxvYWQsXG4gICAgICAgICAgICAgICAgdHJhY2U6IHRoaXMuX3RyYWNlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICghb3ZlcndyaXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjbG9uZSA9IHRoaXMuX25vQ29weUNsb25lKCk7XG4gICAgICAgIGNsb25lLl9wcm90b2NvbCA9IFwicHJvdG9jb2xcIiBpbiBvdmVyd3JpdGUgPyBvdmVyd3JpdGUucHJvdG9jb2wgOiBjbG9uZS5fcHJvdG9jb2w7XG4gICAgICAgIGNsb25lLl9ob3N0bmFtZSA9IFwiaG9zdG5hbWVcIiBpbiBvdmVyd3JpdGUgPyBvdmVyd3JpdGUuaG9zdG5hbWUgOiBjbG9uZS5faG9zdG5hbWU7XG4gICAgICAgIGNsb25lLl9wb3J0ID0gXCJwb3J0XCIgaW4gb3ZlcndyaXRlID8gb3ZlcndyaXRlLnBvcnQgOiBjbG9uZS5fcG9ydDtcbiAgICAgICAgY2xvbmUuX3BhdGggPSBcInBhdGhcIiBpbiBvdmVyd3JpdGUgPyAob3ZlcndyaXRlLnBhdGggYXMgYW55KSA6IGNsb25lLl9wYXRoO1xuICAgICAgICBjbG9uZS5fcXVlcnkgPSBcInF1ZXJ5XCIgaW4gb3ZlcndyaXRlID8gb3ZlcndyaXRlLnF1ZXJ5IDogY2xvbmUuX3F1ZXJ5O1xuICAgICAgICBjbG9uZS5faGFzaCA9IFwiaGFzaFwiIGluIG92ZXJ3cml0ZSA/IG92ZXJ3cml0ZS5oYXNoIDogY2xvbmUuX2hhc2g7XG4gICAgICAgIGNsb25lLl9wYXlsb2FkID0gXCJwYXlsb2FkXCIgaW4gb3ZlcndyaXRlID8gKG92ZXJ3cml0ZS5wYXlsb2FkIGFzIGFueSkgOiBjbG9uZS5fcGF5bG9hZDtcbiAgICAgICAgY2xvbmUuX3RyYWNlID0gXCJ0cmFjZVwiIGluIG92ZXJ3cml0ZSA/IG92ZXJ3cml0ZS50cmFjZSA6IGNsb25lLl90cmFjZTtcbiAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cblxuICAgIHBhcnQoa2V5OiBcInBheWxvYWRcIik6IFRQYXk7XG4gICAgcGFydChrZXk6IFwicGF5bG9hZFwiLCB2YWx1ZTogVFBheSk6IFJlVXJpPFRQYXk+O1xuICAgIHBhcnQoa2V5OiBcInRyYWNlXCIsIHZhbHVlOiBQYXlsb2FkKTogUmVVcmk8VFBheT47XG4gICAgcGFydChrZXk6IFwidHJhY2VcIik6IFBheWxvYWQ7XG4gICAgcGFydChrZXk6IEV4Y2x1ZGU8UmVVcmlQYXRoS2V5LCBcInBheWxvYWRcIiB8IFwidHJhY2VcIj4pOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgcGFydChrZXk6IFJlVXJpUGF0aEtleSwgdmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFJlVXJpPFRQYXk+O1xuICAgIHBhcnQoa2V5OiBSZVVyaVBhdGhLZXksIHZhbHVlPzogc3RyaW5nIHwgVFBheSB8IFBheWxvYWQpOiBhbnkge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpc1trZXldKCk7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIHJlc3VsdCA9PT0gXCJvYmplY3RcIiA/IHJlc3VsdCA6IHN0cihyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzW2tleV0odmFsdWUgYXMgYW55KTtcbiAgICB9XG5cbiAgICBhZGRyZXNzKGFkZHJlc3M6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwpOiBSZVVyaTxUUGF5PjtcbiAgICBhZGRyZXNzKCk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBhZGRyZXNzKGFkZHJlc3M/OiBzdHJpbmcpOiBzdHJpbmcgfCBSZVVyaTxUUGF5PiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBSZVVyaS5wYXJzZShhZGRyZXNzISk7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VkLnBhcnRzKHtcbiAgICAgICAgICAgICAgICBwcm90b2NvbDogdGhpcy5fcHJvdG9jb2xcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnRzKHtcbiAgICAgICAgICAgIHByb3RvY29sOiB1bmRlZmluZWRcbiAgICAgICAgfSkuaHJlZjtcbiAgICB9XG5cbiAgICByZXNvdXJjZShyZXNvdXJjZTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCk6IFJlVXJpPFRQYXk+O1xuICAgIHJlc291cmNlKCk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICByZXNvdXJjZShyZXNvdXJjZT86IHN0cmluZyk6IHN0cmluZyB8IFJlVXJpPFRQYXk+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IFJlVXJpLnBhcnNlKHJlc291cmNlISk7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VkLnBhcnRzKHtcbiAgICAgICAgICAgICAgICBwcm90b2NvbDogdGhpcy5fcHJvdG9jb2wsXG4gICAgICAgICAgICAgICAgaG9zdG5hbWU6IHRoaXMuX2hvc3RuYW1lLFxuICAgICAgICAgICAgICAgIHBvcnQ6IHRoaXMuX3BvcnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnRzKHtcbiAgICAgICAgICAgIHByb3RvY29sOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBob3N0bmFtZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcG9ydDogdW5kZWZpbmVkXG4gICAgICAgIH0pLmhyZWY7XG4gICAgfVxuXG4gICAgb3JpZ2luKG9yaWdpbjogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCk6IFJlVXJpPFRQYXk+O1xuICAgIG9yaWdpbigpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgb3JpZ2luKG9yaWdpbj86IHN0cmluZyk6IHN0cmluZyB8IFJlVXJpPFRQYXk+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IFJlVXJpLnBhcnNlKG9yaWdpbiEpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFydHMoe1xuICAgICAgICAgICAgICAgIHByb3RvY29sOiBwYXJzZWQuX3Byb3RvY29sLFxuICAgICAgICAgICAgICAgIGhvc3RuYW1lOiBwYXJzZWQuX2hvc3RuYW1lLFxuICAgICAgICAgICAgICAgIHBvcnQ6IHBhcnNlZC5fcG9ydFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFydHMgPSB0aGlzLnBhcnRzKCk7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBSZVVyaS5lbXB0eSgpLnBhcnRzKHtcbiAgICAgICAgICAgICAgICBwcm90b2NvbDogcGFydHMucHJvdG9jb2wsXG4gICAgICAgICAgICAgICAgaG9zdG5hbWU6IHBhcnRzLmhvc3RuYW1lLFxuICAgICAgICAgICAgICAgIHBvcnQ6IHBhcnRzLnBvcnRcbiAgICAgICAgICAgIH0pLmhyZWYgfHwgdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc2VnbWVudChpbmRleDogbnVtYmVyKTogc3RyaW5nO1xuICAgIHNlZ21lbnQoaW5kZXg6IG51bWJlciwgdmFsdWU6IHN0cmluZyk6IFJlVXJpPFRQYXk+O1xuICAgIHNlZ21lbnQoaW5kZXg6IG51bWJlciwgdmFsdWU/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSZVVyaUVycm9yKGBZb3UgbXVzdCBwcm92aWRlIGFuIGluZGV4LmApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcGF0aC5zcGxpdChcIi9cIilbaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlZ21lbnRzID0gdGhpcy5zZWdtZW50cygpO1xuICAgICAgICBzZWdtZW50c1tpbmRleF0gPSB2YWx1ZSE7XG4gICAgICAgIHJldHVybiB0aGlzLnNlZ21lbnRzKHNlZ21lbnRzKTtcbiAgICB9XG5cbiAgICAvLyBHZXRzIHRoZSBwYXRoLiBJdCBjYW4ndCBiZSBudWxsaXNoLlxuICAgIHBhdGgoKTogc3RyaW5nO1xuICAgIC8vIFNldHMgdGhlIHBhdGggdG8gYHBhdGhgLiBOdWxsIGlzIGNvbnZlcnRlZCB0byBgXCJcImAuXG4gICAgcGF0aChwYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsKTogUmVVcmk8VFBheT47XG4gICAgcGF0aChwYXRoPzogc3RyaW5nKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcGF0aDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjbG9uZSA9IHRoaXMuX25vQ29weUNsb25lKCk7XG4gICAgICAgIGNsb25lLl9wYXRoID0gcGF0aCA/PyBcIlwiO1xuICAgICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuXG4gICAgcG9ydCgpOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgcG9ydChyYXc6IHRydWUpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgcG9ydChwb3J0OiBudW1iZXIgfCB1bmRlZmluZWQgfCBzdHJpbmcgfCBudWxsKTogUmVVcmk8VFBheT47XG4gICAgcG9ydChwb3J0PzogbnVtYmVyIHwgdHJ1ZSB8IHN0cmluZyB8IG51bGwpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBpbnQodGhpcy5fcG9ydCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvcnQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wb3J0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNsb25lID0gdGhpcy5fbm9Db3B5Q2xvbmUoKTtcbiAgICAgICAgY2xvbmUuX3BvcnQgPSBzdHIocG9ydCkgPz8gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuXG4gICAgLy8gR2V0cyB0aGUgcHJvdG9jb2wuXG4gICAgcHJvdG9jb2woKTogUHJvdG9jb2wgfCB1bmRlZmluZWQ7XG4gICAgLy8gU2V0cyB0aGUgcHJvdG9jb2wgdG8gYHByb3RvYC5cbiAgICBwcm90b2NvbChwcm90bzogUHJvdG9jb2wgfCBudWxsIHwgdW5kZWZpbmVkKTogUmVVcmk8VFBheT47XG4gICAgcHJvdG9jb2wocHJvdG8/OiBQcm90b2NvbCB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm90b2NvbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjbG9uZSA9IHRoaXMuX25vQ29weUNsb25lKCk7XG4gICAgICAgIGNsb25lLl9wcm90b2NvbCA9IHByb3RvID8/IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cblxuICAgIC8vIEdldHMgdGhlIGhvc3RuYW1lIGFuZCBwb3J0LlxuICAgIGhvc3QoKTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIC8vIFNldHMgdGhlIGhvc3RuYW1lIGFuZCBwb3J0LlxuICAgIGhvc3QoaG9zdDogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCk6IFJlVXJpPFRQYXk+O1xuICAgIGhvc3QoaG9zdD86IHN0cmluZyk6IGFueSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIFJlVXJpLmVtcHR5KCkuaG9zdG5hbWUodGhpcy5faG9zdG5hbWUpLnBvcnQodGhpcy5fcG9ydCkuaHJlZi5zbGljZSgyKSB8fCB1bmRlZmluZWRcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhvc3QgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaG9zdG5hbWUobnVsbCkucG9ydChudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJzZWQgPSBSZVVyaS5wYXJzZShgLy8ke2hvc3R9YCk7XG4gICAgICAgIHJldHVybiB0aGlzLmhvc3RuYW1lKHBhcnNlZC5faG9zdG5hbWUpLnBvcnQocGFyc2VkLl9wb3J0KTtcbiAgICB9XG5cbiAgICAvLyBHZXRzIHRoZSBob3N0bmFtZSwgd2hpY2ggaXMgdGhlIGRvbWFpbiB3aXRob3V0IHRoZSBwb3J0LlxuICAgIGhvc3RuYW1lKCk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAvLyBTZXRzIHRoZSBob3N0bmFtZSB0byBgaG9zdG5hbWVgLlxuICAgIGhvc3RuYW1lKGhvc3RuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsKTogUmVVcmk8VFBheT47XG4gICAgaG9zdG5hbWUoaG9zdG5hbWU/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ob3N0bmFtZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjbG9uZSA9IHRoaXMuX25vQ29weUNsb25lKCk7XG4gICAgICAgIGNsb25lLl9ob3N0bmFtZSA9IGhvc3RuYW1lID8/IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cblxuICAgIC8vIEdldHMgdGhlIHF1ZXJ5IHN0cmluZy5cbiAgICBxdWVyeSgpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgLy8gU2V0cyB0aGUgcXVlcnkgc3RyaW5nIHRvIGBxdWVyeWAuXG4gICAgcXVlcnkocXVlcnk6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBSZVVyaTxUUGF5PjtcbiAgICBxdWVyeShxdWVyeT86IHN0cmluZykge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3F1ZXJ5O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNsb25lID0gdGhpcy5fbm9Db3B5Q2xvbmUoKTtcbiAgICAgICAgY2xvbmUuX3F1ZXJ5ID0gcXVlcnkgPz8gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuXG4gICAgLy8gR2V0cyB0aGUgaGFzaCwgYWthIHRoZSBmcmFnbWVudCwgd2l0aG91dCB0aGUgIy5cbiAgICBoYXNoKCk6IHN0cmluZztcbiAgICAvLyBTZXRzIHRoZSBoYXNoIG9mIHRoaXMgdG8gYGhhc2hgLCBhbmQgcmV0dXJucyBgdGhpc2AuXG4gICAgaGFzaChoYXNoOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogUmVVcmk8VFBheT47XG4gICAgaGFzaChoYXNoPzogc3RyaW5nKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faGFzaDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjbG9uZSA9IHRoaXMuX25vQ29weUNsb25lKCk7XG4gICAgICAgIGNsb25lLl9oYXNoID0gaGFzaCA/PyB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRFbmNvZGVkUGF0aChza2lwUGF5bG9hZCA9IGZhbHNlKSB7XG4gICAgICAgIGlmIChza2lwUGF5bG9hZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BhdGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdldEVuY29kZWRQYXRoKHRoaXMuX3BhdGgsIHRoaXMuX3BheWxvYWQsIHRoaXMuX3RyYWNlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9ub0NvcHlDbG9uZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZVVyaTxUUGF5PihcbiAgICAgICAgICAgIHRoaXMuX3Byb3RvY29sLFxuICAgICAgICAgICAgdGhpcy5faG9zdG5hbWUsXG4gICAgICAgICAgICB0aGlzLl9wYXRoLFxuICAgICAgICAgICAgdGhpcy5fcXVlcnksXG4gICAgICAgICAgICB0aGlzLl9oYXNoLFxuICAgICAgICAgICAgdGhpcy5fcGF5bG9hZCxcbiAgICAgICAgICAgIHRoaXMuX3RyYWNlLFxuICAgICAgICAgICAgdGhpcy5fcGFyc2VkLFxuICAgICAgICAgICAgdGhpcy5fcG9ydFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIERvZXMgdGhpcyBVUkwgaGF2ZSBhIHdlYiBwcm90b2NvbD9cbiAgICBnZXQgaXNXZWIoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX3Byb3RvY29sICYmIHdlYlByb3RvY29scy5oYXModGhpcy5fcHJvdG9jb2wpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLiBUaGUgcGF5bG9hZCBpcyBhbHNvIGNsb25lZC5cbiAgICAgKi9cbiAgICBjbG9uZSgpOiBSZVVyaTxUUGF5PiB7XG4gICAgICAgIHJldHVybiBuZXcgUmVVcmk8VFBheT4oXG4gICAgICAgICAgICB0aGlzLl9wcm90b2NvbCxcbiAgICAgICAgICAgIHRoaXMuX2hvc3RuYW1lLFxuICAgICAgICAgICAgdGhpcy5fcGF0aCxcbiAgICAgICAgICAgIHRoaXMuX3F1ZXJ5LFxuICAgICAgICAgICAgdGhpcy5faGFzaCxcbiAgICAgICAgICAgIHRoaXMuX3BheWxvYWQgJiYgeyAuLi50aGlzLl9wYXlsb2FkIH0sXG4gICAgICAgICAgICB0aGlzLl90cmFjZSAmJiB7IC4uLnRoaXMuX3RyYWNlIH0sXG4gICAgICAgICAgICB0aGlzLl9wYXJzZWQsXG4gICAgICAgICAgICB0aGlzLl9wb3J0XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc3RhdGljIGVtcHR5KCk6IFJlVXJpPHVuZGVmaW5lZD47XG4gICAgc3RhdGljIGVtcHR5PFRQYXkgZXh0ZW5kcyBQYXlsb2FkPihwYXlsb2FkOiBUUGF5KTogUmVVcmk8VFBheT47XG4gICAgc3RhdGljIGVtcHR5PFRQYXkgZXh0ZW5kcyBQYXlsb2FkPihwYXlsb2FkPzogVFBheSkge1xuICAgICAgICByZXR1cm4gbmV3IFJlVXJpPFRQYXk+KFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgXCJcIixcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHBheWxvYWQhLFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gUGFyc2VzIGBpbnB1dGAgYXMgYSBVUkkuIEVycm9ycyBvbiBiYWQgaW5wdXQuXG4gICAgc3RhdGljIHBhcnNlKGlucHV0OiBudWxsIHwgdW5kZWZpbmVkKTogUmVVcmk8dW5kZWZpbmVkPjtcbiAgICBzdGF0aWMgcGFyc2U8VFBheSBleHRlbmRzIFBheWxvYWQgfCB1bmRlZmluZWQ+KFxuICAgICAgICBpbnB1dDogc3RyaW5nIHwgUmVVcmk8VFBheT4gfCBQYXJ0aWFsPFJlVXJpUGFydHM8UGF5bG9hZD4+XG4gICAgKTogUmVVcmk8VFBheT47XG4gICAgc3RhdGljIHBhcnNlPFRQYXkgZXh0ZW5kcyBQYXlsb2FkIHwgdW5kZWZpbmVkPihpbnB1dDogYW55KSB7XG4gICAgICAgIGlmIChpbnB1dCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gUmVVcmkuZW1wdHkoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBSZVVyaSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHJldHVybiBSZVVyaS5lbXB0eSgpLnBhcnRzKGlucHV0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGlucHV0ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICB0aHJvdyBpbnB1dE11c3RCZVN0cmluZyhpbnB1dCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgciA9IHVybFJlZ2V4cC5leGVjKGlucHV0KTtcbiAgICAgICAgaWYgKCFyKSB7XG4gICAgICAgICAgICB0aHJvdyBpbnB1dE11c3RCZVVybChpbnB1dCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgWywgcHJvdG8sIGhvc3RuYW1lLCBwb3J0LCBwYXRoV2l0aFBheWxvYWQsIHF1ZXJ5LCBmcmFnbWVudF0gPSByO1xuICAgICAgICBpZiAocG9ydCAhPSBudWxsICYmIChOdW1iZXIuaXNOYU4oK3BvcnQpIHx8IHBvcnQgPT09IFwiXCIpKSB7XG4gICAgICAgICAgICB0aHJvdyBwb3J0TXVzdEJlTnVtZXJpYyhpbnB1dCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHsgcGF5bG9hZCwgdHJhY2VQYXlsb2FkLCBwYXRoIH0gPSBleHRyYWN0UGF5bG9hZDxUUGF5PihwYXRoV2l0aFBheWxvYWQpO1xuICAgICAgICBjb25zdCBzb21lUGF5bG9hZCA9IHBheWxvYWQgfHwgdHJhY2VQYXlsb2FkO1xuICAgICAgICBpZiAoc29tZVBheWxvYWQ/Ll9fdHJpbSkge1xuICAgICAgICAgICAgLy8gVGhpcyB3aWxsIG9ubHkgYmUgc2V0IGlmIHRoZSBwYXRoIGlzIGZha2UgYW5kIG9ubHkgY3JlYXRlZCBmb3IgdGhlIHBheWxvYWRcbiAgICAgICAgICAgIHBhdGggPSBcIlwiO1xuICAgICAgICAgICAgZGVsZXRlIHNvbWVQYXlsb2FkLl9fdHJpbTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc29tZVBheWxvYWQpIHtcbiAgICAgICAgICAgIGhvc3RuYW1lID0gaG9zdG5hbWU/LnJlcGxhY2UoL18oW14uXSopJC8sIFwiLiQxXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUmVVcmkoXG4gICAgICAgICAgICBwcm90bz8udHJpbSgpLFxuICAgICAgICAgICAgaG9zdG5hbWU/LnRyaW0oKSxcbiAgICAgICAgICAgIHBhdGg/LnRyaW0oKSxcbiAgICAgICAgICAgIHF1ZXJ5Py50cmltKCksXG4gICAgICAgICAgICBmcmFnbWVudD8udHJpbSgpLFxuICAgICAgICAgICAgcGF5bG9hZCEsXG4gICAgICAgICAgICB0cmFjZVBheWxvYWQsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIHBvcnRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwYXlsb2FkTWVyZ2U8VE1vcmUgZXh0ZW5kcyBQYXlsb2FkPih0aGlzOiBSZVVyaTx1bmRlZmluZWQ+LCBtb3JlOiBUTW9yZSk6IFJlVXJpPFRNb3JlPjtcbiAgICBwYXlsb2FkTWVyZ2U8VE1vcmUgZXh0ZW5kcyBQYXlsb2FkPih0aGlzOiBSZVVyaTxUUGF5PiwgbW9yZTogVE1vcmUpOiBSZVVyaTxUTW9yZSAmIFRQYXk+O1xuICAgIHBheWxvYWRNZXJnZTxUTW9yZSBleHRlbmRzIFBheWxvYWQgPSBQYXlsb2FkT3JEZWZhdWx0PFRQYXk+Pihtb3JlOiBUTW9yZSk6IFJlVXJpPFRQYXkgJiBUTW9yZT4ge1xuICAgICAgICBjb25zdCBwYXlsb2FkID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fcGF5bG9hZCwgbW9yZSk7XG4gICAgICAgIHJldHVybiB0aGlzLnBheWxvYWQocGF5bG9hZCk7XG4gICAgfVxuXG4gICAgdHJhY2UoKTogUGF5bG9hZDtcbiAgICB0cmFjZShwYXlsb2FkT3duZXI6IFJlVXJpPGFueT4pOiBSZVVyaTxUUGF5PjtcbiAgICB0cmFjZSh0cmFjZVBheWxvYWQ6IFBheWxvYWQpOiBSZVVyaTxUUGF5PjtcbiAgICB0cmFjZShzb21ldGhpbmc/OiBQYXlsb2FkIHwgUmVVcmk8YW55Pikge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICB0aGlzLl90cmFjZSAmJiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuX3RyYWNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc29tZXRoaW5nID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHBheWxvYWRNdXN0QmVPYmplY3Qoc29tZXRoaW5nKTtcbiAgICAgICAgY29uc3QgdHJhY2VQYXlsb2FkID0gc29tZXRoaW5nIGluc3RhbmNlb2YgUmVVcmkgPyBzb21ldGhpbmcudHJhY2UoKSA6IHNvbWV0aGluZztcbiAgICAgICAgbXVzdFZhbGlkYXRlUGF5bG9hZCh0cmFjZVBheWxvYWQpO1xuICAgICAgICBjb25zdCBjbG9uZSA9IHRoaXMuX25vQ29weUNsb25lKCk7XG4gICAgICAgIGNsb25lLl90cmFjZSA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMuX3RyYWNlLFxuICAgICAgICAgICAgLi4udHJhY2VQYXlsb2FkXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhpcyBVUkkgKENISUxEKSBtYXRjaGVzIGFub3RoZXIgVVJJIChQQVJFTlQpLiBUaGUgcGFyZW50IGNhbiBiZSBhIHN0cmluZyxcbiAgICAgKiBhIHtAbGluayBSZVVyaX0gb3IsIG9yIGFuIG9iamVjdCBkZXNjcmliaW5nIHRoZSBwYXJ0cyBvZiBhIFVSSSAtLSBhIHtAbGluayBSZVVyaVBhcnRzfS5cbiAgICAgKlxuICAgICAqIENISUxEIGlzIGNvbnNpZGVyZWQgdG8gYmUgYSBjaGlsZCBvZiBQQVJFTlQgaWY6XG4gICAgICogMS4gSWYgUEFSRU5UIGhhcyBhIHByb3RvY29sLCBpdCBtdXN0IGVxdWFsIENISUxEIHByb3RvY29sLlxuICAgICAqIDIuIElmIFBBUkVOVCBoYXMgYSBob3N0bmFtZSwgaXQgbXVzdCBiZSBhIHBhcmVudCBvZiBDSElMRCdzIGhvc3RuYW1lLlxuICAgICAqIDMuIElmIFBBUkVOVCBoYXMgYSBwb3J0LCBpdCBtdXN0IGVxdWFsIENISUxEJ3MgcG9ydC5cbiAgICAgKiA0LiBJZiBQQVJFTlQgaGFzIGEgcGF0aCwgaXQgbXVzdCBiZSBhIHBhcmVudCBvZiBDSElMRCdzIHBhdGguXG4gICAgICogNS4gSWYgUEFSRU5UIGhhcyBhIHF1ZXJ5LCBpdCBtdXN0IGVxdWFsIENISUxEJ3MgcXVlcnkuXG4gICAgICogNi4gSWYgUEFSRU5UIGhhcyBhIGhhc2gsIGl0IG11c3QgZXF1YWwgQ0hJTEQncyBoYXNoLlxuICAgICAqIDcuIElmIFBBUkVOVCBoYXMgYSBwYXlsb2FkLCBpdHMgcHJvcGVydGllcyBtdXN0IG1hdGNoIENISUxEJ3MgcGF5bG9hZC5cbiAgICAgKiA4LiBUaGUgdHJhY2UgcGF5bG9hZCBpcyBpZ25vcmVkLlxuICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBVUkkgdG8gY2hlY2sgYWdhaW5zdC5cbiAgICAgKlxuICAgICAqL1xuICAgIG1hdGNoZXMoXG4gICAgICAgIHBhcmVudDogUGFydGlhbDxSZVVyaVBhcnRzPFBheWxvYWQgfCB1bmRlZmluZWQ+PiB8IFJlVXJpPFBheWxvYWQgfCB1bmRlZmluZWQ+IHwgc3RyaW5nXG4gICAgKTogYm9vbGVhbiB7XG4gICAgICAgIHBhcmVudCA9IFJlVXJpLnBhcnNlKHBhcmVudCk7XG4gICAgICAgIGlmIChwYXJlbnQuX3Byb3RvY29sICYmIHBhcmVudC5fcHJvdG9jb2wgIT09IHRoaXMuX3Byb3RvY29sKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmVudC5faG9zdG5hbWUgJiYgIWhvc3RuYW1lQ29udGFpbnModGhpcy5faG9zdG5hbWUsIHBhcmVudC5faG9zdG5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFyZW50Ll9wb3J0ICYmIHBhcmVudC5fcG9ydCAhPT0gdGhpcy5fcG9ydCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJlbnQuX3F1ZXJ5ICYmIHBhcmVudC5fcXVlcnkgIT09IHRoaXMuX3F1ZXJ5KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmVudC5faGFzaCAmJiBwYXJlbnQuX2hhc2ggIT09IHRoaXMuX2hhc2gpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyZW50Ll9wYXlsb2FkICYmICFwYXlsb2FkQ29udGFpbnModGhpcy5fcGF5bG9hZCwgcGFyZW50Ll9wYXlsb2FkKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyZW50U2VnbWVudHMgPSBwYXJlbnQuc2VnbWVudHMoKTtcbiAgICAgICAgY29uc3QgY2hpbGRTZWdtZW50cyA9IHRoaXMuc2VnbWVudHMoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJlbnRTZWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHBhcmVudFNlZ21lbnRzW2ldICE9PSBjaGlsZFNlZ21lbnRzW2ldKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGlzIFVSSSBlcXVhbHMgYW5vdGhlciBVUkksIHdoaWNoIGNhbiBiZSBnaXZlbiBhcyBhIHN0cmluZywgYSB7QGxpbmsgUmVVcml9IG9yLCBvciBhbiBvYmplY3QgZGVzY3JpYmluZyB0aGUgcGFydHMgb2YgYSBVUkkgLS0gYVxuICAgICAqIHtAbGluayBSZVVyaVBhcnRzfS5cbiAgICAgKiBAcGFyYW0gb3RoZXIgVGhlIG90aGVyIFVSSSB0byBjaGVjayBhZ2FpbnN0LlxuICAgICAqIEBwYXJhbSBza2lwUGF5bG9hZCBJZiB0cnVlLCB0aGUgcGF5bG9hZCBpcyBpZ25vcmVkLlxuICAgICAqL1xuICAgIGVxdWFsKFxuICAgICAgICBvdGhlcjogc3RyaW5nIHwgUmVVcmk8UGF5bG9hZCB8IHVuZGVmaW5lZD4gfCBQYXJ0aWFsPFJlVXJpUGFydHM8UGF5bG9hZCB8IHVuZGVmaW5lZD4+LFxuICAgICAgICBza2lwUGF5bG9hZCA9IGZhbHNlXG4gICAgKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzID09PSBvdGhlcikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgb3RoZXIgPSBSZVVyaS5wYXJzZShvdGhlcik7XG4gICAgICAgIGNvbnN0IG15UGFydHMgPSB0aGlzLnBhcnRzKCk7XG4gICAgICAgIGNvbnN0IG90aGVyUGFydHMgPSBvdGhlci5wYXJ0cygpO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBbXCJwcm90b2NvbFwiLCBcImhvc3RuYW1lXCIsIFwicG9ydFwiLCBcInBhdGhcIiwgXCJxdWVyeVwiLCBcImhhc2hcIl0gYXMgY29uc3QpIHtcbiAgICAgICAgICAgIGlmIChteVBhcnRzW2tleV0gIT09IG90aGVyUGFydHNba2V5XSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc2tpcFBheWxvYWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fcGF5bG9hZCB8fCAhb3RoZXIuX3BheWxvYWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wYXlsb2FkID09PSBvdGhlci5fcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXF1YWwodGhpcy5fcGF5bG9hZCwgb3RoZXIuX3BheWxvYWQpO1xuICAgIH1cblxuICAgIC8vIEFuIGFydGlmaWNpYWwgVVJJIGlzIG9uZSB0aGF0IGNhbid0IGhhdmUgYmVlbiBwYXJzZWQgZnJvbSBhIHN0cmluZyBkdWUgdG8gYW4gaW52YWxpZCBjb21iaW5hdGlvbiBvZiBjb21wb25lbnRzLiBGb3IgZXhhbXBsZSxcbiAgICAvLyAxLiBBIFVSTCB3aXRoIGEgcG9ydCBidXQgbm8gaG9zdG5hbWUuXG4gICAgLy8gMi4gQSBVUkwgd2l0aCBhIGhvc3RuYW1lIGJ1dCBubyBwcm90b2NvbC5cbiAgICAvLyAzLiBBIFVSTCB3aXRoXG4gICAgZ2V0IGlzQXJ0aWZpY2lhbCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICFSZVVyaS5wYXJzZSh0aGlzLl9wcmludCh0cnVlKSkuZXF1YWwodGhpcywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLy8gR2V0cyB0aGUgcGF5bG9hZC5cbiAgICBwYXlsb2FkKCk6IFRQYXk7XG4gICAgcGF5bG9hZChwYXlsb2FkOiBudWxsIHwgdW5kZWZpbmVkKTogUmVVcmk8dW5kZWZpbmVkPjtcbiAgICAvLyBTZXRzIHRoZSBwYXlsb2FkIHRvIGEgY2xvbmUgb2YgYHBheWxvYWRgLiBEaXNhYmxlZCBmb3Igbm9uLWh0dHAgVVJMcy5cbiAgICBwYXlsb2FkPFRPdGhlciBleHRlbmRzIFBheWxvYWQgfCB1bmRlZmluZWQgPSBQYXlsb2FkT3JEZWZhdWx0PFRQYXk+PihcbiAgICAgICAgcGF5bG9hZDogVE90aGVyXG4gICAgKTogUmVVcmk8VE90aGVyPjtcbiAgICAvLyBTZXRzIHRoZSBwYXlsb2FkIHRvIHRoZSBwYXlsb2FkIG9mIGBvdGhlclJldXJpYC4gRGlzYWJsZWQgZm9yIG5vbi1odHRwIFVSTHMuXG4gICAgcGF5bG9hZDxUT3RoZXIgZXh0ZW5kcyBQYXlsb2FkIHwgdW5kZWZpbmVkID0gUGF5bG9hZE9yRGVmYXVsdDxUUGF5Pj4oXG4gICAgICAgIG90aGVyUmV1cmk6IFJlVXJpPFRPdGhlcj5cbiAgICApOiBSZVVyaTxUT3RoZXI+O1xuICAgIHBheWxvYWQoc29tZXRoaW5nPzogb2JqZWN0IHwgUmVVcmk8UGF5bG9hZD4gfCBSZVVyaTx1bmRlZmluZWQ+IHwgbnVsbCB8IHVuZGVmaW5lZCk6IGFueSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHRoaXMuX3BheWxvYWQgJiYge1xuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLl9wYXlsb2FkXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fcHJvdG9jb2wgPT09IFwiZGF0YVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBsZXQgcGF5bG9hZDogYW55IHwgdW5kZWZpbmVkO1xuICAgICAgICBwYXlsb2FkID0gc29tZXRoaW5nIGluc3RhbmNlb2YgUmVVcmkgPyBzb21ldGhpbmcucGF5bG9hZCgpIDogc29tZXRoaW5nO1xuICAgICAgICBpZiAocGF5bG9hZCA9PSBudWxsKSB7XG4gICAgICAgICAgICBwYXlsb2FkID0gdW5kZWZpbmVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGF5bG9hZE11c3RCZU9iamVjdChzb21ldGhpbmcpO1xuICAgICAgICAgICAgbXVzdFZhbGlkYXRlUGF5bG9hZChwYXlsb2FkKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjbG9uZSA9IHRoaXMuX25vQ29weUNsb25lKCk7XG4gICAgICAgIGNsb25lLl9wYXlsb2FkID0gcGF5bG9hZCAmJiB7XG4gICAgICAgICAgICAuLi5wYXlsb2FkXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wcmludChza2lwUGF5bG9hZCA9IGZhbHNlKSB7XG4gICAgICAgIGxldCB7IF9wcm90b2NvbCwgX2hvc3RuYW1lLCBfcXVlcnksIF9oYXNoLCBfcG9ydCB9ID0gdGhpcztcbiAgICAgICAgY29uc3Qgc29tZVBheWxvYWQgPSB0aGlzLl9wYXlsb2FkIHx8IHRoaXMuX3RyYWNlO1xuICAgICAgICBza2lwUGF5bG9hZCA9IHNraXBQYXlsb2FkIHx8IFJlVXJpW0RFQlVHXS5kb250RW5jb2RlUGF5bG9hZHMgfHwgZmFsc2U7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgYSBwYXlsb2FkLCB3ZSBuZWVkIHRvIG1hbmdsZSB0aGUgaG9zdG5hbWUgc28gcGF5bG9hZGVkIHJlcXVlc3RzIGRvbid0IGdldCBzZW50IG91dCB0byBzZXJ2ZXJzLlxuICAgICAgICBpZiAoc29tZVBheWxvYWQgJiYgX2hvc3RuYW1lICE9IG51bGwgJiYgIXNraXBQYXlsb2FkICYmICFSZVVyaVtERUJVR10uZG9udEVuY29kZVBheWxvYWRzKSB7XG4gICAgICAgICAgICBfaG9zdG5hbWUgPSBfaG9zdG5hbWUucmVwbGFjZSgvXFwuKFteLl0qKSQvLCBcIl8kMVwiKTtcbiAgICAgICAgfVxuICAgICAgICBfcHJvdG9jb2wgPSBfcHJvdG9jb2wgIT0gbnVsbCA/IGAke19wcm90b2NvbH06YCA6IF9wcm90b2NvbDtcbiAgICAgICAgX2hvc3RuYW1lID0gX2hvc3RuYW1lICE9IG51bGwgPyBgLy8ke19ob3N0bmFtZX1gIDogXCJcIjtcbiAgICAgICAgX3F1ZXJ5ID0gX3F1ZXJ5ICE9IG51bGwgPyBgPyR7X3F1ZXJ5fWAgOiBcIlwiO1xuICAgICAgICBfaGFzaCA9IF9oYXNoICE9IG51bGwgPyBgIyR7X2hhc2h9YCA6IFwiXCI7XG4gICAgICAgIGNvbnN0IHN0clBvcnQgPSBfcG9ydCAhPSBudWxsID8gYDoke19wb3J0fWAgOiBcIlwiO1xuXG4gICAgICAgIGNvbnN0IHBhdGggPSB0aGlzLl9nZXRFbmNvZGVkUGF0aChza2lwUGF5bG9hZCk7XG5cbiAgICAgICAgcmV0dXJuIFtfcHJvdG9jb2wsIF9ob3N0bmFtZSwgc3RyUG9ydCwgcGF0aCwgX3F1ZXJ5LCBfaGFzaF0uam9pbihcIlwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJcyB0aGlzIGEgZmFrZSBVUkwgZ2VuZXJhdGVkIGJ5IHJlZmxlY3Rpej9cbiAgICAgKi9cbiAgICBnZXQgaXNSZWZsZWN0aXooKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX3Byb3RvY29sICYmIHJpUHJvdG9jb2xzLmhhcyh0aGlzLl9wcm90b2NvbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRG9lcyB0aGlzIFVSTCBoYXZlIGEgbm9uLXdlYiBwcm90b2NvbD9cbiAgICAgKi9cbiAgICBnZXQgaXNOb25XZWIoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX3Byb3RvY29sICYmICF3ZWJQcm90b2NvbHMuaGFzKHRoaXMuX3Byb3RvY29sKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBmdWxsIFVSSSwgaW5jbHVkaW5nIHRoZSBwYXlsb2FkLlxuICAgICAqL1xuICAgIGdldCBocmVmKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJpbnQoZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGZ1bGwgVVJJLCBtaW51cyB0aGUgcGF5bG9hZC5cbiAgICAgKi9cbiAgICBnZXQgY2Fub25pY2FsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJpbnQodHJ1ZSk7XG4gICAgfVxuXG4gICAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ocmVmO1xuICAgIH1cblxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ocmVmO1xuICAgIH1cbn1cblxuY29uc3QgdXJsUmVnZXhwID1cbiAgICAvXig/OihbYS16QS1aXVtBLVphLXpcXGQrLS5dKik6KT8oPzpcXC9cXC8oW14vPyM6XSopKD86OihbXi8/I10qKSk/KT8oW14/I10qKT8oPzpcXD8oW14jXSopKT8oPzojKC4qKSk/JC87XG5cbmNvbnN0IHdlYlByb3RvY29scyA9IG5ldyBTZXQoW1wiaHR0cFwiLCBcIndzXCIsIFwiaHR0cHNcIiwgXCJ3c3NcIl0pO1xuXG5jb25zdCByaVByb3RvY29scyA9IG5ldyBTZXQoW1wiaW5saW5lXCIsIFwiZHluYW1pY1wiLCBcInJlZmxlY3RpelwiXSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZVVyaSwgXCJfX2lzUmV1cmlcIiwge1xuICAgIHZhbHVlOiB0cnVlXG59KTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,GAAG,OAAO,CAoB7C"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.equal = void 0;
|
|
4
|
+
function equal(a, b) {
|
|
5
|
+
if (!a || typeof a !== "object" || !b || typeof b !== "object") {
|
|
6
|
+
return a === b;
|
|
7
|
+
}
|
|
8
|
+
const aProto = Object.getPrototypeOf(a);
|
|
9
|
+
const bProto = Object.getPrototypeOf(b);
|
|
10
|
+
if (aProto !== bProto) {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
const aKeys = Object.keys(a);
|
|
14
|
+
const bKeys = Object.keys(b);
|
|
15
|
+
if (aKeys.length !== bKeys.length) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
for (const key of aKeys) {
|
|
19
|
+
if (a[key] !== b[key]) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
exports.equal = equal;
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLFNBQWdCLEtBQUssQ0FBQyxDQUFNLEVBQUUsQ0FBTTtJQUNoQyxJQUFJLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUU7UUFDNUQsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ2xCO0lBQ0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLElBQUksTUFBTSxLQUFLLE1BQU0sRUFBRTtRQUNuQixPQUFPLEtBQUssQ0FBQztLQUNoQjtJQUNELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0IsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLE1BQU0sRUFBRTtRQUMvQixPQUFPLEtBQUssQ0FBQztLQUNoQjtJQUNELEtBQUssTUFBTSxHQUFHLElBQUksS0FBSyxFQUFFO1FBQ3JCLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNuQixPQUFPLEtBQUssQ0FBQztTQUNoQjtLQUNKO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDaEIsQ0FBQztBQXBCRCxzQkFvQkMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gZXF1YWwoYTogYW55LCBiOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoIWEgfHwgdHlwZW9mIGEgIT09IFwib2JqZWN0XCIgfHwgIWIgfHwgdHlwZW9mIGIgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgcmV0dXJuIGEgPT09IGI7XG4gICAgfVxuICAgIGNvbnN0IGFQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihhKTtcbiAgICBjb25zdCBiUHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoYik7XG4gICAgaWYgKGFQcm90byAhPT0gYlByb3RvKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgYUtleXMgPSBPYmplY3Qua2V5cyhhKTtcbiAgICBjb25zdCBiS2V5cyA9IE9iamVjdC5rZXlzKGIpO1xuICAgIGlmIChhS2V5cy5sZW5ndGggIT09IGJLZXlzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IG9mIGFLZXlzKSB7XG4gICAgICAgIGlmIChhW2tleV0gIT09IGJba2V5XSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuIl19
|