@infersec/conduit 1.71.0 → 1.73.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/dist/cli.js
CHANGED
|
@@ -13,7 +13,7 @@ import process$3, { platform, hrtime, execPath, execArgv } from 'node:process';
|
|
|
13
13
|
import crypto from 'node:crypto';
|
|
14
14
|
import require$$0$8, { Readable, Transform, PassThrough, getDefaultHighWaterMark, Duplex, Writable } from 'node:stream';
|
|
15
15
|
import 'argon2';
|
|
16
|
-
import require$$1$
|
|
16
|
+
import require$$1$8, { setDefaultResultOrder } from 'node:dns';
|
|
17
17
|
import require$$0$6 from 'os';
|
|
18
18
|
import require$$1$3, { realpathSync as realpathSync$1, readlinkSync, readdirSync, readdir as readdir$1, lstatSync } from 'fs';
|
|
19
19
|
import require$$2$2 from 'util';
|
|
@@ -21,20 +21,21 @@ import require$$3$2 from 'assert';
|
|
|
21
21
|
import require$$4$1 from 'events';
|
|
22
22
|
import require$$1$2 from 'stream';
|
|
23
23
|
import require$$0$7 from 'node:assert';
|
|
24
|
-
import require$$
|
|
24
|
+
import require$$1$4, { createServer } from 'node:net';
|
|
25
25
|
import require$$2$3 from 'node:http';
|
|
26
26
|
import require$$5$1 from 'node:querystring';
|
|
27
|
-
import require$$0$
|
|
27
|
+
import require$$0$9 from 'node:diagnostics_channel';
|
|
28
28
|
import require$$3$3, { debuglog, stripVTControlCharacters, inspect, promisify, callbackify, aborted as aborted$1, isDeepStrictEqual } from 'node:util';
|
|
29
29
|
import require$$4$2 from 'node:tls';
|
|
30
|
-
import require$$0$
|
|
30
|
+
import require$$0$a, { Buffer as Buffer$1 } from 'node:buffer';
|
|
31
31
|
import require$$3$4 from 'node:zlib';
|
|
32
32
|
import require$$5$2 from 'node:perf_hooks';
|
|
33
33
|
import require$$8 from 'node:util/types';
|
|
34
|
-
import require$$1$
|
|
34
|
+
import require$$1$5 from 'node:sqlite';
|
|
35
35
|
import require$$2$4 from 'node:worker_threads';
|
|
36
|
-
import require$$
|
|
37
|
-
import require$$1$6 from 'node:
|
|
36
|
+
import require$$0$b, { fileURLToPath } from 'node:url';
|
|
37
|
+
import require$$1$6 from 'node:async_hooks';
|
|
38
|
+
import require$$1$7 from 'node:console';
|
|
38
39
|
import require$$0$c, { realpath, readlink, readdir, lstat, mkdir, readFile, writeFile, stat, unlink, rename, rm } from 'node:fs/promises';
|
|
39
40
|
import require$$2$5 from 'node:timers';
|
|
40
41
|
import require$$0$d from 'path';
|
|
@@ -42,12 +43,11 @@ import require$$0$e from 'tty';
|
|
|
42
43
|
import require$$4$3 from 'net';
|
|
43
44
|
import require$$3$5 from 'zlib';
|
|
44
45
|
import require$$0$f from 'buffer';
|
|
45
|
-
import require$$1$
|
|
46
|
+
import require$$1$9 from 'string_decoder';
|
|
46
47
|
import require$$8$1 from 'querystring';
|
|
47
48
|
import require$$0$g from 'url';
|
|
48
49
|
import require$$0$h from 'http';
|
|
49
50
|
import require$$0$i from 'crypto';
|
|
50
|
-
import { fileURLToPath } from 'node:url';
|
|
51
51
|
import { StringDecoder } from 'node:string_decoder';
|
|
52
52
|
import { pipeline, finished } from 'node:stream/promises';
|
|
53
53
|
import 'fs/promises';
|
|
@@ -20915,8 +20915,85 @@ object({
|
|
|
20915
20915
|
object({
|
|
20916
20916
|
id: ULIDSchema
|
|
20917
20917
|
});
|
|
20918
|
+
const EngineOutputSchema = object({
|
|
20919
|
+
created: string$1(),
|
|
20920
|
+
id: ULIDSchema,
|
|
20921
|
+
llamacppBatchSize: number$1().nullable(),
|
|
20922
|
+
llamacppCacheTypeK: string$1().nullable(),
|
|
20923
|
+
llamacppCacheTypeV: string$1().nullable(),
|
|
20924
|
+
llamacppExtraArgs: array(string$1()),
|
|
20925
|
+
llamacppFlashAttn: boolean$1(),
|
|
20926
|
+
llamacppGpuLayers: number$1(),
|
|
20927
|
+
llamacppMainGpu: number$1().nullable(),
|
|
20928
|
+
llamacppParallelism: number$1(),
|
|
20929
|
+
llamacppTensorSplit: string$1().nullable(),
|
|
20930
|
+
llamacppUbatchSize: number$1().nullable(),
|
|
20931
|
+
name: string$1(),
|
|
20932
|
+
type: LLMEngineSchema,
|
|
20933
|
+
updated: string$1(),
|
|
20934
|
+
vllmDevice: string$1().nullable(),
|
|
20935
|
+
vllmDtype: string$1().nullable(),
|
|
20936
|
+
vllmExtraArgs: array(string$1()),
|
|
20937
|
+
vllmTensorParallelSize: number$1()
|
|
20938
|
+
});
|
|
20939
|
+
object({
|
|
20940
|
+
llamacppBatchSize: number$1().int().positive().nullable().optional(),
|
|
20941
|
+
llamacppCacheTypeK: string$1().nullable().optional(),
|
|
20942
|
+
llamacppCacheTypeV: string$1().nullable().optional(),
|
|
20943
|
+
llamacppExtraArgs: array(string$1()).optional(),
|
|
20944
|
+
llamacppFlashAttn: boolean$1().optional(),
|
|
20945
|
+
llamacppGpuLayers: number$1().int().min(0).optional(),
|
|
20946
|
+
llamacppMainGpu: number$1().int().min(0).nullable().optional(),
|
|
20947
|
+
llamacppParallelism: number$1().int().positive().optional(),
|
|
20948
|
+
llamacppTensorSplit: string$1().nullable().optional(),
|
|
20949
|
+
llamacppUbatchSize: number$1().int().positive().nullable().optional(),
|
|
20950
|
+
name: ResourceNameSchema,
|
|
20951
|
+
type: LLMEngineSchema,
|
|
20952
|
+
vllmDevice: string$1().nullable().optional(),
|
|
20953
|
+
vllmDtype: string$1().nullable().optional(),
|
|
20954
|
+
vllmExtraArgs: array(string$1()).optional(),
|
|
20955
|
+
vllmTensorParallelSize: number$1().int().positive().optional()
|
|
20956
|
+
});
|
|
20957
|
+
object({
|
|
20958
|
+
llamacppBatchSize: number$1().int().positive().nullable().optional(),
|
|
20959
|
+
llamacppCacheTypeK: string$1().nullable().optional(),
|
|
20960
|
+
llamacppCacheTypeV: string$1().nullable().optional(),
|
|
20961
|
+
llamacppExtraArgs: array(string$1()).optional(),
|
|
20962
|
+
llamacppFlashAttn: boolean$1().optional(),
|
|
20963
|
+
llamacppGpuLayers: number$1().int().min(0).optional(),
|
|
20964
|
+
llamacppMainGpu: number$1().int().min(0).nullable().optional(),
|
|
20965
|
+
llamacppParallelism: number$1().int().positive().optional(),
|
|
20966
|
+
llamacppTensorSplit: string$1().nullable().optional(),
|
|
20967
|
+
llamacppUbatchSize: number$1().int().positive().nullable().optional(),
|
|
20968
|
+
name: ResourceNameSchema.optional(),
|
|
20969
|
+
type: LLMEngineSchema.optional(),
|
|
20970
|
+
vllmDevice: string$1().nullable().optional(),
|
|
20971
|
+
vllmDtype: string$1().nullable().optional(),
|
|
20972
|
+
vllmExtraArgs: array(string$1()).optional(),
|
|
20973
|
+
vllmTensorParallelSize: number$1().int().positive().optional()
|
|
20974
|
+
});
|
|
20975
|
+
object({
|
|
20976
|
+
results: array(EngineOutputSchema)
|
|
20977
|
+
});
|
|
20978
|
+
object({
|
|
20979
|
+
id: ULIDSchema
|
|
20980
|
+
});
|
|
20918
20981
|
|
|
20919
20982
|
({
|
|
20983
|
+
"/api/v1/engines/:engineID": {
|
|
20984
|
+
DELETE: {
|
|
20985
|
+
parameters: {
|
|
20986
|
+
engineID: ULIDSchema.describe("Engine identifier")
|
|
20987
|
+
}},
|
|
20988
|
+
GET: {
|
|
20989
|
+
parameters: {
|
|
20990
|
+
engineID: ULIDSchema.describe("Engine identifier")
|
|
20991
|
+
}},
|
|
20992
|
+
PATCH: {
|
|
20993
|
+
parameters: {
|
|
20994
|
+
engineID: ULIDSchema.describe("Engine identifier")
|
|
20995
|
+
}}
|
|
20996
|
+
},
|
|
20920
20997
|
"/api/v1/endpoints/:endpointID": {
|
|
20921
20998
|
DELETE: {
|
|
20922
20999
|
parameters: {
|
|
@@ -23598,7 +23675,8 @@ function requireSymbols () {
|
|
|
23598
23675
|
kPingInterval: Symbol('ping interval'),
|
|
23599
23676
|
kNoProxyAgent: Symbol('no proxy agent'),
|
|
23600
23677
|
kHttpProxyAgent: Symbol('http proxy agent'),
|
|
23601
|
-
kHttpsProxyAgent: Symbol('https proxy agent')
|
|
23678
|
+
kHttpsProxyAgent: Symbol('https proxy agent'),
|
|
23679
|
+
kSocks5ProxyAgent: Symbol('socks5 proxy agent')
|
|
23602
23680
|
};
|
|
23603
23681
|
return symbols;
|
|
23604
23682
|
}
|
|
@@ -24464,6 +24542,33 @@ function requireErrors () {
|
|
|
24464
24542
|
}
|
|
24465
24543
|
}
|
|
24466
24544
|
|
|
24545
|
+
class Socks5ProxyError extends UndiciError {
|
|
24546
|
+
constructor (message, code) {
|
|
24547
|
+
super(message);
|
|
24548
|
+
this.name = 'Socks5ProxyError';
|
|
24549
|
+
this.message = message || 'SOCKS5 proxy error';
|
|
24550
|
+
this.code = code || 'UND_ERR_SOCKS5';
|
|
24551
|
+
}
|
|
24552
|
+
}
|
|
24553
|
+
|
|
24554
|
+
const kMessageSizeExceededError = Symbol.for('undici.error.UND_ERR_WS_MESSAGE_SIZE_EXCEEDED');
|
|
24555
|
+
class MessageSizeExceededError extends UndiciError {
|
|
24556
|
+
constructor (message) {
|
|
24557
|
+
super(message);
|
|
24558
|
+
this.name = 'MessageSizeExceededError';
|
|
24559
|
+
this.message = message || 'Max decompressed message size exceeded';
|
|
24560
|
+
this.code = 'UND_ERR_WS_MESSAGE_SIZE_EXCEEDED';
|
|
24561
|
+
}
|
|
24562
|
+
|
|
24563
|
+
static [Symbol.hasInstance] (instance) {
|
|
24564
|
+
return instance && instance[kMessageSizeExceededError] === true
|
|
24565
|
+
}
|
|
24566
|
+
|
|
24567
|
+
get [kMessageSizeExceededError] () {
|
|
24568
|
+
return true
|
|
24569
|
+
}
|
|
24570
|
+
}
|
|
24571
|
+
|
|
24467
24572
|
errors = {
|
|
24468
24573
|
AbortError,
|
|
24469
24574
|
HTTPParserError,
|
|
@@ -24487,7 +24592,9 @@ function requireErrors () {
|
|
|
24487
24592
|
RequestRetryError,
|
|
24488
24593
|
ResponseError,
|
|
24489
24594
|
SecureProxyConnectionError,
|
|
24490
|
-
MaxOriginsReachedError
|
|
24595
|
+
MaxOriginsReachedError,
|
|
24596
|
+
Socks5ProxyError,
|
|
24597
|
+
MessageSizeExceededError
|
|
24491
24598
|
};
|
|
24492
24599
|
return errors;
|
|
24493
24600
|
}
|
|
@@ -24822,7 +24929,7 @@ function requireUtil$5 () {
|
|
|
24822
24929
|
const { kDestroyed, kBodyUsed, kListeners, kBody } = requireSymbols();
|
|
24823
24930
|
const { IncomingMessage } = require$$2$3;
|
|
24824
24931
|
const stream = require$$0$8;
|
|
24825
|
-
const net = require$$
|
|
24932
|
+
const net = require$$1$4;
|
|
24826
24933
|
const { stringify } = require$$5$1;
|
|
24827
24934
|
const { EventEmitter: EE } = require$$0$5;
|
|
24828
24935
|
const timers = requireTimers();
|
|
@@ -25145,6 +25252,20 @@ function requireUtil$5 () {
|
|
|
25145
25252
|
return !!(obj != null && (typeof obj[Symbol.iterator] === 'function' || typeof obj[Symbol.asyncIterator] === 'function'))
|
|
25146
25253
|
}
|
|
25147
25254
|
|
|
25255
|
+
/**
|
|
25256
|
+
* Checks whether an object has a safe Symbol.iterator — i.e. one that is
|
|
25257
|
+
* either own or inherited from a non-Object.prototype chain. This prevents
|
|
25258
|
+
* prototype-pollution attacks from injecting a fake iterator on
|
|
25259
|
+
* Object.prototype.
|
|
25260
|
+
* @param {object} obj
|
|
25261
|
+
* @returns {boolean}
|
|
25262
|
+
*/
|
|
25263
|
+
function hasSafeIterator (obj) {
|
|
25264
|
+
const prototype = Object.getPrototypeOf(obj);
|
|
25265
|
+
const ownIterator = Object.prototype.hasOwnProperty.call(obj, Symbol.iterator);
|
|
25266
|
+
return ownIterator || (prototype != null && prototype !== Object.prototype && typeof obj[Symbol.iterator] === 'function')
|
|
25267
|
+
}
|
|
25268
|
+
|
|
25148
25269
|
/**
|
|
25149
25270
|
* @param {Blob|Buffer|import ('stream').Stream} body
|
|
25150
25271
|
* @returns {number|null}
|
|
@@ -25244,19 +25365,39 @@ function requireUtil$5 () {
|
|
|
25244
25365
|
const key = headerNameToString(headers[i]);
|
|
25245
25366
|
let val = obj[key];
|
|
25246
25367
|
|
|
25247
|
-
if (val) {
|
|
25248
|
-
if (
|
|
25249
|
-
|
|
25250
|
-
|
|
25251
|
-
|
|
25252
|
-
|
|
25253
|
-
|
|
25254
|
-
|
|
25255
|
-
|
|
25256
|
-
|
|
25368
|
+
if (val !== undefined) {
|
|
25369
|
+
if (!Object.hasOwn(obj, key)) {
|
|
25370
|
+
const headersValue = typeof headers[i + 1] === 'string'
|
|
25371
|
+
? headers[i + 1]
|
|
25372
|
+
: Array.isArray(headers[i + 1])
|
|
25373
|
+
? headers[i + 1].map(x => x.toString('latin1'))
|
|
25374
|
+
: headers[i + 1].toString('latin1');
|
|
25375
|
+
|
|
25376
|
+
if (key === '__proto__') {
|
|
25377
|
+
Object.defineProperty(obj, key, {
|
|
25378
|
+
value: headersValue,
|
|
25379
|
+
enumerable: true,
|
|
25380
|
+
configurable: true,
|
|
25381
|
+
writable: true
|
|
25382
|
+
});
|
|
25383
|
+
} else {
|
|
25384
|
+
obj[key] = headersValue;
|
|
25385
|
+
}
|
|
25257
25386
|
} else {
|
|
25258
|
-
|
|
25387
|
+
if (typeof val === 'string') {
|
|
25388
|
+
val = [val];
|
|
25389
|
+
obj[key] = val;
|
|
25390
|
+
}
|
|
25391
|
+
val.push(headers[i + 1].toString('latin1'));
|
|
25259
25392
|
}
|
|
25393
|
+
} else {
|
|
25394
|
+
const headersValue = typeof headers[i + 1] === 'string'
|
|
25395
|
+
? headers[i + 1]
|
|
25396
|
+
: Array.isArray(headers[i + 1])
|
|
25397
|
+
? headers[i + 1].map(x => x.toString('latin1'))
|
|
25398
|
+
: headers[i + 1].toString('latin1');
|
|
25399
|
+
|
|
25400
|
+
obj[key] = headersValue;
|
|
25260
25401
|
}
|
|
25261
25402
|
}
|
|
25262
25403
|
|
|
@@ -25736,6 +25877,7 @@ function requireUtil$5 () {
|
|
|
25736
25877
|
getServerName,
|
|
25737
25878
|
isStream,
|
|
25738
25879
|
isIterable,
|
|
25880
|
+
hasSafeIterator,
|
|
25739
25881
|
isAsyncIterable,
|
|
25740
25882
|
isDestroyed,
|
|
25741
25883
|
headerNameToString,
|
|
@@ -25823,7 +25965,7 @@ function requireDiagnostics () {
|
|
|
25823
25965
|
if (hasRequiredDiagnostics) return diagnostics;
|
|
25824
25966
|
hasRequiredDiagnostics = 1;
|
|
25825
25967
|
|
|
25826
|
-
const diagnosticsChannel = require$$0$
|
|
25968
|
+
const diagnosticsChannel = require$$0$9;
|
|
25827
25969
|
const util = require$$3$3;
|
|
25828
25970
|
|
|
25829
25971
|
const undiciDebugLog = util.debuglog('undici');
|
|
@@ -26000,10 +26142,12 @@ function requireDiagnostics () {
|
|
|
26000
26142
|
|
|
26001
26143
|
diagnosticsChannel.subscribe('undici:websocket:open',
|
|
26002
26144
|
evt => {
|
|
26003
|
-
|
|
26004
|
-
|
|
26005
|
-
|
|
26006
|
-
|
|
26145
|
+
if (evt.address != null) {
|
|
26146
|
+
const { address, port } = evt.address;
|
|
26147
|
+
debugLog('connection opened %s%s', address, port ? `:${port}` : '');
|
|
26148
|
+
} else {
|
|
26149
|
+
debugLog('connection opened');
|
|
26150
|
+
}
|
|
26007
26151
|
});
|
|
26008
26152
|
|
|
26009
26153
|
diagnosticsChannel.subscribe('undici:websocket:close',
|
|
@@ -26069,6 +26213,7 @@ function requireRequest$2 () {
|
|
|
26069
26213
|
isBuffer,
|
|
26070
26214
|
isFormDataLike,
|
|
26071
26215
|
isIterable,
|
|
26216
|
+
hasSafeIterator,
|
|
26072
26217
|
isBlobLike,
|
|
26073
26218
|
serializePathWithQuery,
|
|
26074
26219
|
assertRequestHandler,
|
|
@@ -26082,6 +26227,21 @@ function requireRequest$2 () {
|
|
|
26082
26227
|
// Verifies that a given path is valid does not contain control chars \x00 to \x20
|
|
26083
26228
|
const invalidPathRegex = /[^\u0021-\u00ff]/;
|
|
26084
26229
|
|
|
26230
|
+
function isValidContentLengthHeaderValue (val) {
|
|
26231
|
+
if (typeof val !== 'string' || val.length === 0) {
|
|
26232
|
+
return false
|
|
26233
|
+
}
|
|
26234
|
+
|
|
26235
|
+
for (let i = 0; i < val.length; i++) {
|
|
26236
|
+
const charCode = val.charCodeAt(i);
|
|
26237
|
+
if (charCode < 48 || charCode > 57) {
|
|
26238
|
+
return false
|
|
26239
|
+
}
|
|
26240
|
+
}
|
|
26241
|
+
|
|
26242
|
+
return true
|
|
26243
|
+
}
|
|
26244
|
+
|
|
26085
26245
|
const kHandler = Symbol('handler');
|
|
26086
26246
|
|
|
26087
26247
|
class Request {
|
|
@@ -26100,7 +26260,8 @@ function requireRequest$2 () {
|
|
|
26100
26260
|
expectContinue,
|
|
26101
26261
|
servername,
|
|
26102
26262
|
throwOnError,
|
|
26103
|
-
maxRedirections
|
|
26263
|
+
maxRedirections,
|
|
26264
|
+
typeOfService
|
|
26104
26265
|
}, handler) {
|
|
26105
26266
|
if (typeof path !== 'string') {
|
|
26106
26267
|
throw new InvalidArgumentError('path must be a string')
|
|
@@ -26124,6 +26285,10 @@ function requireRequest$2 () {
|
|
|
26124
26285
|
throw new InvalidArgumentError('upgrade must be a string')
|
|
26125
26286
|
}
|
|
26126
26287
|
|
|
26288
|
+
if (upgrade && !isValidHeaderValue(upgrade)) {
|
|
26289
|
+
throw new InvalidArgumentError('invalid upgrade header')
|
|
26290
|
+
}
|
|
26291
|
+
|
|
26127
26292
|
if (headersTimeout != null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) {
|
|
26128
26293
|
throw new InvalidArgumentError('invalid headersTimeout')
|
|
26129
26294
|
}
|
|
@@ -26148,12 +26313,18 @@ function requireRequest$2 () {
|
|
|
26148
26313
|
throw new InvalidArgumentError('maxRedirections is not supported, use the redirect interceptor')
|
|
26149
26314
|
}
|
|
26150
26315
|
|
|
26316
|
+
if (typeOfService != null && (!Number.isInteger(typeOfService) || typeOfService < 0 || typeOfService > 255)) {
|
|
26317
|
+
throw new InvalidArgumentError('typeOfService must be an integer between 0 and 255')
|
|
26318
|
+
}
|
|
26319
|
+
|
|
26151
26320
|
this.headersTimeout = headersTimeout;
|
|
26152
26321
|
|
|
26153
26322
|
this.bodyTimeout = bodyTimeout;
|
|
26154
26323
|
|
|
26155
26324
|
this.method = method;
|
|
26156
26325
|
|
|
26326
|
+
this.typeOfService = typeOfService ?? 0;
|
|
26327
|
+
|
|
26157
26328
|
this.abort = null;
|
|
26158
26329
|
|
|
26159
26330
|
if (body == null) {
|
|
@@ -26230,7 +26401,7 @@ function requireRequest$2 () {
|
|
|
26230
26401
|
processHeader(this, headers[i], headers[i + 1]);
|
|
26231
26402
|
}
|
|
26232
26403
|
} else if (headers && typeof headers === 'object') {
|
|
26233
|
-
if (headers
|
|
26404
|
+
if (hasSafeIterator(headers)) {
|
|
26234
26405
|
for (const header of headers) {
|
|
26235
26406
|
if (!Array.isArray(header) || header.length !== 2) {
|
|
26236
26407
|
throw new InvalidArgumentError('headers must be in key-value pair format')
|
|
@@ -26433,30 +26604,44 @@ function requireRequest$2 () {
|
|
|
26433
26604
|
val = `${val}`;
|
|
26434
26605
|
}
|
|
26435
26606
|
|
|
26436
|
-
if (
|
|
26607
|
+
if (headerName === 'host') {
|
|
26608
|
+
if (request.host !== null) {
|
|
26609
|
+
throw new InvalidArgumentError('duplicate host header')
|
|
26610
|
+
}
|
|
26437
26611
|
if (typeof val !== 'string') {
|
|
26438
26612
|
throw new InvalidArgumentError('invalid host header')
|
|
26439
26613
|
}
|
|
26440
26614
|
// Consumed by Client
|
|
26441
26615
|
request.host = val;
|
|
26442
|
-
} else if (
|
|
26443
|
-
request.contentLength
|
|
26444
|
-
|
|
26616
|
+
} else if (headerName === 'content-length') {
|
|
26617
|
+
if (request.contentLength !== null) {
|
|
26618
|
+
throw new InvalidArgumentError('duplicate content-length header')
|
|
26619
|
+
}
|
|
26620
|
+
if (!isValidContentLengthHeaderValue(val)) {
|
|
26445
26621
|
throw new InvalidArgumentError('invalid content-length header')
|
|
26446
26622
|
}
|
|
26623
|
+
request.contentLength = parseInt(val, 10);
|
|
26447
26624
|
} else if (request.contentType === null && headerName === 'content-type') {
|
|
26448
26625
|
request.contentType = val;
|
|
26449
26626
|
request.headers.push(key, val);
|
|
26450
26627
|
} else if (headerName === 'transfer-encoding' || headerName === 'keep-alive' || headerName === 'upgrade') {
|
|
26451
26628
|
throw new InvalidArgumentError(`invalid ${headerName} header`)
|
|
26452
26629
|
} else if (headerName === 'connection') {
|
|
26453
|
-
|
|
26454
|
-
|
|
26630
|
+
// Per RFC 7230 Section 6.1, Connection header can contain
|
|
26631
|
+
// a comma-separated list of connection option tokens (header names)
|
|
26632
|
+
const value = typeof val === 'string' ? val : null;
|
|
26633
|
+
if (value === null) {
|
|
26455
26634
|
throw new InvalidArgumentError('invalid connection header')
|
|
26456
26635
|
}
|
|
26457
26636
|
|
|
26458
|
-
|
|
26459
|
-
|
|
26637
|
+
for (const token of value.toLowerCase().split(',')) {
|
|
26638
|
+
const trimmed = token.trim();
|
|
26639
|
+
if (!isValidHTTPToken(trimmed)) {
|
|
26640
|
+
throw new InvalidArgumentError('invalid connection header')
|
|
26641
|
+
}
|
|
26642
|
+
if (trimmed === 'close') {
|
|
26643
|
+
request.reset = true;
|
|
26644
|
+
}
|
|
26460
26645
|
}
|
|
26461
26646
|
} else if (headerName === 'expect') {
|
|
26462
26647
|
throw new NotSupportedError('expect header not supported')
|
|
@@ -26496,6 +26681,10 @@ function requireWrapHandler () {
|
|
|
26496
26681
|
return this.#handler.onConnect?.(abort, context)
|
|
26497
26682
|
}
|
|
26498
26683
|
|
|
26684
|
+
onResponseStarted () {
|
|
26685
|
+
return this.#handler.onResponseStarted?.()
|
|
26686
|
+
}
|
|
26687
|
+
|
|
26499
26688
|
onHeaders (statusCode, rawHeaders, resume, statusMessage) {
|
|
26500
26689
|
return this.#handler.onHeaders?.(statusCode, rawHeaders, resume, statusMessage)
|
|
26501
26690
|
}
|
|
@@ -26529,7 +26718,7 @@ function requireWrapHandler () {
|
|
|
26529
26718
|
onRequestUpgrade (controller, statusCode, headers, socket) {
|
|
26530
26719
|
const rawHeaders = [];
|
|
26531
26720
|
for (const [key, val] of Object.entries(headers)) {
|
|
26532
|
-
rawHeaders.push(Buffer.from(key
|
|
26721
|
+
rawHeaders.push(Buffer.from(key, 'latin1'), toRawHeaderValue(val));
|
|
26533
26722
|
}
|
|
26534
26723
|
|
|
26535
26724
|
this.#handler.onUpgrade?.(statusCode, rawHeaders, socket);
|
|
@@ -26538,7 +26727,7 @@ function requireWrapHandler () {
|
|
|
26538
26727
|
onResponseStart (controller, statusCode, headers, statusMessage) {
|
|
26539
26728
|
const rawHeaders = [];
|
|
26540
26729
|
for (const [key, val] of Object.entries(headers)) {
|
|
26541
|
-
rawHeaders.push(Buffer.from(key
|
|
26730
|
+
rawHeaders.push(Buffer.from(key, 'latin1'), toRawHeaderValue(val));
|
|
26542
26731
|
}
|
|
26543
26732
|
|
|
26544
26733
|
if (this.#handler.onHeaders?.(statusCode, rawHeaders, () => controller.resume(), statusMessage) === false) {
|
|
@@ -26555,7 +26744,7 @@ function requireWrapHandler () {
|
|
|
26555
26744
|
onResponseEnd (controller, trailers) {
|
|
26556
26745
|
const rawTrailers = [];
|
|
26557
26746
|
for (const [key, val] of Object.entries(trailers)) {
|
|
26558
|
-
rawTrailers.push(Buffer.from(key
|
|
26747
|
+
rawTrailers.push(Buffer.from(key, 'latin1'), toRawHeaderValue(val));
|
|
26559
26748
|
}
|
|
26560
26749
|
|
|
26561
26750
|
this.#handler.onComplete?.(rawTrailers);
|
|
@@ -26569,6 +26758,12 @@ function requireWrapHandler () {
|
|
|
26569
26758
|
this.#handler.onError?.(err);
|
|
26570
26759
|
}
|
|
26571
26760
|
};
|
|
26761
|
+
|
|
26762
|
+
function toRawHeaderValue (value) {
|
|
26763
|
+
return Array.isArray(value)
|
|
26764
|
+
? value.map((item) => Buffer.from(item, 'latin1'))
|
|
26765
|
+
: Buffer.from(value, 'latin1')
|
|
26766
|
+
}
|
|
26572
26767
|
return wrapHandler;
|
|
26573
26768
|
}
|
|
26574
26769
|
|
|
@@ -26648,6 +26843,9 @@ function requireUnwrapHandler () {
|
|
|
26648
26843
|
|
|
26649
26844
|
[kResume] = null
|
|
26650
26845
|
|
|
26846
|
+
rawHeaders = null
|
|
26847
|
+
rawTrailers = null
|
|
26848
|
+
|
|
26651
26849
|
constructor (abort) {
|
|
26652
26850
|
this.#abort = abort;
|
|
26653
26851
|
}
|
|
@@ -26702,12 +26900,18 @@ function requireUnwrapHandler () {
|
|
|
26702
26900
|
this.#handler.onRequestStart?.(this.#controller, context);
|
|
26703
26901
|
}
|
|
26704
26902
|
|
|
26903
|
+
onResponseStarted () {
|
|
26904
|
+
return this.#handler.onResponseStarted?.()
|
|
26905
|
+
}
|
|
26906
|
+
|
|
26705
26907
|
onUpgrade (statusCode, rawHeaders, socket) {
|
|
26908
|
+
this.#controller.rawHeaders = rawHeaders;
|
|
26706
26909
|
this.#handler.onRequestUpgrade?.(this.#controller, statusCode, parseHeaders(rawHeaders), socket);
|
|
26707
26910
|
}
|
|
26708
26911
|
|
|
26709
26912
|
onHeaders (statusCode, rawHeaders, resume, statusMessage) {
|
|
26710
26913
|
this.#controller[kResume] = resume;
|
|
26914
|
+
this.#controller.rawHeaders = rawHeaders;
|
|
26711
26915
|
this.#handler.onResponseStart?.(this.#controller, statusCode, parseHeaders(rawHeaders), statusMessage);
|
|
26712
26916
|
return !this.#controller.paused
|
|
26713
26917
|
}
|
|
@@ -26718,6 +26922,7 @@ function requireUnwrapHandler () {
|
|
|
26718
26922
|
}
|
|
26719
26923
|
|
|
26720
26924
|
onComplete (rawTrailers) {
|
|
26925
|
+
this.#controller.rawTrailers = rawTrailers;
|
|
26721
26926
|
this.#handler.onResponseEnd?.(this.#controller, parseHeaders(rawTrailers));
|
|
26722
26927
|
}
|
|
26723
26928
|
|
|
@@ -26750,6 +26955,7 @@ function requireDispatcherBase () {
|
|
|
26750
26955
|
|
|
26751
26956
|
const kOnDestroyed = Symbol('onDestroyed');
|
|
26752
26957
|
const kOnClosed = Symbol('onClosed');
|
|
26958
|
+
const kWebSocketOptions = Symbol('webSocketOptions');
|
|
26753
26959
|
|
|
26754
26960
|
class DispatcherBase extends Dispatcher {
|
|
26755
26961
|
/** @type {boolean} */
|
|
@@ -26764,6 +26970,24 @@ function requireDispatcherBase () {
|
|
|
26764
26970
|
/** @type {Array<Function>|null} */
|
|
26765
26971
|
[kOnClosed] = null
|
|
26766
26972
|
|
|
26973
|
+
/**
|
|
26974
|
+
* @param {import('../../types/dispatcher').DispatcherOptions} [opts]
|
|
26975
|
+
*/
|
|
26976
|
+
constructor (opts) {
|
|
26977
|
+
super();
|
|
26978
|
+
this[kWebSocketOptions] = opts?.webSocket ?? {};
|
|
26979
|
+
}
|
|
26980
|
+
|
|
26981
|
+
/**
|
|
26982
|
+
* @returns {import('../../types/dispatcher').WebSocketOptions}
|
|
26983
|
+
*/
|
|
26984
|
+
get webSocketOptions () {
|
|
26985
|
+
return {
|
|
26986
|
+
maxFragments: this[kWebSocketOptions].maxFragments ?? 131072,
|
|
26987
|
+
maxPayloadSize: this[kWebSocketOptions].maxPayloadSize ?? 128 * 1024 * 1024 // 128 MB default
|
|
26988
|
+
}
|
|
26989
|
+
}
|
|
26990
|
+
|
|
26767
26991
|
/** @returns {boolean} */
|
|
26768
26992
|
get destroyed () {
|
|
26769
26993
|
return this[kDestroyed]
|
|
@@ -26912,7 +27136,7 @@ function requireConnect () {
|
|
|
26912
27136
|
if (hasRequiredConnect) return connect;
|
|
26913
27137
|
hasRequiredConnect = 1;
|
|
26914
27138
|
|
|
26915
|
-
const net = require$$
|
|
27139
|
+
const net = require$$1$4;
|
|
26916
27140
|
const assert = require$$0$7;
|
|
26917
27141
|
const util = requireUtil$5();
|
|
26918
27142
|
const { InvalidArgumentError } = requireErrors();
|
|
@@ -26950,6 +27174,22 @@ function requireConnect () {
|
|
|
26950
27174
|
return
|
|
26951
27175
|
}
|
|
26952
27176
|
|
|
27177
|
+
if (this._sessionCache.has(sessionKey)) {
|
|
27178
|
+
this._sessionCache.delete(sessionKey);
|
|
27179
|
+
} else if (this._sessionCache.size >= this._maxCachedSessions) {
|
|
27180
|
+
for (const [key, ref] of this._sessionCache) {
|
|
27181
|
+
if (ref.deref() === undefined) {
|
|
27182
|
+
this._sessionCache.delete(key);
|
|
27183
|
+
return
|
|
27184
|
+
}
|
|
27185
|
+
}
|
|
27186
|
+
|
|
27187
|
+
const oldest = this._sessionCache.keys().next();
|
|
27188
|
+
if (!oldest.done) {
|
|
27189
|
+
this._sessionCache.delete(oldest.value);
|
|
27190
|
+
}
|
|
27191
|
+
}
|
|
27192
|
+
|
|
26953
27193
|
this._sessionCache.set(sessionKey, new WeakRef(session));
|
|
26954
27194
|
this._sessionRegistry.register(session, sessionKey);
|
|
26955
27195
|
}
|
|
@@ -27624,7 +27864,7 @@ function requireLlhttpWasm () {
|
|
|
27624
27864
|
hasRequiredLlhttpWasm = 1;
|
|
27625
27865
|
(function (module) {
|
|
27626
27866
|
|
|
27627
|
-
const { Buffer } = require$$0$
|
|
27867
|
+
const { Buffer } = require$$0$a;
|
|
27628
27868
|
|
|
27629
27869
|
const wasmBase64 = 'AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAn9/AGABfwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAzU0BQYAAAMAAAAAAAADAQMAAwMDAAACAAAAAAICAgICAgICAgIBAQEBAQEBAQEBAwAAAwAAAAQFAXABExMFAwEAAgYIAX8BQcDZBAsHxQcoBm1lbW9yeQIAC19pbml0aWFsaXplAAgZX19pbmRpcmVjdF9mdW5jdGlvbl90YWJsZQEAC2xsaHR0cF9pbml0AAkYbGxodHRwX3Nob3VsZF9rZWVwX2FsaXZlADcMbGxodHRwX2FsbG9jAAsGbWFsbG9jADkLbGxodHRwX2ZyZWUADARmcmVlAAwPbGxodHRwX2dldF90eXBlAA0VbGxodHRwX2dldF9odHRwX21ham9yAA4VbGxodHRwX2dldF9odHRwX21pbm9yAA8RbGxodHRwX2dldF9tZXRob2QAEBZsbGh0dHBfZ2V0X3N0YXR1c19jb2RlABESbGxodHRwX2dldF91cGdyYWRlABIMbGxodHRwX3Jlc2V0ABMObGxodHRwX2V4ZWN1dGUAFBRsbGh0dHBfc2V0dGluZ3NfaW5pdAAVDWxsaHR0cF9maW5pc2gAFgxsbGh0dHBfcGF1c2UAFw1sbGh0dHBfcmVzdW1lABgbbGxodHRwX3Jlc3VtZV9hZnRlcl91cGdyYWRlABkQbGxodHRwX2dldF9lcnJubwAaF2xsaHR0cF9nZXRfZXJyb3JfcmVhc29uABsXbGxodHRwX3NldF9lcnJvcl9yZWFzb24AHBRsbGh0dHBfZ2V0X2Vycm9yX3BvcwAdEWxsaHR0cF9lcnJub19uYW1lAB4SbGxodHRwX21ldGhvZF9uYW1lAB8SbGxodHRwX3N0YXR1c19uYW1lACAabGxodHRw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AXRrQT5qIQILIAEgAjYCHCABQgA3AhAgAkECdEH01wBqIQACQEHI1QAoAgAiA0EBIAJ0IgdxRQRAIAAgATYCAEHI1QAgAyAHcjYCACABIAA2AhggASABNgIIIAEgATYCDAwBCyAEQRkgAkEBdmtBACACQR9HG3QhAiAAKAIAIQACQANAIAAiAygCBEF4cSAERg0BIAJBHXYhACACQQF0IQIgAyAAQQRxakEQaiIHKAIAIgANAAsgByABNgIAIAEgAzYCGCABIAE2AgwgASABNgIIDAELIAMoAggiACABNgIMIAMgATYCCCABQQA2AhggASADNgIMIAEgADYCCAtB5NUAQeTVACgCAEEBayIAQX8gABs2AgALCwcAIAAtACgLBwAgAC0AKgsHACAALQArCwcAIAAtACkLBwAgAC8BNAsHACAALQAwC0ABBH8gACgCGCEBIAAvAS4hAiAALQAoIQMgACgCOCEEIAAQOCAAIAQ2AjggACADOgAoIAAgAjsBLiAAIAE2AhgL5YUCAgd/A34gASACaiEEAkAgACIDKAIMIgANACADKAIEBEAgAyABNgIECyMAQRBrIgkkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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C0HjAQwHC0HXAQwGC0HYAQwFC0HZAQwEC0HaAQwDC0HbAQwCC0HdAQwBC0HcAQshAgNAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQAJ/AkACQAJAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMCfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAg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ogKiAqICogKiAqICogKiAqICogKiAqICogIAogILIAQgAUEBaiIBRw0AC0HJACECDOwCCyABQQFqIQEgA0Evai0AAEEBcQ2lAiADQQA2AhwgAyABNgIUIANBlxA2AhAgA0EKNgIMQQAhAgzrAgsgASAERwRAA0AgAS0AAEEgRw0VIAQgAUEBaiIBRw0AC0H4ACECDOsCC0H4ACECDOoCCyADQQI6ACgMOAtBACECIANBADYCHCADQb8LNgIQIANBAjYCDCADIAFBAWo2AhQM6AILQQAhAgzOAgtBDSECDM0CC0ETIQIMzAILQRUhAgzLAgtBFiECDMoCC0EYIQIMyQILQRkhAgzIAgtBGiECDMcCC0EbIQIMxgILQRwhAgzFAgtBHSECDMQCC0EeIQIMwwILQR8hAgzCAgtBICECDMECC0EiIQIMwAILQSMhAgy/AgtBJSECDL4CC0HlACECDL0CCyADQT02AhwgAyABNgIUIAMgADYCDEEAIQIM1QILIANBGzYCHCADIAE2AhQgA0GkHDYCECADQRU2AgxBACECDNQCCyADQSA2AhwgAyABNgIUIANBmBo2AhAgA0EVNgIMQQAhAgzTAgsgA0ETNgIcIAMgATYCFCADQZgaNgIQIANBFTYCDEEAIQIM0gILIANBCzYCHCADIAE2AhQgA0GYGjYCECADQRU2AgxBACECDNECCyADQRA2AhwgAyABNgIUIANBmBo2AhAgA0EVNgIMQQAhAgzQAgsgA0EgNgIcIAMgATYCFCADQaQcNgIQIANBFTYCDEEAIQIMzwILIANBCzYCHCADIAE2AhQgA0GkHDYCECADQRU2AgxBACECDM4CCyADQQw2AhwgAyABNgIUIANBpBw2AhAgA0EVNgIMQQAhAgzNAgtBACECIANBADYCHCADIAE2AhQgA0HdDjYCECADQRI2AgwMzAILAkADQAJAIAEtAABBCmsOBAACAgACCyAEIAFBAWoiAUcNAAtB/QEhAgzMAgsCQAJAIAMtADZBAUcNAEEAIQACQCADKAI4IgJFDQAgAigCYCICRQ0AIAMgAhEAACEACyAARQ0AIABBFUcNASADQfwBNgIcIAMgATYCFCADQdwZNgIQIANBFTYCDEEAIQIMzQILQdwBIQIMswILIANBADYCHCADIAE2AhQgA0H5CzYCECADQR82AgxBACECDMsCCwJAAkAgAy0AKEEBaw4CBAEAC0HbASECDLICC0HUASECDLECCyADQQI6ADFBACEAAkAgAygCOCICRQ0AIAIoAgAiAkUNACADIAIRAAAhAAsgAEUEQEHdASECDLECCyAAQRVHBEAgA0EANgIcIAMgATYCFCADQbQMNgIQIANBEDYCDEEAIQIMygILIANB+wE2AhwgAyABNgIUIANBgRo2AhAgA0EVNgIMQQAhAgzJAgsgASAERgRAQfoBIQIMyQILIAEtAABByABGDQEgA0EBOgAoC0HAASECDK4CC0HaASECDK0CCyABIARHBEAgA0EMNgIIIAMgATYCBEHZASECDK0CC0H5ASECDMUCCyABIARGBEBB+AEhAgzFAgsgAS0AAEHIAEcNBCABQQFqIQFB2AEhAgyrAgsgASAERgRAQfcBIQIMxAILAkACQCABLQAAQcUAaw4QAAUFBQUFBQUFBQUFBQUFAQULIAFBAWohAUHWASECDKsCCyABQQFqIQFB1wEhAgyqAgtB9gEhAiABIARGDcICIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQbrVAGotAABHDQMgAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADMMCCyADKAIEIQAgA0IANwMAIAMgACAGQQFqIgEQLiIARQRAQeMBIQIMqgILIANB9QE2AhwgAyABNgIUIAMgADYCDEEAIQIMwgILQfQBIQIgASAERg3BAiADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEG41QBqLQAARw0CIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzCAgsgA0GBBDsBKCADKAIEIQAgA0IANwMAIAMgACAGQQFqIgEQLiIADQMMAgsgA0EANgIAC0EAIQIgA0EANgIcIAMgATYCFCADQeUfNgIQIANBCDYCDAy/AgtB1QEhAgylAgsgA0HzATYCHCADIAE2AhQgAyAANgIMQQAhAgy9AgtBACEAAkAgAygCOCICRQ0AIAIoAkAiAkUNACADIAIRAAAhAAsgAEUNbiAAQRVHBEAgA0EANgIcIAMgATYCFCADQYIPNgIQIANBIDYCDEEAIQIMvQILIANBjwE2AhwgAyABNgIUIANB7Bs2AhAgA0EVNgIMQQAhAgy8AgsgASAERwRAIANBDTYCCCADIAE2AgRB0wEhAgyjAgtB8gEhAgy7AgsgASAERgRAQfEBIQIMuwILAkACQAJAIAEtAABByABrDgsAAQgICAgICAgIAggLIAFBAWohAUHQASECDKMCCyABQQFqIQFB0QEhAgyiAgsgAUEBaiEBQdIBIQIMoQILQfABIQIgASAERg25AiADKAIAIgAgBCABa2ohBiABIABrQQJqIQUDQCABLQAAIABBtdUAai0AAEcNBCAAQQJGDQMgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAY2AgAMuQILQe8BIQIgASAERg24AiADKAIAIgAgBCABa2ohBiABIABrQQFqIQUDQCABLQAAIABBs9UAai0AAEcNAyAAQQFGDQIgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAY2AgAMuAILQe4BIQIgASAERg23AiADKAIAIgAgBCABa2ohBiABIABrQQJqIQUDQCABLQAAIABBsNUAai0AAEcNAiAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAY2AgAMtwILIAMoAgQhACADQgA3AwAgAyAAIAVBAWoiARArIgBFDQIgA0HsATYCHCADIAE2AhQgAyAANgIMQQAhAgy2AgsgA0EANgIACyADKAIEIQAgA0EANgIEIAMgACABECsiAEUNnAIgA0HtATYCHCADIAE2AhQgAyAANgIMQQAhAgy0AgtBzwEhAgyaAgtBACEAAkAgAygCOCICRQ0AIAIoAjQiAkUNACADIAIRAAAhAAsCQCAABEAgAEEVRg0BIANBADYCHCADIAE2AhQgA0HqDTYCECADQSY2AgxBACECDLQCC0HOASECDJoCCyADQesBNgIcIAMgATYCFCADQYAbNgIQIANBFTYCDEEAIQIMsgILIAEgBEYEQEHrASECDLICCyABLQAAQS9GBEAgAUEBaiEBDAELIANBADYCHCADIAE2AhQgA0GyODYCECADQQg2AgxBACECDLECC0HNASECDJcCCyABIARHBEAgA0EONgIIIAMgATYCBEHMASECDJcCC0HqASECDK8CCyABIARGBEBB6QEhAgyvAgsgAS0AAEEwayIAQf8BcUEKSQRAIAMgADoAKiABQQFqIQFBywEhAgyWAgsgAygCBCEAIANBADYCBCADIAAgARAvIgBFDZcCIANB6AE2AhwgAyABNgIUIAMgADYCDEEAIQIMrgILIAEgBEYEQEHnASECDK4CCwJAIAEtAABBLkYEQCABQQFqIQEMAQsgAygCBCEAIANBADYCBCADIAAgARAvIgBFDZgCIANB5gE2AhwgAyABNgIUIAMgADYCDEEAIQIMrgILQcoBIQIMlAILIAEgBEYEQEHlASECDK0CC0EAIQBBASEFQQEhB0EAIQICQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQCABLQAAQTBrDgoKCQABAgMEBQYICwtBAgwGC0EDDAULQQQMBAtBBQwDC0EGDAILQQcMAQtBCAshAkEAIQVBACEHDAILQQkhAkEBIQBBACEFQQAhBwwBC0EAIQVBASECCyADIAI6ACsgAUEBaiEBAkACQCADLQAuQRBxDQACQAJAAkAgAy0AKg4DAQACBAsgB0UNAwwCCyAADQEMAgsgBUUNAQsgAygCBCEAIANBADYCBCADIAAgARAvIgBFDQIgA0HiATYCHCADIAE2AhQgAyAANgIMQQAhAgyvAgsgAygCBCEAIANBADYCBCADIAAgARAvIgBFDZoCIANB4wE2AhwgAyABNgIUIAMgADYCDEEAIQIMrgILIAMoAgQhACADQQA2AgQgAyAAIAEQLyIARQ2YAiADQeQBNgIcIAMgATYCFCADIAA2AgwMrQILQckBIQIMkwILQQAhAAJAIAMoAjgiAkUNACACKAJEIgJFDQAgAyACEQAAIQALAkAgAARAIABBFUYNASADQQA2AhwgAyABNgIUIANBpA02AhAgA0EhNgIMQQAhAgytAgtByAEhAgyTAgsgA0HhATYCHCADIAE2AhQgA0HQGjYCECADQRU2AgxBACECDKsCCyABIARGBEBB4QEhAgyrAgsCQCABLQAAQSBGBEAgA0EAOwE0IAFBAWohAQwBCyADQQA2AhwgAyABNgIUIANBmRE2AhAgA0EJNgIMQQAhAgyrAgtBxwEhAgyRAgsgASAERgRAQeABIQIMqgILAkAgAS0AAEEwa0H/AXEiAkEKSQRAIAFBAWohAQJAIAMvATQiAEGZM0sNACADIABBCmwiADsBNCAAQf7/A3EgAkH//wNzSw0AIAMgACACajsBNAwCC0EAIQIgA0EANgIcIAMgATYCFCADQZUeNgIQIANBDTYCDAyrAgsgA0EANgIcIAMgATYCFCADQZUeNgIQIANBDTYCDEEAIQIMqgILQcYBIQIMkAILIAEgBEYEQEHfASECDKkCCwJAIAEtAABBMGtB/wFxIgJBCkkEQCABQQFqIQECQCADLwE0IgBBmTNLDQAgAyAAQQpsIgA7ATQgAEH+/wNxIAJB//8Dc0sNACADIAAgAmo7ATQMAgtBACECIANBADYCHCADIAE2AhQgA0GVHjYCECADQQ02AgwMqgILIANBADYCHCADIAE2AhQgA0GVHjYCECADQQ02AgxBACECDKkCC0HFASECDI8CCyABIARGBEBB3gEhAgyoAgsCQCABLQAAQTBrQf8BcSICQQpJBEAgAUEBaiEBAkAgAy8BNCIAQZkzSw0AIAMgAEEKbCIAOwE0IABB/v8DcSACQf//A3NLDQAgAyAAIAJqOwE0DAILQQAhAiADQQA2AhwgAyABNgIUIANBlR42AhAgA0ENNgIMDKkCCyADQQA2AhwgAyABNgIUIANBlR42AhAgA0ENNgIMQQAhAgyoAgtBxAEhAgyOAgsgASAERgRAQd0BIQIMpwILAkACQAJAAkAgAS0AAEEKaw4XAgMDAAMDAwMDAwMDAwMDAwMDAwMDAwEDCyABQQFqDAULIAFBAWohAUHDASECDI8CCyABQQFqIQEgA0Evai0AAEEBcQ0IIANBADYCHCADIAE2AhQgA0GNCzYCECADQQ02AgxBACECDKcCCyADQQA2AhwgAyABNgIUIANBjQs2AhAgA0ENNgIMQQAhAgymAgsgASAERwRAIANBDzYCCCADIAE2AgRBASECDI0CC0HcASECDKUCCwJAAkADQAJAIAEtAABBCmsOBAIAAAMACyAEIAFBAWoiAUcNAAtB2wEhAgymAgsgAygCBCEAIANBADYCBCADIAAgARAtIgBFBEAgAUEBaiEBDAQLIANB2gE2AhwgAyAANgIMIAMgAUEBajYCFEEAIQIMpQILIAMoAgQhACADQQA2AgQgAyAAIAEQLSIADQEgAUEBagshAUHBASECDIoCCyADQdkBNgIcIAMgADYCDCADIAFBAWo2AhRBACECDKICC0HCASECDIgCCyADQS9qLQAAQQFxDQEgA0EANgIcIAMgATYCFCADQeQcNgIQIANBGTYCDEEAIQIMoAILIAEgBEYEQEHZASECDKACCwJAAkACQCABLQAAQQprDgQBAgIAAgsgAUEBaiEBDAILIAFBAWohAQwBCyADLQAuQcAAcUUNAQtBACEAAkAgAygCOCICRQ0AIAIoAjwiAkUNACADIAIRAAAhAAsgAEUNoAEgAEEVRgRAIANB2QA2AhwgAyABNgIUIANBtxo2AhAgA0EVNgIMQQAhAgyfAgsgA0EANgIcIAMgATYCFCADQYANNgIQIANBGzYCDEEAIQIMngILIANBADYCHCADIAE2AhQgA0HcKDYCECADQQI2AgxBACECDJ0CCyABIARHBEAgA0EMNgIIIAMgATYCBEG/ASECDIQCC0HYASECDJwCCyABIARGBEBB1wEhAgycAgsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEtAABBwQBrDhUAAQIDWgQFBlpaWgcICQoLDA0ODxBaCyABQQFqIQFB+wAhAgySAgsgAUEBaiEBQfwAIQIMkQILIAFBAWohAUGBASECDJACCyABQQFqIQFBhQEhAgyPAgsgAUEBaiEBQYYBIQIMjgILIAFBAWohAUGJASECDI0CCyABQQFqIQFBigEhAgyMAgsgAUEBaiEBQY0BIQIMiwILIAFBAWohAUGWASECDIoCCyABQQFqIQFBlwEhAgyJAgsgAUEBaiEBQZgBIQIMiAILIAFBAWohAUGlASECDIcCCyABQQFqIQFBpgEhAgyGAgsgAUEBaiEBQawBIQIMhQILIAFBAWohAUG0ASECDIQCCyABQQFqIQFBtwEhAgyDAgsgAUEBaiEBQb4BIQIMggILIAEgBEYEQEHWASECDJsCCyABLQAAQc4ARw1IIAFBAWohAUG9ASECDIECCyABIARGBEBB1QEhAgyaAgsCQAJAAkAgAS0AAEHCAGsOEgBKSkpKSkpKSkoBSkpKSkpKAkoLIAFBAWohAUG4ASECDIICCyABQQFqIQFBuwEhAgyBAgsgAUEBaiEBQbwBIQIMgAILQdQBIQIgASAERg2YAiADKAIAIgAgBCABa2ohBSABIABrQQdqIQYCQANAIAEtAAAgAEGo1QBqLQAARw1FIABBB0YNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyZAgsgA0EANgIAIAZBAWohAUEbDEULIAEgBEYEQEHTASECDJgCCwJAAkAgAS0AAEHJAGsOBwBHR0dHRwFHCyABQQFqIQFBuQEhAgz/AQsgAUEBaiEBQboBIQIM/gELQdIBIQIgASAERg2WAiADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGm1QBqLQAARw1DIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyXAgsgA0EANgIAIAZBAWohAUEPDEMLQdEBIQIgASAERg2VAiADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGk1QBqLQAARw1CIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyWAgsgA0EANgIAIAZBAWohAUEgDEILQdABIQIgASAERg2UAiADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGh1QBqLQAARw1BIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyVAgsgA0EANgIAIAZBAWohAUESDEELIAEgBEYEQEHPASECDJQCCwJAAkAgAS0AAEHFAGsODgBDQ0NDQ0NDQ0NDQ0MBQwsgAUEBaiEBQbUBIQIM+wELIAFBAWohAUG2ASECDPoBC0HOASECIAEgBEYNkgIgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABBntUAai0AAEcNPyAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMkwILIANBADYCACAGQQFqIQFBBww/C0HNASECIAEgBEYNkQIgAygCACIAIAQgAWtqIQUgASAAa0EFaiEGAkADQCABLQAAIABBmNUAai0AAEcNPiAAQQVGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMkgILIANBADYCACAGQQFqIQFBKAw+CyABIARGBEBBzAEhAgyRAgsCQAJAAkAgAS0AAEHFAGsOEQBBQUFBQUFBQUEBQUFBQUECQQsgAUEBaiEBQbEBIQIM+QELIAFBAWohAUGyASECDPgBCyABQQFqIQFBswEhAgz3AQtBywEhAiABIARGDY8CIAMoAgAiACAEIAFraiEFIAEgAGtBBmohBgJAA0AgAS0AACAAQZHVAGotAABHDTwgAEEGRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADJACCyADQQA2AgAgBkEBaiEBQRoMPAtBygEhAiABIARGDY4CIAMoAgAiACAEIAFraiEFIAEgAGtBA2ohBgJAA0AgAS0AACAAQY3VAGotAABHDTsgAEEDRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADI8CCyADQQA2AgAgBkEBaiEBQSEMOwsgASAERgRAQckBIQIMjgILAkACQCABLQAAQcEAaw4UAD09PT09PT09PT09PT09PT09PQE9CyABQQFqIQFBrQEhAgz1AQsgAUEBaiEBQbABIQIM9AELIAEgBEYEQEHIASECDI0CCwJAAkAgAS0AAEHVAGsOCwA8PDw8PDw8PDwBPAsgAUEBaiEBQa4BIQIM9AELIAFBAWohAUGvASECDPMBC0HHASECIAEgBEYNiwIgAygCACIAIAQgAWtqIQUgASAAa0EIaiEGAkADQCABLQAAIABBhNUAai0AAEcNOCAAQQhGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMjAILIANBADYCACAGQQFqIQFBKgw4CyABIARGBEBBxgEhAgyLAgsgAS0AAEHQAEcNOCABQQFqIQFBJQw3C0HFASECIAEgBEYNiQIgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABBgdUAai0AAEcNNiAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMigILIANBADYCACAGQQFqIQFBDgw2CyABIARGBEBBxAEhAgyJAgsgAS0AAEHFAEcNNiABQQFqIQFBqwEhAgzvAQsgASAERgRAQcMBIQIMiAILAkACQAJAAkAgAS0AAEHCAGsODwABAjk5OTk5OTk5OTk5AzkLIAFBAWohAUGnASECDPEBCyABQQFqIQFBqAEhAgzwAQsgAUEBaiEBQakBIQIM7wELIAFBAWohAUGqASECDO4BC0HCASECIAEgBEYNhgIgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABB/tQAai0AAEcNMyAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMhwILIANBADYCACAGQQFqIQFBFAwzC0HBASECIAEgBEYNhQIgAygCACIAIAQgAWtqIQUgASAAa0EEaiEGAkADQCABLQAAIABB+dQAai0AAEcNMiAAQQRGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMhgILIANBADYCACAGQQFqIQFBKwwyC0HAASECIAEgBEYNhAIgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABB9tQAai0AAEcNMSAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMhQILIANBADYCACAGQQFqIQFBLAwxC0G/ASECIAEgBEYNgwIgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABBodUAai0AAEcNMCAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMhAILIANBADYCACAGQQFqIQFBEQwwC0G+ASECIAEgBEYNggIgAygCACIAIAQgAWtqIQUgASAAa0EDaiEGAkADQCABLQAAIABB8tQAai0AAEcNLyAAQQNGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMgwILIANBADYCACAGQQFqIQFBLgwvCyABIARGBEBBvQEhAgyCAgsCQAJAAkACQAJAIAEtAABBwQBrDhUANDQ0NDQ0NDQ0NAE0NAI0NAM0NAQ0CyABQQFqIQFBmwEhAgzsAQsgAUEBaiEBQZwBIQIM6wELIAFBAWohAUGdASECDOoBCyABQQFqIQFBogEhAgzpAQsgAUEBaiEBQaQBIQIM6AELIAEgBEYEQEG8ASECDIECCwJAAkAgAS0AAEHSAGsOAwAwATALIAFBAWohAUGjASECDOgBCyABQQFqIQFBBAwtC0G7ASECIAEgBEYN/wEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABB8NQAai0AAEcNLCAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMgAILIANBADYCACAGQQFqIQFBHQwsCyABIARGBEBBugEhAgz/AQsCQAJAIAEtAABByQBrDgcBLi4uLi4ALgsgAUEBaiEBQaEBIQIM5gELIAFBAWohAUEiDCsLIAEgBEYEQEG5ASECDP4BCyABLQAAQdAARw0rIAFBAWohAUGgASECDOQBCyABIARGBEBBuAEhAgz9AQsCQAJAIAEtAABBxgBrDgsALCwsLCwsLCwsASwLIAFBAWohAUGeASECDOQBCyABQQFqIQFBnwEhAgzjAQtBtwEhAiABIARGDfsBIAMoAgAiACAEIAFraiEFIAEgAGtBA2ohBgJAA0AgAS0AACAAQezUAGotAABHDSggAEEDRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADPwBCyADQQA2AgAgBkEBaiEBQQ0MKAtBtgEhAiABIARGDfoBIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQaHVAGotAABHDScgAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADPsBCyADQQA2AgAgBkEBaiEBQQwMJwtBtQEhAiABIARGDfkBIAMoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQerUAGotAABHDSYgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADPoBCyADQQA2AgAgBkEBaiEBQQMMJgtBtAEhAiABIARGDfgBIAMoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQejUAGotAABHDSUgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADPkBCyADQQA2AgAgBkEBaiEBQSYMJQsgASAERgRAQbMBIQIM+AELAkACQCABLQAAQdQAaw4CAAEnCyABQQFqIQFBmQEhAgzfAQsgAUEBaiEBQZoBIQIM3gELQbIBIQIgASAERg32ASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHm1ABqLQAARw0jIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAz3AQsgA0EANgIAIAZBAWohAUEnDCMLQbEBIQIgASAERg31ASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHk1ABqLQAARw0iIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAz2AQsgA0EANgIAIAZBAWohAUEcDCILQbABIQIgASAERg30ASADKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEHe1ABqLQAARw0hIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAz1AQsgA0EANgIAIAZBAWohAUEGDCELQa8BIQIgASAERg3zASADKAIAIgAgBCABa2ohBSABIABrQQRqIQYCQANAIAEtAAAgAEHZ1ABqLQAARw0gIABBBEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAz0AQsgA0EANgIAIAZBAWohAUEZDCALIAEgBEYEQEGuASECDPMBCwJAAkACQAJAIAEtAABBLWsOIwAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJAEkJCQkJAIkJCQDJAsgAUEBaiEBQY4BIQIM3AELIAFBAWohAUGPASECDNsBCyABQQFqIQFBlAEhAgzaAQsgAUEBaiEBQZUBIQIM2QELQa0BIQIgASAERg3xASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHX1ABqLQAARw0eIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzyAQsgA0EANgIAIAZBAWohAUELDB4LIAEgBEYEQEGsASECDPEBCwJAAkAgAS0AAEHBAGsOAwAgASALIAFBAWohAUGQASECDNgBCyABQQFqIQFBkwEhAgzXAQsgASAERgRAQasBIQIM8AELAkACQCABLQAAQcEAaw4PAB8fHx8fHx8fHx8fHx8BHwsgAUEBaiEBQZEBIQIM1wELIAFBAWohAUGSASECDNYBCyABIARGBEBBqgEhAgzvAQsgAS0AAEHMAEcNHCABQQFqIQFBCgwbC0GpASECIAEgBEYN7QEgAygCACIAIAQgAWtqIQUgASAAa0EFaiEGAkADQCABLQAAIABB0dQAai0AAEcNGiAAQQVGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM7gELIANBADYCACAGQQFqIQFBHgwaC0GoASECIAEgBEYN7AEgAygCACIAIAQgAWtqIQUgASAAa0EGaiEGAkADQCABLQAAIABBytQAai0AAEcNGSAAQQZGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM7QELIANBADYCACAGQQFqIQFBFQwZC0GnASECIAEgBEYN6wEgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABBx9QAai0AAEcNGCAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM7AELIANBADYCACAGQQFqIQFBFwwYC0GmASECIAEgBEYN6gEgAygCACIAIAQgAWtqIQUgASAAa0EFaiEGAkADQCABLQAAIABBwdQAai0AAEcNFyAAQQVGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM6wELIANBADYCACAGQQFqIQFBGAwXCyABIARGBEBBpQEhAgzqAQsCQAJAIAEtAABByQBrDgcAGRkZGRkBGQsgAUEBaiEBQYsBIQIM0QELIAFBAWohAUGMASECDNABC0GkASECIAEgBEYN6AEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABBptUAai0AAEcNFSAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM6QELIANBADYCACAGQQFqIQFBCQwVC0GjASECIAEgBEYN5wEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABBpNUAai0AAEcNFCAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM6AELIANBADYCACAGQQFqIQFBHwwUC0GiASECIAEgBEYN5gEgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABBvtQAai0AAEcNEyAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM5wELIANBADYCACAGQQFqIQFBAgwTC0GhASECIAEgBEYN5QEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGA0AgAS0AACAAQbzUAGotAABHDREgAEEBRg0CIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADOUBCyABIARGBEBBoAEhAgzlAQtBASABLQAAQd8ARw0RGiABQQFqIQFBhwEhAgzLAQsgA0EANgIAIAZBAWohAUGIASECDMoBC0GfASECIAEgBEYN4gEgAygCACIAIAQgAWtqIQUgASAAa0EIaiEGAkADQCABLQAAIABBhNUAai0AAEcNDyAAQQhGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM4wELIANBADYCACAGQQFqIQFBKQwPC0GeASECIAEgBEYN4QEgAygCACIAIAQgAWtqIQUgASAAa0EDaiEGAkADQCABLQAAIABBuNQAai0AAEcNDiAAQQNGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM4gELIANBADYCACAGQQFqIQFBLQwOCyABIARGBEBBnQEhAgzhAQsgAS0AAEHFAEcNDiABQQFqIQFBhAEhAgzHAQsgASAERgRAQZwBIQIM4AELAkACQCABLQAAQcwAaw4IAA8PDw8PDwEPCyABQQFqIQFBggEhAgzHAQsgAUEBaiEBQYMBIQIMxgELQZsBIQIgASAERg3eASADKAIAIgAgBCABa2ohBSABIABrQQRqIQYCQANAIAEtAAAgAEGz1ABqLQAARw0LIABBBEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzfAQsgA0EANgIAIAZBAWohAUEjDAsLQZoBIQIgASAERg3dASADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGw1ABqLQAARw0KIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzeAQsgA0EANgIAIAZBAWohAUEADAoLIAEgBEYEQEGZASECDN0BCwJAAkAgAS0AAEHIAGsOCAAMDAwMDAwBDAsgAUEBaiEBQf0AIQIMxAELIAFBAWohAUGAASECDMMBCyABIARGBEBBmAEhAgzcAQsCQAJAIAEtAABBzgBrDgMACwELCyABQQFqIQFB/gAhAgzDAQsgAUEBaiEBQf8AIQIMwgELIAEgBEYEQEGXASECDNsBCyABLQAAQdkARw0IIAFBAWohAUEIDAcLQZYBIQIgASAERg3ZASADKAIAIgAgBCABa2ohBSABIABrQQNqIQYCQANAIAEtAAAgAEGs1ABqLQAARw0GIABBA0YNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzaAQsgA0EANgIAIAZBAWohAUEFDAYLQZUBIQIgASAERg3YASADKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGm1ABqLQAARw0FIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzZAQsgA0EANgIAIAZBAWohAUEWDAULQZQBIQIgASAERg3XASADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGh1QBqLQAARw0EIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzYAQsgA0EANgIAIAZBAWohAUEQDAQLIAEgBEYEQEGTASECDNcBCwJAAkAgAS0AAEHDAGsODAAGBgYGBgYGBgYGAQYLIAFBAWohAUH5ACECDL4BCyABQQFqIQFB+gAhAgy9AQtBkgEhAiABIARGDdUBIAMoAgAiACAEIAFraiEFIAEgAGtBBWohBgJAA0AgAS0AACAAQaDUAGotAABHDQIgAEEFRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADNYBCyADQQA2AgAgBkEBaiEBQSQMAgsgA0EANgIADAILIAEgBEYEQEGRASECDNQBCyABLQAAQcwARw0BIAFBAWohAUETCzoAKSADKAIEIQAgA0EANgIEIAMgACABEC4iAA0CDAELQQAhAiADQQA2AhwgAyABNgIUIANB/h82AhAgA0EGNgIMDNEBC0H4ACECDLcBCyADQZABNgIcIAMgATYCFCADIAA2AgxBACECDM8BC0EAIQACQCADKAI4IgJFDQAgAigCQCICRQ0AIAMgAhEAACEACyAARQ0AIABBFUYNASADQQA2AhwgAyABNgIUIANBgg82AhAgA0EgNgIMQQAhAgzOAQtB9wAhAgy0AQsgA0GPATYCHCADIAE2AhQgA0HsGzYCECADQRU2AgxBACECDMwBCyABIARGBEBBjwEhAgzMAQsCQCABLQAAQSBGBEAgAUEBaiEBDAELIANBADYCHCADIAE2AhQgA0GbHzYCECADQQY2AgxBACECDMwBC0ECIQIMsgELA0AgAS0AAEEgRw0CIAQgAUEBaiIBRw0AC0GOASECDMoBCyABIARGBEBBjQEhAgzKAQsCQCABLQAAQQlrDgRKAABKAAtB9QAhAgywAQsgAy0AKUEFRgRAQfYAIQIMsAELQfQAIQIMrwELIAEgBEYEQEGMASECDMgBCyADQRA2AgggAyABNgIEDAoLIAEgBEYEQEGLASECDMcBCwJAIAEtAABBCWsOBEcAAEcAC0HzACECDK0BCyABIARHBEAgA0EQNgIIIAMgATYCBEHxACECDK0BC0GKASECDMUBCwJAIAEgBEcEQANAIAEtAABBoNAAai0AACIAQQNHBEACQCAAQQFrDgJJAAQLQfAAIQIMrwELIAQgAUEBaiIBRw0AC0GIASEC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BCABQQFqIgFHDQALQfsAIQIMpwELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0DIANB2wA2AhwgAyABNgIUIAMgADYCDEEAIQIMpgELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0DIANB3QA2AhwgAyABNgIUIAMgADYCDEEAIQIMpQELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0DIANB+gA2AhwgAyABNgIUIAMgADYCDEEAIQIMpAELIANBADYCHCADIAE2AhQgA0G8CjYCECADQQc2AgxBACECDKMBC0HPACECDIkBC0HRACECDIgBC0HnACECDIcBCyABIARGBEBB+gAhAgygAQsCQCABLQAAQQlrDgQgAAAgAAsgAUEBaiEBQeYAIQIMhgELIAEgBEYEQEH5ACECDJ8BCwJAIAEtAABBCWsOBB8AAB8AC0EAIQACQCADKAI4IgJFDQAgAigCOCICRQ0AIAMgAhEAACEACyAARQRAQeIBIQIMhgELIABBFUcEQCADQQA2AhwgAyABNgIUIANByQ02AhAgA0EaNgIMQQAhAgyfAQsgA0H4ADYCHCADIAE2AhQgA0HqGjYCECADQRU2AgxBACECDJ4BCyABIARHBEAgA0ENNgIIIAMgATYCBEHkACECDIUBC0H3ACECDJ0BCyABIARGBEBB9gAhAgydAQsCQAJAAkAgAS0AAEHIAGsOCwABCwsLCwsLCwsCCwsgAUEBaiEBQd0AIQIMhQELIAFBAWohAUHgACECDIQBCyABQQFqIQFB4wAhAgyDAQtB9QAhAiABIARGDZsBIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQbXVAGotAABHDQggAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADJwBCyADKAIEIQAgA0IANwMAIAMgACAGQQFqIgEQKyIABEAgA0H0ADYCHCADIAE2AhQgAyAANgIMQQAhAgycAQtB4gAhAgyCAQtBACEAAkAgAygCOCICRQ0AIAIoAjQiAkUNACADIAIRAAAhAAsCQCAABEAgAEEVRg0BIANBADYCHCADIAE2AhQgA0HqDTYCECADQSY2AgxBACECDJwBC0HhACECDIIBCyADQfMANgIcIAMgATYCFCADQYAbNgIQIANBFTYCDEEAIQIMmgELIAMtACkiAEEja0ELSQ0JAkAgAEEGSw0AQQEgAHRBygBxRQ0ADAoLQQAhAiADQQA2AhwgAyABNgIUIANB7Qk2AhAgA0EINgIMDJkBC0HyACECIAEgBEYNmAEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABBs9UAai0AAEcNBSAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMmQELIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARArIgAEQCADQfEANgIcIAMgATYCFCADIAA2AgxBACECDJkBC0HfACECDH8LQQAhAAJAIAMoAjgiAkUNACACKAI0IgJFDQAgAyACEQAAIQALAkAgAARAIABBFUYNASADQQA2AhwgAyABNgIUIANB6g02AhAgA0EmNgIMQQAhAgyZAQtB3gAhAgx/CyADQfAANgIcIAMgATYCFCADQYAbNgIQIANBFTYCDEEAIQIMlwELIAMtAClBIUYNBiADQQA2AhwgAyABNgIUIANBkQo2AhAgA0EINgIMQQAhAgyWAQtB7wAhAiABIARGDZUBIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQbDVAGotAABHDQIgAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADJYBCyADKAIEIQAgA0IANwMAIAMgACAGQQFqIgEQKyIARQ0CIANB7QA2AhwgAyABNgIUIAMgADYCDEEAIQIMlQELIANBADYCAAsgAygCBCEAIANBADYCBCADIAAgARArIgBFDYABIANB7gA2AhwgAyABNgIUIAMgADYCDEEAIQIMkwELQdwAIQIMeQtBACEAAkAgAygCOCICRQ0AIAIoAjQiAkUNACADIAIRAAAhAAsCQCAABEAgAEEVRg0BIANBADYCHCADIAE2AhQgA0HqDTYCECADQSY2AgxBACECDJMBC0HbACECDHkLIANB7AA2AhwgAyABNgIUIANBgBs2AhAgA0EVNgIMQQAhAgyRAQsgAy0AKSIAQSNJDQAgAEEuRg0AIANBADYCHCADIAE2AhQgA0HJCTYCECADQQg2AgxBACECDJABC0HaACECDHYLIAEgBEYEQEHrACECDI8BCwJAIAEtAABBL0YEQCABQQFqIQEMAQsgA0EANgIcIAMgATYCFCADQbI4NgIQIANBCDYCDEEAIQIMjwELQdkAIQIMdQsgASAERwRAIANBDjYCCCADIAE2AgRB2AAhAgx1C0HqACECDI0BCyABIARGBEBB6QAhAgyNAQsgAS0AAEEwayIAQf8BcUEKSQRAIAMgADoAKiABQQFqIQFB1wAhAgx0CyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNeiADQegANgIcIAMgATYCFCADIAA2AgxBACECDIwBCyABIARGBEBB5wAhAgyMAQsCQCABLQAAQS5GBEAgAUEBaiEBDAELIAMoAgQhACADQQA2AgQgAyAAIAEQLyIARQ17IANB5gA2AhwgAyABNgIUIAMgADYCDEEAIQIMjAELQdYAIQIMcgsgASAERgRAQeUAIQIMiwELQQAhAEEBIQVBASEHQQAhAgJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAIAEtAABBMGsOCgoJAAECAwQFBggLC0ECDAYLQQMMBQtBBAwEC0EFDAMLQQYMAgtBBwwBC0EICyECQQAhBUEAIQcMAgtBCSECQQEhAEEAIQVBACEHDAELQQAhBUEBIQILIAMgAjoAKyABQQFqIQECQAJAIAMtAC5BEHENAAJAAkACQCADLQAqDgMBAAIECyAHRQ0DDAILIAANAQwCCyAFRQ0BCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNAiADQeIANgIcIAMgATYCFCADIAA2AgxBACECDI0BCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNfSADQeMANgIcIAMgATYCFCADIAA2AgxBACECDIwBCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNeyADQeQANgIcIAMgATYCFCADIAA2AgwMiwELQdQAIQIMcQsgAy0AKUEiRg2GAUHTACECDHALQQAhAAJAIAMoAjgiAkUNACACKAJEIgJFDQAgAyACEQAAIQALIABFBEBB1QAhAgxwCyAAQRVHBEAgA0EANgIcIAMgATYCFCADQaQNNgIQIANBITYCDEEAIQIMiQELIANB4QA2AhwgAyABNgIUIANB0Bo2AhAgA0EVNgIMQQAhAgyIAQsgASAERgRAQeAAIQIMiAELAkACQAJAAkACQCABLQAAQQprDgQBBAQABAsgAUEBaiEBDAELIAFBAWohASADQS9qLQAAQQFxRQ0BC0HSACECDHALIANBADYCHCADIAE2AhQgA0G2ETYCECADQQk2AgxBACECDIgBCyADQQA2AhwgAyABNgIUIANBthE2AhAgA0EJNgIMQQAhAgyHAQsgASAERgRAQd8AIQIMhwELIAEtAABBCkYEQCABQQFqIQEMCQsgAy0ALkHAAHENCCADQQA2AhwgAyABNgIUIANBthE2AhAgA0ECNgIMQQAhAgyGAQsgASAERgRAQd0AIQIMhgELIAEtAAAiAkENRgRAIAFBAWohAUHQACECDG0LIAEhACACQQlrDgQFAQEFAQsgBCABIgBGBEBB3AAhAgyFAQsgAC0AAEEKRw0AIABBAWoMAgtBACECIANBADYCHCADIAA2AhQgA0HKLTYCECADQQc2AgwMgwELIAEgBEYEQEHbACECDIMBCwJAIAEtAABBCWsOBAMAAAMACyABQQFqCyEBQc4AIQIMaAsgASAERgRAQdoAIQIMgQELIAEtAABBCWsOBAABAQABC0EAIQIgA0EANgIcIANBmhI2AhAgA0EHNgIMIAMgAUEBajYCFAx/CyADQYASOwEqQQAhAAJAIAMoAjgiAkUNACACKAI4IgJFDQAgAyACEQAAIQALIABFDQAgAEEVRw0BIANB2QA2AhwgAyABNgIUIANB6ho2AhAgA0EVNgIMQQAhAgx+C0HNACECDGQLIANBADYCHCADIAE2AhQgA0HJDTYCECADQRo2AgxBACECDHwLIAEgBEYEQEHZACECDHwLIAEtAABBIEcNPSABQQFqIQEgAy0ALkEBcQ09IANBADYCHCADIAE2AhQgA0HCHDYCECADQR42AgxBACECDHsLIAEgBEYEQEHYACECDHsLAkACQAJAAkACQCABLQAAIgBBCmsOBAIDAwABCyABQQFqIQFBLCECDGULIABBOkcNASADQQA2AhwgAyABNgIUIANB5xE2AhAgA0EKNgIMQQAhAgx9CyABQQFqIQEgA0Evai0AAEEBcUUNcyADLQAyQYABcUUEQCADQTJqIQIgAxA1QQAhAAJAIAMoAjgiBkUNACAGKAIoIgZFDQAgAyAGEQAAIQALAkACQCAADhZNTEsBAQEBAQEBAQEBAQEBAQEBAQEAAQsgA0EpNgIcIAMgATYCFCADQawZNgIQIANBFTYCDEEAIQIMfgsgA0EANgIcIAMgATYCFCADQeULNgIQIANBETYCDEEAIQIMfQtBACEAAkAgAygCOCICRQ0AIAIoAlwiAkUNACADIAIRAAAhAAsgAEUNWSAAQRVHDQEgA0EFNgIcIAMgATYCFCADQZsbNgIQIANBFTYCDEEAIQIMfAtBywAhAgxiC0EAIQIgA0EANgIcIAMgATYCFCADQZAONgIQIANBFDYCDAx6CyADIAMvATJBgAFyOwEyDDsLIAEgBEcEQCADQRE2AgggAyABNgIEQcoAIQIMYAtB1wAhAgx4CyABIARGBEBB1gAhAgx4CwJAAkACQAJAIAEtAAAiAEEgciAAIABBwQBrQf8BcUEaSRtB/wFxQeMAaw4TAEBAQEBAQEBAQEBAQAFAQEACA0ALIAFBAWohAUHGACECDGELIAFBAWohAUHHACECDGALIAFBAWohAUHIACECDF8LIAFBAWohAUHJACECDF4LQdUAIQIgBCABIgBGDXYgBCABayADKAIAIgFqIQYgACABa0EFaiEHA0AgAUGQyABqLQAAIAAtAAAiBUEgciAFIAVBwQBrQf8BcUEaSRtB/wFxRw0IQQQgAUEFRg0KGiABQQFqIQEgBCAAQQFqIgBHDQALIAMgBjYCAAx2C0HUACECIAQgASIARg11IAQgAWsgAygCACIBaiEGIAAgAWtBD2ohBwNAIAFBgMgAai0AACAALQAAIgVBIHIgBSAFQcEAa0H/AXFBGkkbQf8BcUcNB0EDIAFBD0YNCRogAUEBaiEBIAQgAEEBaiIARw0ACyADIAY2AgAMdQtB0wAhAiAEIAEiAEYNdCAEIAFrIAMoAgAiAWohBiAAIAFrQQ5qIQcDQCABQeLHAGotAAAgAC0AACIFQSByIAUgBUHBAGtB/wFxQRpJG0H/AXFHDQYgAUEORg0HIAFBAWohASAEIABBAWoiAEcNAAsgAyAGNgIADHQLQdIAIQIgBCABIgBGDXMgBCABayADKAIAIgFqIQUgACABa0EBaiEGA0AgAUHgxwBqLQAAIAAtAAAiB0EgciAHIAdBwQBrQf8BcUEaSRtB/wFxRw0FIAFBAUYNAiABQQFqIQEgBCAAQQFqIgBHDQALIAMgBTYCAAxzCyABIARGBEBB0QAhAgxzCwJAAkAgAS0AACIAQSByIAAgAEHBAGtB/wFxQRpJG0H/AXFB7gBrDgcAOTk5OTkBOQsgAUEBaiEBQcMAIQIMWgsgAUEBaiEBQcQAIQIMWQsgA0EANgIAIAZBAWohAUHFACECDFgLQdAAIQIgBCABIgBGDXAgBCABayADKAIAIgFqIQYgACABa0EJaiEHA0AgAUHWxwBqLQAAIAAtAAAiBUEgciAFIAVBwQBrQf8BcUEaSRtB/wFxRw0CQQIgAUEJRg0EGiABQQFqIQEgBCAAQQFqIgBHDQALIAMgBjYCAAxwC0HPACECIAQgASIARg1vIAQgAWsgAygCACIBaiEGIAAgAWtBBWohBwNAIAFB0McAai0AACAALQAAIgVBIHIgBSAFQcEAa0H/AXFBGkkbQf8BcUcNASABQQVGDQIgAUEBaiEBIAQgAEEBaiIARw0ACyADIAY2AgAMbwsgACEBIANBADYCAAwzC0EBCzoALCADQQA2AgAgB0EBaiEBC0EtIQIMUgsCQANAIAEtAABB0MUAai0AAEEBRw0BIAQgAUEBaiIBRw0AC0HNACECDGsLQcIAIQIMUQsgASAERgRAQcwAIQIMagsgAS0AAEE6RgRAIAMoAgQhACADQQA2AgQgAyAAIAEQMCIARQ0zIANBywA2AhwgAyAANgIMIAMgAUEBajYCFEEAIQIMagsgA0EANgIcIAMgATYCFCADQecRNgIQIANBCjYCDEEAIQIMaQsCQAJAIAMtACxBAmsOAgABJwsgA0Ezai0AAEECcUUNJiADLQAuQQJxDSYgA0EANgIcIAMgATYCFCADQaYUNgIQIANBCzYCDEEAIQIMaQsgAy0AMkEgcUUNJSADLQAuQQJxDSUgA0EANgIcIAMgATYCFCADQb0TNgIQIANBDzYCDEEAIQIMaAtBACEAAkAgAygCOCICRQ0AIAIoAkgiAkUNACADIAIRAAAhAAsgAEUEQEHBACECDE8LIABBFUcEQCADQQA2AhwgAyABNgIUIANBpg82AhAgA0EcNgIMQQAhAgxoCyADQcoANgIcIAMgATYCFCADQYUcNgIQIANBFTYCDEEAIQIMZwsgASAERwRAA0AgAS0AAEHAwQBqLQAAQQFHDRcgBCABQQFqIgFHDQALQcQAIQIMZwtBxAAhAgxmCyABIARHBEADQAJAIAEtAAAiAEEgciAAIABBwQBrQf8BcUEaSRtB/wFxIgBBCUYNACAAQSBGDQACQAJAAkACQCAAQeMAaw4TAAMDAwMDAwMBAwMDAwMDAwMDAgMLIAFBAWohAUE2IQIMUgsgAUEBaiEBQTchAgxRCyABQQFqIQFBOCECDFALDBULIAQgAUEBaiIBRw0AC0E8IQIMZgtBPCECDGULIAEgBEYEQEHIACECDGULIANBEjYCCCADIAE2AgQCQAJAAkACQAJAIAMtACxBAWsOBBQAAQIJCyADLQAyQSBxDQNB4AEhAgxPCwJAIAMvATIiAEEIcUUNACADLQAoQQFHDQAgAy0ALkEIcUUNAgsgAyAAQff7A3FBgARyOwEyDAsLIAMgAy8BMkEQcjsBMgwECyADQQA2AgQgAyABIAEQMSIABEAgA0HBADYCHCADIAA2AgwgAyABQQFqNgIUQQAhAgxmCyABQQFqIQEMWAsgA0EANgIcIAMgATYCFCADQfQTNgIQIANBBDYCDEEAIQIMZAtBxwAhAiABIARGDWMgAygCACIAIAQgAWtqIQUgASAAa0EGaiEGAkADQCAAQcDFAGotAAAgAS0AAEEgckcNASAAQQZGDUogAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMZAsgA0EANgIADAULAkAgASAERwRAA0AgAS0AAEHAwwBqLQAAIgBBAUcEQCAAQQJHDQMgAUEBaiEBDAULIAQgAUEBaiIBRw0AC0HFACECDGQLQcUAIQIMYwsLIANBADoALAwBC0ELIQIMRwtBPyECDEYLAkACQANAIAEtAAAiAEEgRwRAAkAgAEEKaw4EAwUFAwALIABBLEYNAwwECyAEIAFBAWoiAUcNAAtBxgAhAgxgCyADQQg6ACwMDgsgAy0AKEEBRw0CIAMtAC5BCHENAiADKAIEIQAgA0EANgIEIAMgACABEDEiAARAIANBwgA2AhwgAyAANgIMIAMgAUEBajYCFEEAIQIMXwsgAUEBaiEBDFALQTshAgxECwJAA0AgAS0AACIAQSBHIABBCUdxDQEgBCABQQFqIgFHDQALQcMAIQIMXQsLQTwhAgxCCwJAAkAgASAERwRAA0AgAS0AACIAQSBHBEAgAEEKaw4EAwQEAwQLIAQgAUEBaiIBRw0AC0E/IQIMXQtBPyECDFwLIAMgAy8BMkEgcjsBMgwKCyADKAIEIQAgA0EANgIEIAMgACABEDEiAEUNTiADQT42AhwgAyABNgIUIAMgADYCDEEAIQIMWgsCQCABIARHBEADQCABLQAAQcDDAGotAAAiAEEBRwRAIABBAkYNAwwMCyAEIAFBAWoiAUcNAAtBNyECDFsLQTchAgxaCyABQQFqIQEMBAtBOyECIAQgASIARg1YIAQgAWsgAygCACIBaiEGIAAgAWtBBWohBwJAA0AgAUGQyABqLQAAIAAtAAAiBUEgciAFIAVBwQBrQf8BcUEaSRtB/wFxRw0BIAFBBUYEQEEHIQEMPwsgAUEBaiEBIAQgAEEBaiIARw0ACyADIAY2AgAMWQsgA0EANgIAIAAhAQwFC0E6IQIgBCABIgBGDVcgBCABayADKAIAIgFqIQYgACABa0EIaiEHAkADQCABQbTBAGotAAAgAC0AACIFQSByIAUgBUHBAGtB/wFxQRpJG0H/AXFHDQEgAUEIRgRAQQUhAQw+CyABQQFqIQEgBCAAQQFqIgBHDQALIAMgBjYCAAxYCyADQQA2AgAgACEBDAQLQTkhAiAEIAEiAEYNViAEIAFrIAMoAgAiAWohBiAAIAFrQQNqIQcCQANAIAFBsMEAai0AACAALQAAIgVBIHIgBSAFQcEAa0H/AXFBGkkbQf8BcUcNASABQQNGBEBBBiEBDD0LIAFBAWohASAEIABBAWoiAEcNAAsgAyAGNgIADFcLIANBADYCACAAIQEMAwsCQANAIAEtAAAiAEEgRwRAIABBCmsOBAcEBAcCCyAEIAFBAWoiAUcNAAtBOCECDFYLIABBLEcNASABQQFqIQBBASEBAkACQAJAAkACQCADLQAsQQVrDgQDAQIEAAsgACEBDAQLQQIhAQwBC0EEIQELIANBAToALCADIAMvATIgAXI7ATIgACEBDAELIAMgAy8BMkEIcjsBMiAAIQELQT4hAgw7CyADQQA6ACwLQTkhAgw5CyABIARGBEBBNiECDFILAkACQAJAAkACQCABLQAAQQprDgQAAgIBAgsgAygCBCEAIANBADYCBCADIAAgARAxIgBFDQIgA0EzNgIcIAMgATYCFCADIAA2AgxBACECDFULIAMoAgQhACADQQA2AgQgAyAAIAEQMSIARQRAIAFBAWohAQwGCyADQTI2AhwgAyAANgIMIAMgAUEBajYCFEEAIQIMVAsgAy0ALkEBcQRAQd8BIQIMOwsgAygCBCEAIANBADYCBCADIAAgARAxIgANAQxJC0E0IQIMOQsgA0E1NgIcIAMgATYCFCADIAA2AgxBACECDFELQTUhAgw3CyADQS9qLQAAQQFxDQAgA0EANgIcIAMgATYCFCADQesWNgIQIANBGTYCDEEAIQIMTwtBMyECDDULIAEgBEYEQEEyIQIMTgsCQCABLQAAQQpGBEAgAUEBaiEBDAELIANBADYCHCADIAE2AhQgA0GSFzYCECADQQM2AgxBACECDE4LQTIhAgw0CyABIARGBEBBMSECDE0LAkAgAS0AACIAQQlGDQAgAEEgRg0AQQEhAgJAIAMtACxBBWsOBAYEBQANCyADIAMvATJBCHI7ATIMDAsgAy0ALkEBcUUNASADLQAsQQhHDQAgA0EAOgAsC0E9IQIMMgsgA0EANgIcIAMgATYCFCADQcIWNgIQIANBCjYCDEEAIQIMSgtBAiECDAELQQQhAgsgA0EBOgAsIAMgAy8BMiACcjsBMgwGCyABIARGBEBBMCECDEcLIAEtAABBCkYEQCABQQFqIQEMAQsgAy0ALkEBcQ0AIANBADYCHCADIAE2AhQgA0HcKDYCECADQQI2AgxBACECDEYLQTAhAgwsCyABQQFqIQFBMSECDCsLIAEgBEYEQEEvIQIMRAsgAS0AACIAQQlHIABBIEdxRQRAIAFBAWohASADLQAuQQFxDQEgA0EANgIcIAMgATYCFCADQZcQNgIQIANBCjYCDEEAIQIMRAtBASECAkACQAJAAkACQAJAIAMtACxBAmsOBwUEBAMBAgAECyADIAMvATJBCHI7ATIMAwtBAiECDAELQQQhAgsgA0EBOgAsIAMgAy8BMiACcjsBMgtBLyECDCsLIANBADYCHCADIAE2AhQgA0GEEzYCECADQQs2AgxBACECDEMLQeEBIQIMKQsgASAERgRAQS4hAgxCCyADQQA2AgQgA0ESNgIIIAMgASABEDEiAA0BC0EuIQIMJwsgA0EtNgIcIAMgATYCFCADIAA2AgxBACECDD8LQQAhAAJAIAMoAjgiAkUNACACKAJMIgJFDQAgAyACEQAAIQALIABFDQAgAEEVRw0BIANB2AA2AhwgAyABNgIUIANBsxs2AhAgA0EVNgIMQQAhAgw+C0HMACECDCQLIANBADYCHCADIAE2AhQgA0GzDjYCECADQR02AgxBACECDDwLIAEgBEYEQEHOACECDDwLIAEtAAAiAEEgRg0CIABBOkYNAQsgA0EAOgAsQQkhAgwhCyADKAIEIQAgA0EANgIEIAMgACABEDAiAA0BDAILIAMtAC5BAXEEQEHeASECDCALIAMoAgQhACADQQA2AgQgAyAAIAEQMCIARQ0CIANBKjYCHCADIAA2AgwgAyABQQFqNgIUQQAhAgw4CyADQcsANgIcIAMgADYCDCADIAFBAWo2AhRBACECDDcLIAFBAWohAUHAACECDB0LIAFBAWohAQwsCyABIARGBEBBKyECDDULAkAgAS0AAEEKRgRAIAFBAWohAQwBCyADLQAuQcAAcUUNBgsgAy0AMkGAAXEEQEEAIQACQCADKAI4IgJFDQAgAigCXCICRQ0AIAMgAhEAACEACyAARQ0SIABBFUYEQCADQQU2AhwgAyABNgIUIANBmxs2AhAgA0EVNgIMQQAhAgw2CyADQQA2AhwgAyABNgIUIANBkA42AhAgA0EUNgIMQQAhAgw1CyADQTJqIQIgAxA1QQAhAAJAIAMoAjgiBkUNACAGKAIoIgZFDQAgAyAGEQAAIQALIAAOFgIBAAQEBAQEBAQEBAQEBAQEBAQEBAMECyADQQE6ADALIAIgAi8BAEHAAHI7AQALQSshAgwYCyADQSk2AhwgAyABNgIUIANBrBk2AhAgA0EVNgIMQQAhAgwwCyADQQA2AhwgAyABNgIUIANB5Qs2AhAgA0ERNgIMQQAhAgwvCyADQQA2AhwgAyABNgIUIANBpQs2AhAgA0ECNgIMQQAhAgwuC0EBIQcgAy8BMiIFQQhxRQRAIAMpAyBCAFIhBwsCQCADLQAwBEBBASEAIAMtAClBBUYNASAFQcAAcUUgB3FFDQELAkAgAy0AKCICQQJGBEBBASEAIAMvATQiBkHlAEYNAkEAIQAgBUHAAHENAiAGQeQARg0CIAZB5gBrQQJJDQIgBkHMAUYNAiAGQbACRg0CDAELQQAhACAFQcAAcQ0BC0ECIQAgBUEIcQ0AIAVBgARxBEACQCACQQFHDQAgAy0ALkEKcQ0AQQUhAAwCC0EEIQAMAQsgBUEgcUUEQCADEDZBAEdBAnQhAAwBC0EAQQMgAykDIFAbIQALIABBAWsOBQIABwEDBAtBESECDBMLIANBAToAMQwpC0EAIQICQCADKAI4IgBFDQAgACgCMCIARQ0AIAMgABEAACECCyACRQ0mIAJBFUYEQCADQQM2AhwgAyABNgIUIANB0hs2AhAgA0EVNgIMQQAhAgwrC0EAIQIgA0EANgIcIAMgATYCFCADQd0ONgIQIANBEjYCDAwqCyADQQA2AhwgAyABNgIUIANB+SA2AhAgA0EPNgIMQQAhAgwpC0EAIQACQCADKAI4IgJFDQAgAigCMCICRQ0AIAMgAhEAACEACyAADQELQQ4hAgwOCyAAQRVGBEAgA0ECNgIcIAMgATYCFCADQdIbNgIQIANBFTYCDEEAIQIMJwsgA0EANgIcIAMgATYCFCADQd0ONgIQIANBEjYCDEEAIQIMJgtBKiECDAwLIAEgBEcEQCADQQk2AgggAyABNgIEQSkhAgwMC0EmIQIMJAsgAyADKQMgIgwgBCABa60iCn0iC0IAIAsgDFgbNwMgIAogDFQEQEElIQIMJAsgAygCBCEAIANBADYCBCADIAAgASAMp2oiARAyIgBFDQAgA0EFNgIcIAMgATYCFCADIAA2AgxBACECDCMLQQ8hAgwJC0IAIQoCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAS0AAEEwaw43FxYAAQIDBAUGBxQUFBQUFBQICQoLDA0UFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFA4PEBESExQLQgIhCgwWC0IDIQoMFQtCBCEKDBQLQgUhCgwTC0IGIQoMEgtCByEKDBELQgghCgwQC0IJIQoMDwtCCiEKDA4LQgshCgwNC0IMIQoMDAtCDSEKDAsLQg4hCgwKC0IPIQoMCQtCCiEKDAgLQgshCgwHC0IMIQoMBgtCDSEKDAULQg4hCgwEC0IPIQoMAwsgA0EANgIcIAMgATYCFCADQZ8VNgIQIANBDDYCDEEAIQIMIQsgASAERgRAQSIhAgwhC0IAIQoCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEtAABBMGsONxUUAAECAwQFBgcWFhYWFhYWCAkKCwwNFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYODxAREhMWC0ICIQoMFAtCAyEKDBMLQgQhCgwSC0IFIQoMEQtCBiEKDBALQgchCgwPC0IIIQoMDgtCCSEKDA0LQgohCgwMC0ILIQoMCwtCDCEKDAoLQg0hCgwJC0IOIQoMCAtCDyEKDAcLQgohCgwGC0ILIQoMBQtCDCEKDAQLQg0hCgwDC0IOIQoMAgtCDyEKDAELQgEhCgsgAUEBaiEBIAMpAyAiC0L//////////w9YBEAgAyALQgSGIAqENwMgDAILIANBADYCHCADIAE2AhQgA0G1CTYCECADQQw2AgxBACECDB4LQSchAgwEC0EoIQIMAwsgAyABOgAsIANBADYCACAHQQFqIQFBDCECDAILIANBADYCACAGQQFqIQFBCiECDAELIAFBAWohAUEIIQIMAAsAC0EAIQIgA0EANgIcIAMgATYCFCADQbI4NgIQIANBCDYCDAwXC0EAIQIgA0EANgIcIAMgATYCFCADQYMRNgIQIANBCTYCDAwWC0EAIQIgA0EANgIcIAMgATYCFCADQd8KNgIQIANBCTYCDAwVC0EAIQIgA0EANgIcIAMgATYCFCADQe0QNgIQIANBCTYCDAwUC0EAIQIgA0EANgIcIAMgATYCFCADQdIRNgIQIANBCTYCDAwTC0EAIQIgA0EANgIcIAMgATYCFCADQbI4NgIQIANBCDYCDAwSC0EAIQIgA0EANgIcIAMgATYCFCADQYMRNgIQIANBCTYCDAwRC0EAIQIgA0EANgIcIAMgATYCFCADQd8KNgIQIANBCTYCDAwQC0EAIQIgA0EANgIcIAMgATYCFCADQe0QNgIQIANBCTYCDAwPC0EAIQIgA0EANgIcIAMgATYCFCADQdIRNgIQIANBCTYCDAwOC0EAIQIgA0EANgIcIAMgATYCFCADQbkXNgIQIANBDzYCDAwNC0EAIQIgA0EANgIcIAMgATYCFCADQbkXNgIQIANBDzYCDAwMC0EAIQIgA0EANgIcIAMgATYCFCADQZkTNgIQIANBCzYCDAwLC0EAIQIgA0EANgIcIAMgATYCFCADQZ0JNgIQIANBCzYCDAwKC0EAIQIgA0EANgIcIAMgATYCFCADQZcQNgIQIANBCjYCDAwJC0EAIQIgA0EANgIcIAMgATYCFCADQbEQNgIQIANBCjYCDAwIC0EAIQIgA0EANgIcIAMgATYCFCADQbsdNgIQIANBAjYCDAwHC0EAIQIgA0EANgIcIAMgATYCFCADQZYWNgIQIANBAjYCDAwGC0EAIQIgA0EANgIcIAMgATYCFCADQfkYNgIQIANBAjYCDAwFC0EAIQIgA0EANgIcIAMgATYCFCADQcQYNgIQIANBAjYCDAwECyADQQI2AhwgAyABNgIUIANBqR42AhAgA0EWNgIMQQAhAgwDC0HeACECIAEgBEYNAiAJQQhqIQcgAygCACEFAkACQCABIARHBEAgBUGWyABqIQggBCAFaiABayEGIAVBf3NBCmoiBSABaiEAA0AgAS0AACAILQAARwRAQQIhCAwDCyAFRQRAQQAhCCAAIQEMAwsgBUEBayEFIAhBAWohCCAEIAFBAWoiAUcNAAsgBiEFIAQhAQsgB0EBNgIAIAMgBTYCAAwBCyADQQA2AgAgByAINgIACyAHIAE2AgQgCSgCDCEAAkACQCAJKAIIQQFrDgIEAQALIANBADYCHCADQcIeNgIQIANBFzYCDCADIABBAWo2AhRBACECDAMLIANBADYCHCADIAA2AhQgA0HXHjYCECADQQk2AgxBACECDAILIAEgBEYEQEEoIQIMAgsgA0EJNgIIIAMgATYCBEEnIQIMAQsgASAERgRAQQEhAgwBCwNAAkACQAJAIAEtAABBCmsOBAABAQABCyABQQFqIQEMAQsgAUEBaiEBIAMtAC5BIHENAEEAIQIgA0EANgIcIAMgATYCFCADQaEhNgIQIANBBTYCDAwCC0EBIQIgASAERw0ACwsgCUEQaiQAIAJFBEAgAygCDCEADAELIAMgAjYCHEEAIQAgAygCBCIBRQ0AIAMgASAEIAMoAggRAQAiAUUNACADIAQ2AhQgAyABNgIMIAEhAAsgAAu+AgECfyAAQQA6AAAgAEHkAGoiAUEBa0EAOgAAIABBADoAAiAAQQA6AAEgAUEDa0EAOgAAIAFBAmtBADoAACAAQQA6AAMgAUEEa0EAOgAAQQAgAGtBA3EiASAAaiIAQQA2AgBB5AAgAWtBfHEiAiAAaiIBQQRrQQA2AgACQCACQQlJDQAgAEEANgIIIABBADYCBCABQQhrQQA2AgAgAUEMa0EANgIAIAJBGUkNACAAQQA2AhggAEEANgIUIABBADYCECAAQQA2AgwgAUEQa0EANgIAIAFBFGtBADYCACABQRhrQQA2AgAgAUEca0EANgIAIAIgAEEEcUEYciICayIBQSBJDQAgACACaiEAA0AgAEIANwMYIABCADcDECAAQgA3AwggAEIANwMAIABBIGohACABQSBrIgFBH0sNAAsLC1YBAX8CQCAAKAIMDQACQAJAAkACQCAALQAxDgMBAAMCCyAAKAI4IgFFDQAgASgCMCIBRQ0AIAAgAREAACIBDQMLQQAPCwALIABByhk2AhBBDiEBCyABCxoAIAAoAgxFBEAgAEHeHzYCECAAQRU2AgwLCxQAIAAoAgxBFUYEQCAAQQA2AgwLCxQAIAAoAgxBFkYEQCAAQQA2AgwLCwcAIAAoAgwLBwAgACgCEAsJACAAIAE2AhALBwAgACgCFAsrAAJAIABBJ08NAEL//////wkgAK2IQgGDUA0AIABBAnRB0DhqKAIADwsACxcAIABBL08EQAALIABBAnRB7DlqKAIAC78JAQF/QfQtIQECQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAQeQAaw70A2NiAAFhYWFhYWECAwQFYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYQYHCAkKCwwNDg9hYWFhYRBhYWFhYWFhYWFhYRFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWESExQVFhcYGRobYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1NmE3ODk6YWFhYWFhYWE7YWFhPGFhYWE9Pj9hYWFhYWFhYUBhYUFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFCQ0RFRkdISUpLTE1OT1BRUlNhYWFhYWFhYVRVVldYWVpbYVxdYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXmFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV9gYQtB6iwPC0GYJg8LQe0xDwtBoDcPC0HJKQ8LQbQpDwtBli0PC0HrKw8LQaI1DwtB2zQPC0HgKQ8LQeMkDwtB1SQPC0HuJA8LQeYlDwtByjQPC0HQNw8LQao1DwtB9SwPC0H2Jg8LQYIiDwtB8jMPC0G+KA8LQec3DwtBzSEPC0HAIQ8LQbglDwtByyUPC0GWJA8LQY80DwtBzTUPC0HdKg8LQe4zDwtBnDQPC0GeMQ8LQfQ1DwtB5SIPC0GvJQ8LQZkxDwtBsjYPC0H5Ng8LQcQyDwtB3SwPC0GCMQ8LQcExDwtBjTcPC0HJJA8LQew2DwtB5yoPC0HIIw8LQeIhDwtByTcPC0GlIg8LQZQiDwtB2zYPC0HeNQ8LQYYmDwtBvCsPC0GLMg8LQaAjDwtB9jAPC0GALA8LQYkrDwtBpCYPC0HyIw8LQYEoDwtBqzIPC0HrJw8LQcI2DwtBoiQPC0HPKg8LQdwjDwtBhycPC0HkNA8LQbciDwtBrTEPC0HVIg8LQa80DwtB3iYPC0HWMg8LQfQ0DwtBgTgPC0H0Nw8LQZI2DwtBnScPC0GCKQ8LQY0jDwtB1zEPC0G9NQ8LQbQ3DwtB2DAPC0G2Jw8LQZo4DwtBpyoPC0HEJw8LQa4jDwtB9SIPCwALQcomIQELIAELFwAgACAALwEuQf7/A3EgAUEAR3I7AS4LGgAgACAALwEuQf3/A3EgAUEAR0EBdHI7AS4LGgAgACAALwEuQfv/A3EgAUEAR0ECdHI7AS4LGgAgACAALwEuQff/A3EgAUEAR0EDdHI7AS4LGgAgACAALwEuQe//A3EgAUEAR0EEdHI7AS4LGgAgACAALwEuQd//A3EgAUEAR0EFdHI7AS4LGgAgACAALwEuQb//A3EgAUEAR0EGdHI7AS4LGgAgACAALwEuQf/+A3EgAUEAR0EHdHI7AS4LGgAgACAALwEuQf/9A3EgAUEAR0EIdHI7AS4LGgAgACAALwEuQf/7A3EgAUEAR0EJdHI7AS4LPgECfwJAIAAoAjgiA0UNACADKAIEIgNFDQAgACABIAIgAWsgAxEBACIEQX9HDQAgAEHhEjYCEEEYIQQLIAQLPgECfwJAIAAoAjgiA0UNACADKAIIIgNFDQAgACABIAIgAWsgAxEBACIEQX9HDQAgAEH8ETYCEEEYIQQLIAQLPgECfwJAIAAoAjgiA0UNACADKAIMIgNFDQAgACABIAIgAWsgAxEBACIEQX9HDQAgAEHsCjYCEEEYIQQLIAQLPgECfwJAIAAoAjgiA0UNACADKAIQIgNFDQAgACABIAIgAWsgAxEBACIEQX9HDQAgAEH6HjYCEEEYIQQLIAQLPgECfwJAIAAoAjgiA0UNACADKAIUIgNFDQAgACABIAIgAWsgAxEBACIEQX9HDQAgAEHLEDYCEEEYIQQLIAQLPgECfwJAIAAoAjgiA0UNACADKAIYIgNFDQAgACABIAIgAWsgAxEBACIEQX9HDQAgAEG3HzYCEEEYIQQLIAQLPgECfwJAIAAoAjgiA0UNACADKAIcIgNFDQAgACABIAIgAWsgAxEBACIEQX9HDQAgAEG/FTYCEEEYIQQLIAQLPgECfwJAIAAoAjgiA0UNACADKAIsIgNFDQAgACABIAIgAWsgAxEBACIEQX9HDQAgAEH+CDYCEEEYIQQLIAQLPgECfwJAIAAoAjgiA0UNACADKAIgIgNFDQAgACABIAIgAWsgAxEBACIEQX9HDQAgAEGMHTYCEEEYIQQLIAQLPgECfwJAIAAoAjgiA0UNACADKAIkIgNFDQAgACABIAIgAWsgAxEBACIEQX9HDQAgAEHmFTYCEEEYIQQLIAQLOAAgAAJ/IAAvATJBFHFBFEYEQEEBIAAtAChBAUYNARogAC8BNEHlAEYMAQsgAC0AKUEFRgs6ADALWQECfwJAIAAtAChBAUYNACAALwE0IgFB5ABrQeQASQ0AIAFBzAFGDQAgAUGwAkYNACAALwEyIgBBwABxDQBBASECIABBiARxQYAERg0AIABBKHFFIQILIAILjAEBAn8CQAJAAkAgAC0AKkUNACAALQArRQ0AIAAvATIiAUECcUUNAQwCCyAALwEyIgFBAXFFDQELQQEhAiAALQAoQQFGDQAgAC8BNCIAQeQAa0HkAEkNACAAQcwBRg0AIABBsAJGDQAgAUHAAHENAEEAIQIgAUGIBHFBgARGDQAgAUEocUEARyECCyACC1cAIABBGGpCADcDACAAQgA3AwAgAEE4akIANwMAIABBMGpCADcDACAAQShqQgA3AwAgAEEgakIANwMAIABBEGpCADcDACAAQQhqQgA3AwAgAEH9ATYCHAsGACAAEDoLmi0BC38jAEEQayIKJABB3NUAKAIAIglFBEBBnNkAKAIAIgVFBEBBqNkAQn83AgBBoNkAQoCAhICAgMAANwIAQZzZACAKQQhqQXBxQdiq1aoFcyIFNgIAQbDZAEEANgIAQYDZAEEANgIAC0GE2QBBwNkENgIAQdTVAEHA2QQ2AgBB6NUAIAU2AgBB5NUAQX82AgBBiNkAQcCmAzYCAANAIAFBgNYAaiABQfTVAGoiAjYCACACIAFB7NUAaiIDNgIAIAFB+NUAaiADNgIAIAFBiNYAaiABQfzVAGoiAzYCACADIAI2AgAgAUGQ1gBqIAFBhNYAaiICNgIAIAIgAzYCACABQYzWAGogAjYCACABQSBqIgFBgAJHDQALQczZBEGBpgM2AgBB4NUAQazZACgCADYCAEHQ1QBBgKYDNgIAQdzVAEHI2QQ2AgBBzP8HQTg2AgBByNkEIQkLAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAEHsAU0EQEHE1QAoAgAiBkEQIABBE2pBcHEgAEELSRsiBEEDdiIAdiIBQQNxBEACQCABQQFxIAByQQFzIgJBA3QiAEHs1QBqIgEgAEH01QBqKAIAIgAoAggiA0YEQEHE1QAgBkF+IAJ3cTYCAAwBCyABIAM2AgggAyABNgIMCyAAQQhqIQEgACACQQN0IgJBA3I2AgQgACACaiIAIAAoAgRBAXI2AgQMEQtBzNUAKAIAIgggBE8NASABBEACQEECIAB0IgJBACACa3IgASAAdHFoIgBBA3QiAkHs1QBqIgEgAkH01QBqKAIAIgIoAggiA0YEQEHE1QAgBkF+IAB3cSIGNgIADAELIAEgAzYCCCADIAE2AgwLIAIgBEEDcjYCBCAAQQN0IgAgBGshBSAAIAJqIAU2AgAgAiAEaiIEIAVBAXI2AgQgCARAIAhBeHFB7NUAaiEAQdjVACgCACEDAn9BASAIQQN2dCIBIAZxRQRAQcTVACABIAZyNgIAIAAMAQsgACgCCAsiASADNgIMIAAgAzYCCCADIAA2AgwgAyABNgIICyACQQhqIQFB2NUAIAQ2AgBBzNUAIAU2AgAMEQtByNUAKAIAIgtFDQEgC2hBAnRB9NcAaigCACIAKAIEQXhxIARrIQUgACECA0ACQCACKAIQIgFFBEAgAkEUaigCACIBRQ0BCyABKAIEQXhxIARrIgMgBUkhAiADIAUgAhshBSABIAAgAhshACABIQIMAQsLIAAoAhghCSAAKAIMIgMgAEcEQEHU1QAoAgAaIAMgACgCCCIBNgIIIAEgAzYCDAwQCyAAQRRqIgIoAgAiAUUEQCAAKAIQIgFFDQMgAEEQaiECCwNAIAIhByABIgNBFGoiAigCACIBDQAgA0EQaiECIAMoAhAiAQ0ACyAHQQA2AgAMDwtBfyEEIABBv39LDQAgAEETaiIBQXBxIQRByNUAKAIAIghFDQBBACAEayEFAkACQAJAAn9BACAEQYACSQ0AGkEfIARB////B0sNABogBEEmIAFBCHZnIgBrdkEBcSAAQQF0a0E+agsiBkECdEH01wBqKAIAIgJFBEBBACEBQQAhAwwBC0EAIQEgBEEZIAZBAXZrQQAgBkEfRxt0IQBBACEDA0ACQCACKAIEQXhxIARrIgcgBU8NACACIQMgByIFDQBBACEFIAIhAQwDCyABIAJBFGooAgAiByAHIAIgAEEddkEEcWpBEGooAgAiAkYbIAEgBxshASAAQQF0IQAgAg0ACwsgASADckUEQEEAIQNBAiAGdCIAQQAgAGtyIAhxIgBFDQMgAGhBAnRB9NcAaigCACEBCyABRQ0BCwNAIAEoAgRBeHEgBGsiAiAFSSEAIAIgBSAAGyEFIAEgAyAAGyEDIAEoAhAiAAR/IAAFIAFBFGooAgALIgENAAsLIANFDQAgBUHM1QAoAgAgBGtPDQAgAygCGCEHIAMgAygCDCIARwRAQdTVACgCABogACADKAIIIgE2AgggASAANgIMDA4LIANBFGoiAigCACIBRQRAIAMoAhAiAUUNAyADQRBqIQILA0AgAiEGIAEiAEEUaiICKAIAIgENACAAQRBqIQIgACgCECIBDQALIAZBADYCAAwNC0HM1QAoAgAiAyAETwRAQdjVACgCACEBAkAgAyAEayICQRBPBEAgASAEaiIAIAJBAXI2AgQgASADaiACNgIAIAEgBEEDcjYCBAwBCyABIANBA3I2AgQgASADaiIAIAAoAgRBAXI2AgRBACEAQQAhAgtBzNUAIAI2AgBB2NUAIAA2AgAgAUEIaiEBDA8LQdDVACgCACIDIARLBEAgBCAJaiIAIAMgBGsiAUEBcjYCBEHc1QAgADYCAEHQ1QAgATYCACAJIARBA3I2AgQgCUEIaiEBDA8LQQAhASAEAn9BnNkAKAIABEBBpNkAKAIADAELQajZAEJ/NwIAQaDZAEKAgISAgIDAADcCAEGc2QAgCkEMakFwcUHYqtWqBXM2AgBBsNkAQQA2AgBBgNkAQQA2AgBBgIAECyIAIARBxwBqIgVqIgZBACAAayIHcSICTwRAQbTZAEEwNgIADA8LAkBB/NgAKAIAIgFFDQBB9NgAKAIAIgggAmohACAAIAFNIAAgCEtxDQBBACEBQbTZAEEwNgIADA8LQYDZAC0AAEEEcQ0EAkACQCAJBEBBhNkAIQEDQCABKAIAIgAgCU0EQCAAIAEoAgRqIAlLDQMLIAEoAggiAQ0ACwtBABA7IgBBf0YNBSACIQZBoNkAKAIAIgFBAWsiAyAAcQRAIAIgAGsgACADakEAIAFrcWohBgsgBCAGTw0FIAZB/v///wdLDQVB/NgAKAIAIgMEQEH02AAoAgAiByAGaiEBIAEgB00NBiABIANLDQYLIAYQOyIBIABHDQEMBwsgBiADayAHcSIGQf7///8HSw0EIAYQOyEAIAAgASgCACABKAIEakYNAyAAIQELAkAgBiAEQcgAak8NACABQX9GDQBBpNkAKAIAIgAgBSAGa2pBACAAa3EiAEH+////B0sEQCABIQAMBwsgABA7QX9HBEAgACAGaiEGIAEhAAwHC0EAIAZrEDsaDAQLIAEiAEF/Rw0FDAMLQQAhAwwMC0EAIQAMCgsgAEF/Rw0CC0GA2QBBgNkAKAIAQQRyNgIACyACQf7///8HSw0BIAIQOyEAQQAQOyEBIABBf0YNASABQX9GDQEgACABTw0BIAEgAGsiBiAEQThqTQ0BC0H02ABB9NgAKAIAIAZqIgE2AgBB+NgAKAIAIAFJBEBB+NgAIAE2AgALAkACQAJAQdzVACgCACICBEBBhNkAIQEDQCAAIAEoAgAiAyABKAIEIgVqRg0CIAEoAggiAQ0ACwwCC0HU1QAoAgAiAUEARyAAIAFPcUUEQEHU1QAgADYCAAtBACEBQYjZACAGNgIAQYTZACAANgIAQeTVAEF/NgIAQejVAEGc2QAoAgA2AgBBkNkAQQA2AgADQCABQYDWAGogAUH01QBqIgI2AgAgAiABQezVAGoiAzYCACABQfjVAGogAzYCACABQYjWAGogAUH81QBqIgM2AgAgAyACNgIAIAFBkNYAaiABQYTWAGoiAjYCACACIAM2AgAgAUGM1gBqIAI2AgAgAUEgaiIBQYACRw0AC0F4IABrQQ9xIgEgAGoiAiAGQThrIgMgAWsiAUEBcjYCBEHg1QBBrNkAKAIANgIAQdDVACABNgIAQdzVACACNgIAIAAgA2pBODYCBAwCCyAAIAJNDQAgAiADSQ0AIAEoAgxBCHENAEF4IAJrQQ9xIgAgAmoiA0HQ1QAoAgAgBmoiByAAayIAQQFyNgIEIAEgBSAGajYCBEHg1QBBrNkAKAIANgIAQdDVACAANgIAQdzVACADNgIAIAIgB2pBODYCBAwBCyAAQdTVACgCAEkEQEHU1QAgADYCAAsgACAGaiEDQYTZACEBAkACQAJAA0AgAyABKAIARwRAIAEoAggiAQ0BDAILCyABLQAMQQhxRQ0BC0GE2QAhAQNAIAEoAgAiAyACTQRAIAMgASgCBGoiBSACSw0DCyABKAIIIQEMAAsACyABIAA2AgAgASABKAIEIAZqNgIEIABBeCAAa0EPcWoiCSAEQQNyNgIEIANBeCADa0EPcWoiBiAEIAlqIgRrIQEgAiAGRgRAQdzVACAENgIAQdDVAEHQ1QAoAgAgAWoiADYCACAEIABBAXI2AgQMCAtB2NUAKAIAIAZGBEBB2NUAIAQ2AgBBzNUAQczVACgCACABaiIANgIAIAQgAEEBcjYCBCAAIARqIAA2AgAMCAsgBigCBCIFQQNxQQFHDQYgBUF4cSEIIAVB/wFNBEAgBUEDdiEDIAYoAggiACAGKAIMIgJGBEBBxNUAQcTVACgCAEF+IAN3cTYCAAwHCyACIAA2AgggACACNgIMDAYLIAYoAhghByAGIAYoAgwiAEcEQCAAIAYoAggiAjYCCCACIAA2AgwMBQsgBkEUaiICKAIAIgVFBEAgBigCECIFRQ0EIAZBEGohAgsDQCACIQMgBSIAQRRqIgIoAgAiBQ0AIABBEGohAiAAKAIQIgUNAAsgA0EANgIADAQLQXggAGtBD3EiASAAaiIHIAZBOGsiAyABayIBQQFyNgIEIAAgA2pBODYCBCACIAVBNyAFa0EPcWpBP2siAyADIAJBEGpJGyIDQSM2AgRB4NUAQazZACgCADYCAEHQ1QAgATYCAEHc1QAgBzYCACADQRBqQYzZACkCADcCACADQYTZACkCADcCCEGM2QAgA0EIajYCAEGI2QAgBjYCAEGE2QAgADYCAEGQ2QBBADYCACADQSRqIQEDQCABQQc2AgAgBSABQQRqIgFLDQALIAIgA0YNACADIAMoAgRBfnE2AgQgAyADIAJrIgU2AgAgAiAFQQFyNgIEIAVB/wFNBEAgBUF4cUHs1QBqIQACf0HE1QAoAgAiAUEBIAVBA3Z0IgNxRQRAQcTVACABIANyNgIAIAAMAQsgACgCCAsiASACNgIMIAAgAjYCCCACIAA2AgwgAiABNgIIDAELQR8hASAFQf///wdNBEAgBUEmIAVBCHZnIgBrdkEBcSAAQQF0a0E+aiEBCyACIAE2AhwgAkIANwIQIAFBAnRB9NcAaiEAQcjVACgCACIDQQEgAXQiBnFFBEAgACACNgIAQcjVACADIAZyNgIAIAIgADYCGCACIAI2AgggAiACNgIMDAELIAVBGSABQQF2a0EAIAFBH0cbdCEBIAAoAgAhAwJAA0AgAyIAKAIEQXhxIAVGDQEgAUEddiEDIAFBAXQhASAAIANBBHFqQRBqIgYoAgAiAw0ACyAGIAI2AgAgAiAANgIYIAIgAjYCDCACIAI2AggMAQsgACgCCCIBIAI2AgwgACACNgIIIAJBADYCGCACIAA2AgwgAiABNgIIC0HQ1QAoAgAiASAETQ0AQdzVACgCACIAIARqIgIgASAEayIBQQFyNgIEQdDVACABNgIAQdzVACACNgIAIAAgBEEDcjYCBCAAQQhqIQEMCAtBACEBQbTZAEEwNgIADAcLQQAhAAsgB0UNAAJAIAYoAhwiAkECdEH01wBqIgMoAgAgBkYEQCADIAA2AgAgAA0BQcjVAEHI1QAoAgBBfiACd3E2AgAMAgsgB0EQQRQgBygCECAGRhtqIAA2AgAgAEUNAQsgACAHNgIYIAYoAhAiAgRAIAAgAjYCECACIAA2AhgLIAZBFGooAgAiAkUNACAAQRRqIAI2AgAgAiAANgIYCyABIAhqIQEgBiAIaiIGKAIEIQULIAYgBUF+cTYCBCABIARqIAE2AgAgBCABQQFyNgIEIAFB/wFNBEAgAUF4cUHs1QBqIQACf0HE1QAoAgAiAkEBIAFBA3Z0IgFxRQRAQcTVACABIAJyNgIAIAAMAQsgACgCCAsiASAENgIMIAAgBDYCCCAEIAA2AgwgBCABNgIIDAELQR8hBSABQf///wdNBEAgAUEmIAFBCHZnIgBrdkEBcSAAQQF0a0E+aiEFCyAEIAU2AhwgBEIANwIQIAVBAnRB9NcAaiEAQcjVACgCACICQQEgBXQiA3FFBEAgACAENgIAQcjVACACIANyNgIAIAQgADYCGCAEIAQ2AgggBCAENgIMDAELIAFBGSAFQQF2a0EAIAVBH0cbdCEFIAAoAgAhAAJAA0AgACICKAIEQXhxIAFGDQEgBUEddiEAIAVBAXQhBSACIABBBHFqQRBqIgMoAgAiAA0ACyADIAQ2AgAgBCACNgIYIAQgBDYCDCAEIAQ2AggMAQsgAigCCCIAIAQ2AgwgAiAENgIIIARBADYCGCAEIAI2AgwgBCAANgIICyAJQQhqIQEMAgsCQCAHRQ0AAkAgAygCHCIBQQJ0QfTXAGoiAigCACADRgRAIAIgADYCACAADQFByNUAIAhBfiABd3EiCDYCAAwCCyAHQRBBFCAHKAIQIANGG2ogADYCACAARQ0BCyAAIAc2AhggAygCECIBBEAgACABNgIQIAEgADYCGAsgA0EUaigCACIBRQ0AIABBFGogATYCACABIAA2AhgLAkAgBUEPTQRAIAMgBCAFaiIAQQNyNgIEIAAgA2oiACAAKAIEQQFyNgIEDAELIAMgBGoiAiAFQQFyNgIEIAMgBEEDcjYCBCACIAVqIAU2AgAgBUH/AU0EQCAFQXhxQezVAGohAAJ/QcTVACgCACIBQQEgBUEDdnQiBXFFBEBBxNUAIAEgBXI2AgAgAAwBCyAAKAIICyIBIAI2AgwgACACNgIIIAIgADYCDCACIAE2AggMAQtBHyEBIAVB////B00EQCAFQSYgBUEIdmciAGt2QQFxIABBAXRrQT5qIQELIAIgATYCHCACQgA3AhAgAUECdEH01wBqIQBBASABdCIEIAhxRQRAIAAgAjYCAEHI1QAgBCAIcjYCACACIAA2AhggAiACNgIIIAIgAjYCDAwBCyAFQRkgAUEBdmtBACABQR9HG3QhASAAKAIAIQQCQANAIAQiACgCBEF4cSAFRg0BIAFBHXYhBCABQQF0IQEgACAEQQRxakEQaiIGKAIAIgQNAAsgBiACNgIAIAIgADYCGCACIAI2AgwgAiACNgIIDAELIAAoAggiASACNgIMIAAgAjYCCCACQQA2AhggAiAANgIMIAIgATYCCAsgA0EIaiEBDAELAkAgCUUNAAJAIAAoAhwiAUECdEH01wBqIgIoAgAgAEYEQCACIAM2AgAgAw0BQcjVACALQX4gAXdxNgIADAILIAlBEEEUIAkoAhAgAEYbaiADNgIAIANFDQELIAMgCTYCGCAAKAIQIgEEQCADIAE2AhAgASADNgIYCyAAQRRqKAIAIgFFDQAgA0EUaiABNgIAIAEgAzYCGAsCQCAFQQ9NBEAgACAEIAVqIgFBA3I2AgQgACABaiIBIAEoAgRBAXI2AgQMAQsgACAEaiIHIAVBAXI2AgQgACAEQQNyNgIEIAUgB2ogBTYCACAIBEAgCEF4cUHs1QBqIQFB2NUAKAIAIQMCf0EBIAhBA3Z0IgIgBnFFBEBBxNUAIAIgBnI2AgAgAQwBCyABKAIICyICIAM2AgwgASADNgIIIAMgATYCDCADIAI2AggLQdjVACAHNgIAQczVACAFNgIACyAAQQhqIQELIApBEGokACABC0MAIABFBEA/AEEQdA8LAkAgAEH//wNxDQAgAEEASA0AIABBEHZAACIAQX9GBEBBtNkAQTA2AgBBfw8LIABBEHQPCwALC5lCIgBBgAgLDQEAAAAAAAAAAgAAAAMAQZgICwUEAAAABQBBqAgLCQYAAAAHAAAACABB5AgLwjJJbnZhbGlkIGNoYXIgaW4gdXJsIHF1ZXJ5AFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fYm9keQBDb250ZW50LUxlbmd0aCBvdmVyZmxvdwBDaHVuayBzaXplIG92ZXJmbG93AEludmFsaWQgbWV0aG9kIGZvciBIVFRQL3gueCByZXF1ZXN0AEludmFsaWQgbWV0aG9kIGZvciBSVFNQL3gueCByZXF1ZXN0AEV4cGVjdGVkIFNPVVJDRSBtZXRob2QgZm9yIElDRS94LnggcmVxdWVzdABJbnZhbGlkIGNoYXIgaW4gdXJsIGZyYWdtZW50IHN0YXJ0AEV4cGVjdGVkIGRvdABTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3N0YXR1cwBJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cwBFeHBlY3RlZCBMRiBhZnRlciBoZWFkZXJzAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMAVXNlciBjYWxsYmFjayBlcnJvcgBgb25fcmVzZXRgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19oZWFkZXJgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3Byb3RvY29sX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fcHJvdG9jb2wARW1wdHkgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyYWN0ZXIgaW4gQ29udGVudC1MZW5ndGgAVHJhbnNmZXItRW5jb2RpbmcgY2FuJ3QgYmUgcHJlc2VudCB3aXRoIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgY2h1bmsgc2l6ZQBFeHBlY3RlZCBMRiBhZnRlciBjaHVuayBzaXplAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBVbmV4cGVjdGVkIHdoaXRlc3BhY2UgYWZ0ZXIgaGVhZGVyIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgaGVhZGVyIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgTEYgYWZ0ZXIgaGVhZGVyIHZhbHVlAEludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYCBoZWFkZXIgdmFsdWUATWlzc2luZyBleHBlY3RlZCBDUiBhZnRlciBjaHVuayBleHRlbnNpb24gdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZSB2YWx1ZQBJbnZhbGlkIHF1b3RlZC1wYWlyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fcHJvdG9jb2xfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUATWlzc2luZyBleHBlY3RlZCBDUiBhZnRlciByZXNwb25zZSBsaW5lAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBuYW1lAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgY2h1bmsgZXh0ZW5zaW9uIG5hbWUASW52YWxpZCBzdGF0dXMgY29kZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABNaXNzaW5nIGV4cGVjdGVkIENSIGFmdGVyIGNodW5rIGRhdGEARXhwZWN0ZWQgTEYgYWZ0ZXIgY2h1bmsgZGF0YQBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AARGF0YSBhZnRlciBgQ29ubmVjdGlvbjogY2xvc2VgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBRVUVSWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAEV4cGVjdGVkIExGIGFmdGVyIENSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX1BST1RPQ09MX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19DT01QTEVURQBIUEVfQ0JfSEVBREVSX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9OQU1FX0NPTVBMRVRFAEhQRV9DQl9NRVNTQUdFX0NPTVBMRVRFAEhQRV9DQl9NRVRIT0RfQ09NUExFVEUASFBFX0NCX0hFQURFUl9GSUVMRF9DT01QTEVURQBERUxFVEUASFBFX0lOVkFMSURfRU9GX1NUQVRFAElOVkFMSURfU1NMX0NFUlRJRklDQVRFAFBBVVNFAE5PX1JFU1BPTlNFAFVOU1VQUE9SVEVEX01FRElBX1RZUEUAR09ORQBOT1RfQUNDRVBUQUJMRQBTRVJWSUNFX1VOQVZBSUxBQkxFAFJBTkdFX05PVF9TQVRJU0ZJQUJMRQBPUklHSU5fSVNfVU5SRUFDSEFCTEUAUkVTUE9OU0VfSVNfU1RBTEUAUFVSR0UATUVSR0UAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRQBSRVFVRVNUX0hFQURFUl9UT09fTEFSR0UAUEFZTE9BRF9UT09fTEFSR0UASU5TVUZGSUNJRU5UX1NUT1JBR0UASFBFX1BBVVNFRF9VUEdSQURFAEhQRV9QQVVTRURfSDJfVVBHUkFERQBTT1VSQ0UAQU5OT1VOQ0UAVFJBQ0UASFBFX1VORVhQRUNURURfU1BBQ0UAREVTQ1JJQkUAVU5TVUJTQ1JJQkUAUkVDT1JEAEhQRV9JTlZBTElEX01FVEhPRABOT1RfRk9VTkQAUFJPUEZJTkQAVU5CSU5EAFJFQklORABVTkFVVEhPUklaRUQATUVUSE9EX05PVF9BTExPV0VEAEhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEAEFMUkVBRFlfUkVQT1JURUQAQUNDRVBURUQATk9UX0lNUExFTUVOVEVEAExPT1BfREVURUNURUQASFBFX0NSX0VYUEVDVEVEAEhQRV9MRl9FWFBFQ1RFRABDUkVBVEVEAElNX1VTRUQASFBFX1BBVVNFRABUSU1FT1VUX09DQ1VSRUQAUEFZTUVOVF9SRVFVSVJFRABQUkVDT05ESVRJT05fUkVRVUlSRUQAUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATkVUV09SS19BVVRIRU5USUNBVElPTl9SRVFVSVJFRABMRU5HVEhfUkVRVUlSRUQAU1NMX0NFUlRJRklDQVRFX1JFUVVJUkVEAFVQR1JBREVfUkVRVUlSRUQAUEFHRV9FWFBJUkVEAFBSRUNPTkRJVElPTl9GQUlMRUQARVhQRUNUQVRJT05fRkFJTEVEAFJFVkFMSURBVElPTl9GQUlMRUQAU1NMX0hBTkRTSEFLRV9GQUlMRUQATE9DS0VEAFRSQU5TRk9STUFUSU9OX0FQUExJRUQATk9UX01PRElGSUVEAE5PVF9FWFRFTkRFRABCQU5EV0lEVEhfTElNSVRfRVhDRUVERUQAU0lURV9JU19PVkVSTE9BREVEAEhFQUQARXhwZWN0ZWQgSFRUUC8sIFJUU1AvIG9yIElDRS8A5xUAAK8VAACkEgAAkhoAACYWAACeFAAA2xkAAHkVAAB+EgAA/hQAADYVAAALFgAA2BYAAPMSAABCGAAArBYAABIVAAAUFwAA7xcAAEgUAABxFwAAshoAAGsZAAB+GQAANRQAAIIaAABEFwAA/RYAAB4YAACHFwAAqhkAAJMSAAAHGAAALBcAAMoXAACkFwAA5xUAAOcVAABYFwAAOxgAAKASAAAtHAAAwxEAAEgRAADeEgAAQhMAAKQZAAD9EAAA9xUAAKUVAADvFgAA+BkAAEoWAABWFgAA9RUAAAoaAAAIGgAAARoAAKsVAABCEgAA1xAAAEwRAAAFGQAAVBYAAB4RAADKGQAAyBkAAE4WAAD/GAAAcRQAAPAVAADuFQAAlBkAAPwVAAC/GQAAmxkAAHwUAABDEQAAcBgAAJUUAAAnFAAAGRQAANUSAADUGQAARBYAAPcQAEG5OwsBAQBB0DsL4AEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBuj0LBAEAAAIAQdE9C14DBAMDAwMDAAADAwADAwADAwMDAwMDAwMDAAUAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAwADAEG6PwsEAQAAAgBB0T8LXgMAAwMDAwMAAAMDAAMDAAMDAwMDAwMDAwMABAAFAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwADAAMAQbDBAAsNbG9zZWVlcC1hbGl2ZQBBycEACwEBAEHgwQAL4AEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBycMACwEBAEHgwwAL5wEBAQEBAQEBAQEBAQECAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAWNodW5rZWQAQfHFAAteAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQBB0McACyFlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AQYDIAAsgcmFuc2Zlci1lbmNvZGluZ3BncmFkZQ0KDQpTTQ0KDQoAQanIAAsFAQIAAQMAQcDIAAtfBAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAQanKAAsFAQIAAQMAQcDKAAtfBAUFBgUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAQanMAAsEAQAAAQBBwcwAC14CAgACAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAEGpzgALBQECAAEDAEHAzgALXwQFAAAFBQUFBQUFBQUFBQYFBQUFBQUFBQUFBQUABQAHCAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQAFAAUABQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAAAAFAEGp0AALBQEBAAEBAEHA0AALAQEAQdrQAAtBAgAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQanSAAsFAQEAAQEAQcDSAAsBAQBBytIACwYCAAAAAAIAQeHSAAs6AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBBoNQAC50BTk9VTkNFRUNLT1VUTkVDVEVURUNSSUJFTFVTSEVURUFEU0VBUkNIUkdFQ1RJVklUWUxFTkRBUlZFT1RJRllQVElPTlNDSFNFQVlTVEFUQ0hHRVVFUllPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFVFRQQ0VUU1BBRFRQLw==';
|
|
27630
27870
|
|
|
@@ -27652,7 +27892,7 @@ function requireLlhttp_simdWasm () {
|
|
|
27652
27892
|
hasRequiredLlhttp_simdWasm = 1;
|
|
27653
27893
|
(function (module) {
|
|
27654
27894
|
|
|
27655
|
-
const { Buffer } = require$$0$
|
|
27895
|
+
const { Buffer } = require$$0$a;
|
|
27656
27896
|
|
|
27657
27897
|
const wasmBase64 = 'AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAn9/AGABfwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAzU0BQYAAAMAAAAAAAADAQMAAwMDAAACAAAAAAICAgICAgICAgIBAQEBAQEBAQEBAwAAAwAAAAQFAXABExMFAwEAAgYIAX8BQcDZBAsHxQcoBm1lbW9yeQIAC19pbml0aWFsaXplAAgZX19pbmRpcmVjdF9mdW5jdGlvbl90YWJsZQEAC2xsaHR0cF9pbml0AAkYbGxodHRwX3Nob3VsZF9rZWVwX2FsaXZlADcMbGxodHRwX2FsbG9jAAsGbWFsbG9jADkLbGxodHRwX2ZyZWUADARmcmVlAAwPbGxodHRwX2dldF90eXBlAA0VbGxodHRwX2dldF9odHRwX21ham9yAA4VbGxodHRwX2dldF9odHRwX21pbm9yAA8RbGxodHRwX2dldF9tZXRob2QAEBZsbGh0dHBfZ2V0X3N0YXR1c19jb2RlABESbGxodHRwX2dldF91cGdyYWRlABIMbGxodHRwX3Jlc2V0ABMObGxodHRwX2V4ZWN1dGUAFBRsbGh0dHBfc2V0dGluZ3NfaW5pdAAVDWxsaHR0cF9maW5pc2gAFgxsbGh0dHBfcGF1c2UAFw1sbGh0dHBfcmVzdW1lABgbbGxodHRwX3Jlc3VtZV9hZnRlcl91cGdyYWRlABkQbGxodHRwX2dldF9lcnJubwAaF2xsaHR0cF9nZXRfZXJyb3JfcmVhc29uABsXbGxodHRwX3NldF9lcnJvcl9yZWFzb24AHBRsbGh0dHBfZ2V0X2Vycm9yX3BvcwAdEWxsaHR0cF9lcnJub19uYW1lAB4SbGxodHRwX21ldGhvZF9uYW1lAB8SbGxodHRwX3N0YXR1c19uYW1lACAabGxodHRw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AXRrQT5qIQILIAEgAjYCHCABQgA3AhAgAkECdEH01wBqIQACQEHI1QAoAgAiA0EBIAJ0IgdxRQRAIAAgATYCAEHI1QAgAyAHcjYCACABIAA2AhggASABNgIIIAEgATYCDAwBCyAEQRkgAkEBdmtBACACQR9HG3QhAiAAKAIAIQACQANAIAAiAygCBEF4cSAERg0BIAJBHXYhACACQQF0IQIgAyAAQQRxakEQaiIHKAIAIgANAAsgByABNgIAIAEgAzYCGCABIAE2AgwgASABNgIIDAELIAMoAggiACABNgIMIAMgATYCCCABQQA2AhggASADNgIMIAEgADYCCAtB5NUAQeTVACgCAEEBayIAQX8gABs2AgALCwcAIAAtACgLBwAgAC0AKgsHACAALQArCwcAIAAtACkLBwAgAC8BNAsHACAALQAwC0ABBH8gACgCGCEBIAAvAS4hAiAALQAoIQMgACgCOCEEIAAQOCAAIAQ2AjggACADOgAoIAAgAjsBLiAAIAE2AhgLhocCAwd/A34BeyABIAJqIQQCQCAAIgMoAgwiAA0AIAMoAgQEQCADIAE2AgQLIwBBEGsiCSQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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DAgLQeMBDAcLQdcBDAYLQdgBDAULQdkBDAQLQdoBDAMLQdsBDAILQd0BDAELQdwBCyECA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMCfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAn8CQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAwJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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A0EXNgIcIAMgADYCDCADIAFBAWo2AhQM+AILIABBFUYNI0EAIQIgA0EANgIcIAMgATYCFCADQdYMNgIQIANBIzYCDAz3AgsgAygCBCEAQQAhAiADQQA2AgQgAyAAIAEQNCIARQRAIAFBAWohAQwdCyADQRk2AhwgAyAANgIMIAMgAUEBajYCFAz2AgsgAygCBCEAQQAhAiADQQA2AgQgAyAAIAEQNCIARQRAIAFBAWohAQzvAgsgA0EaNgIcIAMgADYCDCADIAFBAWo2AhQM9QILIABBFUYNH0EAIQIgA0EANgIcIAMgATYCFCADQdAPNgIQIANBIjYCDAz0AgsgAygCBCEAIANBADYCBCADIAAgARAzIgBFBEAgAUEBaiEBDBsLIANBHDYCHCADIAA2AgwgAyABQQFqNgIUQQAhAgzzAgsgAygCBCEAIANBADYCBCADIAAgARAzIgBFBEAgAUEBaiEBDOsCCyADQR02AhwgAyAANgIMIAMgAUEBajYCFEEAIQIM8gILIABBO0cNASABQQFqIQELQSYhAgzXAgtBACECIANBADYCHCADIAE2AhQgA0GfFTYCECADQQw2AgwM7wILIAEgBEcEQANAIAEtAABBIEcNhAIgBCABQQFqIgFHDQALQSwhAgzvAgtBLCECDO4CCyABIARGBEBBNCECDO4CCwJAAkADQAJAIAEtAABBCmsOBAIAAAMACyAEIAFBAWoiAUcNAAtBNCECDO8CCyADKAIEIQAgA0EANgIEIAMgACABEDEiAEUNnwIgA0EyNgIcIAMgATYCFCADIAA2AgxBACECDO4CCyADKAIEIQAgA0EANgIEIAMgACABEDEiAEUEQCABQQFqIQEMnwILIANBMjYCHCADIAA2AgwgAyABQQFqNgIUQQAhAgztAgsgASAERwRAAkADQCABLQAAQTBrIgBB/wFxQQpPBEBBOiECDNcCCyADKQMgIgtCmbPmzJmz5swZVg0BIAMgC0IKfiIKNwMgIAogAK1C/wGDIgtCf4VWDQEgAyAKIAt8NwMgIAQgAUEBaiIBRw0AC0HAACECDO4CCyADKAIEIQAgA0EANgIEIAMgACABQQFqIgEQMSIADRcM4gILQcAAIQIM7AILIAEgBEYEQEHJACECDOwCCwJAA0ACQCABLQAAQQlrDhgAAqICogKpAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAgCiAgsgBCABQQFqIgFHDQALQckAIQIM7AILIAFBAWohASADQS9qLQAAQQFxDaUCIANBADYCHCADIAE2AhQgA0GXEDYCECADQQo2AgxBACECDOsCCyABIARHBEADQCABLQAAQSBHDRUgBCABQQFqIgFHDQALQfgAIQIM6wILQfgAIQIM6gILIANBAjoAKAw4C0EAIQIgA0EANgIcIANBvws2AhAgA0ECNgIMIAMgAUEBajYCFAzoAgtBACECDM4CC0ENIQIMzQILQRMhAgzMAgtBFSECDMsCC0EWIQIMygILQRghAgzJAgtBGSECDMgCC0EaIQIMxwILQRshAgzGAgtBHCECDMUCC0EdIQIMxAILQR4hAgzDAgtBHyECDMICC0EgIQIMwQILQSIhAgzAAgtBIyECDL8CC0ElIQIMvgILQeUAIQIMvQILIANBPTYCHCADIAE2AhQgAyAANgIMQQAhAgzVAgsgA0EbNgIcIAMgATYCFCADQaQcNgIQIANBFTYCDEEAIQIM1AILIANBIDYCHCADIAE2AhQgA0GYGjYCECADQRU2AgxBACECDNMCCyADQRM2AhwgAyABNgIUIANBmBo2AhAgA0EVNgIMQQAhAgzSAgsgA0ELNgIcIAMgATYCFCADQZgaNgIQIANBFTYCDEEAIQIM0QILIANBEDYCHCADIAE2AhQgA0GYGjYCECADQRU2AgxBACECDNACCyADQSA2AhwgAyABNgIUIANBpBw2AhAgA0EVNgIMQQAhAgzPAgsgA0ELNgIcIAMgATYCFCADQaQcNgIQIANBFTYCDEEAIQIMzgILIANBDDYCHCADIAE2AhQgA0GkHDYCECADQRU2AgxBACECDM0CC0EAIQIgA0EANgIcIAMgATYCFCADQd0ONgIQIANBEjYCDAzMAgsCQANAAkAgAS0AAEEKaw4EAAICAAILIAQgAUEBaiIBRw0AC0H9ASECDMwCCwJAAkAgAy0ANkEBRw0AQQAhAAJAIAMoAjgiAkUNACACKAJgIgJFDQAgAyACEQAAIQALIABFDQAgAEEVRw0BIANB/AE2AhwgAyABNgIUIANB3Bk2AhAgA0EVNgIMQQAhAgzNAgtB3AEhAgyzAgsgA0EANgIcIAMgATYCFCADQfkLNgIQIANBHzYCDEEAIQIMywILAkACQCADLQAoQQFrDgIEAQALQdsBIQIMsgILQdQBIQIMsQILIANBAjoAMUEAIQACQCADKAI4IgJFDQAgAigCACICRQ0AIAMgAhEAACEACyAARQRAQd0BIQIMsQILIABBFUcEQCADQQA2AhwgAyABNgIUIANBtAw2AhAgA0EQNgIMQQAhAgzKAgsgA0H7ATYCHCADIAE2AhQgA0GBGjYCECADQRU2AgxBACECDMkCCyABIARGBEBB+gEhAgzJAgsgAS0AAEHIAEYNASADQQE6ACgLQcABIQIMrgILQdoBIQIMrQILIAEgBEcEQCADQQw2AgggAyABNgIEQdkBIQIMrQILQfkBIQIMxQILIAEgBEYEQEH4ASECDMUCCyABLQAAQcgARw0EIAFBAWohAUHYASECDKsCCyABIARGBEBB9wEhAgzEAgsCQAJAIAEtAABBxQBrDhAABQUFBQUFBQUFBQUFBQUBBQsgAUEBaiEBQdYBIQIMqwILIAFBAWohAUHXASECDKoCC0H2ASECIAEgBEYNwgIgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABButUAai0AAEcNAyAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMwwILIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARAuIgBFBEBB4wEhAgyqAgsgA0H1ATYCHCADIAE2AhQgAyAANgIMQQAhAgzCAgtB9AEhAiABIARGDcECIAMoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQbjVAGotAABHDQIgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADMICCyADQYEEOwEoIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARAuIgANAwwCCyADQQA2AgALQQAhAiADQQA2AhwgAyABNgIUIANB5R82AhAgA0EINgIMDL8CC0HVASECDKUCCyADQfMBNgIcIAMgATYCFCADIAA2AgxBACECDL0CC0EAIQACQCADKAI4IgJFDQAgAigCQCICRQ0AIAMgAhEAACEACyAARQ1uIABBFUcEQCADQQA2AhwgAyABNgIUIANBgg82AhAgA0EgNgIMQQAhAgy9AgsgA0GPATYCHCADIAE2AhQgA0HsGzYCECADQRU2AgxBACECDLwCCyABIARHBEAgA0ENNgIIIAMgATYCBEHTASECDKMCC0HyASECDLsCCyABIARGBEBB8QEhAgy7AgsCQAJAAkAgAS0AAEHIAGsOCwABCAgICAgICAgCCAsgAUEBaiEBQdABIQIMowILIAFBAWohAUHRASECDKICCyABQQFqIQFB0gEhAgyhAgtB8AEhAiABIARGDbkCIAMoAgAiACAEIAFraiEGIAEgAGtBAmohBQNAIAEtAAAgAEG11QBqLQAARw0EIABBAkYNAyAAQQFqIQAgBCABQQFqIgFHDQALIAMgBjYCAAy5AgtB7wEhAiABIARGDbgCIAMoAgAiACAEIAFraiEGIAEgAGtBAWohBQNAIAEtAAAgAEGz1QBqLQAARw0DIABBAUYNAiAAQQFqIQAgBCABQQFqIgFHDQALIAMgBjYCAAy4AgtB7gEhAiABIARGDbcCIAMoAgAiACAEIAFraiEGIAEgAGtBAmohBQNAIAEtAAAgAEGw1QBqLQAARw0CIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBjYCAAy3AgsgAygCBCEAIANCADcDACADIAAgBUEBaiIBECsiAEUNAiADQewBNgIcIAMgATYCFCADIAA2AgxBACECDLYCCyADQQA2AgALIAMoAgQhACADQQA2AgQgAyAAIAEQKyIARQ2cAiADQe0BNgIcIAMgATYCFCADIAA2AgxBACECDLQCC0HPASECDJoCC0EAIQACQCADKAI4IgJFDQAgAigCNCICRQ0AIAMgAhEAACEACwJAIAAEQCAAQRVGDQEgA0EANgIcIAMgATYCFCADQeoNNgIQIANBJjYCDEEAIQIMtAILQc4BIQIMmgILIANB6wE2AhwgAyABNgIUIANBgBs2AhAgA0EVNgIMQQAhAgyyAgsgASAERgRAQesBIQIMsgILIAEtAABBL0YEQCABQQFqIQEMAQsgA0EANgIcIAMgATYCFCADQbI4NgIQIANBCDYCDEEAIQIMsQILQc0BIQIMlwILIAEgBEcEQCADQQ42AgggAyABNgIEQcwBIQIMlwILQeoBIQIMrwILIAEgBEYEQEHpASECDK8CCyABLQAAQTBrIgBB/wFxQQpJBEAgAyAAOgAqIAFBAWohAUHLASECDJYCCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNlwIgA0HoATYCHCADIAE2AhQgAyAANgIMQQAhAgyuAgsgASAERgRAQecBIQIMrgILAkAgAS0AAEEuRgRAIAFBAWohAQwBCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNmAIgA0HmATYCHCADIAE2AhQgAyAANgIMQQAhAgyuAgtBygEhAgyUAgsgASAERgRAQeUBIQIMrQILQQAhAEEBIQVBASEHQQAhAgJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAIAEtAABBMGsOCgoJAAECAwQFBggLC0ECDAYLQQMMBQtBBAwEC0EFDAMLQQYMAgtBBwwBC0EICyECQQAhBUEAIQcMAgtBCSECQQEhAEEAIQVBACEHDAELQQAhBUEBIQILIAMgAjoAKyABQQFqIQECQAJAIAMtAC5BEHENAAJAAkACQCADLQAqDgMBAAIECyAHRQ0DDAILIAANAQwCCyAFRQ0BCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNAiADQeIBNgIcIAMgATYCFCADIAA2AgxBACECDK8CCyADKAIEIQAgA0EANgIEIAMgACABEC8iAEUNmgIgA0HjATYCHCADIAE2AhQgAyAANgIMQQAhAgyuAgsgAygCBCEAIANBADYCBCADIAAgARAvIgBFDZgCIANB5AE2AhwgAyABNgIUIAMgADYCDAytAgtByQEhAgyTAgtBACEAAkAgAygCOCICRQ0AIAIoAkQiAkUNACADIAIRAAAhAAsCQCAABEAgAEEVRg0BIANBADYCHCADIAE2AhQgA0GkDTYCECADQSE2AgxBACECDK0CC0HIASECDJMCCyADQeEBNgIcIAMgATYCFCADQdAaNgIQIANBFTYCDEEAIQIMqwILIAEgBEYEQEHhASECDKsCCwJAIAEtAABBIEYEQCADQQA7ATQgAUEBaiEBDAELIANBADYCHCADIAE2AhQgA0GZETYCECADQQk2AgxBACECDKsCC0HHASECDJECCyABIARGBEBB4AEhAgyqAgsCQCABLQAAQTBrQf8BcSICQQpJBEAgAUEBaiEBAkAgAy8BNCIAQZkzSw0AIAMgAEEKbCIAOwE0IABB/v8DcSACQf//A3NLDQAgAyAAIAJqOwE0DAILQQAhAiADQQA2AhwgAyABNgIUIANBlR42AhAgA0ENNgIMDKsCCyADQQA2AhwgAyABNgIUIANBlR42AhAgA0ENNgIMQQAhAgyqAgtBxgEhAgyQAgsgASAERgRAQd8BIQIMqQILAkAgAS0AAEEwa0H/AXEiAkEKSQRAIAFBAWohAQJAIAMvATQiAEGZM0sNACADIABBCmwiADsBNCAAQf7/A3EgAkH//wNzSw0AIAMgACACajsBNAwCC0EAIQIgA0EANgIcIAMgATYCFCADQZUeNgIQIANBDTYCDAyqAgsgA0EANgIcIAMgATYCFCADQZUeNgIQIANBDTYCDEEAIQIMqQILQcUBIQIMjwILIAEgBEYEQEHeASECDKgCCwJAIAEtAABBMGtB/wFxIgJBCkkEQCABQQFqIQECQCADLwE0IgBBmTNLDQAgAyAAQQpsIgA7ATQgAEH+/wNxIAJB//8Dc0sNACADIAAgAmo7ATQMAgtBACECIANBADYCHCADIAE2AhQgA0GVHjYCECADQQ02AgwMqQILIANBADYCHCADIAE2AhQgA0GVHjYCECADQQ02AgxBACECDKgCC0HEASECDI4CCyABIARGBEBB3QEhAgynAgsCQAJAAkACQCABLQAAQQprDhcCAwMAAwMDAwMDAwMDAwMDAwMDAwMDAQMLIAFBAWoMBQsgAUEBaiEBQcMBIQIMjwILIAFBAWohASADQS9qLQAAQQFxDQggA0EANgIcIAMgATYCFCADQY0LNgIQIANBDTYCDEEAIQIMpwILIANBADYCHCADIAE2AhQgA0GNCzYCECADQQ02AgxBACECDKYCCyABIARHBEAgA0EPNgIIIAMgATYCBEEBIQIMjQILQdwBIQIMpQILAkACQANAAkAgAS0AAEEKaw4EAgAAAwALIAQgAUEBaiIBRw0AC0HbASECDKYCCyADKAIEIQAgA0EANgIEIAMgACABEC0iAEUEQCABQQFqIQEMBAsgA0HaATYCHCADIAA2AgwgAyABQQFqNgIUQQAhAgylAgsgAygCBCEAIANBADYCBCADIAAgARAtIgANASABQQFqCyEBQcEBIQIMigILIANB2QE2AhwgAyAANgIMIAMgAUEBajYCFEEAIQIMogILQcIBIQIMiAILIANBL2otAABBAXENASADQQA2AhwgAyABNgIUIANB5Bw2AhAgA0EZNgIMQQAhAgygAgsgASAERgRAQdkB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CyADIAU2AgAMkAILIANBADYCACAGQQFqIQFBGgw8C0HKASECIAEgBEYNjgIgAygCACIAIAQgAWtqIQUgASAAa0EDaiEGAkADQCABLQAAIABBjdUAai0AAEcNOyAAQQNGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMjwILIANBADYCACAGQQFqIQFBIQw7CyABIARGBEBByQEhAgyOAgsCQAJAIAEtAABBwQBrDhQAPT09PT09PT09PT09PT09PT09AT0LIAFBAWohAUGtASECDPUBCyABQQFqIQFBsAEhAgz0AQsgASAERgRAQcgBIQIMjQILAkACQCABLQAAQdUAaw4LADw8PDw8PDw8PAE8CyABQQFqIQFBrgEhAgz0AQsgAUEBaiEBQa8BIQIM8wELQccBIQIgASAERg2LAiADKAIAIgAgBCABa2ohBSABIABrQQhqIQYCQANAIAEtAAAgAEGE1QBqLQAARw04IABBCEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyMAgsgA0EANgIAIAZBAWohAUEqDDgLIAEgBEYEQEHGASECDIsCCyABLQAAQdAARw04IAFBAWohAUElDDcLQcUBIQIgASAERg2JAiADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGB1QBqLQAARw02IABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyKAgsgA0EANgIAIAZBAWohAUEODDYLIAEgBEYEQEHEASECDIkCCyABLQAAQcUARw02IAFBAWohAUGrASECDO8BCyABIARGBEBBwwEhAgyIAgsCQAJAAkACQCABLQAAQcIAaw4PAAECOTk5OTk5OTk5OTkDOQsgAUEBaiEBQacBIQIM8QELIAFBAWohAUGoASECDPABCyABQQFqIQFBqQEhAgzvAQsgAUEBaiEBQaoBIQIM7gELQcIBIQIgASAERg2GAiADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEH+1ABqLQAARw0zIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyHAgsgA0EANgIAIAZBAWohAUEUDDMLQcEBIQIgASAERg2FAiADKAIAIgAgBCABa2ohBSABIABrQQRqIQYCQANAIAEtAAAgAEH51ABqLQAARw0yIABBBEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyGAgsgA0EANgIAIAZBAWohAUErDDILQcABIQIgASAERg2EAiADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEH21ABqLQAARw0xIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyFAgsgA0EANgIAIAZBAWohAUEsDDELQb8BIQIgASAERg2DAiADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGh1QBqLQAARw0wIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyEAgsgA0EANgIAIAZBAWohAUERDDALQb4BIQIgASAERg2CAiADKAIAIgAgBCABa2ohBSABIABrQQNqIQYCQANAIAEtAAAgAEHy1ABqLQAARw0vIABBA0YNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyDAgsgA0EANgIAIAZBAWohAUEuDC8LIAEgBEYEQEG9ASECDIICCwJAAkACQAJAAkAgAS0AAEHBAGsOFQA0NDQ0NDQ0NDQ0ATQ0AjQ0AzQ0BDQLIAFBAWohAUGbASECDOwBCyABQQFqIQFBnAEhAgzrAQsgAUEBaiEBQZ0BIQIM6gELIAFBAWohAUGiASECDOkBCyABQQFqIQFBpAEhAgzoAQsgASAERgRAQbwBIQIMgQILAkACQCABLQAAQdIAaw4DADABMAsgAUEBaiEBQaMBIQIM6AELIAFBAWohAUEEDC0LQbsBIQIgASAERg3/ASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHw1ABqLQAARw0sIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyAAgsgA0EANgIAIAZBAWohAUEdDCwLIAEgBEYEQEG6ASECDP8BCwJAAkAgAS0AAEHJAGsOBwEuLi4uLgAuCyABQQFqIQFBoQEhAgzmAQsgAUEBaiEBQSIMKwsgASAERgRAQbkBIQIM/gELIAEtAABB0ABHDSsgAUEBaiEBQaABIQIM5AELIAEgBEYEQEG4ASECDP0BCwJAAkAgAS0AAEHGAGsOCwAsLCwsLCwsLCwBLAsgAUEBaiEBQZ4BIQIM5AELIAFBAWohAUGfASECDOMBC0G3ASECIAEgBEYN+wEgAygCACIAIAQgAWtqIQUgASAAa0EDaiEGAkADQCABLQAAIABB7NQAai0AAEcNKCAAQQNGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM/AELIANBADYCACAGQQFqIQFBDQwoC0G2ASECIAEgBEYN+gEgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABBodUAai0AAEcNJyAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM+wELIANBADYCACAGQQFqIQFBDAwnC0G1ASECIAEgBEYN+QEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABB6tQAai0AAEcNJiAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM+gELIANBADYCACAGQQFqIQFBAwwmC0G0ASECIAEgBEYN+AEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABB6NQAai0AAEcNJSAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM+QELIANBADYCACAGQQFqIQFBJgwlCyABIARGBEBBswEhAgz4AQsCQAJAIAEtAABB1ABrDgIAAScLIAFBAWohAUGZASECDN8BCyABQQFqIQFBmgEhAgzeAQtBsgEhAiABIARGDfYBIAMoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQebUAGotAABHDSMgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADPcBCyADQQA2AgAgBkEBaiEBQScMIwtBsQEhAiABIARGDfUBIAMoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQeTUAGotAABHDSIgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADPYBCyADQQA2AgAgBkEBaiEBQRwMIgtBsAEhAiABIARGDfQBIAMoAgAiACAEIAFraiEFIAEgAGtBBWohBgJAA0AgAS0AACAAQd7UAGotAABHDSEgAEEFRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADPUBCyADQQA2AgAgBkEBaiEBQQYMIQtBrwEhAiABIARGDfMBIAMoAgAiACAEIAFraiEFIAEgAGtBBGohBgJAA0AgAS0AACAAQdnUAGotAABHDSAgAEEERg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADPQBCyADQQA2AgAgBkEBaiEBQRkMIAsgASAERgRAQa4BIQIM8wELAkACQAJAAkAgAS0AAEEtaw4jACQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkASQkJCQkAiQkJAMkCyABQQFqIQFBjgEhAgzcAQsgAUEBaiEBQY8BIQIM2wELIAFBAWohAUGUASECDNoBCyABQQFqIQFBlQEhAgzZAQtBrQEhAiABIARGDfEBIAMoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQdfUAGotAABHDR4gAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADPIBCyADQQA2AgAgBkEBaiEBQQsMHgsgASAERgRAQawBIQIM8QELAkACQCABLQAAQcEAaw4DACABIAsgAUEBaiEBQZABIQIM2AELIAFBAWohAUGTASECDNcBCyABIARGBEBBqwEhAgzwAQsCQAJAIAEtAABBwQBrDg8AHx8fHx8fHx8fHx8fHwEfCyABQQFqIQFBkQEhAgzXAQsgAUEBaiEBQZIBIQIM1gELIAEgBEYEQEGqASECDO8BCyABLQAAQcwARw0cIAFBAWohAUEKDBsLQakBIQIgASAERg3tASADKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEHR1ABqLQAARw0aIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzuAQsgA0EANgIAIAZBAWohAUEeDBoLQagBIQIgASAERg3sASADKAIAIgAgBCABa2ohBSABIABrQQZqIQYCQANAIAEtAAAgAEHK1ABqLQAARw0ZIABBBkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAztAQsgA0EANgIAIAZBAWohAUEVDBkLQacBIQIgASAERg3rASADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEHH1ABqLQAARw0YIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzsAQsgA0EANgIAIAZBAWohAUEXDBgLQaYBIQIgASAERg3qASADKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEHB1ABqLQAARw0XIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzrAQsgA0EANgIAIAZBAWohAUEYDBcLIAEgBEYEQEGlASECDOoBCwJAAkAgAS0AAEHJAGsOBwAZGRkZGQEZCyABQQFqIQFBiwEhAgzRAQsgAUEBaiEBQYwBIQIM0AELQaQBIQIgASAERg3oASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGm1QBqLQAARw0VIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzpAQsgA0EANgIAIAZBAWohAUEJDBULQaMBIQIgASAERg3nASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGk1QBqLQAARw0UIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzoAQsgA0EANgIAIAZBAWohAUEfDBQLQaIBIQIgASAERg3mASADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEG+1ABqLQAARw0TIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAznAQsgA0EANgIAIAZBAWohAUECDBMLQaEBIQIgASAERg3lASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYDQCABLQAAIABBvNQAai0AAEcNESAAQQFGDQIgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM5QELIAEgBEYEQEGgASECDOUBC0EBIAEtAABB3wBHDREaIAFBAWohAUGHASECDMsBCyADQQA2AgAgBkEBaiEBQYgBIQIMygELQZ8BIQIgASAERg3iASADKAIAIgAgBCABa2ohBSABIABrQQhqIQYCQANAIAEtAAAgAEGE1QBqLQAARw0PIABBCEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzjAQsgA0EANgIAIAZBAWohAUEpDA8LQZ4BIQIgASAERg3hASADKAIAIgAgBCABa2ohBSABIABrQQNqIQYCQANAIAEtAAAgAEG41ABqLQAARw0OIABBA0YNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAziAQsgA0EANgIAIAZBAWohAUEtDA4LIAEgBEYEQEGdASECDOEBCyABLQAAQcUARw0OIAFBAWohAUGEASECDMcBCyABIARGBEBBnAEhAgzgAQsCQAJAIAEtAABBzABrDggADw8PDw8PAQ8LIAFBAWohAUGCASECDMcBCyABQQFqIQFBgwEhAgzGAQtBmwEhAiABIARGDd4BIAMoAgAiACAEIAFraiEFIAEgAGtBBGohBgJAA0AgAS0AACAAQbPUAGotAABHDQsgAEEERg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADN8BCyADQQA2AgAgBkEBaiEBQSMMCwtBmgEhAiABIARGDd0BIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQbDUAGotAABHDQogAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADN4BCyADQQA2AgAgBkEBaiEBQQAMCgsgASAERgRAQZkBIQIM3QELAkACQCABLQAAQcgAaw4IAAwMDAwMDAEMCyABQQFqIQFB/QAhAgzEAQsgAUEBaiEBQYABIQIMwwELIAEgBEYEQEGYASECDNwBCwJAAkAgAS0AAEHOAGsOAwALAQsLIAFBAWohAUH+ACECDMMBCyABQQFqIQFB/wAhAgzCAQsgASAERgRAQZcBIQIM2wELIAEtAABB2QBHDQggAUEBaiEBQQgMBwtBlgEhAiABIARGDdkBIAMoAgAiACAEIAFraiEFIAEgAGtBA2ohBgJAA0AgAS0AACAAQazUAGotAABHDQYgAEEDRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADNoBCyADQQA2AgAgBkEBaiEBQQUMBgtBlQEhAiABIARGDdgBIAMoAgAiACAEIAFraiEFIAEgAGtBBWohBgJAA0AgAS0AACAAQabUAGotAABHDQUgAEEFRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADNkBCyADQQA2AgAgBkEBaiEBQRYMBQtBlAEhAiABIARGDdcBIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQaHVAGotAABHDQQgAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADNgBCyADQQA2AgAgBkEBaiEBQRAMBAsgASAERgRAQZMBIQIM1wELAkACQCABLQAAQcMAaw4MAAYGBgYGBgYGBgYBBgsgAUEBaiEBQfkAIQIMvgELIAFBAWohAUH6ACECDL0BC0GSASECIAEgBEYN1QEgAygCACIAIAQgAWtqIQUgASAAa0EFaiEGAkADQCABLQAAIABBoNQAai0AAEcNAiAAQQVGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM1gELIANBADYCACAGQQFqIQFBJAwCCyADQQA2AgAMAgsgASAERgRAQZEBIQIM1AELIAEtAABBzABHDQEgAUEBaiEBQRMLOgApIAMoAgQhACADQQA2AgQgAyAAIAEQLiIADQIMAQtBACECIANBADYCHCADIAE2AhQgA0H+HzYCECADQQY2AgwM0QELQfgAIQIMtwELIANBkAE2AhwgAyABNgIUIAMgADYCDEEAIQIMzwELQQAhAAJAIAMoAjgiAkUNACACKAJAIgJFDQAgAyACEQAAIQALIABFDQAgAEEVRg0BIANBADYCHCADIAE2AhQgA0GCDzYCECADQSA2AgxBACECDM4BC0H3ACECDLQBCyADQY8BNgIcIAMgATYCFCADQewbNgIQIANBFTYCDEEAIQIMzAELIAEgBEYEQEGPASECDMwBCwJAIAEtAABBIEYEQCABQQFqIQEMAQsgA0EANgIcIAMgATYCFCADQZsfNgIQIANBBjYCDEEAIQIMzAELQQIhAgyyAQsDQCABLQAAQSBHDQIgBCABQQFqIgFHDQALQY4BIQIMygELIAEgBEYEQEGNASECDMoBCwJAIAEtAABBCWsOBEoAAEoAC0H1ACECDLABCyADLQApQQVGBEBB9gAhAgywAQtB9AAhAgyvAQsgASAERgRAQYwBIQIMyAELIANBEDYCCCADIAE2AgQMCgsgASAERgRAQYsBIQIMxwELAkAgAS0AAEEJaw4ERwAARwALQfMAIQIMrQELIAEgBEcEQCADQRA2AgggAyABNgIEQfEAIQIMrQELQYoBIQIMxQELAkAgASAERwRAA0AgAS0AAEGg0ABqLQAAIgBBA0cEQAJAIABBAWsOAkkABAtB8AAhAgyvAQsgBCABQQFqIgFHDQALQYgBIQIMxgELQYgBIQIMxQELIANBADYCHCADIAE2AhQgA0HbIDYCECADQQc2AgxBACECDMQBCyABIARGBEBBiQEhAgzEAQsCQAJAAkAgAS0AAEGg0gBqLQAAQQFrDgNGAgABC0HyACECDKwBCyADQQA2AhwgAyABNgIUIANBtBI2AhAgA0EHNgIMQQAhAgzEAQtB6gAhAgyqAQsgASAERwRAIAFBAWohAUHvACECDKoBC0GHASECDMIBCyAEIAEiAEYEQEGGASECDMIBCyAALQAAIgFBL0YEQCAAQQFqIQFB7gAhAgypAQsgAUEJayICQRdLDQEgACEBQQEgAnRBm4CABHENQQwBCyAEIAEiAEYEQEGFASECDMEBCyAALQAAQS9HDQAgAEEBaiEBDAMLQQAhAiADQQA2AhwgAyAANgIUIANB2yA2AhAgA0EHNgIMDL8BCwJAAkACQAJAAkADQCABLQAAQaDOAGotAAAiAEEFRwRAAkACQCAAQQFrDghHBQYHCAAEAQgLQesAIQIMrQELIAFBAWohAUHtACECDKwBCyAEIAFBAWoiAUcNAAtBhAEhAgzDAQsgAUEBagwUCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNHiADQdsANgIcIAMgATYCFCADIAA2AgxBACECDMEBCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNHiADQd0ANgIcIAMgATYCFCADIAA2AgxBACECDMABCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNHiADQfoANgIcIAMgATYCFCADIAA2AgxBACECDL8BCyADQQA2AhwgAyABNgIUIANB+Q82AhAgA0EHNgIMQQAhAgy+AQsgASAERgRAQYMBIQIMvgELAkAgAS0AAEGgzgBqLQAAQQFrDgg+BAUGAAgCAwcLIAFBAWohAQtBAyECDKMBCyABQQFqDA0LQQAhAiADQQA2AhwgA0HREjYCECADQQc2AgwgAyABQQFqNgIUDLoBCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNFiADQdsANgIcIAMgATYCFCADIAA2AgxBACECDLkBCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNFiADQd0ANgIcIAMgATYCFCADIAA2AgxBACECDLgBCyADKAIEIQAgA0EANgIEIAMgACABECwiAEUNFiADQfoANgIcIAMgATYCFCADIAA2AgxBACECDLcBCyADQQA2AhwgAyABNgIUIANB+Q82AhAgA0EHNgIMQQAhAgy2AQtB7AAhAgycAQsgASAERgRAQYIBIQIMtQELIAFBAWoMAgsgASAERgRAQYEBIQIMtAELIAFBAWoMAQsgASAERg0BIAFBAWoLIQFBBCECDJgBC0GAASECDLABCwNAIAEtAABBoMwAai0AACIAQQJHBEAgAEEBRwRAQekAIQIMmQELDDELIAQgAUEBaiIBRw0AC0H/ACECDK8BCyABIARGBEBB/gAhAgyvAQsCQCABLQAAQQlrDjcvAwYvBAYGBgYGBgYGBgYGBgYGBgYGBgUGBgIGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYABgsgAUEBagshAUEFIQIMlAELIAFBAWoMBgsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQggA0HbADYCHCADIAE2AhQgAyAANgIMQQAhAgyrAQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQggA0HdADYCHCADIAE2AhQgAyAANgIMQQAhAgyqAQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQggA0H6ADYCHCADIAE2AhQgAyAANgIMQQAhAgypAQsgA0EANgIcIAMgATYCFCADQY0UNgIQIANBBzYCDEEAIQIMqAELAkACQAJAAkADQCABLQAAQaDKAGotAAAiAEEFRwRAAkAgAEEBaw4GLgMEBQYABgtB6AAhAgyUAQsgBCABQQFqIgFHDQALQf0AIQIMqwELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0HIANB2wA2AhwgAyABNgIUIAMgADYCDEEAIQIMqgELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0HIANB3QA2AhwgAyABNgIUIAMgADYCDEEAIQIMqQELIAMoAgQhACADQQA2AgQgAyAAIAEQLCIARQ0HIANB+gA2AhwgAyABNgIUIAMgADYCDEEAIQIMqAELIANBADYCHCADIAE2AhQgA0HkCDYCECADQQc2AgxBACECDKcBCyABIARGDQEgAUEBagshAUEGIQIMjAELQfwAIQIMpAELAkACQAJAAkADQCABLQAAQaDIAGotAAAiAEEFRwRAIABBAWsOBCkCAwQFCyAEIAFBAWoiAUcNAAtB+wAhAgynAQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQMgA0HbADYCHCADIAE2AhQgAyAANgIMQQAhAgymAQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQMgA0HdADYCHCADIAE2AhQgAyAANgIMQQAhAgylAQsgAygCBCEAIANBADYCBCADIAAgARAsIgBFDQMgA0H6ADYCHCADIAE2AhQgAyAANgIMQQAhAgykAQsgA0EANgIcIAMgATYCFCADQbwKNgIQIANBBzYCDEEAIQIMowELQc8AIQIMiQELQdEAIQIMiAELQecAIQIMhwELIAEgBEYEQEH6ACECDKABCwJAIAEtAABBCWsOBCAAACAACyABQQFqIQFB5gAhAgyGAQsgASAERgRAQfkAIQIMnwELAkAgAS0AAEEJaw4EHwAAHwALQQAhAAJAIAMoAjgiAkUNACACKAI4IgJFDQAgAyACEQAAIQALIABFBEBB4gEhAgyGAQsgAEEVRwRAIANBADYCHCADIAE2AhQgA0HJDTYCECADQRo2AgxBACECDJ8BCyADQfgANgIcIAMgATYCFCADQeoaNgIQIANBFTYCDEEAIQIMngELIAEgBEcEQCADQQ02AgggAyABNgIEQeQAIQIMhQELQfcAIQIMnQELIAEgBEYEQEH2ACECDJ0BCwJAAkACQCABLQAAQcgAaw4LAAELCwsLCwsLCwILCyABQQFqIQFB3QAhAgyFAQsgAUEBaiEBQeAAIQIMhAELIAFBAWohAUHjACECDIMBC0H1ACECIAEgBEYNmwEgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABBtdUAai0AAEcNCCAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMnAELIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARArIgAEQCADQfQANgIcIAMgATYCFCADIAA2AgxBACECDJwBC0HiACECDIIBC0EAIQACQCADKAI4IgJFDQAgAigCNCICRQ0AIAMgAhEAACEACwJAIAAEQCAAQRVGDQEgA0EANgIcIAMgATYCFCADQeoNNgIQIANBJjYCDEEAIQIMnAELQeEAIQIMggELIANB8wA2AhwgAyABNgIUIANBgBs2AhAgA0EVNgIMQQAhAgyaAQsgAy0AKSIAQSNrQQtJDQkCQCAAQQZLDQBBASAAdEHKAHFFDQAMCgtBACECIANBADYCHCADIAE2AhQgA0HtCTYCECADQQg2AgwMmQELQfIAIQIgASAERg2YASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGz1QBqLQAARw0FIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyZAQsgAygCBCEAIANCADcDACADIAAgBkEBaiIBECsiAARAIANB8QA2AhwgAyABNgIUIAMgADYCDEEAIQIMmQELQd8AIQIMfwtBACEAAkAgAygCOCICRQ0AIAIoAjQiAkUNACADIAIRAAAhAAsCQCAABEAgAEEVRg0BIANBADYCHCADIAE2AhQgA0HqDTYCECADQSY2AgxBACECDJkBC0HeACECDH8LIANB8AA2AhwgAyABNgIUIANBgBs2AhAgA0EVNgIMQQAhAgyXAQsgAy0AKUEhRg0GIANBADYCHCADIAE2AhQgA0GRCjYCECADQQg2AgxBACECDJYBC0HvACECIAEgBEYNlQEgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABBsNUAai0AAEcNAiAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMlgELIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARArIgBFDQIgA0HtADYCHCADIAE2AhQgAyAANgIMQQAhAgyVAQsgA0EANgIACyADKAIEIQAgA0EANgIEIAMgACABECsiAEUNgAEgA0HuADYCHCADIAE2AhQgAyAANgIMQQAhAgyTAQtB3AAhAgx5C0EAIQACQCADKAI4IgJFDQAgAigCNCICRQ0AIAMgAhEAACEACwJAIAAEQCAAQRVGDQEgA0EANgIcIAMgATYCFCADQeoNNgIQIANBJjYCDEEAIQIMkwELQdsAIQIMeQsgA0HsADYCHCADIAE2AhQgA0GAGzYCECADQRU2AgxBACECDJEBCyADLQApIgBBI0kNACAAQS5GDQAgA0EANgIcIAMgATYCFCADQckJNgIQIANBCDYCDEEAIQIMkAELQdoAIQIMdgsgASAERgRAQesAIQIMjwELAkAgAS0AAEEvRgRAIAFBAWohAQwBCyAD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ciBIVFRQL3gueCByZXF1ZXN0AEludmFsaWQgbWV0aG9kIGZvciBSVFNQL3gueCByZXF1ZXN0AEV4cGVjdGVkIFNPVVJDRSBtZXRob2QgZm9yIElDRS94LnggcmVxdWVzdABJbnZhbGlkIGNoYXIgaW4gdXJsIGZyYWdtZW50IHN0YXJ0AEV4cGVjdGVkIGRvdABTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3N0YXR1cwBJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cwBFeHBlY3RlZCBMRiBhZnRlciBoZWFkZXJzAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMAVXNlciBjYWxsYmFjayBlcnJvcgBgb25fcmVzZXRgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19oZWFkZXJgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3Byb3RvY29sX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fcHJvdG9jb2wARW1wdHkgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyYWN0ZXIgaW4gQ29udGVudC1MZW5ndGgAVHJhbnNmZXItRW5jb2RpbmcgY2FuJ3QgYmUgcHJlc2VudCB3aXRoIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgY2h1bmsgc2l6ZQBFeHBlY3RlZCBMRiBhZnRlciBjaHVuayBzaXplAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBVbmV4cGVjdGVkIHdoaXRlc3BhY2UgYWZ0ZXIgaGVhZGVyIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgaGVhZGVyIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgTEYgYWZ0ZXIgaGVhZGVyIHZhbHVlAEludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYCBoZWFkZXIgdmFsdWUATWlzc2luZyBleHBlY3RlZCBDUiBhZnRlciBjaHVuayBleHRlbnNpb24gdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZSB2YWx1ZQBJbnZhbGlkIHF1b3RlZC1wYWlyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fcHJvdG9jb2xfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUATWlzc2luZyBleHBlY3RlZCBDUiBhZnRlciByZXNwb25zZSBsaW5lAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBuYW1lAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgY2h1bmsgZXh0ZW5zaW9uIG5hbWUASW52YWxpZCBzdGF0dXMgY29kZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABNaXNzaW5nIGV4cGVjdGVkIENSIGFmdGVyIGNodW5rIGRhdGEARXhwZWN0ZWQgTEYgYWZ0ZXIgY2h1bmsgZGF0YQBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AARGF0YSBhZnRlciBgQ29ubmVjdGlvbjogY2xvc2VgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBRVUVSWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAEV4cGVjdGVkIExGIGFmdGVyIENSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX1BST1RPQ09MX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19DT01QTEVURQBIUEVfQ0JfSEVBREVSX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9OQU1FX0NPTVBMRVRFAEhQRV9DQl9NRVNTQUdFX0NPTVBMRVRFAEhQRV9DQl9NRVRIT0RfQ09NUExFVEUASFBFX0NCX0hFQURFUl9GSUVMRF9DT01QTEVURQBERUxFVEUASFBFX0lOVkFMSURfRU9GX1NUQVRFAElOVkFMSURfU1NMX0NFUlRJRklDQVRFAFBBVVNFAE5PX1JFU1BPTlNFAFVOU1VQUE9SVEVEX01FRElBX1RZUEUAR09ORQBOT1RfQUNDRVBUQUJMRQBTRVJWSUNFX1VOQVZBSUxBQkxFAFJBTkdFX05PVF9TQVRJU0ZJQUJMRQBPUklHSU5fSVNfVU5SRUFDSEFCTEUAUkVTUE9OU0VfSVNfU1RBTEUAUFVSR0UATUVSR0UAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRQBSRVFVRVNUX0hFQURFUl9UT09fTEFSR0UAUEFZTE9BRF9UT09fTEFSR0UASU5TVUZGSUNJRU5UX1NUT1JBR0UASFBFX1BBVVNFRF9VUEdSQURFAEhQRV9QQVVTRURfSDJfVVBHUkFERQBTT1VSQ0UAQU5OT1VOQ0UAVFJBQ0UASFBFX1VORVhQRUNURURfU1BBQ0UAREVTQ1JJQkUAVU5TVUJTQ1JJQkUAUkVDT1JEAEhQRV9JTlZBTElEX01FVEhPRABOT1RfRk9VTkQAUFJPUEZJTkQAVU5CSU5EAFJFQklORABVTkFVVEhPUklaRUQATUVUSE9EX05PVF9BTExPV0VEAEhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEAEFMUkVBRFlfUkVQT1JURUQAQUNDRVBURUQATk9UX0lNUExFTUVOVEVEAExPT1BfREVURUNURUQASFBFX0NSX0VYUEVDVEVEAEhQRV9MRl9FWFBFQ1RFRABDUkVBVEVEAElNX1VTRUQASFBFX1BBVVNFRABUSU1FT1VUX09DQ1VSRUQAUEFZTUVOVF9SRVFVSVJFRABQUkVDT05ESVRJT05fUkVRVUlSRUQAUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATkVUV09SS19BVVRIRU5USUNBVElPTl9SRVFVSVJFRABMRU5HVEhfUkVRVUlSRUQAU1NMX0NFUlRJRklDQVRFX1JFUVVJUkVEAFVQR1JBREVfUkVRVUlSRUQAUEFHRV9FWFBJUkVEAFBSRUNPTkRJVElPTl9GQUlMRUQARVhQRUNUQVRJT05fRkFJTEVEAFJFVkFMSURBVElPTl9GQUlMRUQAU1NMX0hBTkRTSEFLRV9GQUlMRUQATE9DS0VEAFRSQU5TRk9STUFUSU9OX0FQUExJRUQATk9UX01PRElGSUVEAE5PVF9FWFRFTkRFRABCQU5EV0lEVEhfTElNSVRfRVhDRUVERUQAU0lURV9JU19PVkVSTE9BREVEAEhFQUQARXhwZWN0ZWQgSFRUUC8sIFJUU1AvIG9yIElDRS8A5xUAAK8VAACkEgAAkhoAACYWAACeFAAA2xkAAHkVAAB+EgAA/hQAADYVAAALFgAA2BYAAPMSAABCGAAArBYAABIVAAAUFwAA7xcAAEgUAABxFwAAshoAAGsZAAB+GQAANRQAAIIaAABEFwAA/RYAAB4YAACHFwAAqhkAAJMSAAAHGAAALBcAAMoXAACkFwAA5xUAAOcVAABYFwAAOxgAAKASAAAtHAAAwxEAAEgRAADeEgAAQhMAAKQZAAD9EAAA9xUAAKUVAADvFgAA+BkAAEoWAABWFgAA9RUAAAoaAAAIGgAAARoAAKsVAABCEgAA1xAAAEwRAAAFGQAAVBYAAB4RAADKGQAAyBkAAE4WAAD/GAAAcRQAAPAVAADuFQAAlBkAAPwVAAC/GQAAmxkAAHwUAABDEQAAcBgAAJUUAAAnFAAAGRQAANUSAADUGQAARBYAAPcQAEG5OwsBAQBB0DsL4AEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBuj0LBAEAAAIAQdE9C14DBAMDAwMDAAADAwADAwADAwMDAwMDAwMDAAUAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAwADAEG6PwsEAQAAAgBB0T8LXgMAAwMDAwMAAAMDAAMDAAMDAwMDAwMDAwMABAAFAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwADAAMAQbDBAAsNbG9zZWVlcC1hbGl2ZQBBycEACwEBAEHgwQAL4AEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBycMACwEBAEHgwwAL5wEBAQEBAQEBAQEBAQECAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAWNodW5rZWQAQfHFAAteAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQBB0McACyFlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AQYDIAAsgcmFuc2Zlci1lbmNvZGluZ3BncmFkZQ0KDQpTTQ0KDQoAQanIAAsFAQIAAQMAQcDIAAtfBAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAQanKAAsFAQIAAQMAQcDKAAtfBAUFBgUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAQanMAAsEAQAAAQBBwcwAC14CAgACAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAEGpzgALBQECAAEDAEHAzgALXwQFAAAFBQUFBQUFBQUFBQYFBQUFBQUFBQUFBQUABQAHCAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQAFAAUABQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAAAAFAEGp0AALBQEBAAEBAEHA0AALAQEAQdrQAAtBAgAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQanSAAsFAQEAAQEAQcDSAAsBAQBBytIACwYCAAAAAAIAQeHSAAs6AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBBoNQAC50BTk9VTkNFRUNLT1VUTkVDVEVURUNSSUJFTFVTSEVURUFEU0VBUkNIUkdFQ1RJVklUWUxFTkRBUlZFT1RJRllQVElPTlNDSFNFQVlTVEFUQ0hHRVVFUllPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFVFRQQ0VUU1BBRFRQLw==';
|
|
27658
27898
|
|
|
@@ -28752,7 +28992,7 @@ function requireRuntimeFeatures () {
|
|
|
28752
28992
|
const lazyLoaders = {
|
|
28753
28993
|
__proto__: null,
|
|
28754
28994
|
'node:crypto': () => crypto,
|
|
28755
|
-
'node:sqlite': () => require$$1$
|
|
28995
|
+
'node:sqlite': () => require$$1$5,
|
|
28756
28996
|
'node:worker_threads': () => require$$2$4,
|
|
28757
28997
|
'node:zlib': () => require$$3$4
|
|
28758
28998
|
};
|
|
@@ -29068,10 +29308,10 @@ function requireWebidl () {
|
|
|
29068
29308
|
} else {
|
|
29069
29309
|
// 3. Otherwise:
|
|
29070
29310
|
|
|
29071
|
-
// 1. Let lowerBound be -2^bitLength − 1.
|
|
29072
|
-
lowerBound = Math.pow(
|
|
29311
|
+
// 1. Let lowerBound be -2^(bitLength − 1).
|
|
29312
|
+
lowerBound = -Math.pow(2, bitLength - 1);
|
|
29073
29313
|
|
|
29074
|
-
// 2. Let upperBound be 2^bitLength − 1 − 1.
|
|
29314
|
+
// 2. Let upperBound be 2^(bitLength − 1) − 1.
|
|
29075
29315
|
upperBound = Math.pow(2, bitLength - 1) - 1;
|
|
29076
29316
|
}
|
|
29077
29317
|
|
|
@@ -29150,9 +29390,9 @@ function requireWebidl () {
|
|
|
29150
29390
|
// 10. Set x to x modulo 2^bitLength.
|
|
29151
29391
|
x = x % Math.pow(2, bitLength);
|
|
29152
29392
|
|
|
29153
|
-
// 11. If signedness is "signed" and x ≥ 2^bitLength − 1,
|
|
29393
|
+
// 11. If signedness is "signed" and x ≥ 2^(bitLength − 1),
|
|
29154
29394
|
// then return x − 2^bitLength.
|
|
29155
|
-
if (signedness === 'signed' && x >= Math.pow(2, bitLength
|
|
29395
|
+
if (signedness === 'signed' && x >= Math.pow(2, bitLength - 1)) {
|
|
29156
29396
|
return x - Math.pow(2, bitLength)
|
|
29157
29397
|
}
|
|
29158
29398
|
|
|
@@ -29330,6 +29570,9 @@ function requireWebidl () {
|
|
|
29330
29570
|
};
|
|
29331
29571
|
|
|
29332
29572
|
webidl.dictionaryConverter = function (converters) {
|
|
29573
|
+
// "For each dictionary member member declared on dictionary, in lexicographical order:"
|
|
29574
|
+
converters.sort((a, b) => (a.key > b.key) - (a.key < b.key));
|
|
29575
|
+
|
|
29333
29576
|
return (dictionary, prefix, argument) => {
|
|
29334
29577
|
const dict = {};
|
|
29335
29578
|
|
|
@@ -31335,8 +31578,10 @@ function requireUtil$4 () {
|
|
|
31335
31578
|
* @param {object|string} navigable
|
|
31336
31579
|
*/
|
|
31337
31580
|
function isTraversableNavigable (navigable) {
|
|
31338
|
-
//
|
|
31339
|
-
|
|
31581
|
+
// Returns true only if we have an actual traversable navigable object
|
|
31582
|
+
// that can prompt the user for credentials. In Node.js, this will always
|
|
31583
|
+
// be false since there's no Window object or navigable.
|
|
31584
|
+
return navigable != null && navigable !== 'client' && navigable !== 'no-traversable'
|
|
31340
31585
|
}
|
|
31341
31586
|
|
|
31342
31587
|
class EnvironmentSettingsObjectBase {
|
|
@@ -31687,10 +31932,10 @@ function requireFormdataParser () {
|
|
|
31687
31932
|
const { webidl } = requireWebidl();
|
|
31688
31933
|
const assert = require$$0$7;
|
|
31689
31934
|
const { isomorphicDecode } = requireInfra();
|
|
31690
|
-
const { utf8DecodeBytes } = requireEncoding$1();
|
|
31691
31935
|
|
|
31692
31936
|
const dd = Buffer.from('--');
|
|
31693
31937
|
const decoder = new TextDecoder();
|
|
31938
|
+
const decoderIgnoreBOM = new TextDecoder('utf-8', { ignoreBOM: true });
|
|
31694
31939
|
|
|
31695
31940
|
/**
|
|
31696
31941
|
* @param {string} chars
|
|
@@ -31869,7 +32114,7 @@ function requireFormdataParser () {
|
|
|
31869
32114
|
// 5.11. Otherwise:
|
|
31870
32115
|
|
|
31871
32116
|
// 5.11.1. Let value be the UTF-8 decoding without BOM of body.
|
|
31872
|
-
value =
|
|
32117
|
+
value = decoderIgnoreBOM.decode(Buffer.from(body));
|
|
31873
32118
|
}
|
|
31874
32119
|
|
|
31875
32120
|
// 5.12. Assert: name is a scalar value string and value is either a scalar value string or a File object.
|
|
@@ -31885,7 +32130,7 @@ function requireFormdataParser () {
|
|
|
31885
32130
|
* Parses content-disposition attributes (e.g., name="value" or filename*=utf-8''encoded)
|
|
31886
32131
|
* @param {Buffer} input
|
|
31887
32132
|
* @param {{ position: number }} position
|
|
31888
|
-
* @returns {{ name: string, value: string }}
|
|
32133
|
+
* @returns {{ name: string, value: string, extended: boolean } | null}
|
|
31889
32134
|
*/
|
|
31890
32135
|
function parseContentDispositionAttribute (input, position) {
|
|
31891
32136
|
// Skip leading semicolon and whitespace
|
|
@@ -31985,7 +32230,7 @@ function requireFormdataParser () {
|
|
|
31985
32230
|
value = decoder.decode(tokenValue);
|
|
31986
32231
|
}
|
|
31987
32232
|
|
|
31988
|
-
return { name: attrNameStr, value }
|
|
32233
|
+
return { name: attrNameStr, value, extended: isExtended }
|
|
31989
32234
|
}
|
|
31990
32235
|
|
|
31991
32236
|
/**
|
|
@@ -32049,6 +32294,9 @@ function requireFormdataParser () {
|
|
|
32049
32294
|
switch (bufferToLowerCasedHeaderName(headerName)) {
|
|
32050
32295
|
case 'content-disposition': {
|
|
32051
32296
|
name = filename = null;
|
|
32297
|
+
// Track whether filename was set from the extended (RFC 5987) form so
|
|
32298
|
+
// a subsequent legacy `filename` attribute does not override it.
|
|
32299
|
+
let filenameIsExtended = false;
|
|
32052
32300
|
|
|
32053
32301
|
// Collect the disposition type (should be "form-data")
|
|
32054
32302
|
const dispositionType = collectASequenceOfBytes(
|
|
@@ -32064,8 +32312,8 @@ function requireFormdataParser () {
|
|
|
32064
32312
|
// Parse attributes recursively until CRLF
|
|
32065
32313
|
while (
|
|
32066
32314
|
position.position < input.length &&
|
|
32067
|
-
input[position.position] !== 0x0d
|
|
32068
|
-
input[position.position + 1] !== 0x0a
|
|
32315
|
+
(input[position.position] !== 0x0d ||
|
|
32316
|
+
input[position.position + 1] !== 0x0a)
|
|
32069
32317
|
) {
|
|
32070
32318
|
const attribute = parseContentDispositionAttribute(input, position);
|
|
32071
32319
|
|
|
@@ -32076,7 +32324,15 @@ function requireFormdataParser () {
|
|
|
32076
32324
|
if (attribute.name === 'name') {
|
|
32077
32325
|
name = attribute.value;
|
|
32078
32326
|
} else if (attribute.name === 'filename') {
|
|
32079
|
-
|
|
32327
|
+
// Per RFC 5987 §4.1, when both legacy and extended forms of the
|
|
32328
|
+
// same parameter are present, the extended (filename*) form takes
|
|
32329
|
+
// precedence regardless of the order they appear in.
|
|
32330
|
+
if (attribute.extended) {
|
|
32331
|
+
filename = attribute.value;
|
|
32332
|
+
filenameIsExtended = true;
|
|
32333
|
+
} else if (!filenameIsExtended) {
|
|
32334
|
+
filename = attribute.value;
|
|
32335
|
+
}
|
|
32080
32336
|
}
|
|
32081
32337
|
}
|
|
32082
32338
|
|
|
@@ -32129,7 +32385,7 @@ function requireFormdataParser () {
|
|
|
32129
32385
|
|
|
32130
32386
|
// 2.9. If position does not point to a sequence of bytes starting with 0x0D 0x0A
|
|
32131
32387
|
// (CR LF), return failure. Otherwise, advance position by 2 (past the newline).
|
|
32132
|
-
if (input[position.position] !== 0x0d
|
|
32388
|
+
if (input[position.position] !== 0x0d || input[position.position + 1] !== 0x0a) {
|
|
32133
32389
|
throw parsingError('expected CRLF')
|
|
32134
32390
|
} else {
|
|
32135
32391
|
position.position += 2;
|
|
@@ -32874,6 +33130,9 @@ function requireClientH1 () {
|
|
|
32874
33130
|
const EMPTY_BUF = Buffer.alloc(0);
|
|
32875
33131
|
const FastBuffer = Buffer[Symbol.species];
|
|
32876
33132
|
const removeAllListeners = util.removeAllListeners;
|
|
33133
|
+
const kIdleSocketValidation = Symbol('kIdleSocketValidation');
|
|
33134
|
+
const kIdleSocketValidationTimeout = Symbol('kIdleSocketValidationTimeout');
|
|
33135
|
+
const kSocketUsed = Symbol('kSocketUsed');
|
|
32877
33136
|
|
|
32878
33137
|
let extractBody;
|
|
32879
33138
|
|
|
@@ -32886,9 +33145,9 @@ function requireClientH1 () {
|
|
|
32886
33145
|
let useWasmSIMD = process.arch !== 'ppc64';
|
|
32887
33146
|
// The Env Variable UNDICI_NO_WASM_SIMD allows explicitly overriding the default behavior
|
|
32888
33147
|
if (process.env.UNDICI_NO_WASM_SIMD === '1') {
|
|
32889
|
-
useWasmSIMD = true;
|
|
32890
|
-
} else if (process.env.UNDICI_NO_WASM_SIMD === '0') {
|
|
32891
33148
|
useWasmSIMD = false;
|
|
33149
|
+
} else if (process.env.UNDICI_NO_WASM_SIMD === '0') {
|
|
33150
|
+
useWasmSIMD = true;
|
|
32892
33151
|
}
|
|
32893
33152
|
|
|
32894
33153
|
if (useWasmSIMD) {
|
|
@@ -33033,6 +33292,7 @@ function requireClientH1 () {
|
|
|
33033
33292
|
*/
|
|
33034
33293
|
this.socket = socket;
|
|
33035
33294
|
this.timeout = null;
|
|
33295
|
+
this.timeoutWeakRef = new WeakRef(this);
|
|
33036
33296
|
this.timeoutValue = null;
|
|
33037
33297
|
this.timeoutType = null;
|
|
33038
33298
|
this.statusCode = 0;
|
|
@@ -33070,9 +33330,9 @@ function requireClientH1 () {
|
|
|
33070
33330
|
|
|
33071
33331
|
if (delay) {
|
|
33072
33332
|
if (type & USE_FAST_TIMER) {
|
|
33073
|
-
this.timeout = timers.setFastTimeout(onParserTimeout, delay,
|
|
33333
|
+
this.timeout = timers.setFastTimeout(onParserTimeout, delay, this.timeoutWeakRef);
|
|
33074
33334
|
} else {
|
|
33075
|
-
this.timeout = setTimeout(onParserTimeout, delay,
|
|
33335
|
+
this.timeout = setTimeout(onParserTimeout, delay, this.timeoutWeakRef);
|
|
33076
33336
|
this.timeout?.unref();
|
|
33077
33337
|
}
|
|
33078
33338
|
}
|
|
@@ -33166,16 +33426,7 @@ function requireClientH1 () {
|
|
|
33166
33426
|
this.paused = true;
|
|
33167
33427
|
socket.unshift(data);
|
|
33168
33428
|
} else {
|
|
33169
|
-
|
|
33170
|
-
let message = '';
|
|
33171
|
-
if (ptr) {
|
|
33172
|
-
const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0);
|
|
33173
|
-
message =
|
|
33174
|
-
'Response does not match the HTTP/1.1 protocol (' +
|
|
33175
|
-
Buffer.from(llhttp.memory.buffer, ptr, len).toString() +
|
|
33176
|
-
')';
|
|
33177
|
-
}
|
|
33178
|
-
throw new HTTPParserError(message, constants.ERROR[ret], data)
|
|
33429
|
+
throw this.createError(ret, data)
|
|
33179
33430
|
}
|
|
33180
33431
|
}
|
|
33181
33432
|
} catch (err) {
|
|
@@ -33183,6 +33434,54 @@ function requireClientH1 () {
|
|
|
33183
33434
|
}
|
|
33184
33435
|
}
|
|
33185
33436
|
|
|
33437
|
+
finish () {
|
|
33438
|
+
assert(currentParser === null);
|
|
33439
|
+
assert(this.ptr != null);
|
|
33440
|
+
assert(!this.paused);
|
|
33441
|
+
|
|
33442
|
+
const { llhttp } = this;
|
|
33443
|
+
|
|
33444
|
+
let ret;
|
|
33445
|
+
|
|
33446
|
+
try {
|
|
33447
|
+
currentParser = this;
|
|
33448
|
+
ret = llhttp.llhttp_finish(this.ptr);
|
|
33449
|
+
} finally {
|
|
33450
|
+
currentParser = null;
|
|
33451
|
+
}
|
|
33452
|
+
|
|
33453
|
+
if (ret === constants.ERROR.OK) {
|
|
33454
|
+
return null
|
|
33455
|
+
}
|
|
33456
|
+
|
|
33457
|
+
if (ret === constants.ERROR.PAUSED || ret === constants.ERROR.PAUSED_UPGRADE) {
|
|
33458
|
+
this.paused = true;
|
|
33459
|
+
return null
|
|
33460
|
+
}
|
|
33461
|
+
|
|
33462
|
+
return this.createError(ret, EMPTY_BUF)
|
|
33463
|
+
}
|
|
33464
|
+
|
|
33465
|
+
createError (ret, data) {
|
|
33466
|
+
const { llhttp, contentLength, bytesRead } = this;
|
|
33467
|
+
|
|
33468
|
+
if (contentLength && bytesRead !== parseInt(contentLength, 10)) {
|
|
33469
|
+
return new ResponseContentLengthMismatchError()
|
|
33470
|
+
}
|
|
33471
|
+
|
|
33472
|
+
const ptr = llhttp.llhttp_get_error_reason(this.ptr);
|
|
33473
|
+
let message = '';
|
|
33474
|
+
if (ptr) {
|
|
33475
|
+
const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0);
|
|
33476
|
+
message =
|
|
33477
|
+
'Response does not match the HTTP/1.1 protocol (' +
|
|
33478
|
+
Buffer.from(llhttp.memory.buffer, ptr, len).toString() +
|
|
33479
|
+
')';
|
|
33480
|
+
}
|
|
33481
|
+
|
|
33482
|
+
return new HTTPParserError(message, constants.ERROR[ret], data)
|
|
33483
|
+
}
|
|
33484
|
+
|
|
33186
33485
|
destroy () {
|
|
33187
33486
|
assert(currentParser === null);
|
|
33188
33487
|
assert(this.ptr != null);
|
|
@@ -33217,6 +33516,11 @@ function requireClientH1 () {
|
|
|
33217
33516
|
return -1
|
|
33218
33517
|
}
|
|
33219
33518
|
|
|
33519
|
+
if (client[kRunning] === 0) {
|
|
33520
|
+
util.destroy(socket, new SocketError('bad response', util.getSocketInfo(socket)));
|
|
33521
|
+
return -1
|
|
33522
|
+
}
|
|
33523
|
+
|
|
33220
33524
|
const request = client[kQueue][client[kRunningIdx]];
|
|
33221
33525
|
if (!request) {
|
|
33222
33526
|
return -1
|
|
@@ -33345,6 +33649,11 @@ function requireClientH1 () {
|
|
|
33345
33649
|
return -1
|
|
33346
33650
|
}
|
|
33347
33651
|
|
|
33652
|
+
if (client[kRunning] === 0) {
|
|
33653
|
+
util.destroy(socket, new SocketError('bad response', util.getSocketInfo(socket)));
|
|
33654
|
+
return -1
|
|
33655
|
+
}
|
|
33656
|
+
|
|
33348
33657
|
const request = client[kQueue][client[kRunningIdx]];
|
|
33349
33658
|
|
|
33350
33659
|
if (!request) {
|
|
@@ -33523,6 +33832,7 @@ function requireClientH1 () {
|
|
|
33523
33832
|
request.onComplete(headers);
|
|
33524
33833
|
|
|
33525
33834
|
client[kQueue][client[kRunningIdx]++] = null;
|
|
33835
|
+
socket[kSocketUsed] = client[kPending] === 0;
|
|
33526
33836
|
|
|
33527
33837
|
if (socket[kWriting]) {
|
|
33528
33838
|
assert(client[kRunning] === 0);
|
|
@@ -33599,6 +33909,9 @@ function requireClientH1 () {
|
|
|
33599
33909
|
socket[kWriting] = false;
|
|
33600
33910
|
socket[kReset] = false;
|
|
33601
33911
|
socket[kBlocking] = false;
|
|
33912
|
+
socket[kIdleSocketValidation] = 0;
|
|
33913
|
+
socket[kIdleSocketValidationTimeout] = null;
|
|
33914
|
+
socket[kSocketUsed] = false;
|
|
33602
33915
|
socket[kParser] = new Parser(client, socket, llhttpInstance);
|
|
33603
33916
|
|
|
33604
33917
|
util.addListener(socket, 'error', onHttpSocketError);
|
|
@@ -33641,7 +33954,7 @@ function requireClientH1 () {
|
|
|
33641
33954
|
* @returns {boolean}
|
|
33642
33955
|
*/
|
|
33643
33956
|
busy (request) {
|
|
33644
|
-
if (socket[kWriting] || socket[kReset] || socket[kBlocking]) {
|
|
33957
|
+
if (socket[kWriting] || socket[kReset] || socket[kBlocking] || socket[kIdleSocketValidation] === 1) {
|
|
33645
33958
|
return true
|
|
33646
33959
|
}
|
|
33647
33960
|
|
|
@@ -33687,8 +34000,11 @@ function requireClientH1 () {
|
|
|
33687
34000
|
// On Mac OS, we get an ECONNRESET even if there is a full body to be forwarded
|
|
33688
34001
|
// to the user.
|
|
33689
34002
|
if (err.code === 'ECONNRESET' && parser.statusCode && !parser.shouldKeepAlive) {
|
|
33690
|
-
|
|
33691
|
-
|
|
34003
|
+
const parserErr = parser.finish();
|
|
34004
|
+
if (parserErr) {
|
|
34005
|
+
this[kError] = parserErr;
|
|
34006
|
+
this[kClient][kOnError](parserErr);
|
|
34007
|
+
}
|
|
33692
34008
|
return
|
|
33693
34009
|
}
|
|
33694
34010
|
|
|
@@ -33705,8 +34021,10 @@ function requireClientH1 () {
|
|
|
33705
34021
|
const parser = this[kParser];
|
|
33706
34022
|
|
|
33707
34023
|
if (parser.statusCode && !parser.shouldKeepAlive) {
|
|
33708
|
-
|
|
33709
|
-
|
|
34024
|
+
const parserErr = parser.finish();
|
|
34025
|
+
if (parserErr) {
|
|
34026
|
+
util.destroy(this, parserErr);
|
|
34027
|
+
}
|
|
33710
34028
|
return
|
|
33711
34029
|
}
|
|
33712
34030
|
|
|
@@ -33716,10 +34034,11 @@ function requireClientH1 () {
|
|
|
33716
34034
|
function onHttpSocketClose () {
|
|
33717
34035
|
const parser = this[kParser];
|
|
33718
34036
|
|
|
34037
|
+
clearIdleSocketValidation(this);
|
|
34038
|
+
|
|
33719
34039
|
if (parser) {
|
|
33720
34040
|
if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) {
|
|
33721
|
-
|
|
33722
|
-
parser.onMessageComplete();
|
|
34041
|
+
this[kError] = parser.finish() || this[kError];
|
|
33723
34042
|
}
|
|
33724
34043
|
|
|
33725
34044
|
this[kParser].destroy();
|
|
@@ -33763,6 +34082,28 @@ function requireClientH1 () {
|
|
|
33763
34082
|
this[kClosed] = true;
|
|
33764
34083
|
}
|
|
33765
34084
|
|
|
34085
|
+
function clearIdleSocketValidation (socket) {
|
|
34086
|
+
if (socket[kIdleSocketValidationTimeout]) {
|
|
34087
|
+
clearTimeout(socket[kIdleSocketValidationTimeout]);
|
|
34088
|
+
socket[kIdleSocketValidationTimeout] = null;
|
|
34089
|
+
}
|
|
34090
|
+
|
|
34091
|
+
socket[kIdleSocketValidation] = 0;
|
|
34092
|
+
}
|
|
34093
|
+
|
|
34094
|
+
function scheduleIdleSocketValidation (client, socket) {
|
|
34095
|
+
socket[kIdleSocketValidation] = 1;
|
|
34096
|
+
socket[kIdleSocketValidationTimeout] = setTimeout(() => {
|
|
34097
|
+
socket[kIdleSocketValidationTimeout] = null;
|
|
34098
|
+
socket[kIdleSocketValidation] = 2;
|
|
34099
|
+
|
|
34100
|
+
if (client[kSocket] === socket && !socket.destroyed) {
|
|
34101
|
+
client[kResume]();
|
|
34102
|
+
}
|
|
34103
|
+
}, 0);
|
|
34104
|
+
socket[kIdleSocketValidationTimeout].unref?.();
|
|
34105
|
+
}
|
|
34106
|
+
|
|
33766
34107
|
/**
|
|
33767
34108
|
* @param {import('./client.js')} client
|
|
33768
34109
|
*/
|
|
@@ -33780,6 +34121,32 @@ function requireClientH1 () {
|
|
|
33780
34121
|
socket[kNoRef] = false;
|
|
33781
34122
|
}
|
|
33782
34123
|
|
|
34124
|
+
if (client[kRunning] === 0 && client[kPending] > 0 && socket[kSocketUsed]) {
|
|
34125
|
+
if (socket[kIdleSocketValidation] === 0) {
|
|
34126
|
+
scheduleIdleSocketValidation(client, socket);
|
|
34127
|
+
socket[kParser].readMore();
|
|
34128
|
+
if (socket.destroyed) {
|
|
34129
|
+
return
|
|
34130
|
+
}
|
|
34131
|
+
return
|
|
34132
|
+
}
|
|
34133
|
+
|
|
34134
|
+
if (socket[kIdleSocketValidation] === 1) {
|
|
34135
|
+
socket[kParser].readMore();
|
|
34136
|
+
if (socket.destroyed) {
|
|
34137
|
+
return
|
|
34138
|
+
}
|
|
34139
|
+
return
|
|
34140
|
+
}
|
|
34141
|
+
}
|
|
34142
|
+
|
|
34143
|
+
if (client[kRunning] === 0) {
|
|
34144
|
+
socket[kParser].readMore();
|
|
34145
|
+
if (socket.destroyed) {
|
|
34146
|
+
return
|
|
34147
|
+
}
|
|
34148
|
+
}
|
|
34149
|
+
|
|
33783
34150
|
if (client[kSize] === 0) {
|
|
33784
34151
|
if (socket[kParser].timeoutType !== TIMEOUT_KEEP_ALIVE) {
|
|
33785
34152
|
socket[kParser].setTimeout(client[kKeepAliveTimeoutValue], TIMEOUT_KEEP_ALIVE);
|
|
@@ -33878,6 +34245,7 @@ function requireClientH1 () {
|
|
|
33878
34245
|
}
|
|
33879
34246
|
|
|
33880
34247
|
const socket = client[kSocket];
|
|
34248
|
+
clearIdleSocketValidation(socket);
|
|
33881
34249
|
|
|
33882
34250
|
/**
|
|
33883
34251
|
* @param {Error} [err]
|
|
@@ -33931,6 +34299,10 @@ function requireClientH1 () {
|
|
|
33931
34299
|
socket[kBlocking] = true;
|
|
33932
34300
|
}
|
|
33933
34301
|
|
|
34302
|
+
if (socket.setTypeOfService) {
|
|
34303
|
+
socket.setTypeOfService(request.typeOfService);
|
|
34304
|
+
}
|
|
34305
|
+
|
|
33934
34306
|
let header = `${method} ${path} HTTP/1.1\r\n`;
|
|
33935
34307
|
|
|
33936
34308
|
if (typeof host === 'string') {
|
|
@@ -35131,12 +35503,16 @@ function requireClientH2 () {
|
|
|
35131
35503
|
if (request.onHeaders(Number(statusCode), parseH2Headers(realHeaders), stream.resume.bind(stream), '') === false) {
|
|
35132
35504
|
stream.pause();
|
|
35133
35505
|
}
|
|
35134
|
-
});
|
|
35135
35506
|
|
|
35136
|
-
|
|
35137
|
-
|
|
35138
|
-
|
|
35139
|
-
|
|
35507
|
+
stream.on('data', (chunk) => {
|
|
35508
|
+
if (request.aborted || request.completed) {
|
|
35509
|
+
return
|
|
35510
|
+
}
|
|
35511
|
+
|
|
35512
|
+
if (request.onData(chunk) === false) {
|
|
35513
|
+
stream.pause();
|
|
35514
|
+
}
|
|
35515
|
+
});
|
|
35140
35516
|
});
|
|
35141
35517
|
|
|
35142
35518
|
stream.once('end', () => {
|
|
@@ -35198,6 +35574,7 @@ function requireClientH2 () {
|
|
|
35198
35574
|
return
|
|
35199
35575
|
}
|
|
35200
35576
|
|
|
35577
|
+
stream.removeAllListeners('data');
|
|
35201
35578
|
request.onComplete(trailers);
|
|
35202
35579
|
});
|
|
35203
35580
|
|
|
@@ -35430,7 +35807,7 @@ function requireClient () {
|
|
|
35430
35807
|
hasRequiredClient = 1;
|
|
35431
35808
|
|
|
35432
35809
|
const assert = require$$0$7;
|
|
35433
|
-
const net = require$$
|
|
35810
|
+
const net = require$$1$4;
|
|
35434
35811
|
const http = require$$2$3;
|
|
35435
35812
|
const util = requireUtil$5();
|
|
35436
35813
|
const { ClientStats } = requireStats();
|
|
@@ -35498,7 +35875,7 @@ function requireClient () {
|
|
|
35498
35875
|
? () => http.maxHeaderSize
|
|
35499
35876
|
: () => { throw new InvalidArgumentError('http module not available or http.maxHeaderSize invalid') };
|
|
35500
35877
|
|
|
35501
|
-
const noop = () => {};
|
|
35878
|
+
const noop = () => { };
|
|
35502
35879
|
|
|
35503
35880
|
function getPipelining (client) {
|
|
35504
35881
|
return client[kPipelining] ?? client[kHTTPContext]?.defaultPipelining ?? 1
|
|
@@ -35543,7 +35920,8 @@ function requireClient () {
|
|
|
35543
35920
|
useH2c,
|
|
35544
35921
|
initialWindowSize,
|
|
35545
35922
|
connectionWindowSize,
|
|
35546
|
-
pingInterval
|
|
35923
|
+
pingInterval,
|
|
35924
|
+
webSocket
|
|
35547
35925
|
} = {}) {
|
|
35548
35926
|
if (keepAlive !== undefined) {
|
|
35549
35927
|
throw new InvalidArgumentError('unsupported keepAlive, use pipelining=0 instead')
|
|
@@ -35651,7 +36029,7 @@ function requireClient () {
|
|
|
35651
36029
|
throw new InvalidArgumentError('pingInterval must be a positive integer, greater or equal to 0')
|
|
35652
36030
|
}
|
|
35653
36031
|
|
|
35654
|
-
super();
|
|
36032
|
+
super({ webSocket });
|
|
35655
36033
|
|
|
35656
36034
|
if (typeof connect !== 'function') {
|
|
35657
36035
|
connect = buildConnector({
|
|
@@ -35664,6 +36042,13 @@ function requireClient () {
|
|
|
35664
36042
|
...(typeof autoSelectFamily === 'boolean' ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined),
|
|
35665
36043
|
...connect
|
|
35666
36044
|
});
|
|
36045
|
+
} else {
|
|
36046
|
+
const customConnect = connect;
|
|
36047
|
+
connect = (opts, callback) => customConnect({
|
|
36048
|
+
...opts,
|
|
36049
|
+
...(socketPath != null ? { socketPath } : null),
|
|
36050
|
+
...(allowH2 != null ? { allowH2 } : null)
|
|
36051
|
+
}, callback);
|
|
35667
36052
|
}
|
|
35668
36053
|
|
|
35669
36054
|
this[kUrl] = util.parseOrigin(url);
|
|
@@ -35876,65 +36261,70 @@ function requireClient () {
|
|
|
35876
36261
|
});
|
|
35877
36262
|
}
|
|
35878
36263
|
|
|
35879
|
-
|
|
35880
|
-
|
|
35881
|
-
|
|
35882
|
-
|
|
35883
|
-
|
|
35884
|
-
|
|
35885
|
-
|
|
35886
|
-
|
|
35887
|
-
|
|
35888
|
-
|
|
35889
|
-
|
|
35890
|
-
|
|
35891
|
-
|
|
36264
|
+
try {
|
|
36265
|
+
client[kConnector]({
|
|
36266
|
+
host,
|
|
36267
|
+
hostname,
|
|
36268
|
+
protocol,
|
|
36269
|
+
port,
|
|
36270
|
+
servername: client[kServerName],
|
|
36271
|
+
localAddress: client[kLocalAddress]
|
|
36272
|
+
}, (err, socket) => {
|
|
36273
|
+
if (err) {
|
|
36274
|
+
handleConnectError(client, err, { host, hostname, protocol, port });
|
|
36275
|
+
client[kResume]();
|
|
36276
|
+
return
|
|
36277
|
+
}
|
|
35892
36278
|
|
|
35893
|
-
|
|
35894
|
-
|
|
35895
|
-
|
|
35896
|
-
|
|
35897
|
-
|
|
36279
|
+
if (client.destroyed) {
|
|
36280
|
+
util.destroy(socket.on('error', noop), new ClientDestroyedError());
|
|
36281
|
+
client[kResume]();
|
|
36282
|
+
return
|
|
36283
|
+
}
|
|
35898
36284
|
|
|
35899
|
-
|
|
36285
|
+
assert(socket);
|
|
35900
36286
|
|
|
35901
|
-
|
|
35902
|
-
|
|
35903
|
-
|
|
35904
|
-
|
|
35905
|
-
|
|
35906
|
-
|
|
35907
|
-
|
|
35908
|
-
|
|
35909
|
-
|
|
35910
|
-
|
|
36287
|
+
try {
|
|
36288
|
+
client[kHTTPContext] = socket.alpnProtocol === 'h2'
|
|
36289
|
+
? connectH2(client, socket)
|
|
36290
|
+
: connectH1(client, socket);
|
|
36291
|
+
} catch (err) {
|
|
36292
|
+
socket.destroy().on('error', noop);
|
|
36293
|
+
handleConnectError(client, err, { host, hostname, protocol, port });
|
|
36294
|
+
client[kResume]();
|
|
36295
|
+
return
|
|
36296
|
+
}
|
|
35911
36297
|
|
|
35912
|
-
|
|
36298
|
+
client[kConnecting] = false;
|
|
35913
36299
|
|
|
35914
|
-
|
|
35915
|
-
|
|
35916
|
-
|
|
35917
|
-
|
|
36300
|
+
socket[kCounter] = 0;
|
|
36301
|
+
socket[kMaxRequests] = client[kMaxRequests];
|
|
36302
|
+
socket[kClient] = client;
|
|
36303
|
+
socket[kError] = null;
|
|
35918
36304
|
|
|
35919
|
-
|
|
35920
|
-
|
|
35921
|
-
|
|
35922
|
-
|
|
35923
|
-
|
|
35924
|
-
|
|
35925
|
-
|
|
35926
|
-
|
|
35927
|
-
|
|
35928
|
-
|
|
35929
|
-
|
|
35930
|
-
|
|
35931
|
-
|
|
35932
|
-
|
|
35933
|
-
|
|
36305
|
+
if (channels.connected.hasSubscribers) {
|
|
36306
|
+
channels.connected.publish({
|
|
36307
|
+
connectParams: {
|
|
36308
|
+
host,
|
|
36309
|
+
hostname,
|
|
36310
|
+
protocol,
|
|
36311
|
+
port,
|
|
36312
|
+
version: client[kHTTPContext]?.version,
|
|
36313
|
+
servername: client[kServerName],
|
|
36314
|
+
localAddress: client[kLocalAddress]
|
|
36315
|
+
},
|
|
36316
|
+
connector: client[kConnector],
|
|
36317
|
+
socket
|
|
36318
|
+
});
|
|
36319
|
+
}
|
|
35934
36320
|
|
|
35935
|
-
|
|
36321
|
+
client.emit('connect', client[kUrl], [client]);
|
|
36322
|
+
client[kResume]();
|
|
36323
|
+
});
|
|
36324
|
+
} catch (err) {
|
|
36325
|
+
handleConnectError(client, err, { host, hostname, protocol, port });
|
|
35936
36326
|
client[kResume]();
|
|
35937
|
-
}
|
|
36327
|
+
}
|
|
35938
36328
|
}
|
|
35939
36329
|
|
|
35940
36330
|
function handleConnectError (client, err, { host, hostname, protocol, port }) {
|
|
@@ -36034,6 +36424,10 @@ function requireClient () {
|
|
|
36034
36424
|
|
|
36035
36425
|
const request = client[kQueue][client[kPendingIdx]];
|
|
36036
36426
|
|
|
36427
|
+
if (request === null) {
|
|
36428
|
+
return
|
|
36429
|
+
}
|
|
36430
|
+
|
|
36037
36431
|
if (client[kUrl].protocol === 'https:' && client[kServerName] !== request.servername) {
|
|
36038
36432
|
if (client[kRunning] > 0) {
|
|
36039
36433
|
return
|
|
@@ -36510,11 +36904,11 @@ function requirePool () {
|
|
|
36510
36904
|
});
|
|
36511
36905
|
}
|
|
36512
36906
|
|
|
36513
|
-
super();
|
|
36907
|
+
super(options);
|
|
36514
36908
|
|
|
36515
36909
|
this[kConnections] = connections || null;
|
|
36516
36910
|
this[kUrl] = util.parseOrigin(origin);
|
|
36517
|
-
this[kOptions] = { ...util.deepClone(options), connect, allowH2, clientTtl };
|
|
36911
|
+
this[kOptions] = { ...util.deepClone(options), connect, allowH2, clientTtl, socketPath };
|
|
36518
36912
|
this[kOptions].interceptors = options.interceptors
|
|
36519
36913
|
? { ...options.interceptors }
|
|
36520
36914
|
: undefined;
|
|
@@ -36587,7 +36981,7 @@ function requireBalancedPool () {
|
|
|
36587
36981
|
} = requirePoolBase();
|
|
36588
36982
|
const Pool = requirePool();
|
|
36589
36983
|
const { kUrl } = requireSymbols();
|
|
36590
|
-
const
|
|
36984
|
+
const util = requireUtil$5();
|
|
36591
36985
|
const kFactory = Symbol('factory');
|
|
36592
36986
|
|
|
36593
36987
|
const kOptions = Symbol('options');
|
|
@@ -36627,9 +37021,12 @@ function requireBalancedPool () {
|
|
|
36627
37021
|
throw new InvalidArgumentError('factory must be a function.')
|
|
36628
37022
|
}
|
|
36629
37023
|
|
|
36630
|
-
super();
|
|
37024
|
+
super(opts);
|
|
36631
37025
|
|
|
36632
|
-
this[kOptions] = opts;
|
|
37026
|
+
this[kOptions] = { ...util.deepClone(opts) };
|
|
37027
|
+
this[kOptions].interceptors = opts.interceptors
|
|
37028
|
+
? { ...opts.interceptors }
|
|
37029
|
+
: undefined;
|
|
36633
37030
|
this[kIndex] = -1;
|
|
36634
37031
|
this[kCurrentWeight] = 0;
|
|
36635
37032
|
|
|
@@ -36649,7 +37046,7 @@ function requireBalancedPool () {
|
|
|
36649
37046
|
}
|
|
36650
37047
|
|
|
36651
37048
|
addUpstream (upstream) {
|
|
36652
|
-
const upstreamOrigin = parseOrigin(upstream).origin;
|
|
37049
|
+
const upstreamOrigin = util.parseOrigin(upstream).origin;
|
|
36653
37050
|
|
|
36654
37051
|
if (this[kClients].find((pool) => (
|
|
36655
37052
|
pool[kUrl].origin === upstreamOrigin &&
|
|
@@ -36658,7 +37055,7 @@ function requireBalancedPool () {
|
|
|
36658
37055
|
))) {
|
|
36659
37056
|
return this
|
|
36660
37057
|
}
|
|
36661
|
-
const pool = this[kFactory](upstreamOrigin,
|
|
37058
|
+
const pool = this[kFactory](upstreamOrigin, this[kOptions]);
|
|
36662
37059
|
|
|
36663
37060
|
this[kAddClient](pool);
|
|
36664
37061
|
pool.on('connect', () => {
|
|
@@ -36698,7 +37095,7 @@ function requireBalancedPool () {
|
|
|
36698
37095
|
}
|
|
36699
37096
|
|
|
36700
37097
|
removeUpstream (upstream) {
|
|
36701
|
-
const upstreamOrigin = parseOrigin(upstream).origin;
|
|
37098
|
+
const upstreamOrigin = util.parseOrigin(upstream).origin;
|
|
36702
37099
|
|
|
36703
37100
|
const pool = this[kClients].find((pool) => (
|
|
36704
37101
|
pool[kUrl].origin === upstreamOrigin &&
|
|
@@ -36714,7 +37111,7 @@ function requireBalancedPool () {
|
|
|
36714
37111
|
}
|
|
36715
37112
|
|
|
36716
37113
|
getUpstream (upstream) {
|
|
36717
|
-
const upstreamOrigin = parseOrigin(upstream).origin;
|
|
37114
|
+
const upstreamOrigin = util.parseOrigin(upstream).origin;
|
|
36718
37115
|
|
|
36719
37116
|
return this[kClients].find((pool) => (
|
|
36720
37117
|
pool[kUrl].origin === upstreamOrigin &&
|
|
@@ -36865,7 +37262,7 @@ function requireRoundRobinPool () {
|
|
|
36865
37262
|
|
|
36866
37263
|
this[kConnections] = connections || null;
|
|
36867
37264
|
this[kUrl] = util.parseOrigin(origin);
|
|
36868
|
-
this[kOptions] = { ...util.deepClone(options), connect, allowH2, clientTtl };
|
|
37265
|
+
this[kOptions] = { ...util.deepClone(options), connect, allowH2, clientTtl, socketPath };
|
|
36869
37266
|
this[kOptions].interceptors = options.interceptors
|
|
36870
37267
|
? { ...options.interceptors }
|
|
36871
37268
|
: undefined;
|
|
@@ -36977,7 +37374,7 @@ function requireAgent () {
|
|
|
36977
37374
|
throw new InvalidArgumentError('maxOrigins must be a number greater than 0')
|
|
36978
37375
|
}
|
|
36979
37376
|
|
|
36980
|
-
super();
|
|
37377
|
+
super(options);
|
|
36981
37378
|
|
|
36982
37379
|
if (connect && typeof connect !== 'function') {
|
|
36983
37380
|
connect = { ...connect };
|
|
@@ -37101,6 +37498,924 @@ function requireAgent () {
|
|
|
37101
37498
|
return agent;
|
|
37102
37499
|
}
|
|
37103
37500
|
|
|
37501
|
+
var socks5Utils;
|
|
37502
|
+
var hasRequiredSocks5Utils;
|
|
37503
|
+
|
|
37504
|
+
function requireSocks5Utils () {
|
|
37505
|
+
if (hasRequiredSocks5Utils) return socks5Utils;
|
|
37506
|
+
hasRequiredSocks5Utils = 1;
|
|
37507
|
+
|
|
37508
|
+
const { Buffer } = require$$0$a;
|
|
37509
|
+
const net = require$$1$4;
|
|
37510
|
+
const { InvalidArgumentError } = requireErrors();
|
|
37511
|
+
|
|
37512
|
+
/**
|
|
37513
|
+
* Parse an address and determine its type
|
|
37514
|
+
* @param {string} address - The address to parse
|
|
37515
|
+
* @returns {{type: number, buffer: Buffer}} Address type and buffer
|
|
37516
|
+
*/
|
|
37517
|
+
function parseAddress (address) {
|
|
37518
|
+
// Check if it's an IPv4 address
|
|
37519
|
+
if (net.isIPv4(address)) {
|
|
37520
|
+
const parts = address.split('.').map(Number);
|
|
37521
|
+
return {
|
|
37522
|
+
type: 0x01, // IPv4
|
|
37523
|
+
buffer: Buffer.from(parts)
|
|
37524
|
+
}
|
|
37525
|
+
}
|
|
37526
|
+
|
|
37527
|
+
// Check if it's an IPv6 address
|
|
37528
|
+
if (net.isIPv6(address)) {
|
|
37529
|
+
return {
|
|
37530
|
+
type: 0x04, // IPv6
|
|
37531
|
+
buffer: parseIPv6(address)
|
|
37532
|
+
}
|
|
37533
|
+
}
|
|
37534
|
+
|
|
37535
|
+
// Otherwise, treat as domain name
|
|
37536
|
+
const domainBuffer = Buffer.from(address, 'utf8');
|
|
37537
|
+
if (domainBuffer.length > 255) {
|
|
37538
|
+
throw new InvalidArgumentError('Domain name too long (max 255 bytes)')
|
|
37539
|
+
}
|
|
37540
|
+
|
|
37541
|
+
return {
|
|
37542
|
+
type: 0x03, // Domain
|
|
37543
|
+
buffer: Buffer.concat([Buffer.from([domainBuffer.length]), domainBuffer])
|
|
37544
|
+
}
|
|
37545
|
+
}
|
|
37546
|
+
|
|
37547
|
+
/**
|
|
37548
|
+
* Parse IPv6 address to buffer
|
|
37549
|
+
* @param {string} address - IPv6 address string
|
|
37550
|
+
* @returns {Buffer} 16-byte buffer
|
|
37551
|
+
*/
|
|
37552
|
+
function parseIPv6 (address) {
|
|
37553
|
+
const buffer = Buffer.alloc(16);
|
|
37554
|
+
let normalizedAddress = address;
|
|
37555
|
+
|
|
37556
|
+
// Expand an embedded IPv4 tail into the last two IPv6 groups.
|
|
37557
|
+
if (address.includes('.')) {
|
|
37558
|
+
const lastColonIndex = address.lastIndexOf(':');
|
|
37559
|
+
const ipv4Part = address.slice(lastColonIndex + 1);
|
|
37560
|
+
|
|
37561
|
+
if (net.isIPv4(ipv4Part)) {
|
|
37562
|
+
const octets = ipv4Part.split('.').map(Number);
|
|
37563
|
+
const high = ((octets[0] << 8) | octets[1]).toString(16);
|
|
37564
|
+
const low = ((octets[2] << 8) | octets[3]).toString(16);
|
|
37565
|
+
normalizedAddress = `${address.slice(0, lastColonIndex)}:${high}:${low}`;
|
|
37566
|
+
}
|
|
37567
|
+
}
|
|
37568
|
+
|
|
37569
|
+
// Handle compressed notation (::)
|
|
37570
|
+
const doubleColonIndex = normalizedAddress.indexOf('::');
|
|
37571
|
+
if (doubleColonIndex !== -1) {
|
|
37572
|
+
const before = normalizedAddress.slice(0, doubleColonIndex);
|
|
37573
|
+
const after = normalizedAddress.slice(doubleColonIndex + 2);
|
|
37574
|
+
const beforeParts = before === '' ? [] : before.split(':');
|
|
37575
|
+
const afterParts = after === '' ? [] : after.split(':');
|
|
37576
|
+
|
|
37577
|
+
let bufferIndex = 0;
|
|
37578
|
+
for (const part of beforeParts) {
|
|
37579
|
+
buffer.writeUInt16BE(parseInt(part, 16), bufferIndex);
|
|
37580
|
+
bufferIndex += 2;
|
|
37581
|
+
}
|
|
37582
|
+
bufferIndex = 16 - afterParts.length * 2;
|
|
37583
|
+
for (const part of afterParts) {
|
|
37584
|
+
buffer.writeUInt16BE(parseInt(part, 16), bufferIndex);
|
|
37585
|
+
bufferIndex += 2;
|
|
37586
|
+
}
|
|
37587
|
+
} else {
|
|
37588
|
+
const parts = normalizedAddress.split(':');
|
|
37589
|
+
for (let i = 0; i < parts.length; i++) {
|
|
37590
|
+
buffer.writeUInt16BE(parseInt(parts[i], 16), i * 2);
|
|
37591
|
+
}
|
|
37592
|
+
}
|
|
37593
|
+
|
|
37594
|
+
return buffer
|
|
37595
|
+
}
|
|
37596
|
+
|
|
37597
|
+
/**
|
|
37598
|
+
* Build a SOCKS5 address buffer
|
|
37599
|
+
* @param {number} type - Address type (1=IPv4, 3=Domain, 4=IPv6)
|
|
37600
|
+
* @param {Buffer} addressBuffer - The address data
|
|
37601
|
+
* @param {number} port - Port number
|
|
37602
|
+
* @returns {Buffer} Complete address buffer including type, address, and port
|
|
37603
|
+
*/
|
|
37604
|
+
function buildAddressBuffer (type, addressBuffer, port) {
|
|
37605
|
+
const portBuffer = Buffer.allocUnsafe(2);
|
|
37606
|
+
portBuffer.writeUInt16BE(port, 0);
|
|
37607
|
+
|
|
37608
|
+
return Buffer.concat([
|
|
37609
|
+
Buffer.from([type]),
|
|
37610
|
+
addressBuffer,
|
|
37611
|
+
portBuffer
|
|
37612
|
+
])
|
|
37613
|
+
}
|
|
37614
|
+
|
|
37615
|
+
/**
|
|
37616
|
+
* Parse address from SOCKS5 response
|
|
37617
|
+
* @param {Buffer} buffer - Buffer containing the address
|
|
37618
|
+
* @param {number} offset - Starting offset in buffer
|
|
37619
|
+
* @returns {{address: string, port: number, bytesRead: number}}
|
|
37620
|
+
*/
|
|
37621
|
+
function parseResponseAddress (buffer, offset = 0) {
|
|
37622
|
+
if (buffer.length < offset + 1) {
|
|
37623
|
+
throw new InvalidArgumentError('Buffer too small to contain address type')
|
|
37624
|
+
}
|
|
37625
|
+
|
|
37626
|
+
const addressType = buffer[offset];
|
|
37627
|
+
let address;
|
|
37628
|
+
let currentOffset = offset + 1;
|
|
37629
|
+
|
|
37630
|
+
switch (addressType) {
|
|
37631
|
+
case 0x01: { // IPv4
|
|
37632
|
+
if (buffer.length < currentOffset + 6) {
|
|
37633
|
+
throw new InvalidArgumentError('Buffer too small for IPv4 address')
|
|
37634
|
+
}
|
|
37635
|
+
address = Array.from(buffer.subarray(currentOffset, currentOffset + 4)).join('.');
|
|
37636
|
+
currentOffset += 4;
|
|
37637
|
+
break
|
|
37638
|
+
}
|
|
37639
|
+
|
|
37640
|
+
case 0x03: { // Domain
|
|
37641
|
+
if (buffer.length < currentOffset + 1) {
|
|
37642
|
+
throw new InvalidArgumentError('Buffer too small for domain length')
|
|
37643
|
+
}
|
|
37644
|
+
const domainLength = buffer[currentOffset];
|
|
37645
|
+
currentOffset += 1;
|
|
37646
|
+
|
|
37647
|
+
if (buffer.length < currentOffset + domainLength + 2) {
|
|
37648
|
+
throw new InvalidArgumentError('Buffer too small for domain address')
|
|
37649
|
+
}
|
|
37650
|
+
address = buffer.subarray(currentOffset, currentOffset + domainLength).toString('utf8');
|
|
37651
|
+
currentOffset += domainLength;
|
|
37652
|
+
break
|
|
37653
|
+
}
|
|
37654
|
+
|
|
37655
|
+
case 0x04: { // IPv6
|
|
37656
|
+
if (buffer.length < currentOffset + 18) {
|
|
37657
|
+
throw new InvalidArgumentError('Buffer too small for IPv6 address')
|
|
37658
|
+
}
|
|
37659
|
+
// Convert buffer to IPv6 string
|
|
37660
|
+
const parts = [];
|
|
37661
|
+
for (let i = 0; i < 8; i++) {
|
|
37662
|
+
const value = buffer.readUInt16BE(currentOffset + i * 2);
|
|
37663
|
+
parts.push(value.toString(16));
|
|
37664
|
+
}
|
|
37665
|
+
address = parts.join(':');
|
|
37666
|
+
currentOffset += 16;
|
|
37667
|
+
break
|
|
37668
|
+
}
|
|
37669
|
+
|
|
37670
|
+
default:
|
|
37671
|
+
throw new InvalidArgumentError(`Invalid address type: ${addressType}`)
|
|
37672
|
+
}
|
|
37673
|
+
|
|
37674
|
+
// Parse port
|
|
37675
|
+
if (buffer.length < currentOffset + 2) {
|
|
37676
|
+
throw new InvalidArgumentError('Buffer too small for port')
|
|
37677
|
+
}
|
|
37678
|
+
const port = buffer.readUInt16BE(currentOffset);
|
|
37679
|
+
currentOffset += 2;
|
|
37680
|
+
|
|
37681
|
+
return {
|
|
37682
|
+
address,
|
|
37683
|
+
port,
|
|
37684
|
+
bytesRead: currentOffset - offset
|
|
37685
|
+
}
|
|
37686
|
+
}
|
|
37687
|
+
|
|
37688
|
+
/**
|
|
37689
|
+
* Create error for SOCKS5 reply code
|
|
37690
|
+
* @param {number} replyCode - SOCKS5 reply code
|
|
37691
|
+
* @returns {Error} Appropriate error object
|
|
37692
|
+
*/
|
|
37693
|
+
function createReplyError (replyCode) {
|
|
37694
|
+
const messages = {
|
|
37695
|
+
0x01: 'General SOCKS server failure',
|
|
37696
|
+
0x02: 'Connection not allowed by ruleset',
|
|
37697
|
+
0x03: 'Network unreachable',
|
|
37698
|
+
0x04: 'Host unreachable',
|
|
37699
|
+
0x05: 'Connection refused',
|
|
37700
|
+
0x06: 'TTL expired',
|
|
37701
|
+
0x07: 'Command not supported',
|
|
37702
|
+
0x08: 'Address type not supported'
|
|
37703
|
+
};
|
|
37704
|
+
|
|
37705
|
+
const message = messages[replyCode] || `Unknown SOCKS5 error code: ${replyCode}`;
|
|
37706
|
+
const error = new Error(message);
|
|
37707
|
+
error.code = `SOCKS5_${replyCode}`;
|
|
37708
|
+
return error
|
|
37709
|
+
}
|
|
37710
|
+
|
|
37711
|
+
socks5Utils = {
|
|
37712
|
+
parseAddress,
|
|
37713
|
+
parseIPv6,
|
|
37714
|
+
buildAddressBuffer,
|
|
37715
|
+
parseResponseAddress,
|
|
37716
|
+
createReplyError
|
|
37717
|
+
};
|
|
37718
|
+
return socks5Utils;
|
|
37719
|
+
}
|
|
37720
|
+
|
|
37721
|
+
var socks5Client;
|
|
37722
|
+
var hasRequiredSocks5Client;
|
|
37723
|
+
|
|
37724
|
+
function requireSocks5Client () {
|
|
37725
|
+
if (hasRequiredSocks5Client) return socks5Client;
|
|
37726
|
+
hasRequiredSocks5Client = 1;
|
|
37727
|
+
|
|
37728
|
+
const { EventEmitter } = require$$0$5;
|
|
37729
|
+
const { Buffer } = require$$0$a;
|
|
37730
|
+
const { InvalidArgumentError, Socks5ProxyError } = requireErrors();
|
|
37731
|
+
const { debuglog } = require$$3$3;
|
|
37732
|
+
const { parseAddress } = requireSocks5Utils();
|
|
37733
|
+
|
|
37734
|
+
const debug = debuglog('undici:socks5');
|
|
37735
|
+
const EMPTY_BUFFER = Buffer.alloc(0);
|
|
37736
|
+
|
|
37737
|
+
// SOCKS5 constants
|
|
37738
|
+
const SOCKS_VERSION = 0x05;
|
|
37739
|
+
|
|
37740
|
+
// Authentication methods
|
|
37741
|
+
const AUTH_METHODS = {
|
|
37742
|
+
NO_AUTH: 0x00,
|
|
37743
|
+
GSSAPI: 0x01,
|
|
37744
|
+
USERNAME_PASSWORD: 0x02,
|
|
37745
|
+
NO_ACCEPTABLE: 0xFF
|
|
37746
|
+
};
|
|
37747
|
+
|
|
37748
|
+
// SOCKS5 commands
|
|
37749
|
+
const COMMANDS = {
|
|
37750
|
+
CONNECT: 0x01,
|
|
37751
|
+
BIND: 0x02,
|
|
37752
|
+
UDP_ASSOCIATE: 0x03
|
|
37753
|
+
};
|
|
37754
|
+
|
|
37755
|
+
// Address types
|
|
37756
|
+
const ADDRESS_TYPES = {
|
|
37757
|
+
IPV4: 0x01,
|
|
37758
|
+
DOMAIN: 0x03,
|
|
37759
|
+
IPV6: 0x04
|
|
37760
|
+
};
|
|
37761
|
+
|
|
37762
|
+
// Reply codes
|
|
37763
|
+
const REPLY_CODES = {
|
|
37764
|
+
SUCCEEDED: 0x00,
|
|
37765
|
+
GENERAL_FAILURE: 0x01,
|
|
37766
|
+
CONNECTION_NOT_ALLOWED: 0x02,
|
|
37767
|
+
NETWORK_UNREACHABLE: 0x03,
|
|
37768
|
+
HOST_UNREACHABLE: 0x04,
|
|
37769
|
+
CONNECTION_REFUSED: 0x05,
|
|
37770
|
+
TTL_EXPIRED: 0x06,
|
|
37771
|
+
COMMAND_NOT_SUPPORTED: 0x07,
|
|
37772
|
+
ADDRESS_TYPE_NOT_SUPPORTED: 0x08
|
|
37773
|
+
};
|
|
37774
|
+
|
|
37775
|
+
// State machine states
|
|
37776
|
+
const STATES = {
|
|
37777
|
+
INITIAL: 'initial',
|
|
37778
|
+
HANDSHAKING: 'handshaking',
|
|
37779
|
+
AUTHENTICATING: 'authenticating',
|
|
37780
|
+
AUTHENTICATED: 'authenticated',
|
|
37781
|
+
CONNECTING: 'connecting',
|
|
37782
|
+
CONNECTED: 'connected',
|
|
37783
|
+
ERROR: 'error',
|
|
37784
|
+
CLOSED: 'closed'
|
|
37785
|
+
};
|
|
37786
|
+
|
|
37787
|
+
/**
|
|
37788
|
+
* SOCKS5 client implementation
|
|
37789
|
+
* Handles SOCKS5 protocol negotiation and connection establishment
|
|
37790
|
+
*/
|
|
37791
|
+
class Socks5Client extends EventEmitter {
|
|
37792
|
+
constructor (socket, options = {}) {
|
|
37793
|
+
super();
|
|
37794
|
+
|
|
37795
|
+
if (!socket) {
|
|
37796
|
+
throw new InvalidArgumentError('socket is required')
|
|
37797
|
+
}
|
|
37798
|
+
|
|
37799
|
+
this.socket = socket;
|
|
37800
|
+
this.options = options;
|
|
37801
|
+
this.state = STATES.INITIAL;
|
|
37802
|
+
this.buffer = EMPTY_BUFFER;
|
|
37803
|
+
this.onSocketData = this.onData.bind(this);
|
|
37804
|
+
this.onSocketError = this.onError.bind(this);
|
|
37805
|
+
this.onSocketClose = this.onClose.bind(this);
|
|
37806
|
+
|
|
37807
|
+
// Authentication settings
|
|
37808
|
+
this.authMethods = [];
|
|
37809
|
+
if (options.username && options.password) {
|
|
37810
|
+
this.authMethods.push(AUTH_METHODS.USERNAME_PASSWORD);
|
|
37811
|
+
}
|
|
37812
|
+
this.authMethods.push(AUTH_METHODS.NO_AUTH);
|
|
37813
|
+
|
|
37814
|
+
// Socket event handlers
|
|
37815
|
+
this.socket.on('data', this.onSocketData);
|
|
37816
|
+
this.socket.on('error', this.onSocketError);
|
|
37817
|
+
this.socket.on('close', this.onSocketClose);
|
|
37818
|
+
}
|
|
37819
|
+
|
|
37820
|
+
/**
|
|
37821
|
+
* Handle incoming data from the socket
|
|
37822
|
+
*/
|
|
37823
|
+
onData (data) {
|
|
37824
|
+
debug('received data', data.length, 'bytes in state', this.state);
|
|
37825
|
+
this.buffer = Buffer.concat([this.buffer, data]);
|
|
37826
|
+
|
|
37827
|
+
try {
|
|
37828
|
+
switch (this.state) {
|
|
37829
|
+
case STATES.HANDSHAKING:
|
|
37830
|
+
this.handleHandshakeResponse();
|
|
37831
|
+
break
|
|
37832
|
+
case STATES.AUTHENTICATING:
|
|
37833
|
+
this.handleAuthResponse();
|
|
37834
|
+
break
|
|
37835
|
+
case STATES.CONNECTING:
|
|
37836
|
+
this.handleConnectResponse();
|
|
37837
|
+
break
|
|
37838
|
+
}
|
|
37839
|
+
} catch (err) {
|
|
37840
|
+
this.onError(err);
|
|
37841
|
+
}
|
|
37842
|
+
}
|
|
37843
|
+
|
|
37844
|
+
/**
|
|
37845
|
+
* Handle socket errors
|
|
37846
|
+
*/
|
|
37847
|
+
onError (err) {
|
|
37848
|
+
debug('socket error', err);
|
|
37849
|
+
this.state = STATES.ERROR;
|
|
37850
|
+
this.emit('error', err);
|
|
37851
|
+
this.destroy();
|
|
37852
|
+
}
|
|
37853
|
+
|
|
37854
|
+
/**
|
|
37855
|
+
* Handle socket close
|
|
37856
|
+
*/
|
|
37857
|
+
onClose () {
|
|
37858
|
+
debug('socket closed');
|
|
37859
|
+
this.state = STATES.CLOSED;
|
|
37860
|
+
this.emit('close');
|
|
37861
|
+
}
|
|
37862
|
+
|
|
37863
|
+
/**
|
|
37864
|
+
* Destroy the client and underlying socket
|
|
37865
|
+
*/
|
|
37866
|
+
destroy () {
|
|
37867
|
+
if (this.socket && !this.socket.destroyed) {
|
|
37868
|
+
this.socket.destroy();
|
|
37869
|
+
}
|
|
37870
|
+
}
|
|
37871
|
+
|
|
37872
|
+
markAuthenticated () {
|
|
37873
|
+
this.state = STATES.AUTHENTICATED;
|
|
37874
|
+
this.emit('authenticated');
|
|
37875
|
+
}
|
|
37876
|
+
|
|
37877
|
+
/**
|
|
37878
|
+
* Start the SOCKS5 handshake
|
|
37879
|
+
*/
|
|
37880
|
+
handshake () {
|
|
37881
|
+
if (this.state !== STATES.INITIAL) {
|
|
37882
|
+
throw new InvalidArgumentError('Handshake already started')
|
|
37883
|
+
}
|
|
37884
|
+
|
|
37885
|
+
debug('starting handshake with', this.authMethods.length, 'auth methods');
|
|
37886
|
+
this.state = STATES.HANDSHAKING;
|
|
37887
|
+
|
|
37888
|
+
// Build handshake request
|
|
37889
|
+
// +----+----------+----------+
|
|
37890
|
+
// |VER | NMETHODS | METHODS |
|
|
37891
|
+
// +----+----------+----------+
|
|
37892
|
+
// | 1 | 1 | 1 to 255 |
|
|
37893
|
+
// +----+----------+----------+
|
|
37894
|
+
const request = Buffer.alloc(2 + this.authMethods.length);
|
|
37895
|
+
request[0] = SOCKS_VERSION;
|
|
37896
|
+
request[1] = this.authMethods.length;
|
|
37897
|
+
this.authMethods.forEach((method, i) => {
|
|
37898
|
+
request[2 + i] = method;
|
|
37899
|
+
});
|
|
37900
|
+
|
|
37901
|
+
this.socket.write(request);
|
|
37902
|
+
}
|
|
37903
|
+
|
|
37904
|
+
/**
|
|
37905
|
+
* Handle handshake response from server
|
|
37906
|
+
*/
|
|
37907
|
+
handleHandshakeResponse () {
|
|
37908
|
+
if (this.buffer.length < 2) {
|
|
37909
|
+
return // Not enough data yet
|
|
37910
|
+
}
|
|
37911
|
+
|
|
37912
|
+
const version = this.buffer[0];
|
|
37913
|
+
const method = this.buffer[1];
|
|
37914
|
+
|
|
37915
|
+
if (version !== SOCKS_VERSION) {
|
|
37916
|
+
throw new Socks5ProxyError(`Invalid SOCKS version: ${version}`, 'UND_ERR_SOCKS5_VERSION')
|
|
37917
|
+
}
|
|
37918
|
+
|
|
37919
|
+
if (method === AUTH_METHODS.NO_ACCEPTABLE) {
|
|
37920
|
+
throw new Socks5ProxyError('No acceptable authentication method', 'UND_ERR_SOCKS5_AUTH_REJECTED')
|
|
37921
|
+
}
|
|
37922
|
+
|
|
37923
|
+
this.buffer = this.buffer.subarray(2);
|
|
37924
|
+
debug('server selected auth method', method);
|
|
37925
|
+
|
|
37926
|
+
if (method === AUTH_METHODS.NO_AUTH) {
|
|
37927
|
+
this.markAuthenticated();
|
|
37928
|
+
} else if (method === AUTH_METHODS.USERNAME_PASSWORD) {
|
|
37929
|
+
this.state = STATES.AUTHENTICATING;
|
|
37930
|
+
this.sendAuthRequest();
|
|
37931
|
+
} else {
|
|
37932
|
+
throw new Socks5ProxyError(`Unsupported authentication method: ${method}`, 'UND_ERR_SOCKS5_AUTH_METHOD')
|
|
37933
|
+
}
|
|
37934
|
+
}
|
|
37935
|
+
|
|
37936
|
+
/**
|
|
37937
|
+
* Send username/password authentication request
|
|
37938
|
+
*/
|
|
37939
|
+
sendAuthRequest () {
|
|
37940
|
+
const { username, password } = this.options;
|
|
37941
|
+
|
|
37942
|
+
if (!username || !password) {
|
|
37943
|
+
throw new InvalidArgumentError('Username and password required for authentication')
|
|
37944
|
+
}
|
|
37945
|
+
|
|
37946
|
+
debug('sending username/password auth');
|
|
37947
|
+
|
|
37948
|
+
// Username/Password authentication request (RFC 1929)
|
|
37949
|
+
// +----+------+----------+------+----------+
|
|
37950
|
+
// |VER | ULEN | UNAME | PLEN | PASSWD |
|
|
37951
|
+
// +----+------+----------+------+----------+
|
|
37952
|
+
// | 1 | 1 | 1 to 255 | 1 | 1 to 255 |
|
|
37953
|
+
// +----+------+----------+------+----------+
|
|
37954
|
+
const usernameBuffer = Buffer.from(username);
|
|
37955
|
+
const passwordBuffer = Buffer.from(password);
|
|
37956
|
+
|
|
37957
|
+
if (usernameBuffer.length > 255 || passwordBuffer.length > 255) {
|
|
37958
|
+
throw new InvalidArgumentError('Username or password too long')
|
|
37959
|
+
}
|
|
37960
|
+
|
|
37961
|
+
const request = Buffer.alloc(3 + usernameBuffer.length + passwordBuffer.length);
|
|
37962
|
+
request[0] = 0x01; // Sub-negotiation version
|
|
37963
|
+
request[1] = usernameBuffer.length;
|
|
37964
|
+
usernameBuffer.copy(request, 2);
|
|
37965
|
+
request[2 + usernameBuffer.length] = passwordBuffer.length;
|
|
37966
|
+
passwordBuffer.copy(request, 3 + usernameBuffer.length);
|
|
37967
|
+
|
|
37968
|
+
this.socket.write(request);
|
|
37969
|
+
}
|
|
37970
|
+
|
|
37971
|
+
/**
|
|
37972
|
+
* Handle authentication response
|
|
37973
|
+
*/
|
|
37974
|
+
handleAuthResponse () {
|
|
37975
|
+
if (this.buffer.length < 2) {
|
|
37976
|
+
return // Not enough data yet
|
|
37977
|
+
}
|
|
37978
|
+
|
|
37979
|
+
const version = this.buffer[0];
|
|
37980
|
+
const status = this.buffer[1];
|
|
37981
|
+
|
|
37982
|
+
if (version !== 0x01) {
|
|
37983
|
+
throw new Socks5ProxyError(`Invalid auth sub-negotiation version: ${version}`, 'UND_ERR_SOCKS5_AUTH_VERSION')
|
|
37984
|
+
}
|
|
37985
|
+
|
|
37986
|
+
if (status !== 0x00) {
|
|
37987
|
+
throw new Socks5ProxyError('Authentication failed', 'UND_ERR_SOCKS5_AUTH_FAILED')
|
|
37988
|
+
}
|
|
37989
|
+
|
|
37990
|
+
this.buffer = this.buffer.subarray(2);
|
|
37991
|
+
debug('authentication successful');
|
|
37992
|
+
this.markAuthenticated();
|
|
37993
|
+
}
|
|
37994
|
+
|
|
37995
|
+
/**
|
|
37996
|
+
* Send CONNECT command
|
|
37997
|
+
* @param {string} address - Target address (IP or domain)
|
|
37998
|
+
* @param {number} port - Target port
|
|
37999
|
+
*/
|
|
38000
|
+
connect (address, port) {
|
|
38001
|
+
if (this.state === STATES.CONNECTING || this.state === STATES.CONNECTED) {
|
|
38002
|
+
throw new InvalidArgumentError('Connection already in progress')
|
|
38003
|
+
}
|
|
38004
|
+
|
|
38005
|
+
if (this.state !== STATES.AUTHENTICATED) {
|
|
38006
|
+
throw new InvalidArgumentError('Client must be authenticated before CONNECT')
|
|
38007
|
+
}
|
|
38008
|
+
|
|
38009
|
+
debug('connecting to', address, port);
|
|
38010
|
+
this.state = STATES.CONNECTING;
|
|
38011
|
+
|
|
38012
|
+
const request = this.buildConnectRequest(COMMANDS.CONNECT, address, port);
|
|
38013
|
+
this.socket.write(request);
|
|
38014
|
+
}
|
|
38015
|
+
|
|
38016
|
+
/**
|
|
38017
|
+
* Build a SOCKS5 request
|
|
38018
|
+
*/
|
|
38019
|
+
buildConnectRequest (command, address, port) {
|
|
38020
|
+
// Parse address to determine type and buffer
|
|
38021
|
+
const { type: addressType, buffer: addressBuffer } = parseAddress(address);
|
|
38022
|
+
|
|
38023
|
+
// Build request
|
|
38024
|
+
// +----+-----+-------+------+----------+----------+
|
|
38025
|
+
// |VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |
|
|
38026
|
+
// +----+-----+-------+------+----------+----------+
|
|
38027
|
+
// | 1 | 1 | X'00' | 1 | Variable | 2 |
|
|
38028
|
+
// +----+-----+-------+------+----------+----------+
|
|
38029
|
+
const request = Buffer.alloc(4 + addressBuffer.length + 2);
|
|
38030
|
+
request[0] = SOCKS_VERSION;
|
|
38031
|
+
request[1] = command;
|
|
38032
|
+
request[2] = 0x00; // Reserved
|
|
38033
|
+
request[3] = addressType;
|
|
38034
|
+
addressBuffer.copy(request, 4);
|
|
38035
|
+
request.writeUInt16BE(port, 4 + addressBuffer.length);
|
|
38036
|
+
|
|
38037
|
+
return request
|
|
38038
|
+
}
|
|
38039
|
+
|
|
38040
|
+
/**
|
|
38041
|
+
* Handle CONNECT response
|
|
38042
|
+
*/
|
|
38043
|
+
handleConnectResponse () {
|
|
38044
|
+
if (this.buffer.length < 4) {
|
|
38045
|
+
return // Not enough data for header
|
|
38046
|
+
}
|
|
38047
|
+
|
|
38048
|
+
const version = this.buffer[0];
|
|
38049
|
+
const reply = this.buffer[1];
|
|
38050
|
+
const addressType = this.buffer[3];
|
|
38051
|
+
|
|
38052
|
+
if (version !== SOCKS_VERSION) {
|
|
38053
|
+
throw new Socks5ProxyError(`Invalid SOCKS version in reply: ${version}`, 'UND_ERR_SOCKS5_REPLY_VERSION')
|
|
38054
|
+
}
|
|
38055
|
+
|
|
38056
|
+
// Calculate the expected response length
|
|
38057
|
+
let responseLength = 4; // VER + REP + RSV + ATYP
|
|
38058
|
+
if (addressType === ADDRESS_TYPES.IPV4) {
|
|
38059
|
+
responseLength += 4 + 2; // IPv4 + port
|
|
38060
|
+
} else if (addressType === ADDRESS_TYPES.DOMAIN) {
|
|
38061
|
+
if (this.buffer.length < 5) {
|
|
38062
|
+
return // Need domain length byte
|
|
38063
|
+
}
|
|
38064
|
+
responseLength += 1 + this.buffer[4] + 2; // length byte + domain + port
|
|
38065
|
+
} else if (addressType === ADDRESS_TYPES.IPV6) {
|
|
38066
|
+
responseLength += 16 + 2; // IPv6 + port
|
|
38067
|
+
} else {
|
|
38068
|
+
throw new Socks5ProxyError(`Invalid address type in reply: ${addressType}`, 'UND_ERR_SOCKS5_ADDR_TYPE')
|
|
38069
|
+
}
|
|
38070
|
+
|
|
38071
|
+
if (this.buffer.length < responseLength) {
|
|
38072
|
+
return // Not enough data for full response
|
|
38073
|
+
}
|
|
38074
|
+
|
|
38075
|
+
if (reply !== REPLY_CODES.SUCCEEDED) {
|
|
38076
|
+
const errorMessage = this.getReplyErrorMessage(reply);
|
|
38077
|
+
throw new Socks5ProxyError(`SOCKS5 connection failed: ${errorMessage}`, `UND_ERR_SOCKS5_REPLY_${reply}`)
|
|
38078
|
+
}
|
|
38079
|
+
|
|
38080
|
+
// Parse bound address and port
|
|
38081
|
+
let boundAddress;
|
|
38082
|
+
let offset = 4;
|
|
38083
|
+
|
|
38084
|
+
if (addressType === ADDRESS_TYPES.IPV4) {
|
|
38085
|
+
boundAddress = Array.from(this.buffer.subarray(offset, offset + 4)).join('.');
|
|
38086
|
+
offset += 4;
|
|
38087
|
+
} else if (addressType === ADDRESS_TYPES.DOMAIN) {
|
|
38088
|
+
const domainLength = this.buffer[offset];
|
|
38089
|
+
offset += 1;
|
|
38090
|
+
boundAddress = this.buffer.subarray(offset, offset + domainLength).toString();
|
|
38091
|
+
offset += domainLength;
|
|
38092
|
+
} else if (addressType === ADDRESS_TYPES.IPV6) {
|
|
38093
|
+
// Parse IPv6 address from 16-byte buffer
|
|
38094
|
+
const parts = [];
|
|
38095
|
+
for (let i = 0; i < 8; i++) {
|
|
38096
|
+
const value = this.buffer.readUInt16BE(offset + i * 2);
|
|
38097
|
+
parts.push(value.toString(16));
|
|
38098
|
+
}
|
|
38099
|
+
boundAddress = parts.join(':');
|
|
38100
|
+
offset += 16;
|
|
38101
|
+
}
|
|
38102
|
+
|
|
38103
|
+
const boundPort = this.buffer.readUInt16BE(offset);
|
|
38104
|
+
|
|
38105
|
+
this.buffer = EMPTY_BUFFER;
|
|
38106
|
+
this.state = STATES.CONNECTED;
|
|
38107
|
+
this.socket.removeListener('data', this.onSocketData);
|
|
38108
|
+
|
|
38109
|
+
debug('connected, bound address:', boundAddress, 'port:', boundPort);
|
|
38110
|
+
this.emit('connected', { address: boundAddress, port: boundPort });
|
|
38111
|
+
}
|
|
38112
|
+
|
|
38113
|
+
/**
|
|
38114
|
+
* Get human-readable error message for reply code
|
|
38115
|
+
*/
|
|
38116
|
+
getReplyErrorMessage (reply) {
|
|
38117
|
+
switch (reply) {
|
|
38118
|
+
case REPLY_CODES.GENERAL_FAILURE:
|
|
38119
|
+
return 'General SOCKS server failure'
|
|
38120
|
+
case REPLY_CODES.CONNECTION_NOT_ALLOWED:
|
|
38121
|
+
return 'Connection not allowed by ruleset'
|
|
38122
|
+
case REPLY_CODES.NETWORK_UNREACHABLE:
|
|
38123
|
+
return 'Network unreachable'
|
|
38124
|
+
case REPLY_CODES.HOST_UNREACHABLE:
|
|
38125
|
+
return 'Host unreachable'
|
|
38126
|
+
case REPLY_CODES.CONNECTION_REFUSED:
|
|
38127
|
+
return 'Connection refused'
|
|
38128
|
+
case REPLY_CODES.TTL_EXPIRED:
|
|
38129
|
+
return 'TTL expired'
|
|
38130
|
+
case REPLY_CODES.COMMAND_NOT_SUPPORTED:
|
|
38131
|
+
return 'Command not supported'
|
|
38132
|
+
case REPLY_CODES.ADDRESS_TYPE_NOT_SUPPORTED:
|
|
38133
|
+
return 'Address type not supported'
|
|
38134
|
+
default:
|
|
38135
|
+
return `Unknown error code: ${reply}`
|
|
38136
|
+
}
|
|
38137
|
+
}
|
|
38138
|
+
}
|
|
38139
|
+
|
|
38140
|
+
socks5Client = {
|
|
38141
|
+
Socks5Client,
|
|
38142
|
+
AUTH_METHODS,
|
|
38143
|
+
COMMANDS,
|
|
38144
|
+
ADDRESS_TYPES,
|
|
38145
|
+
REPLY_CODES,
|
|
38146
|
+
STATES
|
|
38147
|
+
};
|
|
38148
|
+
return socks5Client;
|
|
38149
|
+
}
|
|
38150
|
+
|
|
38151
|
+
var socks5ProxyAgent;
|
|
38152
|
+
var hasRequiredSocks5ProxyAgent;
|
|
38153
|
+
|
|
38154
|
+
function requireSocks5ProxyAgent () {
|
|
38155
|
+
if (hasRequiredSocks5ProxyAgent) return socks5ProxyAgent;
|
|
38156
|
+
hasRequiredSocks5ProxyAgent = 1;
|
|
38157
|
+
|
|
38158
|
+
const { URL } = require$$0$b;
|
|
38159
|
+
|
|
38160
|
+
let tls; // include tls conditionally since it is not always available
|
|
38161
|
+
const DispatcherBase = requireDispatcherBase();
|
|
38162
|
+
const { InvalidArgumentError } = requireErrors();
|
|
38163
|
+
const { Socks5Client, STATES } = requireSocks5Client();
|
|
38164
|
+
const { kDispatch, kClose, kDestroy } = requireSymbols();
|
|
38165
|
+
const Pool = requirePool();
|
|
38166
|
+
const buildConnector = requireConnect();
|
|
38167
|
+
const { debuglog } = require$$3$3;
|
|
38168
|
+
|
|
38169
|
+
const debug = debuglog('undici:socks5-proxy');
|
|
38170
|
+
|
|
38171
|
+
const kProxyUrl = Symbol('proxy url');
|
|
38172
|
+
const kProxyHeaders = Symbol('proxy headers');
|
|
38173
|
+
const kProxyAuth = Symbol('proxy auth');
|
|
38174
|
+
const kProxyProtocol = Symbol('proxy protocol');
|
|
38175
|
+
const kPools = Symbol('pools');
|
|
38176
|
+
const kConnector = Symbol('connector');
|
|
38177
|
+
const kRequestTls = Symbol('request tls settings');
|
|
38178
|
+
|
|
38179
|
+
// Static flag to ensure warning is only emitted once per process
|
|
38180
|
+
let experimentalWarningEmitted = false;
|
|
38181
|
+
|
|
38182
|
+
/**
|
|
38183
|
+
* SOCKS5 proxy agent for dispatching requests through a SOCKS5 proxy
|
|
38184
|
+
*/
|
|
38185
|
+
class Socks5ProxyAgent extends DispatcherBase {
|
|
38186
|
+
constructor (proxyUrl, options = {}) {
|
|
38187
|
+
super();
|
|
38188
|
+
|
|
38189
|
+
// Emit experimental warning only once
|
|
38190
|
+
if (!experimentalWarningEmitted) {
|
|
38191
|
+
process.emitWarning(
|
|
38192
|
+
'SOCKS5 proxy support is experimental and subject to change',
|
|
38193
|
+
'ExperimentalWarning'
|
|
38194
|
+
);
|
|
38195
|
+
experimentalWarningEmitted = true;
|
|
38196
|
+
}
|
|
38197
|
+
|
|
38198
|
+
if (!proxyUrl) {
|
|
38199
|
+
throw new InvalidArgumentError('Proxy URL is mandatory')
|
|
38200
|
+
}
|
|
38201
|
+
|
|
38202
|
+
// Parse proxy URL
|
|
38203
|
+
const url = typeof proxyUrl === 'string' ? new URL(proxyUrl) : proxyUrl;
|
|
38204
|
+
|
|
38205
|
+
if (url.protocol !== 'socks5:' && url.protocol !== 'socks:') {
|
|
38206
|
+
throw new InvalidArgumentError('Proxy URL must use socks5:// or socks:// protocol')
|
|
38207
|
+
}
|
|
38208
|
+
|
|
38209
|
+
this[kProxyUrl] = url;
|
|
38210
|
+
this[kProxyHeaders] = options.headers || {};
|
|
38211
|
+
this[kProxyProtocol] = options.proxyTls ? 'https:' : 'http:';
|
|
38212
|
+
this[kRequestTls] = options.requestTls;
|
|
38213
|
+
|
|
38214
|
+
// Extract auth from URL or options
|
|
38215
|
+
this[kProxyAuth] = {
|
|
38216
|
+
username: options.username || (url.username ? decodeURIComponent(url.username) : null),
|
|
38217
|
+
password: options.password || (url.password ? decodeURIComponent(url.password) : null)
|
|
38218
|
+
};
|
|
38219
|
+
|
|
38220
|
+
// Create connector for proxy connection
|
|
38221
|
+
this[kConnector] = options.connect || buildConnector({
|
|
38222
|
+
...options.proxyTls,
|
|
38223
|
+
servername: options.proxyTls?.servername || url.hostname
|
|
38224
|
+
});
|
|
38225
|
+
|
|
38226
|
+
// Pools for the actual HTTP connections (with SOCKS5 tunnel connect function), keyed by origin
|
|
38227
|
+
this[kPools] = new Map();
|
|
38228
|
+
}
|
|
38229
|
+
|
|
38230
|
+
/**
|
|
38231
|
+
* Create a SOCKS5 connection to the proxy
|
|
38232
|
+
*/
|
|
38233
|
+
async createSocks5Connection (targetHost, targetPort) {
|
|
38234
|
+
const proxyHost = this[kProxyUrl].hostname;
|
|
38235
|
+
const proxyPort = parseInt(this[kProxyUrl].port) || 1080;
|
|
38236
|
+
|
|
38237
|
+
debug('creating SOCKS5 connection to', proxyHost, proxyPort);
|
|
38238
|
+
|
|
38239
|
+
// Connect to the SOCKS5 proxy
|
|
38240
|
+
const socket = await new Promise((resolve, reject) => {
|
|
38241
|
+
this[kConnector]({
|
|
38242
|
+
hostname: proxyHost,
|
|
38243
|
+
host: proxyHost,
|
|
38244
|
+
port: proxyPort,
|
|
38245
|
+
protocol: this[kProxyProtocol]
|
|
38246
|
+
}, (err, socket) => {
|
|
38247
|
+
if (err) {
|
|
38248
|
+
reject(err);
|
|
38249
|
+
} else {
|
|
38250
|
+
resolve(socket);
|
|
38251
|
+
}
|
|
38252
|
+
});
|
|
38253
|
+
});
|
|
38254
|
+
|
|
38255
|
+
// Create SOCKS5 client
|
|
38256
|
+
const socks5Client = new Socks5Client(socket, this[kProxyAuth]);
|
|
38257
|
+
|
|
38258
|
+
// Handle SOCKS5 errors
|
|
38259
|
+
socks5Client.on('error', (err) => {
|
|
38260
|
+
debug('SOCKS5 error:', err);
|
|
38261
|
+
socket.destroy();
|
|
38262
|
+
});
|
|
38263
|
+
|
|
38264
|
+
// Perform SOCKS5 handshake
|
|
38265
|
+
await socks5Client.handshake();
|
|
38266
|
+
|
|
38267
|
+
// Wait for authentication (if required)
|
|
38268
|
+
await new Promise((resolve, reject) => {
|
|
38269
|
+
const timeout = setTimeout(() => {
|
|
38270
|
+
reject(new Error('SOCKS5 authentication timeout'));
|
|
38271
|
+
}, 5000);
|
|
38272
|
+
|
|
38273
|
+
const onAuthenticated = () => {
|
|
38274
|
+
clearTimeout(timeout);
|
|
38275
|
+
socks5Client.removeListener('error', onError);
|
|
38276
|
+
resolve();
|
|
38277
|
+
};
|
|
38278
|
+
|
|
38279
|
+
const onError = (err) => {
|
|
38280
|
+
clearTimeout(timeout);
|
|
38281
|
+
socks5Client.removeListener('authenticated', onAuthenticated);
|
|
38282
|
+
reject(err);
|
|
38283
|
+
};
|
|
38284
|
+
|
|
38285
|
+
// Check if already authenticated (for NO_AUTH method)
|
|
38286
|
+
if (socks5Client.state === STATES.AUTHENTICATED) {
|
|
38287
|
+
clearTimeout(timeout);
|
|
38288
|
+
resolve();
|
|
38289
|
+
} else {
|
|
38290
|
+
socks5Client.once('authenticated', onAuthenticated);
|
|
38291
|
+
socks5Client.once('error', onError);
|
|
38292
|
+
}
|
|
38293
|
+
});
|
|
38294
|
+
|
|
38295
|
+
// Send CONNECT command
|
|
38296
|
+
await socks5Client.connect(targetHost, targetPort);
|
|
38297
|
+
|
|
38298
|
+
// Wait for connection
|
|
38299
|
+
await new Promise((resolve, reject) => {
|
|
38300
|
+
const timeout = setTimeout(() => {
|
|
38301
|
+
reject(new Error('SOCKS5 connection timeout'));
|
|
38302
|
+
}, 5000);
|
|
38303
|
+
|
|
38304
|
+
const onConnected = (info) => {
|
|
38305
|
+
debug('SOCKS5 tunnel established to', targetHost, targetPort, 'via', info);
|
|
38306
|
+
clearTimeout(timeout);
|
|
38307
|
+
socks5Client.removeListener('error', onError);
|
|
38308
|
+
resolve();
|
|
38309
|
+
};
|
|
38310
|
+
|
|
38311
|
+
const onError = (err) => {
|
|
38312
|
+
clearTimeout(timeout);
|
|
38313
|
+
socks5Client.removeListener('connected', onConnected);
|
|
38314
|
+
reject(err);
|
|
38315
|
+
};
|
|
38316
|
+
|
|
38317
|
+
socks5Client.once('connected', onConnected);
|
|
38318
|
+
socks5Client.once('error', onError);
|
|
38319
|
+
});
|
|
38320
|
+
|
|
38321
|
+
return socket
|
|
38322
|
+
}
|
|
38323
|
+
|
|
38324
|
+
/**
|
|
38325
|
+
* Dispatch a request through the SOCKS5 proxy
|
|
38326
|
+
*/
|
|
38327
|
+
[kDispatch] (opts, handler) {
|
|
38328
|
+
const { origin } = opts;
|
|
38329
|
+
|
|
38330
|
+
debug('dispatching request to', origin, 'via SOCKS5');
|
|
38331
|
+
|
|
38332
|
+
try {
|
|
38333
|
+
const originKey = String(origin);
|
|
38334
|
+
let pool = this[kPools].get(originKey);
|
|
38335
|
+
// Create a Pool per origin so requests are not routed to the wrong host
|
|
38336
|
+
if (!pool || pool.destroyed || pool.closed) {
|
|
38337
|
+
pool = new Pool(origin, {
|
|
38338
|
+
pipelining: opts.pipelining,
|
|
38339
|
+
connections: opts.connections,
|
|
38340
|
+
connect: async (connectOpts, callback) => {
|
|
38341
|
+
try {
|
|
38342
|
+
const url = new URL(origin);
|
|
38343
|
+
const targetHost = url.hostname;
|
|
38344
|
+
const targetPort = parseInt(url.port) || (url.protocol === 'https:' ? 443 : 80);
|
|
38345
|
+
|
|
38346
|
+
debug('establishing SOCKS5 connection to', targetHost, targetPort);
|
|
38347
|
+
|
|
38348
|
+
// Create SOCKS5 tunnel
|
|
38349
|
+
const socket = await this.createSocks5Connection(targetHost, targetPort);
|
|
38350
|
+
|
|
38351
|
+
// Handle TLS if needed
|
|
38352
|
+
let finalSocket = socket;
|
|
38353
|
+
if (url.protocol === 'https:') {
|
|
38354
|
+
if (!tls) {
|
|
38355
|
+
tls = require('node:tls');
|
|
38356
|
+
}
|
|
38357
|
+
debug('upgrading to TLS');
|
|
38358
|
+
finalSocket = tls.connect({
|
|
38359
|
+
...this[kRequestTls],
|
|
38360
|
+
socket,
|
|
38361
|
+
servername: this[kRequestTls]?.servername || targetHost
|
|
38362
|
+
});
|
|
38363
|
+
|
|
38364
|
+
await new Promise((resolve, reject) => {
|
|
38365
|
+
finalSocket.once('secureConnect', resolve);
|
|
38366
|
+
finalSocket.once('error', reject);
|
|
38367
|
+
});
|
|
38368
|
+
}
|
|
38369
|
+
|
|
38370
|
+
callback(null, finalSocket);
|
|
38371
|
+
} catch (err) {
|
|
38372
|
+
debug('SOCKS5 connection error:', err);
|
|
38373
|
+
callback(err);
|
|
38374
|
+
}
|
|
38375
|
+
}
|
|
38376
|
+
});
|
|
38377
|
+
this[kPools].set(originKey, pool);
|
|
38378
|
+
}
|
|
38379
|
+
|
|
38380
|
+
// Dispatch the request through the per-origin pool
|
|
38381
|
+
return pool[kDispatch](opts, handler)
|
|
38382
|
+
} catch (err) {
|
|
38383
|
+
debug('dispatch error:', err);
|
|
38384
|
+
if (typeof handler.onResponseError === 'function') {
|
|
38385
|
+
handler.onResponseError(null, err);
|
|
38386
|
+
return false
|
|
38387
|
+
} else if (typeof handler.onError === 'function') {
|
|
38388
|
+
handler.onError(err);
|
|
38389
|
+
return false
|
|
38390
|
+
} else {
|
|
38391
|
+
throw err
|
|
38392
|
+
}
|
|
38393
|
+
}
|
|
38394
|
+
}
|
|
38395
|
+
|
|
38396
|
+
async [kClose] () {
|
|
38397
|
+
const closePromises = [];
|
|
38398
|
+
for (const pool of this[kPools].values()) {
|
|
38399
|
+
closePromises.push(pool.close());
|
|
38400
|
+
}
|
|
38401
|
+
this[kPools].clear();
|
|
38402
|
+
await Promise.all(closePromises);
|
|
38403
|
+
}
|
|
38404
|
+
|
|
38405
|
+
async [kDestroy] (err) {
|
|
38406
|
+
const destroyPromises = [];
|
|
38407
|
+
for (const pool of this[kPools].values()) {
|
|
38408
|
+
destroyPromises.push(pool.destroy(err));
|
|
38409
|
+
}
|
|
38410
|
+
this[kPools].clear();
|
|
38411
|
+
await Promise.all(destroyPromises);
|
|
38412
|
+
}
|
|
38413
|
+
}
|
|
38414
|
+
|
|
38415
|
+
socks5ProxyAgent = Socks5ProxyAgent;
|
|
38416
|
+
return socks5ProxyAgent;
|
|
38417
|
+
}
|
|
38418
|
+
|
|
37104
38419
|
var proxyAgent;
|
|
37105
38420
|
var hasRequiredProxyAgent;
|
|
37106
38421
|
|
|
@@ -37116,6 +38431,7 @@ function requireProxyAgent () {
|
|
|
37116
38431
|
const buildConnector = requireConnect();
|
|
37117
38432
|
const Client = requireClient();
|
|
37118
38433
|
const { channels } = requireDiagnostics();
|
|
38434
|
+
const Socks5ProxyAgent = requireSocks5ProxyAgent();
|
|
37119
38435
|
|
|
37120
38436
|
const kAgent = Symbol('proxy agent');
|
|
37121
38437
|
const kClient = Symbol('proxy client');
|
|
@@ -37240,6 +38556,20 @@ function requireProxyAgent () {
|
|
|
37240
38556
|
const agentFactory = opts.factory || defaultAgentFactory;
|
|
37241
38557
|
const factory = (origin, options) => {
|
|
37242
38558
|
const { protocol } = new URL(origin);
|
|
38559
|
+
|
|
38560
|
+
// Handle SOCKS5 proxy
|
|
38561
|
+
if (this[kProxy].protocol === 'socks5:' || this[kProxy].protocol === 'socks:') {
|
|
38562
|
+
return new Socks5ProxyAgent(this[kProxy].uri, {
|
|
38563
|
+
headers: this[kProxyHeaders],
|
|
38564
|
+
connect,
|
|
38565
|
+
factory: agentFactory,
|
|
38566
|
+
username: opts.username || username,
|
|
38567
|
+
password: opts.password || password,
|
|
38568
|
+
proxyTls: opts.proxyTls,
|
|
38569
|
+
requestTls: opts.requestTls
|
|
38570
|
+
})
|
|
38571
|
+
}
|
|
38572
|
+
|
|
37243
38573
|
if (!this[kTunnelProxy] && protocol === 'http:' && this[kProxy].protocol === 'http:') {
|
|
37244
38574
|
return new Http1ProxyWrapper(this[kProxy].uri, {
|
|
37245
38575
|
headers: this[kProxyHeaders],
|
|
@@ -37249,11 +38579,26 @@ function requireProxyAgent () {
|
|
|
37249
38579
|
}
|
|
37250
38580
|
return agentFactory(origin, options)
|
|
37251
38581
|
};
|
|
37252
|
-
|
|
38582
|
+
|
|
38583
|
+
// For SOCKS5 proxies, we don't need a client to the proxy itself
|
|
38584
|
+
// The SOCKS5 connection is handled within Socks5ProxyAgent
|
|
38585
|
+
if (protocol === 'socks5:' || protocol === 'socks:') {
|
|
38586
|
+
this[kClient] = null;
|
|
38587
|
+
} else {
|
|
38588
|
+
this[kClient] = clientFactory(url, { connect });
|
|
38589
|
+
}
|
|
38590
|
+
|
|
37253
38591
|
this[kAgent] = new Agent({
|
|
37254
38592
|
...opts,
|
|
37255
38593
|
factory,
|
|
37256
38594
|
connect: async (opts, callback) => {
|
|
38595
|
+
// SOCKS5 proxies handle their own connections via Socks5ProxyAgent,
|
|
38596
|
+
// so this connect function should never be called for them.
|
|
38597
|
+
if (!this[kClient]) {
|
|
38598
|
+
callback(new InvalidArgumentError('Cannot establish tunnel connection without a proxy client'));
|
|
38599
|
+
return
|
|
38600
|
+
}
|
|
38601
|
+
|
|
37257
38602
|
let requestedPath = opts.host;
|
|
37258
38603
|
if (!opts.port) {
|
|
37259
38604
|
requestedPath += `:${defaultProtocolPort(opts.protocol)}`;
|
|
@@ -37341,17 +38686,19 @@ function requireProxyAgent () {
|
|
|
37341
38686
|
}
|
|
37342
38687
|
|
|
37343
38688
|
[kClose] () {
|
|
37344
|
-
|
|
37345
|
-
|
|
37346
|
-
this[kClient].close()
|
|
37347
|
-
|
|
38689
|
+
const promises = [this[kAgent].close()];
|
|
38690
|
+
if (this[kClient]) {
|
|
38691
|
+
promises.push(this[kClient].close());
|
|
38692
|
+
}
|
|
38693
|
+
return Promise.all(promises)
|
|
37348
38694
|
}
|
|
37349
38695
|
|
|
37350
38696
|
[kDestroy] () {
|
|
37351
|
-
|
|
37352
|
-
|
|
37353
|
-
this[kClient].destroy()
|
|
37354
|
-
|
|
38697
|
+
const promises = [this[kAgent].destroy()];
|
|
38698
|
+
if (this[kClient]) {
|
|
38699
|
+
promises.push(this[kClient].destroy());
|
|
38700
|
+
}
|
|
38701
|
+
return Promise.all(promises)
|
|
37355
38702
|
}
|
|
37356
38703
|
}
|
|
37357
38704
|
|
|
@@ -38017,7 +39364,7 @@ function requireH2cClient () {
|
|
|
38017
39364
|
)
|
|
38018
39365
|
}
|
|
38019
39366
|
|
|
38020
|
-
const {
|
|
39367
|
+
const { maxConcurrentStreams, pipelining, ...opts } =
|
|
38021
39368
|
clientOpts ?? {};
|
|
38022
39369
|
let defaultMaxConcurrentStreams = 100;
|
|
38023
39370
|
let defaultPipelining = 100;
|
|
@@ -38653,7 +40000,7 @@ function requireApiRequest () {
|
|
|
38653
40000
|
hasRequiredApiRequest = 1;
|
|
38654
40001
|
|
|
38655
40002
|
const assert = require$$0$7;
|
|
38656
|
-
const { AsyncResource } = require$$1$
|
|
40003
|
+
const { AsyncResource } = require$$1$6;
|
|
38657
40004
|
const { Readable } = requireReadable();
|
|
38658
40005
|
const { InvalidArgumentError, RequestAbortedError } = requireErrors();
|
|
38659
40006
|
const util = requireUtil$5();
|
|
@@ -38673,7 +40020,7 @@ function requireApiRequest () {
|
|
|
38673
40020
|
throw new InvalidArgumentError('invalid callback')
|
|
38674
40021
|
}
|
|
38675
40022
|
|
|
38676
|
-
if (highWaterMark && (
|
|
40023
|
+
if (highWaterMark != null && (!Number.isFinite(highWaterMark) || highWaterMark < 0)) {
|
|
38677
40024
|
throw new InvalidArgumentError('invalid highWaterMark')
|
|
38678
40025
|
}
|
|
38679
40026
|
|
|
@@ -38943,7 +40290,7 @@ function requireApiStream () {
|
|
|
38943
40290
|
|
|
38944
40291
|
const assert = require$$0$7;
|
|
38945
40292
|
const { finished } = require$$0$8;
|
|
38946
|
-
const { AsyncResource } = require$$1$
|
|
40293
|
+
const { AsyncResource } = require$$1$6;
|
|
38947
40294
|
const { InvalidArgumentError, InvalidReturnValueError } = requireErrors();
|
|
38948
40295
|
const util = requireUtil$5();
|
|
38949
40296
|
const { addSignal, removeSignal } = requireAbortSignal();
|
|
@@ -39164,7 +40511,7 @@ function requireApiPipeline () {
|
|
|
39164
40511
|
PassThrough
|
|
39165
40512
|
} = require$$0$8;
|
|
39166
40513
|
const assert = require$$0$7;
|
|
39167
|
-
const { AsyncResource } = require$$1$
|
|
40514
|
+
const { AsyncResource } = require$$1$6;
|
|
39168
40515
|
const {
|
|
39169
40516
|
InvalidArgumentError,
|
|
39170
40517
|
InvalidReturnValueError,
|
|
@@ -39419,7 +40766,7 @@ function requireApiUpgrade () {
|
|
|
39419
40766
|
hasRequiredApiUpgrade = 1;
|
|
39420
40767
|
|
|
39421
40768
|
const { InvalidArgumentError, SocketError } = requireErrors();
|
|
39422
|
-
const { AsyncResource } = require$$1$
|
|
40769
|
+
const { AsyncResource } = require$$1$6;
|
|
39423
40770
|
const assert = require$$0$7;
|
|
39424
40771
|
const util = requireUtil$5();
|
|
39425
40772
|
const { kHTTP2Stream } = requireSymbols();
|
|
@@ -39538,7 +40885,7 @@ function requireApiConnect () {
|
|
|
39538
40885
|
hasRequiredApiConnect = 1;
|
|
39539
40886
|
|
|
39540
40887
|
const assert = require$$0$7;
|
|
39541
|
-
const { AsyncResource } = require$$1$
|
|
40888
|
+
const { AsyncResource } = require$$1$6;
|
|
39542
40889
|
const { InvalidArgumentError, SocketError } = requireErrors();
|
|
39543
40890
|
const util = requireUtil$5();
|
|
39544
40891
|
const { addSignal, removeSignal } = requireAbortSignal();
|
|
@@ -39733,7 +41080,8 @@ function requireMockSymbols () {
|
|
|
39733
41080
|
kMockAgentAddCallHistoryLog: Symbol('mock agent add call history log'),
|
|
39734
41081
|
kMockAgentIsCallHistoryEnabled: Symbol('mock agent is call history enabled'),
|
|
39735
41082
|
kMockAgentAcceptsNonStandardSearchParameters: Symbol('mock agent accepts non standard search parameters'),
|
|
39736
|
-
kMockCallHistoryAddLog: Symbol('mock call history add log')
|
|
41083
|
+
kMockCallHistoryAddLog: Symbol('mock call history add log'),
|
|
41084
|
+
kTotalDispatchCount: Symbol('total dispatch count')
|
|
39737
41085
|
};
|
|
39738
41086
|
return mockSymbols;
|
|
39739
41087
|
}
|
|
@@ -39751,7 +41099,8 @@ function requireMockUtils () {
|
|
|
39751
41099
|
kMockAgent,
|
|
39752
41100
|
kOriginalDispatch,
|
|
39753
41101
|
kOrigin,
|
|
39754
|
-
kGetNetConnect
|
|
41102
|
+
kGetNetConnect,
|
|
41103
|
+
kTotalDispatchCount
|
|
39755
41104
|
} = requireMockSymbols();
|
|
39756
41105
|
const { serializePathWithQuery } = requireUtil$5();
|
|
39757
41106
|
const { STATUS_CODES } = require$$2$3;
|
|
@@ -39951,6 +41300,8 @@ function requireMockUtils () {
|
|
|
39951
41300
|
const replyData = typeof data === 'function' ? { callback: data } : { ...data };
|
|
39952
41301
|
const newMockDispatch = { ...baseData, ...key, pending: true, data: { error: null, ...replyData } };
|
|
39953
41302
|
mockDispatches.push(newMockDispatch);
|
|
41303
|
+
// Track total number of intercepts ever registered for better error messages
|
|
41304
|
+
mockDispatches[kTotalDispatchCount] = (mockDispatches[kTotalDispatchCount] || 0) + 1;
|
|
39954
41305
|
return newMockDispatch
|
|
39955
41306
|
}
|
|
39956
41307
|
|
|
@@ -40146,13 +41497,16 @@ function requireMockUtils () {
|
|
|
40146
41497
|
} catch (error) {
|
|
40147
41498
|
if (error.code === 'UND_MOCK_ERR_MOCK_NOT_MATCHED') {
|
|
40148
41499
|
const netConnect = agent[kGetNetConnect]();
|
|
41500
|
+
const totalInterceptsCount = this[kDispatches][kTotalDispatchCount] || this[kDispatches].length;
|
|
41501
|
+
const pendingInterceptsCount = this[kDispatches].filter(({ consumed }) => !consumed).length;
|
|
41502
|
+
const interceptsMessage = `, ${pendingInterceptsCount} interceptor(s) remaining out of ${totalInterceptsCount} defined`;
|
|
40149
41503
|
if (netConnect === false) {
|
|
40150
|
-
throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect disabled)`)
|
|
41504
|
+
throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect disabled)${interceptsMessage}`)
|
|
40151
41505
|
}
|
|
40152
41506
|
if (checkNetConnect(netConnect, origin)) {
|
|
40153
41507
|
originalDispatch.call(this, opts, handler);
|
|
40154
41508
|
} else {
|
|
40155
|
-
throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect is not enabled for this origin)`)
|
|
41509
|
+
throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect is not enabled for this origin)${interceptsMessage}`)
|
|
40156
41510
|
}
|
|
40157
41511
|
} else {
|
|
40158
41512
|
throw error
|
|
@@ -40531,14 +41885,14 @@ function requireMockCallHistory () {
|
|
|
40531
41885
|
const { kMockCallHistoryAddLog } = requireMockSymbols();
|
|
40532
41886
|
const { InvalidArgumentError } = requireErrors();
|
|
40533
41887
|
|
|
40534
|
-
function handleFilterCallsWithOptions (criteria, options, handler, store) {
|
|
41888
|
+
function handleFilterCallsWithOptions (criteria, options, handler, store, allLogs) {
|
|
40535
41889
|
switch (options.operator) {
|
|
40536
41890
|
case 'OR':
|
|
40537
|
-
store.push(...handler(criteria));
|
|
41891
|
+
store.push(...handler(criteria, allLogs));
|
|
40538
41892
|
|
|
40539
41893
|
return store
|
|
40540
41894
|
case 'AND':
|
|
40541
|
-
return handler
|
|
41895
|
+
return handler(criteria, store)
|
|
40542
41896
|
default:
|
|
40543
41897
|
// guard -- should never happens because buildAndValidateFilterCallsOptions is called before
|
|
40544
41898
|
throw new InvalidArgumentError('options.operator must to be a case insensitive string equal to \'OR\' or \'AND\'')
|
|
@@ -40563,14 +41917,14 @@ function requireMockCallHistory () {
|
|
|
40563
41917
|
}
|
|
40564
41918
|
|
|
40565
41919
|
function makeFilterCalls (parameterName) {
|
|
40566
|
-
return (parameterValue) => {
|
|
41920
|
+
return (parameterValue, logs) => {
|
|
40567
41921
|
if (typeof parameterValue === 'string' || parameterValue == null) {
|
|
40568
|
-
return
|
|
41922
|
+
return logs.filter((log) => {
|
|
40569
41923
|
return log[parameterName] === parameterValue
|
|
40570
41924
|
})
|
|
40571
41925
|
}
|
|
40572
41926
|
if (parameterValue instanceof RegExp) {
|
|
40573
|
-
return
|
|
41927
|
+
return logs.filter((log) => {
|
|
40574
41928
|
return parameterValue.test(log[parameterName])
|
|
40575
41929
|
})
|
|
40576
41930
|
}
|
|
@@ -40703,30 +42057,30 @@ function requireMockCallHistory () {
|
|
|
40703
42057
|
|
|
40704
42058
|
const finalOptions = { operator: 'OR', ...buildAndValidateFilterCallsOptions(options) };
|
|
40705
42059
|
|
|
40706
|
-
let maybeDuplicatedLogsFiltered = [];
|
|
42060
|
+
let maybeDuplicatedLogsFiltered = finalOptions.operator === 'AND' ? this.logs : [];
|
|
40707
42061
|
if ('protocol' in criteria) {
|
|
40708
|
-
maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.protocol, finalOptions, this.filterCallsByProtocol, maybeDuplicatedLogsFiltered);
|
|
42062
|
+
maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.protocol, finalOptions, this.filterCallsByProtocol, maybeDuplicatedLogsFiltered, this.logs);
|
|
40709
42063
|
}
|
|
40710
42064
|
if ('host' in criteria) {
|
|
40711
|
-
maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.host, finalOptions, this.filterCallsByHost, maybeDuplicatedLogsFiltered);
|
|
42065
|
+
maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.host, finalOptions, this.filterCallsByHost, maybeDuplicatedLogsFiltered, this.logs);
|
|
40712
42066
|
}
|
|
40713
42067
|
if ('port' in criteria) {
|
|
40714
|
-
maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.port, finalOptions, this.filterCallsByPort, maybeDuplicatedLogsFiltered);
|
|
42068
|
+
maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.port, finalOptions, this.filterCallsByPort, maybeDuplicatedLogsFiltered, this.logs);
|
|
40715
42069
|
}
|
|
40716
42070
|
if ('origin' in criteria) {
|
|
40717
|
-
maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.origin, finalOptions, this.filterCallsByOrigin, maybeDuplicatedLogsFiltered);
|
|
42071
|
+
maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.origin, finalOptions, this.filterCallsByOrigin, maybeDuplicatedLogsFiltered, this.logs);
|
|
40718
42072
|
}
|
|
40719
42073
|
if ('path' in criteria) {
|
|
40720
|
-
maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.path, finalOptions, this.filterCallsByPath, maybeDuplicatedLogsFiltered);
|
|
42074
|
+
maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.path, finalOptions, this.filterCallsByPath, maybeDuplicatedLogsFiltered, this.logs);
|
|
40721
42075
|
}
|
|
40722
42076
|
if ('hash' in criteria) {
|
|
40723
|
-
maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.hash, finalOptions, this.filterCallsByHash, maybeDuplicatedLogsFiltered);
|
|
42077
|
+
maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.hash, finalOptions, this.filterCallsByHash, maybeDuplicatedLogsFiltered, this.logs);
|
|
40724
42078
|
}
|
|
40725
42079
|
if ('fullUrl' in criteria) {
|
|
40726
|
-
maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.fullUrl, finalOptions, this.filterCallsByFullUrl, maybeDuplicatedLogsFiltered);
|
|
42080
|
+
maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.fullUrl, finalOptions, this.filterCallsByFullUrl, maybeDuplicatedLogsFiltered, this.logs);
|
|
40727
42081
|
}
|
|
40728
42082
|
if ('method' in criteria) {
|
|
40729
|
-
maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.method, finalOptions, this.filterCallsByMethod, maybeDuplicatedLogsFiltered);
|
|
42083
|
+
maybeDuplicatedLogsFiltered = handleFilterCallsWithOptions(criteria.method, finalOptions, this.filterCallsByMethod, maybeDuplicatedLogsFiltered, this.logs);
|
|
40730
42084
|
}
|
|
40731
42085
|
|
|
40732
42086
|
const uniqLogsFiltered = [...new Set(maybeDuplicatedLogsFiltered)];
|
|
@@ -40861,7 +42215,7 @@ function requirePendingInterceptorsFormatter () {
|
|
|
40861
42215
|
hasRequiredPendingInterceptorsFormatter = 1;
|
|
40862
42216
|
|
|
40863
42217
|
const { Transform } = require$$0$8;
|
|
40864
|
-
const { Console } = require$$1$
|
|
42218
|
+
const { Console } = require$$1$7;
|
|
40865
42219
|
|
|
40866
42220
|
const PERSISTENT = process.versions.icu ? '✅' : 'Y ';
|
|
40867
42221
|
const NOT_PERSISTENT = process.versions.icu ? '❌' : 'N ';
|
|
@@ -42276,7 +43630,8 @@ function requireGlobal () {
|
|
|
42276
43630
|
|
|
42277
43631
|
// We include a version number for the Dispatcher API. In case of breaking changes,
|
|
42278
43632
|
// this version number must be increased to avoid conflicts.
|
|
42279
|
-
const globalDispatcher = Symbol.for('undici.globalDispatcher.
|
|
43633
|
+
const globalDispatcher = Symbol.for('undici.globalDispatcher.2');
|
|
43634
|
+
const legacyGlobalDispatcher = Symbol.for('undici.globalDispatcher.1');
|
|
42280
43635
|
const { InvalidArgumentError } = requireErrors();
|
|
42281
43636
|
const Agent = requireAgent();
|
|
42282
43637
|
|
|
@@ -42288,16 +43643,24 @@ function requireGlobal () {
|
|
|
42288
43643
|
if (!agent || typeof agent.dispatch !== 'function') {
|
|
42289
43644
|
throw new InvalidArgumentError('Argument agent must implement Agent')
|
|
42290
43645
|
}
|
|
43646
|
+
|
|
42291
43647
|
Object.defineProperty(globalThis, globalDispatcher, {
|
|
42292
43648
|
value: agent,
|
|
42293
43649
|
writable: true,
|
|
42294
43650
|
enumerable: false,
|
|
42295
43651
|
configurable: false
|
|
42296
43652
|
});
|
|
43653
|
+
|
|
43654
|
+
Object.defineProperty(globalThis, legacyGlobalDispatcher, {
|
|
43655
|
+
value: agent,
|
|
43656
|
+
writable: true,
|
|
43657
|
+
enumerable: false,
|
|
43658
|
+
configurable: false
|
|
43659
|
+
});
|
|
42297
43660
|
}
|
|
42298
43661
|
|
|
42299
43662
|
function getGlobalDispatcher () {
|
|
42300
|
-
return globalThis[
|
|
43663
|
+
return globalThis[legacyGlobalDispatcher]
|
|
42301
43664
|
}
|
|
42302
43665
|
|
|
42303
43666
|
// These are the globals that can be installed by undici.install().
|
|
@@ -42611,7 +43974,8 @@ function requireRedirectHandler () {
|
|
|
42611
43974
|
}
|
|
42612
43975
|
}
|
|
42613
43976
|
} else if (headers && typeof headers === 'object') {
|
|
42614
|
-
const entries =
|
|
43977
|
+
const entries = util.hasSafeIterator(headers) ? headers : Object.entries(headers);
|
|
43978
|
+
|
|
42615
43979
|
for (const [key, value] of entries) {
|
|
42616
43980
|
if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) {
|
|
42617
43981
|
ret.push(key, value);
|
|
@@ -42912,12 +44276,111 @@ var hasRequiredDns;
|
|
|
42912
44276
|
function requireDns () {
|
|
42913
44277
|
if (hasRequiredDns) return dns;
|
|
42914
44278
|
hasRequiredDns = 1;
|
|
42915
|
-
const { isIP } = require$$
|
|
42916
|
-
const { lookup } = require$$1$
|
|
44279
|
+
const { isIP } = require$$1$4;
|
|
44280
|
+
const { lookup } = require$$1$8;
|
|
42917
44281
|
const DecoratorHandler = requireDecoratorHandler();
|
|
42918
44282
|
const { InvalidArgumentError, InformationalError } = requireErrors();
|
|
42919
44283
|
const maxInt = Math.pow(2, 31) - 1;
|
|
42920
44284
|
|
|
44285
|
+
function hasSafeIterator (headers) {
|
|
44286
|
+
const prototype = Object.getPrototypeOf(headers);
|
|
44287
|
+
const ownIterator = Object.prototype.hasOwnProperty.call(headers, Symbol.iterator);
|
|
44288
|
+
return ownIterator || (prototype != null && prototype !== Object.prototype && typeof headers[Symbol.iterator] === 'function')
|
|
44289
|
+
}
|
|
44290
|
+
|
|
44291
|
+
function isHostHeader (key) {
|
|
44292
|
+
return typeof key === 'string' && key.toLowerCase() === 'host'
|
|
44293
|
+
}
|
|
44294
|
+
|
|
44295
|
+
function normalizeHeaders (headers) {
|
|
44296
|
+
if (headers == null) {
|
|
44297
|
+
return null
|
|
44298
|
+
}
|
|
44299
|
+
|
|
44300
|
+
if (Array.isArray(headers)) {
|
|
44301
|
+
if (headers.length === 0 || !Array.isArray(headers[0])) {
|
|
44302
|
+
return headers
|
|
44303
|
+
}
|
|
44304
|
+
|
|
44305
|
+
const normalized = [];
|
|
44306
|
+
for (const header of headers) {
|
|
44307
|
+
if (Array.isArray(header) && header.length === 2) {
|
|
44308
|
+
normalized.push(header[0], header[1]);
|
|
44309
|
+
} else {
|
|
44310
|
+
normalized.push(header);
|
|
44311
|
+
}
|
|
44312
|
+
}
|
|
44313
|
+
|
|
44314
|
+
return normalized
|
|
44315
|
+
}
|
|
44316
|
+
|
|
44317
|
+
if (typeof headers === 'object' && hasSafeIterator(headers)) {
|
|
44318
|
+
const normalized = [];
|
|
44319
|
+
for (const header of headers) {
|
|
44320
|
+
if (Array.isArray(header) && header.length === 2) {
|
|
44321
|
+
normalized.push(header[0], header[1]);
|
|
44322
|
+
} else {
|
|
44323
|
+
normalized.push(header);
|
|
44324
|
+
}
|
|
44325
|
+
}
|
|
44326
|
+
|
|
44327
|
+
return normalized
|
|
44328
|
+
}
|
|
44329
|
+
|
|
44330
|
+
return headers
|
|
44331
|
+
}
|
|
44332
|
+
|
|
44333
|
+
function hasHostHeader (headers) {
|
|
44334
|
+
if (headers == null) {
|
|
44335
|
+
return false
|
|
44336
|
+
}
|
|
44337
|
+
|
|
44338
|
+
if (Array.isArray(headers)) {
|
|
44339
|
+
if (headers.length === 0) {
|
|
44340
|
+
return false
|
|
44341
|
+
}
|
|
44342
|
+
|
|
44343
|
+
for (let i = 0; i < headers.length; i += 2) {
|
|
44344
|
+
if (isHostHeader(headers[i])) {
|
|
44345
|
+
return true
|
|
44346
|
+
}
|
|
44347
|
+
}
|
|
44348
|
+
|
|
44349
|
+
return false
|
|
44350
|
+
}
|
|
44351
|
+
|
|
44352
|
+
if (typeof headers === 'object') {
|
|
44353
|
+
for (const key in headers) {
|
|
44354
|
+
if (isHostHeader(key)) {
|
|
44355
|
+
return true
|
|
44356
|
+
}
|
|
44357
|
+
}
|
|
44358
|
+
}
|
|
44359
|
+
|
|
44360
|
+
return false
|
|
44361
|
+
}
|
|
44362
|
+
|
|
44363
|
+
function withHostHeader (host, headers) {
|
|
44364
|
+
const normalizedHeaders = normalizeHeaders(headers);
|
|
44365
|
+
|
|
44366
|
+
if (hasHostHeader(normalizedHeaders)) {
|
|
44367
|
+
return normalizedHeaders
|
|
44368
|
+
}
|
|
44369
|
+
|
|
44370
|
+
if (Array.isArray(normalizedHeaders)) {
|
|
44371
|
+
return ['host', host, ...normalizedHeaders]
|
|
44372
|
+
}
|
|
44373
|
+
|
|
44374
|
+
if (normalizedHeaders && typeof normalizedHeaders === 'object') {
|
|
44375
|
+
return {
|
|
44376
|
+
host,
|
|
44377
|
+
...normalizedHeaders
|
|
44378
|
+
}
|
|
44379
|
+
}
|
|
44380
|
+
|
|
44381
|
+
return { host }
|
|
44382
|
+
}
|
|
44383
|
+
|
|
42921
44384
|
class DNSStorage {
|
|
42922
44385
|
#maxItems = 0
|
|
42923
44386
|
#records = new Map()
|
|
@@ -43246,8 +44709,9 @@ function requireDns () {
|
|
|
43246
44709
|
const dispatchOpts = {
|
|
43247
44710
|
...this.#opts,
|
|
43248
44711
|
origin: `${this.#origin.protocol}//${
|
|
43249
|
-
|
|
43250
|
-
|
|
44712
|
+
ip.family === 6 ? `[${ip.address}]` : ip.address
|
|
44713
|
+
}${port}`,
|
|
44714
|
+
headers: withHostHeader(this.#origin.host, this.#opts.headers)
|
|
43251
44715
|
};
|
|
43252
44716
|
this.#dispatch(dispatchOpts, this);
|
|
43253
44717
|
return
|
|
@@ -43366,10 +44830,7 @@ function requireDns () {
|
|
|
43366
44830
|
...origDispatchOpts,
|
|
43367
44831
|
servername: origin.hostname, // For SNI on TLS
|
|
43368
44832
|
origin: newOrigin.origin,
|
|
43369
|
-
headers:
|
|
43370
|
-
host: origin.host,
|
|
43371
|
-
...origDispatchOpts.headers
|
|
43372
|
-
}
|
|
44833
|
+
headers: withHostHeader(origin.host, origDispatchOpts.headers)
|
|
43373
44834
|
};
|
|
43374
44835
|
|
|
43375
44836
|
dispatch(
|
|
@@ -43397,7 +44858,8 @@ function requireCache$2 () {
|
|
|
43397
44858
|
|
|
43398
44859
|
const {
|
|
43399
44860
|
safeHTTPMethods,
|
|
43400
|
-
pathHasQueryOrFragment
|
|
44861
|
+
pathHasQueryOrFragment,
|
|
44862
|
+
hasSafeIterator
|
|
43401
44863
|
} = requireUtil$5();
|
|
43402
44864
|
|
|
43403
44865
|
const { serializePathWithQuery } = requireUtil$5();
|
|
@@ -43412,7 +44874,7 @@ function requireCache$2 () {
|
|
|
43412
44874
|
|
|
43413
44875
|
let fullPath = opts.path || '/';
|
|
43414
44876
|
|
|
43415
|
-
if (opts.query && !pathHasQueryOrFragment(
|
|
44877
|
+
if (opts.query && !pathHasQueryOrFragment(fullPath)) {
|
|
43416
44878
|
fullPath = serializePathWithQuery(fullPath, opts.query);
|
|
43417
44879
|
}
|
|
43418
44880
|
|
|
@@ -43432,23 +44894,24 @@ function requireCache$2 () {
|
|
|
43432
44894
|
let headers;
|
|
43433
44895
|
if (opts.headers == null) {
|
|
43434
44896
|
headers = {};
|
|
43435
|
-
} else if (typeof opts.headers[Symbol.iterator] === 'function') {
|
|
43436
|
-
headers = {};
|
|
43437
|
-
for (const x of opts.headers) {
|
|
43438
|
-
if (!Array.isArray(x)) {
|
|
43439
|
-
throw new Error('opts.headers is not a valid header map')
|
|
43440
|
-
}
|
|
43441
|
-
const [key, val] = x;
|
|
43442
|
-
if (typeof key !== 'string' || typeof val !== 'string') {
|
|
43443
|
-
throw new Error('opts.headers is not a valid header map')
|
|
43444
|
-
}
|
|
43445
|
-
headers[key.toLowerCase()] = val;
|
|
43446
|
-
}
|
|
43447
44897
|
} else if (typeof opts.headers === 'object') {
|
|
43448
44898
|
headers = {};
|
|
43449
44899
|
|
|
43450
|
-
|
|
43451
|
-
|
|
44900
|
+
if (hasSafeIterator(opts.headers)) {
|
|
44901
|
+
for (const x of opts.headers) {
|
|
44902
|
+
if (!Array.isArray(x)) {
|
|
44903
|
+
throw new Error('opts.headers is not a valid header map')
|
|
44904
|
+
}
|
|
44905
|
+
const [key, val] = x;
|
|
44906
|
+
if (typeof key !== 'string' || typeof val !== 'string') {
|
|
44907
|
+
throw new Error('opts.headers is not a valid header map')
|
|
44908
|
+
}
|
|
44909
|
+
headers[key.toLowerCase()] = val;
|
|
44910
|
+
}
|
|
44911
|
+
} else {
|
|
44912
|
+
for (const key of Object.keys(opts.headers)) {
|
|
44913
|
+
headers[key.toLowerCase()] = opts.headers[key];
|
|
44914
|
+
}
|
|
43452
44915
|
}
|
|
43453
44916
|
} else {
|
|
43454
44917
|
throw new Error('opts.headers is not an object')
|
|
@@ -43621,6 +45084,10 @@ function requireCache$2 () {
|
|
|
43621
45084
|
headers[headers.length - 1] = lastHeader;
|
|
43622
45085
|
}
|
|
43623
45086
|
|
|
45087
|
+
for (let j = 0; j < headers.length; j++) {
|
|
45088
|
+
headers[j] = headers[j].trim();
|
|
45089
|
+
}
|
|
45090
|
+
|
|
43624
45091
|
if (key in output) {
|
|
43625
45092
|
output[key] = output[key].concat(headers);
|
|
43626
45093
|
} else {
|
|
@@ -43629,10 +45096,12 @@ function requireCache$2 () {
|
|
|
43629
45096
|
}
|
|
43630
45097
|
} else {
|
|
43631
45098
|
// Something like `no-cache="some-header"`
|
|
45099
|
+
const fieldName = value.trim();
|
|
45100
|
+
|
|
43632
45101
|
if (key in output) {
|
|
43633
|
-
output[key] = output[key].concat(
|
|
45102
|
+
output[key] = output[key].concat(fieldName);
|
|
43634
45103
|
} else {
|
|
43635
|
-
output[key] = [
|
|
45104
|
+
output[key] = [fieldName];
|
|
43636
45105
|
}
|
|
43637
45106
|
}
|
|
43638
45107
|
|
|
@@ -43767,9 +45236,11 @@ function requireCache$2 () {
|
|
|
43767
45236
|
* @returns {string}
|
|
43768
45237
|
*/
|
|
43769
45238
|
function makeDeduplicationKey (cacheKey, excludeHeaders) {
|
|
43770
|
-
//
|
|
43771
|
-
//
|
|
43772
|
-
|
|
45239
|
+
// Use JSON.stringify to produce a collision-resistant key.
|
|
45240
|
+
// Previous format used `:` and `=` delimiters without escaping, which
|
|
45241
|
+
// allowed different header sets to produce identical keys (e.g.
|
|
45242
|
+
// {a:"x:b=y"} vs {a:"x", b:"y"}). See: https://github.com/nodejs/undici/issues/5012
|
|
45243
|
+
const headers = {};
|
|
43773
45244
|
|
|
43774
45245
|
if (cacheKey.headers) {
|
|
43775
45246
|
const sortedHeaders = Object.keys(cacheKey.headers).sort();
|
|
@@ -43778,12 +45249,11 @@ function requireCache$2 () {
|
|
|
43778
45249
|
if (excludeHeaders?.has(header.toLowerCase())) {
|
|
43779
45250
|
continue
|
|
43780
45251
|
}
|
|
43781
|
-
|
|
43782
|
-
key += `:${header}=${Array.isArray(value) ? value.join(',') : value}`;
|
|
45252
|
+
headers[header] = cacheKey.headers[header];
|
|
43783
45253
|
}
|
|
43784
45254
|
}
|
|
43785
45255
|
|
|
43786
|
-
return
|
|
45256
|
+
return JSON.stringify([cacheKey.origin, cacheKey.method, cacheKey.path, headers])
|
|
43787
45257
|
}
|
|
43788
45258
|
|
|
43789
45259
|
cache$2 = {
|
|
@@ -44604,7 +46074,7 @@ function requireCacheHandler () {
|
|
|
44604
46074
|
}
|
|
44605
46075
|
|
|
44606
46076
|
const cacheControlDirectives = cacheControlHeader ? parseCacheControlHeader(cacheControlHeader) : {};
|
|
44607
|
-
if (!canCacheResponse(this.#cacheType, statusCode, resHeaders, cacheControlDirectives)) {
|
|
46077
|
+
if (!canCacheResponse(this.#cacheType, statusCode, resHeaders, cacheControlDirectives, this.#cacheKey.headers)) {
|
|
44608
46078
|
return downstreamOnHeaders()
|
|
44609
46079
|
}
|
|
44610
46080
|
|
|
@@ -44809,8 +46279,9 @@ function requireCacheHandler () {
|
|
|
44809
46279
|
* @param {number} statusCode
|
|
44810
46280
|
* @param {import('../../types/header.d.ts').IncomingHttpHeaders} resHeaders
|
|
44811
46281
|
* @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives} cacheControlDirectives
|
|
46282
|
+
* @param {import('../../types/header.d.ts').IncomingHttpHeaders} [reqHeaders]
|
|
44812
46283
|
*/
|
|
44813
|
-
function canCacheResponse (cacheType, statusCode, resHeaders, cacheControlDirectives) {
|
|
46284
|
+
function canCacheResponse (cacheType, statusCode, resHeaders, cacheControlDirectives, reqHeaders) {
|
|
44814
46285
|
// Status code must be final and understood.
|
|
44815
46286
|
if (statusCode < 200 || NOT_UNDERSTOOD_STATUS_CODES.includes(statusCode)) {
|
|
44816
46287
|
return false
|
|
@@ -44841,8 +46312,16 @@ function requireCacheHandler () {
|
|
|
44841
46312
|
}
|
|
44842
46313
|
|
|
44843
46314
|
// https://www.rfc-editor.org/rfc/rfc9111.html#name-storing-responses-to-authen
|
|
44844
|
-
if (
|
|
44845
|
-
if (
|
|
46315
|
+
if (reqHeaders?.authorization) {
|
|
46316
|
+
if (
|
|
46317
|
+
!cacheControlDirectives.public &&
|
|
46318
|
+
!cacheControlDirectives['s-maxage'] &&
|
|
46319
|
+
!cacheControlDirectives['must-revalidate']
|
|
46320
|
+
) {
|
|
46321
|
+
return false
|
|
46322
|
+
}
|
|
46323
|
+
|
|
46324
|
+
if (typeof reqHeaders.authorization !== 'string') {
|
|
44846
46325
|
return false
|
|
44847
46326
|
}
|
|
44848
46327
|
|
|
@@ -44962,10 +46441,18 @@ function requireCacheHandler () {
|
|
|
44962
46441
|
staleIfError = staleAt + (cacheControlDirectives['stale-if-error'] * 1000);
|
|
44963
46442
|
}
|
|
44964
46443
|
|
|
44965
|
-
if (staleWhileRevalidate === -Infinity && staleIfError === -Infinity) {
|
|
46444
|
+
if (cacheControlDirectives.immutable && staleWhileRevalidate === -Infinity && staleIfError === -Infinity) {
|
|
44966
46445
|
immutable = now + 31536000000;
|
|
44967
46446
|
}
|
|
44968
46447
|
|
|
46448
|
+
// When no stale directives or immutable flag, add a revalidation buffer
|
|
46449
|
+
// equal to the freshness lifetime so the entry survives past staleAt long
|
|
46450
|
+
// enough to be revalidated instead of silently disappearing.
|
|
46451
|
+
if (staleWhileRevalidate === -Infinity && staleIfError === -Infinity && immutable === -Infinity) {
|
|
46452
|
+
const freshnessLifetime = staleAt - now;
|
|
46453
|
+
return staleAt + freshnessLifetime
|
|
46454
|
+
}
|
|
46455
|
+
|
|
44969
46456
|
return Math.max(staleAt, staleWhileRevalidate, staleIfError, immutable)
|
|
44970
46457
|
}
|
|
44971
46458
|
|
|
@@ -46182,12 +47669,26 @@ function requireDeduplicationHandler () {
|
|
|
46182
47669
|
if (hasRequiredDeduplicationHandler) return deduplicationHandler;
|
|
46183
47670
|
hasRequiredDeduplicationHandler = 1;
|
|
46184
47671
|
|
|
47672
|
+
const { RequestAbortedError } = requireErrors();
|
|
47673
|
+
|
|
46185
47674
|
/**
|
|
46186
47675
|
* @typedef {import('../../types/dispatcher.d.ts').default.DispatchHandler} DispatchHandler
|
|
46187
47676
|
*/
|
|
46188
47677
|
|
|
47678
|
+
const DEFAULT_MAX_BUFFER_SIZE = 5 * 1024 * 1024;
|
|
47679
|
+
|
|
47680
|
+
/**
|
|
47681
|
+
* @typedef {Object} WaitingHandler
|
|
47682
|
+
* @property {DispatchHandler} handler
|
|
47683
|
+
* @property {import('../../types/dispatcher.d.ts').default.DispatchController} controller
|
|
47684
|
+
* @property {Buffer[]} bufferedChunks
|
|
47685
|
+
* @property {number} bufferedBytes
|
|
47686
|
+
* @property {object | null} pendingTrailers
|
|
47687
|
+
* @property {boolean} done
|
|
47688
|
+
*/
|
|
47689
|
+
|
|
46189
47690
|
/**
|
|
46190
|
-
* Handler that
|
|
47691
|
+
* Handler that forwards response events to multiple waiting handlers.
|
|
46191
47692
|
* Used for request deduplication.
|
|
46192
47693
|
*
|
|
46193
47694
|
* @implements {DispatchHandler}
|
|
@@ -46199,14 +47700,14 @@ function requireDeduplicationHandler () {
|
|
|
46199
47700
|
#primaryHandler
|
|
46200
47701
|
|
|
46201
47702
|
/**
|
|
46202
|
-
* @type {
|
|
47703
|
+
* @type {WaitingHandler[]}
|
|
46203
47704
|
*/
|
|
46204
47705
|
#waitingHandlers = []
|
|
46205
47706
|
|
|
46206
47707
|
/**
|
|
46207
|
-
* @type {
|
|
47708
|
+
* @type {number}
|
|
46208
47709
|
*/
|
|
46209
|
-
#
|
|
47710
|
+
#maxBufferSize = DEFAULT_MAX_BUFFER_SIZE
|
|
46210
47711
|
|
|
46211
47712
|
/**
|
|
46212
47713
|
* @type {number}
|
|
@@ -46228,6 +47729,21 @@ function requireDeduplicationHandler () {
|
|
|
46228
47729
|
*/
|
|
46229
47730
|
#aborted = false
|
|
46230
47731
|
|
|
47732
|
+
/**
|
|
47733
|
+
* @type {boolean}
|
|
47734
|
+
*/
|
|
47735
|
+
#responseStarted = false
|
|
47736
|
+
|
|
47737
|
+
/**
|
|
47738
|
+
* @type {boolean}
|
|
47739
|
+
*/
|
|
47740
|
+
#responseDataStarted = false
|
|
47741
|
+
|
|
47742
|
+
/**
|
|
47743
|
+
* @type {boolean}
|
|
47744
|
+
*/
|
|
47745
|
+
#completed = false
|
|
47746
|
+
|
|
46231
47747
|
/**
|
|
46232
47748
|
* @type {import('../../types/dispatcher.d.ts').default.DispatchController | null}
|
|
46233
47749
|
*/
|
|
@@ -46241,22 +47757,60 @@ function requireDeduplicationHandler () {
|
|
|
46241
47757
|
/**
|
|
46242
47758
|
* @param {DispatchHandler} primaryHandler The primary handler
|
|
46243
47759
|
* @param {() => void} onComplete Callback when request completes
|
|
47760
|
+
* @param {number} [maxBufferSize] Maximum paused buffer size per waiting handler
|
|
46244
47761
|
*/
|
|
46245
|
-
constructor (primaryHandler, onComplete) {
|
|
47762
|
+
constructor (primaryHandler, onComplete, maxBufferSize = DEFAULT_MAX_BUFFER_SIZE) {
|
|
46246
47763
|
this.#primaryHandler = primaryHandler;
|
|
46247
47764
|
this.#onComplete = onComplete;
|
|
47765
|
+
this.#maxBufferSize = maxBufferSize;
|
|
46248
47766
|
}
|
|
46249
47767
|
|
|
46250
47768
|
/**
|
|
46251
|
-
* Add a waiting handler that will receive
|
|
47769
|
+
* Add a waiting handler that will receive response events.
|
|
47770
|
+
* Returns false if deduplication can no longer safely attach this handler.
|
|
47771
|
+
*
|
|
46252
47772
|
* @param {DispatchHandler} handler
|
|
47773
|
+
* @returns {boolean}
|
|
46253
47774
|
*/
|
|
46254
47775
|
addWaitingHandler (handler) {
|
|
46255
|
-
this.#
|
|
47776
|
+
if (this.#completed || this.#responseDataStarted) {
|
|
47777
|
+
return false
|
|
47778
|
+
}
|
|
47779
|
+
|
|
47780
|
+
const waitingHandler = this.#createWaitingHandler(handler);
|
|
47781
|
+
const waitingController = waitingHandler.controller;
|
|
47782
|
+
|
|
47783
|
+
try {
|
|
47784
|
+
handler.onRequestStart?.(waitingController, null);
|
|
47785
|
+
|
|
47786
|
+
if (waitingController.aborted) {
|
|
47787
|
+
waitingHandler.done = true;
|
|
47788
|
+
return true
|
|
47789
|
+
}
|
|
47790
|
+
|
|
47791
|
+
if (this.#responseStarted) {
|
|
47792
|
+
handler.onResponseStart?.(
|
|
47793
|
+
waitingController,
|
|
47794
|
+
this.#statusCode,
|
|
47795
|
+
this.#headers,
|
|
47796
|
+
this.#statusMessage
|
|
47797
|
+
);
|
|
47798
|
+
}
|
|
47799
|
+
} catch {
|
|
47800
|
+
// Ignore errors from waiting handlers
|
|
47801
|
+
waitingHandler.done = true;
|
|
47802
|
+
return true
|
|
47803
|
+
}
|
|
47804
|
+
|
|
47805
|
+
if (!waitingController.aborted) {
|
|
47806
|
+
this.#waitingHandlers.push(waitingHandler);
|
|
47807
|
+
}
|
|
47808
|
+
|
|
47809
|
+
return true
|
|
46256
47810
|
}
|
|
46257
47811
|
|
|
46258
47812
|
/**
|
|
46259
|
-
* @param {()
|
|
47813
|
+
* @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller
|
|
46260
47814
|
* @param {any} context
|
|
46261
47815
|
*/
|
|
46262
47816
|
onRequestStart (controller, context) {
|
|
@@ -46281,10 +47835,38 @@ function requireDeduplicationHandler () {
|
|
|
46281
47835
|
* @param {string} statusMessage
|
|
46282
47836
|
*/
|
|
46283
47837
|
onResponseStart (controller, statusCode, headers, statusMessage) {
|
|
47838
|
+
this.#responseStarted = true;
|
|
46284
47839
|
this.#statusCode = statusCode;
|
|
46285
47840
|
this.#headers = headers;
|
|
46286
47841
|
this.#statusMessage = statusMessage;
|
|
47842
|
+
|
|
46287
47843
|
this.#primaryHandler.onResponseStart?.(controller, statusCode, headers, statusMessage);
|
|
47844
|
+
|
|
47845
|
+
for (const waitingHandler of this.#waitingHandlers) {
|
|
47846
|
+
const { handler, controller: waitingController } = waitingHandler;
|
|
47847
|
+
|
|
47848
|
+
if (waitingHandler.done || waitingController.aborted) {
|
|
47849
|
+
waitingHandler.done = true;
|
|
47850
|
+
continue
|
|
47851
|
+
}
|
|
47852
|
+
|
|
47853
|
+
try {
|
|
47854
|
+
handler.onResponseStart?.(
|
|
47855
|
+
waitingController,
|
|
47856
|
+
statusCode,
|
|
47857
|
+
headers,
|
|
47858
|
+
statusMessage
|
|
47859
|
+
);
|
|
47860
|
+
} catch {
|
|
47861
|
+
// Ignore errors from waiting handlers
|
|
47862
|
+
}
|
|
47863
|
+
|
|
47864
|
+
if (waitingController.aborted) {
|
|
47865
|
+
waitingHandler.done = true;
|
|
47866
|
+
}
|
|
47867
|
+
}
|
|
47868
|
+
|
|
47869
|
+
this.#pruneDoneWaitingHandlers();
|
|
46288
47870
|
}
|
|
46289
47871
|
|
|
46290
47872
|
/**
|
|
@@ -46292,9 +47874,41 @@ function requireDeduplicationHandler () {
|
|
|
46292
47874
|
* @param {Buffer} chunk
|
|
46293
47875
|
*/
|
|
46294
47876
|
onResponseData (controller, chunk) {
|
|
46295
|
-
|
|
46296
|
-
|
|
47877
|
+
if (this.#aborted || this.#completed) {
|
|
47878
|
+
return
|
|
47879
|
+
}
|
|
47880
|
+
|
|
47881
|
+
this.#responseDataStarted = true;
|
|
47882
|
+
|
|
46297
47883
|
this.#primaryHandler.onResponseData?.(controller, chunk);
|
|
47884
|
+
|
|
47885
|
+
for (const waitingHandler of this.#waitingHandlers) {
|
|
47886
|
+
const { handler, controller: waitingController } = waitingHandler;
|
|
47887
|
+
|
|
47888
|
+
if (waitingHandler.done || waitingController.aborted) {
|
|
47889
|
+
waitingHandler.done = true;
|
|
47890
|
+
continue
|
|
47891
|
+
}
|
|
47892
|
+
|
|
47893
|
+
if (waitingController.paused) {
|
|
47894
|
+
this.#bufferWaitingChunk(waitingHandler, chunk);
|
|
47895
|
+
continue
|
|
47896
|
+
}
|
|
47897
|
+
|
|
47898
|
+
try {
|
|
47899
|
+
handler.onResponseData?.(waitingController, chunk);
|
|
47900
|
+
} catch {
|
|
47901
|
+
// Ignore errors from waiting handlers
|
|
47902
|
+
}
|
|
47903
|
+
|
|
47904
|
+
if (waitingController.aborted) {
|
|
47905
|
+
waitingHandler.done = true;
|
|
47906
|
+
waitingHandler.bufferedChunks = [];
|
|
47907
|
+
waitingHandler.bufferedBytes = 0;
|
|
47908
|
+
}
|
|
47909
|
+
}
|
|
47910
|
+
|
|
47911
|
+
this.#pruneDoneWaitingHandlers();
|
|
46298
47912
|
}
|
|
46299
47913
|
|
|
46300
47914
|
/**
|
|
@@ -46302,8 +47916,41 @@ function requireDeduplicationHandler () {
|
|
|
46302
47916
|
* @param {object} trailers
|
|
46303
47917
|
*/
|
|
46304
47918
|
onResponseEnd (controller, trailers) {
|
|
47919
|
+
if (this.#aborted || this.#completed) {
|
|
47920
|
+
return
|
|
47921
|
+
}
|
|
47922
|
+
|
|
47923
|
+
this.#completed = true;
|
|
46305
47924
|
this.#primaryHandler.onResponseEnd?.(controller, trailers);
|
|
46306
|
-
|
|
47925
|
+
|
|
47926
|
+
for (const waitingHandler of this.#waitingHandlers) {
|
|
47927
|
+
if (waitingHandler.done || waitingHandler.controller.aborted) {
|
|
47928
|
+
waitingHandler.done = true;
|
|
47929
|
+
continue
|
|
47930
|
+
}
|
|
47931
|
+
|
|
47932
|
+
this.#flushWaitingHandler(waitingHandler);
|
|
47933
|
+
|
|
47934
|
+
if (waitingHandler.done || waitingHandler.controller.aborted) {
|
|
47935
|
+
waitingHandler.done = true;
|
|
47936
|
+
continue
|
|
47937
|
+
}
|
|
47938
|
+
|
|
47939
|
+
if (waitingHandler.controller.paused && waitingHandler.bufferedChunks.length > 0) {
|
|
47940
|
+
waitingHandler.pendingTrailers = trailers;
|
|
47941
|
+
continue
|
|
47942
|
+
}
|
|
47943
|
+
|
|
47944
|
+
try {
|
|
47945
|
+
waitingHandler.handler.onResponseEnd?.(waitingHandler.controller, trailers);
|
|
47946
|
+
} catch {
|
|
47947
|
+
// Ignore errors from waiting handlers
|
|
47948
|
+
}
|
|
47949
|
+
|
|
47950
|
+
waitingHandler.done = true;
|
|
47951
|
+
}
|
|
47952
|
+
|
|
47953
|
+
this.#pruneDoneWaitingHandlers();
|
|
46307
47954
|
this.#onComplete?.();
|
|
46308
47955
|
}
|
|
46309
47956
|
|
|
@@ -46312,86 +47959,170 @@ function requireDeduplicationHandler () {
|
|
|
46312
47959
|
* @param {Error} err
|
|
46313
47960
|
*/
|
|
46314
47961
|
onResponseError (controller, err) {
|
|
47962
|
+
if (this.#completed) {
|
|
47963
|
+
return
|
|
47964
|
+
}
|
|
47965
|
+
|
|
46315
47966
|
this.#aborted = true;
|
|
47967
|
+
this.#completed = true;
|
|
47968
|
+
|
|
46316
47969
|
this.#primaryHandler.onResponseError?.(controller, err);
|
|
46317
|
-
|
|
47970
|
+
|
|
47971
|
+
for (const waitingHandler of this.#waitingHandlers) {
|
|
47972
|
+
this.#errorWaitingHandler(waitingHandler, err);
|
|
47973
|
+
}
|
|
47974
|
+
|
|
47975
|
+
this.#waitingHandlers = [];
|
|
46318
47976
|
this.#onComplete?.();
|
|
46319
47977
|
}
|
|
46320
47978
|
|
|
46321
47979
|
/**
|
|
46322
|
-
*
|
|
47980
|
+
* @param {DispatchHandler} handler
|
|
47981
|
+
* @returns {WaitingHandler}
|
|
46323
47982
|
*/
|
|
46324
|
-
#
|
|
46325
|
-
|
|
46326
|
-
|
|
46327
|
-
|
|
46328
|
-
|
|
46329
|
-
|
|
46330
|
-
|
|
46331
|
-
|
|
46332
|
-
|
|
46333
|
-
|
|
46334
|
-
get reason () { return null },
|
|
46335
|
-
abort () {}
|
|
46336
|
-
};
|
|
47983
|
+
#createWaitingHandler (handler) {
|
|
47984
|
+
/** @type {WaitingHandler} */
|
|
47985
|
+
const waitingHandler = {
|
|
47986
|
+
handler,
|
|
47987
|
+
controller: null,
|
|
47988
|
+
bufferedChunks: [],
|
|
47989
|
+
bufferedBytes: 0,
|
|
47990
|
+
pendingTrailers: null,
|
|
47991
|
+
done: false
|
|
47992
|
+
};
|
|
46337
47993
|
|
|
46338
|
-
|
|
46339
|
-
|
|
47994
|
+
const state = {
|
|
47995
|
+
aborted: false,
|
|
47996
|
+
paused: false,
|
|
47997
|
+
reason: null
|
|
47998
|
+
};
|
|
46340
47999
|
|
|
46341
|
-
|
|
46342
|
-
|
|
48000
|
+
waitingHandler.controller = {
|
|
48001
|
+
resume: () => {
|
|
48002
|
+
if (state.aborted) {
|
|
48003
|
+
return
|
|
46343
48004
|
}
|
|
46344
48005
|
|
|
46345
|
-
|
|
46346
|
-
|
|
46347
|
-
this.#statusCode,
|
|
46348
|
-
this.#headers,
|
|
46349
|
-
this.#statusMessage
|
|
46350
|
-
);
|
|
48006
|
+
state.paused = false;
|
|
48007
|
+
this.#flushWaitingHandler(waitingHandler);
|
|
46351
48008
|
|
|
46352
|
-
if (
|
|
46353
|
-
|
|
46354
|
-
|
|
48009
|
+
if (
|
|
48010
|
+
this.#completed &&
|
|
48011
|
+
waitingHandler.pendingTrailers &&
|
|
48012
|
+
waitingHandler.bufferedChunks.length === 0 &&
|
|
48013
|
+
!state.paused &&
|
|
48014
|
+
!state.aborted
|
|
48015
|
+
) {
|
|
48016
|
+
try {
|
|
48017
|
+
waitingHandler.handler.onResponseEnd?.(waitingHandler.controller, waitingHandler.pendingTrailers);
|
|
48018
|
+
} catch {
|
|
48019
|
+
// Ignore errors from waiting handlers
|
|
48020
|
+
}
|
|
46355
48021
|
|
|
46356
|
-
|
|
46357
|
-
|
|
48022
|
+
waitingHandler.pendingTrailers = null;
|
|
48023
|
+
waitingHandler.done = true;
|
|
46358
48024
|
}
|
|
46359
48025
|
|
|
46360
|
-
|
|
46361
|
-
}
|
|
46362
|
-
|
|
48026
|
+
this.#pruneDoneWaitingHandlers();
|
|
48027
|
+
},
|
|
48028
|
+
pause: () => {
|
|
48029
|
+
if (!state.aborted) {
|
|
48030
|
+
state.paused = true;
|
|
48031
|
+
}
|
|
48032
|
+
},
|
|
48033
|
+
get paused () { return state.paused },
|
|
48034
|
+
get aborted () { return state.aborted },
|
|
48035
|
+
get reason () { return state.reason },
|
|
48036
|
+
abort: (reason) => {
|
|
48037
|
+
state.aborted = true;
|
|
48038
|
+
state.reason = reason ?? null;
|
|
48039
|
+
waitingHandler.done = true;
|
|
48040
|
+
waitingHandler.pendingTrailers = null;
|
|
48041
|
+
waitingHandler.bufferedChunks = [];
|
|
48042
|
+
waitingHandler.bufferedBytes = 0;
|
|
46363
48043
|
}
|
|
48044
|
+
};
|
|
48045
|
+
|
|
48046
|
+
return waitingHandler
|
|
48047
|
+
}
|
|
48048
|
+
|
|
48049
|
+
/**
|
|
48050
|
+
* @param {WaitingHandler} waitingHandler
|
|
48051
|
+
* @param {Buffer} chunk
|
|
48052
|
+
*/
|
|
48053
|
+
#bufferWaitingChunk (waitingHandler, chunk) {
|
|
48054
|
+
if (waitingHandler.done || waitingHandler.controller.aborted) {
|
|
48055
|
+
waitingHandler.done = true;
|
|
48056
|
+
waitingHandler.bufferedChunks = [];
|
|
48057
|
+
waitingHandler.bufferedBytes = 0;
|
|
48058
|
+
return
|
|
46364
48059
|
}
|
|
46365
48060
|
|
|
46366
|
-
|
|
46367
|
-
|
|
48061
|
+
const bufferedChunk = Buffer.from(chunk);
|
|
48062
|
+
waitingHandler.bufferedChunks.push(bufferedChunk);
|
|
48063
|
+
waitingHandler.bufferedBytes += bufferedChunk.length;
|
|
48064
|
+
|
|
48065
|
+
if (waitingHandler.bufferedBytes > this.#maxBufferSize) {
|
|
48066
|
+
const err = new RequestAbortedError(`Deduplicated waiting handler exceeded maxBufferSize (${this.#maxBufferSize} bytes) while paused`);
|
|
48067
|
+
this.#errorWaitingHandler(waitingHandler, err);
|
|
48068
|
+
}
|
|
46368
48069
|
}
|
|
46369
48070
|
|
|
46370
48071
|
/**
|
|
46371
|
-
*
|
|
46372
|
-
* @param {Error} err
|
|
48072
|
+
* @param {WaitingHandler} waitingHandler
|
|
46373
48073
|
*/
|
|
46374
|
-
#
|
|
46375
|
-
|
|
46376
|
-
|
|
46377
|
-
|
|
46378
|
-
|
|
46379
|
-
|
|
46380
|
-
|
|
46381
|
-
|
|
46382
|
-
|
|
46383
|
-
|
|
48074
|
+
#flushWaitingHandler (waitingHandler) {
|
|
48075
|
+
const { handler, controller } = waitingHandler;
|
|
48076
|
+
|
|
48077
|
+
while (
|
|
48078
|
+
!waitingHandler.done &&
|
|
48079
|
+
!controller.aborted &&
|
|
48080
|
+
!controller.paused &&
|
|
48081
|
+
waitingHandler.bufferedChunks.length > 0
|
|
48082
|
+
) {
|
|
48083
|
+
const bufferedChunk = waitingHandler.bufferedChunks.shift();
|
|
48084
|
+
waitingHandler.bufferedBytes -= bufferedChunk.length;
|
|
46384
48085
|
|
|
46385
48086
|
try {
|
|
46386
|
-
handler.
|
|
46387
|
-
handler.onResponseError?.(waitingController, err);
|
|
48087
|
+
handler.onResponseData?.(controller, bufferedChunk);
|
|
46388
48088
|
} catch {
|
|
46389
48089
|
// Ignore errors from waiting handlers
|
|
46390
48090
|
}
|
|
48091
|
+
|
|
48092
|
+
if (controller.aborted) {
|
|
48093
|
+
waitingHandler.done = true;
|
|
48094
|
+
waitingHandler.pendingTrailers = null;
|
|
48095
|
+
waitingHandler.bufferedChunks = [];
|
|
48096
|
+
waitingHandler.bufferedBytes = 0;
|
|
48097
|
+
break
|
|
48098
|
+
}
|
|
46391
48099
|
}
|
|
48100
|
+
}
|
|
46392
48101
|
|
|
46393
|
-
|
|
46394
|
-
|
|
48102
|
+
/**
|
|
48103
|
+
* @param {WaitingHandler} waitingHandler
|
|
48104
|
+
* @param {Error} err
|
|
48105
|
+
*/
|
|
48106
|
+
#errorWaitingHandler (waitingHandler, err) {
|
|
48107
|
+
if (waitingHandler.done) {
|
|
48108
|
+
return
|
|
48109
|
+
}
|
|
48110
|
+
|
|
48111
|
+
waitingHandler.done = true;
|
|
48112
|
+
waitingHandler.pendingTrailers = null;
|
|
48113
|
+
waitingHandler.bufferedChunks = [];
|
|
48114
|
+
waitingHandler.bufferedBytes = 0;
|
|
48115
|
+
|
|
48116
|
+
try {
|
|
48117
|
+
waitingHandler.controller.abort(err);
|
|
48118
|
+
waitingHandler.handler.onResponseError?.(waitingHandler.controller, err);
|
|
48119
|
+
} catch {
|
|
48120
|
+
// Ignore errors from waiting handlers
|
|
48121
|
+
}
|
|
48122
|
+
}
|
|
48123
|
+
|
|
48124
|
+
#pruneDoneWaitingHandlers () {
|
|
48125
|
+
this.#waitingHandlers = this.#waitingHandlers.filter(waitingHandler => waitingHandler.done === false);
|
|
46395
48126
|
}
|
|
46396
48127
|
}
|
|
46397
48128
|
|
|
@@ -46406,7 +48137,7 @@ function requireDeduplicate () {
|
|
|
46406
48137
|
if (hasRequiredDeduplicate) return deduplicate;
|
|
46407
48138
|
hasRequiredDeduplicate = 1;
|
|
46408
48139
|
|
|
46409
|
-
const diagnosticsChannel = require$$0$
|
|
48140
|
+
const diagnosticsChannel = require$$0$9;
|
|
46410
48141
|
const util = requireUtil$5();
|
|
46411
48142
|
const DeduplicationHandler = requireDeduplicationHandler();
|
|
46412
48143
|
const { normalizeHeaders, makeCacheKey, makeDeduplicationKey } = requireCache$2();
|
|
@@ -46421,7 +48152,8 @@ function requireDeduplicate () {
|
|
|
46421
48152
|
const {
|
|
46422
48153
|
methods = ['GET'],
|
|
46423
48154
|
skipHeaderNames = [],
|
|
46424
|
-
excludeHeaderNames = []
|
|
48155
|
+
excludeHeaderNames = [],
|
|
48156
|
+
maxBufferSize = 5 * 1024 * 1024
|
|
46425
48157
|
} = opts;
|
|
46426
48158
|
|
|
46427
48159
|
if (typeof opts !== 'object' || opts === null) {
|
|
@@ -46446,6 +48178,10 @@ function requireDeduplicate () {
|
|
|
46446
48178
|
throw new TypeError(`expected opts.excludeHeaderNames to be an array, got ${typeof excludeHeaderNames}`)
|
|
46447
48179
|
}
|
|
46448
48180
|
|
|
48181
|
+
if (!Number.isFinite(maxBufferSize) || maxBufferSize <= 0) {
|
|
48182
|
+
throw new TypeError(`expected opts.maxBufferSize to be a positive finite number, got ${maxBufferSize}`)
|
|
48183
|
+
}
|
|
48184
|
+
|
|
46449
48185
|
// Convert to lowercase Set for case-insensitive header matching
|
|
46450
48186
|
const skipHeaderNamesSet = new Set(skipHeaderNames.map(name => name.toLowerCase()));
|
|
46451
48187
|
|
|
@@ -46484,9 +48220,13 @@ function requireDeduplicate () {
|
|
|
46484
48220
|
// Check if there's already a pending request for this key
|
|
46485
48221
|
const pendingHandler = pendingRequests.get(dedupeKey);
|
|
46486
48222
|
if (pendingHandler) {
|
|
46487
|
-
// Add this handler to the waiting list
|
|
46488
|
-
|
|
46489
|
-
|
|
48223
|
+
// Add this handler to the waiting list when safe.
|
|
48224
|
+
// If body streaming has already started, this request must be sent independently.
|
|
48225
|
+
if (pendingHandler.addWaitingHandler(handler)) {
|
|
48226
|
+
return true
|
|
48227
|
+
}
|
|
48228
|
+
|
|
48229
|
+
return dispatch(opts, handler)
|
|
46490
48230
|
}
|
|
46491
48231
|
|
|
46492
48232
|
// Create a new deduplication handler
|
|
@@ -46498,7 +48238,8 @@ function requireDeduplicate () {
|
|
|
46498
48238
|
if (pendingRequestsChannel.hasSubscribers) {
|
|
46499
48239
|
pendingRequestsChannel.publish({ size: pendingRequests.size, key: dedupeKey, type: 'removed' });
|
|
46500
48240
|
}
|
|
46501
|
-
}
|
|
48241
|
+
},
|
|
48242
|
+
maxBufferSize
|
|
46502
48243
|
);
|
|
46503
48244
|
|
|
46504
48245
|
// Register the pending request
|
|
@@ -46631,7 +48372,7 @@ function requireSqliteCacheStore () {
|
|
|
46631
48372
|
}
|
|
46632
48373
|
|
|
46633
48374
|
if (!DatabaseSync) {
|
|
46634
|
-
DatabaseSync = require$$1$
|
|
48375
|
+
DatabaseSync = require$$1$5.DatabaseSync;
|
|
46635
48376
|
}
|
|
46636
48377
|
this.#db = new DatabaseSync(opts?.location ?? ':memory:');
|
|
46637
48378
|
|
|
@@ -46737,7 +48478,7 @@ function requireSqliteCacheStore () {
|
|
|
46737
48478
|
SELECT
|
|
46738
48479
|
id
|
|
46739
48480
|
FROM cacheInterceptorV${VERSION}
|
|
46740
|
-
ORDER BY cachedAt
|
|
48481
|
+
ORDER BY cachedAt ASC
|
|
46741
48482
|
LIMIT ?
|
|
46742
48483
|
)
|
|
46743
48484
|
`);
|
|
@@ -46804,7 +48545,6 @@ function requireSqliteCacheStore () {
|
|
|
46804
48545
|
existingValue.id
|
|
46805
48546
|
);
|
|
46806
48547
|
} else {
|
|
46807
|
-
this.#prune();
|
|
46808
48548
|
// New response, let's insert it
|
|
46809
48549
|
this.#insertValueQuery.run(
|
|
46810
48550
|
url,
|
|
@@ -46820,6 +48560,7 @@ function requireSqliteCacheStore () {
|
|
|
46820
48560
|
value.cachedAt,
|
|
46821
48561
|
value.staleAt
|
|
46822
48562
|
);
|
|
48563
|
+
this.#prune();
|
|
46823
48564
|
}
|
|
46824
48565
|
}
|
|
46825
48566
|
|
|
@@ -46930,7 +48671,7 @@ function requireSqliteCacheStore () {
|
|
|
46930
48671
|
const now = Date.now();
|
|
46931
48672
|
for (const value of values) {
|
|
46932
48673
|
if (now >= value.deleteAt && !canBeExpired) {
|
|
46933
|
-
|
|
48674
|
+
continue
|
|
46934
48675
|
}
|
|
46935
48676
|
|
|
46936
48677
|
let matches = true;
|
|
@@ -50051,7 +51792,10 @@ function requireFetch () {
|
|
|
50051
51792
|
request,
|
|
50052
51793
|
processResponseEndOfBody: handleFetchDone,
|
|
50053
51794
|
processResponse,
|
|
50054
|
-
dispatcher: getRequestDispatcher(requestObject) // undici
|
|
51795
|
+
dispatcher: getRequestDispatcher(requestObject), // undici
|
|
51796
|
+
// Keep requestObject alive to prevent its AbortController from being GC'd
|
|
51797
|
+
// See https://github.com/nodejs/undici/issues/4627
|
|
51798
|
+
requestObject
|
|
50055
51799
|
});
|
|
50056
51800
|
|
|
50057
51801
|
// 14. Return p.
|
|
@@ -50170,7 +51914,8 @@ function requireFetch () {
|
|
|
50170
51914
|
processResponseEndOfBody,
|
|
50171
51915
|
processResponseConsumeBody,
|
|
50172
51916
|
useParallelQueue = false,
|
|
50173
|
-
dispatcher = getGlobalDispatcher() // undici
|
|
51917
|
+
dispatcher = getGlobalDispatcher(), // undici
|
|
51918
|
+
requestObject = null // Keep alive to prevent AbortController GC, see #4627
|
|
50174
51919
|
}) {
|
|
50175
51920
|
// Ensure that the dispatcher is set accordingly
|
|
50176
51921
|
assert(dispatcher);
|
|
@@ -50224,7 +51969,9 @@ function requireFetch () {
|
|
|
50224
51969
|
processResponseConsumeBody,
|
|
50225
51970
|
processResponseEndOfBody,
|
|
50226
51971
|
taskDestination,
|
|
50227
|
-
crossOriginIsolatedCapability
|
|
51972
|
+
crossOriginIsolatedCapability,
|
|
51973
|
+
// Keep requestObject alive to prevent its AbortController from being GC'd
|
|
51974
|
+
requestObject
|
|
50228
51975
|
};
|
|
50229
51976
|
|
|
50230
51977
|
// 7. If request’s body is a byte sequence, then set request’s body to
|
|
@@ -50588,7 +52335,7 @@ function requireFetch () {
|
|
|
50588
52335
|
}
|
|
50589
52336
|
case 'blob:': {
|
|
50590
52337
|
if (!resolveObjectURL) {
|
|
50591
|
-
resolveObjectURL = require$$0$
|
|
52338
|
+
resolveObjectURL = require$$0$a.resolveObjectURL;
|
|
50592
52339
|
}
|
|
50593
52340
|
|
|
50594
52341
|
// 1. Let blobURLEntry be request’s current URL’s blob URL entry.
|
|
@@ -50820,7 +52567,7 @@ function requireFetch () {
|
|
|
50820
52567
|
let responseStatus = 0;
|
|
50821
52568
|
|
|
50822
52569
|
// 7. If fetchParams’s request’s mode is not "navigate" or response’s has-cross-origin-redirects is false:
|
|
50823
|
-
if (fetchParams.request.mode !== '
|
|
52570
|
+
if (fetchParams.request.mode !== 'navigate' || !response.hasCrossOriginRedirects) {
|
|
50824
52571
|
// 1. Set responseStatus to response’s status.
|
|
50825
52572
|
responseStatus = response.status;
|
|
50826
52573
|
|
|
@@ -51212,7 +52959,10 @@ function requireFetch () {
|
|
|
51212
52959
|
// 8. If contentLengthHeaderValue is non-null, then append
|
|
51213
52960
|
// `Content-Length`/contentLengthHeaderValue to httpRequest’s header
|
|
51214
52961
|
// list.
|
|
51215
|
-
if (
|
|
52962
|
+
if (
|
|
52963
|
+
contentLengthHeaderValue != null &&
|
|
52964
|
+
!httpRequest.headersList.contains('content-length', true)
|
|
52965
|
+
) {
|
|
51216
52966
|
httpRequest.headersList.append('content-length', contentLengthHeaderValue, true);
|
|
51217
52967
|
}
|
|
51218
52968
|
|
|
@@ -51409,12 +53159,25 @@ function requireFetch () {
|
|
|
51409
53159
|
// 14. If response’s status is 401, httpRequest’s response tainting is not "cors",
|
|
51410
53160
|
// includeCredentials is true, and request’s traversable for user prompts is
|
|
51411
53161
|
// a traversable navigable:
|
|
51412
|
-
|
|
53162
|
+
//
|
|
53163
|
+
// In Node.js there is no traversable navigable to prompt the user, but we
|
|
53164
|
+
// still need to handle URL-embedded credentials so authentication retries
|
|
53165
|
+
// for WebSocket handshakes continue to work.
|
|
53166
|
+
if (response.status === 401 && httpRequest.responseTainting !== 'cors' && includeCredentials && (
|
|
53167
|
+
request.useURLCredentials !== undefined ||
|
|
53168
|
+
isTraversableNavigable(request.traversableForUserPrompts)
|
|
53169
|
+
)) {
|
|
51413
53170
|
// 2. If request’s body is non-null, then:
|
|
51414
53171
|
if (request.body != null) {
|
|
51415
53172
|
// 1. If request’s body’s source is null, then return a network error.
|
|
51416
53173
|
if (request.body.source == null) {
|
|
51417
|
-
|
|
53174
|
+
// Note: In Node.js, this code path should not be reached because
|
|
53175
|
+
// isTraversableNavigable() returns false for non-navigable contexts.
|
|
53176
|
+
// However, we handle it gracefully by returning the response instead of
|
|
53177
|
+
// a network error, as we won't actually retry the request.
|
|
53178
|
+
// This aligns with the Fetch spec discussion in whatwg/fetch#1132,
|
|
53179
|
+
// which allows implementations flexibility when credentials can't be obtained.
|
|
53180
|
+
return response
|
|
51418
53181
|
}
|
|
51419
53182
|
|
|
51420
53183
|
// 2. Set request’s body to the body of the result of safely extracting
|
|
@@ -51870,9 +53633,12 @@ function requireFetch () {
|
|
|
51870
53633
|
/** @type {import('../../..').Agent} */
|
|
51871
53634
|
const agent = fetchParams.controller.dispatcher;
|
|
51872
53635
|
|
|
53636
|
+
const path = url.pathname + url.search;
|
|
53637
|
+
const hasTrailingQuestionMark = url.search.length === 0 && url.href[url.href.length - url.hash.length - 1] === '?';
|
|
53638
|
+
|
|
51873
53639
|
return new Promise((resolve, reject) => agent.dispatch(
|
|
51874
53640
|
{
|
|
51875
|
-
path:
|
|
53641
|
+
path: hasTrailingQuestionMark ? `${path}?` : path,
|
|
51876
53642
|
origin: url.origin,
|
|
51877
53643
|
method: request.method,
|
|
51878
53644
|
body: agent.isMockActive ? request.body && (request.body.source || request.body.stream) : body,
|
|
@@ -51922,7 +53688,15 @@ function requireFetch () {
|
|
|
51922
53688
|
const headersList = new HeadersList();
|
|
51923
53689
|
|
|
51924
53690
|
for (let i = 0; i < rawHeaders.length; i += 2) {
|
|
51925
|
-
|
|
53691
|
+
const nameStr = bufferToLowerCasedHeaderName(rawHeaders[i]);
|
|
53692
|
+
const value = rawHeaders[i + 1];
|
|
53693
|
+
if (Array.isArray(value) && !Buffer.isBuffer(rawHeaders[i + 1])) {
|
|
53694
|
+
for (const val of value) {
|
|
53695
|
+
headersList.append(nameStr, val.toString('latin1'), true);
|
|
53696
|
+
}
|
|
53697
|
+
} else {
|
|
53698
|
+
headersList.append(nameStr, value.toString('latin1'), true);
|
|
53699
|
+
}
|
|
51926
53700
|
}
|
|
51927
53701
|
const location = headersList.get('location', true);
|
|
51928
53702
|
|
|
@@ -52091,7 +53865,15 @@ function requireFetch () {
|
|
|
52091
53865
|
const headersList = new HeadersList();
|
|
52092
53866
|
|
|
52093
53867
|
for (let i = 0; i < rawHeaders.length; i += 2) {
|
|
52094
|
-
|
|
53868
|
+
const nameStr = bufferToLowerCasedHeaderName(rawHeaders[i]);
|
|
53869
|
+
const value = rawHeaders[i + 1];
|
|
53870
|
+
if (Array.isArray(value) && !Buffer.isBuffer(rawHeaders[i + 1])) {
|
|
53871
|
+
for (const val of value) {
|
|
53872
|
+
headersList.append(nameStr, val.toString('latin1'), true);
|
|
53873
|
+
}
|
|
53874
|
+
} else {
|
|
53875
|
+
headersList.append(nameStr, value.toString('latin1'), true);
|
|
53876
|
+
}
|
|
52095
53877
|
}
|
|
52096
53878
|
|
|
52097
53879
|
resolve({
|
|
@@ -53523,7 +55305,6 @@ function requireParse$2 () {
|
|
|
53523
55305
|
const { maxNameValuePairSize, maxAttributeValueSize } = requireConstants$1();
|
|
53524
55306
|
const { isCTLExcludingHtab } = requireUtil$2();
|
|
53525
55307
|
const assert = require$$0$7;
|
|
53526
|
-
const { unescape: qsUnescape } = require$$5$1;
|
|
53527
55308
|
|
|
53528
55309
|
/**
|
|
53529
55310
|
* @description Parses the field-value attributes of a set-cookie header string.
|
|
@@ -53601,7 +55382,7 @@ function requireParse$2 () {
|
|
|
53601
55382
|
// store arbitrary data in a cookie-value SHOULD encode that data, for
|
|
53602
55383
|
// example, using Base64 [RFC4648].
|
|
53603
55384
|
return {
|
|
53604
|
-
name, value
|
|
55385
|
+
name, value, ...parseUnparsedAttributes(unparsedAttributes)
|
|
53605
55386
|
}
|
|
53606
55387
|
}
|
|
53607
55388
|
|
|
@@ -53799,32 +55580,25 @@ function requireParse$2 () {
|
|
|
53799
55580
|
// If the attribute-name case-insensitively matches the string
|
|
53800
55581
|
// "SameSite", the user agent MUST process the cookie-av as follows:
|
|
53801
55582
|
|
|
53802
|
-
// 1. Let enforcement be "Default".
|
|
53803
|
-
let enforcement = 'Default';
|
|
53804
|
-
|
|
53805
55583
|
const attributeValueLowercase = attributeValue.toLowerCase();
|
|
53806
|
-
// 2. If cookie-av's attribute-value is a case-insensitive match for
|
|
53807
|
-
// "None", set enforcement to "None".
|
|
53808
|
-
if (attributeValueLowercase.includes('none')) {
|
|
53809
|
-
enforcement = 'None';
|
|
53810
|
-
}
|
|
53811
|
-
|
|
53812
|
-
// 3. If cookie-av's attribute-value is a case-insensitive match for
|
|
53813
|
-
// "Strict", set enforcement to "Strict".
|
|
53814
|
-
if (attributeValueLowercase.includes('strict')) {
|
|
53815
|
-
enforcement = 'Strict';
|
|
53816
|
-
}
|
|
53817
55584
|
|
|
53818
|
-
//
|
|
53819
|
-
// "
|
|
53820
|
-
|
|
53821
|
-
|
|
55585
|
+
// 1. If cookie-av's attribute-value is a case-insensitive match for
|
|
55586
|
+
// "None", append an attribute to the cookie-attribute-list with an
|
|
55587
|
+
// attribute-name of "SameSite" and an attribute-value of "None".
|
|
55588
|
+
if (attributeValueLowercase === 'none') {
|
|
55589
|
+
cookieAttributeList.sameSite = 'None';
|
|
55590
|
+
} else if (attributeValueLowercase === 'strict') {
|
|
55591
|
+
// 2. If cookie-av's attribute-value is a case-insensitive match for
|
|
55592
|
+
// "Strict", append an attribute to the cookie-attribute-list with
|
|
55593
|
+
// an attribute-name of "SameSite" and an attribute-value of
|
|
55594
|
+
// "Strict".
|
|
55595
|
+
cookieAttributeList.sameSite = 'Strict';
|
|
55596
|
+
} else if (attributeValueLowercase === 'lax') {
|
|
55597
|
+
// 3. If cookie-av's attribute-value is a case-insensitive match for
|
|
55598
|
+
// "Lax", append an attribute to the cookie-attribute-list with an
|
|
55599
|
+
// attribute-name of "SameSite" and an attribute-value of "Lax".
|
|
55600
|
+
cookieAttributeList.sameSite = 'Lax';
|
|
53822
55601
|
}
|
|
53823
|
-
|
|
53824
|
-
// 5. Append an attribute to the cookie-attribute-list with an
|
|
53825
|
-
// attribute-name of "SameSite" and an attribute-value of
|
|
53826
|
-
// enforcement.
|
|
53827
|
-
cookieAttributeList.sameSite = enforcement;
|
|
53828
55602
|
} else {
|
|
53829
55603
|
cookieAttributeList.unparsed ??= [];
|
|
53830
55604
|
|
|
@@ -54530,7 +56304,7 @@ function requireUtil$1 () {
|
|
|
54530
56304
|
hasRequiredUtil$1 = 1;
|
|
54531
56305
|
|
|
54532
56306
|
const { states, opcodes } = requireConstants();
|
|
54533
|
-
const { isUtf8 } = require$$0$
|
|
56307
|
+
const { isUtf8 } = require$$0$a;
|
|
54534
56308
|
const { removeHTTPWhitespace } = requireDataUrl();
|
|
54535
56309
|
const { collectASequenceOfCodePointsFast } = requireInfra();
|
|
54536
56310
|
|
|
@@ -54756,6 +56530,12 @@ function requireUtil$1 () {
|
|
|
54756
56530
|
* @returns {boolean}
|
|
54757
56531
|
*/
|
|
54758
56532
|
function isValidClientWindowBits (value) {
|
|
56533
|
+
// Must have at least one character
|
|
56534
|
+
if (value.length === 0) {
|
|
56535
|
+
return false
|
|
56536
|
+
}
|
|
56537
|
+
|
|
56538
|
+
// Check all characters are ASCII digits
|
|
54759
56539
|
for (let i = 0; i < value.length; i++) {
|
|
54760
56540
|
const byte = value.charCodeAt(i);
|
|
54761
56541
|
|
|
@@ -54764,7 +56544,9 @@ function requireUtil$1 () {
|
|
|
54764
56544
|
}
|
|
54765
56545
|
}
|
|
54766
56546
|
|
|
54767
|
-
|
|
56547
|
+
// Check numeric range: zlib requires windowBits in range 8-15
|
|
56548
|
+
const num = Number.parseInt(value, 10);
|
|
56549
|
+
return num >= 8 && num <= 15
|
|
54768
56550
|
}
|
|
54769
56551
|
|
|
54770
56552
|
/**
|
|
@@ -55354,6 +57136,7 @@ function requirePermessageDeflate () {
|
|
|
55354
57136
|
|
|
55355
57137
|
const { createInflateRaw, Z_DEFAULT_WINDOWBITS } = require$$3$4;
|
|
55356
57138
|
const { isValidClientWindowBits } = requireUtil$1();
|
|
57139
|
+
const { MessageSizeExceededError } = requireErrors();
|
|
55357
57140
|
|
|
55358
57141
|
const tail = Buffer.from([0x00, 0x00, 0xff, 0xff]);
|
|
55359
57142
|
const kBuffer = Symbol('kBuffer');
|
|
@@ -55365,17 +57148,29 @@ function requirePermessageDeflate () {
|
|
|
55365
57148
|
|
|
55366
57149
|
#options = {}
|
|
55367
57150
|
|
|
55368
|
-
|
|
57151
|
+
#maxPayloadSize = 0
|
|
57152
|
+
|
|
57153
|
+
/**
|
|
57154
|
+
* @param {Map<string, string>} extensions
|
|
57155
|
+
*/
|
|
57156
|
+
constructor (extensions, options) {
|
|
55369
57157
|
this.#options.serverNoContextTakeover = extensions.has('server_no_context_takeover');
|
|
55370
57158
|
this.#options.serverMaxWindowBits = extensions.get('server_max_window_bits');
|
|
57159
|
+
|
|
57160
|
+
this.#maxPayloadSize = options.maxPayloadSize;
|
|
55371
57161
|
}
|
|
55372
57162
|
|
|
57163
|
+
/**
|
|
57164
|
+
* Decompress a compressed payload.
|
|
57165
|
+
* @param {Buffer} chunk Compressed data
|
|
57166
|
+
* @param {boolean} fin Final fragment flag
|
|
57167
|
+
* @param {Function} callback Callback function
|
|
57168
|
+
*/
|
|
55373
57169
|
decompress (chunk, fin, callback) {
|
|
55374
57170
|
// An endpoint uses the following algorithm to decompress a message.
|
|
55375
57171
|
// 1. Append 4 octets of 0x00 0x00 0xff 0xff to the tail end of the
|
|
55376
57172
|
// payload of the message.
|
|
55377
57173
|
// 2. Decompress the resulting data using DEFLATE.
|
|
55378
|
-
|
|
55379
57174
|
if (!this.#inflate) {
|
|
55380
57175
|
let windowBits = Z_DEFAULT_WINDOWBITS;
|
|
55381
57176
|
|
|
@@ -55388,13 +57183,26 @@ function requirePermessageDeflate () {
|
|
|
55388
57183
|
windowBits = Number.parseInt(this.#options.serverMaxWindowBits);
|
|
55389
57184
|
}
|
|
55390
57185
|
|
|
55391
|
-
|
|
57186
|
+
try {
|
|
57187
|
+
this.#inflate = createInflateRaw({ windowBits });
|
|
57188
|
+
} catch (err) {
|
|
57189
|
+
callback(err);
|
|
57190
|
+
return
|
|
57191
|
+
}
|
|
55392
57192
|
this.#inflate[kBuffer] = [];
|
|
55393
57193
|
this.#inflate[kLength] = 0;
|
|
55394
57194
|
|
|
55395
57195
|
this.#inflate.on('data', (data) => {
|
|
55396
|
-
this.#inflate[kBuffer].push(data);
|
|
55397
57196
|
this.#inflate[kLength] += data.length;
|
|
57197
|
+
|
|
57198
|
+
if (this.#maxPayloadSize > 0 && this.#inflate[kLength] > this.#maxPayloadSize) {
|
|
57199
|
+
callback(new MessageSizeExceededError());
|
|
57200
|
+
this.#inflate.removeAllListeners();
|
|
57201
|
+
this.#inflate = null;
|
|
57202
|
+
return
|
|
57203
|
+
}
|
|
57204
|
+
|
|
57205
|
+
this.#inflate[kBuffer].push(data);
|
|
55398
57206
|
});
|
|
55399
57207
|
|
|
55400
57208
|
this.#inflate.on('error', (err) => {
|
|
@@ -55409,6 +57217,10 @@ function requirePermessageDeflate () {
|
|
|
55409
57217
|
}
|
|
55410
57218
|
|
|
55411
57219
|
this.#inflate.flush(() => {
|
|
57220
|
+
if (!this.#inflate) {
|
|
57221
|
+
return
|
|
57222
|
+
}
|
|
57223
|
+
|
|
55412
57224
|
const full = Buffer.concat(this.#inflate[kBuffer], this.#inflate[kLength]);
|
|
55413
57225
|
|
|
55414
57226
|
this.#inflate[kBuffer].length = 0;
|
|
@@ -55445,6 +57257,7 @@ function requireReceiver () {
|
|
|
55445
57257
|
const { failWebsocketConnection } = requireConnection();
|
|
55446
57258
|
const { WebsocketFrameSend } = requireFrame();
|
|
55447
57259
|
const { PerMessageDeflate } = requirePermessageDeflate();
|
|
57260
|
+
const { MessageSizeExceededError } = requireErrors();
|
|
55448
57261
|
|
|
55449
57262
|
// This code was influenced by ws released under the MIT license.
|
|
55450
57263
|
// Copyright (c) 2011 Einar Otto Stangvik <einaros@gmail.com>
|
|
@@ -55468,14 +57281,27 @@ function requireReceiver () {
|
|
|
55468
57281
|
/** @type {import('./websocket').Handler} */
|
|
55469
57282
|
#handler
|
|
55470
57283
|
|
|
55471
|
-
|
|
57284
|
+
/** @type {number} */
|
|
57285
|
+
#maxFragments
|
|
57286
|
+
|
|
57287
|
+
/** @type {number} */
|
|
57288
|
+
#maxPayloadSize
|
|
57289
|
+
|
|
57290
|
+
/**
|
|
57291
|
+
* @param {import('./websocket').Handler} handler
|
|
57292
|
+
* @param {Map<string, string>|null} extensions
|
|
57293
|
+
* @param {{ maxFragments?: number, maxPayloadSize?: number }} [options]
|
|
57294
|
+
*/
|
|
57295
|
+
constructor (handler, extensions, options = {}) {
|
|
55472
57296
|
super();
|
|
55473
57297
|
|
|
55474
57298
|
this.#handler = handler;
|
|
55475
57299
|
this.#extensions = extensions == null ? new Map() : extensions;
|
|
57300
|
+
this.#maxFragments = options.maxFragments ?? 0;
|
|
57301
|
+
this.#maxPayloadSize = options.maxPayloadSize ?? 0;
|
|
55476
57302
|
|
|
55477
57303
|
if (this.#extensions.has('permessage-deflate')) {
|
|
55478
|
-
this.#extensions.set('permessage-deflate', new PerMessageDeflate(extensions));
|
|
57304
|
+
this.#extensions.set('permessage-deflate', new PerMessageDeflate(extensions, options));
|
|
55479
57305
|
}
|
|
55480
57306
|
}
|
|
55481
57307
|
|
|
@@ -55491,6 +57317,19 @@ function requireReceiver () {
|
|
|
55491
57317
|
this.run(callback);
|
|
55492
57318
|
}
|
|
55493
57319
|
|
|
57320
|
+
#validatePayloadLength () {
|
|
57321
|
+
if (
|
|
57322
|
+
this.#maxPayloadSize > 0 &&
|
|
57323
|
+
!isControlFrame(this.#info.opcode) &&
|
|
57324
|
+
this.#info.payloadLength + this.#fragmentsBytes > this.#maxPayloadSize
|
|
57325
|
+
) {
|
|
57326
|
+
failWebsocketConnection(this.#handler, 1009, 'Payload size exceeds maximum allowed size');
|
|
57327
|
+
return false
|
|
57328
|
+
}
|
|
57329
|
+
|
|
57330
|
+
return true
|
|
57331
|
+
}
|
|
57332
|
+
|
|
55494
57333
|
/**
|
|
55495
57334
|
* Runs whenever a new chunk is received.
|
|
55496
57335
|
* Callback is called whenever there are no more chunks buffering,
|
|
@@ -55579,6 +57418,10 @@ function requireReceiver () {
|
|
|
55579
57418
|
if (payloadLength <= 125) {
|
|
55580
57419
|
this.#info.payloadLength = payloadLength;
|
|
55581
57420
|
this.#state = parserStates.READ_DATA;
|
|
57421
|
+
|
|
57422
|
+
if (!this.#validatePayloadLength()) {
|
|
57423
|
+
return
|
|
57424
|
+
}
|
|
55582
57425
|
} else if (payloadLength === 126) {
|
|
55583
57426
|
this.#state = parserStates.PAYLOADLENGTH_16;
|
|
55584
57427
|
} else if (payloadLength === 127) {
|
|
@@ -55603,6 +57446,10 @@ function requireReceiver () {
|
|
|
55603
57446
|
|
|
55604
57447
|
this.#info.payloadLength = buffer.readUInt16BE(0);
|
|
55605
57448
|
this.#state = parserStates.READ_DATA;
|
|
57449
|
+
|
|
57450
|
+
if (!this.#validatePayloadLength()) {
|
|
57451
|
+
return
|
|
57452
|
+
}
|
|
55606
57453
|
} else if (this.#state === parserStates.PAYLOADLENGTH_64) {
|
|
55607
57454
|
if (this.#byteOffset < 8) {
|
|
55608
57455
|
return callback()
|
|
@@ -55610,6 +57457,7 @@ function requireReceiver () {
|
|
|
55610
57457
|
|
|
55611
57458
|
const buffer = this.consume(8);
|
|
55612
57459
|
const upper = buffer.readUInt32BE(0);
|
|
57460
|
+
const lower = buffer.readUInt32BE(4);
|
|
55613
57461
|
|
|
55614
57462
|
// 2^31 is the maximum bytes an arraybuffer can contain
|
|
55615
57463
|
// on 32-bit systems. Although, on 64-bit systems, this is
|
|
@@ -55617,15 +57465,17 @@ function requireReceiver () {
|
|
|
55617
57465
|
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Invalid_array_length
|
|
55618
57466
|
// https://source.chromium.org/chromium/chromium/src/+/main:v8/src/common/globals.h;drc=1946212ac0100668f14eb9e2843bdd846e510a1e;bpv=1;bpt=1;l=1275
|
|
55619
57467
|
// https://source.chromium.org/chromium/chromium/src/+/main:v8/src/objects/js-array-buffer.h;l=34;drc=1946212ac0100668f14eb9e2843bdd846e510a1e
|
|
55620
|
-
if (upper > 2 ** 31 - 1) {
|
|
57468
|
+
if (upper !== 0 || lower > 2 ** 31 - 1) {
|
|
55621
57469
|
failWebsocketConnection(this.#handler, 1009, 'Received payload length > 2^31 bytes.');
|
|
55622
57470
|
return
|
|
55623
57471
|
}
|
|
55624
57472
|
|
|
55625
|
-
|
|
55626
|
-
|
|
55627
|
-
this.#info.payloadLength = (upper << 8) + lower;
|
|
57473
|
+
this.#info.payloadLength = lower;
|
|
55628
57474
|
this.#state = parserStates.READ_DATA;
|
|
57475
|
+
|
|
57476
|
+
if (!this.#validatePayloadLength()) {
|
|
57477
|
+
return
|
|
57478
|
+
}
|
|
55629
57479
|
} else if (this.#state === parserStates.READ_DATA) {
|
|
55630
57480
|
if (this.#byteOffset < this.#info.payloadLength) {
|
|
55631
57481
|
return callback()
|
|
@@ -55638,7 +57488,9 @@ function requireReceiver () {
|
|
|
55638
57488
|
this.#state = parserStates.INFO;
|
|
55639
57489
|
} else {
|
|
55640
57490
|
if (!this.#info.compressed) {
|
|
55641
|
-
this.writeFragments(body)
|
|
57491
|
+
if (!this.writeFragments(body)) {
|
|
57492
|
+
return
|
|
57493
|
+
}
|
|
55642
57494
|
|
|
55643
57495
|
// If the frame is not fragmented, a message has been received.
|
|
55644
57496
|
// If the frame is fragmented, it will terminate with a fin bit set
|
|
@@ -55650,27 +57502,41 @@ function requireReceiver () {
|
|
|
55650
57502
|
|
|
55651
57503
|
this.#state = parserStates.INFO;
|
|
55652
57504
|
} else {
|
|
55653
|
-
this.#extensions.get('permessage-deflate').decompress(
|
|
55654
|
-
|
|
55655
|
-
|
|
55656
|
-
|
|
55657
|
-
|
|
57505
|
+
this.#extensions.get('permessage-deflate').decompress(
|
|
57506
|
+
body,
|
|
57507
|
+
this.#info.fin,
|
|
57508
|
+
(error, data) => {
|
|
57509
|
+
if (error) {
|
|
57510
|
+
const code = error instanceof MessageSizeExceededError ? 1009 : 1007;
|
|
57511
|
+
failWebsocketConnection(this.#handler, code, error.message);
|
|
57512
|
+
return
|
|
57513
|
+
}
|
|
55658
57514
|
|
|
55659
|
-
|
|
57515
|
+
if (!this.writeFragments(data)) {
|
|
57516
|
+
return
|
|
57517
|
+
}
|
|
55660
57518
|
|
|
55661
|
-
|
|
55662
|
-
this.#
|
|
55663
|
-
|
|
55664
|
-
|
|
55665
|
-
|
|
55666
|
-
}
|
|
57519
|
+
// Check cumulative fragment size
|
|
57520
|
+
if (this.#maxPayloadSize > 0 && this.#fragmentsBytes > this.#maxPayloadSize) {
|
|
57521
|
+
failWebsocketConnection(this.#handler, 1009, new MessageSizeExceededError().message);
|
|
57522
|
+
return
|
|
57523
|
+
}
|
|
55667
57524
|
|
|
55668
|
-
|
|
57525
|
+
if (!this.#info.fin) {
|
|
57526
|
+
this.#state = parserStates.INFO;
|
|
57527
|
+
this.#loop = true;
|
|
57528
|
+
this.run(callback);
|
|
57529
|
+
return
|
|
57530
|
+
}
|
|
55669
57531
|
|
|
55670
|
-
|
|
55671
|
-
|
|
55672
|
-
|
|
55673
|
-
|
|
57532
|
+
websocketMessageReceived(this.#handler, this.#info.binaryType, this.consumeFragments());
|
|
57533
|
+
|
|
57534
|
+
this.#loop = true;
|
|
57535
|
+
this.#state = parserStates.INFO;
|
|
57536
|
+
this.run(callback);
|
|
57537
|
+
},
|
|
57538
|
+
this.#fragmentsBytes
|
|
57539
|
+
);
|
|
55674
57540
|
|
|
55675
57541
|
this.#loop = false;
|
|
55676
57542
|
break
|
|
@@ -55729,8 +57595,17 @@ function requireReceiver () {
|
|
|
55729
57595
|
}
|
|
55730
57596
|
|
|
55731
57597
|
writeFragments (fragment) {
|
|
57598
|
+
if (
|
|
57599
|
+
this.#maxFragments > 0 &&
|
|
57600
|
+
this.#fragments.length === this.#maxFragments
|
|
57601
|
+
) {
|
|
57602
|
+
failWebsocketConnection(this.#handler, 1008, 'Too many message fragments');
|
|
57603
|
+
return false
|
|
57604
|
+
}
|
|
57605
|
+
|
|
55732
57606
|
this.#fragmentsBytes += fragment.length;
|
|
55733
57607
|
this.#fragments.push(fragment);
|
|
57608
|
+
return true
|
|
55734
57609
|
}
|
|
55735
57610
|
|
|
55736
57611
|
consumeFragments () {
|
|
@@ -56024,6 +57899,18 @@ function requireWebsocket () {
|
|
|
56024
57899
|
const { WebsocketFrameSend } = requireFrame();
|
|
56025
57900
|
const { channels } = requireDiagnostics();
|
|
56026
57901
|
|
|
57902
|
+
function getSocketAddress (socket) {
|
|
57903
|
+
if (typeof socket?.address === 'function') {
|
|
57904
|
+
return socket.address()
|
|
57905
|
+
}
|
|
57906
|
+
|
|
57907
|
+
if (typeof socket?.session?.socket?.address === 'function') {
|
|
57908
|
+
return socket.session.socket.address()
|
|
57909
|
+
}
|
|
57910
|
+
|
|
57911
|
+
return null
|
|
57912
|
+
}
|
|
57913
|
+
|
|
56027
57914
|
/**
|
|
56028
57915
|
* @typedef {object} Handler
|
|
56029
57916
|
* @property {(response: any, extensions?: string[]) => void} onConnectionEstablished
|
|
@@ -56451,11 +58338,18 @@ function requireWebsocket () {
|
|
|
56451
58338
|
* @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol
|
|
56452
58339
|
*/
|
|
56453
58340
|
#onConnectionEstablished (response, parsedExtensions) {
|
|
56454
|
-
// processResponse is called when the "response
|
|
58341
|
+
// processResponse is called when the "response's header list has been received and initialized."
|
|
56455
58342
|
// once this happens, the connection is open
|
|
56456
58343
|
this.#handler.socket = response.socket;
|
|
56457
58344
|
|
|
56458
|
-
const
|
|
58345
|
+
const webSocketOptions = this.#handler.controller.dispatcher?.webSocketOptions;
|
|
58346
|
+
const maxFragments = webSocketOptions?.maxFragments;
|
|
58347
|
+
const maxPayloadSize = webSocketOptions?.maxPayloadSize;
|
|
58348
|
+
|
|
58349
|
+
const parser = new ByteParser(this.#handler, parsedExtensions, {
|
|
58350
|
+
maxFragments,
|
|
58351
|
+
maxPayloadSize
|
|
58352
|
+
});
|
|
56459
58353
|
parser.on('drain', () => this.#handler.onParserDrain());
|
|
56460
58354
|
parser.on('error', (err) => this.#handler.onParserError(err));
|
|
56461
58355
|
|
|
@@ -56490,7 +58384,7 @@ function requireWebsocket () {
|
|
|
56490
58384
|
// Convert headers to a plain object for the event
|
|
56491
58385
|
const headers = response.headersList.entries;
|
|
56492
58386
|
channels.open.publish({
|
|
56493
|
-
address: response.socket
|
|
58387
|
+
address: getSocketAddress(response.socket),
|
|
56494
58388
|
protocol: this.#protocol,
|
|
56495
58389
|
extensions: this.#extensions,
|
|
56496
58390
|
websocket: this,
|
|
@@ -57116,7 +59010,14 @@ function requireWebsocketstream () {
|
|
|
57116
59010
|
#onConnectionEstablished (response, parsedExtensions) {
|
|
57117
59011
|
this.#handler.socket = response.socket;
|
|
57118
59012
|
|
|
57119
|
-
|
|
59013
|
+
// Get options from dispatcher options
|
|
59014
|
+
const maxFragments = this.#handler.controller.dispatcher?.webSocketOptions?.maxFragments;
|
|
59015
|
+
const maxPayloadSize = this.#handler.controller.dispatcher?.webSocketOptions?.maxPayloadSize;
|
|
59016
|
+
|
|
59017
|
+
const parser = new ByteParser(this.#handler, parsedExtensions, {
|
|
59018
|
+
maxFragments,
|
|
59019
|
+
maxPayloadSize
|
|
59020
|
+
});
|
|
57120
59021
|
parser.on('drain', () => this.#handler.onParserDrain());
|
|
57121
59022
|
parser.on('error', (err) => this.#handler.onParserError(err));
|
|
57122
59023
|
|
|
@@ -57142,12 +59043,6 @@ function requireWebsocketstream () {
|
|
|
57142
59043
|
start: (controller) => {
|
|
57143
59044
|
this.#readableStreamController = controller;
|
|
57144
59045
|
},
|
|
57145
|
-
pull (controller) {
|
|
57146
|
-
let chunk;
|
|
57147
|
-
while (controller.desiredSize > 0 && (chunk = response.socket.read()) !== null) {
|
|
57148
|
-
controller.enqueue(chunk);
|
|
57149
|
-
}
|
|
57150
|
-
},
|
|
57151
59046
|
cancel: (reason) => this.#cancel(reason)
|
|
57152
59047
|
});
|
|
57153
59048
|
|
|
@@ -57196,7 +59091,7 @@ function requireWebsocketstream () {
|
|
|
57196
59091
|
try {
|
|
57197
59092
|
chunk = utf8Decode(data);
|
|
57198
59093
|
} catch {
|
|
57199
|
-
failWebsocketConnection(this.#handler, 'Received invalid UTF-8 in text frame.');
|
|
59094
|
+
failWebsocketConnection(this.#handler, 1007, 'Received invalid UTF-8 in text frame.');
|
|
57200
59095
|
return
|
|
57201
59096
|
}
|
|
57202
59097
|
} else if (type === opcodes.BINARY) {
|
|
@@ -58325,6 +60220,7 @@ function requireUndici () {
|
|
|
58325
60220
|
const RoundRobinPool = requireRoundRobinPool();
|
|
58326
60221
|
const Agent = requireAgent();
|
|
58327
60222
|
const ProxyAgent = requireProxyAgent();
|
|
60223
|
+
const Socks5ProxyAgent = requireSocks5ProxyAgent();
|
|
58328
60224
|
const EnvHttpProxyAgent = requireEnvHttpProxyAgent();
|
|
58329
60225
|
const RetryAgent = requireRetryAgent();
|
|
58330
60226
|
const H2CClient = requireH2cClient();
|
|
@@ -58353,6 +60249,7 @@ function requireUndici () {
|
|
|
58353
60249
|
module.exports.RoundRobinPool = RoundRobinPool;
|
|
58354
60250
|
module.exports.Agent = Agent;
|
|
58355
60251
|
module.exports.ProxyAgent = ProxyAgent;
|
|
60252
|
+
module.exports.Socks5ProxyAgent = Socks5ProxyAgent;
|
|
58356
60253
|
module.exports.EnvHttpProxyAgent = EnvHttpProxyAgent;
|
|
58357
60254
|
module.exports.RetryAgent = RetryAgent;
|
|
58358
60255
|
module.exports.H2CClient = H2CClient;
|
|
@@ -62047,7 +63944,7 @@ function requireInternal () {
|
|
|
62047
63944
|
//------------------------------------------------------------------------------
|
|
62048
63945
|
|
|
62049
63946
|
// We use node.js internal decoder. Its signature is the same as ours.
|
|
62050
|
-
var StringDecoder = require$$1$
|
|
63947
|
+
var StringDecoder = require$$1$9.StringDecoder;
|
|
62051
63948
|
|
|
62052
63949
|
if (!StringDecoder.prototype.end) // Node v0.8 doesn't have this method.
|
|
62053
63950
|
StringDecoder.prototype.end = function() {};
|
|
@@ -85575,11 +87472,7 @@ function requireJson () {
|
|
|
85575
87472
|
var partial = '';
|
|
85576
87473
|
|
|
85577
87474
|
if (index !== -1) {
|
|
85578
|
-
partial = str.substring(0, index) + JSON_SYNTAX_CHAR;
|
|
85579
|
-
|
|
85580
|
-
for (var i = index + 1; i < str.length; i++) {
|
|
85581
|
-
partial += JSON_SYNTAX_CHAR;
|
|
85582
|
-
}
|
|
87475
|
+
partial = str.substring(0, index) + new Array(str.length - index + 1).join(JSON_SYNTAX_CHAR);
|
|
85583
87476
|
}
|
|
85584
87477
|
|
|
85585
87478
|
try {
|
|
@@ -87972,6 +89865,8 @@ function requireUtils$1 () {
|
|
|
87972
89865
|
var newIndex = getMaxIndex(target) + 1;
|
|
87973
89866
|
target[newIndex] = source;
|
|
87974
89867
|
setMaxIndex(target, newIndex);
|
|
89868
|
+
} else if (options && options.strictMerge) {
|
|
89869
|
+
return [target, source];
|
|
87975
89870
|
} else if (
|
|
87976
89871
|
(options && (options.plainObjects || options.allowPrototypes))
|
|
87977
89872
|
|| !has.call(Object.prototype, source)
|
|
@@ -88353,7 +90248,7 @@ function requireStringify () {
|
|
|
88353
90248
|
|
|
88354
90249
|
if (obj === null) {
|
|
88355
90250
|
if (strictNullHandling) {
|
|
88356
|
-
return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder, charset, 'key', format) : prefix;
|
|
90251
|
+
return formatter(encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder, charset, 'key', format) : prefix);
|
|
88357
90252
|
}
|
|
88358
90253
|
|
|
88359
90254
|
obj = '';
|
|
@@ -88377,7 +90272,9 @@ function requireStringify () {
|
|
|
88377
90272
|
if (generateArrayPrefix === 'comma' && isArray(obj)) {
|
|
88378
90273
|
// we need to join elements in
|
|
88379
90274
|
if (encodeValuesOnly && encoder) {
|
|
88380
|
-
obj = utils.maybeMap(obj,
|
|
90275
|
+
obj = utils.maybeMap(obj, function (v) {
|
|
90276
|
+
return v == null ? v : encoder(v);
|
|
90277
|
+
});
|
|
88381
90278
|
}
|
|
88382
90279
|
objKeys = [{ value: obj.length > 0 ? obj.join(',') || null : void undefined }];
|
|
88383
90280
|
} else if (isArray(filter)) {
|
|
@@ -88547,6 +90444,11 @@ function requireStringify () {
|
|
|
88547
90444
|
var sideChannel = getSideChannel();
|
|
88548
90445
|
for (var i = 0; i < objKeys.length; ++i) {
|
|
88549
90446
|
var key = objKeys[i];
|
|
90447
|
+
|
|
90448
|
+
if (typeof key === 'undefined' || key === null) {
|
|
90449
|
+
continue;
|
|
90450
|
+
}
|
|
90451
|
+
|
|
88550
90452
|
var value = obj[key];
|
|
88551
90453
|
|
|
88552
90454
|
if (options.skipNulls && value === null) {
|
|
@@ -88580,10 +90482,10 @@ function requireStringify () {
|
|
|
88580
90482
|
if (options.charsetSentinel) {
|
|
88581
90483
|
if (options.charset === 'iso-8859-1') {
|
|
88582
90484
|
// encodeURIComponent('✓'), the "numeric entity" representation of a checkmark
|
|
88583
|
-
prefix += 'utf8=%26%2310003%3B
|
|
90485
|
+
prefix += 'utf8=%26%2310003%3B' + options.delimiter;
|
|
88584
90486
|
} else {
|
|
88585
90487
|
// encodeURIComponent('✓')
|
|
88586
|
-
prefix += 'utf8=%E2%9C%93
|
|
90488
|
+
prefix += 'utf8=%E2%9C%93' + options.delimiter;
|
|
88587
90489
|
}
|
|
88588
90490
|
}
|
|
88589
90491
|
|
|
@@ -88624,6 +90526,7 @@ function requireParse$1 () {
|
|
|
88624
90526
|
parseArrays: true,
|
|
88625
90527
|
plainObjects: false,
|
|
88626
90528
|
strictDepth: false,
|
|
90529
|
+
strictMerge: true,
|
|
88627
90530
|
strictNullHandling: false,
|
|
88628
90531
|
throwOnLimitExceeded: false
|
|
88629
90532
|
};
|
|
@@ -88665,10 +90568,10 @@ function requireParse$1 () {
|
|
|
88665
90568
|
var limit = options.parameterLimit === Infinity ? void undefined : options.parameterLimit;
|
|
88666
90569
|
var parts = cleanStr.split(
|
|
88667
90570
|
options.delimiter,
|
|
88668
|
-
options.throwOnLimitExceeded ? limit + 1 : limit
|
|
90571
|
+
options.throwOnLimitExceeded && typeof limit !== 'undefined' ? limit + 1 : limit
|
|
88669
90572
|
);
|
|
88670
90573
|
|
|
88671
|
-
if (options.throwOnLimitExceeded && parts.length > limit) {
|
|
90574
|
+
if (options.throwOnLimitExceeded && typeof limit !== 'undefined' && parts.length > limit) {
|
|
88672
90575
|
throw new RangeError('Parameter limit exceeded. Only ' + limit + ' parameter' + (limit === 1 ? '' : 's') + ' allowed.');
|
|
88673
90576
|
}
|
|
88674
90577
|
|
|
@@ -88738,7 +90641,7 @@ function requireParse$1 () {
|
|
|
88738
90641
|
|
|
88739
90642
|
if (key !== null) {
|
|
88740
90643
|
var existing = has.call(obj, key);
|
|
88741
|
-
if (existing && options.duplicates === 'combine') {
|
|
90644
|
+
if (existing && (options.duplicates === 'combine' || part.indexOf('[]=') > -1)) {
|
|
88742
90645
|
obj[key] = utils.combine(
|
|
88743
90646
|
obj[key],
|
|
88744
90647
|
val,
|
|
@@ -88812,9 +90715,12 @@ function requireParse$1 () {
|
|
|
88812
90715
|
return leaf;
|
|
88813
90716
|
};
|
|
88814
90717
|
|
|
88815
|
-
|
|
88816
|
-
|
|
90718
|
+
// Split a key like "a[b][c[]]" into ['a', '[b]', '[c[]]'] while preserving
|
|
90719
|
+
// qs parse semantics for depth/prototype guards.
|
|
90720
|
+
var splitKeyIntoSegments = function splitKeyIntoSegments(originalKey, options) {
|
|
90721
|
+
var key = options.allowDots ? originalKey.replace(/\.([^.[]+)/g, '[$1]') : originalKey;
|
|
88817
90722
|
|
|
90723
|
+
// depth <= 0 keeps the whole key as one segment
|
|
88818
90724
|
if (options.depth <= 0) {
|
|
88819
90725
|
if (!options.plainObjects && has.call(Object.prototype, key)) {
|
|
88820
90726
|
if (!options.allowPrototypes) {
|
|
@@ -88825,14 +90731,11 @@ function requireParse$1 () {
|
|
|
88825
90731
|
return [key];
|
|
88826
90732
|
}
|
|
88827
90733
|
|
|
88828
|
-
var
|
|
88829
|
-
var child = /(\[[^[\]]*])/g;
|
|
88830
|
-
|
|
88831
|
-
var segment = brackets.exec(key);
|
|
88832
|
-
var parent = segment ? key.slice(0, segment.index) : key;
|
|
88833
|
-
|
|
88834
|
-
var keys = [];
|
|
90734
|
+
var segments = [];
|
|
88835
90735
|
|
|
90736
|
+
// parent before the first '[' (may be empty if key starts with '[')
|
|
90737
|
+
var first = key.indexOf('[');
|
|
90738
|
+
var parent = first >= 0 ? key.slice(0, first) : key;
|
|
88836
90739
|
if (parent) {
|
|
88837
90740
|
if (!options.plainObjects && has.call(Object.prototype, parent)) {
|
|
88838
90741
|
if (!options.allowPrototypes) {
|
|
@@ -88840,32 +90743,62 @@ function requireParse$1 () {
|
|
|
88840
90743
|
}
|
|
88841
90744
|
}
|
|
88842
90745
|
|
|
88843
|
-
|
|
90746
|
+
segments[segments.length] = parent;
|
|
88844
90747
|
}
|
|
88845
90748
|
|
|
88846
|
-
var
|
|
88847
|
-
|
|
88848
|
-
|
|
90749
|
+
var n = key.length;
|
|
90750
|
+
var open = first;
|
|
90751
|
+
var collected = 0;
|
|
88849
90752
|
|
|
88850
|
-
|
|
88851
|
-
|
|
88852
|
-
|
|
88853
|
-
|
|
90753
|
+
while (open >= 0 && collected < options.depth) {
|
|
90754
|
+
var level = 1;
|
|
90755
|
+
var i = open + 1;
|
|
90756
|
+
var close = -1;
|
|
90757
|
+
|
|
90758
|
+
// balance nested '[' and ']' inside this bracket group using a nesting level counter
|
|
90759
|
+
while (i < n && close < 0) {
|
|
90760
|
+
var cu = key.charCodeAt(i);
|
|
90761
|
+
if (cu === 0x5B) { // '['
|
|
90762
|
+
level += 1;
|
|
90763
|
+
} else if (cu === 0x5D) { // ']'
|
|
90764
|
+
level -= 1;
|
|
90765
|
+
if (level === 0) {
|
|
90766
|
+
close = i; // found matching close; loop will exit by condition
|
|
90767
|
+
}
|
|
88854
90768
|
}
|
|
90769
|
+
i += 1;
|
|
90770
|
+
}
|
|
90771
|
+
|
|
90772
|
+
if (close < 0) {
|
|
90773
|
+
// Unterminated group: wrap the raw remainder in one bracket pair so it stays
|
|
90774
|
+
// a single literal segment (e.g. "[[]b" -> "[[]b]"); we do not infer missing ']'.
|
|
90775
|
+
segments[segments.length] = '[' + key.slice(open) + ']';
|
|
90776
|
+
return segments;
|
|
88855
90777
|
}
|
|
88856
90778
|
|
|
88857
|
-
|
|
90779
|
+
var seg = key.slice(open, close + 1);
|
|
90780
|
+
// prototype guard for the content of this group
|
|
90781
|
+
var content = seg.slice(1, -1);
|
|
90782
|
+
if (!options.plainObjects && has.call(Object.prototype, content) && !options.allowPrototypes) {
|
|
90783
|
+
return;
|
|
90784
|
+
}
|
|
90785
|
+
|
|
90786
|
+
segments[segments.length] = seg;
|
|
90787
|
+
collected += 1;
|
|
90788
|
+
|
|
90789
|
+
// find the next '[' after this balanced group
|
|
90790
|
+
open = key.indexOf('[', close + 1);
|
|
88858
90791
|
}
|
|
88859
90792
|
|
|
88860
|
-
if (
|
|
90793
|
+
if (open >= 0) {
|
|
88861
90794
|
if (options.strictDepth === true) {
|
|
88862
90795
|
throw new RangeError('Input depth exceeded depth option of ' + options.depth + ' and strictDepth is true');
|
|
88863
90796
|
}
|
|
88864
90797
|
|
|
88865
|
-
|
|
90798
|
+
segments[segments.length] = '[' + key.slice(open) + ']';
|
|
88866
90799
|
}
|
|
88867
90800
|
|
|
88868
|
-
return
|
|
90801
|
+
return segments;
|
|
88869
90802
|
};
|
|
88870
90803
|
|
|
88871
90804
|
var parseKeys = function parseQueryStringKeys(givenKey, val, options, valuesParsed) {
|
|
@@ -88938,6 +90871,7 @@ function requireParse$1 () {
|
|
|
88938
90871
|
parseArrays: opts.parseArrays !== false,
|
|
88939
90872
|
plainObjects: typeof opts.plainObjects === 'boolean' ? opts.plainObjects : defaults.plainObjects,
|
|
88940
90873
|
strictDepth: typeof opts.strictDepth === 'boolean' ? !!opts.strictDepth : defaults.strictDepth,
|
|
90874
|
+
strictMerge: typeof opts.strictMerge === 'boolean' ? !!opts.strictMerge : defaults.strictMerge,
|
|
88941
90875
|
strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling,
|
|
88942
90876
|
throwOnLimitExceeded: typeof opts.throwOnLimitExceeded === 'boolean' ? opts.throwOnLimitExceeded : false
|
|
88943
90877
|
};
|
|
@@ -89203,16 +91137,15 @@ function requireUrlencoded () {
|
|
|
89203
91137
|
|
|
89204
91138
|
function parameterCount (body, limit) {
|
|
89205
91139
|
var count = 0;
|
|
89206
|
-
var index =
|
|
91140
|
+
var index = -1;
|
|
89207
91141
|
|
|
89208
|
-
|
|
91142
|
+
do {
|
|
89209
91143
|
count++;
|
|
89210
|
-
|
|
89211
|
-
|
|
89212
|
-
if (count === limit) {
|
|
91144
|
+
if (count > limit) {
|
|
89213
91145
|
return undefined
|
|
89214
91146
|
}
|
|
89215
|
-
|
|
91147
|
+
index = body.indexOf('&', index + 1);
|
|
91148
|
+
} while (index !== -1)
|
|
89216
91149
|
|
|
89217
91150
|
return count
|
|
89218
91151
|
}
|
|
@@ -90597,6 +92530,7 @@ function requirePathToRegexp () {
|
|
|
90597
92530
|
pos = offset + match.length;
|
|
90598
92531
|
|
|
90599
92532
|
if (match === '*') {
|
|
92533
|
+
backtrack = '';
|
|
90600
92534
|
extraOffset += 3;
|
|
90601
92535
|
return '(.*)';
|
|
90602
92536
|
}
|
|
@@ -90626,6 +92560,7 @@ function requirePathToRegexp () {
|
|
|
90626
92560
|
+ ')'
|
|
90627
92561
|
+ optional;
|
|
90628
92562
|
|
|
92563
|
+
backtrack = '';
|
|
90629
92564
|
extraOffset += result.length - match.length;
|
|
90630
92565
|
|
|
90631
92566
|
return result;
|
|
@@ -99148,7 +101083,8 @@ function requireUtils () {
|
|
|
99148
101083
|
|
|
99149
101084
|
function parseExtendedQueryString(str) {
|
|
99150
101085
|
return qs.parse(str, {
|
|
99151
|
-
allowPrototypes: true
|
|
101086
|
+
allowPrototypes: true,
|
|
101087
|
+
arrayLimit: 1000
|
|
99152
101088
|
});
|
|
99153
101089
|
}
|
|
99154
101090
|
|
|
@@ -127658,6 +129594,55 @@ class HuggingFaceClient {
|
|
|
127658
129594
|
modelType: data.config?.model_type ?? data.gguf?.architecture
|
|
127659
129595
|
};
|
|
127660
129596
|
}
|
|
129597
|
+
async fetchQuantizationFileSize(modelSlug, quantization) {
|
|
129598
|
+
if (!quantization)
|
|
129599
|
+
return null;
|
|
129600
|
+
const listParams = {
|
|
129601
|
+
accessToken: this.apiKey || undefined,
|
|
129602
|
+
recursive: true,
|
|
129603
|
+
repo: modelSlug
|
|
129604
|
+
};
|
|
129605
|
+
const qPattern = quantization.toLowerCase().replace(/[_-]/g, "");
|
|
129606
|
+
const processed = new Set();
|
|
129607
|
+
let found = false;
|
|
129608
|
+
let totalBytes = 0;
|
|
129609
|
+
async function* listGgufFiles() {
|
|
129610
|
+
let lastError;
|
|
129611
|
+
for (let attempt = 0; attempt < 3; attempt++) {
|
|
129612
|
+
try {
|
|
129613
|
+
for await (const file of listFiles(listParams)) {
|
|
129614
|
+
yield file;
|
|
129615
|
+
}
|
|
129616
|
+
return;
|
|
129617
|
+
}
|
|
129618
|
+
catch (error) {
|
|
129619
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
129620
|
+
if (attempt < 2) {
|
|
129621
|
+
const delay = 1000 * Math.pow(2, attempt);
|
|
129622
|
+
await new Promise(resolve => setTimeout(resolve, Math.min(delay, 10000)));
|
|
129623
|
+
}
|
|
129624
|
+
}
|
|
129625
|
+
}
|
|
129626
|
+
if (lastError) {
|
|
129627
|
+
throw lastError;
|
|
129628
|
+
}
|
|
129629
|
+
}
|
|
129630
|
+
for await (const file of listGgufFiles()) {
|
|
129631
|
+
if (processed.has(file.path))
|
|
129632
|
+
continue;
|
|
129633
|
+
processed.add(file.path);
|
|
129634
|
+
if (!file.path.toLowerCase().endsWith(".gguf"))
|
|
129635
|
+
continue;
|
|
129636
|
+
const filePattern = file.path.toLowerCase().replace(/[_-]/g, "");
|
|
129637
|
+
if (!filePattern.includes(qPattern))
|
|
129638
|
+
continue;
|
|
129639
|
+
if (typeof file.size === "number") {
|
|
129640
|
+
totalBytes += file.size;
|
|
129641
|
+
found = true;
|
|
129642
|
+
}
|
|
129643
|
+
}
|
|
129644
|
+
return found ? totalBytes : null;
|
|
129645
|
+
}
|
|
127661
129646
|
async listModelQuantizations(modelSlug) {
|
|
127662
129647
|
if (!modelSlug) {
|
|
127663
129648
|
return [];
|
|
@@ -151704,7 +153689,7 @@ async function loadCheckpoint(filePath) {
|
|
|
151704
153689
|
}
|
|
151705
153690
|
}
|
|
151706
153691
|
async function saveCheckpoint(filePath, checkpoint) {
|
|
151707
|
-
await writeFile(filePath, JSON.stringify(checkpoint), "utf-8");
|
|
153692
|
+
await writeFile(filePath, JSON.stringify(checkpoint, null, 4), "utf-8");
|
|
151708
153693
|
}
|
|
151709
153694
|
async function removeCheckpoint(filePath) {
|
|
151710
153695
|
try {
|
|
@@ -153586,10 +155571,25 @@ async function provisionResources(options) {
|
|
|
153586
155571
|
}
|
|
153587
155572
|
const modelData = (await modelRes.json());
|
|
153588
155573
|
const modelID = modelData.id;
|
|
155574
|
+
const engineRes = await fetch(`${apiUrl}/api/v1/engines`, {
|
|
155575
|
+
body: JSON.stringify({
|
|
155576
|
+
name: `inftest_eng_${shortSlug}`,
|
|
155577
|
+
type: options.engine
|
|
155578
|
+
}),
|
|
155579
|
+
headers,
|
|
155580
|
+
method: "POST",
|
|
155581
|
+
signal: AbortSignal.timeout(60_000)
|
|
155582
|
+
});
|
|
155583
|
+
if (!engineRes.ok) {
|
|
155584
|
+
const text = await engineRes.text();
|
|
155585
|
+
throw new Error(`Failed to create engine: ${engineRes.status} ${text}`);
|
|
155586
|
+
}
|
|
155587
|
+
const engineData = (await engineRes.json());
|
|
155588
|
+
const engineId = engineData.id;
|
|
153589
155589
|
const sourceIDs = [];
|
|
153590
155590
|
for (let i = 0; i < parallelism; i++) {
|
|
153591
155591
|
const sourceBody = {
|
|
153592
|
-
|
|
155592
|
+
engineId,
|
|
153593
155593
|
modelID,
|
|
153594
155594
|
name: `inftest_src_${i}_${shortSlug}`
|
|
153595
155595
|
};
|
|
@@ -153626,7 +155626,7 @@ async function provisionResources(options) {
|
|
|
153626
155626
|
}
|
|
153627
155627
|
const endpointData = (await endpointRes.json());
|
|
153628
155628
|
const endpointID = endpointData.id;
|
|
153629
|
-
return { endpointID, modelID, sourceIDs };
|
|
155629
|
+
return { endpointID, engineID: engineId, modelID, sourceIDs };
|
|
153630
155630
|
}
|
|
153631
155631
|
|
|
153632
155632
|
async function teardownResources(options) {
|
|
@@ -153657,6 +155657,16 @@ async function teardownResources(options) {
|
|
|
153657
155657
|
})
|
|
153658
155658
|
.catch(err => console.error("Failed to delete source:", asError(err).message));
|
|
153659
155659
|
}
|
|
155660
|
+
await fetch(`${apiUrl}/api/v1/engines/${options.engineID}`, {
|
|
155661
|
+
headers,
|
|
155662
|
+
method: "DELETE"
|
|
155663
|
+
})
|
|
155664
|
+
.then(res => {
|
|
155665
|
+
if (!res.ok) {
|
|
155666
|
+
console.error(`Failed to delete engine: ${res.status} ${res.statusText}`);
|
|
155667
|
+
}
|
|
155668
|
+
})
|
|
155669
|
+
.catch(err => console.error("Failed to delete engine:", asError(err).message));
|
|
153660
155670
|
await fetch(`${apiUrl}/api/v1/models/${options.modelID}`, {
|
|
153661
155671
|
headers,
|
|
153662
155672
|
method: "DELETE"
|
|
@@ -153807,6 +155817,7 @@ async function runBenchmark(options) {
|
|
|
153807
155817
|
}
|
|
153808
155818
|
async function runSingleBenchmark(options) {
|
|
153809
155819
|
const { apiKey, apiUrl, bfclData, concurrency, entry, hardware, humanevalplusProblems, logger, mbppplusProblems, outputDir, parallelism } = options;
|
|
155820
|
+
let fileSizeBytes = null;
|
|
153810
155821
|
let metadata;
|
|
153811
155822
|
if (entry.source?.type === "huggingface") {
|
|
153812
155823
|
console.log(" → Fetching model metadata...");
|
|
@@ -153814,6 +155825,9 @@ async function runSingleBenchmark(options) {
|
|
|
153814
155825
|
const hfClient = new HuggingFaceClient(process.env.HF_TOKEN);
|
|
153815
155826
|
const info = await hfClient.fetchModelInfo(entry.slug);
|
|
153816
155827
|
metadata = { ...info, source: entry.source };
|
|
155828
|
+
if (entry.quantization) {
|
|
155829
|
+
fileSizeBytes = await hfClient.fetchQuantizationFileSize(entry.slug, entry.quantization);
|
|
155830
|
+
}
|
|
153817
155831
|
}
|
|
153818
155832
|
catch (err) {
|
|
153819
155833
|
console.error(` ⚠ Failed to fetch metadata: ${asError(err).message}`);
|
|
@@ -153830,7 +155844,7 @@ async function runSingleBenchmark(options) {
|
|
|
153830
155844
|
quantization: entry.quantization,
|
|
153831
155845
|
slug: entry.slug
|
|
153832
155846
|
});
|
|
153833
|
-
console.log(` → Provisioned 1 model, ${parallelism} source(s), 1 endpoint`);
|
|
155847
|
+
console.log(` → Provisioned 1 model, 1 engine, ${parallelism} source(s), 1 endpoint`);
|
|
153834
155848
|
const sampler = createMemorySampler();
|
|
153835
155849
|
console.log(" → Sampling memory baseline...");
|
|
153836
155850
|
await sampler.start();
|
|
@@ -153993,6 +156007,7 @@ async function runSingleBenchmark(options) {
|
|
|
153993
156007
|
hardware,
|
|
153994
156008
|
metadata,
|
|
153995
156009
|
modelMetadata: {
|
|
156010
|
+
fileSizeBytes,
|
|
153996
156011
|
format: entry.format,
|
|
153997
156012
|
parameterCount: entry.parameterCount,
|
|
153998
156013
|
quantization: entry.quantization
|
|
@@ -154018,6 +156033,7 @@ async function runSingleBenchmark(options) {
|
|
|
154018
156033
|
apiKey,
|
|
154019
156034
|
apiUrl,
|
|
154020
156035
|
endpointID: resources.endpointID,
|
|
156036
|
+
engineID: resources.engineID,
|
|
154021
156037
|
modelID: resources.modelID,
|
|
154022
156038
|
sourceIDs: resources.sourceIDs
|
|
154023
156039
|
});
|