@evomap/evolver 1.89.4 → 1.89.6
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/CONTRIBUTING.md +19 -0
- package/README.md +536 -86
- package/assets/cover.png +0 -0
- package/index.js +87 -7
- package/package.json +17 -6
- package/scripts/a2a_export.js +63 -0
- package/scripts/a2a_ingest.js +79 -0
- package/scripts/a2a_promote.js +118 -0
- package/scripts/analyze_by_skill.js +121 -0
- package/scripts/build_binaries.js +479 -0
- package/scripts/check-changelog.js +166 -0
- package/scripts/extract_log.js +85 -0
- package/scripts/generate_history.js +75 -0
- package/scripts/gep_append_event.js +96 -0
- package/scripts/gep_personality_report.js +234 -0
- package/scripts/human_report.js +147 -0
- package/scripts/recall-verify-report.js +234 -0
- package/scripts/recover_loop.js +61 -0
- package/scripts/refresh_stars_badge.js +168 -0
- package/scripts/seed-merchants.js +91 -0
- package/scripts/suggest_version.js +89 -0
- package/scripts/validate-modules.js +38 -0
- package/scripts/validate-suite.js +78 -0
- package/skills/index.json +14 -0
- package/src/adapters/scripts/_runtimePaths.js +1 -0
- package/src/adapters/scripts/evolver-session-end.js +1 -0
- package/src/adapters/scripts/evolver-session-start.js +1 -0
- package/src/evolve/guards.js +1 -721
- package/src/evolve/pipeline/collect.js +1 -1283
- package/src/evolve/pipeline/dispatch.js +1 -421
- package/src/evolve/pipeline/enrich.js +1 -440
- package/src/evolve/pipeline/hub.js +1 -319
- package/src/evolve/pipeline/select.js +1 -274
- package/src/evolve/pipeline/signals.js +1 -206
- package/src/evolve/utils.js +1 -264
- package/src/evolve.js +1 -350
- package/src/gep/a2aProtocol.js +1 -4455
- package/src/gep/antiAbuseTelemetry.js +1 -233
- package/src/gep/autoDistillConv.js +1 -205
- package/src/gep/autoDistillLlm.js +1 -315
- package/src/gep/candidateEval.js +1 -92
- package/src/gep/candidates.js +1 -198
- package/src/gep/contentHash.js +1 -30
- package/src/gep/conversationSniffer.js +1 -266
- package/src/gep/crypto.js +1 -89
- package/src/gep/curriculum.js +1 -163
- package/src/gep/deviceId.js +1 -218
- package/src/gep/envFingerprint.js +1 -118
- package/src/gep/epigenetics.js +1 -31
- package/src/gep/execBridge.js +1 -711
- package/src/gep/explore.js +1 -289
- package/src/gep/hash.js +1 -15
- package/src/gep/hubFetch.js +1 -359
- package/src/gep/hubReview.js +1 -207
- package/src/gep/hubSearch.js +1 -526
- package/src/gep/hubVerify.js +1 -306
- package/src/gep/idleScheduler.js +6 -1
- package/src/gep/learningSignals.js +1 -89
- package/src/gep/memoryGraph.js +1 -1374
- package/src/gep/memoryGraphAdapter.js +1 -203
- package/src/gep/mutation.js +1 -203
- package/src/gep/narrativeMemory.js +1 -108
- package/src/gep/openPRRegistry.js +1 -205
- package/src/gep/personality.js +1 -423
- package/src/gep/policyCheck.js +1 -599
- package/src/gep/prompt.js +1 -836
- package/src/gep/recallInject.js +1 -409
- package/src/gep/recallVerifier.js +1 -318
- package/src/gep/reflection.js +1 -177
- package/src/gep/savingsCore.js +1 -0
- package/src/gep/selector.js +1 -602
- package/src/gep/skillDistiller.js +1 -1294
- package/src/gep/solidify.js +1 -1699
- package/src/gep/strategy.js +1 -136
- package/src/gep/tokenSavings.js +1 -88
- package/src/gep/workspaceKeychain.js +1 -174
- package/src/ops/lifecycle.js +17 -4
- package/src/proxy/envelope.js +59 -0
- package/src/proxy/extensions/traceControl.js +1 -99
- package/src/proxy/index.js +221 -3
- package/src/proxy/inject.js +1 -52
- package/src/proxy/lifecycle/manager.js +14 -7
- package/src/proxy/mailbox/store.js +29 -6
- package/src/proxy/router/messages_route.js +4 -1
- package/src/proxy/router/responses_route.js +159 -0
- package/src/proxy/server/http.js +13 -4
- package/src/proxy/server/routes.js +11 -1
- package/src/proxy/sync/engine.js +7 -1
- package/src/proxy/sync/outbound.js +32 -4
- package/src/proxy/trace/extractor.js +1 -646
- package/src/proxy/trace/usage.js +1 -105
- package/.cursor/BUGBOT.md +0 -182
- package/.env.example +0 -68
- package/.git-commit-guard-token +0 -1
- package/.github/CODEOWNERS +0 -63
- package/.github/ISSUE_TEMPLATE/good_first_issue.md +0 -23
- package/.github/pull_request_template.md +0 -45
- package/.github/workflows/test.yml +0 -75
- package/CHANGELOG.md +0 -1237
- package/README.public.md +0 -569
- package/SECURITY.md +0 -108
- package/assets/gep/events.jsonl +0 -3
- package/examples/atp-consumer-quickstart.md +0 -100
- package/examples/hello-world.md +0 -38
- package/proxy-package.json +0 -39
- package/public.manifest.json +0 -143
- /package/assets/gep/{genes.json → genes.seed.json} +0 -0
- /package/{bundled-skills → skills}/_meta/SKILL.md +0 -0
package/src/ops/lifecycle.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
const fs = require('fs');
|
|
7
7
|
const path = require('path');
|
|
8
8
|
const os = require('os');
|
|
9
|
-
const { execSync, spawn } = require('child_process');
|
|
9
|
+
const { execFileSync, execSync, spawn } = require('child_process');
|
|
10
10
|
// 10 MB — prevents RangeError on large child process output (e.g. git log/diff
|
|
11
11
|
// on large repos). See GHSA reports / issue #451.
|
|
12
12
|
const MAX_EXEC_BUFFER = 10 * 1024 * 1024;
|
|
@@ -37,9 +37,22 @@ function execText(command) {
|
|
|
37
37
|
return execSync(command, { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'], maxBuffer: MAX_EXEC_BUFFER });
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
+
function execFileText(file, args) {
|
|
41
|
+
return execFileSync(file, args, {
|
|
42
|
+
encoding: 'utf8',
|
|
43
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
44
|
+
maxBuffer: MAX_EXEC_BUFFER,
|
|
45
|
+
windowsHide: true
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
|
|
40
49
|
function listProcesses() {
|
|
41
50
|
if (process.platform === 'win32') {
|
|
42
|
-
var out =
|
|
51
|
+
var out = execFileText('powershell', [
|
|
52
|
+
'-NoProfile',
|
|
53
|
+
'-Command',
|
|
54
|
+
'Get-CimInstance Win32_Process | ForEach-Object { $cmd = if ($_.CommandLine) { $_.CommandLine } else { \'\'}; Write-Output (\'{0}\t{1}\' -f $_.ProcessId, $cmd) }'
|
|
55
|
+
]);
|
|
43
56
|
var procs = [];
|
|
44
57
|
for (var line of out.split(/\r?\n/)) {
|
|
45
58
|
if (!line || !line.trim()) continue;
|
|
@@ -132,7 +145,7 @@ function start(options) {
|
|
|
132
145
|
}
|
|
133
146
|
|
|
134
147
|
var child = spawn(process.execPath, [script, '--loop'], {
|
|
135
|
-
detached: true, stdio: ['ignore', out, err], cwd: WORKSPACE_ROOT, env: env
|
|
148
|
+
detached: true, stdio: ['ignore', out, err], cwd: WORKSPACE_ROOT, env: env, windowsHide: true
|
|
136
149
|
});
|
|
137
150
|
child.unref();
|
|
138
151
|
fs.writeFileSync(PID_FILE, String(child.pid));
|
|
@@ -163,7 +176,7 @@ function stop() {
|
|
|
163
176
|
console.log('[Lifecycle] Force-killing PID ' + remaining[j]);
|
|
164
177
|
// Windows does not support SIGKILL; use taskkill /F instead.
|
|
165
178
|
if (process.platform === 'win32') {
|
|
166
|
-
try {
|
|
179
|
+
try { execFileSync('taskkill', ['/F', '/PID', String(remaining[j])], { stdio: 'ignore', windowsHide: true }); } catch (e) {}
|
|
167
180
|
} else {
|
|
168
181
|
try { process.kill(remaining[j], 'SIGKILL'); } catch (e) {}
|
|
169
182
|
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const crypto = require('crypto');
|
|
4
|
+
|
|
5
|
+
const PROTOCOL_NAME = 'gep-a2a';
|
|
6
|
+
const PROTOCOL_VERSION = '1.0.0';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Build a GEP-A2A protocol envelope around a payload.
|
|
10
|
+
*
|
|
11
|
+
* Strict hub endpoints (/a2a/hello, /a2a/fetch, /a2a/validate, ...) run
|
|
12
|
+
* isValidProtocolMessage server-side and reject bare bodies with
|
|
13
|
+
* 400 invalid_protocol_message. Lenient endpoints such as
|
|
14
|
+
* /a2a/assets/search accept raw bodies and must NOT be wrapped.
|
|
15
|
+
*
|
|
16
|
+
* @param {string} messageType - GEP-A2A message_type ('hello'|'fetch'|'validate'|...)
|
|
17
|
+
* @param {object} [payload] - Message payload (defaults to {})
|
|
18
|
+
* @param {string|null} [senderId] - node_id of the sending node
|
|
19
|
+
* @returns {object} Full protocol envelope
|
|
20
|
+
*/
|
|
21
|
+
function buildEnvelope(messageType, payload, senderId) {
|
|
22
|
+
if (!messageType || typeof messageType !== 'string') {
|
|
23
|
+
throw new Error('buildEnvelope: messageType is required');
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
protocol: PROTOCOL_NAME,
|
|
27
|
+
protocol_version: PROTOCOL_VERSION,
|
|
28
|
+
message_type: messageType,
|
|
29
|
+
message_id: 'msg_' + Date.now() + '_' + crypto.randomBytes(4).toString('hex'),
|
|
30
|
+
sender_id: senderId || null,
|
|
31
|
+
timestamp: new Date().toISOString(),
|
|
32
|
+
payload: payload || {},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Wrap `body` in a GEP-A2A envelope unless it already is one.
|
|
38
|
+
*
|
|
39
|
+
* When the caller hands us a pre-built envelope, sender_id is still forced
|
|
40
|
+
* to the proxy's own node_id: callers must not be able to impersonate
|
|
41
|
+
* another node through the proxy (same rule as the ATP passthrough routes).
|
|
42
|
+
*
|
|
43
|
+
* @param {string} messageType - message_type used when wrapping is needed
|
|
44
|
+
* @param {object} [body] - Bare payload or full envelope
|
|
45
|
+
* @param {string|null} [senderId] - The proxy's own node_id
|
|
46
|
+
* @returns {object} Full protocol envelope
|
|
47
|
+
*/
|
|
48
|
+
function ensureEnvelope(messageType, body, senderId) {
|
|
49
|
+
const b = body || {};
|
|
50
|
+
const isEnvelope = b.protocol === PROTOCOL_NAME
|
|
51
|
+
&& typeof b.message_type === 'string'
|
|
52
|
+
&& b.payload && typeof b.payload === 'object';
|
|
53
|
+
if (isEnvelope) {
|
|
54
|
+
return { ...b, sender_id: senderId || b.sender_id || null };
|
|
55
|
+
}
|
|
56
|
+
return buildEnvelope(messageType, b, senderId);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
module.exports = { buildEnvelope, ensureEnvelope, PROTOCOL_NAME, PROTOCOL_VERSION };
|
|
@@ -1,99 +1 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const crypto = require('crypto');
|
|
4
|
-
|
|
5
|
-
function canonicalTraceConfigPayload(payload = {}) {
|
|
6
|
-
const clean = {};
|
|
7
|
-
for (const key of Object.keys(payload).sort()) {
|
|
8
|
-
if (key === 'signature' || key === 'trace_config_signature' || key === 'signature_algorithm') continue;
|
|
9
|
-
if (key === 'hub_public_key') continue;
|
|
10
|
-
const value = payload[key];
|
|
11
|
-
if (value !== undefined) clean[key] = value;
|
|
12
|
-
}
|
|
13
|
-
return JSON.stringify(clean);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
function verifyTraceConfigSignature(payload = {}, env = process.env) {
|
|
17
|
-
const publicKey = String(
|
|
18
|
-
env.EVOMAP_TRACE_CONFIG_SIGNING_PUBLIC_KEY
|
|
19
|
-
|| env.EVOMAP_PROXY_TRACE_CONFIG_SIGNING_PUBLIC_KEY
|
|
20
|
-
|| ''
|
|
21
|
-
).trim();
|
|
22
|
-
const signature = String(payload.signature || payload.trace_config_signature || '').trim();
|
|
23
|
-
if (!publicKey || !signature) return false;
|
|
24
|
-
try {
|
|
25
|
-
return crypto.verify(
|
|
26
|
-
'sha256',
|
|
27
|
-
Buffer.from(canonicalTraceConfigPayload(payload), 'utf8'),
|
|
28
|
-
publicKey,
|
|
29
|
-
Buffer.from(signature, 'base64')
|
|
30
|
-
);
|
|
31
|
-
} catch {
|
|
32
|
-
return false;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
class TraceControl {
|
|
37
|
-
constructor({ store, logger } = {}) {
|
|
38
|
-
this.store = store;
|
|
39
|
-
this.logger = logger || console;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
process(message) {
|
|
43
|
-
const payload = message && message.payload ? message.payload : message;
|
|
44
|
-
const enabled = payload && (
|
|
45
|
-
payload.enabled ??
|
|
46
|
-
payload.trace_collection_enabled ??
|
|
47
|
-
payload.proxy_trace_collection_enabled
|
|
48
|
-
);
|
|
49
|
-
if (typeof enabled !== 'boolean') {
|
|
50
|
-
this.logger.warn?.('[trace-control] ignoring config without boolean enabled');
|
|
51
|
-
return { ack: true, applied: false };
|
|
52
|
-
}
|
|
53
|
-
let profileEnabled = payload.profile_analysis_enabled ?? payload.trace_profile_analysis_enabled;
|
|
54
|
-
const signed = verifyTraceConfigSignature(payload);
|
|
55
|
-
const unsafeEnable = enabled === true;
|
|
56
|
-
const unsafeProfile = profileEnabled === true;
|
|
57
|
-
const hasRuntimeHubKey = typeof payload.hub_public_key === 'string' && payload.hub_public_key.trim();
|
|
58
|
-
if (!signed && unsafeEnable) {
|
|
59
|
-
this.logger.warn?.('[trace-control] rejected unsigned trace config that could enable collection/profile analysis');
|
|
60
|
-
return { ack: true, applied: false };
|
|
61
|
-
}
|
|
62
|
-
if (!signed && unsafeProfile) {
|
|
63
|
-
this.logger.warn?.('[trace-control] ignored unsigned profile analysis enable while applying trace disable');
|
|
64
|
-
profileEnabled = false;
|
|
65
|
-
}
|
|
66
|
-
this.store.setState('trace_collection_enabled', enabled ? 'true' : 'false');
|
|
67
|
-
if (typeof profileEnabled === 'boolean') {
|
|
68
|
-
this.store.setState('trace_profile_analysis_enabled', profileEnabled ? 'true' : 'false');
|
|
69
|
-
}
|
|
70
|
-
if (hasRuntimeHubKey) {
|
|
71
|
-
this.logger.warn?.('[trace-control] ignored runtime hub_public_key; use pinned EVOMAP_PROXY_TRACE_HUB_PUBLIC_KEY');
|
|
72
|
-
}
|
|
73
|
-
this.store.setState('trace_collection_updated_at', new Date().toISOString());
|
|
74
|
-
this.logger.log?.('[trace-control] trace collection ' + (enabled ? 'enabled' : 'disabled'));
|
|
75
|
-
return { ack: true, applied: true };
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
pollAndApply() {
|
|
79
|
-
const messages = [
|
|
80
|
-
...this.store.poll({ type: 'trace_collection_config', limit: 50 }),
|
|
81
|
-
...this.store.poll({ type: 'proxy_trace_config', limit: 50 }),
|
|
82
|
-
];
|
|
83
|
-
let applied = 0;
|
|
84
|
-
for (const msg of messages) {
|
|
85
|
-
const result = this.process(msg);
|
|
86
|
-
const ack = result === true || (result && result.ack === true);
|
|
87
|
-
const didApply = result === true || (result && result.applied === true);
|
|
88
|
-
if (ack) {
|
|
89
|
-
this.store.ack(msg.id);
|
|
90
|
-
}
|
|
91
|
-
if (didApply) {
|
|
92
|
-
applied++;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
return applied;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
module.exports = { TraceControl, canonicalTraceConfigPayload, verifyTraceConfigSignature };
|
|
1
|
+
const _0x15118e=_0x3f3e;(function(_0x18c47c,_0x2b5d0e){const _0x591ed5=_0x3f3e,_0x227ca3=_0x18c47c();while(!![]){try{const _0x557faa=parseInt(_0x591ed5(0x317,'\x4f\x35\x51\x36'))/(-0xb*-0xe2+-0x10*-0xd3+-0x16e5)+-parseInt(_0x591ed5(0x248,'\x76\x74\x78\x29'))/(0x5b*0x31+-0x90+0x1*-0x10d9)*(parseInt(_0x591ed5(0x278,'\x31\x57\x29\x32'))/(0x97*-0xd+0x429*-0x8+-0xe*-0x2ed))+parseInt(_0x591ed5(0x2c8,'\x44\x41\x54\x47'))/(-0x2253+-0x1*-0x24a3+-0x4*0x93)+parseInt(_0x591ed5(0x2a8,'\x77\x43\x29\x37'))/(-0x735*0x5+0xaee+0x1*0x1920)*(-parseInt(_0x591ed5(0x33d,'\x4f\x35\x51\x36'))/(0xfae+-0x81d+0x1*-0x78b))+parseInt(_0x591ed5(0x1f1,'\x6a\x48\x69\x57'))/(-0xf*0x121+0x182c+0x39b*-0x2)+-parseInt(_0x591ed5(0x32a,'\x6e\x79\x67\x58'))/(0x8c+-0x4*0x12f+0x438)+parseInt(_0x591ed5(0x30b,'\x41\x54\x70\x69'))/(0xb*0x296+0x490*-0x4+-0xa29);if(_0x557faa===_0x2b5d0e)break;else _0x227ca3['push'](_0x227ca3['shift']());}catch(_0x2e4b0d){_0x227ca3['push'](_0x227ca3['shift']());}}}(_0x3c9a,-0x1ef02+-0x75b97+0x19*0xa1e1));function _0x3c9a(){const _0x150662=['\x70\x58\x39\x54\x6e\x43\x6b\x59\x57\x35\x39\x72\x66\x53\x6b\x34\x45\x47','\x69\x75\x6d\x6b\x65\x43\x6b\x75\x57\x52\x4a\x63\x54\x6d\x6b\x57','\x44\x49\x71\x2f\x77\x73\x30','\x42\x64\x6d\x70\x71\x63\x30\x32','\x57\x51\x61\x73\x66\x72\x56\x64\x4c\x43\x6b\x6c\x57\x36\x65','\x57\x50\x44\x74\x57\x50\x47\x47\x57\x51\x38','\x6a\x6d\x6f\x59\x57\x51\x4a\x64\x4a\x43\x6f\x42\x63\x71','\x6c\x38\x6f\x69\x74\x38\x6f\x6d\x57\x35\x57','\x57\x36\x4e\x63\x54\x6d\x6b\x34\x57\x34\x50\x56\x57\x52\x39\x4f\x57\x36\x65','\x63\x43\x6b\x4d\x57\x50\x5a\x64\x48\x72\x61','\x57\x37\x4c\x53\x57\x36\x71\x61\x6a\x43\x6f\x4a\x74\x73\x4b','\x44\x57\x62\x30\x57\x37\x69\x59\x75\x38\x6b\x50\x77\x47','\x57\x36\x4e\x63\x54\x6d\x6b\x57\x57\x34\x71','\x65\x63\x33\x63\x51\x6d\x6b\x6a\x43\x53\x6b\x30\x57\x34\x4b','\x57\x52\x6a\x4e\x57\x36\x4a\x64\x47\x43\x6b\x6c\x46\x72\x78\x63\x53\x61','\x57\x4f\x35\x41\x57\x50\x42\x64\x4b\x6d\x6f\x30','\x76\x38\x6f\x65\x57\x34\x75\x35\x79\x53\x6b\x74\x57\x34\x58\x4b','\x57\x51\x58\x71\x57\x4f\x4f\x54\x57\x50\x30','\x57\x36\x48\x6a\x57\x34\x38\x48','\x57\x34\x75\x34\x57\x34\x42\x63\x4a\x53\x6b\x55\x6a\x53\x6b\x31\x67\x71','\x69\x6d\x6b\x77\x71\x53\x6f\x73\x57\x35\x75\x55\x6d\x71','\x7a\x30\x52\x63\x48\x53\x6b\x36\x42\x57','\x44\x75\x30\x52\x76\x6d\x6b\x64\x57\x36\x4c\x6c\x6f\x57','\x6f\x53\x6b\x56\x42\x6d\x6b\x73\x57\x4f\x56\x63\x4d\x61','\x79\x66\x4b\x52\x79\x6d\x6b\x4b','\x57\x4f\x44\x5a\x41\x77\x46\x64\x53\x4a\x68\x63\x4e\x38\x6b\x38','\x66\x72\x33\x64\x47\x6d\x6f\x6f\x62\x4a\x65\x32\x71\x53\x6f\x55\x57\x50\x65','\x6e\x64\x37\x63\x53\x6d\x6b\x67\x45\x6d\x6b\x77\x57\x34\x6a\x75','\x57\x35\x61\x31\x57\x52\x71\x58\x61\x61','\x57\x52\x35\x69\x57\x4f\x69\x42\x57\x51\x78\x63\x54\x63\x46\x63\x49\x47','\x57\x37\x44\x61\x57\x34\x4f\x6f\x6e\x71','\x75\x38\x6f\x6a\x57\x34\x65\x65\x42\x43\x6b\x7a\x57\x34\x79','\x42\x59\x34\x36\x67\x53\x6f\x49\x57\x34\x76\x67\x57\x36\x34','\x70\x6d\x6f\x48\x64\x66\x68\x64\x50\x6d\x6b\x59\x57\x37\x30','\x57\x50\x35\x4c\x57\x52\x30\x58\x57\x50\x70\x63\x53\x57\x52\x63\x50\x57','\x57\x50\x53\x6d\x57\x51\x6c\x63\x4b\x6d\x6b\x49\x6c\x72\x56\x64\x52\x47','\x65\x53\x6f\x54\x57\x50\x38\x30\x6c\x75\x4e\x63\x4d\x61','\x66\x4a\x74\x63\x55\x62\x33\x64\x4c\x76\x54\x69\x57\x4f\x57','\x76\x47\x37\x64\x53\x38\x6f\x76\x6a\x57','\x57\x51\x65\x63\x57\x50\x33\x64\x56\x38\x6b\x6a\x78\x38\x6f\x31\x57\x34\x6d','\x6d\x43\x6b\x74\x71\x38\x6b\x6d\x57\x4f\x5a\x63\x4a\x43\x6f\x33\x6b\x47','\x42\x43\x6f\x36\x57\x4f\x6e\x48','\x57\x36\x2f\x63\x53\x43\x6b\x54\x57\x35\x54\x39','\x57\x35\x62\x64\x57\x36\x43\x46\x6f\x71','\x57\x52\x7a\x36\x64\x74\x5a\x63\x4c\x75\x4f','\x68\x6d\x6f\x55\x57\x50\x75\x37\x70\x65\x68\x63\x4d\x43\x6b\x58','\x6a\x43\x6f\x30\x64\x76\x46\x64\x50\x43\x6f\x48\x57\x36\x33\x64\x51\x71','\x61\x43\x6b\x75\x43\x53\x6f\x36\x78\x43\x6b\x45','\x77\x73\x70\x64\x4a\x38\x6b\x63\x67\x57','\x74\x66\x68\x63\x48\x38\x6b\x65\x74\x57','\x6b\x53\x6b\x56\x57\x51\x4a\x64\x4d\x58\x65','\x67\x32\x6c\x63\x4d\x43\x6f\x65\x73\x38\x6b\x32\x79\x72\x69\x38\x57\x51\x4f\x54\x74\x61\x4b','\x63\x6d\x6b\x71\x41\x38\x6f\x68\x57\x37\x4f','\x73\x75\x46\x63\x47\x43\x6b\x79','\x6f\x6d\x6f\x48\x61\x4c\x68\x64\x50\x6d\x6b\x45\x57\x36\x42\x64\x53\x57','\x46\x6d\x6f\x44\x41\x43\x6b\x47\x66\x53\x6b\x51\x57\x36\x64\x63\x4a\x47','\x6a\x38\x6f\x79\x74\x38\x6f\x45\x57\x37\x31\x6e','\x57\x35\x68\x63\x53\x43\x6f\x37','\x57\x50\x57\x65\x57\x50\x61\x54\x62\x33\x46\x63\x4f\x6d\x6f\x6a','\x64\x38\x6f\x2b\x57\x4f\x71','\x57\x34\x47\x76\x57\x4f\x4f\x4d','\x57\x51\x64\x63\x4f\x62\x4f','\x57\x50\x57\x45\x66\x61\x42\x64\x48\x38\x6b\x71\x57\x37\x6d\x50','\x6c\x38\x6f\x59\x57\x4f\x75\x36\x6a\x65\x68\x63\x4c\x43\x6b\x61','\x6c\x38\x6f\x6c\x76\x6d\x6f\x67','\x57\x4f\x7a\x50\x7a\x4e\x68\x64\x56\x5a\x70\x63\x4b\x6d\x6b\x32','\x57\x34\x53\x67\x57\x4f\x30\x54','\x57\x52\x66\x38\x57\x37\x33\x64\x49\x53\x6b\x62\x76\x57\x4e\x64\x50\x71','\x61\x68\x78\x63\x56\x48\x42\x64\x51\x31\x66\x72\x57\x4f\x53','\x57\x36\x4c\x44\x57\x4f\x2f\x64\x4e\x5a\x44\x56\x57\x52\x7a\x43','\x57\x36\x4c\x31\x57\x50\x5a\x64\x51\x57\x4f','\x57\x34\x38\x63\x57\x52\x34','\x78\x32\x75\x45\x7a\x43\x6b\x2b','\x6d\x43\x6b\x6b\x73\x53\x6f\x44','\x46\x53\x6b\x47\x57\x37\x6c\x64\x4f\x6d\x6f\x53\x69\x38\x6b\x4d\x79\x38\x6b\x37','\x57\x52\x31\x6f\x57\x4f\x69\x72\x57\x52\x4b','\x57\x35\x4f\x44\x57\x52\x5a\x63\x4e\x43\x6b\x4e\x6d\x71\x57','\x44\x75\x65\x34\x41\x43\x6b\x77\x57\x37\x58\x6b\x6c\x61','\x57\x50\x48\x70\x57\x4f\x69\x4c\x57\x50\x47','\x64\x61\x46\x63\x4f\x6d\x6f\x48\x57\x50\x2f\x63\x4a\x32\x57\x53','\x57\x50\x31\x64\x57\x50\x47\x68\x57\x4f\x79','\x65\x53\x6f\x4a\x57\x4f\x6d\x39\x46\x48\x57','\x63\x78\x4a\x64\x49\x4d\x62\x39\x71\x57\x35\x68','\x6a\x57\x4f\x34\x57\x37\x6a\x6e\x57\x35\x70\x63\x48\x58\x34','\x57\x4f\x42\x63\x53\x32\x30\x56\x64\x68\x4b\x58\x57\x34\x75','\x57\x4f\x4f\x4b\x57\x52\x78\x64\x53\x53\x6b\x34','\x57\x35\x4c\x66\x57\x36\x34\x39\x57\x51\x47','\x57\x36\x35\x67\x57\x4f\x4e\x64\x4b\x4a\x6d\x37\x57\x51\x62\x62','\x57\x4f\x39\x2f\x57\x4f\x68\x64\x4a\x6d\x6f\x47\x42\x53\x6f\x57\x65\x61','\x43\x66\x42\x64\x49\x38\x6f\x76\x57\x4f\x4f\x6e\x57\x51\x79\x35','\x61\x6d\x6b\x33\x57\x52\x6c\x64\x50\x73\x6d','\x76\x71\x62\x71\x57\x52\x4b\x56','\x78\x30\x78\x63\x4d\x61','\x57\x37\x66\x61\x57\x4f\x4e\x64\x4d\x5a\x43\x39','\x41\x30\x52\x64\x4e\x53\x6f\x65\x57\x4f\x61\x2b\x57\x50\x48\x32','\x79\x48\x38\x35\x57\x35\x39\x6c','\x57\x51\x5a\x64\x4f\x58\x62\x2f\x57\x34\x6c\x64\x55\x53\x6f\x38\x44\x61','\x57\x51\x31\x4a\x57\x34\x74\x64\x4b\x38\x6b\x2b','\x43\x32\x68\x63\x54\x38\x6b\x4c','\x57\x35\x6a\x61\x57\x37\x75\x34\x57\x50\x6d','\x65\x62\x74\x63\x4f\x43\x6b\x4b','\x64\x64\x33\x63\x52\x43\x6b\x70\x57\x51\x34','\x57\x36\x39\x6c\x57\x35\x53\x6a\x57\x4f\x4b','\x57\x34\x4b\x78\x57\x51\x56\x63\x49\x43\x6b\x6d','\x57\x50\x31\x47\x57\x4f\x6c\x64\x4d\x71','\x57\x4f\x44\x4a\x57\x50\x2f\x64\x4b\x43\x6f\x4b','\x57\x37\x47\x4f\x6c\x43\x6b\x64\x57\x52\x42\x63\x4a\x6d\x6f\x58\x57\x34\x43','\x57\x36\x72\x43\x57\x4f\x46\x64\x4a\x57','\x41\x78\x5a\x63\x56\x43\x6b\x58\x61\x4a\x79\x68\x78\x47','\x57\x35\x6e\x42\x57\x36\x43\x48\x57\x50\x65','\x6e\x61\x70\x63\x49\x38\x6b\x39\x75\x71','\x57\x52\x50\x69\x57\x4f\x57\x61\x57\x52\x4e\x63\x54\x63\x70\x63\x49\x47','\x57\x50\x50\x58\x57\x50\x5a\x64\x4a\x47','\x78\x6d\x6b\x54\x57\x4f\x5a\x63\x54\x67\x57\x51\x42\x38\x6f\x48','\x6b\x49\x70\x63\x49\x6d\x6b\x41\x57\x51\x71','\x66\x53\x6f\x59\x46\x53\x6f\x59\x57\x51\x39\x68\x43\x53\x6b\x46','\x57\x4f\x6e\x5a\x43\x6d\x6b\x34\x6a\x6d\x6b\x6f\x7a\x73\x61','\x76\x30\x78\x63\x52\x6d\x6b\x44\x78\x74\x46\x63\x53\x74\x71','\x6a\x6d\x6f\x57\x57\x52\x31\x4b\x57\x4f\x4b','\x41\x6d\x6b\x33\x57\x4f\x52\x63\x50\x32\x61\x4a\x68\x38\x6b\x49','\x77\x74\x37\x64\x48\x38\x6b\x45\x67\x38\x6f\x4a\x44\x5a\x75','\x45\x38\x6f\x36\x57\x4f\x6e\x51\x75\x43\x6b\x70\x57\x52\x44\x57','\x57\x37\x75\x64\x77\x68\x42\x64\x52\x47\x46\x63\x4a\x38\x6b\x33','\x45\x78\x4e\x63\x4f\x6d\x6b\x2f\x46\x57\x64\x64\x47\x31\x4f','\x6c\x53\x6b\x44\x77\x47','\x42\x43\x6f\x74\x57\x35\x69\x68\x79\x53\x6b\x7a\x57\x4f\x39\x48','\x67\x43\x6f\x36\x63\x4e\x4a\x63\x47\x38\x6b\x46\x57\x36\x57\x66','\x78\x53\x6f\x73\x57\x34\x69\x35\x43\x43\x6b\x6a\x57\x34\x62\x55','\x42\x38\x6f\x33\x57\x35\x4f\x48\x72\x71','\x57\x34\x47\x69\x57\x52\x4a\x63\x4f\x53\x6b\x36\x6e\x72\x5a\x64\x4f\x47','\x6a\x6d\x6b\x69\x75\x38\x6f\x43\x57\x35\x61\x55\x6d\x71','\x57\x36\x35\x42\x57\x50\x5a\x64\x4c\x74\x57\x4f','\x68\x53\x6b\x70\x7a\x38\x6f\x30\x76\x53\x6b\x6c\x57\x51\x48\x30','\x42\x72\x54\x31\x57\x51\x38\x4e','\x57\x51\x33\x63\x49\x31\x6d\x76\x70\x66\x61\x43\x57\x51\x79','\x57\x35\x2f\x64\x4b\x38\x6f\x33\x57\x34\x4e\x63\x53\x6d\x6b\x4e\x57\x36\x68\x64\x54\x47','\x77\x78\x46\x64\x48\x43\x6b\x45\x68\x38\x6f\x4c\x6f\x59\x71','\x57\x4f\x70\x63\x50\x4e\x61\x75\x63\x57','\x57\x52\x78\x63\x52\x64\x48\x63\x57\x51\x33\x64\x4e\x6d\x6f\x4d\x44\x71','\x57\x51\x48\x30\x57\x36\x56\x64\x4a\x53\x6b\x6c\x72\x47','\x46\x38\x6f\x41\x43\x6d\x6b\x37\x64\x71','\x57\x52\x6a\x47\x57\x50\x56\x64\x47\x53\x6f\x50\x7a\x53\x6f\x39\x42\x57','\x44\x38\x6f\x61\x66\x43\x6b\x61\x57\x4f\x4c\x38\x66\x38\x6f\x74\x72\x4e\x74\x63\x56\x63\x61','\x57\x37\x54\x62\x57\x34\x34\x55\x57\x52\x6c\x64\x54\x77\x5a\x64\x4b\x61','\x6e\x48\x52\x63\x47\x59\x68\x64\x4c\x77\x44\x56\x57\x51\x38','\x62\x6d\x6b\x76\x44\x53\x6f\x58\x74\x43\x6b\x69\x57\x51\x72\x48','\x46\x75\x4e\x64\x56\x6d\x6f\x6f\x57\x50\x57','\x68\x53\x6f\x43\x41\x53\x6f\x56\x57\x36\x47','\x62\x43\x6f\x53\x57\x4f\x6d\x58\x6c\x30\x42\x63\x4b\x38\x6b\x37','\x57\x50\x4f\x68\x66\x64\x74\x64\x4d\x71','\x57\x37\x72\x54\x57\x36\x69','\x79\x53\x6f\x52\x57\x52\x6e\x4e\x78\x43\x6b\x41','\x71\x6d\x6f\x59\x57\x50\x58\x36\x76\x61','\x65\x57\x6c\x63\x54\x6d\x6b\x67\x57\x51\x2f\x63\x47\x73\x75\x5a','\x61\x43\x6f\x5a\x57\x34\x68\x64\x56\x5a\x44\x32\x63\x53\x6b\x5a\x6e\x4e\x56\x63\x53\x38\x6b\x69\x46\x47','\x78\x31\x42\x63\x47\x38\x6b\x41\x75\x73\x56\x64\x52\x47','\x57\x36\x30\x7a\x57\x50\x64\x64\x54\x43\x6b\x72\x75\x38\x6b\x36\x57\x34\x57','\x6b\x6d\x6b\x33\x57\x51\x2f\x64\x54\x49\x78\x63\x54\x38\x6f\x43\x71\x71','\x43\x73\x69\x58\x73\x63\x30\x71\x74\x77\x6d','\x78\x76\x6c\x63\x4b\x43\x6b\x4d\x6c\x61','\x57\x34\x33\x64\x49\x59\x79\x5a\x57\x35\x47','\x68\x4a\x33\x64\x4e\x32\x62\x2f\x73\x61','\x41\x43\x6f\x6d\x76\x43\x6f\x79\x57\x36\x7a\x70\x42\x53\x6f\x41','\x57\x34\x33\x63\x50\x6d\x6f\x57\x57\x4f\x79\x2b','\x61\x74\x68\x64\x55\x5a\x33\x64\x4e\x68\x58\x57\x57\x51\x38','\x57\x34\x70\x64\x4c\x6d\x6f\x38\x57\x37\x53','\x57\x51\x70\x63\x4e\x61\x66\x4b\x57\x4f\x64\x64\x4f\x38\x6f\x37\x7a\x61','\x57\x35\x34\x49\x70\x43\x6f\x68\x57\x50\x57','\x75\x43\x6b\x43\x57\x4f\x4a\x63\x53\x32\x65\x51\x77\x38\x6b\x49','\x6a\x38\x6f\x41\x66\x33\x70\x63\x56\x71','\x61\x53\x6f\x58\x57\x4f\x50\x6b\x57\x52\x6c\x63\x4c\x57\x5a\x63\x55\x61','\x57\x35\x69\x67\x57\x50\x30\x56\x62\x68\x4f','\x64\x47\x52\x64\x4b\x4b\x6a\x76','\x57\x51\x58\x43\x57\x52\x4f\x4c\x57\x50\x47','\x74\x75\x4e\x63\x4d\x71','\x57\x35\x71\x56\x57\x4f\x70\x63\x4b\x38\x6b\x4e','\x69\x38\x6f\x39\x57\x4f\x33\x64\x48\x6d\x6f\x6d','\x57\x34\x47\x45\x57\x4f\x38\x4d','\x7a\x53\x6f\x59\x57\x36\x69\x51\x73\x6d\x6b\x2f\x57\x4f\x6a\x6a','\x57\x36\x68\x63\x55\x38\x6f\x36\x57\x4f\x30','\x44\x65\x78\x64\x4b\x38\x6f\x41\x57\x4f\x61\x5a\x57\x51\x65','\x57\x34\x52\x63\x4f\x53\x6f\x2b\x57\x50\x43\x2b\x44\x6d\x6b\x6a\x57\x50\x71','\x64\x33\x53\x44\x64\x53\x6b\x61','\x7a\x76\x74\x64\x4d\x53\x6f\x41\x57\x50\x79','\x57\x50\x79\x41\x57\x4f\x52\x64\x56\x43\x6b\x45\x75\x38\x6b\x33\x57\x34\x34','\x57\x51\x48\x47\x62\x63\x2f\x63\x4d\x76\x76\x52\x64\x57','\x6a\x4a\x74\x63\x4c\x53\x6b\x42\x57\x51\x47','\x62\x38\x6b\x58\x57\x52\x5a\x64\x54\x63\x70\x63\x4a\x43\x6b\x7a\x76\x57','\x64\x47\x4e\x63\x51\x53\x6b\x72\x57\x51\x70\x63\x4d\x72\x31\x33','\x42\x53\x6f\x53\x57\x34\x58\x6a\x42\x53\x6b\x53\x57\x50\x39\x55','\x57\x34\x33\x63\x54\x43\x6f\x2b\x57\x4f\x79\x34\x71\x57','\x6c\x53\x6f\x59\x57\x51\x33\x64\x4c\x43\x6f\x4e','\x57\x37\x2f\x64\x4c\x62\x34\x62\x57\x37\x53','\x71\x4a\x79\x74\x6b\x6d\x6f\x6b','\x6d\x53\x6b\x7a\x75\x43\x6f\x45','\x78\x4b\x78\x63\x56\x38\x6b\x45\x6a\x47','\x68\x38\x6b\x72\x57\x50\x42\x64\x50\x73\x43','\x57\x51\x31\x30\x67\x64\x75','\x57\x37\x74\x63\x4f\x43\x6b\x33\x57\x34\x7a\x34\x57\x4f\x76\x56\x57\x51\x34','\x67\x53\x6b\x53\x57\x52\x70\x63\x55\x64\x42\x63\x4f\x6d\x6b\x45\x72\x61','\x41\x65\x34\x32\x79\x6d\x6b\x4f\x57\x37\x54\x77\x6f\x71','\x68\x4a\x33\x64\x49\x4b\x66\x4f\x71\x72\x38\x63','\x6f\x53\x6b\x52\x78\x43\x6b\x77\x57\x50\x5a\x63\x48\x6d\x6f\x36\x41\x71','\x42\x4e\x4e\x63\x4f\x38\x6b\x4b\x44\x58\x42\x64\x4b\x30\x53','\x6b\x38\x6f\x2f\x57\x52\x70\x64\x4b\x53\x6f\x78\x68\x53\x6b\x2f\x76\x71','\x64\x38\x6f\x58\x68\x30\x4e\x63\x4d\x38\x6b\x42\x57\x37\x57','\x64\x6d\x6b\x4e\x76\x53\x6b\x61','\x57\x36\x5a\x64\x4b\x53\x6f\x4e\x57\x37\x46\x63\x4f\x38\x6b\x33\x57\x51\x37\x64\x55\x71','\x64\x48\x6c\x64\x48\x4d\x6a\x54','\x57\x37\x53\x34\x57\x51\x38\x77\x69\x31\x6c\x63\x4a\x53\x6b\x51','\x78\x6d\x6f\x75\x57\x35\x65\x78\x79\x61','\x69\x53\x6f\x42\x57\x51\x65\x52\x69\x47','\x57\x35\x5a\x64\x4b\x6d\x6f\x79\x57\x36\x46\x63\x4b\x61','\x6c\x59\x2f\x63\x51\x57\x37\x64\x50\x47','\x57\x51\x53\x70\x57\x50\x74\x64\x52\x38\x6b\x79','\x74\x77\x46\x64\x54\x43\x6f\x39\x57\x51\x4f\x6c','\x64\x57\x70\x63\x52\x71','\x72\x64\x68\x64\x49\x43\x6b\x78\x6c\x53\x6f\x4d\x6c\x49\x30','\x7a\x59\x76\x59\x57\x51\x57\x56','\x57\x52\x58\x30\x62\x49\x4a\x63\x4c\x71','\x67\x5a\x33\x64\x4a\x68\x54\x36\x77\x71','\x62\x48\x6c\x64\x49\x38\x6f\x64\x61\x68\x46\x63\x55\x75\x70\x63\x54\x74\x6e\x70\x57\x51\x37\x63\x48\x61','\x68\x38\x6f\x53\x57\x4f\x71\x51\x6a\x30\x74\x63\x51\x38\x6f\x2f','\x77\x62\x6d\x76\x70\x38\x6f\x6f\x57\x37\x30\x55\x57\x34\x38','\x77\x64\x42\x64\x47\x38\x6b\x76\x69\x43\x6f\x56\x69\x49\x6d','\x68\x53\x6f\x4b\x57\x50\x4b\x2f','\x74\x4c\x53\x30\x73\x53\x6b\x4c','\x73\x68\x4b\x50\x74\x43\x6b\x66','\x57\x37\x4e\x64\x50\x53\x6b\x54\x57\x35\x54\x52\x57\x4f\x6e\x55\x57\x51\x34','\x66\x6d\x6f\x6a\x57\x4f\x6d\x75\x6a\x61','\x57\x36\x47\x75\x57\x52\x4e\x63\x4c\x43\x6b\x75','\x62\x57\x46\x63\x54\x59\x4a\x64\x47\x57','\x6c\x38\x6b\x64\x43\x38\x6f\x72\x76\x47','\x45\x38\x6b\x62\x64\x43\x6b\x42\x57\x52\x38\x46\x71\x53\x6f\x68\x57\x34\x4a\x63\x47\x53\x6f\x6a\x62\x61','\x43\x66\x42\x64\x47\x38\x6f\x42','\x61\x71\x4a\x63\x54\x43\x6b\x4a\x57\x50\x64\x63\x48\x78\x30','\x57\x50\x50\x47\x71\x38\x6b\x51\x6b\x6d\x6b\x7a\x6f\x73\x61','\x6e\x48\x5a\x63\x4b\x53\x6b\x68\x57\x35\x31\x49\x57\x37\x30\x34\x57\x4f\x42\x63\x4c\x53\x6b\x7a\x57\x50\x70\x63\x4b\x47','\x72\x53\x6f\x69\x57\x34\x57\x6b','\x57\x52\x6a\x47\x63\x61\x74\x63\x47\x65\x31\x53\x71\x57','\x6f\x6d\x6f\x38\x6d\x65\x42\x64\x53\x38\x6b\x4f\x57\x36\x64\x64\x4f\x71','\x57\x35\x5a\x64\x53\x6d\x6f\x67\x57\x34\x37\x63\x54\x47','\x57\x50\x61\x5a\x6e\x72\x46\x64\x4d\x47','\x6c\x65\x62\x38\x57\x52\x4f','\x71\x73\x72\x46\x57\x4f\x72\x49\x74\x53\x6b\x30\x68\x61','\x78\x38\x6b\x66\x57\x4f\x56\x63\x4a\x4e\x75','\x7a\x53\x6f\x68\x45\x38\x6f\x51','\x66\x57\x46\x63\x54\x53\x6b\x54\x57\x50\x4b','\x57\x37\x7a\x70\x57\x35\x6d\x47\x57\x51\x6c\x64\x53\x67\x46\x64\x4b\x57','\x57\x36\x37\x64\x4a\x38\x6f\x47\x57\x35\x78\x63\x53\x57','\x57\x50\x31\x49\x57\x4f\x68\x64\x47\x38\x6f\x47\x46\x6d\x6f\x54','\x57\x51\x64\x63\x4f\x62\x72\x73\x57\x4f\x33\x64\x4f\x43\x6f\x30\x42\x47','\x57\x50\x74\x63\x48\x76\x6e\x5a\x57\x52\x4f\x4a\x44\x53\x6b\x76\x57\x4f\x4f\x38\x67\x6d\x6f\x6c\x57\x34\x53','\x7a\x62\x43\x45\x69\x6d\x6b\x68\x57\x37\x58\x38\x57\x35\x71','\x78\x38\x6f\x6c\x57\x34\x76\x67\x79\x6d\x6b\x73\x57\x34\x6e\x55','\x75\x61\x33\x64\x51\x43\x6b\x63\x64\x61','\x57\x34\x56\x63\x4f\x38\x6f\x36\x57\x35\x71\x52\x71\x53\x6b\x65\x57\x50\x75','\x64\x6d\x6b\x6c\x7a\x43\x6f\x58\x75\x43\x6b\x6a\x57\x51\x75','\x57\x51\x54\x75\x6c\x48\x78\x63\x54\x57','\x57\x4f\x4e\x63\x53\x62\x50\x43\x57\x52\x61','\x6a\x4c\x30\x58\x44\x6d\x6b\x45\x57\x36\x39\x72\x6f\x57','\x73\x4a\x30\x2f\x66\x38\x6f\x47','\x70\x58\x6c\x63\x50\x53\x6b\x47\x57\x50\x2f\x63\x48\x74\x71\x4a','\x57\x37\x4c\x34\x57\x34\x65\x35\x6a\x71','\x6a\x38\x6b\x2b\x75\x53\x6b\x41\x57\x4f\x56\x63\x56\x53\x6f\x39\x6a\x47','\x6f\x58\x70\x63\x50\x6d\x6b\x4c\x57\x50\x33\x63\x4c\x68\x57\x4b','\x76\x6d\x6f\x6e\x6c\x6d\x6b\x53\x63\x53\x6f\x41\x57\x4f\x6a\x37\x57\x36\x42\x63\x53\x6d\x6f\x49\x57\x35\x65','\x7a\x38\x6f\x62\x46\x6d\x6b\x58\x68\x6d\x6f\x4d\x57\x35\x4e\x64\x48\x57','\x57\x52\x75\x43\x6b\x64\x4a\x64\x56\x61','\x72\x5a\x39\x47\x57\x50\x4f\x67','\x57\x51\x76\x76\x75\x33\x56\x64\x4e\x48\x64\x63\x54\x43\x6b\x7a','\x43\x6d\x6b\x70\x61\x53\x6b\x41\x57\x52\x30\x45\x71\x38\x6f\x77\x57\x35\x56\x63\x55\x38\x6f\x76\x62\x71','\x74\x63\x33\x64\x54\x6d\x6f\x63\x61\x47','\x6a\x58\x4b\x4c\x57\x37\x66\x68\x57\x35\x2f\x63\x49\x61\x38','\x57\x34\x68\x64\x47\x38\x6f\x4e\x57\x37\x2f\x63\x50\x53\x6b\x52\x57\x35\x46\x64\x51\x61','\x65\x57\x2f\x63\x4f\x6d\x6b\x50\x57\x50\x70\x63\x4c\x77\x31\x47','\x6f\x5a\x74\x63\x52\x57','\x57\x35\x4e\x64\x48\x38\x6f\x33\x57\x37\x52\x63\x50\x43\x6b\x32','\x6e\x43\x6b\x55\x57\x4f\x37\x64\x50\x74\x34','\x57\x37\x62\x4a\x57\x37\x66\x6d\x70\x38\x6f\x2f\x75\x74\x79','\x44\x30\x33\x64\x4a\x43\x6f\x79\x57\x4f\x34\x4d\x57\x52\x61\x4b','\x67\x73\x68\x63\x48\x38\x6b\x44\x42\x47','\x57\x37\x5a\x63\x50\x43\x6b\x59','\x41\x57\x75\x59\x57\x37\x31\x76\x57\x35\x2f\x63\x49\x57\x71','\x61\x38\x6b\x53\x57\x52\x68\x64\x55\x57\x46\x63\x56\x6d\x6b\x76\x79\x57','\x75\x5a\x38\x50\x68\x53\x6f\x4c','\x74\x32\x64\x64\x56\x6d\x6f\x70\x57\x4f\x43','\x46\x61\x62\x31\x57\x52\x65\x4e\x71\x6d\x6b\x4f\x68\x61','\x57\x4f\x54\x38\x57\x4f\x74\x64\x52\x6d\x6f\x52','\x57\x52\x57\x6b\x57\x50\x56\x64\x54\x38\x6b\x50','\x57\x35\x43\x52\x57\x52\x2f\x63\x55\x43\x6b\x34','\x61\x73\x6c\x63\x4f\x6d\x6b\x46\x41\x61','\x65\x4d\x70\x63\x4d\x6d\x6f\x66\x72\x53\x6b\x2b\x7a\x62\x79\x6d\x57\x51\x34\x49\x7a\x48\x47','\x67\x43\x6f\x52\x65\x76\x4e\x63\x4b\x47','\x43\x73\x69\x35\x72\x47','\x57\x35\x34\x6f\x57\x52\x4a\x63\x4d\x6d\x6b\x48\x6f\x4a\x46\x64\x4f\x47','\x57\x50\x4c\x49\x57\x4f\x2f\x64\x47\x38\x6f\x47\x75\x6d\x6f\x39\x78\x57','\x57\x36\x65\x30\x6c\x38\x6f\x65\x57\x51\x70\x63\x4c\x57','\x67\x32\x6c\x64\x4a\x53\x6b\x49\x6c\x43\x6f\x2f\x61\x71\x6d','\x43\x71\x4c\x5a\x57\x52\x65\x4e\x46\x53\x6b\x4e\x75\x47','\x71\x5a\x64\x64\x4a\x53\x6b\x46\x64\x6d\x6f\x55\x6f\x73\x79','\x44\x30\x56\x64\x4d\x6d\x6f\x63','\x45\x62\x42\x64\x4f\x38\x6b\x31\x69\x43\x6f\x65\x67\x61\x38','\x57\x50\x4c\x2b\x57\x36\x5a\x64\x4d\x57','\x57\x34\x44\x50\x57\x36\x61\x76','\x6b\x43\x6f\x73\x57\x4f\x4f\x46\x64\x61','\x57\x51\x38\x65\x57\x50\x2f\x64\x4b\x53\x6b\x38','\x68\x43\x6f\x50\x57\x4f\x62\x42\x57\x51\x6d','\x43\x49\x4c\x64\x75\x6d\x6f\x64\x57\x36\x78\x64\x51\x38\x6b\x61\x6c\x67\x6d\x39\x57\x51\x75\x7a','\x57\x50\x57\x45\x66\x62\x70\x64\x4d\x53\x6b\x66\x57\x51\x79\x2b','\x64\x38\x6f\x54\x57\x50\x39\x66\x57\x51\x2f\x63\x4d\x57\x43','\x57\x36\x4e\x63\x54\x6d\x6b\x53\x57\x34\x57','\x76\x53\x6f\x4c\x75\x53\x6b\x46\x6f\x6d\x6b\x77\x57\x36\x6c\x64\x56\x47','\x6d\x53\x6b\x45\x45\x38\x6f\x38\x77\x53\x6b\x61\x57\x51\x72\x32','\x57\x4f\x6a\x2b\x57\x50\x52\x64\x4b\x53\x6f\x51\x79\x38\x6f\x64\x65\x61','\x44\x75\x65\x34\x41\x43\x6b\x73\x57\x36\x57\x46\x6b\x47','\x77\x53\x6f\x69\x57\x34\x43\x62\x7a\x6d\x6b\x6f','\x64\x32\x38\x47\x63\x53\x6b\x33','\x57\x51\x39\x47\x7a\x78\x5a\x64\x49\x57','\x57\x50\x6e\x42\x6c\x71\x74\x63\x4f\x67\x31\x6d\x79\x57','\x57\x34\x70\x64\x4c\x6d\x6f\x30\x57\x37\x78\x63\x50\x43\x6b\x6e\x57\x36\x56\x64\x52\x57','\x74\x57\x4a\x64\x47\x43\x6b\x43\x67\x43\x6f\x4f\x6a\x73\x47','\x6f\x4d\x38\x74\x66\x57','\x79\x75\x33\x63\x4c\x53\x6b\x70','\x57\x51\x76\x30\x57\x36\x46\x64\x4a\x43\x6b\x61\x73\x58\x37\x63\x50\x61','\x73\x6d\x6f\x68\x42\x38\x6b\x5a\x67\x53\x6b\x4a\x57\x50\x64\x64\x4a\x71','\x57\x4f\x44\x52\x43\x71','\x57\x50\x66\x43\x42\x6d\x6b\x30\x6c\x38\x6b\x6d\x41\x32\x6d','\x57\x37\x79\x67\x64\x58\x33\x63\x49\x75\x2f\x64\x4f\x43\x6b\x68\x7a\x31\x78\x64\x4b\x6d\x6b\x67\x6e\x57','\x63\x5a\x56\x63\x52\x57\x52\x64\x50\x76\x39\x47\x57\x34\x34','\x6f\x53\x6f\x6e\x73\x43\x6f\x63\x57\x36\x66\x70','\x57\x37\x39\x57\x57\x50\x37\x64\x49\x74\x61\x4a\x57\x52\x58\x71','\x75\x68\x42\x64\x51\x38\x6f\x31\x57\x51\x4f\x6e\x57\x4f\x30\x64','\x57\x50\x58\x4c\x44\x43\x6b\x54\x6b\x6d\x6b\x2f\x79\x32\x34','\x57\x35\x4f\x6f\x57\x51\x43','\x57\x52\x7a\x74\x78\x65\x68\x64\x4e\x47\x56\x63\x56\x6d\x6b\x72','\x57\x50\x42\x63\x4a\x71\x62\x71\x57\x50\x71','\x57\x37\x34\x46\x57\x50\x4b\x70\x64\x57','\x65\x5a\x4a\x63\x56\x53\x6b\x78\x45\x61','\x74\x65\x78\x64\x4a\x53\x6f\x31\x57\x52\x79','\x57\x4f\x6e\x53\x43\x6d\x6b\x54','\x6e\x33\x6d\x50\x65\x6d\x6b\x65\x57\x52\x33\x63\x53\x38\x6b\x30','\x57\x35\x52\x64\x53\x6d\x6f\x36\x57\x50\x4f\x36\x73\x43\x6b\x67\x57\x50\x34','\x76\x6d\x6f\x62\x57\x37\x43\x47\x72\x71','\x61\x73\x64\x63\x51\x6d\x6b\x77\x44\x6d\x6b\x4d\x57\x37\x6a\x46','\x57\x37\x37\x64\x4a\x63\x34\x70\x57\x37\x4b','\x57\x52\x70\x63\x54\x61\x76\x4a\x57\x50\x75','\x42\x58\x70\x64\x4a\x38\x6f\x52\x70\x38\x6f\x74\x62\x53\x6b\x35','\x57\x51\x64\x63\x53\x57\x66\x39\x57\x4f\x56\x64\x51\x53\x6f\x32','\x57\x37\x58\x41\x57\x34\x71\x2f\x57\x51\x74\x64\x54\x47','\x73\x4c\x74\x63\x4b\x53\x6b\x76\x78\x72\x68\x64\x51\x78\x53','\x57\x51\x44\x77\x57\x4f\x48\x64\x57\x52\x33\x63\x48\x74\x6c\x63\x4c\x61','\x68\x4b\x78\x63\x4e\x6d\x6b\x79\x78\x49\x46\x64\x52\x74\x71','\x75\x4b\x2f\x63\x4e\x53\x6b\x46\x74\x61','\x57\x35\x72\x53\x57\x36\x53\x32\x57\x52\x47','\x57\x4f\x6a\x32\x57\x4f\x46\x64\x4a\x6d\x6f\x47\x75\x6d\x6f\x2f\x78\x47','\x75\x6d\x6f\x38\x57\x50\x35\x54\x77\x38\x6b\x67\x57\x37\x39\x6d','\x44\x62\x30\x34\x57\x36\x58\x65','\x68\x53\x6f\x4b\x57\x50\x4b\x2f\x66\x31\x56\x63\x4e\x38\x6b\x34','\x74\x77\x57\x6a\x46\x53\x6b\x46','\x46\x38\x6f\x4e\x42\x38\x6b\x5a\x67\x53\x6b\x4a\x57\x37\x37\x64\x47\x71','\x6d\x38\x6f\x32\x63\x32\x4a\x63\x48\x61','\x57\x51\x31\x79\x75\x71','\x6c\x33\x61\x46\x62\x38\x6b\x63\x57\x52\x33\x63\x53\x53\x6b\x39','\x57\x51\x64\x63\x50\x30\x34\x32\x69\x47','\x57\x35\x71\x77\x63\x43\x6f\x62\x57\x4f\x38','\x57\x52\x78\x63\x53\x72\x35\x39','\x62\x49\x78\x63\x4a\x38\x6b\x54\x57\x4f\x65','\x57\x52\x31\x73\x57\x4f\x58\x72\x57\x36\x4e\x64\x4e\x71'];_0x3c9a=function(){return _0x150662;};return _0x3c9a();}function _0x3f3e(_0x4044e7,_0x2c043b){_0x4044e7=_0x4044e7-(-0x25*0x6f+-0x1aff+-0x2cda*-0x1);const _0x1be706=_0x3c9a();let _0x1e1b8d=_0x1be706[_0x4044e7];if(_0x3f3e['\x4a\x51\x63\x6e\x75\x4d']===undefined){var _0x40616d=function(_0x51af21){const _0x4ae047='\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x2b\x2f\x3d';let _0x3c2ce3='',_0x458a26='',_0x1492b1=_0x3c2ce3+_0x40616d,_0x1311ad=(''+function(){return-0x1c2c+-0xe83+-0x1*-0x2aaf;})['\x69\x6e\x64\x65\x78\x4f\x66']('\x0a')!==-(-0x722*0x2+-0x3*0x44f+0x1*0x1b32);for(let _0x509c9b=-0x68e+0x10d6+-0xa48,_0x1cedf6,_0x106c9,_0x45639d=-0x43*0x4a+0x2428+-0x133*0xe;_0x106c9=_0x51af21['\x63\x68\x61\x72\x41\x74'](_0x45639d++);~_0x106c9&&(_0x1cedf6=_0x509c9b%(-0x1582*-0x1+-0xaae*0x3+0xa8c)?_0x1cedf6*(0x2551*-0x1+0x1164+-0x1*-0x142d)+_0x106c9:_0x106c9,_0x509c9b++%(0x4*-0x551+0xc55+0x1*0x8f3))?_0x3c2ce3+=_0x1311ad||_0x1492b1['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x45639d+(-0x11de+0x68b+0xb5d*0x1))-(0x20db+0x153c+-0x360d)!==0x4ea+-0x13*0x19c+0x19aa*0x1?String['\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65'](0x1094+-0x1*0x1929+0x994&_0x1cedf6>>(-(-0x247f+-0x1649+0x23*0x1ae)*_0x509c9b&0xcc+0x1346+-0x140c)):_0x509c9b:-0x8d+0x1d90+-0x1d03){_0x106c9=_0x4ae047['\x69\x6e\x64\x65\x78\x4f\x66'](_0x106c9);}for(let _0x3d2894=-0x3c2+0xd96+0x4ea*-0x2,_0x343f5e=_0x3c2ce3['\x6c\x65\x6e\x67\x74\x68'];_0x3d2894<_0x343f5e;_0x3d2894++){_0x458a26+='\x25'+('\x30\x30'+_0x3c2ce3['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x3d2894)['\x74\x6f\x53\x74\x72\x69\x6e\x67'](-0x143e+0x2616+-0x11c8))['\x73\x6c\x69\x63\x65'](-(-0xe1a+0x1c32*-0x1+0x2a4e));}return decodeURIComponent(_0x458a26);};const _0x53649e=function(_0x203e7e,_0x28a59a){let _0x22f208=[],_0x201b48=0xb2b+0x56+-0xb81,_0x298e15,_0x443fa3='';_0x203e7e=_0x40616d(_0x203e7e);let _0x4f8103;for(_0x4f8103=-0x1af2*0x1+-0x135c+-0x1*-0x2e4e;_0x4f8103<-0x446*0x3+-0x2f*-0xb+0xbcd*0x1;_0x4f8103++){_0x22f208[_0x4f8103]=_0x4f8103;}for(_0x4f8103=-0x17*-0xfd+-0x8c0+-0xdfb;_0x4f8103<-0x12*0x36+0x903+0x437*-0x1;_0x4f8103++){_0x201b48=(_0x201b48+_0x22f208[_0x4f8103]+_0x28a59a['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x4f8103%_0x28a59a['\x6c\x65\x6e\x67\x74\x68']))%(-0x7*0x26+0x25fb+-0xbfb*0x3),_0x298e15=_0x22f208[_0x4f8103],_0x22f208[_0x4f8103]=_0x22f208[_0x201b48],_0x22f208[_0x201b48]=_0x298e15;}_0x4f8103=0xf75+0x1b7*0x5+0x1808*-0x1,_0x201b48=-0x1*-0x1174+-0x1*-0x1c94+-0x2e08;for(let _0x58daa3=0xb37+0x1*-0x1dd+-0x95a;_0x58daa3<_0x203e7e['\x6c\x65\x6e\x67\x74\x68'];_0x58daa3++){_0x4f8103=(_0x4f8103+(-0x40*-0x90+-0x2c9*-0x5+-0x31ec))%(-0x9c9+0x1a7e*0x1+0x1*-0xfb5),_0x201b48=(_0x201b48+_0x22f208[_0x4f8103])%(0x147+0x1*-0x1737+0x16f0),_0x298e15=_0x22f208[_0x4f8103],_0x22f208[_0x4f8103]=_0x22f208[_0x201b48],_0x22f208[_0x201b48]=_0x298e15,_0x443fa3+=String['\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65'](_0x203e7e['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x58daa3)^_0x22f208[(_0x22f208[_0x4f8103]+_0x22f208[_0x201b48])%(0x4*-0x327+0x6*-0x17d+0x168a)]);}return _0x443fa3;};_0x3f3e['\x57\x47\x42\x7a\x4f\x77']=_0x53649e,_0x3f3e['\x71\x64\x56\x70\x65\x72']={},_0x3f3e['\x4a\x51\x63\x6e\x75\x4d']=!![];}const _0x445dfc=_0x1be706[-0x442*0x8+0x37d*0x1+0xa31*0x3],_0x5860ec=_0x4044e7+_0x445dfc,_0x77c84d=_0x3f3e['\x71\x64\x56\x70\x65\x72'][_0x5860ec];if(!_0x77c84d){if(_0x3f3e['\x70\x70\x45\x70\x61\x46']===undefined){const _0x366910=function(_0xf1c36e){this['\x62\x54\x66\x67\x4c\x44']=_0xf1c36e,this['\x44\x61\x47\x50\x68\x71']=[-0x2555+-0x1dfe*0x1+0x4354,-0xe6c+0x1fd7+0x7*-0x27d,-0x2f*-0x6d+0x799+0x6e7*-0x4],this['\x52\x43\x77\x49\x70\x76']=function(){return'\x6e\x65\x77\x53\x74\x61\x74\x65';},this['\x78\x58\x47\x75\x74\x42']='\x5c\x77\x2b\x20\x2a\x5c\x28\x5c\x29\x20\x2a\x7b\x5c\x77\x2b\x20\x2a',this['\x58\x4d\x71\x41\x6b\x48']='\x5b\x27\x7c\x22\x5d\x2e\x2b\x5b\x27\x7c\x22\x5d\x3b\x3f\x20\x2a\x7d';};_0x366910['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x67\x6a\x6e\x70\x69\x6b']=function(){const _0x4ccd4d=new RegExp(this['\x78\x58\x47\x75\x74\x42']+this['\x58\x4d\x71\x41\x6b\x48']),_0x111f1d=_0x4ccd4d['\x74\x65\x73\x74'](this['\x52\x43\x77\x49\x70\x76']['\x74\x6f\x53\x74\x72\x69\x6e\x67']())?--this['\x44\x61\x47\x50\x68\x71'][-0x1581+-0x86a+0x1dec]:--this['\x44\x61\x47\x50\x68\x71'][0x1*-0x1155+-0x69c+0x17f1];return this['\x6e\x74\x4b\x79\x76\x6b'](_0x111f1d);},_0x366910['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x6e\x74\x4b\x79\x76\x6b']=function(_0x16d17f){if(!Boolean(~_0x16d17f))return _0x16d17f;return this['\x45\x6f\x79\x68\x42\x48'](this['\x62\x54\x66\x67\x4c\x44']);},_0x366910['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x45\x6f\x79\x68\x42\x48']=function(_0x4e1804){for(let _0x486f9d=-0x2068+0x26c*-0x7+0x315c,_0x2c534=this['\x44\x61\x47\x50\x68\x71']['\x6c\x65\x6e\x67\x74\x68'];_0x486f9d<_0x2c534;_0x486f9d++){this['\x44\x61\x47\x50\x68\x71']['\x70\x75\x73\x68'](Math['\x72\x6f\x75\x6e\x64'](Math['\x72\x61\x6e\x64\x6f\x6d']())),_0x2c534=this['\x44\x61\x47\x50\x68\x71']['\x6c\x65\x6e\x67\x74\x68'];}return _0x4e1804(this['\x44\x61\x47\x50\x68\x71'][-0x1e28+0x11cd+0xc5b]);},(''+function(){return-0x725+-0x1*0x1d6b+0x2490;})['\x69\x6e\x64\x65\x78\x4f\x66']('\x0a')===-(0x2*0x8bb+-0x133a+0x1c5)&&new _0x366910(_0x3f3e)['\x67\x6a\x6e\x70\x69\x6b'](),_0x3f3e['\x70\x70\x45\x70\x61\x46']=!![];}_0x1e1b8d=_0x3f3e['\x57\x47\x42\x7a\x4f\x77'](_0x1e1b8d,_0x2c043b),_0x3f3e['\x71\x64\x56\x70\x65\x72'][_0x5860ec]=_0x1e1b8d;}else _0x1e1b8d=_0x77c84d;return _0x1e1b8d;}const _0x107ed7=(function(){const _0x56cceb=_0x3f3e,_0x55d78d={};_0x55d78d['\x4c\x67\x67\x6a\x76']=_0x56cceb(0x2cb,'\x32\x50\x63\x66')+_0x56cceb(0x29f,'\x44\x41\x54\x47')+_0x56cceb(0x1e9,'\x4e\x31\x33\x65')+_0x56cceb(0x268,'\x70\x73\x30\x63')+_0x56cceb(0x271,'\x64\x66\x58\x29')+_0x56cceb(0x286,'\x61\x57\x53\x52')+_0x56cceb(0x2fb,'\x66\x5b\x37\x37'),_0x55d78d[_0x56cceb(0x20e,'\x70\x73\x30\x63')]=function(_0x1e0850,_0x594d58){return _0x1e0850===_0x594d58;},_0x55d78d[_0x56cceb(0x2fe,'\x35\x37\x62\x75')]=_0x56cceb(0x293,'\x4e\x51\x73\x56');const _0xa74c4a=_0x55d78d;let _0x1b8abb=!![];return function(_0x4be89a,_0x5c39da){const _0x4db5e0=_0x56cceb,_0x3e945c={};_0x3e945c['\x76\x53\x42\x79\x6e']=_0xa74c4a[_0x4db5e0(0x2e4,'\x6a\x48\x69\x57')];const _0x2f2f94=_0x3e945c;if(_0xa74c4a[_0x4db5e0(0x316,'\x76\x56\x51\x58')]('\x6d\x5a\x73\x6c\x62',_0xa74c4a[_0x4db5e0(0x23d,'\x61\x57\x53\x52')])){const _0x1b3086=_0x1b8abb?function(){const _0x43e4af=_0x4db5e0;if(_0x5c39da){const _0x52ec5a=_0x5c39da[_0x43e4af(0x2e5,'\x6d\x4f\x4e\x30')](_0x4be89a,arguments);return _0x5c39da=null,_0x52ec5a;}}:function(){};return _0x1b8abb=![],_0x1b3086;}else{this['\x6c\x6f\x67\x67\x65\x72'][_0x4db5e0(0x29e,'\x61\x57\x53\x52')]?.(_0x2f2f94['\x76\x53\x42\x79\x6e']);const _0x3ba91={};return _0x3ba91[_0x4db5e0(0x1d7,'\x79\x39\x47\x2a')]=!![],_0x3ba91[_0x4db5e0(0x1f3,'\x5b\x4a\x44\x6d')]=![],_0x3ba91;}};}()),_0x153007=_0x107ed7(this,function(){const _0x24ddd7=_0x3f3e,_0x33fa53={};_0x33fa53[_0x24ddd7(0x25f,'\x41\x54\x70\x69')]=_0x24ddd7(0x241,'\x61\x57\x53\x52')+_0x24ddd7(0x321,'\x4a\x43\x34\x23');const _0x4a3f87=_0x33fa53;return _0x153007[_0x24ddd7(0x212,'\x6a\x48\x69\x57')]()[_0x24ddd7(0x2ec,'\x76\x62\x6f\x51')](_0x4a3f87[_0x24ddd7(0x258,'\x79\x39\x47\x2a')])[_0x24ddd7(0x31e,'\x69\x58\x4a\x73')]()[_0x24ddd7(0x26c,'\x79\x51\x6c\x6f')+_0x24ddd7(0x275,'\x5e\x44\x6a\x62')](_0x153007)[_0x24ddd7(0x2cf,'\x35\x37\x62\x75')](_0x4a3f87[_0x24ddd7(0x217,'\x24\x5a\x41\x51')]);});_0x153007();'use strict';const _0x44842a=require(_0x15118e(0x21a,'\x77\x40\x65\x70'));function _0x568854(_0x4163cc={}){const _0x36638c=_0x15118e,_0x5d63f6={};_0x5d63f6[_0x36638c(0x28f,'\x64\x66\x58\x29')]=function(_0x15e26b,_0xbb9d8f){return _0x15e26b===_0xbb9d8f;},_0x5d63f6[_0x36638c(0x276,'\x38\x5e\x77\x6b')]=_0x36638c(0x2de,'\x31\x57\x29\x32'),_0x5d63f6[_0x36638c(0x315,'\x33\x67\x70\x6c')]=_0x36638c(0x285,'\x44\x6c\x40\x25')+'\x65',_0x5d63f6['\x71\x64\x63\x6b\x54']=_0x36638c(0x287,'\x6d\x4f\x4e\x30')+_0x36638c(0x223,'\x53\x40\x68\x42')+'\x6e\x61\x74\x75\x72\x65',_0x5d63f6[_0x36638c(0x274,'\x44\x6c\x40\x25')]=function(_0x76835,_0x3e32e2){return _0x76835===_0x3e32e2;},_0x5d63f6[_0x36638c(0x260,'\x32\x50\x63\x66')]=_0x36638c(0x1d5,'\x6d\x4f\x4e\x30')+_0x36638c(0x1fe,'\x4e\x31\x33\x65')+_0x36638c(0x203,'\x72\x74\x53\x66'),_0x5d63f6[_0x36638c(0x254,'\x6d\x69\x37\x74')]=function(_0x3f3251,_0x49b683){return _0x3f3251!==_0x49b683;};const _0x9f10e=_0x5d63f6,_0x45d91e={};for(const _0x38f8c6 of Object['\x6b\x65\x79\x73'](_0x4163cc)[_0x36638c(0x1ea,'\x6d\x4f\x4e\x30')]()){if(_0x9f10e['\x6b\x76\x4d\x71\x50'](_0x36638c(0x259,'\x43\x59\x6b\x30'),_0x9f10e[_0x36638c(0x22a,'\x6b\x4a\x73\x73')]))_0xa94d15++;else{if(_0x9f10e[_0x36638c(0x28f,'\x64\x66\x58\x29')](_0x38f8c6,_0x9f10e[_0x36638c(0x2da,'\x35\x37\x62\x75')])||_0x9f10e[_0x36638c(0x2ce,'\x6e\x79\x67\x58')](_0x38f8c6,_0x9f10e[_0x36638c(0x1de,'\x66\x25\x6f\x44')])||_0x9f10e['\x74\x5a\x72\x57\x58'](_0x38f8c6,_0x9f10e[_0x36638c(0x243,'\x41\x54\x70\x69')]))continue;if(_0x9f10e[_0x36638c(0x302,'\x67\x57\x67\x35')](_0x38f8c6,_0x36638c(0x2b5,'\x67\x57\x67\x35')+_0x36638c(0x2c5,'\x4a\x64\x72\x6d')))continue;const _0x19ac9f=_0x4163cc[_0x38f8c6];if(_0x9f10e[_0x36638c(0x216,'\x6e\x79\x67\x58')](_0x19ac9f,undefined))_0x45d91e[_0x38f8c6]=_0x19ac9f;}}return JSON[_0x36638c(0x2b2,'\x76\x56\x51\x58')+'\x79'](_0x45d91e);}function _0x1b7bf2(_0x1da942={},_0x5c1d2b=process.env){const _0x415bae=_0x15118e,_0x1f5294={'\x56\x75\x6f\x46\x44':'\x74\x72\x61\x63\x65\x5f\x70\x72'+_0x415bae(0x20a,'\x72\x74\x53\x66')+_0x415bae(0x2fa,'\x31\x57\x29\x32')+_0x415bae(0x234,'\x31\x57\x29\x32'),'\x70\x63\x66\x46\x59':_0x415bae(0x26a,'\x70\x73\x30\x63'),'\x67\x42\x51\x4e\x4d':function(_0x53e316,_0x41c6f3){return _0x53e316(_0x41c6f3);},'\x61\x6e\x71\x7a\x75':_0x415bae(0x22d,'\x39\x6e\x54\x28'),'\x52\x59\x51\x73\x6a':_0x415bae(0x324,'\x25\x46\x4f\x68'),'\x71\x78\x63\x5a\x6f':_0x415bae(0x27f,'\x53\x40\x68\x42'),'\x4e\x51\x76\x4a\x72':function(_0x2f3337,_0x340f93){return _0x2f3337===_0x340f93;},'\x5a\x48\x42\x58\x4d':'\x4f\x67\x5a\x58\x50'},_0x434acf=_0x1f5294['\x67\x42\x51\x4e\x4d'](String,_0x5c1d2b[_0x415bae(0x29a,'\x76\x74\x78\x29')+_0x415bae(0x1eb,'\x4e\x31\x33\x65')+'\x46\x49\x47\x5f\x53\x49\x47\x4e'+_0x415bae(0x1fc,'\x23\x58\x72\x35')+_0x415bae(0x305,'\x6d\x4f\x4e\x30')]||_0x5c1d2b[_0x415bae(0x1f5,'\x25\x46\x4f\x68')+_0x415bae(0x2be,'\x33\x67\x70\x6c')+_0x415bae(0x247,'\x77\x43\x29\x37')+_0x415bae(0x2a9,'\x41\x54\x70\x69')+_0x415bae(0x2ff,'\x70\x73\x30\x63')+_0x415bae(0x290,'\x76\x74\x78\x29')]||'')[_0x415bae(0x1e3,'\x26\x45\x25\x26')](),_0x1e786f=_0x1f5294[_0x415bae(0x22c,'\x4e\x51\x73\x56')](String,_0x1da942[_0x415bae(0x27b,'\x38\x5e\x77\x6b')+'\x65']||_0x1da942[_0x415bae(0x21b,'\x41\x54\x70\x69')+_0x415bae(0x2f6,'\x38\x5e\x77\x6b')+_0x415bae(0x266,'\x4f\x35\x51\x36')]||'')[_0x415bae(0x318,'\x6d\x4f\x4e\x30')]();if(!_0x434acf||!_0x1e786f)return![];try{return _0x44842a[_0x415bae(0x30a,'\x35\x37\x62\x75')](_0x1f5294[_0x415bae(0x1e0,'\x4a\x63\x4e\x71')],Buffer[_0x415bae(0x257,'\x4a\x64\x72\x6d')](_0x568854(_0x1da942),_0x1f5294[_0x415bae(0x301,'\x53\x40\x68\x42')]),_0x434acf,Buffer[_0x415bae(0x26e,'\x4f\x35\x51\x36')](_0x1e786f,_0x1f5294[_0x415bae(0x2cd,'\x76\x74\x78\x29')]));}catch{if(_0x1f5294[_0x415bae(0x311,'\x38\x5e\x77\x6b')](_0x1f5294['\x5a\x48\x42\x58\x4d'],'\x75\x55\x70\x77\x69'))this[_0x415bae(0x230,'\x26\x45\x25\x26')][_0x415bae(0x2f7,'\x35\x37\x62\x75')](_0x1f5294[_0x415bae(0x27c,'\x39\x6e\x54\x28')],_0x231caa?_0x1f5294[_0x415bae(0x294,'\x77\x40\x65\x70')]:_0x415bae(0x309,'\x23\x58\x72\x35'));else return![];}}class _0x4e0839{constructor({store:_0x4cb2c3,logger:_0x177eb5}={}){const _0x2130fd=_0x15118e,_0x4a6496={};_0x4a6496[_0x2130fd(0x1d6,'\x4a\x63\x4e\x71')]=function(_0x42d7a5,_0x2ce726){return _0x42d7a5||_0x2ce726;};const _0x2693be=_0x4a6496;this['\x73\x74\x6f\x72\x65']=_0x4cb2c3,this[_0x2130fd(0x1e6,'\x6b\x4a\x73\x73')]=_0x2693be[_0x2130fd(0x2c0,'\x6d\x4f\x4e\x30')](_0x177eb5,console);}[_0x15118e(0x24f,'\x69\x58\x4a\x73')](_0x1fb3a6){const _0x20c8a6=_0x15118e,_0x2be19b={};_0x2be19b[_0x20c8a6(0x1ef,'\x66\x25\x6f\x44')]=_0x20c8a6(0x202,'\x25\x46\x4f\x68')+_0x20c8a6(0x2ea,'\x4e\x51\x73\x56')+_0x20c8a6(0x2c7,'\x4e\x51\x73\x56')+_0x20c8a6(0x2d0,'\x4f\x35\x51\x36')+_0x20c8a6(0x312,'\x79\x39\x47\x2a')+_0x20c8a6(0x1f2,'\x79\x51\x6c\x6f')+_0x20c8a6(0x1d4,'\x43\x59\x6b\x30')+_0x20c8a6(0x272,'\x33\x67\x70\x6c')+_0x20c8a6(0x281,'\x4a\x43\x34\x23')+_0x20c8a6(0x239,'\x64\x4f\x65\x4c')+_0x20c8a6(0x21c,'\x39\x6e\x54\x28')+_0x20c8a6(0x299,'\x44\x6c\x40\x25'),_0x2be19b['\x65\x76\x6e\x41\x6a']=_0x20c8a6(0x2fd,'\x67\x57\x67\x35')+'\x6f\x6e\x74\x72\x6f\x6c\x5d\x20'+'\x69\x67\x6e\x6f\x72\x65\x64\x20'+_0x20c8a6(0x23c,'\x64\x66\x58\x29')+_0x20c8a6(0x22f,'\x6a\x48\x69\x57')+_0x20c8a6(0x32b,'\x44\x4a\x57\x37')+_0x20c8a6(0x28e,'\x24\x5a\x41\x51')+_0x20c8a6(0x25c,'\x69\x58\x4a\x73')+_0x20c8a6(0x30f,'\x53\x40\x68\x42'),_0x2be19b[_0x20c8a6(0x1df,'\x5e\x44\x6a\x62')]=function(_0x4b19c7,_0x4cb5fd){return _0x4b19c7===_0x4cb5fd;},_0x2be19b[_0x20c8a6(0x33e,'\x6d\x69\x37\x74')]=function(_0x4d1cf4,_0x158409){return _0x4d1cf4===_0x158409;},_0x2be19b['\x42\x6d\x59\x75\x67']=function(_0x176f01,_0x22364b){return _0x176f01!==_0x22364b;},_0x2be19b['\x70\x7a\x53\x68\x66']=_0x20c8a6(0x2ab,'\x43\x40\x70\x54')+_0x20c8a6(0x30c,'\x53\x40\x68\x42')+_0x20c8a6(0x326,'\x77\x40\x65\x70')+_0x20c8a6(0x21d,'\x41\x54\x70\x69')+_0x20c8a6(0x1d0,'\x49\x58\x79\x56')+_0x20c8a6(0x1dc,'\x64\x4f\x65\x4c')+_0x20c8a6(0x319,'\x49\x58\x79\x56'),_0x2be19b[_0x20c8a6(0x2c6,'\x4a\x64\x72\x6d')]=function(_0x1da5ca,_0x3623bd){return _0x1da5ca===_0x3623bd;},_0x2be19b[_0x20c8a6(0x327,'\x67\x57\x67\x35')]=function(_0x1fa9d6,_0x368ad9){return _0x1fa9d6===_0x368ad9;},_0x2be19b[_0x20c8a6(0x2b7,'\x58\x70\x72\x4f')]=_0x20c8a6(0x207,'\x4f\x35\x51\x36'),_0x2be19b[_0x20c8a6(0x314,'\x5e\x44\x6a\x62')]=function(_0x5707a2,_0xed2485){return _0x5707a2&&_0xed2485;},_0x2be19b[_0x20c8a6(0x2ae,'\x43\x40\x70\x54')]=_0x20c8a6(0x32d,'\x4e\x31\x33\x65'),_0x2be19b[_0x20c8a6(0x295,'\x5e\x44\x6a\x62')]=_0x20c8a6(0x334,'\x49\x58\x79\x56')+_0x20c8a6(0x28c,'\x6d\x4f\x4e\x30')+_0x20c8a6(0x2b4,'\x58\x70\x72\x4f')+_0x20c8a6(0x2c2,'\x53\x40\x68\x42')+_0x20c8a6(0x33f,'\x4a\x43\x34\x23')+_0x20c8a6(0x251,'\x5e\x44\x6a\x62')+_0x20c8a6(0x2b6,'\x4e\x31\x33\x65')+_0x20c8a6(0x2ca,'\x66\x25\x6f\x44')+_0x20c8a6(0x2a2,'\x72\x74\x53\x66')+_0x20c8a6(0x339,'\x25\x46\x4f\x68')+_0x20c8a6(0x325,'\x49\x58\x79\x56'),_0x2be19b[_0x20c8a6(0x1da,'\x44\x4a\x57\x37')]=_0x20c8a6(0x2e3,'\x76\x62\x6f\x51')+_0x20c8a6(0x228,'\x6a\x48\x69\x57')+'\x5f\x65\x6e\x61\x62\x6c\x65\x64',_0x2be19b[_0x20c8a6(0x24c,'\x43\x59\x6b\x30')]=_0x20c8a6(0x304,'\x66\x25\x6f\x44'),_0x2be19b[_0x20c8a6(0x331,'\x24\x5a\x41\x51')]='\x62\x6f\x6f\x6c\x65\x61\x6e',_0x2be19b['\x66\x6c\x6a\x4c\x6e']=_0x20c8a6(0x29c,'\x4a\x63\x4e\x71'),_0x2be19b[_0x20c8a6(0x237,'\x32\x50\x63\x66')]='\x54\x45\x78\x41\x7a',_0x2be19b[_0x20c8a6(0x24a,'\x70\x73\x30\x63')]=_0x20c8a6(0x29d,'\x39\x6e\x54\x28')+_0x20c8a6(0x220,'\x61\x57\x53\x52')+_0x20c8a6(0x218,'\x6d\x69\x37\x74')+_0x20c8a6(0x1d2,'\x67\x57\x67\x35'),_0x2be19b[_0x20c8a6(0x33a,'\x79\x51\x6c\x6f')]=function(_0x32baab,_0x1f8d07){return _0x32baab===_0x1f8d07;},_0x2be19b['\x61\x7a\x44\x55\x79']=_0x20c8a6(0x2d7,'\x66\x5b\x37\x37'),_0x2be19b[_0x20c8a6(0x2ef,'\x44\x4a\x57\x37')]=_0x20c8a6(0x289,'\x64\x4f\x65\x4c'),_0x2be19b[_0x20c8a6(0x29b,'\x77\x40\x65\x70')]=_0x20c8a6(0x2e9,'\x32\x50\x63\x66')+_0x20c8a6(0x2d6,'\x44\x41\x54\x47')+_0x20c8a6(0x1ec,'\x64\x66\x58\x29'),_0x2be19b[_0x20c8a6(0x2db,'\x39\x6e\x54\x28')]=function(_0x45cb0a,_0x34ef00){return _0x45cb0a&&_0x34ef00;},_0x2be19b[_0x20c8a6(0x2ed,'\x31\x57\x29\x32')]='\x58\x41\x43\x41\x6b',_0x2be19b[_0x20c8a6(0x330,'\x23\x58\x72\x35')]=function(_0x44f690,_0x242b2e){return _0x44f690===_0x242b2e;},_0x2be19b[_0x20c8a6(0x20d,'\x24\x5a\x41\x51')]='\x72\x75\x42\x47\x54',_0x2be19b[_0x20c8a6(0x1d3,'\x32\x50\x63\x66')]=_0x20c8a6(0x210,'\x6d\x4f\x4e\x30'),_0x2be19b[_0x20c8a6(0x300,'\x43\x40\x70\x54')]=_0x20c8a6(0x1e5,'\x61\x57\x53\x52')+_0x20c8a6(0x2d8,'\x5b\x4a\x44\x6d')+_0x20c8a6(0x337,'\x49\x58\x79\x56')+_0x20c8a6(0x1d1,'\x33\x67\x70\x6c'),_0x2be19b[_0x20c8a6(0x2f1,'\x76\x74\x78\x29')]=function(_0x21eb4f,_0x257d2b){return _0x21eb4f+_0x257d2b;},_0x2be19b[_0x20c8a6(0x1fb,'\x77\x43\x29\x37')]=_0x20c8a6(0x2e6,'\x66\x25\x6f\x44')+_0x20c8a6(0x30c,'\x53\x40\x68\x42')+_0x20c8a6(0x273,'\x44\x6c\x40\x25')+_0x20c8a6(0x25b,'\x53\x40\x68\x42')+'\x20',_0x2be19b[_0x20c8a6(0x2c1,'\x4f\x35\x51\x36')]=_0x20c8a6(0x2bd,'\x77\x40\x65\x70');const _0x125b90=_0x2be19b,_0x1723ec=_0x1fb3a6&&_0x1fb3a6[_0x20c8a6(0x2e2,'\x6d\x4f\x4e\x30')]?_0x1fb3a6[_0x20c8a6(0x23b,'\x4a\x63\x4e\x71')]:_0x1fb3a6,_0x2d4e6d=_0x1723ec&&(_0x1723ec[_0x20c8a6(0x242,'\x55\x4c\x74\x69')]??_0x1723ec[_0x20c8a6(0x336,'\x38\x4b\x5d\x31')+_0x20c8a6(0x1d8,'\x4a\x43\x34\x23')+'\x5f\x65\x6e\x61\x62\x6c\x65\x64']??_0x1723ec[_0x20c8a6(0x24b,'\x39\x6e\x54\x28')+_0x20c8a6(0x33c,'\x77\x43\x29\x37')+_0x20c8a6(0x1e4,'\x5e\x44\x6a\x62')+_0x20c8a6(0x2b9,'\x64\x66\x58\x29')]);if(_0x125b90['\x42\x6d\x59\x75\x67'](typeof _0x2d4e6d,_0x20c8a6(0x252,'\x53\x40\x68\x42'))){this['\x6c\x6f\x67\x67\x65\x72'][_0x20c8a6(0x270,'\x70\x73\x30\x63')]?.(_0x125b90['\x70\x7a\x53\x68\x66']);const _0xd2707f={};return _0xd2707f[_0x20c8a6(0x26b,'\x24\x5a\x41\x51')]=!![],_0xd2707f[_0x20c8a6(0x2c9,'\x41\x54\x70\x69')]=![],_0xd2707f;}let _0x2a77fb=_0x1723ec[_0x20c8a6(0x2a7,'\x4a\x64\x72\x6d')+_0x20c8a6(0x238,'\x43\x59\x6b\x30')+_0x20c8a6(0x1f6,'\x76\x56\x51\x58')]??_0x1723ec['\x74\x72\x61\x63\x65\x5f\x70\x72'+_0x20c8a6(0x1e8,'\x64\x4f\x65\x4c')+_0x20c8a6(0x215,'\x4a\x63\x4e\x71')+_0x20c8a6(0x2d9,'\x70\x73\x30\x63')];const _0x630c65=_0x1b7bf2(_0x1723ec),_0x3f4dd9=_0x125b90[_0x20c8a6(0x303,'\x33\x67\x70\x6c')](_0x2d4e6d,!![]),_0x2c9e20=_0x125b90[_0x20c8a6(0x2ee,'\x6e\x79\x67\x58')](_0x2a77fb,!![]),_0x50f877=_0x125b90['\x6c\x46\x73\x48\x76'](typeof _0x1723ec[_0x20c8a6(0x2ad,'\x43\x40\x70\x54')+_0x20c8a6(0x231,'\x26\x45\x25\x26')],_0x125b90[_0x20c8a6(0x283,'\x66\x25\x6f\x44')])&&_0x1723ec['\x68\x75\x62\x5f\x70\x75\x62\x6c'+_0x20c8a6(0x245,'\x38\x4b\x5d\x31')][_0x20c8a6(0x23a,'\x79\x39\x47\x2a')]();if(_0x125b90[_0x20c8a6(0x27e,'\x39\x6e\x54\x28')](!_0x630c65,_0x3f4dd9)){if(_0x125b90[_0x20c8a6(0x226,'\x66\x5b\x37\x37')](_0x125b90[_0x20c8a6(0x33b,'\x64\x4f\x65\x4c')],_0x125b90[_0x20c8a6(0x1ee,'\x53\x40\x68\x42')])){this[_0x20c8a6(0x25a,'\x23\x58\x72\x35')][_0x20c8a6(0x270,'\x70\x73\x30\x63')]?.(_0x20c8a6(0x2a5,'\x44\x41\x54\x47')+_0x20c8a6(0x206,'\x33\x67\x70\x6c')+_0x20c8a6(0x20c,'\x77\x43\x29\x37')+_0x20c8a6(0x332,'\x38\x5e\x77\x6b')+_0x20c8a6(0x280,'\x35\x37\x62\x75')+_0x20c8a6(0x30d,'\x44\x4a\x57\x37')+_0x20c8a6(0x27d,'\x49\x58\x79\x56')+_0x20c8a6(0x213,'\x76\x62\x6f\x51')+'\x20\x63\x6f\x6c\x6c\x65\x63\x74'+_0x20c8a6(0x2f5,'\x32\x50\x63\x66')+_0x20c8a6(0x32c,'\x43\x40\x70\x54')+_0x20c8a6(0x1ff,'\x6a\x48\x69\x57'));const _0x55c751={};return _0x55c751['\x61\x63\x6b']=!![],_0x55c751['\x61\x70\x70\x6c\x69\x65\x64']=![],_0x55c751;}else{this[_0x20c8a6(0x1f9,'\x43\x40\x70\x54')]['\x77\x61\x72\x6e']?.(_0x125b90[_0x20c8a6(0x23f,'\x39\x6e\x54\x28')]);const _0x3082a5={};return _0x3082a5[_0x20c8a6(0x269,'\x5b\x4a\x44\x6d')]=!![],_0x3082a5[_0x20c8a6(0x2b0,'\x55\x4c\x74\x69')]=![],_0x3082a5;}}_0x125b90[_0x20c8a6(0x2d5,'\x6b\x4a\x73\x73')](!_0x630c65,_0x2c9e20)&&(this[_0x20c8a6(0x25d,'\x76\x56\x51\x58')][_0x20c8a6(0x240,'\x77\x40\x65\x70')]?.(_0x125b90['\x72\x7a\x67\x78\x42']),_0x2a77fb=![]);this[_0x20c8a6(0x20f,'\x4a\x63\x4e\x71')][_0x20c8a6(0x2f7,'\x35\x37\x62\x75')](_0x125b90['\x68\x43\x52\x47\x42'],_0x2d4e6d?_0x20c8a6(0x1f4,'\x79\x39\x47\x2a'):_0x125b90[_0x20c8a6(0x2dd,'\x5e\x44\x6a\x62')]);_0x125b90[_0x20c8a6(0x233,'\x39\x6e\x54\x28')](typeof _0x2a77fb,_0x125b90[_0x20c8a6(0x310,'\x38\x5e\x77\x6b')])&&(_0x125b90[_0x20c8a6(0x1dd,'\x61\x57\x53\x52')]===_0x125b90['\x7a\x65\x41\x52\x56']?this[_0x20c8a6(0x28b,'\x44\x6c\x40\x25')][_0x20c8a6(0x2f0,'\x55\x4c\x74\x69')]?.(_0x20c8a6(0x221,'\x4a\x64\x72\x6d')+_0x20c8a6(0x265,'\x25\x46\x4f\x68')+_0x20c8a6(0x2f4,'\x79\x39\x47\x2a')+'\x72\x75\x6e\x74\x69\x6d\x65\x20'+_0x20c8a6(0x31d,'\x23\x58\x72\x35')+_0x20c8a6(0x31a,'\x72\x74\x53\x66')+_0x20c8a6(0x298,'\x6b\x4a\x73\x73')+_0x20c8a6(0x2d2,'\x33\x67\x70\x6c')+_0x20c8a6(0x250,'\x39\x6e\x54\x28')+_0x20c8a6(0x24e,'\x44\x4a\x57\x37')+_0x20c8a6(0x26f,'\x77\x43\x29\x37')+_0x20c8a6(0x2a1,'\x4f\x35\x51\x36')+_0x20c8a6(0x1f8,'\x38\x5e\x77\x6b')+_0x20c8a6(0x30e,'\x4e\x31\x33\x65')+_0x20c8a6(0x2bb,'\x61\x57\x53\x52')+_0x20c8a6(0x2aa,'\x55\x4c\x74\x69')):this[_0x20c8a6(0x1e2,'\x66\x5b\x37\x37')][_0x20c8a6(0x2ac,'\x66\x5b\x37\x37')](_0x125b90[_0x20c8a6(0x2f2,'\x32\x50\x63\x66')],_0x2a77fb?_0x20c8a6(0x292,'\x49\x58\x79\x56'):_0x125b90[_0x20c8a6(0x320,'\x79\x51\x6c\x6f')]));const _0x34663d=_0x125b90[_0x20c8a6(0x2a4,'\x5b\x4a\x44\x6d')](typeof _0x1723ec[_0x20c8a6(0x264,'\x69\x58\x4a\x73')+_0x20c8a6(0x204,'\x72\x74\x53\x66')+_0x20c8a6(0x2e1,'\x76\x62\x6f\x51')],_0x20c8a6(0x2b1,'\x44\x6c\x40\x25'))&&_0x1723ec[_0x20c8a6(0x1fd,'\x67\x57\x67\x35')+_0x20c8a6(0x256,'\x38\x4b\x5d\x31')+_0x20c8a6(0x2fc,'\x38\x4b\x5d\x31')][_0x20c8a6(0x277,'\x55\x4c\x74\x69')]();if(_0x630c65&&_0x34663d&&_0x1723ec[_0x20c8a6(0x2cc,'\x26\x45\x25\x26')+_0x20c8a6(0x2d4,'\x24\x5a\x41\x51')+_0x20c8a6(0x1ed,'\x43\x59\x6b\x30')][_0x20c8a6(0x2bf,'\x76\x56\x51\x58')](_0x20c8a6(0x2e0,'\x43\x40\x70\x54')+'\x45\x59'))_0x125b90[_0x20c8a6(0x335,'\x43\x59\x6b\x30')]!==_0x125b90[_0x20c8a6(0x308,'\x64\x4f\x65\x4c')]?this[_0x20c8a6(0x1f0,'\x5b\x4a\x44\x6d')][_0x20c8a6(0x244,'\x38\x5e\x77\x6b')](_0x125b90[_0x20c8a6(0x1fa,'\x6a\x48\x69\x57')],_0x1723ec['\x74\x72\x61\x63\x65\x5f\x68\x75'+_0x20c8a6(0x208,'\x44\x6c\x40\x25')+_0x20c8a6(0x200,'\x41\x54\x70\x69')][_0x20c8a6(0x2d3,'\x67\x57\x67\x35')]()):this[_0x20c8a6(0x28b,'\x44\x6c\x40\x25')][_0x20c8a6(0x263,'\x41\x54\x70\x69')]?.(_0x125b90[_0x20c8a6(0x28d,'\x4a\x43\x34\x23')]);else{if(_0x125b90[_0x20c8a6(0x214,'\x43\x40\x70\x54')](!_0x630c65,_0x34663d)){if(_0x125b90['\x64\x61\x67\x74\x59']!=='\x58\x41\x43\x41\x6b'){const _0x2c3828=this['\x70\x72\x6f\x63\x65\x73\x73'](_0x235dc4),_0x4783c7=_0x125b90[_0x20c8a6(0x323,'\x44\x41\x54\x47')](_0x2c3828,!![])||_0x2c3828&&_0x2c3828['\x61\x63\x6b']===!![],_0x67f690=_0x2c3828===!![]||_0x2c3828&&_0x125b90[_0x20c8a6(0x2e8,'\x49\x58\x79\x56')](_0x2c3828[_0x20c8a6(0x219,'\x24\x5a\x41\x51')],!![]);_0x4783c7&&this[_0x20c8a6(0x279,'\x39\x6e\x54\x28')]['\x61\x63\x6b'](_0x30a982['\x69\x64']),_0x67f690&&_0x4736ca++;}else this['\x6c\x6f\x67\x67\x65\x72']['\x77\x61\x72\x6e']?.(_0x125b90[_0x20c8a6(0x2c3,'\x79\x51\x6c\x6f')]);}}_0x50f877&&(_0x125b90[_0x20c8a6(0x333,'\x44\x4a\x57\x37')](_0x125b90['\x57\x4e\x71\x41\x76'],_0x125b90[_0x20c8a6(0x284,'\x77\x40\x65\x70')])?this[_0x20c8a6(0x222,'\x4a\x43\x34\x23')]['\x61\x63\x6b'](_0x53c5be['\x69\x64']):this[_0x20c8a6(0x25d,'\x76\x56\x51\x58')][_0x20c8a6(0x2f3,'\x23\x58\x72\x35')]?.('\x5b\x74\x72\x61\x63\x65\x2d\x63'+_0x20c8a6(0x1f7,'\x61\x57\x53\x52')+_0x20c8a6(0x2f8,'\x38\x4b\x5d\x31')+_0x20c8a6(0x2e7,'\x23\x58\x72\x35')+'\x68\x75\x62\x5f\x70\x75\x62\x6c'+_0x20c8a6(0x2a3,'\x41\x54\x70\x69')+_0x20c8a6(0x32e,'\x76\x62\x6f\x51')+_0x20c8a6(0x2eb,'\x4a\x64\x72\x6d')+_0x20c8a6(0x2f9,'\x41\x54\x70\x69')+_0x20c8a6(0x209,'\x6d\x4f\x4e\x30')+_0x20c8a6(0x282,'\x58\x70\x72\x4f')+_0x20c8a6(0x322,'\x64\x4f\x65\x4c')+_0x20c8a6(0x2a6,'\x4e\x31\x33\x65')+_0x20c8a6(0x253,'\x33\x67\x70\x6c')+_0x20c8a6(0x26d,'\x53\x40\x68\x42')+_0x20c8a6(0x306,'\x49\x58\x79\x56')));this[_0x20c8a6(0x2d1,'\x76\x62\x6f\x51')][_0x20c8a6(0x2af,'\x5e\x44\x6a\x62')](_0x125b90[_0x20c8a6(0x297,'\x61\x57\x53\x52')],new Date()[_0x20c8a6(0x2b8,'\x24\x5a\x41\x51')+_0x20c8a6(0x227,'\x77\x43\x29\x37')]()),this['\x6c\x6f\x67\x67\x65\x72'][_0x20c8a6(0x2c4,'\x43\x59\x6b\x30')]?.(_0x125b90['\x72\x6f\x4d\x62\x65'](_0x125b90[_0x20c8a6(0x31f,'\x67\x57\x67\x35')],_0x2d4e6d?_0x20c8a6(0x24d,'\x43\x40\x70\x54'):_0x125b90['\x57\x65\x51\x44\x67']));const _0x4865fe={};return _0x4865fe[_0x20c8a6(0x20b,'\x5e\x44\x6a\x62')]=!![],_0x4865fe[_0x20c8a6(0x32f,'\x76\x56\x51\x58')]=!![],_0x4865fe;}[_0x15118e(0x1d9,'\x32\x50\x63\x66')+_0x15118e(0x296,'\x61\x57\x53\x52')](){const _0x3db011=_0x15118e,_0x55912a={};_0x55912a[_0x3db011(0x291,'\x77\x40\x65\x70')]=_0x3db011(0x236,'\x79\x39\x47\x2a')+_0x3db011(0x255,'\x66\x25\x6f\x44')+_0x3db011(0x232,'\x79\x51\x6c\x6f'),_0x55912a[_0x3db011(0x235,'\x4f\x35\x51\x36')]='\x70\x72\x6f\x78\x79\x5f\x74\x72'+_0x3db011(0x23e,'\x43\x40\x70\x54')+'\x69\x67',_0x55912a[_0x3db011(0x2a0,'\x4e\x51\x73\x56')]=function(_0x38fa4d,_0x475f49){return _0x38fa4d===_0x475f49;},_0x55912a[_0x3db011(0x229,'\x58\x70\x72\x4f')]=function(_0x40f730,_0x1fd32e){return _0x40f730===_0x1fd32e;};const _0x5e5399=_0x55912a,_0x437014={};_0x437014[_0x3db011(0x2df,'\x70\x73\x30\x63')]=_0x5e5399[_0x3db011(0x262,'\x55\x4c\x74\x69')],_0x437014[_0x3db011(0x21e,'\x41\x54\x70\x69')]=0x32;const _0x241f9e={};_0x241f9e['\x74\x79\x70\x65']=_0x5e5399[_0x3db011(0x246,'\x38\x5e\x77\x6b')],_0x241f9e[_0x3db011(0x2ba,'\x25\x46\x4f\x68')]=0x32;const _0x4c6fe7=[...this[_0x3db011(0x2b3,'\x64\x4f\x65\x4c')][_0x3db011(0x211,'\x72\x74\x53\x66')](_0x437014),...this[_0x3db011(0x288,'\x32\x50\x63\x66')][_0x3db011(0x31c,'\x43\x40\x70\x54')](_0x241f9e)];let _0x343f1e=0xbdd*0x1+-0x1*0x1975+0x1d*0x78;for(const _0x3045ff of _0x4c6fe7){const _0x150d61=this[_0x3db011(0x328,'\x61\x57\x53\x52')](_0x3045ff),_0x3a8f46=_0x5e5399[_0x3db011(0x224,'\x38\x5e\x77\x6b')](_0x150d61,!![])||_0x150d61&&_0x5e5399[_0x3db011(0x21f,'\x77\x40\x65\x70')](_0x150d61[_0x3db011(0x2dc,'\x76\x74\x78\x29')],!![]),_0x22c326=_0x5e5399[_0x3db011(0x313,'\x53\x40\x68\x42')](_0x150d61,!![])||_0x150d61&&_0x5e5399[_0x3db011(0x1db,'\x6d\x4f\x4e\x30')](_0x150d61[_0x3db011(0x27a,'\x5e\x44\x6a\x62')],!![]);_0x3a8f46&&this[_0x3db011(0x25e,'\x4e\x31\x33\x65')][_0x3db011(0x28a,'\x41\x54\x70\x69')](_0x3045ff['\x69\x64']),_0x22c326&&_0x343f1e++;}return _0x343f1e;}}const _0x31f831={};_0x31f831[_0x15118e(0x249,'\x4a\x63\x4e\x71')+_0x15118e(0x22b,'\x24\x5a\x41\x51')]=_0x4e0839,_0x31f831[_0x15118e(0x201,'\x64\x66\x58\x29')+_0x15118e(0x225,'\x25\x46\x4f\x68')+_0x15118e(0x307,'\x4e\x31\x33\x65')+_0x15118e(0x267,'\x76\x62\x6f\x51')]=_0x568854,_0x31f831[_0x15118e(0x340,'\x67\x57\x67\x35')+_0x15118e(0x329,'\x24\x5a\x41\x51')+'\x67\x53\x69\x67\x6e\x61\x74\x75'+'\x72\x65']=_0x1b7bf2,module['\x65\x78\x70\x6f\x72\x74\x73']=_0x31f831;
|
package/src/proxy/index.js
CHANGED
|
@@ -5,6 +5,8 @@ const { MailboxStore } = require('./mailbox/store');
|
|
|
5
5
|
const { ProxyHttpServer } = require('./server/http');
|
|
6
6
|
const { buildRoutes } = require('./server/routes');
|
|
7
7
|
const { buildMessagesHandler, canonicalizeForBedrock, supportsAdaptiveThinking } = require('./router/messages_route');
|
|
8
|
+
const { ensureEnvelope } = require('./envelope');
|
|
9
|
+
const { buildResponsesHandler } = require('./router/responses_route');
|
|
8
10
|
const { SyncEngine } = require('./sync/engine');
|
|
9
11
|
const { LifecycleManager } = require('./lifecycle/manager');
|
|
10
12
|
const { TaskMonitor } = require('./task/monitor');
|
|
@@ -12,10 +14,55 @@ const { SkillUpdater } = require('./extensions/skillUpdater');
|
|
|
12
14
|
const { DmHandler } = require('./extensions/dmHandler');
|
|
13
15
|
const { SessionHandler } = require('./extensions/sessionHandler');
|
|
14
16
|
const { TraceControl } = require('./extensions/traceControl');
|
|
17
|
+
const { backfillProxyTraceUploads } = require('./trace/extractor');
|
|
18
|
+
|
|
19
|
+
const TRACE_BACKFILL_DRAIN_MAX_PASSES = 8;
|
|
20
|
+
const TRACE_BACKFILL_STARTUP_DRAIN_MAX_MS = 250;
|
|
21
|
+
const TRACE_BACKFILL_RUNTIME_DRAIN_MAX_MS = 50;
|
|
15
22
|
|
|
16
23
|
// Lazy via paths.getEvomapPath() — honors EVOLVER_HOME (#114).
|
|
17
24
|
function _defaultDataDir() { return getEvomapPath('mailbox'); }
|
|
18
25
|
|
|
26
|
+
const DEFAULT_OPENAI_BASE_URL = 'https://api.openai.com/v1';
|
|
27
|
+
|
|
28
|
+
function isAllowedOpenAIHostname(hostname) {
|
|
29
|
+
const h = String(hostname || '').toLowerCase();
|
|
30
|
+
return h === 'api.openai.com' || h.endsWith('.api.openai.com');
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function resolveOpenAIBaseUrl(raw, { trustedOverride = false } = {}) {
|
|
34
|
+
const value = String(raw || DEFAULT_OPENAI_BASE_URL).replace(/\/+$/, '');
|
|
35
|
+
if (trustedOverride) return value;
|
|
36
|
+
|
|
37
|
+
let parsed;
|
|
38
|
+
try {
|
|
39
|
+
parsed = new URL(value);
|
|
40
|
+
} catch {
|
|
41
|
+
throw new Error('[proxy] EVOMAP_OPENAI_BASE_URL is not a valid URL');
|
|
42
|
+
}
|
|
43
|
+
if (
|
|
44
|
+
parsed.protocol !== 'https:'
|
|
45
|
+
|| !isAllowedOpenAIHostname(parsed.hostname)
|
|
46
|
+
|| parsed.pathname !== '/v1'
|
|
47
|
+
|| parsed.username
|
|
48
|
+
|| parsed.password
|
|
49
|
+
|| parsed.search
|
|
50
|
+
|| parsed.hash
|
|
51
|
+
) {
|
|
52
|
+
throw new Error('[proxy] EVOMAP_OPENAI_BASE_URL must be an OpenAI https://*.api.openai.com/v1 endpoint');
|
|
53
|
+
}
|
|
54
|
+
return value;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function makeOpenAIGatewayError(err, fallbackStatus = 502) {
|
|
58
|
+
const name = err && err.name ? String(err.name) : '';
|
|
59
|
+
const isTimeout = name === 'TimeoutError' || name === 'AbortError';
|
|
60
|
+
const out = new Error(isTimeout ? 'openai upstream timed out' : 'openai upstream request failed');
|
|
61
|
+
out.statusCode = isTimeout ? 504 : fallbackStatus;
|
|
62
|
+
out.cause = err;
|
|
63
|
+
return out;
|
|
64
|
+
}
|
|
65
|
+
|
|
19
66
|
// The hub serves asset signal-search as `GET /a2a/assets/search` with query
|
|
20
67
|
// params (signals, status, limit, fields, domain); `signals`/`fields` are
|
|
21
68
|
// comma-separated lists. The proxy's public contract stays `POST /asset/search`
|
|
@@ -78,6 +125,8 @@ class EvoMapProxy {
|
|
|
78
125
|
this.logger = opts.logger || console;
|
|
79
126
|
this._skillPath = opts.skillPath || null;
|
|
80
127
|
this._anthropicBaseUrl = (opts.anthropicBaseUrl || process.env.EVOMAP_ANTHROPIC_BASE_URL || 'https://api.anthropic.com').replace(/\/+$/, '');
|
|
128
|
+
this._openaiBaseUrl = String(opts.openaiBaseUrl || process.env.EVOMAP_OPENAI_BASE_URL || DEFAULT_OPENAI_BASE_URL).replace(/\/+$/, '');
|
|
129
|
+
this._openaiBaseUrlTrusted = !!opts.openaiBaseUrl;
|
|
81
130
|
|
|
82
131
|
this.store = null;
|
|
83
132
|
this.server = null;
|
|
@@ -88,6 +137,7 @@ class EvoMapProxy {
|
|
|
88
137
|
this.dmHandler = null;
|
|
89
138
|
this.sessionHandler = null;
|
|
90
139
|
this.traceControl = null;
|
|
140
|
+
this._traceBackfillDraining = false;
|
|
91
141
|
this._started = false;
|
|
92
142
|
}
|
|
93
143
|
|
|
@@ -141,6 +191,9 @@ class EvoMapProxy {
|
|
|
141
191
|
getHeaders,
|
|
142
192
|
logger: this.logger,
|
|
143
193
|
onAuthError: () => this.lifecycle.reAuthenticate(),
|
|
194
|
+
onOutboundFlushed: () => this._drainProxyTraceBackfill({
|
|
195
|
+
maxMs: TRACE_BACKFILL_RUNTIME_DRAIN_MAX_MS,
|
|
196
|
+
}),
|
|
144
197
|
onInboundReceived: () => {
|
|
145
198
|
try { this.skillUpdater?.pollAndApply(); } catch (e) {
|
|
146
199
|
this.logger?.warn?.('[proxy] skillUpdater.pollAndApply failed:', e.message);
|
|
@@ -152,14 +205,19 @@ class EvoMapProxy {
|
|
|
152
205
|
});
|
|
153
206
|
|
|
154
207
|
const proxyHandlers = {
|
|
155
|
-
|
|
208
|
+
// /a2a/fetch and /a2a/validate are strict GEP-A2A protocol endpoints:
|
|
209
|
+
// the hub runs isValidProtocolMessage and rejects bare bodies
|
|
210
|
+
// ({asset_ids: [...]}) with 400 invalid_protocol_message, so wrap them
|
|
211
|
+
// in an envelope first. The GET search endpoints below are lenient REST
|
|
212
|
+
// and take plain query params -- no envelope there.
|
|
213
|
+
assetFetch: (body) => this._proxyHttp('/a2a/fetch', this._wrapA2a('fetch', body)),
|
|
156
214
|
// GET (not POST). planAssetSearch() picks signal-search vs semantic-search
|
|
157
215
|
// by whether the body carries a free-text `query` or a `signals` list.
|
|
158
216
|
assetSearch: (body) => {
|
|
159
217
|
const plan = planAssetSearch(body);
|
|
160
218
|
return this._proxyHttp(plan.path, null, { method: 'GET', query: plan.query });
|
|
161
219
|
},
|
|
162
|
-
assetValidate: (body) => this._proxyHttp('/a2a/validate', body),
|
|
220
|
+
assetValidate: (body) => this._proxyHttp('/a2a/validate', this._wrapA2a('validate', body)),
|
|
163
221
|
// ATP passthrough (#460 Bug 2): merchant/consumer flows that used to call
|
|
164
222
|
// hub directly via src/atp/hubClient.js must route through the proxy when
|
|
165
223
|
// EVOMAP_PROXY=1 so proxy sees the transaction (for audit + offline queue).
|
|
@@ -188,6 +246,12 @@ class EvoMapProxy {
|
|
|
188
246
|
traceStore: this.store,
|
|
189
247
|
onTraceQueued: () => this.sync?.notifyNewOutbound(),
|
|
190
248
|
});
|
|
249
|
+
const responsesHandler = buildResponsesHandler({
|
|
250
|
+
openAIProxy: (reqPath, body, opts) => this._proxyOpenAIResponses(reqPath, body, opts),
|
|
251
|
+
logger: this.logger,
|
|
252
|
+
traceStore: this.store,
|
|
253
|
+
onTraceQueued: () => this.sync?.notifyNewOutbound(),
|
|
254
|
+
});
|
|
191
255
|
|
|
192
256
|
const routes = buildRoutes(this.store, proxyHandlers, this.taskMonitor, {
|
|
193
257
|
dmHandler: this.dmHandler,
|
|
@@ -195,6 +259,7 @@ class EvoMapProxy {
|
|
|
195
259
|
sessionHandler: this.sessionHandler,
|
|
196
260
|
getHubMailboxStatus: () => this._getHubMailboxStatus(),
|
|
197
261
|
messagesHandler,
|
|
262
|
+
responsesHandler,
|
|
198
263
|
});
|
|
199
264
|
|
|
200
265
|
const OUTBOUND_ROUTES = [
|
|
@@ -237,6 +302,8 @@ class EvoMapProxy {
|
|
|
237
302
|
this.logger.warn('[proxy] No A2A_HUB_URL set, running in offline/local mode');
|
|
238
303
|
}
|
|
239
304
|
|
|
305
|
+
this._drainProxyTraceBackfill({ maxMs: TRACE_BACKFILL_STARTUP_DRAIN_MAX_MS });
|
|
306
|
+
|
|
240
307
|
this._started = true;
|
|
241
308
|
|
|
242
309
|
return {
|
|
@@ -246,6 +313,66 @@ class EvoMapProxy {
|
|
|
246
313
|
};
|
|
247
314
|
}
|
|
248
315
|
|
|
316
|
+
_runProxyTraceBackfillPass() {
|
|
317
|
+
try {
|
|
318
|
+
return backfillProxyTraceUploads({
|
|
319
|
+
store: this.store,
|
|
320
|
+
logger: this.logger,
|
|
321
|
+
});
|
|
322
|
+
} catch (e) {
|
|
323
|
+
this.logger.warn('[proxy] trace backfill failed:', e && e.message ? e.message : e);
|
|
324
|
+
return { queued: 0, reasons: { thrown: 1 } };
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
_drainProxyTraceBackfill({
|
|
329
|
+
maxPasses = TRACE_BACKFILL_DRAIN_MAX_PASSES,
|
|
330
|
+
maxMs = TRACE_BACKFILL_RUNTIME_DRAIN_MAX_MS,
|
|
331
|
+
} = {}) {
|
|
332
|
+
if (this._traceBackfillDraining) return { queued: 0, passes: 0, deferred: true };
|
|
333
|
+
this._traceBackfillDraining = true;
|
|
334
|
+
const started = Date.now();
|
|
335
|
+
const total = {
|
|
336
|
+
queued: 0,
|
|
337
|
+
scanned: 0,
|
|
338
|
+
skipped: 0,
|
|
339
|
+
duplicates: 0,
|
|
340
|
+
passes: 0,
|
|
341
|
+
reasons: {},
|
|
342
|
+
};
|
|
343
|
+
try {
|
|
344
|
+
for (let i = 0; i < maxPasses; i++) {
|
|
345
|
+
const stats = this._runProxyTraceBackfillPass();
|
|
346
|
+
total.passes += 1;
|
|
347
|
+
total.queued += stats.queued || 0;
|
|
348
|
+
total.scanned += stats.scanned || 0;
|
|
349
|
+
total.skipped += stats.skipped || 0;
|
|
350
|
+
total.duplicates += stats.duplicates || 0;
|
|
351
|
+
for (const [reason, count] of Object.entries(stats.reasons || {})) {
|
|
352
|
+
total.reasons[reason] = (total.reasons[reason] || 0) + count;
|
|
353
|
+
}
|
|
354
|
+
const madeProgress = (stats.scanned || 0) > 0
|
|
355
|
+
|| (stats.queued || 0) > 0
|
|
356
|
+
|| (stats.skipped || 0) > 0
|
|
357
|
+
|| (stats.duplicates || 0) > 0;
|
|
358
|
+
if (!madeProgress) break;
|
|
359
|
+
if (stats.reasons?.max_pending_uploads || stats.reasons?.collection_disabled
|
|
360
|
+
|| stats.reasons?.missing_file || stats.reasons?.missing_store
|
|
361
|
+
|| stats.reasons?.read_failed || stats.reasons?.thrown) {
|
|
362
|
+
break;
|
|
363
|
+
}
|
|
364
|
+
if (Date.now() - started >= maxMs) break;
|
|
365
|
+
}
|
|
366
|
+
} finally {
|
|
367
|
+
this._traceBackfillDraining = false;
|
|
368
|
+
}
|
|
369
|
+
if (total.queued > 0) {
|
|
370
|
+
this.logger.log('[proxy] queued ' + total.queued + ' existing proxy trace upload(s)');
|
|
371
|
+
this.sync?.notifyNewOutbound();
|
|
372
|
+
}
|
|
373
|
+
return total;
|
|
374
|
+
}
|
|
375
|
+
|
|
249
376
|
async stop() {
|
|
250
377
|
if (!this._started) return;
|
|
251
378
|
// Tear down in deliberate reverse-of-start order, but don't let one
|
|
@@ -279,6 +406,13 @@ class EvoMapProxy {
|
|
|
279
406
|
return this.store;
|
|
280
407
|
}
|
|
281
408
|
|
|
409
|
+
// Wrap a bare body in a GEP-A2A envelope (pass-through if already one),
|
|
410
|
+
// signing it with this proxy's node_id as sender_id so callers cannot
|
|
411
|
+
// impersonate another node through the proxy.
|
|
412
|
+
_wrapA2a(messageType, body) {
|
|
413
|
+
return ensureEnvelope(messageType, body, this.store.getState('node_id'));
|
|
414
|
+
}
|
|
415
|
+
|
|
282
416
|
async _proxyHttp(path, body, opts = {}) {
|
|
283
417
|
if (!this.hubUrl) throw Object.assign(new Error('Hub not configured'), { statusCode: 503 });
|
|
284
418
|
|
|
@@ -406,6 +540,83 @@ class EvoMapProxy {
|
|
|
406
540
|
};
|
|
407
541
|
}
|
|
408
542
|
|
|
543
|
+
// OpenAI Responses-compatible passthrough for Codex custom providers. The
|
|
544
|
+
// proxy token is consumed by ProxyHttpServer and must never be forwarded as
|
|
545
|
+
// upstream auth; the daemon supplies the real upstream key from env.
|
|
546
|
+
async _proxyOpenAIResponses(reqPath, body, opts = {}) {
|
|
547
|
+
const baseUrl = resolveOpenAIBaseUrl(opts.baseUrl || this._openaiBaseUrl || DEFAULT_OPENAI_BASE_URL, {
|
|
548
|
+
trustedOverride: !!opts.baseUrl || this._openaiBaseUrlTrusted,
|
|
549
|
+
});
|
|
550
|
+
const inbound = opts.inboundHeaders || {};
|
|
551
|
+
const timeoutMs = opts.timeoutMs || 60_000;
|
|
552
|
+
|
|
553
|
+
const fwd = { 'content-type': 'application/json' };
|
|
554
|
+
for (const [k, v] of Object.entries(inbound)) {
|
|
555
|
+
if (v === undefined || v === null) continue;
|
|
556
|
+
const lk = k.toLowerCase();
|
|
557
|
+
if (
|
|
558
|
+
lk === 'openai-organization'
|
|
559
|
+
|| lk === 'openai-project'
|
|
560
|
+
|| lk === 'openai-beta'
|
|
561
|
+
|| lk.startsWith('x-stainless-')
|
|
562
|
+
) {
|
|
563
|
+
fwd[lk] = Array.isArray(v) ? v.join(', ') : String(v);
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
const upstreamKey = process.env.EVOMAP_OPENAI_API_KEY || process.env.OPENAI_API_KEY || '';
|
|
568
|
+
if (!upstreamKey) {
|
|
569
|
+
const err = new Error('openai api key required');
|
|
570
|
+
err.statusCode = 401;
|
|
571
|
+
throw err;
|
|
572
|
+
}
|
|
573
|
+
if (upstreamKey) {
|
|
574
|
+
fwd.authorization = `Bearer ${upstreamKey}`;
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
const endpoint = `${baseUrl}${reqPath}`;
|
|
578
|
+
const abortController = new AbortController();
|
|
579
|
+
const timeoutErr = new Error('openai upstream timed out');
|
|
580
|
+
timeoutErr.name = 'TimeoutError';
|
|
581
|
+
const abortTimer = setTimeout(() => abortController.abort(timeoutErr), timeoutMs);
|
|
582
|
+
abortTimer.unref?.();
|
|
583
|
+
let res;
|
|
584
|
+
try {
|
|
585
|
+
res = await fetch(endpoint, {
|
|
586
|
+
method: 'POST',
|
|
587
|
+
headers: fwd,
|
|
588
|
+
body: JSON.stringify(body || {}),
|
|
589
|
+
signal: abortController.signal,
|
|
590
|
+
});
|
|
591
|
+
} catch (err) {
|
|
592
|
+
clearTimeout(abortTimer);
|
|
593
|
+
throw makeOpenAIGatewayError(err);
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
const headers = Object.fromEntries(res.headers.entries());
|
|
597
|
+
const contentType = (headers['content-type'] || '').toLowerCase();
|
|
598
|
+
const isStream = contentType.includes('text/event-stream');
|
|
599
|
+
if (isStream) clearTimeout(abortTimer);
|
|
600
|
+
|
|
601
|
+
const readText = async () => {
|
|
602
|
+
try {
|
|
603
|
+
return await res.text();
|
|
604
|
+
} catch (err) {
|
|
605
|
+
throw makeOpenAIGatewayError(err);
|
|
606
|
+
} finally {
|
|
607
|
+
clearTimeout(abortTimer);
|
|
608
|
+
}
|
|
609
|
+
};
|
|
610
|
+
|
|
611
|
+
return {
|
|
612
|
+
status: res.status,
|
|
613
|
+
headers,
|
|
614
|
+
stream: isStream ? res.body : null,
|
|
615
|
+
json: isStream ? null : async () => JSON.parse(await readText()),
|
|
616
|
+
text: isStream ? null : readText,
|
|
617
|
+
};
|
|
618
|
+
}
|
|
619
|
+
|
|
409
620
|
// Bedrock upstream mode: same return contract as _proxyAnthropic so
|
|
410
621
|
// messages_route.js and ProxyHttpServer._streamResponse don't change.
|
|
411
622
|
// Body transformation: model -> URL path; inject anthropic_version;
|
|
@@ -667,4 +878,11 @@ async function startProxy(opts = {}) {
|
|
|
667
878
|
return { proxy, ...info };
|
|
668
879
|
}
|
|
669
880
|
|
|
670
|
-
module.exports = {
|
|
881
|
+
module.exports = {
|
|
882
|
+
EvoMapProxy,
|
|
883
|
+
startProxy,
|
|
884
|
+
buildAssetSearchQuery,
|
|
885
|
+
buildSemanticSearchQuery,
|
|
886
|
+
planAssetSearch,
|
|
887
|
+
resolveOpenAIBaseUrl,
|
|
888
|
+
};
|