@elizaos/core 1.5.7 → 1.6.0-alpha.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/browser/index.browser.js +66 -66
- package/dist/browser/index.browser.js.map +4 -4
- package/dist/browser/index.d.ts +1 -0
- package/dist/index.d.ts +3 -27
- package/dist/index.js +3 -1
- package/dist/node/index.d.ts +1 -0
- package/dist/node/index.node.js +183 -392
- package/dist/node/index.node.js.map +18 -18
- package/package.json +2 -2
package/dist/node/index.node.js
CHANGED
|
@@ -19208,7 +19208,7 @@ var init_worldwide = __esm(() => {
|
|
|
19208
19208
|
});
|
|
19209
19209
|
|
|
19210
19210
|
// ../../node_modules/@sentry/node/node_modules/@sentry/core/build/esm/utils/version.js
|
|
19211
|
-
var SDK_VERSION = "10.
|
|
19211
|
+
var SDK_VERSION = "10.8.0";
|
|
19212
19212
|
var init_version = () => {};
|
|
19213
19213
|
|
|
19214
19214
|
// ../../node_modules/@sentry/node/node_modules/@sentry/core/build/esm/carrier.js
|
|
@@ -22510,9 +22510,7 @@ function _INTERNAL_captureLog(beforeLog, client2 = getClient(), currentScope = g
|
|
|
22510
22510
|
const beforeLogMessage = beforeLog.message;
|
|
22511
22511
|
if (isParameterizedString(beforeLogMessage)) {
|
|
22512
22512
|
const { __sentry_template_string__, __sentry_template_values__ = [] } = beforeLogMessage;
|
|
22513
|
-
|
|
22514
|
-
processedLogAttributes["sentry.message.template"] = __sentry_template_string__;
|
|
22515
|
-
}
|
|
22513
|
+
processedLogAttributes["sentry.message.template"] = __sentry_template_string__;
|
|
22516
22514
|
__sentry_template_values__.forEach((param, index) => {
|
|
22517
22515
|
processedLogAttributes[`sentry.message.parameter.${index}`] = param;
|
|
22518
22516
|
});
|
|
@@ -22796,6 +22794,9 @@ function parseStringToURLObject(url, urlBase) {
|
|
|
22796
22794
|
} catch {}
|
|
22797
22795
|
return;
|
|
22798
22796
|
}
|
|
22797
|
+
function stripUrlQueryAndFragment(urlPath) {
|
|
22798
|
+
return urlPath.split(/[?#]/, 1)[0];
|
|
22799
|
+
}
|
|
22799
22800
|
var DEFAULT_BASE_URL = "thismessage:/";
|
|
22800
22801
|
var init_url = () => {};
|
|
22801
22802
|
|
|
@@ -26663,6 +26664,7 @@ var init_esm = __esm(() => {
|
|
|
26663
26664
|
init_debug_logger();
|
|
26664
26665
|
init_object();
|
|
26665
26666
|
init_string();
|
|
26667
|
+
init_url();
|
|
26666
26668
|
init_version();
|
|
26667
26669
|
});
|
|
26668
26670
|
|
|
@@ -26679,7 +26681,7 @@ var init_worldwide2 = __esm(() => {
|
|
|
26679
26681
|
});
|
|
26680
26682
|
|
|
26681
26683
|
// ../../node_modules/@sentry/node-core/node_modules/@sentry/core/build/esm/utils/version.js
|
|
26682
|
-
var SDK_VERSION2 = "10.
|
|
26684
|
+
var SDK_VERSION2 = "10.8.0";
|
|
26683
26685
|
var init_version2 = () => {};
|
|
26684
26686
|
|
|
26685
26687
|
// ../../node_modules/@sentry/node-core/node_modules/@sentry/core/build/esm/carrier.js
|
|
@@ -28052,44 +28054,6 @@ var SEMANTIC_ATTRIBUTE_SENTRY_SOURCE2 = "sentry.source", SEMANTIC_ATTRIBUTE_SENT
|
|
|
28052
28054
|
var init_semanticAttributes2 = () => {};
|
|
28053
28055
|
|
|
28054
28056
|
// ../../node_modules/@sentry/node-core/node_modules/@sentry/core/build/esm/tracing/spanstatus.js
|
|
28055
|
-
function getSpanStatusFromHttpCode2(httpStatus) {
|
|
28056
|
-
if (httpStatus < 400 && httpStatus >= 100) {
|
|
28057
|
-
return { code: SPAN_STATUS_OK2 };
|
|
28058
|
-
}
|
|
28059
|
-
if (httpStatus >= 400 && httpStatus < 500) {
|
|
28060
|
-
switch (httpStatus) {
|
|
28061
|
-
case 401:
|
|
28062
|
-
return { code: SPAN_STATUS_ERROR2, message: "unauthenticated" };
|
|
28063
|
-
case 403:
|
|
28064
|
-
return { code: SPAN_STATUS_ERROR2, message: "permission_denied" };
|
|
28065
|
-
case 404:
|
|
28066
|
-
return { code: SPAN_STATUS_ERROR2, message: "not_found" };
|
|
28067
|
-
case 409:
|
|
28068
|
-
return { code: SPAN_STATUS_ERROR2, message: "already_exists" };
|
|
28069
|
-
case 413:
|
|
28070
|
-
return { code: SPAN_STATUS_ERROR2, message: "failed_precondition" };
|
|
28071
|
-
case 429:
|
|
28072
|
-
return { code: SPAN_STATUS_ERROR2, message: "resource_exhausted" };
|
|
28073
|
-
case 499:
|
|
28074
|
-
return { code: SPAN_STATUS_ERROR2, message: "cancelled" };
|
|
28075
|
-
default:
|
|
28076
|
-
return { code: SPAN_STATUS_ERROR2, message: "invalid_argument" };
|
|
28077
|
-
}
|
|
28078
|
-
}
|
|
28079
|
-
if (httpStatus >= 500 && httpStatus < 600) {
|
|
28080
|
-
switch (httpStatus) {
|
|
28081
|
-
case 501:
|
|
28082
|
-
return { code: SPAN_STATUS_ERROR2, message: "unimplemented" };
|
|
28083
|
-
case 503:
|
|
28084
|
-
return { code: SPAN_STATUS_ERROR2, message: "unavailable" };
|
|
28085
|
-
case 504:
|
|
28086
|
-
return { code: SPAN_STATUS_ERROR2, message: "deadline_exceeded" };
|
|
28087
|
-
default:
|
|
28088
|
-
return { code: SPAN_STATUS_ERROR2, message: "internal_error" };
|
|
28089
|
-
}
|
|
28090
|
-
}
|
|
28091
|
-
return { code: SPAN_STATUS_ERROR2, message: "unknown_error" };
|
|
28092
|
-
}
|
|
28093
28057
|
var SPAN_STATUS_UNSET2 = 0, SPAN_STATUS_OK2 = 1, SPAN_STATUS_ERROR2 = 2;
|
|
28094
28058
|
var init_spanstatus2 = () => {};
|
|
28095
28059
|
|
|
@@ -30481,9 +30445,7 @@ function _INTERNAL_captureLog2(beforeLog, client2 = getClient2(), currentScope =
|
|
|
30481
30445
|
const beforeLogMessage = beforeLog.message;
|
|
30482
30446
|
if (isParameterizedString2(beforeLogMessage)) {
|
|
30483
30447
|
const { __sentry_template_string__, __sentry_template_values__ = [] } = beforeLogMessage;
|
|
30484
|
-
|
|
30485
|
-
processedLogAttributes["sentry.message.template"] = __sentry_template_string__;
|
|
30486
|
-
}
|
|
30448
|
+
processedLogAttributes["sentry.message.template"] = __sentry_template_string__;
|
|
30487
30449
|
__sentry_template_values__.forEach((param, index) => {
|
|
30488
30450
|
processedLogAttributes[`sentry.message.parameter.${index}`] = param;
|
|
30489
30451
|
});
|
|
@@ -31003,27 +30965,7 @@ var init_base2 = __esm(() => {
|
|
|
31003
30965
|
});
|
|
31004
30966
|
|
|
31005
30967
|
// ../../node_modules/@sentry/node-core/node_modules/@sentry/core/build/esm/utils/url.js
|
|
31006
|
-
function
|
|
31007
|
-
const isRelative = url.indexOf("://") <= 0 && url.indexOf("//") !== 0;
|
|
31008
|
-
const base = urlBase ?? (isRelative ? DEFAULT_BASE_URL2 : undefined);
|
|
31009
|
-
try {
|
|
31010
|
-
if ("canParse" in URL && !URL.canParse(url, base)) {
|
|
31011
|
-
return;
|
|
31012
|
-
}
|
|
31013
|
-
const fullUrlObject = new URL(url, base);
|
|
31014
|
-
if (isRelative) {
|
|
31015
|
-
return {
|
|
31016
|
-
isRelative,
|
|
31017
|
-
pathname: fullUrlObject.pathname,
|
|
31018
|
-
search: fullUrlObject.search,
|
|
31019
|
-
hash: fullUrlObject.hash
|
|
31020
|
-
};
|
|
31021
|
-
}
|
|
31022
|
-
return fullUrlObject;
|
|
31023
|
-
} catch {}
|
|
31024
|
-
return;
|
|
31025
|
-
}
|
|
31026
|
-
function parseUrl(url) {
|
|
30968
|
+
function parseUrl2(url) {
|
|
31027
30969
|
if (!url) {
|
|
31028
30970
|
return {};
|
|
31029
30971
|
}
|
|
@@ -31042,15 +30984,14 @@ function parseUrl(url) {
|
|
|
31042
30984
|
relative: match[5] + query + fragment
|
|
31043
30985
|
};
|
|
31044
30986
|
}
|
|
31045
|
-
function
|
|
30987
|
+
function stripUrlQueryAndFragment2(urlPath) {
|
|
31046
30988
|
return urlPath.split(/[?#]/, 1)[0];
|
|
31047
30989
|
}
|
|
31048
|
-
function
|
|
30990
|
+
function getSanitizedUrlString2(url) {
|
|
31049
30991
|
const { protocol, host, path } = url;
|
|
31050
30992
|
const filteredHost = host?.replace(/^.*@/, "[filtered]:[filtered]@").replace(/(:80)$/, "").replace(/(:443)$/, "") || "";
|
|
31051
30993
|
return `${protocol ? `${protocol}://` : ""}${filteredHost}${path}`;
|
|
31052
30994
|
}
|
|
31053
|
-
var DEFAULT_BASE_URL2 = "thismessage:/";
|
|
31054
30995
|
var init_url2 = () => {};
|
|
31055
30996
|
|
|
31056
30997
|
// ../../node_modules/@sentry/node-core/node_modules/@sentry/core/build/esm/utils/parameterize.js
|
|
@@ -31891,7 +31832,6 @@ var init_lru = () => {};
|
|
|
31891
31832
|
|
|
31892
31833
|
// ../../node_modules/@sentry/node-core/node_modules/@sentry/core/build/esm/index.js
|
|
31893
31834
|
var init_esm2 = __esm(() => {
|
|
31894
|
-
init_spanstatus2();
|
|
31895
31835
|
init_trace2();
|
|
31896
31836
|
init_semanticAttributes2();
|
|
31897
31837
|
init_exports3();
|
|
@@ -31917,6 +31857,7 @@ var init_esm2 = __esm(() => {
|
|
|
31917
31857
|
init_is2();
|
|
31918
31858
|
init_debug_logger2();
|
|
31919
31859
|
init_misc2();
|
|
31860
|
+
init_object2();
|
|
31920
31861
|
init_path2();
|
|
31921
31862
|
init_stacktrace2();
|
|
31922
31863
|
init_node_stack_trace();
|
|
@@ -32080,47 +32021,35 @@ var init_constants8 = __esm(() => {
|
|
|
32080
32021
|
});
|
|
32081
32022
|
|
|
32082
32023
|
// ../../node_modules/@sentry/node-core/build/esm/integrations/http/incoming-requests.js
|
|
32083
|
-
import { errorMonitor } from "events";
|
|
32084
32024
|
function instrumentServer(server, {
|
|
32085
32025
|
ignoreIncomingRequestBody,
|
|
32086
|
-
ignoreSpansForIncomingRequests,
|
|
32087
32026
|
maxIncomingRequestBodySize = "medium",
|
|
32088
32027
|
trackIncomingRequestsAsSessions = true,
|
|
32089
|
-
|
|
32090
|
-
ignoreStaticAssets = true,
|
|
32091
|
-
sessionFlushingDelayMS,
|
|
32092
|
-
instrumentation,
|
|
32093
|
-
incomingRequestSpanHook
|
|
32028
|
+
sessionFlushingDelayMS
|
|
32094
32029
|
}) {
|
|
32095
32030
|
const originalEmit = server.emit;
|
|
32096
|
-
if (
|
|
32097
|
-
DEBUG_BUILD3 && debug2.log(INSTRUMENTATION_NAME, "Incoming requests already instrumented, not instrumenting again...");
|
|
32031
|
+
if (originalEmit.__sentry_patched__) {
|
|
32098
32032
|
return;
|
|
32099
32033
|
}
|
|
32100
|
-
const { requestHook, responseHook, applyCustomAttributesOnSpan } = instrumentation ?? {};
|
|
32101
32034
|
const newEmit = new Proxy(originalEmit, {
|
|
32102
32035
|
apply(target, thisArg, args) {
|
|
32103
32036
|
if (args[0] !== "request") {
|
|
32104
32037
|
return target.apply(thisArg, args);
|
|
32105
32038
|
}
|
|
32106
|
-
if (import_api2.context.active().getValue(HTTP_SERVER_INSTRUMENTED_KEY)) {
|
|
32107
|
-
return target.apply(thisArg, args);
|
|
32108
|
-
}
|
|
32109
32039
|
DEBUG_BUILD3 && debug2.log(INSTRUMENTATION_NAME, "Handling incoming request");
|
|
32110
|
-
const client2 = getClient2();
|
|
32111
32040
|
const isolationScope = getIsolationScope2().clone();
|
|
32112
32041
|
const request = args[1];
|
|
32113
32042
|
const response = args[2];
|
|
32114
32043
|
const normalizedRequest = httpRequestToRequestData2(request);
|
|
32115
32044
|
const ipAddress = request.ip || request.socket?.remoteAddress;
|
|
32116
32045
|
const url = request.url || "/";
|
|
32117
|
-
if (
|
|
32046
|
+
if (!ignoreIncomingRequestBody?.(url, request) && maxIncomingRequestBodySize !== "none") {
|
|
32118
32047
|
patchRequestToCaptureBody(request, isolationScope, maxIncomingRequestBodySize);
|
|
32119
32048
|
}
|
|
32120
32049
|
isolationScope.setSDKProcessingMetadata({ normalizedRequest, ipAddress });
|
|
32121
32050
|
const httpMethod = (request.method || "GET").toUpperCase();
|
|
32122
|
-
const
|
|
32123
|
-
const bestEffortTransactionName = `${httpMethod} ${
|
|
32051
|
+
const httpTarget = stripUrlQueryAndFragment2(url);
|
|
32052
|
+
const bestEffortTransactionName = `${httpMethod} ${httpTarget}`;
|
|
32124
32053
|
isolationScope.setTransactionName(bestEffortTransactionName);
|
|
32125
32054
|
if (trackIncomingRequestsAsSessions !== false) {
|
|
32126
32055
|
recordRequestSession({
|
|
@@ -32131,84 +32060,14 @@ function instrumentServer(server, {
|
|
|
32131
32060
|
}
|
|
32132
32061
|
return withIsolationScope4(isolationScope, () => {
|
|
32133
32062
|
getCurrentScope2().getPropagationContext().propagationSpanId = generateSpanId2();
|
|
32134
|
-
const ctx = import_api2.propagation.extract(import_api2.context.active(), normalizedRequest.headers)
|
|
32063
|
+
const ctx = import_api2.propagation.extract(import_api2.context.active(), normalizedRequest.headers);
|
|
32135
32064
|
return import_api2.context.with(ctx, () => {
|
|
32136
|
-
|
|
32137
|
-
ignoreStaticAssets,
|
|
32138
|
-
ignoreSpansForIncomingRequests
|
|
32139
|
-
})) {
|
|
32140
|
-
DEBUG_BUILD3 && debug2.log(INSTRUMENTATION_NAME, "Skipping span creation for incoming request");
|
|
32141
|
-
return target.apply(thisArg, args);
|
|
32142
|
-
}
|
|
32143
|
-
const fullUrl = normalizedRequest.url || url;
|
|
32144
|
-
const urlObj = parseStringToURLObject2(fullUrl);
|
|
32145
|
-
const headers = request.headers;
|
|
32146
|
-
const userAgent = headers["user-agent"];
|
|
32147
|
-
const ips = headers["x-forwarded-for"];
|
|
32148
|
-
const httpVersion = request.httpVersion;
|
|
32149
|
-
const host = headers.host;
|
|
32150
|
-
const hostname = host?.replace(/^(.*)(:[0-9]{1,5})/, "$1") || "localhost";
|
|
32151
|
-
const tracer = client2.tracer;
|
|
32152
|
-
const scheme = fullUrl.startsWith("https") ? "https" : "http";
|
|
32153
|
-
const span = tracer.startSpan(bestEffortTransactionName, {
|
|
32154
|
-
kind: import_api2.SpanKind.SERVER,
|
|
32155
|
-
attributes: {
|
|
32156
|
-
[SEMANTIC_ATTRIBUTE_SENTRY_OP2]: "http.server",
|
|
32157
|
-
[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN2]: "auto.http.otel.http",
|
|
32158
|
-
"sentry.http.prefetch": isKnownPrefetchRequest(request) || undefined,
|
|
32159
|
-
"http.url": fullUrl,
|
|
32160
|
-
"http.method": httpMethod,
|
|
32161
|
-
"http.target": urlObj ? `${urlObj.pathname}${urlObj.search}` : httpTargetWithoutQueryFragment,
|
|
32162
|
-
"http.host": host,
|
|
32163
|
-
"net.host.name": hostname,
|
|
32164
|
-
"http.client_ip": typeof ips === "string" ? ips.split(",")[0] : undefined,
|
|
32165
|
-
"http.user_agent": userAgent,
|
|
32166
|
-
"http.scheme": scheme,
|
|
32167
|
-
"http.flavor": httpVersion,
|
|
32168
|
-
"net.transport": httpVersion?.toUpperCase() === "QUIC" ? "ip_udp" : "ip_tcp",
|
|
32169
|
-
...getRequestContentLengthAttribute(request)
|
|
32170
|
-
}
|
|
32171
|
-
});
|
|
32172
|
-
requestHook?.(span, request);
|
|
32173
|
-
responseHook?.(span, response);
|
|
32174
|
-
applyCustomAttributesOnSpan?.(span, request, response);
|
|
32175
|
-
incomingRequestSpanHook?.(span, request, response);
|
|
32176
|
-
const rpcMetadata = {
|
|
32177
|
-
type: import_core6.RPCType.HTTP,
|
|
32178
|
-
span
|
|
32179
|
-
};
|
|
32180
|
-
import_api2.context.with(import_core6.setRPCMetadata(import_api2.trace.setSpan(import_api2.context.active(), span), rpcMetadata), () => {
|
|
32181
|
-
import_api2.context.bind(import_api2.context.active(), request);
|
|
32182
|
-
import_api2.context.bind(import_api2.context.active(), response);
|
|
32183
|
-
let isEnded = false;
|
|
32184
|
-
function endSpan(status) {
|
|
32185
|
-
if (isEnded) {
|
|
32186
|
-
return;
|
|
32187
|
-
}
|
|
32188
|
-
isEnded = true;
|
|
32189
|
-
const newAttributes = getIncomingRequestAttributesOnResponse(request, response);
|
|
32190
|
-
span.setAttributes(newAttributes);
|
|
32191
|
-
span.setStatus(status);
|
|
32192
|
-
span.end();
|
|
32193
|
-
const route = newAttributes["http.route"];
|
|
32194
|
-
if (route) {
|
|
32195
|
-
getIsolationScope2().setTransactionName(`${request.method?.toUpperCase() || "GET"} ${route}`);
|
|
32196
|
-
}
|
|
32197
|
-
}
|
|
32198
|
-
response.on("close", () => {
|
|
32199
|
-
endSpan(getSpanStatusFromHttpCode2(response.statusCode));
|
|
32200
|
-
});
|
|
32201
|
-
response.on(errorMonitor, () => {
|
|
32202
|
-
const httpStatus = getSpanStatusFromHttpCode2(response.statusCode);
|
|
32203
|
-
endSpan(httpStatus.code === SPAN_STATUS_ERROR2 ? httpStatus : { code: SPAN_STATUS_ERROR2 });
|
|
32204
|
-
});
|
|
32205
|
-
return target.apply(thisArg, args);
|
|
32206
|
-
});
|
|
32065
|
+
return target.apply(thisArg, args);
|
|
32207
32066
|
});
|
|
32208
32067
|
});
|
|
32209
32068
|
}
|
|
32210
32069
|
});
|
|
32211
|
-
|
|
32070
|
+
addNonEnumerableProperty2(newEmit, "__sentry_patched__", true);
|
|
32212
32071
|
server.emit = newEmit;
|
|
32213
32072
|
}
|
|
32214
32073
|
function recordRequestSession({
|
|
@@ -32328,102 +32187,13 @@ function patchRequestToCaptureBody(req, isolationScope, maxIncomingRequestBodySi
|
|
|
32328
32187
|
}
|
|
32329
32188
|
}
|
|
32330
32189
|
}
|
|
32331
|
-
|
|
32332
|
-
const length = getContentLength(request.headers);
|
|
32333
|
-
if (length == null) {
|
|
32334
|
-
return {};
|
|
32335
|
-
}
|
|
32336
|
-
if (isCompressed(request.headers)) {
|
|
32337
|
-
return {
|
|
32338
|
-
["http.request_content_length"]: length
|
|
32339
|
-
};
|
|
32340
|
-
} else {
|
|
32341
|
-
return {
|
|
32342
|
-
["http.request_content_length_uncompressed"]: length
|
|
32343
|
-
};
|
|
32344
|
-
}
|
|
32345
|
-
}
|
|
32346
|
-
function getContentLength(headers) {
|
|
32347
|
-
const contentLengthHeader = headers["content-length"];
|
|
32348
|
-
if (contentLengthHeader === undefined)
|
|
32349
|
-
return null;
|
|
32350
|
-
const contentLength = parseInt(contentLengthHeader, 10);
|
|
32351
|
-
if (isNaN(contentLength))
|
|
32352
|
-
return null;
|
|
32353
|
-
return contentLength;
|
|
32354
|
-
}
|
|
32355
|
-
function isCompressed(headers) {
|
|
32356
|
-
const encoding = headers["content-encoding"];
|
|
32357
|
-
return !!encoding && encoding !== "identity";
|
|
32358
|
-
}
|
|
32359
|
-
function getIncomingRequestAttributesOnResponse(request, response) {
|
|
32360
|
-
const { socket } = request;
|
|
32361
|
-
const { statusCode, statusMessage } = response;
|
|
32362
|
-
const newAttributes = {
|
|
32363
|
-
[import_semantic_conventions.ATTR_HTTP_RESPONSE_STATUS_CODE]: statusCode,
|
|
32364
|
-
[import_semantic_conventions.SEMATTRS_HTTP_STATUS_CODE]: statusCode,
|
|
32365
|
-
"http.status_text": statusMessage?.toUpperCase()
|
|
32366
|
-
};
|
|
32367
|
-
const rpcMetadata = import_core6.getRPCMetadata(import_api2.context.active());
|
|
32368
|
-
if (socket) {
|
|
32369
|
-
const { localAddress, localPort, remoteAddress, remotePort } = socket;
|
|
32370
|
-
newAttributes[import_semantic_conventions.SEMATTRS_NET_HOST_IP] = localAddress;
|
|
32371
|
-
newAttributes[import_semantic_conventions.SEMATTRS_NET_HOST_PORT] = localPort;
|
|
32372
|
-
newAttributes[import_semantic_conventions.SEMATTRS_NET_PEER_IP] = remoteAddress;
|
|
32373
|
-
newAttributes["net.peer.port"] = remotePort;
|
|
32374
|
-
}
|
|
32375
|
-
newAttributes[import_semantic_conventions.SEMATTRS_HTTP_STATUS_CODE] = statusCode;
|
|
32376
|
-
newAttributes["http.status_text"] = (statusMessage || "").toUpperCase();
|
|
32377
|
-
if (rpcMetadata?.type === import_core6.RPCType.HTTP && rpcMetadata.route !== undefined) {
|
|
32378
|
-
const routeName = rpcMetadata.route;
|
|
32379
|
-
newAttributes[import_semantic_conventions.ATTR_HTTP_ROUTE] = routeName;
|
|
32380
|
-
}
|
|
32381
|
-
return newAttributes;
|
|
32382
|
-
}
|
|
32383
|
-
function isKnownPrefetchRequest(req) {
|
|
32384
|
-
return req.headers["next-router-prefetch"] === "1";
|
|
32385
|
-
}
|
|
32386
|
-
function isStaticAssetRequest(urlPath) {
|
|
32387
|
-
const path = stripUrlQueryAndFragment(urlPath);
|
|
32388
|
-
if (path.match(/\.(ico|png|jpg|jpeg|gif|svg|css|js|woff|woff2|ttf|eot|webp|avif)$/)) {
|
|
32389
|
-
return true;
|
|
32390
|
-
}
|
|
32391
|
-
if (path.match(/^\/(robots\.txt|sitemap\.xml|manifest\.json|browserconfig\.xml)$/)) {
|
|
32392
|
-
return true;
|
|
32393
|
-
}
|
|
32394
|
-
return false;
|
|
32395
|
-
}
|
|
32396
|
-
function shouldIgnoreSpansForIncomingRequest(request, {
|
|
32397
|
-
ignoreStaticAssets,
|
|
32398
|
-
ignoreSpansForIncomingRequests
|
|
32399
|
-
}) {
|
|
32400
|
-
if (import_core6.isTracingSuppressed(import_api2.context.active())) {
|
|
32401
|
-
return true;
|
|
32402
|
-
}
|
|
32403
|
-
const urlPath = request.url;
|
|
32404
|
-
const method = request.method?.toUpperCase();
|
|
32405
|
-
if (method === "OPTIONS" || method === "HEAD" || !urlPath) {
|
|
32406
|
-
return true;
|
|
32407
|
-
}
|
|
32408
|
-
if (ignoreStaticAssets && method === "GET" && isStaticAssetRequest(urlPath)) {
|
|
32409
|
-
return true;
|
|
32410
|
-
}
|
|
32411
|
-
if (ignoreSpansForIncomingRequests?.(urlPath, request)) {
|
|
32412
|
-
return true;
|
|
32413
|
-
}
|
|
32414
|
-
return false;
|
|
32415
|
-
}
|
|
32416
|
-
var import_api2, import_core6, import_semantic_conventions, HTTP_SERVER_INSTRUMENTED_KEY, clientToRequestSessionAggregatesMap, wrappedEmitFns;
|
|
32190
|
+
var import_api2, clientToRequestSessionAggregatesMap;
|
|
32417
32191
|
var init_incoming_requests = __esm(() => {
|
|
32418
32192
|
import_api2 = __toESM(require_src(), 1);
|
|
32419
|
-
import_core6 = __toESM(require_src3(), 1);
|
|
32420
|
-
import_semantic_conventions = __toESM(require_src2(), 1);
|
|
32421
32193
|
init_esm2();
|
|
32422
32194
|
init_debug_build3();
|
|
32423
32195
|
init_constants8();
|
|
32424
|
-
HTTP_SERVER_INSTRUMENTED_KEY = import_api2.createContextKey("sentry_http_server_instrumented");
|
|
32425
32196
|
clientToRequestSessionAggregatesMap = new Map;
|
|
32426
|
-
wrappedEmitFns = new WeakSet;
|
|
32427
32197
|
});
|
|
32428
32198
|
|
|
32429
32199
|
// ../../node_modules/@sentry/opentelemetry/node_modules/@sentry/core/build/esm/debug-build.js
|
|
@@ -32439,7 +32209,7 @@ var init_worldwide3 = __esm(() => {
|
|
|
32439
32209
|
});
|
|
32440
32210
|
|
|
32441
32211
|
// ../../node_modules/@sentry/opentelemetry/node_modules/@sentry/core/build/esm/utils/version.js
|
|
32442
|
-
var SDK_VERSION3 = "10.
|
|
32212
|
+
var SDK_VERSION3 = "10.8.0";
|
|
32443
32213
|
var init_version3 = () => {};
|
|
32444
32214
|
|
|
32445
32215
|
// ../../node_modules/@sentry/opentelemetry/node_modules/@sentry/core/build/esm/carrier.js
|
|
@@ -33227,7 +32997,7 @@ var SEMANTIC_ATTRIBUTE_SENTRY_SOURCE3 = "sentry.source", SEMANTIC_ATTRIBUTE_SENT
|
|
|
33227
32997
|
var init_semanticAttributes3 = () => {};
|
|
33228
32998
|
|
|
33229
32999
|
// ../../node_modules/@sentry/opentelemetry/node_modules/@sentry/core/build/esm/tracing/spanstatus.js
|
|
33230
|
-
function
|
|
33000
|
+
function getSpanStatusFromHttpCode2(httpStatus) {
|
|
33231
33001
|
if (httpStatus < 400 && httpStatus >= 100) {
|
|
33232
33002
|
return { code: SPAN_STATUS_OK3 };
|
|
33233
33003
|
}
|
|
@@ -33839,7 +33609,7 @@ var init_exports6 = __esm(() => {
|
|
|
33839
33609
|
});
|
|
33840
33610
|
|
|
33841
33611
|
// ../../node_modules/@sentry/opentelemetry/node_modules/@sentry/core/build/esm/utils/url.js
|
|
33842
|
-
function
|
|
33612
|
+
function parseUrl3(url) {
|
|
33843
33613
|
if (!url) {
|
|
33844
33614
|
return {};
|
|
33845
33615
|
}
|
|
@@ -33858,10 +33628,10 @@ function parseUrl2(url) {
|
|
|
33858
33628
|
relative: match[5] + query + fragment
|
|
33859
33629
|
};
|
|
33860
33630
|
}
|
|
33861
|
-
function
|
|
33631
|
+
function stripUrlQueryAndFragment3(urlPath) {
|
|
33862
33632
|
return urlPath.split(/[?#]/, 1)[0];
|
|
33863
33633
|
}
|
|
33864
|
-
function
|
|
33634
|
+
function getSanitizedUrlString3(url) {
|
|
33865
33635
|
const { protocol, host, path } = url;
|
|
33866
33636
|
const filteredHost = host?.replace(/^.*@/, "[filtered]:[filtered]@").replace(/(:80)$/, "").replace(/(:443)$/, "") || "";
|
|
33867
33637
|
return `${protocol ? `${protocol}://` : ""}${filteredHost}${path}`;
|
|
@@ -35891,18 +35661,18 @@ function getRequestSpanData(span) {
|
|
|
35891
35661
|
if (!spanHasAttributes(span)) {
|
|
35892
35662
|
return {};
|
|
35893
35663
|
}
|
|
35894
|
-
const maybeUrlAttribute = span.attributes[
|
|
35664
|
+
const maybeUrlAttribute = span.attributes[import_semantic_conventions.ATTR_URL_FULL] || span.attributes[import_semantic_conventions.SEMATTRS_HTTP_URL];
|
|
35895
35665
|
const data = {
|
|
35896
35666
|
url: maybeUrlAttribute,
|
|
35897
|
-
"http.method": span.attributes[
|
|
35667
|
+
"http.method": span.attributes[import_semantic_conventions.ATTR_HTTP_REQUEST_METHOD] || span.attributes[import_semantic_conventions.SEMATTRS_HTTP_METHOD]
|
|
35898
35668
|
};
|
|
35899
35669
|
if (!data["http.method"] && data.url) {
|
|
35900
35670
|
data["http.method"] = "GET";
|
|
35901
35671
|
}
|
|
35902
35672
|
try {
|
|
35903
35673
|
if (typeof maybeUrlAttribute === "string") {
|
|
35904
|
-
const url =
|
|
35905
|
-
data.url =
|
|
35674
|
+
const url = parseUrl3(maybeUrlAttribute);
|
|
35675
|
+
data.url = getSanitizedUrlString3(url);
|
|
35906
35676
|
if (url.search) {
|
|
35907
35677
|
data["http.query"] = url.search;
|
|
35908
35678
|
}
|
|
@@ -35951,31 +35721,31 @@ function getSamplingDecision(spanContext) {
|
|
|
35951
35721
|
return;
|
|
35952
35722
|
}
|
|
35953
35723
|
function inferSpanData(spanName, attributes, kind) {
|
|
35954
|
-
const httpMethod = attributes[
|
|
35724
|
+
const httpMethod = attributes[import_semantic_conventions.ATTR_HTTP_REQUEST_METHOD] || attributes[import_semantic_conventions.SEMATTRS_HTTP_METHOD];
|
|
35955
35725
|
if (httpMethod) {
|
|
35956
35726
|
return descriptionForHttpMethod({ attributes, name: spanName, kind }, httpMethod);
|
|
35957
35727
|
}
|
|
35958
|
-
const dbSystem = attributes[
|
|
35728
|
+
const dbSystem = attributes[import_semantic_conventions.SEMATTRS_DB_SYSTEM];
|
|
35959
35729
|
const opIsCache = typeof attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP3] === "string" && attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP3].startsWith("cache.");
|
|
35960
35730
|
if (dbSystem && !opIsCache) {
|
|
35961
35731
|
return descriptionForDbSystem({ attributes, name: spanName });
|
|
35962
35732
|
}
|
|
35963
35733
|
const customSourceOrRoute = attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE3] === "custom" ? "custom" : "route";
|
|
35964
|
-
const rpcService = attributes[
|
|
35734
|
+
const rpcService = attributes[import_semantic_conventions.SEMATTRS_RPC_SERVICE];
|
|
35965
35735
|
if (rpcService) {
|
|
35966
35736
|
return {
|
|
35967
35737
|
...getUserUpdatedNameAndSource(spanName, attributes, "route"),
|
|
35968
35738
|
op: "rpc"
|
|
35969
35739
|
};
|
|
35970
35740
|
}
|
|
35971
|
-
const messagingSystem = attributes[
|
|
35741
|
+
const messagingSystem = attributes[import_semantic_conventions.SEMATTRS_MESSAGING_SYSTEM];
|
|
35972
35742
|
if (messagingSystem) {
|
|
35973
35743
|
return {
|
|
35974
35744
|
...getUserUpdatedNameAndSource(spanName, attributes, customSourceOrRoute),
|
|
35975
35745
|
op: "message"
|
|
35976
35746
|
};
|
|
35977
35747
|
}
|
|
35978
|
-
const faasTrigger = attributes[
|
|
35748
|
+
const faasTrigger = attributes[import_semantic_conventions.SEMATTRS_FAAS_TRIGGER];
|
|
35979
35749
|
if (faasTrigger) {
|
|
35980
35750
|
return {
|
|
35981
35751
|
...getUserUpdatedNameAndSource(spanName, attributes, customSourceOrRoute),
|
|
@@ -36002,7 +35772,7 @@ function descriptionForDbSystem({ attributes, name }) {
|
|
|
36002
35772
|
if (attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE3] === "custom") {
|
|
36003
35773
|
return { op: "db", description: name, source: "custom" };
|
|
36004
35774
|
}
|
|
36005
|
-
const statement = attributes[
|
|
35775
|
+
const statement = attributes[import_semantic_conventions.SEMATTRS_DB_STATEMENT];
|
|
36006
35776
|
const description = statement ? statement.toString() : name;
|
|
36007
35777
|
return { op: "db", description, source: "task" };
|
|
36008
35778
|
}
|
|
@@ -36063,24 +35833,24 @@ function getGraphqlOperationNamesFromAttribute(attr) {
|
|
|
36063
35833
|
return `${attr}`;
|
|
36064
35834
|
}
|
|
36065
35835
|
function getSanitizedUrl(attributes, kind) {
|
|
36066
|
-
const httpTarget = attributes[
|
|
36067
|
-
const httpUrl = attributes[
|
|
36068
|
-
const httpRoute = attributes[
|
|
36069
|
-
const parsedUrl = typeof httpUrl === "string" ?
|
|
36070
|
-
const url = parsedUrl ?
|
|
35836
|
+
const httpTarget = attributes[import_semantic_conventions.SEMATTRS_HTTP_TARGET];
|
|
35837
|
+
const httpUrl = attributes[import_semantic_conventions.SEMATTRS_HTTP_URL] || attributes[import_semantic_conventions.ATTR_URL_FULL];
|
|
35838
|
+
const httpRoute = attributes[import_semantic_conventions.ATTR_HTTP_ROUTE];
|
|
35839
|
+
const parsedUrl = typeof httpUrl === "string" ? parseUrl3(httpUrl) : undefined;
|
|
35840
|
+
const url = parsedUrl ? getSanitizedUrlString3(parsedUrl) : undefined;
|
|
36071
35841
|
const query = parsedUrl?.search || undefined;
|
|
36072
35842
|
const fragment = parsedUrl?.hash || undefined;
|
|
36073
35843
|
if (typeof httpRoute === "string") {
|
|
36074
35844
|
return { urlPath: httpRoute, url, query, fragment, hasRoute: true };
|
|
36075
35845
|
}
|
|
36076
35846
|
if (kind === import_api3.SpanKind.SERVER && typeof httpTarget === "string") {
|
|
36077
|
-
return { urlPath:
|
|
35847
|
+
return { urlPath: stripUrlQueryAndFragment3(httpTarget), url, query, fragment, hasRoute: false };
|
|
36078
35848
|
}
|
|
36079
35849
|
if (parsedUrl) {
|
|
36080
35850
|
return { urlPath: url, url, query, fragment, hasRoute: false };
|
|
36081
35851
|
}
|
|
36082
35852
|
if (typeof httpTarget === "string") {
|
|
36083
|
-
return { urlPath:
|
|
35853
|
+
return { urlPath: stripUrlQueryAndFragment3(httpTarget), url, query, fragment, hasRoute: false };
|
|
36084
35854
|
}
|
|
36085
35855
|
return { urlPath: undefined, url, query, fragment, hasRoute: false };
|
|
36086
35856
|
}
|
|
@@ -36121,7 +35891,7 @@ function makeTraceState({
|
|
|
36121
35891
|
sampled
|
|
36122
35892
|
}) {
|
|
36123
35893
|
const dscString = dsc ? dynamicSamplingContextToSentryBaggageHeader3(dsc) : undefined;
|
|
36124
|
-
const traceStateBase = new
|
|
35894
|
+
const traceStateBase = new import_core8.TraceState;
|
|
36125
35895
|
const traceStateWithDsc = dscString ? traceStateBase.set(SENTRY_TRACE_STATE_DSC, dscString) : traceStateBase;
|
|
36126
35896
|
return sampled === false ? traceStateWithDsc.set(SENTRY_TRACE_STATE_SAMPLED_NOT_RECORDING, "1") : traceStateWithDsc;
|
|
36127
35897
|
}
|
|
@@ -36216,7 +35986,7 @@ function getExistingBaggage(carrier) {
|
|
|
36216
35986
|
}
|
|
36217
35987
|
function getCurrentURL(span) {
|
|
36218
35988
|
const spanData = spanToJSON3(span).data;
|
|
36219
|
-
const urlAttribute = spanData[
|
|
35989
|
+
const urlAttribute = spanData[import_semantic_conventions.SEMATTRS_HTTP_URL] || spanData[import_semantic_conventions.ATTR_URL_FULL];
|
|
36220
35990
|
if (typeof urlAttribute === "string") {
|
|
36221
35991
|
return urlAttribute;
|
|
36222
35992
|
}
|
|
@@ -36252,7 +36022,7 @@ function startSpan3(options, callback) {
|
|
|
36252
36022
|
return wrapper(() => {
|
|
36253
36023
|
const activeCtx = getContext(options.scope, options.forceTransaction);
|
|
36254
36024
|
const shouldSkipSpan = options.onlyIfParent && !import_api3.trace.getSpan(activeCtx);
|
|
36255
|
-
const ctx = shouldSkipSpan ?
|
|
36025
|
+
const ctx = shouldSkipSpan ? import_core8.suppressTracing(activeCtx) : activeCtx;
|
|
36256
36026
|
const spanOptions = getSpanOptions(options);
|
|
36257
36027
|
return tracer.startActiveSpan(name, spanOptions, ctx, (span) => {
|
|
36258
36028
|
return handleCallbackErrors2(() => callback(span), () => {
|
|
@@ -36270,7 +36040,7 @@ function startSpanManual3(options, callback) {
|
|
|
36270
36040
|
return wrapper(() => {
|
|
36271
36041
|
const activeCtx = getContext(options.scope, options.forceTransaction);
|
|
36272
36042
|
const shouldSkipSpan = options.onlyIfParent && !import_api3.trace.getSpan(activeCtx);
|
|
36273
|
-
const ctx = shouldSkipSpan ?
|
|
36043
|
+
const ctx = shouldSkipSpan ? import_core8.suppressTracing(activeCtx) : activeCtx;
|
|
36274
36044
|
const spanOptions = getSpanOptions(options);
|
|
36275
36045
|
return tracer.startActiveSpan(name, spanOptions, ctx, (span) => {
|
|
36276
36046
|
return handleCallbackErrors2(() => callback(span, () => span.end()), () => {
|
|
@@ -36288,7 +36058,7 @@ function startInactiveSpan3(options) {
|
|
|
36288
36058
|
return wrapper(() => {
|
|
36289
36059
|
const activeCtx = getContext(options.scope, options.forceTransaction);
|
|
36290
36060
|
const shouldSkipSpan = options.onlyIfParent && !import_api3.trace.getSpan(activeCtx);
|
|
36291
|
-
const ctx = shouldSkipSpan ?
|
|
36061
|
+
const ctx = shouldSkipSpan ? import_core8.suppressTracing(activeCtx) : activeCtx;
|
|
36292
36062
|
const spanOptions = getSpanOptions(options);
|
|
36293
36063
|
const span = tracer.startSpan(name, spanOptions, ctx);
|
|
36294
36064
|
return span;
|
|
@@ -36372,7 +36142,7 @@ function getActiveSpanWrapper2(parentSpan) {
|
|
|
36372
36142
|
} : (callback) => callback();
|
|
36373
36143
|
}
|
|
36374
36144
|
function suppressTracing3(callback) {
|
|
36375
|
-
const ctx =
|
|
36145
|
+
const ctx = import_core8.suppressTracing(import_api3.context.active());
|
|
36376
36146
|
return import_api3.context.with(ctx, callback);
|
|
36377
36147
|
}
|
|
36378
36148
|
function setupEventContextTrace(client2) {
|
|
@@ -36568,11 +36338,11 @@ function mapStatus(span) {
|
|
|
36568
36338
|
}
|
|
36569
36339
|
}
|
|
36570
36340
|
function inferStatusFromAttributes(attributes) {
|
|
36571
|
-
const httpCodeAttribute = attributes[
|
|
36572
|
-
const grpcCodeAttribute = attributes[
|
|
36341
|
+
const httpCodeAttribute = attributes[import_semantic_conventions.ATTR_HTTP_RESPONSE_STATUS_CODE] || attributes[import_semantic_conventions.SEMATTRS_HTTP_STATUS_CODE];
|
|
36342
|
+
const grpcCodeAttribute = attributes[import_semantic_conventions.SEMATTRS_RPC_GRPC_STATUS_CODE];
|
|
36573
36343
|
const numberHttpCode = typeof httpCodeAttribute === "number" ? httpCodeAttribute : typeof httpCodeAttribute === "string" ? parseInt(httpCodeAttribute) : undefined;
|
|
36574
36344
|
if (typeof numberHttpCode === "number") {
|
|
36575
|
-
return
|
|
36345
|
+
return getSpanStatusFromHttpCode2(numberHttpCode);
|
|
36576
36346
|
}
|
|
36577
36347
|
if (typeof grpcCodeAttribute === "string") {
|
|
36578
36348
|
return { code: SPAN_STATUS_ERROR3, message: canonicalGrpcErrorCodesMap[grpcCodeAttribute] || "unknown_error" };
|
|
@@ -36714,7 +36484,7 @@ function createTransactionForOtelSpan(span) {
|
|
|
36714
36484
|
status: getStatusMessage3(status),
|
|
36715
36485
|
links: convertSpanLinksForEnvelope3(links)
|
|
36716
36486
|
};
|
|
36717
|
-
const statusCode = attributes[
|
|
36487
|
+
const statusCode = attributes[import_semantic_conventions.ATTR_HTTP_RESPONSE_STATUS_CODE];
|
|
36718
36488
|
const responseContext = typeof statusCode === "number" ? { response: { status_code: statusCode } } : undefined;
|
|
36719
36489
|
const transactionEvent = {
|
|
36720
36490
|
contexts: {
|
|
@@ -36813,9 +36583,9 @@ function getData(span) {
|
|
|
36813
36583
|
if (span.kind !== import_api3.SpanKind.INTERNAL) {
|
|
36814
36584
|
data["otel.kind"] = import_api3.SpanKind[span.kind];
|
|
36815
36585
|
}
|
|
36816
|
-
const maybeHttpStatusCodeAttribute = attributes[
|
|
36586
|
+
const maybeHttpStatusCodeAttribute = attributes[import_semantic_conventions.SEMATTRS_HTTP_STATUS_CODE];
|
|
36817
36587
|
if (maybeHttpStatusCodeAttribute) {
|
|
36818
|
-
data[
|
|
36588
|
+
data[import_semantic_conventions.ATTR_HTTP_RESPONSE_STATUS_CODE] = maybeHttpStatusCodeAttribute;
|
|
36819
36589
|
}
|
|
36820
36590
|
const requestData = getRequestSpanData(span);
|
|
36821
36591
|
if (requestData.url) {
|
|
@@ -36889,7 +36659,7 @@ class SentrySampler {
|
|
|
36889
36659
|
if (!hasSpansEnabled3(options)) {
|
|
36890
36660
|
return wrapSamplingDecision({ decision: undefined, context: context4, spanAttributes });
|
|
36891
36661
|
}
|
|
36892
|
-
const maybeSpanHttpMethod = spanAttributes[
|
|
36662
|
+
const maybeSpanHttpMethod = spanAttributes[import_semantic_conventions.SEMATTRS_HTTP_METHOD] || spanAttributes[import_semantic_conventions.ATTR_HTTP_REQUEST_METHOD];
|
|
36893
36663
|
if (spanKind === import_api3.SpanKind.CLIENT && maybeSpanHttpMethod && (!parentSpan || parentContext?.isRemote)) {
|
|
36894
36664
|
return wrapSamplingDecision({ decision: undefined, context: context4, spanAttributes });
|
|
36895
36665
|
}
|
|
@@ -37006,8 +36776,8 @@ function wrapSamplingDecision({
|
|
|
37006
36776
|
function getBaseTraceState(context4, spanAttributes) {
|
|
37007
36777
|
const parentSpan = import_api3.trace.getSpan(context4);
|
|
37008
36778
|
const parentContext = parentSpan?.spanContext();
|
|
37009
|
-
let traceState = parentContext?.traceState || new
|
|
37010
|
-
const url = spanAttributes[
|
|
36779
|
+
let traceState = parentContext?.traceState || new import_core8.TraceState;
|
|
36780
|
+
const url = spanAttributes[import_semantic_conventions.SEMATTRS_HTTP_URL] || spanAttributes[import_semantic_conventions.ATTR_URL_FULL];
|
|
37011
36781
|
if (url && typeof url === "string") {
|
|
37012
36782
|
traceState = traceState.set(SENTRY_TRACE_STATE_URL, url);
|
|
37013
36783
|
}
|
|
@@ -37017,15 +36787,15 @@ function getValidSpan(context4) {
|
|
|
37017
36787
|
const span = import_api3.trace.getSpan(context4);
|
|
37018
36788
|
return span && import_api3.isSpanContextValid(span.spanContext()) ? span : undefined;
|
|
37019
36789
|
}
|
|
37020
|
-
var
|
|
36790
|
+
var import_semantic_conventions, api, import_api3, import_core8, import_sdk_trace_base, SEMANTIC_ATTRIBUTE_SENTRY_PARENT_IS_REMOTE = "sentry.parentIsRemote", SEMANTIC_ATTRIBUTE_SENTRY_GRAPHQL_OPERATION = "sentry.graphql.operation", SENTRY_TRACE_HEADER = "sentry-trace", SENTRY_BAGGAGE_HEADER = "baggage", SENTRY_TRACE_STATE_DSC = "sentry.dsc", SENTRY_TRACE_STATE_SAMPLED_NOT_RECORDING = "sentry.sampled_not_recording", SENTRY_TRACE_STATE_URL = "sentry.url", SENTRY_TRACE_STATE_SAMPLE_RAND = "sentry.sample_rand", SENTRY_TRACE_STATE_SAMPLE_RATE = "sentry.sample_rate", SENTRY_SCOPES_CONTEXT_KEY, SENTRY_FORK_ISOLATION_SCOPE_CONTEXT_KEY, SENTRY_FORK_SET_SCOPE_CONTEXT_KEY, SENTRY_FORK_SET_ISOLATION_SCOPE_CONTEXT_KEY, SCOPE_CONTEXT_FIELD = "_scopeContext", DEBUG_BUILD5, setupElements, SentryPropagator, NOT_PROPAGATED_MESSAGE = "[Tracing] Not injecting trace data for url because it does not match tracePropagationTargets:", canonicalGrpcErrorCodesMap, isStatusErrorMessageValid = (message2) => {
|
|
37021
36791
|
return Object.values(canonicalGrpcErrorCodesMap).includes(message2);
|
|
37022
36792
|
}, MAX_SPAN_COUNT2 = 1000, DEFAULT_TIMEOUT = 300;
|
|
37023
36793
|
var init_esm4 = __esm(() => {
|
|
37024
|
-
|
|
36794
|
+
import_semantic_conventions = __toESM(require_src2(), 1);
|
|
37025
36795
|
init_esm3();
|
|
37026
36796
|
api = __toESM(require_src(), 1);
|
|
37027
36797
|
import_api3 = __toESM(require_src(), 1);
|
|
37028
|
-
|
|
36798
|
+
import_core8 = __toESM(require_src3(), 1);
|
|
37029
36799
|
import_sdk_trace_base = __toESM(require_src9(), 1);
|
|
37030
36800
|
SENTRY_SCOPES_CONTEXT_KEY = import_api3.createContextKey("sentry_scopes");
|
|
37031
36801
|
SENTRY_FORK_ISOLATION_SCOPE_CONTEXT_KEY = import_api3.createContextKey("sentry_fork_isolation_scope");
|
|
@@ -37033,14 +36803,14 @@ var init_esm4 = __esm(() => {
|
|
|
37033
36803
|
SENTRY_FORK_SET_ISOLATION_SCOPE_CONTEXT_KEY = import_api3.createContextKey("sentry_fork_set_isolation_scope");
|
|
37034
36804
|
DEBUG_BUILD5 = typeof __SENTRY_DEBUG__ === "undefined" || __SENTRY_DEBUG__;
|
|
37035
36805
|
setupElements = new Set;
|
|
37036
|
-
SentryPropagator = class SentryPropagator extends
|
|
36806
|
+
SentryPropagator = class SentryPropagator extends import_core8.W3CBaggagePropagator {
|
|
37037
36807
|
constructor() {
|
|
37038
36808
|
super();
|
|
37039
36809
|
setIsSetup("SentryPropagator");
|
|
37040
36810
|
this._urlMatchesTargetsMap = new LRUMap2(100);
|
|
37041
36811
|
}
|
|
37042
36812
|
inject(context4, carrier, setter) {
|
|
37043
|
-
if (
|
|
36813
|
+
if (import_core8.isTracingSuppressed(context4)) {
|
|
37044
36814
|
DEBUG_BUILD5 && debug4.log("[Tracing] Not injecting trace data for url because tracing is suppressed.");
|
|
37045
36815
|
return;
|
|
37046
36816
|
}
|
|
@@ -37178,9 +36948,9 @@ function getBreadcrumbData(request) {
|
|
|
37178
36948
|
try {
|
|
37179
36949
|
const host = request.getHeader("host") || request.host;
|
|
37180
36950
|
const url = new URL(request.path, `${request.protocol}//${host}`);
|
|
37181
|
-
const parsedUrl =
|
|
36951
|
+
const parsedUrl = parseUrl2(url.toString());
|
|
37182
36952
|
const data = {
|
|
37183
|
-
url:
|
|
36953
|
+
url: getSanitizedUrlString2(parsedUrl),
|
|
37184
36954
|
"http.method": request.method || "GET"
|
|
37185
36955
|
};
|
|
37186
36956
|
if (parsedUrl.search) {
|
|
@@ -37220,10 +36990,10 @@ var init_outgoing_requests = __esm(() => {
|
|
|
37220
36990
|
|
|
37221
36991
|
// ../../node_modules/@sentry/node-core/build/esm/integrations/http/SentryHttpInstrumentation.js
|
|
37222
36992
|
import { subscribe, unsubscribe } from "node:diagnostics_channel";
|
|
37223
|
-
var import_api4,
|
|
36993
|
+
var import_api4, import_core11, import_instrumentation2, SentryHttpInstrumentation;
|
|
37224
36994
|
var init_SentryHttpInstrumentation = __esm(() => {
|
|
37225
36995
|
import_api4 = __toESM(require_src(), 1);
|
|
37226
|
-
|
|
36996
|
+
import_core11 = __toESM(require_src3(), 1);
|
|
37227
36997
|
import_instrumentation2 = __toESM(require_src6(), 1);
|
|
37228
36998
|
init_esm2();
|
|
37229
36999
|
init_debug_build3();
|
|
@@ -37239,19 +37009,13 @@ var init_SentryHttpInstrumentation = __esm(() => {
|
|
|
37239
37009
|
}
|
|
37240
37010
|
init() {
|
|
37241
37011
|
let hasRegisteredHandlers = false;
|
|
37242
|
-
const spansEnabled = this.getConfig().spans ?? true;
|
|
37243
37012
|
const onHttpServerRequestStart = (_data) => {
|
|
37244
37013
|
const data = _data;
|
|
37245
37014
|
instrumentServer(data.server, {
|
|
37246
|
-
instrumentation: this.getConfig().instrumentation,
|
|
37247
37015
|
ignoreIncomingRequestBody: this.getConfig().ignoreIncomingRequestBody,
|
|
37248
|
-
ignoreSpansForIncomingRequests: this.getConfig().ignoreSpansForIncomingRequests,
|
|
37249
|
-
incomingRequestSpanHook: this.getConfig().incomingRequestSpanHook,
|
|
37250
37016
|
maxIncomingRequestBodySize: this.getConfig().maxIncomingRequestBodySize,
|
|
37251
37017
|
trackIncomingRequestsAsSessions: this.getConfig().trackIncomingRequestsAsSessions,
|
|
37252
|
-
sessionFlushingDelayMS: this.getConfig().sessionFlushingDelayMS ?? 60000
|
|
37253
|
-
ignoreStaticAssets: this.getConfig().ignoreStaticAssets,
|
|
37254
|
-
spans: spansEnabled && !this.getConfig().disableIncomingRequestSpans
|
|
37018
|
+
sessionFlushingDelayMS: this.getConfig().sessionFlushingDelayMS ?? 60000
|
|
37255
37019
|
});
|
|
37256
37020
|
};
|
|
37257
37021
|
const onHttpClientResponseFinish = (_data) => {
|
|
@@ -37309,7 +37073,7 @@ var init_SentryHttpInstrumentation = __esm(() => {
|
|
|
37309
37073
|
addTracePropagationHeadersToOutgoingRequest(request, this._propagationDecisionMap);
|
|
37310
37074
|
}
|
|
37311
37075
|
_shouldIgnoreOutgoingRequest(request) {
|
|
37312
|
-
if (
|
|
37076
|
+
if (import_core11.isTracingSuppressed(import_api4.context.active())) {
|
|
37313
37077
|
return true;
|
|
37314
37078
|
}
|
|
37315
37079
|
const ignoreOutgoingRequests = this.getConfig().ignoreOutgoingRequests;
|
|
@@ -37342,8 +37106,7 @@ var init_http = __esm(() => {
|
|
|
37342
37106
|
setupOnce() {
|
|
37343
37107
|
instrumentSentryHttp({
|
|
37344
37108
|
...options,
|
|
37345
|
-
|
|
37346
|
-
disableIncomingRequestSpans: true,
|
|
37109
|
+
extractIncomingTraceFromHeader: true,
|
|
37347
37110
|
propagateTraceInOutgoingRequests: true
|
|
37348
37111
|
});
|
|
37349
37112
|
},
|
|
@@ -37398,9 +37161,9 @@ function addRequestBreadcrumb2(request, response) {
|
|
|
37398
37161
|
function getBreadcrumbData2(request) {
|
|
37399
37162
|
try {
|
|
37400
37163
|
const url = getAbsoluteUrl3(request.origin, request.path);
|
|
37401
|
-
const parsedUrl =
|
|
37164
|
+
const parsedUrl = parseUrl2(url);
|
|
37402
37165
|
const data = {
|
|
37403
|
-
url:
|
|
37166
|
+
url: getSanitizedUrlString2(parsedUrl),
|
|
37404
37167
|
"http.method": request.method || "GET"
|
|
37405
37168
|
};
|
|
37406
37169
|
if (parsedUrl.search) {
|
|
@@ -37429,10 +37192,10 @@ function getAbsoluteUrl3(origin, path = "/") {
|
|
|
37429
37192
|
return `${url}${path}`;
|
|
37430
37193
|
}
|
|
37431
37194
|
}
|
|
37432
|
-
var import_api5,
|
|
37195
|
+
var import_api5, import_core15, import_instrumentation3, SENTRY_TRACE_HEADER2 = "sentry-trace", SENTRY_BAGGAGE_HEADER2 = "baggage", BAGGAGE_HEADER_REGEX, SentryNodeFetchInstrumentation;
|
|
37433
37196
|
var init_SentryNodeFetchInstrumentation = __esm(() => {
|
|
37434
37197
|
import_api5 = __toESM(require_src(), 1);
|
|
37435
|
-
|
|
37198
|
+
import_core15 = __toESM(require_src3(), 1);
|
|
37436
37199
|
import_instrumentation3 = __toESM(require_src6(), 1);
|
|
37437
37200
|
init_esm2();
|
|
37438
37201
|
init_esm4();
|
|
@@ -37545,7 +37308,7 @@ var init_SentryNodeFetchInstrumentation = __esm(() => {
|
|
|
37545
37308
|
});
|
|
37546
37309
|
}
|
|
37547
37310
|
_shouldIgnoreOutgoingRequest(request) {
|
|
37548
|
-
if (
|
|
37311
|
+
if (import_core15.isTracingSuppressed(import_api5.context.active())) {
|
|
37549
37312
|
return true;
|
|
37550
37313
|
}
|
|
37551
37314
|
const url = getAbsoluteUrl3(request.origin, request.path);
|
|
@@ -38169,7 +37932,7 @@ import { Worker } from "node:worker_threads";
|
|
|
38169
37932
|
function log4(...args) {
|
|
38170
37933
|
debug2.log("[LocalVariables]", ...args);
|
|
38171
37934
|
}
|
|
38172
|
-
var base64WorkerScript = "
|
|
37935
|
+
var base64WorkerScript = "LyohIEBzZW50cnkvbm9kZS1jb3JlIDEwLjguMCAoYmQ4NDU4ZSkgfCBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3NlbnRyeS1qYXZhc2NyaXB0ICovCmltcG9ydHtTZXNzaW9uIGFzIGV9ZnJvbSJub2RlOmluc3BlY3Rvci9wcm9taXNlcyI7aW1wb3J0e3dvcmtlckRhdGEgYXMgdH1mcm9tIm5vZGU6d29ya2VyX3RocmVhZHMiO2NvbnN0IG49Z2xvYmFsVGhpcyxpPXt9O2NvbnN0IG89Il9fU0VOVFJZX0VSUk9SX0xPQ0FMX1ZBUklBQkxFU19fIjtjb25zdCBhPXQ7ZnVuY3Rpb24gcyguLi5lKXthLmRlYnVnJiZmdW5jdGlvbihlKXtpZighKCJjb25zb2xlImluIG4pKXJldHVybiBlKCk7Y29uc3QgdD1uLmNvbnNvbGUsbz17fSxhPU9iamVjdC5rZXlzKGkpO2EuZm9yRWFjaChlPT57Y29uc3Qgbj1pW2VdO29bZV09dFtlXSx0W2VdPW59KTt0cnl7cmV0dXJuIGUoKX1maW5hbGx5e2EuZm9yRWFjaChlPT57dFtlXT1vW2VdfSl9fSgoKT0+Y29uc29sZS5sb2coIltMb2NhbFZhcmlhYmxlcyBXb3JrZXJdIiwuLi5lKSl9YXN5bmMgZnVuY3Rpb24gYyhlLHQsbixpKXtjb25zdCBvPWF3YWl0IGUucG9zdCgiUnVudGltZS5nZXRQcm9wZXJ0aWVzIix7b2JqZWN0SWQ6dCxvd25Qcm9wZXJ0aWVzOiEwfSk7aVtuXT1vLnJlc3VsdC5maWx0ZXIoZT0+Imxlbmd0aCIhPT1lLm5hbWUmJiFpc05hTihwYXJzZUludChlLm5hbWUsMTApKSkuc29ydCgoZSx0KT0+cGFyc2VJbnQoZS5uYW1lLDEwKS1wYXJzZUludCh0Lm5hbWUsMTApKS5tYXAoZT0+ZS52YWx1ZT8udmFsdWUpfWFzeW5jIGZ1bmN0aW9uIHIoZSx0LG4saSl7Y29uc3Qgbz1hd2FpdCBlLnBvc3QoIlJ1bnRpbWUuZ2V0UHJvcGVydGllcyIse29iamVjdElkOnQsb3duUHJvcGVydGllczohMH0pO2lbbl09by5yZXN1bHQubWFwKGU9PltlLm5hbWUsZS52YWx1ZT8udmFsdWVdKS5yZWR1Y2UoKGUsW3Qsbl0pPT4oZVt0XT1uLGUpLHt9KX1mdW5jdGlvbiB1KGUsdCl7ZS52YWx1ZSYmKCJ2YWx1ZSJpbiBlLnZhbHVlP3ZvaWQgMD09PWUudmFsdWUudmFsdWV8fG51bGw9PT1lLnZhbHVlLnZhbHVlP3RbZS5uYW1lXT1gPCR7ZS52YWx1ZS52YWx1ZX0+YDp0W2UubmFtZV09ZS52YWx1ZS52YWx1ZToiZGVzY3JpcHRpb24iaW4gZS52YWx1ZSYmImZ1bmN0aW9uIiE9PWUudmFsdWUudHlwZT90W2UubmFtZV09YDwke2UudmFsdWUuZGVzY3JpcHRpb259PmA6InVuZGVmaW5lZCI9PT1lLnZhbHVlLnR5cGUmJih0W2UubmFtZV09Ijx1bmRlZmluZWQ+IikpfWFzeW5jIGZ1bmN0aW9uIGwoZSx0KXtjb25zdCBuPWF3YWl0IGUucG9zdCgiUnVudGltZS5nZXRQcm9wZXJ0aWVzIix7b2JqZWN0SWQ6dCxvd25Qcm9wZXJ0aWVzOiEwfSksaT17fTtmb3IoY29uc3QgdCBvZiBuLnJlc3VsdClpZih0LnZhbHVlPy5vYmplY3RJZCYmIkFycmF5Ij09PXQudmFsdWUuY2xhc3NOYW1lKXtjb25zdCBuPXQudmFsdWUub2JqZWN0SWQ7YXdhaXQgYyhlLG4sdC5uYW1lLGkpfWVsc2UgaWYodC52YWx1ZT8ub2JqZWN0SWQmJiJPYmplY3QiPT09dC52YWx1ZS5jbGFzc05hbWUpe2NvbnN0IG49dC52YWx1ZS5vYmplY3RJZDthd2FpdCByKGUsbix0Lm5hbWUsaSl9ZWxzZSB0LnZhbHVlJiZ1KHQsaSk7cmV0dXJuIGl9bGV0IGY7KGFzeW5jIGZ1bmN0aW9uKCl7Y29uc3QgdD1uZXcgZTt0LmNvbm5lY3RUb01haW5UaHJlYWQoKSxzKCJDb25uZWN0ZWQgdG8gbWFpbiB0aHJlYWQiKTtsZXQgbj0hMTt0Lm9uKCJEZWJ1Z2dlci5yZXN1bWVkIiwoKT0+e249ITF9KSx0Lm9uKCJEZWJ1Z2dlci5wYXVzZWQiLGU9PntuPSEwLGFzeW5jIGZ1bmN0aW9uKGUse3JlYXNvbjp0LGRhdGE6e29iamVjdElkOm59LGNhbGxGcmFtZXM6aX0pe2lmKCJleGNlcHRpb24iIT09dCYmInByb21pc2VSZWplY3Rpb24iIT09dClyZXR1cm47aWYoZj8uKCksbnVsbD09bilyZXR1cm47Y29uc3QgYT1bXTtmb3IobGV0IHQ9MDt0PGkubGVuZ3RoO3QrKyl7Y29uc3R7c2NvcGVDaGFpbjpuLGZ1bmN0aW9uTmFtZTpvLHRoaXM6c309aVt0XSxjPW4uZmluZChlPT4ibG9jYWwiPT09ZS50eXBlKSxyPSJnbG9iYWwiIT09cy5jbGFzc05hbWUmJnMuY2xhc3NOYW1lP2Ake3MuY2xhc3NOYW1lfS4ke299YDpvO2lmKHZvaWQgMD09PWM/Lm9iamVjdC5vYmplY3RJZClhW3RdPXtmdW5jdGlvbjpyfTtlbHNle2NvbnN0IG49YXdhaXQgbChlLGMub2JqZWN0Lm9iamVjdElkKTthW3RdPXtmdW5jdGlvbjpyLHZhcnM6bn19fWF3YWl0IGUucG9zdCgiUnVudGltZS5jYWxsRnVuY3Rpb25PbiIse2Z1bmN0aW9uRGVjbGFyYXRpb246YGZ1bmN0aW9uKCkgeyB0aGlzLiR7b30gPSB0aGlzLiR7b30gfHwgJHtKU09OLnN0cmluZ2lmeShhKX07IH1gLHNpbGVudDohMCxvYmplY3RJZDpufSksYXdhaXQgZS5wb3N0KCJSdW50aW1lLnJlbGVhc2VPYmplY3QiLHtvYmplY3RJZDpufSl9KHQsZS5wYXJhbXMpLnRoZW4oYXN5bmMoKT0+e24mJmF3YWl0IHQucG9zdCgiRGVidWdnZXIucmVzdW1lIil9LGFzeW5jIGU9PntuJiZhd2FpdCB0LnBvc3QoIkRlYnVnZ2VyLnJlc3VtZSIpfSl9KSxhd2FpdCB0LnBvc3QoIkRlYnVnZ2VyLmVuYWJsZSIpO2NvbnN0IGk9ITEhPT1hLmNhcHR1cmVBbGxFeGNlcHRpb25zO2lmKGF3YWl0IHQucG9zdCgiRGVidWdnZXIuc2V0UGF1c2VPbkV4Y2VwdGlvbnMiLHtzdGF0ZTppPyJhbGwiOiJ1bmNhdWdodCJ9KSxpKXtjb25zdCBlPWEubWF4RXhjZXB0aW9uc1BlclNlY29uZHx8NTA7Zj1mdW5jdGlvbihlLHQsbil7bGV0IGk9MCxvPTUsYT0wO3JldHVybiBzZXRJbnRlcnZhbCgoKT0+ezA9PT1hP2k+ZSYmKG8qPTIsbihvKSxvPjg2NDAwJiYobz04NjQwMCksYT1vKTooYS09MSwwPT09YSYmdCgpKSxpPTB9LDFlMykudW5yZWYoKSwoKT0+e2krPTF9fShlLGFzeW5jKCk9PntzKCJSYXRlLWxpbWl0IGxpZnRlZC4iKSxhd2FpdCB0LnBvc3QoIkRlYnVnZ2VyLnNldFBhdXNlT25FeGNlcHRpb25zIix7c3RhdGU6ImFsbCJ9KX0sYXN5bmMgZT0+e3MoYFJhdGUtbGltaXQgZXhjZWVkZWQuIERpc2FibGluZyBjYXB0dXJpbmcgb2YgY2F1Z2h0IGV4Y2VwdGlvbnMgZm9yICR7ZX0gc2Vjb25kcy5gKSxhd2FpdCB0LnBvc3QoIkRlYnVnZ2VyLnNldFBhdXNlT25FeGNlcHRpb25zIix7c3RhdGU6InVuY2F1Z2h0In0pfSl9fSkoKS5jYXRjaChlPT57cygiRmFpbGVkIHRvIHN0YXJ0IGRlYnVnZ2VyIixlKX0pLHNldEludGVydmFsKCgpPT57fSwxZTQpOw==", localVariablesAsyncIntegration;
|
|
38173
37936
|
var init_local_variables_async = __esm(() => {
|
|
38174
37937
|
init_esm2();
|
|
38175
37938
|
init_debug();
|
|
@@ -38882,7 +38645,7 @@ function disableAnrDetectionForCallback(callback) {
|
|
|
38882
38645
|
integration.startWorker();
|
|
38883
38646
|
return result;
|
|
38884
38647
|
}
|
|
38885
|
-
var isPromise, base64WorkerScript2 = "LyohIEBzZW50cnkvbm9kZS1jb3JlIDEwLjkuMCAoNDE3Y2Y1NykgfCBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3NlbnRyeS1qYXZhc2NyaXB0ICovCmltcG9ydHtTZXNzaW9uIGFzIHR9ZnJvbSJub2RlOmluc3BlY3RvciI7aW1wb3J0e3dvcmtlckRhdGEgYXMgbixwYXJlbnRQb3J0IGFzIGV9ZnJvbSJub2RlOndvcmtlcl90aHJlYWRzIjtpbXBvcnR7cG9zaXggYXMgcixzZXAgYXMgb31mcm9tIm5vZGU6cGF0aCI7aW1wb3J0KmFzIHMgZnJvbSJub2RlOmh0dHAiO2ltcG9ydCphcyBpIGZyb20ibm9kZTpodHRwcyI7aW1wb3J0e1JlYWRhYmxlIGFzIGN9ZnJvbSJub2RlOnN0cmVhbSI7aW1wb3J0e2NyZWF0ZUd6aXAgYXMgdX1mcm9tIm5vZGU6emxpYiI7aW1wb3J0KmFzIGEgZnJvbSJub2RlOm5ldCI7aW1wb3J0KmFzIGYgZnJvbSJub2RlOnRscyI7Y29uc3QgaD0idW5kZWZpbmVkIj09dHlwZW9mIF9fU0VOVFJZX0RFQlVHX198fF9fU0VOVFJZX0RFQlVHX18scD1nbG9iYWxUaGlzLGw9IjEwLjkuMCI7ZnVuY3Rpb24gZCgpe3JldHVybiBtKHApLHB9ZnVuY3Rpb24gbSh0KXtjb25zdCBuPXQuX19TRU5UUllfXz10Ll9fU0VOVFJZX198fHt9O3JldHVybiBuLnZlcnNpb249bi52ZXJzaW9ufHxsLG5bbF09bltsXXx8e319ZnVuY3Rpb24gZyh0LG4sZT1wKXtjb25zdCByPWUuX19TRU5UUllfXz1lLl9fU0VOVFJZX198fHt9LG89cltsXT1yW2xdfHx7fTtyZXR1cm4gb1t0XXx8KG9bdF09bigpKX1jb25zdCB5PXt9O2Z1bmN0aW9uIGIodCl7aWYoISgiY29uc29sZSJpbiBwKSlyZXR1cm4gdCgpO2NvbnN0IG49cC5jb25zb2xlLGU9e30scj1PYmplY3Qua2V5cyh5KTtyLmZvckVhY2godD0+e2NvbnN0IHI9eVt0XTtlW3RdPW5bdF0sblt0XT1yfSk7dHJ5e3JldHVybiB0KCl9ZmluYWxseXtyLmZvckVhY2godD0+e25bdF09ZVt0XX0pfX1mdW5jdGlvbiB2KCl7cmV0dXJuIHcoKS5lbmFibGVkfWZ1bmN0aW9uIF8odCwuLi5uKXtoJiZ2KCkmJmIoKCk9PntwLmNvbnNvbGVbdF0oYFNlbnRyeSBMb2dnZXIgWyR7dH1dOmAsLi4ubil9KX1mdW5jdGlvbiB3KCl7cmV0dXJuIGg/ZygibG9nZ2VyU2V0dGluZ3MiLCgpPT4oe2VuYWJsZWQ6ITF9KSk6e2VuYWJsZWQ6ITF9fWNvbnN0IFM9e2VuYWJsZTpmdW5jdGlvbigpe3coKS5lbmFibGVkPSEwfSxkaXNhYmxlOmZ1bmN0aW9uKCl7dygpLmVuYWJsZWQ9ITF9LGlzRW5hYmxlZDp2LGxvZzpmdW5jdGlvbiguLi50KXtfKCJsb2ciLC4uLnQpfSx3YXJuOmZ1bmN0aW9uKC4uLnQpe18oIndhcm4iLC4uLnQpfSxlcnJvcjpmdW5jdGlvbiguLi50KXtfKCJlcnJvciIsLi4udCl9fSwkPS9jYXB0dXJlTWVzc2FnZXxjYXB0dXJlRXhjZXB0aW9uLztmdW5jdGlvbiBFKHQpe3JldHVybiB0W3QubGVuZ3RoLTFdfHx7fX1jb25zdCB4PSI8YW5vbnltb3VzPiI7Y29uc3QgTj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIEModCxuKXtyZXR1cm4gTi5jYWxsKHQpPT09YFtvYmplY3QgJHtufV1gfWZ1bmN0aW9uIGsodCl7cmV0dXJuIEModCwiU3RyaW5nIil9ZnVuY3Rpb24gVCh0KXtyZXR1cm4gQyh0LCJPYmplY3QiKX1mdW5jdGlvbiBqKHQpe3JldHVybiBCb29sZWFuKHQ/LnRoZW4mJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnRoZW4pfWZ1bmN0aW9uIEkodCxuKXt0cnl7cmV0dXJuIHQgaW5zdGFuY2VvZiBufWNhdGNoe3JldHVybiExfX1jb25zdCBPPXA7ZnVuY3Rpb24gUih0LG4pe2NvbnN0IGU9dCxyPVtdO2lmKCFlPy50YWdOYW1lKXJldHVybiIiO2lmKE8uSFRNTEVsZW1lbnQmJmUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCYmZS5kYXRhc2V0KXtpZihlLmRhdGFzZXQuc2VudHJ5Q29tcG9uZW50KXJldHVybiBlLmRhdGFzZXQuc2VudHJ5Q29tcG9uZW50O2lmKGUuZGF0YXNldC5zZW50cnlFbGVtZW50KXJldHVybiBlLmRhdGFzZXQuc2VudHJ5RWxlbWVudH1yLnB1c2goZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkpO2NvbnN0IG89bj8ubGVuZ3RoP24uZmlsdGVyKHQ9PmUuZ2V0QXR0cmlidXRlKHQpKS5tYXAodD0+W3QsZS5nZXRBdHRyaWJ1dGUodCldKTpudWxsO2lmKG8/Lmxlbmd0aClvLmZvckVhY2godD0+e3IucHVzaChgWyR7dFswXX09IiR7dFsxXX0iXWApfSk7ZWxzZXtlLmlkJiZyLnB1c2goYCMke2UuaWR9YCk7Y29uc3QgdD1lLmNsYXNzTmFtZTtpZih0JiZrKHQpKXtjb25zdCBuPXQuc3BsaXQoL1xzKy8pO2Zvcihjb25zdCB0IG9mIG4pci5wdXNoKGAuJHt0fWApfX1jb25zdCBzPVsiYXJpYS1sYWJlbCIsInR5cGUiLCJuYW1lIiwidGl0bGUiLCJhbHQiXTtmb3IoY29uc3QgdCBvZiBzKXtjb25zdCBuPWUuZ2V0QXR0cmlidXRlKHQpO24mJnIucHVzaChgWyR7dH09IiR7bn0iXWApfXJldHVybiByLmpvaW4oIiIpfWZ1bmN0aW9uIEEodCxuPTApe3JldHVybiJzdHJpbmciIT10eXBlb2YgdHx8MD09PW58fHQubGVuZ3RoPD1uP3Q6YCR7dC5zbGljZSgwLG4pfS4uLmB9ZnVuY3Rpb24gRCh0KXtpZihmdW5jdGlvbih0KXtzd2l0Y2goTi5jYWxsKHQpKXtjYXNlIltvYmplY3QgRXJyb3JdIjpjYXNlIltvYmplY3QgRXhjZXB0aW9uXSI6Y2FzZSJbb2JqZWN0IERPTUV4Y2VwdGlvbl0iOmNhc2UiW29iamVjdCBXZWJBc3NlbWJseS5FeGNlcHRpb25dIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiBJKHQsRXJyb3IpfX0odCkpcmV0dXJue21lc3NhZ2U6dC5tZXNzYWdlLG5hbWU6dC5uYW1lLHN0YWNrOnQuc3RhY2ssLi4uVSh0KX07aWYobj10LCJ1bmRlZmluZWQiIT10eXBlb2YgRXZlbnQmJkkobixFdmVudCkpe2NvbnN0IG49e3R5cGU6dC50eXBlLHRhcmdldDpQKHQudGFyZ2V0KSxjdXJyZW50VGFyZ2V0OlAodC5jdXJyZW50VGFyZ2V0KSwuLi5VKHQpfTtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEN1c3RvbUV2ZW50JiZJKHQsQ3VzdG9tRXZlbnQpJiYobi5kZXRhaWw9dC5kZXRhaWwpLG59cmV0dXJuIHQ7dmFyIG59ZnVuY3Rpb24gUCh0KXt0cnl7cmV0dXJuIG49dCwidW5kZWZpbmVkIiE9dHlwZW9mIEVsZW1lbnQmJkkobixFbGVtZW50KT9mdW5jdGlvbih0LG49e30pe2lmKCF0KXJldHVybiI8dW5rbm93bj4iO3RyeXtsZXQgZT10O2NvbnN0IHI9NSxvPVtdO2xldCBzPTAsaT0wO2NvbnN0IGM9IiA+ICIsdT1jLmxlbmd0aDtsZXQgYTtjb25zdCBmPUFycmF5LmlzQXJyYXkobik/bjpuLmtleUF0dHJzLGg9IUFycmF5LmlzQXJyYXkobikmJm4ubWF4U3RyaW5nTGVuZ3RofHw4MDtmb3IoO2UmJnMrKzxyJiYoYT1SKGUsZiksISgiaHRtbCI9PT1hfHxzPjEmJmkrby5sZW5ndGgqdSthLmxlbmd0aD49aCkpOylvLnB1c2goYSksaSs9YS5sZW5ndGgsZT1lLnBhcmVudE5vZGU7cmV0dXJuIG8ucmV2ZXJzZSgpLmpvaW4oYyl9Y2F0Y2h7cmV0dXJuIjx1bmtub3duPiJ9fSh0KTpPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9Y2F0Y2h7cmV0dXJuIjx1bmtub3duPiJ9dmFyIG59ZnVuY3Rpb24gVSh0KXtpZigib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10KXtjb25zdCBuPXt9O2Zvcihjb25zdCBlIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSkmJihuW2VdPXRbZV0pO3JldHVybiBufXJldHVybnt9fWZ1bmN0aW9uIE0odD1mdW5jdGlvbigpe2NvbnN0IHQ9cDtyZXR1cm4gdC5jcnlwdG98fHQubXNDcnlwdG99KCkpe2xldCBuPSgpPT4xNipNYXRoLnJhbmRvbSgpO3RyeXtpZih0Py5yYW5kb21VVUlEKXJldHVybiB0LnJhbmRvbVVVSUQoKS5yZXBsYWNlKC8tL2csIiIpO3Q/LmdldFJhbmRvbVZhbHVlcyYmKG49KCk9Pntjb25zdCBuPW5ldyBVaW50OEFycmF5KDEpO3JldHVybiB0LmdldFJhbmRvbVZhbHVlcyhuKSxuWzBdfSl9Y2F0Y2h7fXJldHVybihbMWU3XSsxZTMrNGUzKzhlMysxZTExKS5yZXBsYWNlKC9bMDE4XS9nLHQ9Pih0XigxNSZuKCkpPj50LzQpLnRvU3RyaW5nKDE2KSl9ZnVuY3Rpb24gTCgpe3JldHVybiBEYXRlLm5vdygpLzFlM31sZXQgQjtmdW5jdGlvbiBHKCl7cmV0dXJuKEI/PyhCPWZ1bmN0aW9uKCl7Y29uc3R7cGVyZm9ybWFuY2U6dH09cDtpZighdD8ubm93fHwhdC50aW1lT3JpZ2luKXJldHVybiBMO2NvbnN0IG49dC50aW1lT3JpZ2luO3JldHVybigpPT4obit0Lm5vdygpKS8xZTN9KCkpKSgpfWZ1bmN0aW9uIEgodCl7Y29uc3Qgbj1HKCksZT17c2lkOk0oKSxpbml0OiEwLHRpbWVzdGFtcDpuLHN0YXJ0ZWQ6bixkdXJhdGlvbjowLHN0YXR1czoib2siLGVycm9yczowLGlnbm9yZUR1cmF0aW9uOiExLHRvSlNPTjooKT0+ZnVuY3Rpb24odCl7cmV0dXJue3NpZDpgJHt0LnNpZH1gLGluaXQ6dC5pbml0LHN0YXJ0ZWQ6bmV3IERhdGUoMWUzKnQuc3RhcnRlZCkudG9JU09TdHJpbmcoKSx0aW1lc3RhbXA6bmV3IERhdGUoMWUzKnQudGltZXN0YW1wKS50b0lTT1N0cmluZygpLHN0YXR1czp0LnN0YXR1cyxlcnJvcnM6dC5lcnJvcnMsZGlkOiJudW1iZXIiPT10eXBlb2YgdC5kaWR8fCJzdHJpbmciPT10eXBlb2YgdC5kaWQ/YCR7dC5kaWR9YDp2b2lkIDAsZHVyYXRpb246dC5kdXJhdGlvbixhYm5vcm1hbF9tZWNoYW5pc206dC5hYm5vcm1hbF9tZWNoYW5pc20sYXR0cnM6e3JlbGVhc2U6dC5yZWxlYXNlLGVudmlyb25tZW50OnQuZW52aXJvbm1lbnQsaXBfYWRkcmVzczp0LmlwQWRkcmVzcyx1c2VyX2FnZW50OnQudXNlckFnZW50fX19KGUpfTtyZXR1cm4gdCYmSihlLHQpLGV9ZnVuY3Rpb24gSih0LG49e30pe2lmKG4udXNlciYmKCF0LmlwQWRkcmVzcyYmbi51c2VyLmlwX2FkZHJlc3MmJih0LmlwQWRkcmVzcz1uLnVzZXIuaXBfYWRkcmVzcyksdC5kaWR8fG4uZGlkfHwodC5kaWQ9bi51c2VyLmlkfHxuLnVzZXIuZW1haWx8fG4udXNlci51c2VybmFtZSkpLHQudGltZXN0YW1wPW4udGltZXN0YW1wfHxHKCksbi5hYm5vcm1hbF9tZWNoYW5pc20mJih0LmFibm9ybWFsX21lY2hhbmlzbT1uLmFibm9ybWFsX21lY2hhbmlzbSksbi5pZ25vcmVEdXJhdGlvbiYmKHQuaWdub3JlRHVyYXRpb249bi5pZ25vcmVEdXJhdGlvbiksbi5zaWQmJih0LnNpZD0zMj09PW4uc2lkLmxlbmd0aD9uLnNpZDpNKCkpLHZvaWQgMCE9PW4uaW5pdCYmKHQuaW5pdD1uLmluaXQpLCF0LmRpZCYmbi5kaWQmJih0LmRpZD1gJHtuLmRpZH1gKSwibnVtYmVyIj09dHlwZW9mIG4uc3RhcnRlZCYmKHQuc3RhcnRlZD1uLnN0YXJ0ZWQpLHQuaWdub3JlRHVyYXRpb24pdC5kdXJhdGlvbj12b2lkIDA7ZWxzZSBpZigibnVtYmVyIj09dHlwZW9mIG4uZHVyYXRpb24pdC5kdXJhdGlvbj1uLmR1cmF0aW9uO2Vsc2V7Y29uc3Qgbj10LnRpbWVzdGFtcC10LnN0YXJ0ZWQ7dC5kdXJhdGlvbj1uPj0wP246MH1uLnJlbGVhc2UmJih0LnJlbGVhc2U9bi5yZWxlYXNlKSxuLmVudmlyb25tZW50JiYodC5lbnZpcm9ubWVudD1uLmVudmlyb25tZW50KSwhdC5pcEFkZHJlc3MmJm4uaXBBZGRyZXNzJiYodC5pcEFkZHJlc3M9bi5pcEFkZHJlc3MpLCF0LnVzZXJBZ2VudCYmbi51c2VyQWdlbnQmJih0LnVzZXJBZ2VudD1uLnVzZXJBZ2VudCksIm51bWJlciI9PXR5cGVvZiBuLmVycm9ycyYmKHQuZXJyb3JzPW4uZXJyb3JzKSxuLnN0YXR1cyYmKHQuc3RhdHVzPW4uc3RhdHVzKX1mdW5jdGlvbiB6KHQsbixlPTIpe2lmKCFufHwib2JqZWN0IiE9dHlwZW9mIG58fGU8PTApcmV0dXJuIG47aWYodCYmMD09PU9iamVjdC5rZXlzKG4pLmxlbmd0aClyZXR1cm4gdDtjb25zdCByPXsuLi50fTtmb3IoY29uc3QgdCBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHQpJiYoclt0XT16KHJbdF0sblt0XSxlLTEpKTtyZXR1cm4gcn1mdW5jdGlvbiBGKCl7cmV0dXJuIE0oKX1mdW5jdGlvbiBXKCl7cmV0dXJuIE0oKS5zdWJzdHJpbmcoMTYpfWNvbnN0IFk9Il9zZW50cnlTcGFuIjtmdW5jdGlvbiBLKHQsbil7bj9mdW5jdGlvbih0LG4sZSl7dHJ5e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4se3ZhbHVlOmUsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSl9Y2F0Y2h7aCYmUy5sb2coYEZhaWxlZCB0byBhZGQgbm9uLWVudW1lcmFibGUgcHJvcGVydHkgIiR7bn0iIHRvIG9iamVjdGAsdCl9fSh0LFksbik6ZGVsZXRlIHRbWV19ZnVuY3Rpb24gWih0KXtyZXR1cm4gdFtZXX1jbGFzcyBWe2NvbnN0cnVjdG9yKCl7dGhpcy50PSExLHRoaXMubz1bXSx0aGlzLmk9W10sdGhpcy51PVtdLHRoaXMuaD1bXSx0aGlzLnA9e30sdGhpcy5sPXt9LHRoaXMubT17fSx0aGlzLnY9e30sdGhpcy5fPXt9LHRoaXMuUz17dHJhY2VJZDpGKCksc2FtcGxlUmFuZDpNYXRoLnJhbmRvbSgpfX1jbG9uZSgpe2NvbnN0IHQ9bmV3IFY7cmV0dXJuIHQudT1bLi4udGhpcy51XSx0Lmw9ey4uLnRoaXMubH0sdC5tPXsuLi50aGlzLm19LHQudj17Li4udGhpcy52fSx0aGlzLnYuZmxhZ3MmJih0LnYuZmxhZ3M9e3ZhbHVlczpbLi4udGhpcy52LmZsYWdzLnZhbHVlc119KSx0LnA9dGhpcy5wLHQuTj10aGlzLk4sdC5DPXRoaXMuQyx0Lms9dGhpcy5rLHQuVD10aGlzLlQsdC5pPVsuLi50aGlzLmldLHQuaD1bLi4udGhpcy5oXSx0Ll89ey4uLnRoaXMuX30sdC5TPXsuLi50aGlzLlN9LHQuaj10aGlzLmosdC5JPXRoaXMuSSxLKHQsWih0aGlzKSksdH1zZXRDbGllbnQodCl7dGhpcy5qPXR9c2V0TGFzdEV2ZW50SWQodCl7dGhpcy5JPXR9Z2V0Q2xpZW50KCl7cmV0dXJuIHRoaXMuan1sYXN0RXZlbnRJZCgpe3JldHVybiB0aGlzLkl9YWRkU2NvcGVMaXN0ZW5lcih0KXt0aGlzLm8ucHVzaCh0KX1hZGRFdmVudFByb2Nlc3Nvcih0KXtyZXR1cm4gdGhpcy5pLnB1c2godCksdGhpc31zZXRVc2VyKHQpe3JldHVybiB0aGlzLnA9dHx8e2VtYWlsOnZvaWQgMCxpZDp2b2lkIDAsaXBfYWRkcmVzczp2b2lkIDAsdXNlcm5hbWU6dm9pZCAwfSx0aGlzLkMmJkoodGhpcy5DLHt1c2VyOnR9KSx0aGlzLk8oKSx0aGlzfWdldFVzZXIoKXtyZXR1cm4gdGhpcy5wfXNldFRhZ3ModCl7cmV0dXJuIHRoaXMubD17Li4udGhpcy5sLC4uLnR9LHRoaXMuTygpLHRoaXN9c2V0VGFnKHQsbil7cmV0dXJuIHRoaXMubD17Li4udGhpcy5sLFt0XTpufSx0aGlzLk8oKSx0aGlzfXNldEV4dHJhcyh0KXtyZXR1cm4gdGhpcy5tPXsuLi50aGlzLm0sLi4udH0sdGhpcy5PKCksdGhpc31zZXRFeHRyYSh0LG4pe3JldHVybiB0aGlzLm09ey4uLnRoaXMubSxbdF06bn0sdGhpcy5PKCksdGhpc31zZXRGaW5nZXJwcmludCh0KXtyZXR1cm4gdGhpcy5UPXQsdGhpcy5PKCksdGhpc31zZXRMZXZlbCh0KXtyZXR1cm4gdGhpcy5OPXQsdGhpcy5PKCksdGhpc31zZXRUcmFuc2FjdGlvbk5hbWUodCl7cmV0dXJuIHRoaXMuaz10LHRoaXMuTygpLHRoaXN9c2V0Q29udGV4dCh0LG4pe3JldHVybiBudWxsPT09bj9kZWxldGUgdGhpcy52W3RdOnRoaXMudlt0XT1uLHRoaXMuTygpLHRoaXN9c2V0U2Vzc2lvbih0KXtyZXR1cm4gdD90aGlzLkM9dDpkZWxldGUgdGhpcy5DLHRoaXMuTygpLHRoaXN9Z2V0U2Vzc2lvbigpe3JldHVybiB0aGlzLkN9dXBkYXRlKHQpe2lmKCF0KXJldHVybiB0aGlzO2NvbnN0IG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dCh0aGlzKTp0LGU9biBpbnN0YW5jZW9mIFY/bi5nZXRTY29wZURhdGEoKTpUKG4pP3Q6dm9pZCAwLHt0YWdzOnIsZXh0cmE6byx1c2VyOnMsY29udGV4dHM6aSxsZXZlbDpjLGZpbmdlcnByaW50OnU9W10scHJvcGFnYXRpb25Db250ZXh0OmF9PWV8fHt9O3JldHVybiB0aGlzLmw9ey4uLnRoaXMubCwuLi5yfSx0aGlzLm09ey4uLnRoaXMubSwuLi5vfSx0aGlzLnY9ey4uLnRoaXMudiwuLi5pfSxzJiZPYmplY3Qua2V5cyhzKS5sZW5ndGgmJih0aGlzLnA9cyksYyYmKHRoaXMuTj1jKSx1Lmxlbmd0aCYmKHRoaXMuVD11KSxhJiYodGhpcy5TPWEpLHRoaXN9Y2xlYXIoKXtyZXR1cm4gdGhpcy51PVtdLHRoaXMubD17fSx0aGlzLm09e30sdGhpcy5wPXt9LHRoaXMudj17fSx0aGlzLk49dm9pZCAwLHRoaXMuaz12b2lkIDAsdGhpcy5UPXZvaWQgMCx0aGlzLkM9dm9pZCAwLEsodGhpcyx2b2lkIDApLHRoaXMuaD1bXSx0aGlzLnNldFByb3BhZ2F0aW9uQ29udGV4dCh7dHJhY2VJZDpGKCksc2FtcGxlUmFuZDpNYXRoLnJhbmRvbSgpfSksdGhpcy5PKCksdGhpc31hZGRCcmVhZGNydW1iKHQsbil7Y29uc3QgZT0ibnVtYmVyIj09dHlwZW9mIG4/bjoxMDA7aWYoZTw9MClyZXR1cm4gdGhpcztjb25zdCByPXt0aW1lc3RhbXA6TCgpLC4uLnQsbWVzc2FnZTp0Lm1lc3NhZ2U/QSh0Lm1lc3NhZ2UsMjA0OCk6dC5tZXNzYWdlfTtyZXR1cm4gdGhpcy51LnB1c2gociksdGhpcy51Lmxlbmd0aD5lJiYodGhpcy51PXRoaXMudS5zbGljZSgtZSksdGhpcy5qPy5yZWNvcmREcm9wcGVkRXZlbnQoImJ1ZmZlcl9vdmVyZmxvdyIsImxvZ19pdGVtIikpLHRoaXMuTygpLHRoaXN9Z2V0TGFzdEJyZWFkY3J1bWIoKXtyZXR1cm4gdGhpcy51W3RoaXMudS5sZW5ndGgtMV19Y2xlYXJCcmVhZGNydW1icygpe3JldHVybiB0aGlzLnU9W10sdGhpcy5PKCksdGhpc31hZGRBdHRhY2htZW50KHQpe3JldHVybiB0aGlzLmgucHVzaCh0KSx0aGlzfWNsZWFyQXR0YWNobWVudHMoKXtyZXR1cm4gdGhpcy5oPVtdLHRoaXN9Z2V0U2NvcGVEYXRhKCl7cmV0dXJue2JyZWFkY3J1bWJzOnRoaXMudSxhdHRhY2htZW50czp0aGlzLmgsY29udGV4dHM6dGhpcy52LHRhZ3M6dGhpcy5sLGV4dHJhOnRoaXMubSx1c2VyOnRoaXMucCxsZXZlbDp0aGlzLk4sZmluZ2VycHJpbnQ6dGhpcy5UfHxbXSxldmVudFByb2Nlc3NvcnM6dGhpcy5pLHByb3BhZ2F0aW9uQ29udGV4dDp0aGlzLlMsc2RrUHJvY2Vzc2luZ01ldGFkYXRhOnRoaXMuXyx0cmFuc2FjdGlvbk5hbWU6dGhpcy5rLHNwYW46Wih0aGlzKX19c2V0U0RLUHJvY2Vzc2luZ01ldGFkYXRhKHQpe3JldHVybiB0aGlzLl89eih0aGlzLl8sdCwyKSx0aGlzfXNldFByb3BhZ2F0aW9uQ29udGV4dCh0KXtyZXR1cm4gdGhpcy5TPXQsdGhpc31nZXRQcm9wYWdhdGlvbkNvbnRleHQoKXtyZXR1cm4gdGhpcy5TfWNhcHR1cmVFeGNlcHRpb24odCxuKXtjb25zdCBlPW4/LmV2ZW50X2lkfHxNKCk7aWYoIXRoaXMuailyZXR1cm4gaCYmUy53YXJuKCJObyBjbGllbnQgY29uZmlndXJlZCBvbiBzY29wZSAtIHdpbGwgbm90IGNhcHR1cmUgZXhjZXB0aW9uISIpLGU7Y29uc3Qgcj1uZXcgRXJyb3IoIlNlbnRyeSBzeW50aGV0aWNFeGNlcHRpb24iKTtyZXR1cm4gdGhpcy5qLmNhcHR1cmVFeGNlcHRpb24odCx7b3JpZ2luYWxFeGNlcHRpb246dCxzeW50aGV0aWNFeGNlcHRpb246ciwuLi5uLGV2ZW50X2lkOmV9LHRoaXMpLGV9Y2FwdHVyZU1lc3NhZ2UodCxuLGUpe2NvbnN0IHI9ZT8uZXZlbnRfaWR8fE0oKTtpZighdGhpcy5qKXJldHVybiBoJiZTLndhcm4oIk5vIGNsaWVudCBjb25maWd1cmVkIG9uIHNjb3BlIC0gd2lsbCBub3QgY2FwdHVyZSBtZXNzYWdlISIpLHI7Y29uc3Qgbz1uZXcgRXJyb3IodCk7cmV0dXJuIHRoaXMuai5jYXB0dXJlTWVzc2FnZSh0LG4se29yaWdpbmFsRXhjZXB0aW9uOnQsc3ludGhldGljRXhjZXB0aW9uOm8sLi4uZSxldmVudF9pZDpyfSx0aGlzKSxyfWNhcHR1cmVFdmVudCh0LG4pe2NvbnN0IGU9bj8uZXZlbnRfaWR8fE0oKTtyZXR1cm4gdGhpcy5qPyh0aGlzLmouY2FwdHVyZUV2ZW50KHQsey4uLm4sZXZlbnRfaWQ6ZX0sdGhpcyksZSk6KGgmJlMud2FybigiTm8gY2xpZW50IGNvbmZpZ3VyZWQgb24gc2NvcGUgLSB3aWxsIG5vdCBjYXB0dXJlIGV2ZW50ISIpLGUpfU8oKXt0aGlzLnR8fCh0aGlzLnQ9ITAsdGhpcy5vLmZvckVhY2godD0+e3QodGhpcyl9KSx0aGlzLnQ9ITEpfX1jbGFzcyBxe2NvbnN0cnVjdG9yKHQsbil7bGV0IGUscjtlPXR8fG5ldyBWLHI9bnx8bmV3IFYsdGhpcy5SPVt7c2NvcGU6ZX1dLHRoaXMuQT1yfXdpdGhTY29wZSh0KXtjb25zdCBuPXRoaXMuRCgpO2xldCBlO3RyeXtlPXQobil9Y2F0Y2godCl7dGhyb3cgdGhpcy5QKCksdH1yZXR1cm4gaihlKT9lLnRoZW4odD0+KHRoaXMuUCgpLHQpLHQ9Pnt0aHJvdyB0aGlzLlAoKSx0fSk6KHRoaXMuUCgpLGUpfWdldENsaWVudCgpe3JldHVybiB0aGlzLmdldFN0YWNrVG9wKCkuY2xpZW50fWdldFNjb3BlKCl7cmV0dXJuIHRoaXMuZ2V0U3RhY2tUb3AoKS5zY29wZX1nZXRJc29sYXRpb25TY29wZSgpe3JldHVybiB0aGlzLkF9Z2V0U3RhY2tUb3AoKXtyZXR1cm4gdGhpcy5SW3RoaXMuUi5sZW5ndGgtMV19RCgpe2NvbnN0IHQ9dGhpcy5nZXRTY29wZSgpLmNsb25lKCk7cmV0dXJuIHRoaXMuUi5wdXNoKHtjbGllbnQ6dGhpcy5nZXRDbGllbnQoKSxzY29wZTp0fSksdH1QKCl7cmV0dXJuISh0aGlzLlIubGVuZ3RoPD0xKSYmISF0aGlzLlIucG9wKCl9fWZ1bmN0aW9uIFEoKXtjb25zdCB0PW0oZCgpKTtyZXR1cm4gdC5zdGFjaz10LnN0YWNrfHxuZXcgcShnKCJkZWZhdWx0Q3VycmVudFNjb3BlIiwoKT0+bmV3IFYpLGcoImRlZmF1bHRJc29sYXRpb25TY29wZSIsKCk9Pm5ldyBWKSl9ZnVuY3Rpb24gWCh0KXtyZXR1cm4gUSgpLndpdGhTY29wZSh0KX1mdW5jdGlvbiB0dCh0LG4pe2NvbnN0IGU9USgpO3JldHVybiBlLndpdGhTY29wZSgoKT0+KGUuZ2V0U3RhY2tUb3AoKS5zY29wZT10LG4odCkpKX1mdW5jdGlvbiBudCh0KXtyZXR1cm4gUSgpLndpdGhTY29wZSgoKT0+dChRKCkuZ2V0SXNvbGF0aW9uU2NvcGUoKSkpfWZ1bmN0aW9uIGV0KHQpe2NvbnN0IG49bSh0KTtyZXR1cm4gbi5hY3M/bi5hY3M6e3dpdGhJc29sYXRpb25TY29wZTpudCx3aXRoU2NvcGU6WCx3aXRoU2V0U2NvcGU6dHQsd2l0aFNldElzb2xhdGlvblNjb3BlOih0LG4pPT5udChuKSxnZXRDdXJyZW50U2NvcGU6KCk9PlEoKS5nZXRTY29wZSgpLGdldElzb2xhdGlvblNjb3BlOigpPT5RKCkuZ2V0SXNvbGF0aW9uU2NvcGUoKX19ZnVuY3Rpb24gcnQoKXtyZXR1cm4gZXQoZCgpKS5nZXRDdXJyZW50U2NvcGUoKS5nZXRDbGllbnQoKX1mdW5jdGlvbiBvdCh0KXtyZXR1cm57c2NvcGU6dC5fc2VudHJ5U2NvcGUsaXNvbGF0aW9uU2NvcGU6dC5fc2VudHJ5SXNvbGF0aW9uU2NvcGV9fWNvbnN0IHN0PS9ec2VudHJ5LS87ZnVuY3Rpb24gaXQodCl7Y29uc3Qgbj1mdW5jdGlvbih0KXtpZighdHx8IWsodCkmJiFBcnJheS5pc0FycmF5KHQpKXJldHVybjtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiB0LnJlZHVjZSgodCxuKT0+e2NvbnN0IGU9Y3Qobik7cmV0dXJuIE9iamVjdC5lbnRyaWVzKGUpLmZvckVhY2goKFtuLGVdKT0+e3Rbbl09ZX0pLHR9LHt9KTtyZXR1cm4gY3QodCl9KHQpO2lmKCFuKXJldHVybjtjb25zdCBlPU9iamVjdC5lbnRyaWVzKG4pLnJlZHVjZSgodCxbbixlXSk9PntpZihuLm1hdGNoKHN0KSl7dFtuLnNsaWNlKDcpXT1lfXJldHVybiB0fSx7fSk7cmV0dXJuIE9iamVjdC5rZXlzKGUpLmxlbmd0aD4wP2U6dm9pZCAwfWZ1bmN0aW9uIGN0KHQpe3JldHVybiB0LnNwbGl0KCIsIikubWFwKHQ9PnQuc3BsaXQoIj0iKS5tYXAodD0+e3RyeXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHQudHJpbSgpKX1jYXRjaHtyZXR1cm59fSkpLnJlZHVjZSgodCxbbixlXSk9PihuJiZlJiYodFtuXT1lKSx0KSx7fSl9Y29uc3QgdXQ9L15vKFxkKylcLi87ZnVuY3Rpb24gYXQodCxuPSExKXtjb25zdHtob3N0OmUscGF0aDpyLHBhc3M6byxwb3J0OnMscHJvamVjdElkOmkscHJvdG9jb2w6YyxwdWJsaWNLZXk6dX09dDtyZXR1cm5gJHtjfTovLyR7dX0ke24mJm8/YDoke299YDoiIn1AJHtlfSR7cz9gOiR7c31gOiIifS8ke3I/YCR7cn0vYDpyfSR7aX1gfWZ1bmN0aW9uIGZ0KHQpe2NvbnN0IG49dC5nZXRPcHRpb25zKCkse2hvc3Q6ZX09dC5nZXREc24oKXx8e307bGV0IHI7cmV0dXJuIG4ub3JnSWQ/cj1TdHJpbmcobi5vcmdJZCk6ZSYmKHI9ZnVuY3Rpb24odCl7Y29uc3Qgbj10Lm1hdGNoKHV0KTtyZXR1cm4gbj8uWzFdfShlKSkscn1mdW5jdGlvbiBodCh0KXtjb25zdHtzcGFuSWQ6bix0cmFjZUlkOmUsaXNSZW1vdGU6cn09dC5zcGFuQ29udGV4dCgpLG89cj9uOm10KHQpLnBhcmVudF9zcGFuX2lkLHM9b3QodCkuc2NvcGU7cmV0dXJue3BhcmVudF9zcGFuX2lkOm8sc3Bhbl9pZDpyP3M/LmdldFByb3BhZ2F0aW9uQ29udGV4dCgpLnByb3BhZ2F0aW9uU3BhbklkfHxXKCk6bix0cmFjZV9pZDplfX1mdW5jdGlvbiBwdCh0KXtyZXR1cm4gdCYmdC5sZW5ndGg+MD90Lm1hcCgoe2NvbnRleHQ6e3NwYW5JZDp0LHRyYWNlSWQ6bix0cmFjZUZsYWdzOmUsLi4ucn0sYXR0cmlidXRlczpvfSk9Pih7c3Bhbl9pZDp0LHRyYWNlX2lkOm4sc2FtcGxlZDoxPT09ZSxhdHRyaWJ1dGVzOm8sLi4ucn0pKTp2b2lkIDB9ZnVuY3Rpb24gbHQodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P2R0KHQpOkFycmF5LmlzQXJyYXkodCk/dFswXSt0WzFdLzFlOTp0IGluc3RhbmNlb2YgRGF0ZT9kdCh0LmdldFRpbWUoKSk6RygpfWZ1bmN0aW9uIGR0KHQpe3JldHVybiB0Pjk5OTk5OTk5OTk/dC8xZTM6dH1mdW5jdGlvbiBtdCh0KXtpZihmdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdC5nZXRTcGFuSlNPTn0odCkpcmV0dXJuIHQuZ2V0U3BhbkpTT04oKTtjb25zdHtzcGFuSWQ6bix0cmFjZUlkOmV9PXQuc3BhbkNvbnRleHQoKTtpZihmdW5jdGlvbih0KXtjb25zdCBuPXQ7cmV0dXJuISEobi5hdHRyaWJ1dGVzJiZuLnN0YXJ0VGltZSYmbi5uYW1lJiZuLmVuZFRpbWUmJm4uc3RhdHVzKX0odCkpe2NvbnN0e2F0dHJpYnV0ZXM6cixzdGFydFRpbWU6byxuYW1lOnMsZW5kVGltZTppLHN0YXR1czpjLGxpbmtzOnV9PXQ7cmV0dXJue3NwYW5faWQ6bix0cmFjZV9pZDplLGRhdGE6cixkZXNjcmlwdGlvbjpzLHBhcmVudF9zcGFuX2lkOiJwYXJlbnRTcGFuSWQiaW4gdD90LnBhcmVudFNwYW5JZDoicGFyZW50U3BhbkNvbnRleHQiaW4gdD90LnBhcmVudFNwYW5Db250ZXh0Py5zcGFuSWQ6dm9pZCAwLHN0YXJ0X3RpbWVzdGFtcDpsdChvKSx0aW1lc3RhbXA6bHQoaSl8fHZvaWQgMCxzdGF0dXM6Z3QoYyksb3A6clsic2VudHJ5Lm9wIl0sb3JpZ2luOnJbInNlbnRyeS5vcmlnaW4iXSxsaW5rczpwdCh1KX19cmV0dXJue3NwYW5faWQ6bix0cmFjZV9pZDplLHN0YXJ0X3RpbWVzdGFtcDowLGRhdGE6e319fWZ1bmN0aW9uIGd0KHQpe2lmKHQmJjAhPT10LmNvZGUpcmV0dXJuIDE9PT10LmNvZGU/Im9rIjp0Lm1lc3NhZ2V8fCJ1bmtub3duX2Vycm9yIn1mdW5jdGlvbiB5dCh0KXtyZXR1cm4gdC5fc2VudHJ5Um9vdFNwYW58fHR9ZnVuY3Rpb24gYnQodCl7Y29uc3Qgbj1ydCgpO2lmKCFuKXJldHVybnt9O2NvbnN0IGU9eXQodCkscj1tdChlKSxvPXIuZGF0YSxzPWUuc3BhbkNvbnRleHQoKS50cmFjZVN0YXRlLGk9cz8uZ2V0KCJzZW50cnkuc2FtcGxlX3JhdGUiKT8/b1sic2VudHJ5LnNhbXBsZV9yYXRlIl0/P29bInNlbnRyeS5wcmV2aW91c190cmFjZV9zYW1wbGVfcmF0ZSJdO2Z1bmN0aW9uIGModCl7cmV0dXJuIm51bWJlciIhPXR5cGVvZiBpJiYic3RyaW5nIiE9dHlwZW9mIGl8fCh0LnNhbXBsZV9yYXRlPWAke2l9YCksdH1jb25zdCB1PWUuX2Zyb3plbkRzYztpZih1KXJldHVybiBjKHUpO2NvbnN0IGE9cz8uZ2V0KCJzZW50cnkuZHNjIiksZj1hJiZpdChhKTtpZihmKXJldHVybiBjKGYpO2NvbnN0IGg9ZnVuY3Rpb24odCxuKXtjb25zdCBlPW4uZ2V0T3B0aW9ucygpLHtwdWJsaWNLZXk6cn09bi5nZXREc24oKXx8e30sbz17ZW52aXJvbm1lbnQ6ZS5lbnZpcm9ubWVudHx8InByb2R1Y3Rpb24iLHJlbGVhc2U6ZS5yZWxlYXNlLHB1YmxpY19rZXk6cix0cmFjZV9pZDp0LG9yZ19pZDpmdChuKX07cmV0dXJuIG4uZW1pdCgiY3JlYXRlRHNjIixvKSxvfSh0LnNwYW5Db250ZXh0KCkudHJhY2VJZCxuKSxwPW9bInNlbnRyeS5zb3VyY2UiXSxsPXIuZGVzY3JpcHRpb247cmV0dXJuInVybCIhPT1wJiZsJiYoaC50cmFuc2FjdGlvbj1sKSxmdW5jdGlvbigpe2lmKCJib29sZWFuIj09dHlwZW9mIF9fU0VOVFJZX1RSQUNJTkdfXyYmIV9fU0VOVFJZX1RSQUNJTkdfXylyZXR1cm4hMTtjb25zdCB0PXJ0KCk/LmdldE9wdGlvbnMoKTtyZXR1cm4hKCF0fHxudWxsPT10LnRyYWNlc1NhbXBsZVJhdGUmJiF0LnRyYWNlc1NhbXBsZXIpfSgpJiYoaC5zYW1wbGVkPVN0cmluZyhmdW5jdGlvbih0KXtjb25zdHt0cmFjZUZsYWdzOm59PXQuc3BhbkNvbnRleHQoKTtyZXR1cm4gMT09PW59KGUpKSxoLnNhbXBsZV9yYW5kPXM/LmdldCgic2VudHJ5LnNhbXBsZV9yYW5kIik/P290KGUpLnNjb3BlPy5nZXRQcm9wYWdhdGlvbkNvbnRleHQoKS5zYW1wbGVSYW5kLnRvU3RyaW5nKCkpLGMoaCksbi5lbWl0KCJjcmVhdGVEc2MiLGgsZSksaH1mdW5jdGlvbiB2dCh0LG49MTAwLGU9MS8wKXt0cnl7cmV0dXJuIF90KCIiLHQsbixlKX1jYXRjaCh0KXtyZXR1cm57RVJST1I6YCoqbm9uLXNlcmlhbGl6YWJsZSoqICgke3R9KWB9fX1mdW5jdGlvbiBfdCh0LG4sZT0xLzAscj0xLzAsbz1mdW5jdGlvbigpe2NvbnN0IHQ9bmV3IFdlYWtTZXQ7ZnVuY3Rpb24gbihuKXtyZXR1cm4hIXQuaGFzKG4pfHwodC5hZGQobiksITEpfWZ1bmN0aW9uIGUobil7dC5kZWxldGUobil9cmV0dXJuW24sZV19KCkpe2NvbnN0W3MsaV09bztpZihudWxsPT1ufHxbImJvb2xlYW4iLCJzdHJpbmciXS5pbmNsdWRlcyh0eXBlb2Ygbil8fCJudW1iZXIiPT10eXBlb2YgbiYmTnVtYmVyLmlzRmluaXRlKG4pKXJldHVybiBuO2NvbnN0IGM9ZnVuY3Rpb24odCxuKXt0cnl7aWYoImRvbWFpbiI9PT10JiZuJiYib2JqZWN0Ij09dHlwZW9mIG4mJm4uVSlyZXR1cm4iW0RvbWFpbl0iO2lmKCJkb21haW5FbWl0dGVyIj09PXQpcmV0dXJuIltEb21haW5FbWl0dGVyXSI7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWwmJm49PT1nbG9iYWwpcmV0dXJuIltHbG9iYWxdIjtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmbj09PXdpbmRvdylyZXR1cm4iW1dpbmRvd10iO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQmJm49PT1kb2N1bWVudClyZXR1cm4iW0RvY3VtZW50XSI7aWYoIm9iamVjdCI9PXR5cGVvZihlPW4pJiZudWxsIT09ZSYmKGUuX19pc1Z1ZXx8ZS5NKSlyZXR1cm4iW1Z1ZVZpZXdNb2RlbF0iO2lmKGZ1bmN0aW9uKHQpe3JldHVybiBUKHQpJiYibmF0aXZlRXZlbnQiaW4gdCYmInByZXZlbnREZWZhdWx0ImluIHQmJiJzdG9wUHJvcGFnYXRpb24iaW4gdH0obikpcmV0dXJuIltTeW50aGV0aWNFdmVudF0iO2lmKCJudW1iZXIiPT10eXBlb2YgbiYmIU51bWJlci5pc0Zpbml0ZShuKSlyZXR1cm5gWyR7bn1dYDtpZigiZnVuY3Rpb24iPT10eXBlb2YgbilyZXR1cm5gW0Z1bmN0aW9uOiAke2Z1bmN0aW9uKHQpe3RyeXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQubmFtZXx8eH1jYXRjaHtyZXR1cm4geH19KG4pfV1gO2lmKCJzeW1ib2wiPT10eXBlb2YgbilyZXR1cm5gWyR7U3RyaW5nKG4pfV1gO2lmKCJiaWdpbnQiPT10eXBlb2YgbilyZXR1cm5gW0JpZ0ludDogJHtTdHJpbmcobil9XWA7Y29uc3Qgcj1mdW5jdGlvbih0KXtjb25zdCBuPU9iamVjdC5nZXRQcm90b3R5cGVPZih0KTtyZXR1cm4gbj8uY29uc3RydWN0b3I/bi5jb25zdHJ1Y3Rvci5uYW1lOiJudWxsIHByb3RvdHlwZSJ9KG4pO3JldHVybi9eSFRNTChcdyopRWxlbWVudCQvLnRlc3Qocik/YFtIVE1MRWxlbWVudDogJHtyfV1gOmBbb2JqZWN0ICR7cn1dYH1jYXRjaCh0KXtyZXR1cm5gKipub24tc2VyaWFsaXphYmxlKiogKCR7dH0pYH12YXIgZX0odCxuKTtpZighYy5zdGFydHNXaXRoKCJbb2JqZWN0ICIpKXJldHVybiBjO2lmKG4uX19zZW50cnlfc2tpcF9ub3JtYWxpemF0aW9uX18pcmV0dXJuIG47Y29uc3QgdT0ibnVtYmVyIj09dHlwZW9mIG4uX19zZW50cnlfb3ZlcnJpZGVfbm9ybWFsaXphdGlvbl9kZXB0aF9fP24uX19zZW50cnlfb3ZlcnJpZGVfbm9ybWFsaXphdGlvbl9kZXB0aF9fOmU7aWYoMD09PXUpcmV0dXJuIGMucmVwbGFjZSgib2JqZWN0ICIsIiIpO2lmKHMobikpcmV0dXJuIltDaXJjdWxhciB+XSI7Y29uc3QgYT1uO2lmKGEmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLnRvSlNPTil0cnl7cmV0dXJuIF90KCIiLGEudG9KU09OKCksdS0xLHIsbyl9Y2F0Y2h7fWNvbnN0IGY9QXJyYXkuaXNBcnJheShuKT9bXTp7fTtsZXQgaD0wO2NvbnN0IHA9RChuKTtmb3IoY29uc3QgdCBpbiBwKXtpZighT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHAsdCkpY29udGludWU7aWYoaD49cil7Zlt0XT0iW01heFByb3BlcnRpZXMgfl0iO2JyZWFrfWNvbnN0IG49cFt0XTtmW3RdPV90KHQsbix1LTEscixvKSxoKyt9cmV0dXJuIGkobiksZn1mdW5jdGlvbiB3dCh0LG4pe2NvbnN0IGU9bi5yZXBsYWNlKC9cXC9nLCIvIikucmVwbGFjZSgvW3xcXHt9KClbXF1eJCsqPy5dL2csIlxcJCYiKTtsZXQgcj10O3RyeXtyPWRlY29kZVVSSSh0KX1jYXRjaHt9cmV0dXJuIHIucmVwbGFjZSgvXFwvZywiLyIpLnJlcGxhY2UoL3dlYnBhY2s6XC8/L2csIiIpLnJlcGxhY2UobmV3IFJlZ0V4cChgKGZpbGU6Ly8pPy8qJHtlfS8qYCwiaWciKSwiYXBwOi8vLyIpfWZ1bmN0aW9uIFN0KHQsbj1bXSl7cmV0dXJuW3Qsbl19ZnVuY3Rpb24gJHQodCxuKXtjb25zdCBlPXRbMV07Zm9yKGNvbnN0IHQgb2YgZSl7aWYobih0LHRbMF0udHlwZSkpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gRXQodCl7Y29uc3Qgbj1tKHApO3JldHVybiBuLmVuY29kZVBvbHlmaWxsP24uZW5jb2RlUG9seWZpbGwodCk6KG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKHQpfWZ1bmN0aW9uIHh0KHQpe2NvbnN0W24sZV09dDtsZXQgcj1KU09OLnN0cmluZ2lmeShuKTtmdW5jdGlvbiBvKHQpeyJzdHJpbmciPT10eXBlb2Ygcj9yPSJzdHJpbmciPT10eXBlb2YgdD9yK3Q6W0V0KHIpLHRdOnIucHVzaCgic3RyaW5nIj09dHlwZW9mIHQ/RXQodCk6dCl9Zm9yKGNvbnN0IHQgb2YgZSl7Y29uc3RbbixlXT10O2lmKG8oYFxuJHtKU09OLnN0cmluZ2lmeShuKX1cbmApLCJzdHJpbmciPT10eXBlb2YgZXx8ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpbyhlKTtlbHNle2xldCB0O3RyeXt0PUpTT04uc3RyaW5naWZ5KGUpfWNhdGNoe3Q9SlNPTi5zdHJpbmdpZnkodnQoZSkpfW8odCl9fXJldHVybiJzdHJpbmciPT10eXBlb2Ygcj9yOmZ1bmN0aW9uKHQpe2NvbnN0IG49dC5yZWR1Y2UoKHQsbik9PnQrbi5sZW5ndGgsMCksZT1uZXcgVWludDhBcnJheShuKTtsZXQgcj0wO2Zvcihjb25zdCBuIG9mIHQpZS5zZXQobixyKSxyKz1uLmxlbmd0aDtyZXR1cm4gZX0ocil9Y29uc3QgTnQ9e3Nlc3Npb246InNlc3Npb24iLHNlc3Npb25zOiJzZXNzaW9uIixhdHRhY2htZW50OiJhdHRhY2htZW50Iix0cmFuc2FjdGlvbjoidHJhbnNhY3Rpb24iLGV2ZW50OiJlcnJvciIsY2xpZW50X3JlcG9ydDoiaW50ZXJuYWwiLHVzZXJfcmVwb3J0OiJkZWZhdWx0Iixwcm9maWxlOiJwcm9maWxlIixwcm9maWxlX2NodW5rOiJwcm9maWxlIixyZXBsYXlfZXZlbnQ6InJlcGxheSIscmVwbGF5X3JlY29yZGluZzoicmVwbGF5IixjaGVja19pbjoibW9uaXRvciIsZmVlZGJhY2s6ImZlZWRiYWNrIixzcGFuOiJzcGFuIixyYXdfc2VjdXJpdHk6InNlY3VyaXR5Iixsb2c6ImxvZ19pdGVtIn07ZnVuY3Rpb24gQ3QodCl7aWYoIXQ/LnNkaylyZXR1cm47Y29uc3R7bmFtZTpuLHZlcnNpb246ZX09dC5zZGs7cmV0dXJue25hbWU6bix2ZXJzaW9uOmV9fWZ1bmN0aW9uIGt0KHQsbixlLHIpe2NvbnN0IG89Q3QoZSkscz10LnR5cGUmJiJyZXBsYXlfZXZlbnQiIT09dC50eXBlP3QudHlwZToiZXZlbnQiOyFmdW5jdGlvbih0LG4pe2lmKCFuKXJldHVybiB0O2NvbnN0IGU9dC5zZGt8fHt9O3Quc2RrPXsuLi5lLG5hbWU6ZS5uYW1lfHxuLm5hbWUsdmVyc2lvbjplLnZlcnNpb258fG4udmVyc2lvbixpbnRlZ3JhdGlvbnM6Wy4uLnQuc2RrPy5pbnRlZ3JhdGlvbnN8fFtdLC4uLm4uaW50ZWdyYXRpb25zfHxbXV0scGFja2FnZXM6Wy4uLnQuc2RrPy5wYWNrYWdlc3x8W10sLi4ubi5wYWNrYWdlc3x8W11dLHNldHRpbmdzOnQuc2RrPy5zZXR0aW5nc3x8bi5zZXR0aW5ncz97Li4udC5zZGs/LnNldHRpbmdzLC4uLm4uc2V0dGluZ3N9OnZvaWQgMH19KHQsZT8uc2RrKTtjb25zdCBpPWZ1bmN0aW9uKHQsbixlLHIpe2NvbnN0IG89dC5zZGtQcm9jZXNzaW5nTWV0YWRhdGE/LmR5bmFtaWNTYW1wbGluZ0NvbnRleHQ7cmV0dXJue2V2ZW50X2lkOnQuZXZlbnRfaWQsc2VudF9hdDoobmV3IERhdGUpLnRvSVNPU3RyaW5nKCksLi4ubiYme3NkazpufSwuLi4hIWUmJnImJntkc246YXQocil9LC4uLm8mJnt0cmFjZTpvfX19KHQsbyxyLG4pO2RlbGV0ZSB0LnNka1Byb2Nlc3NpbmdNZXRhZGF0YTtyZXR1cm4gU3QoaSxbW3t0eXBlOnN9LHRdXSl9Y29uc3QgVHQ9Il9fU0VOVFJZX1NVUFBSRVNTX1RSQUNJTkdfXyI7ZnVuY3Rpb24ganQodCl7Y29uc3Qgbj1ldChkKCkpO3JldHVybiBuLnN1cHByZXNzVHJhY2luZz9uLnN1cHByZXNzVHJhY2luZyh0KTpmdW5jdGlvbiguLi50KXtjb25zdCBuPWV0KGQoKSk7aWYoMj09PXQubGVuZ3RoKXtjb25zdFtlLHJdPXQ7cmV0dXJuIGU/bi53aXRoU2V0U2NvcGUoZSxyKTpuLndpdGhTY29wZShyKX1yZXR1cm4gbi53aXRoU2NvcGUodFswXSl9KG49PntuLnNldFNES1Byb2Nlc3NpbmdNZXRhZGF0YSh7W1R0XTohMH0pO2NvbnN0IGU9dCgpO3JldHVybiBuLnNldFNES1Byb2Nlc3NpbmdNZXRhZGF0YSh7W1R0XTp2b2lkIDB9KSxlfSl9ZnVuY3Rpb24gSXQodCl7cmV0dXJuIG5ldyBPdChuPT57bih0KX0pfWNsYXNzIE90e2NvbnN0cnVjdG9yKHQpe3RoaXMuTD0wLHRoaXMuQj1bXSx0aGlzLkcodCl9dGhlbih0LG4pe3JldHVybiBuZXcgT3QoKGUscik9Pnt0aGlzLkIucHVzaChbITEsbj0+e2lmKHQpdHJ5e2UodChuKSl9Y2F0Y2godCl7cih0KX1lbHNlIGUobil9LHQ9PntpZihuKXRyeXtlKG4odCkpfWNhdGNoKHQpe3IodCl9ZWxzZSByKHQpfV0pLHRoaXMuSCgpfSl9Y2F0Y2godCl7cmV0dXJuIHRoaXMudGhlbih0PT50LHQpfWZpbmFsbHkodCl7cmV0dXJuIG5ldyBPdCgobixlKT0+e2xldCByLG87cmV0dXJuIHRoaXMudGhlbihuPT57bz0hMSxyPW4sdCYmdCgpfSxuPT57bz0hMCxyPW4sdCYmdCgpfSkudGhlbigoKT0+e28/ZShyKTpuKHIpfSl9KX1IKCl7aWYoMD09PXRoaXMuTClyZXR1cm47Y29uc3QgdD10aGlzLkIuc2xpY2UoKTt0aGlzLkI9W10sdC5mb3JFYWNoKHQ9Pnt0WzBdfHwoMT09PXRoaXMuTCYmdFsxXSh0aGlzLkopLDI9PT10aGlzLkwmJnRbMl0odGhpcy5KKSx0WzBdPSEwKX0pfUcodCl7Y29uc3Qgbj0odCxuKT0+ezA9PT10aGlzLkwmJihqKG4pP24udGhlbihlLHIpOih0aGlzLkw9dCx0aGlzLko9bix0aGlzLkgoKSkpfSxlPXQ9PntuKDEsdCl9LHI9dD0+e24oMix0KX07dHJ5e3QoZSxyKX1jYXRjaCh0KXtyKHQpfX19ZnVuY3Rpb24gUnQodCxuKXtjb25zdHtmaW5nZXJwcmludDplLHNwYW46cixicmVhZGNydW1iczpvLHNka1Byb2Nlc3NpbmdNZXRhZGF0YTpzfT1uOyFmdW5jdGlvbih0LG4pe2NvbnN0e2V4dHJhOmUsdGFnczpyLHVzZXI6byxjb250ZXh0czpzLGxldmVsOmksdHJhbnNhY3Rpb25OYW1lOmN9PW47T2JqZWN0LmtleXMoZSkubGVuZ3RoJiYodC5leHRyYT17Li4uZSwuLi50LmV4dHJhfSk7T2JqZWN0LmtleXMocikubGVuZ3RoJiYodC50YWdzPXsuLi5yLC4uLnQudGFnc30pO09iamVjdC5rZXlzKG8pLmxlbmd0aCYmKHQudXNlcj17Li4ubywuLi50LnVzZXJ9KTtPYmplY3Qua2V5cyhzKS5sZW5ndGgmJih0LmNvbnRleHRzPXsuLi5zLC4uLnQuY29udGV4dHN9KTtpJiYodC5sZXZlbD1pKTtjJiYidHJhbnNhY3Rpb24iIT09dC50eXBlJiYodC50cmFuc2FjdGlvbj1jKX0odCxuKSxyJiZmdW5jdGlvbih0LG4pe3QuY29udGV4dHM9e3RyYWNlOmh0KG4pLC4uLnQuY29udGV4dHN9LHQuc2RrUHJvY2Vzc2luZ01ldGFkYXRhPXtkeW5hbWljU2FtcGxpbmdDb250ZXh0OmJ0KG4pLC4uLnQuc2RrUHJvY2Vzc2luZ01ldGFkYXRhfTtjb25zdCBlPXl0KG4pLHI9bXQoZSkuZGVzY3JpcHRpb247ciYmIXQudHJhbnNhY3Rpb24mJiJ0cmFuc2FjdGlvbiI9PT10LnR5cGUmJih0LnRyYW5zYWN0aW9uPXIpfSh0LHIpLGZ1bmN0aW9uKHQsbil7dC5maW5nZXJwcmludD10LmZpbmdlcnByaW50P0FycmF5LmlzQXJyYXkodC5maW5nZXJwcmludCk/dC5maW5nZXJwcmludDpbdC5maW5nZXJwcmludF06W10sbiYmKHQuZmluZ2VycHJpbnQ9dC5maW5nZXJwcmludC5jb25jYXQobikpO3QuZmluZ2VycHJpbnQubGVuZ3RofHxkZWxldGUgdC5maW5nZXJwcmludH0odCxlKSxmdW5jdGlvbih0LG4pe2NvbnN0IGU9Wy4uLnQuYnJlYWRjcnVtYnN8fFtdLC4uLm5dO3QuYnJlYWRjcnVtYnM9ZS5sZW5ndGg/ZTp2b2lkIDB9KHQsbyksZnVuY3Rpb24odCxuKXt0LnNka1Byb2Nlc3NpbmdNZXRhZGF0YT17Li4udC5zZGtQcm9jZXNzaW5nTWV0YWRhdGEsLi4ubn19KHQscyl9Y29uc3QgQXQ9U3ltYm9sLmZvcigiU2VudHJ5QnVmZmVyRnVsbEVycm9yIik7ZnVuY3Rpb24gRHQodCl7Y29uc3Qgbj1bXTtmdW5jdGlvbiBlKHQpe3JldHVybiBuLnNwbGljZShuLmluZGV4T2YodCksMSlbMF18fFByb21pc2UucmVzb2x2ZSh2b2lkIDApfXJldHVybnskOm4sYWRkOmZ1bmN0aW9uKHIpe2lmKCEodm9pZCAwPT09dHx8bi5sZW5ndGg8dCkpcmV0dXJuIG89QXQsbmV3IE90KCh0LG4pPT57bihvKX0pO3ZhciBvO2NvbnN0IHM9cigpO3JldHVybi0xPT09bi5pbmRleE9mKHMpJiZuLnB1c2gocykscy50aGVuKCgpPT5lKHMpKS50aGVuKG51bGwsKCk9PmUocykudGhlbihudWxsLCgpPT57fSkpLHN9LGRyYWluOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgT3QoKGUscik9PntsZXQgbz1uLmxlbmd0aDtpZighbylyZXR1cm4gZSghMCk7Y29uc3Qgcz1zZXRUaW1lb3V0KCgpPT57dCYmdD4wJiZlKCExKX0sdCk7bi5mb3JFYWNoKHQ9PntJdCh0KS50aGVuKCgpPT57LS1vfHwoY2xlYXJUaW1lb3V0KHMpLGUoITApKX0scil9KX0pfX19ZnVuY3Rpb24gUHQodCx7c3RhdHVzQ29kZTpuLGhlYWRlcnM6ZX0scj1EYXRlLm5vdygpKXtjb25zdCBvPXsuLi50fSxzPWU/LlsieC1zZW50cnktcmF0ZS1saW1pdHMiXSxpPWU/LlsicmV0cnktYWZ0ZXIiXTtpZihzKWZvcihjb25zdCB0IG9mIHMudHJpbSgpLnNwbGl0KCIsIikpe2NvbnN0W24sZSwsLHNdPXQuc3BsaXQoIjoiLDUpLGk9cGFyc2VJbnQobiwxMCksYz0xZTMqKGlzTmFOKGkpPzYwOmkpO2lmKGUpZm9yKGNvbnN0IHQgb2YgZS5zcGxpdCgiOyIpKSJtZXRyaWNfYnVja2V0Ij09PXQmJnMmJiFzLnNwbGl0KCI7IikuaW5jbHVkZXMoImN1c3RvbSIpfHwob1t0XT1yK2MpO2Vsc2Ugby5hbGw9citjfWVsc2UgaT9vLmFsbD1yK2Z1bmN0aW9uKHQsbj1EYXRlLm5vdygpKXtjb25zdCBlPXBhcnNlSW50KGAke3R9YCwxMCk7aWYoIWlzTmFOKGUpKXJldHVybiAxZTMqZTtjb25zdCByPURhdGUucGFyc2UoYCR7dH1gKTtyZXR1cm4gaXNOYU4ocik/NmU0OnItbn0oaSxyKTo0Mjk9PT1uJiYoby5hbGw9cis2ZTQpO3JldHVybiBvfWZ1bmN0aW9uIFV0KHQsbixlPUR0KHQuYnVmZmVyU2l6ZXx8NjQpKXtsZXQgcj17fTtyZXR1cm57c2VuZDpmdW5jdGlvbih0KXtjb25zdCBvPVtdO2lmKCR0KHQsKHQsbik9Pntjb25zdCBlPWZ1bmN0aW9uKHQpe3JldHVybiBOdFt0XX0obik7KGZ1bmN0aW9uKHQsbixlPURhdGUubm93KCkpe3JldHVybiBmdW5jdGlvbih0LG4pe3JldHVybiB0W25dfHx0LmFsbHx8MH0odCxuKT5lfSkocixlKXx8by5wdXNoKHQpfSksMD09PW8ubGVuZ3RoKXJldHVybiBJdCh7fSk7Y29uc3Qgcz1TdCh0WzBdLG8pLGk9dD0+eyR0KHMsKHQsbik9Pnt9KX07cmV0dXJuIGUuYWRkKCgpPT5uKHtib2R5Onh0KHMpfSkudGhlbih0PT4odm9pZCAwIT09dC5zdGF0dXNDb2RlJiYodC5zdGF0dXNDb2RlPDIwMHx8dC5zdGF0dXNDb2RlPj0zMDApJiZoJiZTLndhcm4oYFNlbnRyeSByZXNwb25kZWQgd2l0aCBzdGF0dXMgY29kZSAke3Quc3RhdHVzQ29kZX0gdG8gc2VudCBldmVudC5gKSxyPVB0KHIsdCksdCksdD0+e3Rocm93IGkoKSxoJiZTLmVycm9yKCJFbmNvdW50ZXJlZCBlcnJvciBydW5uaW5nIHRyYW5zcG9ydCByZXF1ZXN0OiIsdCksdH0pKS50aGVuKHQ9PnQsdD0+e2lmKHQ9PT1BdClyZXR1cm4gaCYmUy5lcnJvcigiU2tpcHBlZCBzZW5kaW5nIGV2ZW50IGJlY2F1c2UgYnVmZmVyIGlzIGZ1bGwuIiksaSgpLEl0KHt9KTt0aHJvdyB0fSl9LGZsdXNoOnQ9PmUuZHJhaW4odCl9fWNvbnN0IE10PS9eKFxTKzpcXHxcLz8pKFtcc1xTXSo/KSgoPzpcLnsxLDJ9fFteL1xcXSs/fCkoXC5bXi4vXFxdKnwpKSg/OlsvXFxdKikkLztmdW5jdGlvbiBMdCh0KXtjb25zdCBuPWZ1bmN0aW9uKHQpe2NvbnN0IG49dC5sZW5ndGg+MTAyND9gPHRydW5jYXRlZD4ke3Quc2xpY2UoLTEwMjQpfWA6dCxlPU10LmV4ZWMobik7cmV0dXJuIGU/ZS5zbGljZSgxKTpbXX0odCksZT1uWzBdfHwiIjtsZXQgcj1uWzFdO3JldHVybiBlfHxyPyhyJiYocj1yLnNsaWNlKDAsci5sZW5ndGgtMSkpLGUrcik6Ii4ifWZ1bmN0aW9uIEJ0KHQsbj0hMSl7cmV0dXJuIShufHx0JiYhdC5zdGFydHNXaXRoKCIvIikmJiF0Lm1hdGNoKC9eW0EtWl06LykmJiF0LnN0YXJ0c1dpdGgoIi4iKSYmIXQubWF0Y2goL15bYS16QS1aXShbYS16QS1aMC05LlwtK10pKjpcL1wvLykpJiZ2b2lkIDAhPT10JiYhdC5pbmNsdWRlcygibm9kZV9tb2R1bGVzLyIpfWNvbnN0IEd0PVN5bWJvbCgiQWdlbnRCYXNlSW50ZXJuYWxTdGF0ZSIpO2NsYXNzIEh0IGV4dGVuZHMgcy5BZ2VudHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzW0d0XT17fX1pc1NlY3VyZUVuZHBvaW50KHQpe2lmKHQpe2lmKCJib29sZWFuIj09dHlwZW9mIHQuc2VjdXJlRW5kcG9pbnQpcmV0dXJuIHQuc2VjdXJlRW5kcG9pbnQ7aWYoInN0cmluZyI9PXR5cGVvZiB0LnByb3RvY29sKXJldHVybiJodHRwczoiPT09dC5wcm90b2NvbH1jb25zdHtzdGFjazpufT1uZXcgRXJyb3I7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBuJiZuLnNwbGl0KCJcbiIpLnNvbWUodD0+LTEhPT10LmluZGV4T2YoIihodHRwcy5qczoiKXx8LTEhPT10LmluZGV4T2YoIm5vZGU6aHR0cHM6IikpfWNyZWF0ZVNvY2tldCh0LG4sZSl7Y29uc3Qgcj17Li4ubixzZWN1cmVFbmRwb2ludDp0aGlzLmlzU2VjdXJlRW5kcG9pbnQobil9O1Byb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PnRoaXMuY29ubmVjdCh0LHIpKS50aGVuKG89PntpZihvIGluc3RhbmNlb2Ygcy5BZ2VudClyZXR1cm4gby5hZGRSZXF1ZXN0KHQscik7dGhpc1tHdF0uY3VycmVudFNvY2tldD1vLHN1cGVyLmNyZWF0ZVNvY2tldCh0LG4sZSl9LGUpfWNyZWF0ZUNvbm5lY3Rpb24oKXtjb25zdCB0PXRoaXNbR3RdLmN1cnJlbnRTb2NrZXQ7aWYodGhpc1tHdF0uY3VycmVudFNvY2tldD12b2lkIDAsIXQpdGhyb3cgbmV3IEVycm9yKCJObyBzb2NrZXQgd2FzIHJldHVybmVkIGluIHRoZSBgY29ubmVjdCgpYCBmdW5jdGlvbiIpO3JldHVybiB0fWdldCBkZWZhdWx0UG9ydCgpe3JldHVybiB0aGlzW0d0XS5kZWZhdWx0UG9ydD8/KCJodHRwczoiPT09dGhpcy5wcm90b2NvbD80NDM6ODApfXNldCBkZWZhdWx0UG9ydCh0KXt0aGlzW0d0XSYmKHRoaXNbR3RdLmRlZmF1bHRQb3J0PXQpfWdldCBwcm90b2NvbCgpe3JldHVybiB0aGlzW0d0XS5wcm90b2NvbD8/KHRoaXMuaXNTZWN1cmVFbmRwb2ludCgpPyJodHRwczoiOiJodHRwOiIpfXNldCBwcm90b2NvbCh0KXt0aGlzW0d0XSYmKHRoaXNbR3RdLnByb3RvY29sPXQpfX1mdW5jdGlvbiBKdCguLi50KXtTLmxvZygiW2h0dHBzLXByb3h5LWFnZW50OnBhcnNlLXByb3h5LXJlc3BvbnNlXSIsLi4udCl9ZnVuY3Rpb24genQodCl7cmV0dXJuIG5ldyBQcm9taXNlKChuLGUpPT57bGV0IHI9MDtjb25zdCBvPVtdO2Z1bmN0aW9uIHMoKXtjb25zdCBjPXQucmVhZCgpO2M/ZnVuY3Rpb24oYyl7by5wdXNoKGMpLHIrPWMubGVuZ3RoO2NvbnN0IHU9QnVmZmVyLmNvbmNhdChvLHIpLGE9dS5pbmRleE9mKCJcclxuXHJcbiIpO2lmKC0xPT09YSlyZXR1cm4gSnQoImhhdmUgbm90IHJlY2VpdmVkIGVuZCBvZiBIVFRQIGhlYWRlcnMgeWV0Li4uIiksdm9pZCBzKCk7Y29uc3QgZj11LnN1YmFycmF5KDAsYSkudG9TdHJpbmcoImFzY2lpIikuc3BsaXQoIlxyXG4iKSxoPWYuc2hpZnQoKTtpZighaClyZXR1cm4gdC5kZXN0cm95KCksZShuZXcgRXJyb3IoIk5vIGhlYWRlciByZWNlaXZlZCBmcm9tIHByb3h5IENPTk5FQ1QgcmVzcG9uc2UiKSk7Y29uc3QgcD1oLnNwbGl0KCIgIiksbD0rKHBbMV18fDApLGQ9cC5zbGljZSgyKS5qb2luKCIgIiksbT17fTtmb3IoY29uc3QgbiBvZiBmKXtpZighbiljb250aW51ZTtjb25zdCByPW4uaW5kZXhPZigiOiIpO2lmKC0xPT09cilyZXR1cm4gdC5kZXN0cm95KCksZShuZXcgRXJyb3IoYEludmFsaWQgaGVhZGVyIGZyb20gcHJveHkgQ09OTkVDVCByZXNwb25zZTogIiR7bn0iYCkpO2NvbnN0IG89bi5zbGljZSgwLHIpLnRvTG93ZXJDYXNlKCkscz1uLnNsaWNlKHIrMSkudHJpbVN0YXJ0KCksaT1tW29dOyJzdHJpbmciPT10eXBlb2YgaT9tW29dPVtpLHNdOkFycmF5LmlzQXJyYXkoaSk/aS5wdXNoKHMpOm1bb109c31KdCgiZ290IHByb3h5IHNlcnZlciByZXNwb25zZTogJW8gJW8iLGgsbSksaSgpLG4oe2Nvbm5lY3Q6e3N0YXR1c0NvZGU6bCxzdGF0dXNUZXh0OmQsaGVhZGVyczptfSxidWZmZXJlZDp1fSl9KGMpOnQub25jZSgicmVhZGFibGUiLHMpfWZ1bmN0aW9uIGkoKXt0LnJlbW92ZUxpc3RlbmVyKCJlbmQiLGMpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIix1KSx0LnJlbW92ZUxpc3RlbmVyKCJyZWFkYWJsZSIscyl9ZnVuY3Rpb24gYygpe2koKSxKdCgib25lbmQiKSxlKG5ldyBFcnJvcigiUHJveHkgY29ubmVjdGlvbiBlbmRlZCBiZWZvcmUgcmVjZWl2aW5nIENPTk5FQ1QgcmVzcG9uc2UiKSl9ZnVuY3Rpb24gdSh0KXtpKCksSnQoIm9uZXJyb3IgJW8iLHQpLGUodCl9dC5vbigiZXJyb3IiLHUpLHQub24oImVuZCIsYykscygpfSl9ZnVuY3Rpb24gRnQoLi4udCl7Uy5sb2coIltodHRwcy1wcm94eS1hZ2VudF0iLC4uLnQpfWNsYXNzIFd0IGV4dGVuZHMgSHR7c3RhdGljIF9faW5pdFN0YXRpYygpe3RoaXMucHJvdG9jb2xzPVsiaHR0cCIsImh0dHBzIl19Y29uc3RydWN0b3IodCxuKXtzdXBlcihuKSx0aGlzLm9wdGlvbnM9e30sdGhpcy5wcm94eT0ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IFVSTCh0KTp0LHRoaXMucHJveHlIZWFkZXJzPW4/LmhlYWRlcnM/P3t9LEZ0KCJDcmVhdGluZyBuZXcgSHR0cHNQcm94eUFnZW50IGluc3RhbmNlOiAlbyIsdGhpcy5wcm94eS5ocmVmKTtjb25zdCBlPSh0aGlzLnByb3h5Lmhvc3RuYW1lfHx0aGlzLnByb3h5Lmhvc3QpLnJlcGxhY2UoL15cW3xcXSQvZywiIikscj10aGlzLnByb3h5LnBvcnQ/cGFyc2VJbnQodGhpcy5wcm94eS5wb3J0LDEwKToiaHR0cHM6Ij09PXRoaXMucHJveHkucHJvdG9jb2w/NDQzOjgwO3RoaXMuY29ubmVjdE9wdHM9e0FMUE5Qcm90b2NvbHM6WyJodHRwLzEuMSJdLC4uLm4/S3QobiwiaGVhZGVycyIpOm51bGwsaG9zdDplLHBvcnQ6cn19YXN5bmMgY29ubmVjdCh0LG4pe2NvbnN0e3Byb3h5OmV9PXRoaXM7aWYoIW4uaG9zdCl0aHJvdyBuZXcgVHlwZUVycm9yKCdObyAiaG9zdCIgcHJvdmlkZWQnKTtsZXQgcjtpZigiaHR0cHM6Ij09PWUucHJvdG9jb2wpe0Z0KCJDcmVhdGluZyBgdGxzLlNvY2tldGA6ICVvIix0aGlzLmNvbm5lY3RPcHRzKTtjb25zdCB0PXRoaXMuY29ubmVjdE9wdHMuc2VydmVybmFtZXx8dGhpcy5jb25uZWN0T3B0cy5ob3N0O3I9Zi5jb25uZWN0KHsuLi50aGlzLmNvbm5lY3RPcHRzLHNlcnZlcm5hbWU6dCYmYS5pc0lQKHQpP3ZvaWQgMDp0fSl9ZWxzZSBGdCgiQ3JlYXRpbmcgYG5ldC5Tb2NrZXRgOiAlbyIsdGhpcy5jb25uZWN0T3B0cykscj1hLmNvbm5lY3QodGhpcy5jb25uZWN0T3B0cyk7Y29uc3Qgbz0iZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wcm94eUhlYWRlcnM/dGhpcy5wcm94eUhlYWRlcnMoKTp7Li4udGhpcy5wcm94eUhlYWRlcnN9LHM9YS5pc0lQdjYobi5ob3N0KT9gWyR7bi5ob3N0fV1gOm4uaG9zdDtsZXQgaT1gQ09OTkVDVCAke3N9OiR7bi5wb3J0fSBIVFRQLzEuMVxyXG5gO2lmKGUudXNlcm5hbWV8fGUucGFzc3dvcmQpe2NvbnN0IHQ9YCR7ZGVjb2RlVVJJQ29tcG9uZW50KGUudXNlcm5hbWUpfToke2RlY29kZVVSSUNvbXBvbmVudChlLnBhc3N3b3JkKX1gO29bIlByb3h5LUF1dGhvcml6YXRpb24iXT1gQmFzaWMgJHtCdWZmZXIuZnJvbSh0KS50b1N0cmluZygiYmFzZTY0Iil9YH1vLkhvc3Q9YCR7c306JHtuLnBvcnR9YCxvWyJQcm94eS1Db25uZWN0aW9uIl18fChvWyJQcm94eS1Db25uZWN0aW9uIl09dGhpcy5rZWVwQWxpdmU/IktlZXAtQWxpdmUiOiJjbG9zZSIpO2Zvcihjb25zdCB0IG9mIE9iamVjdC5rZXlzKG8pKWkrPWAke3R9OiAke29bdF19XHJcbmA7Y29uc3QgYz16dChyKTtyLndyaXRlKGAke2l9XHJcbmApO2NvbnN0e2Nvbm5lY3Q6dSxidWZmZXJlZDpofT1hd2FpdCBjO2lmKHQuZW1pdCgicHJveHlDb25uZWN0Iix1KSx0aGlzLmVtaXQoInByb3h5Q29ubmVjdCIsdSx0KSwyMDA9PT11LnN0YXR1c0NvZGUpe2lmKHQub25jZSgic29ja2V0IixZdCksbi5zZWN1cmVFbmRwb2ludCl7RnQoIlVwZ3JhZGluZyBzb2NrZXQgY29ubmVjdGlvbiB0byBUTFMiKTtjb25zdCB0PW4uc2VydmVybmFtZXx8bi5ob3N0O3JldHVybiBmLmNvbm5lY3Qoey4uLkt0KG4sImhvc3QiLCJwYXRoIiwicG9ydCIpLHNvY2tldDpyLHNlcnZlcm5hbWU6YS5pc0lQKHQpP3ZvaWQgMDp0fSl9cmV0dXJuIHJ9ci5kZXN0cm95KCk7Y29uc3QgcD1uZXcgYS5Tb2NrZXQoe3dyaXRhYmxlOiExfSk7cmV0dXJuIHAucmVhZGFibGU9ITAsdC5vbmNlKCJzb2NrZXQiLHQ9PntGdCgiUmVwbGF5aW5nIHByb3h5IGJ1ZmZlciBmb3IgZmFpbGVkIHJlcXVlc3QiKSx0LnB1c2goaCksdC5wdXNoKG51bGwpfSkscH19ZnVuY3Rpb24gWXQodCl7dC5yZXN1bWUoKX1mdW5jdGlvbiBLdCh0LC4uLm4pe2NvbnN0IGU9e307bGV0IHI7Zm9yKHIgaW4gdCluLmluY2x1ZGVzKHIpfHwoZVtyXT10W3JdKTtyZXR1cm4gZX1XdC5fX2luaXRTdGF0aWMoKTtmdW5jdGlvbiBadCh0KXtyZXR1cm4gdC5yZXBsYWNlKC9eW0EtWl06LywiIikucmVwbGFjZSgvXFwvZywiLyIpfWNvbnN0IFZ0PW47bGV0IHF0LFF0PTAsWHQ9e307ZnVuY3Rpb24gdG4odCl7VnQuZGVidWcmJmNvbnNvbGUubG9nKGBbQU5SIFdvcmtlcl0gJHt0fWApfXZhciBubixlbixybjtjb25zdCBvbj1mdW5jdGlvbih0KXtsZXQgbjt0cnl7bj1uZXcgVVJMKHQudXJsKX1jYXRjaChuKXtyZXR1cm4gYigoKT0+e2NvbnNvbGUud2FybigiW0BzZW50cnkvbm9kZV06IEludmFsaWQgZHNuIG9yIHR1bm5lbCBvcHRpb24sIHdpbGwgbm90IHNlbmQgYW55IGV2ZW50cy4gVGhlIHR1bm5lbCBvcHRpb24gbXVzdCBiZSBhIGZ1bGwgVVJMIHdoZW4gdXNlZC4iKX0pLFV0KHQsKCk9PlByb21pc2UucmVzb2x2ZSh7fSkpfWNvbnN0IGU9Imh0dHBzOiI9PT1uLnByb3RvY29sLHI9ZnVuY3Rpb24odCxuKXtjb25zdHtub19wcm94eTplfT1wcm9jZXNzLmVudixyPWU/LnNwbGl0KCIsIikuc29tZShuPT50Lmhvc3QuZW5kc1dpdGgobil8fHQuaG9zdG5hbWUuZW5kc1dpdGgobikpO3JldHVybiByP3ZvaWQgMDpufShuLHQucHJveHl8fChlP3Byb2Nlc3MuZW52Lmh0dHBzX3Byb3h5OnZvaWQgMCl8fHByb2Nlc3MuZW52Lmh0dHBfcHJveHkpLG89ZT9pOnMsYT12b2lkIDAhPT10LmtlZXBBbGl2ZSYmdC5rZWVwQWxpdmUsZj1yP25ldyBXdChyKTpuZXcgby5BZ2VudCh7a2VlcEFsaXZlOmEsbWF4U29ja2V0czozMCx0aW1lb3V0OjJlM30pLGg9ZnVuY3Rpb24odCxuLGUpe2NvbnN0e2hvc3RuYW1lOnIscGF0aG5hbWU6byxwb3J0OnMscHJvdG9jb2w6aSxzZWFyY2g6YX09bmV3IFVSTCh0LnVybCk7cmV0dXJuIGZ1bmN0aW9uKGYpe3JldHVybiBuZXcgUHJvbWlzZSgoaCxwKT0+e2p0KCgpPT57bGV0IGw9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBjKHtyZWFkKCl7dGhpcy5wdXNoKHQpLHRoaXMucHVzaChudWxsKX19KX0oZi5ib2R5KTtjb25zdCBkPXsuLi50LmhlYWRlcnN9O2YuYm9keS5sZW5ndGg+MzI3NjgmJihkWyJjb250ZW50LWVuY29kaW5nIl09Imd6aXAiLGw9bC5waXBlKHUoKSkpO2NvbnN0IG09bi5yZXF1ZXN0KHttZXRob2Q6IlBPU1QiLGFnZW50OmUsaGVhZGVyczpkLGhvc3RuYW1lOnIscGF0aDpgJHtvfSR7YX1gLHBvcnQ6cyxwcm90b2NvbDppLGNhOnQuY2FDZXJ0c30sdD0+e3Qub24oImRhdGEiLCgpPT57fSksdC5vbigiZW5kIiwoKT0+e30pLHQuc2V0RW5jb2RpbmcoInV0ZjgiKTtjb25zdCBuPXQuaGVhZGVyc1sicmV0cnktYWZ0ZXIiXT8/bnVsbCxlPXQuaGVhZGVyc1sieC1zZW50cnktcmF0ZS1saW1pdHMiXT8/bnVsbDtoKHtzdGF0dXNDb2RlOnQuc3RhdHVzQ29kZSxoZWFkZXJzOnsicmV0cnktYWZ0ZXIiOm4sIngtc2VudHJ5LXJhdGUtbGltaXRzIjpBcnJheS5pc0FycmF5KGUpP2VbMF18fG51bGw6ZX19KX0pO20ub24oImVycm9yIixwKSxsLnBpcGUobSl9KX0pfX0odCx0Lmh0dHBNb2R1bGU/P28sZik7cmV0dXJuIFV0KHQsaCl9KHt1cmw6KG5uPVZ0LmRzbixlbj1WdC50dW5uZWwscm49VnQuc2RrTWV0YWRhdGEuc2RrLGVufHxgJHtmdW5jdGlvbih0KXtyZXR1cm5gJHtmdW5jdGlvbih0KXtjb25zdCBuPXQucHJvdG9jb2w/YCR7dC5wcm90b2NvbH06YDoiIixlPXQucG9ydD9gOiR7dC5wb3J0fWA6IiI7cmV0dXJuYCR7bn0vLyR7dC5ob3N0fSR7ZX0ke3QucGF0aD9gLyR7dC5wYXRofWA6IiJ9L2FwaS9gfSh0KX0ke3QucHJvamVjdElkfS9lbnZlbG9wZS9gfShubil9PyR7ZnVuY3Rpb24odCxuKXtjb25zdCBlPXtzZW50cnlfdmVyc2lvbjoiNyJ9O3JldHVybiB0LnB1YmxpY0tleSYmKGUuc2VudHJ5X2tleT10LnB1YmxpY0tleSksbiYmKGUuc2VudHJ5X2NsaWVudD1gJHtuLm5hbWV9LyR7bi52ZXJzaW9ufWApLG5ldyBVUkxTZWFyY2hQYXJhbXMoZSkudG9TdHJpbmcoKX0obm4scm4pfWApfSk7YXN5bmMgZnVuY3Rpb24gc24oKXtpZihxdCl7dG4oIlNlbmRpbmcgYWJub3JtYWwgc2Vzc2lvbiIpLEoocXQse3N0YXR1czoiYWJub3JtYWwiLGFibm9ybWFsX21lY2hhbmlzbToiYW5yX2ZvcmVncm91bmQiLHJlbGVhc2U6VnQucmVsZWFzZSxlbnZpcm9ubWVudDpWdC5lbnZpcm9ubWVudH0pO2NvbnN0IHQ9ZnVuY3Rpb24odCxuLGUscil7Y29uc3Qgbz1DdChlKTtyZXR1cm4gU3Qoe3NlbnRfYXQ6KG5ldyBEYXRlKS50b0lTT1N0cmluZygpLC4uLm8mJntzZGs6b30sLi4uISFyJiZuJiZ7ZHNuOmF0KG4pfX0sWyJhZ2dyZWdhdGVzImluIHQ/W3t0eXBlOiJzZXNzaW9ucyJ9LHRdOlt7dHlwZToic2Vzc2lvbiJ9LHQudG9KU09OKCldXSl9KHF0LFZ0LmRzbixWdC5zZGtNZXRhZGF0YSxWdC50dW5uZWwpO3RuKEpTT04uc3RyaW5naWZ5KHQpKSxhd2FpdCBvbi5zZW5kKHQpO3RyeXtlPy5wb3N0TWVzc2FnZSgic2Vzc2lvbi1lbmRlZCIpfWNhdGNoe319fWZ1bmN0aW9uIGNuKHQpe2lmKCF0KXJldHVybjtjb25zdCBuPWZ1bmN0aW9uKHQpe2lmKCF0Lmxlbmd0aClyZXR1cm5bXTtjb25zdCBuPUFycmF5LmZyb20odCk7cmV0dXJuL3NlbnRyeVdyYXBwZWQvLnRlc3QoRShuKS5mdW5jdGlvbnx8IiIpJiZuLnBvcCgpLG4ucmV2ZXJzZSgpLCQudGVzdChFKG4pLmZ1bmN0aW9ufHwiIikmJihuLnBvcCgpLCQudGVzdChFKG4pLmZ1bmN0aW9ufHwiIikmJm4ucG9wKCkpLG4uc2xpY2UoMCw1MCkubWFwKHQ9Pih7Li4udCxmaWxlbmFtZTp0LmZpbGVuYW1lfHxFKG4pLmZpbGVuYW1lLGZ1bmN0aW9uOnQuZnVuY3Rpb258fCI/In0pKX0odCk7aWYoVnQuYXBwUm9vdFBhdGgpZm9yKGNvbnN0IHQgb2Ygbil0LmZpbGVuYW1lJiYodC5maWxlbmFtZT13dCh0LmZpbGVuYW1lLFZ0LmFwcFJvb3RQYXRoKSk7cmV0dXJuIG59YXN5bmMgZnVuY3Rpb24gdW4odCxuKXtpZihRdD49VnQubWF4QW5yRXZlbnRzKXJldHVybjtRdCs9MSxhd2FpdCBzbigpLHRuKCJTZW5kaW5nIGV2ZW50Iik7Y29uc3QgZT17ZXZlbnRfaWQ6TSgpLGNvbnRleHRzOlZ0LmNvbnRleHRzLHJlbGVhc2U6VnQucmVsZWFzZSxlbnZpcm9ubWVudDpWdC5lbnZpcm9ubWVudCxkaXN0OlZ0LmRpc3QscGxhdGZvcm06Im5vZGUiLGxldmVsOiJlcnJvciIsZXhjZXB0aW9uOnt2YWx1ZXM6W3t0eXBlOiJBcHBsaWNhdGlvbk5vdFJlc3BvbmRpbmciLHZhbHVlOmBBcHBsaWNhdGlvbiBOb3QgUmVzcG9uZGluZyBmb3IgYXQgbGVhc3QgJHtWdC5hbnJUaHJlc2hvbGR9IG1zYCxzdGFja3RyYWNlOntmcmFtZXM6Y24odCl9LG1lY2hhbmlzbTp7dHlwZToiQU5SIn19XX0sdGFnczpWdC5zdGF0aWNUYWdzfTtuJiZmdW5jdGlvbih0LG4pe2lmKFJ0KHQsbiksIXQuY29udGV4dHM/LnRyYWNlKXtjb25zdHt0cmFjZUlkOmUscGFyZW50U3BhbklkOnIscHJvcGFnYXRpb25TcGFuSWQ6b309bi5wcm9wYWdhdGlvbkNvbnRleHQ7dC5jb250ZXh0cz17dHJhY2U6e3RyYWNlX2lkOmUsc3Bhbl9pZDpvfHxXKCkscGFyZW50X3NwYW5faWQ6cn0sLi4udC5jb250ZXh0c319fShlLG4pLGZ1bmN0aW9uKHQpe2lmKDA9PT1PYmplY3Qua2V5cyhYdCkubGVuZ3RoKXJldHVybjtjb25zdCBuPVZ0LmFwcFJvb3RQYXRoP3t9Olh0O2lmKFZ0LmFwcFJvb3RQYXRoKWZvcihjb25zdFt0LGVdb2YgT2JqZWN0LmVudHJpZXMoWHQpKW5bd3QodCxWdC5hcHBSb290UGF0aCldPWU7Y29uc3QgZT1uZXcgTWFwO2Zvcihjb25zdCByIG9mIHQuZXhjZXB0aW9uPy52YWx1ZXN8fFtdKWZvcihjb25zdCB0IG9mIHIuc3RhY2t0cmFjZT8uZnJhbWVzfHxbXSl7Y29uc3Qgcj10LmFic19wYXRofHx0LmZpbGVuYW1lO3ImJm5bcl0mJmUuc2V0KHIsbltyXSl9aWYoZS5zaXplPjApe2NvbnN0IG49W107Zm9yKGNvbnN0W3Qscl1vZiBlLmVudHJpZXMoKSluLnB1c2goe3R5cGU6InNvdXJjZW1hcCIsY29kZV9maWxlOnQsZGVidWdfaWQ6cn0pO3QuZGVidWdfbWV0YT17aW1hZ2VzOm59fX0oZSk7Y29uc3Qgcj1rdChlLFZ0LmRzbixWdC5zZGtNZXRhZGF0YSxWdC50dW5uZWwpO3RuKEpTT04uc3RyaW5naWZ5KHIpKSxhd2FpdCBvbi5zZW5kKHIpLGF3YWl0IG9uLmZsdXNoKDJlMyksUXQ+PVZ0Lm1heEFuckV2ZW50cyYmc2V0VGltZW91dCgoKT0+e3Byb2Nlc3MuZXhpdCgwKX0sNWUzKX1sZXQgYW47aWYodG4oIlN0YXJ0ZWQiKSxWdC5jYXB0dXJlU3RhY2tUcmFjZSl7dG4oIkNvbm5lY3RpbmcgdG8gZGVidWdnZXIiKTtjb25zdCBuPW5ldyB0O24uY29ubmVjdFRvTWFpblRocmVhZCgpLHRuKCJDb25uZWN0ZWQgdG8gZGVidWdnZXIiKTtjb25zdCBlPW5ldyBNYXA7bi5vbigiRGVidWdnZXIuc2NyaXB0UGFyc2VkIix0PT57ZS5zZXQodC5wYXJhbXMuc2NyaXB0SWQsdC5wYXJhbXMudXJsKX0pLG4ub24oIkRlYnVnZ2VyLnBhdXNlZCIsdD0+e2lmKCJvdGhlciI9PT10LnBhcmFtcy5yZWFzb24pdHJ5e3RuKCJEZWJ1Z2dlciBwYXVzZWQiKTtjb25zdCBzPVsuLi50LnBhcmFtcy5jYWxsRnJhbWVzXSxpPVZ0LmFwcFJvb3RQYXRoP2Z1bmN0aW9uKHQ9KHByb2Nlc3MuYXJndlsxXT9MdChwcm9jZXNzLmFyZ3ZbMV0pOnByb2Nlc3MuY3dkKCkpLG49IlxcIj09PW8pe2NvbnN0IGU9bj9adCh0KTp0O3JldHVybiB0PT57aWYoIXQpcmV0dXJuO2NvbnN0IG89bj9adCh0KTp0O2xldHtkaXI6cyxiYXNlOmksZXh0OmN9PXIucGFyc2Uobyk7Ii5qcyIhPT1jJiYiLm1qcyIhPT1jJiYiLmNqcyIhPT1jfHwoaT1pLnNsaWNlKDAsLTEqYy5sZW5ndGgpKTtjb25zdCB1PWRlY29kZVVSSUNvbXBvbmVudChpKTtzfHwocz0iLiIpO2NvbnN0IGE9cy5sYXN0SW5kZXhPZigiL25vZGVfbW9kdWxlcyIpO2lmKGE+LTEpcmV0dXJuYCR7cy5zbGljZShhKzE0KS5yZXBsYWNlKC9cLy9nLCIuIil9OiR7dX1gO2lmKHMuc3RhcnRzV2l0aChlKSl7Y29uc3QgdD1zLnNsaWNlKGUubGVuZ3RoKzEpLnJlcGxhY2UoL1wvL2csIi4iKTtyZXR1cm4gdD9gJHt0fToke3V9YDp1fXJldHVybiB1fX0oVnQuYXBwUm9vdFBhdGgpOigpPT57fSxjPXMubWFwKHQ9PmZ1bmN0aW9uKHQsbixlKXtjb25zdCByPW4/bi5yZXBsYWNlKC9eZmlsZTpcL1wvLywiIik6dm9pZCAwLG89dC5sb2NhdGlvbi5jb2x1bW5OdW1iZXI/dC5sb2NhdGlvbi5jb2x1bW5OdW1iZXIrMTp2b2lkIDAscz10LmxvY2F0aW9uLmxpbmVOdW1iZXI/dC5sb2NhdGlvbi5saW5lTnVtYmVyKzE6dm9pZCAwO3JldHVybntmaWxlbmFtZTpyLG1vZHVsZTplKHIpLGZ1bmN0aW9uOnQuZnVuY3Rpb25OYW1lfHwiPyIsY29sbm86byxsaW5lbm86cyxpbl9hcHA6cj9CdChyKTp2b2lkIDB9fSh0LGUuZ2V0KHQubG9jYXRpb24uc2NyaXB0SWQpLGkpKSx1PXNldFRpbWVvdXQoKCk9Pnt1bihjKS50aGVuKG51bGwsKCk9Pnt0bigiU2VuZGluZyBBTlIgZXZlbnQgZmFpbGVkLiIpfSl9LDVlMyk7bi5wb3N0KCJSdW50aW1lLmV2YWx1YXRlIix7ZXhwcmVzc2lvbjoiZ2xvYmFsLl9fU0VOVFJZX0dFVF9TQ09QRVNfXygpOyIsc2lsZW50OiEwLHJldHVybkJ5VmFsdWU6ITB9LCh0LGUpPT57dCYmdG4oYEVycm9yIGV4ZWN1dGluZyBzY3JpcHQ6ICcke3QubWVzc2FnZX0nYCksY2xlYXJUaW1lb3V0KHUpO2NvbnN0IHI9ZT8ucmVzdWx0P2UucmVzdWx0LnZhbHVlOnZvaWQgMDtuLnBvc3QoIkRlYnVnZ2VyLnJlc3VtZSIpLG4ucG9zdCgiRGVidWdnZXIuZGlzYWJsZSIpLHVuKGMscikudGhlbihudWxsLCgpPT57dG4oIlNlbmRpbmcgQU5SIGV2ZW50IGZhaWxlZC4iKX0pfSl9Y2F0Y2godCl7dGhyb3cgbi5wb3N0KCJEZWJ1Z2dlci5yZXN1bWUiKSxuLnBvc3QoIkRlYnVnZ2VyLmRpc2FibGUiKSx0fX0pLGFuPSgpPT57dHJ5e24ucG9zdCgiRGVidWdnZXIuZW5hYmxlIiwoKT0+e24ucG9zdCgiRGVidWdnZXIucGF1c2UiKX0pfWNhdGNoe319fWNvbnN0e3BvbGw6Zm59PWZ1bmN0aW9uKHQsbixlLHIpe2NvbnN0IG89dCgpO2xldCBzPSExLGk9ITA7cmV0dXJuIHNldEludGVydmFsKCgpPT57Y29uc3QgdD1vLmdldFRpbWVNcygpOyExPT09cyYmdD5uK2UmJihzPSEwLGkmJnIoKSksdDxuK2UmJihzPSExKX0sMjApLHtwb2xsOigpPT57by5yZXNldCgpfSxlbmFibGVkOnQ9PntpPXR9fX0oZnVuY3Rpb24oKXtsZXQgdD1wcm9jZXNzLmhydGltZSgpO3JldHVybntnZXRUaW1lTXM6KCk9Pntjb25zdFtuLGVdPXByb2Nlc3MuaHJ0aW1lKHQpO3JldHVybiBNYXRoLmZsb29yKDFlMypuK2UvMWU2KX0scmVzZXQ6KCk9Pnt0PXByb2Nlc3MuaHJ0aW1lKCl9fX0sVnQucG9sbEludGVydmFsLFZ0LmFuclRocmVzaG9sZCxmdW5jdGlvbigpe3RuKCJXYXRjaGRvZyB0aW1lb3V0IiksYW4/KHRuKCJQYXVzaW5nIGRlYnVnZ2VyIHRvIGNhcHR1cmUgc3RhY2sgdHJhY2UiKSxhbigpKToodG4oIkNhcHR1cmluZyBldmVudCB3aXRob3V0IGEgc3RhY2sgdHJhY2UiKSx1bigpLnRoZW4obnVsbCwoKT0+e3RuKCJTZW5kaW5nIEFOUiBldmVudCBmYWlsZWQgb24gd2F0Y2hkb2cgdGltZW91dC4iKX0pKX0pO2U/Lm9uKCJtZXNzYWdlIix0PT57dC5zZXNzaW9uJiYocXQ9SCh0LnNlc3Npb24pKSx0LmRlYnVnSW1hZ2VzJiYoWHQ9dC5kZWJ1Z0ltYWdlcyksZm4oKX0pOw==", DEFAULT_INTERVAL = 50, DEFAULT_HANG_THRESHOLD = 5000, INTEGRATION_NAME26 = "Anr", _anrIntegration = (options = {}) => {
|
|
38648
|
+
var isPromise, base64WorkerScript2 = "LyohIEBzZW50cnkvbm9kZS1jb3JlIDEwLjguMCAoYmQ4NDU4ZSkgfCBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3NlbnRyeS1qYXZhc2NyaXB0ICovCmltcG9ydHtTZXNzaW9uIGFzIHR9ZnJvbSJub2RlOmluc3BlY3RvciI7aW1wb3J0e3dvcmtlckRhdGEgYXMgbixwYXJlbnRQb3J0IGFzIGV9ZnJvbSJub2RlOndvcmtlcl90aHJlYWRzIjtpbXBvcnR7cG9zaXggYXMgcixzZXAgYXMgb31mcm9tIm5vZGU6cGF0aCI7aW1wb3J0KmFzIHMgZnJvbSJub2RlOmh0dHAiO2ltcG9ydCphcyBpIGZyb20ibm9kZTpodHRwcyI7aW1wb3J0e1JlYWRhYmxlIGFzIGN9ZnJvbSJub2RlOnN0cmVhbSI7aW1wb3J0e2NyZWF0ZUd6aXAgYXMgdX1mcm9tIm5vZGU6emxpYiI7aW1wb3J0KmFzIGEgZnJvbSJub2RlOm5ldCI7aW1wb3J0KmFzIGYgZnJvbSJub2RlOnRscyI7Y29uc3QgaD0idW5kZWZpbmVkIj09dHlwZW9mIF9fU0VOVFJZX0RFQlVHX198fF9fU0VOVFJZX0RFQlVHX18scD1nbG9iYWxUaGlzLGw9IjEwLjguMCI7ZnVuY3Rpb24gZCgpe3JldHVybiBtKHApLHB9ZnVuY3Rpb24gbSh0KXtjb25zdCBuPXQuX19TRU5UUllfXz10Ll9fU0VOVFJZX198fHt9O3JldHVybiBuLnZlcnNpb249bi52ZXJzaW9ufHxsLG5bbF09bltsXXx8e319ZnVuY3Rpb24gZyh0LG4sZT1wKXtjb25zdCByPWUuX19TRU5UUllfXz1lLl9fU0VOVFJZX198fHt9LG89cltsXT1yW2xdfHx7fTtyZXR1cm4gb1t0XXx8KG9bdF09bigpKX1jb25zdCB5PXt9O2Z1bmN0aW9uIGIodCl7aWYoISgiY29uc29sZSJpbiBwKSlyZXR1cm4gdCgpO2NvbnN0IG49cC5jb25zb2xlLGU9e30scj1PYmplY3Qua2V5cyh5KTtyLmZvckVhY2godD0+e2NvbnN0IHI9eVt0XTtlW3RdPW5bdF0sblt0XT1yfSk7dHJ5e3JldHVybiB0KCl9ZmluYWxseXtyLmZvckVhY2godD0+e25bdF09ZVt0XX0pfX1mdW5jdGlvbiB2KCl7cmV0dXJuIHcoKS5lbmFibGVkfWZ1bmN0aW9uIF8odCwuLi5uKXtoJiZ2KCkmJmIoKCk9PntwLmNvbnNvbGVbdF0oYFNlbnRyeSBMb2dnZXIgWyR7dH1dOmAsLi4ubil9KX1mdW5jdGlvbiB3KCl7cmV0dXJuIGg/ZygibG9nZ2VyU2V0dGluZ3MiLCgpPT4oe2VuYWJsZWQ6ITF9KSk6e2VuYWJsZWQ6ITF9fWNvbnN0IFM9e2VuYWJsZTpmdW5jdGlvbigpe3coKS5lbmFibGVkPSEwfSxkaXNhYmxlOmZ1bmN0aW9uKCl7dygpLmVuYWJsZWQ9ITF9LGlzRW5hYmxlZDp2LGxvZzpmdW5jdGlvbiguLi50KXtfKCJsb2ciLC4uLnQpfSx3YXJuOmZ1bmN0aW9uKC4uLnQpe18oIndhcm4iLC4uLnQpfSxlcnJvcjpmdW5jdGlvbiguLi50KXtfKCJlcnJvciIsLi4udCl9fSwkPS9jYXB0dXJlTWVzc2FnZXxjYXB0dXJlRXhjZXB0aW9uLztmdW5jdGlvbiBFKHQpe3JldHVybiB0W3QubGVuZ3RoLTFdfHx7fX1jb25zdCB4PSI8YW5vbnltb3VzPiI7Y29uc3QgTj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIEModCxuKXtyZXR1cm4gTi5jYWxsKHQpPT09YFtvYmplY3QgJHtufV1gfWZ1bmN0aW9uIGsodCl7cmV0dXJuIEModCwiU3RyaW5nIil9ZnVuY3Rpb24gVCh0KXtyZXR1cm4gQyh0LCJPYmplY3QiKX1mdW5jdGlvbiBqKHQpe3JldHVybiBCb29sZWFuKHQ/LnRoZW4mJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnRoZW4pfWZ1bmN0aW9uIEkodCxuKXt0cnl7cmV0dXJuIHQgaW5zdGFuY2VvZiBufWNhdGNoe3JldHVybiExfX1jb25zdCBPPXA7ZnVuY3Rpb24gUih0LG4pe2NvbnN0IGU9dCxyPVtdO2lmKCFlPy50YWdOYW1lKXJldHVybiIiO2lmKE8uSFRNTEVsZW1lbnQmJmUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCYmZS5kYXRhc2V0KXtpZihlLmRhdGFzZXQuc2VudHJ5Q29tcG9uZW50KXJldHVybiBlLmRhdGFzZXQuc2VudHJ5Q29tcG9uZW50O2lmKGUuZGF0YXNldC5zZW50cnlFbGVtZW50KXJldHVybiBlLmRhdGFzZXQuc2VudHJ5RWxlbWVudH1yLnB1c2goZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkpO2NvbnN0IG89bj8ubGVuZ3RoP24uZmlsdGVyKHQ9PmUuZ2V0QXR0cmlidXRlKHQpKS5tYXAodD0+W3QsZS5nZXRBdHRyaWJ1dGUodCldKTpudWxsO2lmKG8/Lmxlbmd0aClvLmZvckVhY2godD0+e3IucHVzaChgWyR7dFswXX09IiR7dFsxXX0iXWApfSk7ZWxzZXtlLmlkJiZyLnB1c2goYCMke2UuaWR9YCk7Y29uc3QgdD1lLmNsYXNzTmFtZTtpZih0JiZrKHQpKXtjb25zdCBuPXQuc3BsaXQoL1xzKy8pO2Zvcihjb25zdCB0IG9mIG4pci5wdXNoKGAuJHt0fWApfX1jb25zdCBzPVsiYXJpYS1sYWJlbCIsInR5cGUiLCJuYW1lIiwidGl0bGUiLCJhbHQiXTtmb3IoY29uc3QgdCBvZiBzKXtjb25zdCBuPWUuZ2V0QXR0cmlidXRlKHQpO24mJnIucHVzaChgWyR7dH09IiR7bn0iXWApfXJldHVybiByLmpvaW4oIiIpfWZ1bmN0aW9uIEEodCxuPTApe3JldHVybiJzdHJpbmciIT10eXBlb2YgdHx8MD09PW58fHQubGVuZ3RoPD1uP3Q6YCR7dC5zbGljZSgwLG4pfS4uLmB9ZnVuY3Rpb24gRCh0KXtpZihmdW5jdGlvbih0KXtzd2l0Y2goTi5jYWxsKHQpKXtjYXNlIltvYmplY3QgRXJyb3JdIjpjYXNlIltvYmplY3QgRXhjZXB0aW9uXSI6Y2FzZSJbb2JqZWN0IERPTUV4Y2VwdGlvbl0iOmNhc2UiW29iamVjdCBXZWJBc3NlbWJseS5FeGNlcHRpb25dIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiBJKHQsRXJyb3IpfX0odCkpcmV0dXJue21lc3NhZ2U6dC5tZXNzYWdlLG5hbWU6dC5uYW1lLHN0YWNrOnQuc3RhY2ssLi4uVSh0KX07aWYobj10LCJ1bmRlZmluZWQiIT10eXBlb2YgRXZlbnQmJkkobixFdmVudCkpe2NvbnN0IG49e3R5cGU6dC50eXBlLHRhcmdldDpQKHQudGFyZ2V0KSxjdXJyZW50VGFyZ2V0OlAodC5jdXJyZW50VGFyZ2V0KSwuLi5VKHQpfTtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEN1c3RvbUV2ZW50JiZJKHQsQ3VzdG9tRXZlbnQpJiYobi5kZXRhaWw9dC5kZXRhaWwpLG59cmV0dXJuIHQ7dmFyIG59ZnVuY3Rpb24gUCh0KXt0cnl7cmV0dXJuIG49dCwidW5kZWZpbmVkIiE9dHlwZW9mIEVsZW1lbnQmJkkobixFbGVtZW50KT9mdW5jdGlvbih0LG49e30pe2lmKCF0KXJldHVybiI8dW5rbm93bj4iO3RyeXtsZXQgZT10O2NvbnN0IHI9NSxvPVtdO2xldCBzPTAsaT0wO2NvbnN0IGM9IiA+ICIsdT1jLmxlbmd0aDtsZXQgYTtjb25zdCBmPUFycmF5LmlzQXJyYXkobik/bjpuLmtleUF0dHJzLGg9IUFycmF5LmlzQXJyYXkobikmJm4ubWF4U3RyaW5nTGVuZ3RofHw4MDtmb3IoO2UmJnMrKzxyJiYoYT1SKGUsZiksISgiaHRtbCI9PT1hfHxzPjEmJmkrby5sZW5ndGgqdSthLmxlbmd0aD49aCkpOylvLnB1c2goYSksaSs9YS5sZW5ndGgsZT1lLnBhcmVudE5vZGU7cmV0dXJuIG8ucmV2ZXJzZSgpLmpvaW4oYyl9Y2F0Y2h7cmV0dXJuIjx1bmtub3duPiJ9fSh0KTpPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9Y2F0Y2h7cmV0dXJuIjx1bmtub3duPiJ9dmFyIG59ZnVuY3Rpb24gVSh0KXtpZigib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10KXtjb25zdCBuPXt9O2Zvcihjb25zdCBlIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSkmJihuW2VdPXRbZV0pO3JldHVybiBufXJldHVybnt9fWZ1bmN0aW9uIE0odD1mdW5jdGlvbigpe2NvbnN0IHQ9cDtyZXR1cm4gdC5jcnlwdG98fHQubXNDcnlwdG99KCkpe2xldCBuPSgpPT4xNipNYXRoLnJhbmRvbSgpO3RyeXtpZih0Py5yYW5kb21VVUlEKXJldHVybiB0LnJhbmRvbVVVSUQoKS5yZXBsYWNlKC8tL2csIiIpO3Q/LmdldFJhbmRvbVZhbHVlcyYmKG49KCk9Pntjb25zdCBuPW5ldyBVaW50OEFycmF5KDEpO3JldHVybiB0LmdldFJhbmRvbVZhbHVlcyhuKSxuWzBdfSl9Y2F0Y2h7fXJldHVybihbMWU3XSsxZTMrNGUzKzhlMysxZTExKS5yZXBsYWNlKC9bMDE4XS9nLHQ9Pih0XigxNSZuKCkpPj50LzQpLnRvU3RyaW5nKDE2KSl9ZnVuY3Rpb24gTCgpe3JldHVybiBEYXRlLm5vdygpLzFlM31sZXQgQjtmdW5jdGlvbiBHKCl7cmV0dXJuKEI/PyhCPWZ1bmN0aW9uKCl7Y29uc3R7cGVyZm9ybWFuY2U6dH09cDtpZighdD8ubm93fHwhdC50aW1lT3JpZ2luKXJldHVybiBMO2NvbnN0IG49dC50aW1lT3JpZ2luO3JldHVybigpPT4obit0Lm5vdygpKS8xZTN9KCkpKSgpfWZ1bmN0aW9uIEgodCl7Y29uc3Qgbj1HKCksZT17c2lkOk0oKSxpbml0OiEwLHRpbWVzdGFtcDpuLHN0YXJ0ZWQ6bixkdXJhdGlvbjowLHN0YXR1czoib2siLGVycm9yczowLGlnbm9yZUR1cmF0aW9uOiExLHRvSlNPTjooKT0+ZnVuY3Rpb24odCl7cmV0dXJue3NpZDpgJHt0LnNpZH1gLGluaXQ6dC5pbml0LHN0YXJ0ZWQ6bmV3IERhdGUoMWUzKnQuc3RhcnRlZCkudG9JU09TdHJpbmcoKSx0aW1lc3RhbXA6bmV3IERhdGUoMWUzKnQudGltZXN0YW1wKS50b0lTT1N0cmluZygpLHN0YXR1czp0LnN0YXR1cyxlcnJvcnM6dC5lcnJvcnMsZGlkOiJudW1iZXIiPT10eXBlb2YgdC5kaWR8fCJzdHJpbmciPT10eXBlb2YgdC5kaWQ/YCR7dC5kaWR9YDp2b2lkIDAsZHVyYXRpb246dC5kdXJhdGlvbixhYm5vcm1hbF9tZWNoYW5pc206dC5hYm5vcm1hbF9tZWNoYW5pc20sYXR0cnM6e3JlbGVhc2U6dC5yZWxlYXNlLGVudmlyb25tZW50OnQuZW52aXJvbm1lbnQsaXBfYWRkcmVzczp0LmlwQWRkcmVzcyx1c2VyX2FnZW50OnQudXNlckFnZW50fX19KGUpfTtyZXR1cm4gdCYmSihlLHQpLGV9ZnVuY3Rpb24gSih0LG49e30pe2lmKG4udXNlciYmKCF0LmlwQWRkcmVzcyYmbi51c2VyLmlwX2FkZHJlc3MmJih0LmlwQWRkcmVzcz1uLnVzZXIuaXBfYWRkcmVzcyksdC5kaWR8fG4uZGlkfHwodC5kaWQ9bi51c2VyLmlkfHxuLnVzZXIuZW1haWx8fG4udXNlci51c2VybmFtZSkpLHQudGltZXN0YW1wPW4udGltZXN0YW1wfHxHKCksbi5hYm5vcm1hbF9tZWNoYW5pc20mJih0LmFibm9ybWFsX21lY2hhbmlzbT1uLmFibm9ybWFsX21lY2hhbmlzbSksbi5pZ25vcmVEdXJhdGlvbiYmKHQuaWdub3JlRHVyYXRpb249bi5pZ25vcmVEdXJhdGlvbiksbi5zaWQmJih0LnNpZD0zMj09PW4uc2lkLmxlbmd0aD9uLnNpZDpNKCkpLHZvaWQgMCE9PW4uaW5pdCYmKHQuaW5pdD1uLmluaXQpLCF0LmRpZCYmbi5kaWQmJih0LmRpZD1gJHtuLmRpZH1gKSwibnVtYmVyIj09dHlwZW9mIG4uc3RhcnRlZCYmKHQuc3RhcnRlZD1uLnN0YXJ0ZWQpLHQuaWdub3JlRHVyYXRpb24pdC5kdXJhdGlvbj12b2lkIDA7ZWxzZSBpZigibnVtYmVyIj09dHlwZW9mIG4uZHVyYXRpb24pdC5kdXJhdGlvbj1uLmR1cmF0aW9uO2Vsc2V7Y29uc3Qgbj10LnRpbWVzdGFtcC10LnN0YXJ0ZWQ7dC5kdXJhdGlvbj1uPj0wP246MH1uLnJlbGVhc2UmJih0LnJlbGVhc2U9bi5yZWxlYXNlKSxuLmVudmlyb25tZW50JiYodC5lbnZpcm9ubWVudD1uLmVudmlyb25tZW50KSwhdC5pcEFkZHJlc3MmJm4uaXBBZGRyZXNzJiYodC5pcEFkZHJlc3M9bi5pcEFkZHJlc3MpLCF0LnVzZXJBZ2VudCYmbi51c2VyQWdlbnQmJih0LnVzZXJBZ2VudD1uLnVzZXJBZ2VudCksIm51bWJlciI9PXR5cGVvZiBuLmVycm9ycyYmKHQuZXJyb3JzPW4uZXJyb3JzKSxuLnN0YXR1cyYmKHQuc3RhdHVzPW4uc3RhdHVzKX1mdW5jdGlvbiB6KHQsbixlPTIpe2lmKCFufHwib2JqZWN0IiE9dHlwZW9mIG58fGU8PTApcmV0dXJuIG47aWYodCYmMD09PU9iamVjdC5rZXlzKG4pLmxlbmd0aClyZXR1cm4gdDtjb25zdCByPXsuLi50fTtmb3IoY29uc3QgdCBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHQpJiYoclt0XT16KHJbdF0sblt0XSxlLTEpKTtyZXR1cm4gcn1mdW5jdGlvbiBGKCl7cmV0dXJuIE0oKX1mdW5jdGlvbiBXKCl7cmV0dXJuIE0oKS5zdWJzdHJpbmcoMTYpfWNvbnN0IFk9Il9zZW50cnlTcGFuIjtmdW5jdGlvbiBLKHQsbil7bj9mdW5jdGlvbih0LG4sZSl7dHJ5e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4se3ZhbHVlOmUsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSl9Y2F0Y2h7aCYmUy5sb2coYEZhaWxlZCB0byBhZGQgbm9uLWVudW1lcmFibGUgcHJvcGVydHkgIiR7bn0iIHRvIG9iamVjdGAsdCl9fSh0LFksbik6ZGVsZXRlIHRbWV19ZnVuY3Rpb24gWih0KXtyZXR1cm4gdFtZXX1jbGFzcyBWe2NvbnN0cnVjdG9yKCl7dGhpcy50PSExLHRoaXMubz1bXSx0aGlzLmk9W10sdGhpcy51PVtdLHRoaXMuaD1bXSx0aGlzLnA9e30sdGhpcy5sPXt9LHRoaXMubT17fSx0aGlzLnY9e30sdGhpcy5fPXt9LHRoaXMuUz17dHJhY2VJZDpGKCksc2FtcGxlUmFuZDpNYXRoLnJhbmRvbSgpfX1jbG9uZSgpe2NvbnN0IHQ9bmV3IFY7cmV0dXJuIHQudT1bLi4udGhpcy51XSx0Lmw9ey4uLnRoaXMubH0sdC5tPXsuLi50aGlzLm19LHQudj17Li4udGhpcy52fSx0aGlzLnYuZmxhZ3MmJih0LnYuZmxhZ3M9e3ZhbHVlczpbLi4udGhpcy52LmZsYWdzLnZhbHVlc119KSx0LnA9dGhpcy5wLHQuTj10aGlzLk4sdC5DPXRoaXMuQyx0Lms9dGhpcy5rLHQuVD10aGlzLlQsdC5pPVsuLi50aGlzLmldLHQuaD1bLi4udGhpcy5oXSx0Ll89ey4uLnRoaXMuX30sdC5TPXsuLi50aGlzLlN9LHQuaj10aGlzLmosdC5JPXRoaXMuSSxLKHQsWih0aGlzKSksdH1zZXRDbGllbnQodCl7dGhpcy5qPXR9c2V0TGFzdEV2ZW50SWQodCl7dGhpcy5JPXR9Z2V0Q2xpZW50KCl7cmV0dXJuIHRoaXMuan1sYXN0RXZlbnRJZCgpe3JldHVybiB0aGlzLkl9YWRkU2NvcGVMaXN0ZW5lcih0KXt0aGlzLm8ucHVzaCh0KX1hZGRFdmVudFByb2Nlc3Nvcih0KXtyZXR1cm4gdGhpcy5pLnB1c2godCksdGhpc31zZXRVc2VyKHQpe3JldHVybiB0aGlzLnA9dHx8e2VtYWlsOnZvaWQgMCxpZDp2b2lkIDAsaXBfYWRkcmVzczp2b2lkIDAsdXNlcm5hbWU6dm9pZCAwfSx0aGlzLkMmJkoodGhpcy5DLHt1c2VyOnR9KSx0aGlzLk8oKSx0aGlzfWdldFVzZXIoKXtyZXR1cm4gdGhpcy5wfXNldFRhZ3ModCl7cmV0dXJuIHRoaXMubD17Li4udGhpcy5sLC4uLnR9LHRoaXMuTygpLHRoaXN9c2V0VGFnKHQsbil7cmV0dXJuIHRoaXMubD17Li4udGhpcy5sLFt0XTpufSx0aGlzLk8oKSx0aGlzfXNldEV4dHJhcyh0KXtyZXR1cm4gdGhpcy5tPXsuLi50aGlzLm0sLi4udH0sdGhpcy5PKCksdGhpc31zZXRFeHRyYSh0LG4pe3JldHVybiB0aGlzLm09ey4uLnRoaXMubSxbdF06bn0sdGhpcy5PKCksdGhpc31zZXRGaW5nZXJwcmludCh0KXtyZXR1cm4gdGhpcy5UPXQsdGhpcy5PKCksdGhpc31zZXRMZXZlbCh0KXtyZXR1cm4gdGhpcy5OPXQsdGhpcy5PKCksdGhpc31zZXRUcmFuc2FjdGlvbk5hbWUodCl7cmV0dXJuIHRoaXMuaz10LHRoaXMuTygpLHRoaXN9c2V0Q29udGV4dCh0LG4pe3JldHVybiBudWxsPT09bj9kZWxldGUgdGhpcy52W3RdOnRoaXMudlt0XT1uLHRoaXMuTygpLHRoaXN9c2V0U2Vzc2lvbih0KXtyZXR1cm4gdD90aGlzLkM9dDpkZWxldGUgdGhpcy5DLHRoaXMuTygpLHRoaXN9Z2V0U2Vzc2lvbigpe3JldHVybiB0aGlzLkN9dXBkYXRlKHQpe2lmKCF0KXJldHVybiB0aGlzO2NvbnN0IG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dCh0aGlzKTp0LGU9biBpbnN0YW5jZW9mIFY/bi5nZXRTY29wZURhdGEoKTpUKG4pP3Q6dm9pZCAwLHt0YWdzOnIsZXh0cmE6byx1c2VyOnMsY29udGV4dHM6aSxsZXZlbDpjLGZpbmdlcnByaW50OnU9W10scHJvcGFnYXRpb25Db250ZXh0OmF9PWV8fHt9O3JldHVybiB0aGlzLmw9ey4uLnRoaXMubCwuLi5yfSx0aGlzLm09ey4uLnRoaXMubSwuLi5vfSx0aGlzLnY9ey4uLnRoaXMudiwuLi5pfSxzJiZPYmplY3Qua2V5cyhzKS5sZW5ndGgmJih0aGlzLnA9cyksYyYmKHRoaXMuTj1jKSx1Lmxlbmd0aCYmKHRoaXMuVD11KSxhJiYodGhpcy5TPWEpLHRoaXN9Y2xlYXIoKXtyZXR1cm4gdGhpcy51PVtdLHRoaXMubD17fSx0aGlzLm09e30sdGhpcy5wPXt9LHRoaXMudj17fSx0aGlzLk49dm9pZCAwLHRoaXMuaz12b2lkIDAsdGhpcy5UPXZvaWQgMCx0aGlzLkM9dm9pZCAwLEsodGhpcyx2b2lkIDApLHRoaXMuaD1bXSx0aGlzLnNldFByb3BhZ2F0aW9uQ29udGV4dCh7dHJhY2VJZDpGKCksc2FtcGxlUmFuZDpNYXRoLnJhbmRvbSgpfSksdGhpcy5PKCksdGhpc31hZGRCcmVhZGNydW1iKHQsbil7Y29uc3QgZT0ibnVtYmVyIj09dHlwZW9mIG4/bjoxMDA7aWYoZTw9MClyZXR1cm4gdGhpcztjb25zdCByPXt0aW1lc3RhbXA6TCgpLC4uLnQsbWVzc2FnZTp0Lm1lc3NhZ2U/QSh0Lm1lc3NhZ2UsMjA0OCk6dC5tZXNzYWdlfTtyZXR1cm4gdGhpcy51LnB1c2gociksdGhpcy51Lmxlbmd0aD5lJiYodGhpcy51PXRoaXMudS5zbGljZSgtZSksdGhpcy5qPy5yZWNvcmREcm9wcGVkRXZlbnQoImJ1ZmZlcl9vdmVyZmxvdyIsImxvZ19pdGVtIikpLHRoaXMuTygpLHRoaXN9Z2V0TGFzdEJyZWFkY3J1bWIoKXtyZXR1cm4gdGhpcy51W3RoaXMudS5sZW5ndGgtMV19Y2xlYXJCcmVhZGNydW1icygpe3JldHVybiB0aGlzLnU9W10sdGhpcy5PKCksdGhpc31hZGRBdHRhY2htZW50KHQpe3JldHVybiB0aGlzLmgucHVzaCh0KSx0aGlzfWNsZWFyQXR0YWNobWVudHMoKXtyZXR1cm4gdGhpcy5oPVtdLHRoaXN9Z2V0U2NvcGVEYXRhKCl7cmV0dXJue2JyZWFkY3J1bWJzOnRoaXMudSxhdHRhY2htZW50czp0aGlzLmgsY29udGV4dHM6dGhpcy52LHRhZ3M6dGhpcy5sLGV4dHJhOnRoaXMubSx1c2VyOnRoaXMucCxsZXZlbDp0aGlzLk4sZmluZ2VycHJpbnQ6dGhpcy5UfHxbXSxldmVudFByb2Nlc3NvcnM6dGhpcy5pLHByb3BhZ2F0aW9uQ29udGV4dDp0aGlzLlMsc2RrUHJvY2Vzc2luZ01ldGFkYXRhOnRoaXMuXyx0cmFuc2FjdGlvbk5hbWU6dGhpcy5rLHNwYW46Wih0aGlzKX19c2V0U0RLUHJvY2Vzc2luZ01ldGFkYXRhKHQpe3JldHVybiB0aGlzLl89eih0aGlzLl8sdCwyKSx0aGlzfXNldFByb3BhZ2F0aW9uQ29udGV4dCh0KXtyZXR1cm4gdGhpcy5TPXQsdGhpc31nZXRQcm9wYWdhdGlvbkNvbnRleHQoKXtyZXR1cm4gdGhpcy5TfWNhcHR1cmVFeGNlcHRpb24odCxuKXtjb25zdCBlPW4/LmV2ZW50X2lkfHxNKCk7aWYoIXRoaXMuailyZXR1cm4gaCYmUy53YXJuKCJObyBjbGllbnQgY29uZmlndXJlZCBvbiBzY29wZSAtIHdpbGwgbm90IGNhcHR1cmUgZXhjZXB0aW9uISIpLGU7Y29uc3Qgcj1uZXcgRXJyb3IoIlNlbnRyeSBzeW50aGV0aWNFeGNlcHRpb24iKTtyZXR1cm4gdGhpcy5qLmNhcHR1cmVFeGNlcHRpb24odCx7b3JpZ2luYWxFeGNlcHRpb246dCxzeW50aGV0aWNFeGNlcHRpb246ciwuLi5uLGV2ZW50X2lkOmV9LHRoaXMpLGV9Y2FwdHVyZU1lc3NhZ2UodCxuLGUpe2NvbnN0IHI9ZT8uZXZlbnRfaWR8fE0oKTtpZighdGhpcy5qKXJldHVybiBoJiZTLndhcm4oIk5vIGNsaWVudCBjb25maWd1cmVkIG9uIHNjb3BlIC0gd2lsbCBub3QgY2FwdHVyZSBtZXNzYWdlISIpLHI7Y29uc3Qgbz1uZXcgRXJyb3IodCk7cmV0dXJuIHRoaXMuai5jYXB0dXJlTWVzc2FnZSh0LG4se29yaWdpbmFsRXhjZXB0aW9uOnQsc3ludGhldGljRXhjZXB0aW9uOm8sLi4uZSxldmVudF9pZDpyfSx0aGlzKSxyfWNhcHR1cmVFdmVudCh0LG4pe2NvbnN0IGU9bj8uZXZlbnRfaWR8fE0oKTtyZXR1cm4gdGhpcy5qPyh0aGlzLmouY2FwdHVyZUV2ZW50KHQsey4uLm4sZXZlbnRfaWQ6ZX0sdGhpcyksZSk6KGgmJlMud2FybigiTm8gY2xpZW50IGNvbmZpZ3VyZWQgb24gc2NvcGUgLSB3aWxsIG5vdCBjYXB0dXJlIGV2ZW50ISIpLGUpfU8oKXt0aGlzLnR8fCh0aGlzLnQ9ITAsdGhpcy5vLmZvckVhY2godD0+e3QodGhpcyl9KSx0aGlzLnQ9ITEpfX1jbGFzcyBxe2NvbnN0cnVjdG9yKHQsbil7bGV0IGUscjtlPXR8fG5ldyBWLHI9bnx8bmV3IFYsdGhpcy5SPVt7c2NvcGU6ZX1dLHRoaXMuQT1yfXdpdGhTY29wZSh0KXtjb25zdCBuPXRoaXMuRCgpO2xldCBlO3RyeXtlPXQobil9Y2F0Y2godCl7dGhyb3cgdGhpcy5QKCksdH1yZXR1cm4gaihlKT9lLnRoZW4odD0+KHRoaXMuUCgpLHQpLHQ9Pnt0aHJvdyB0aGlzLlAoKSx0fSk6KHRoaXMuUCgpLGUpfWdldENsaWVudCgpe3JldHVybiB0aGlzLmdldFN0YWNrVG9wKCkuY2xpZW50fWdldFNjb3BlKCl7cmV0dXJuIHRoaXMuZ2V0U3RhY2tUb3AoKS5zY29wZX1nZXRJc29sYXRpb25TY29wZSgpe3JldHVybiB0aGlzLkF9Z2V0U3RhY2tUb3AoKXtyZXR1cm4gdGhpcy5SW3RoaXMuUi5sZW5ndGgtMV19RCgpe2NvbnN0IHQ9dGhpcy5nZXRTY29wZSgpLmNsb25lKCk7cmV0dXJuIHRoaXMuUi5wdXNoKHtjbGllbnQ6dGhpcy5nZXRDbGllbnQoKSxzY29wZTp0fSksdH1QKCl7cmV0dXJuISh0aGlzLlIubGVuZ3RoPD0xKSYmISF0aGlzLlIucG9wKCl9fWZ1bmN0aW9uIFEoKXtjb25zdCB0PW0oZCgpKTtyZXR1cm4gdC5zdGFjaz10LnN0YWNrfHxuZXcgcShnKCJkZWZhdWx0Q3VycmVudFNjb3BlIiwoKT0+bmV3IFYpLGcoImRlZmF1bHRJc29sYXRpb25TY29wZSIsKCk9Pm5ldyBWKSl9ZnVuY3Rpb24gWCh0KXtyZXR1cm4gUSgpLndpdGhTY29wZSh0KX1mdW5jdGlvbiB0dCh0LG4pe2NvbnN0IGU9USgpO3JldHVybiBlLndpdGhTY29wZSgoKT0+KGUuZ2V0U3RhY2tUb3AoKS5zY29wZT10LG4odCkpKX1mdW5jdGlvbiBudCh0KXtyZXR1cm4gUSgpLndpdGhTY29wZSgoKT0+dChRKCkuZ2V0SXNvbGF0aW9uU2NvcGUoKSkpfWZ1bmN0aW9uIGV0KHQpe2NvbnN0IG49bSh0KTtyZXR1cm4gbi5hY3M/bi5hY3M6e3dpdGhJc29sYXRpb25TY29wZTpudCx3aXRoU2NvcGU6WCx3aXRoU2V0U2NvcGU6dHQsd2l0aFNldElzb2xhdGlvblNjb3BlOih0LG4pPT5udChuKSxnZXRDdXJyZW50U2NvcGU6KCk9PlEoKS5nZXRTY29wZSgpLGdldElzb2xhdGlvblNjb3BlOigpPT5RKCkuZ2V0SXNvbGF0aW9uU2NvcGUoKX19ZnVuY3Rpb24gcnQoKXtyZXR1cm4gZXQoZCgpKS5nZXRDdXJyZW50U2NvcGUoKS5nZXRDbGllbnQoKX1mdW5jdGlvbiBvdCh0KXtyZXR1cm57c2NvcGU6dC5fc2VudHJ5U2NvcGUsaXNvbGF0aW9uU2NvcGU6dC5fc2VudHJ5SXNvbGF0aW9uU2NvcGV9fWNvbnN0IHN0PS9ec2VudHJ5LS87ZnVuY3Rpb24gaXQodCl7Y29uc3Qgbj1mdW5jdGlvbih0KXtpZighdHx8IWsodCkmJiFBcnJheS5pc0FycmF5KHQpKXJldHVybjtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiB0LnJlZHVjZSgodCxuKT0+e2NvbnN0IGU9Y3Qobik7cmV0dXJuIE9iamVjdC5lbnRyaWVzKGUpLmZvckVhY2goKFtuLGVdKT0+e3Rbbl09ZX0pLHR9LHt9KTtyZXR1cm4gY3QodCl9KHQpO2lmKCFuKXJldHVybjtjb25zdCBlPU9iamVjdC5lbnRyaWVzKG4pLnJlZHVjZSgodCxbbixlXSk9PntpZihuLm1hdGNoKHN0KSl7dFtuLnNsaWNlKDcpXT1lfXJldHVybiB0fSx7fSk7cmV0dXJuIE9iamVjdC5rZXlzKGUpLmxlbmd0aD4wP2U6dm9pZCAwfWZ1bmN0aW9uIGN0KHQpe3JldHVybiB0LnNwbGl0KCIsIikubWFwKHQ9PnQuc3BsaXQoIj0iKS5tYXAodD0+e3RyeXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHQudHJpbSgpKX1jYXRjaHtyZXR1cm59fSkpLnJlZHVjZSgodCxbbixlXSk9PihuJiZlJiYodFtuXT1lKSx0KSx7fSl9Y29uc3QgdXQ9L15vKFxkKylcLi87ZnVuY3Rpb24gYXQodCxuPSExKXtjb25zdHtob3N0OmUscGF0aDpyLHBhc3M6byxwb3J0OnMscHJvamVjdElkOmkscHJvdG9jb2w6YyxwdWJsaWNLZXk6dX09dDtyZXR1cm5gJHtjfTovLyR7dX0ke24mJm8/YDoke299YDoiIn1AJHtlfSR7cz9gOiR7c31gOiIifS8ke3I/YCR7cn0vYDpyfSR7aX1gfWZ1bmN0aW9uIGZ0KHQpe2NvbnN0IG49dC5nZXRPcHRpb25zKCkse2hvc3Q6ZX09dC5nZXREc24oKXx8e307bGV0IHI7cmV0dXJuIG4ub3JnSWQ/cj1TdHJpbmcobi5vcmdJZCk6ZSYmKHI9ZnVuY3Rpb24odCl7Y29uc3Qgbj10Lm1hdGNoKHV0KTtyZXR1cm4gbj8uWzFdfShlKSkscn1mdW5jdGlvbiBodCh0KXtjb25zdHtzcGFuSWQ6bix0cmFjZUlkOmUsaXNSZW1vdGU6cn09dC5zcGFuQ29udGV4dCgpLG89cj9uOm10KHQpLnBhcmVudF9zcGFuX2lkLHM9b3QodCkuc2NvcGU7cmV0dXJue3BhcmVudF9zcGFuX2lkOm8sc3Bhbl9pZDpyP3M/LmdldFByb3BhZ2F0aW9uQ29udGV4dCgpLnByb3BhZ2F0aW9uU3BhbklkfHxXKCk6bix0cmFjZV9pZDplfX1mdW5jdGlvbiBwdCh0KXtyZXR1cm4gdCYmdC5sZW5ndGg+MD90Lm1hcCgoe2NvbnRleHQ6e3NwYW5JZDp0LHRyYWNlSWQ6bix0cmFjZUZsYWdzOmUsLi4ucn0sYXR0cmlidXRlczpvfSk9Pih7c3Bhbl9pZDp0LHRyYWNlX2lkOm4sc2FtcGxlZDoxPT09ZSxhdHRyaWJ1dGVzOm8sLi4ucn0pKTp2b2lkIDB9ZnVuY3Rpb24gbHQodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P2R0KHQpOkFycmF5LmlzQXJyYXkodCk/dFswXSt0WzFdLzFlOTp0IGluc3RhbmNlb2YgRGF0ZT9kdCh0LmdldFRpbWUoKSk6RygpfWZ1bmN0aW9uIGR0KHQpe3JldHVybiB0Pjk5OTk5OTk5OTk/dC8xZTM6dH1mdW5jdGlvbiBtdCh0KXtpZihmdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdC5nZXRTcGFuSlNPTn0odCkpcmV0dXJuIHQuZ2V0U3BhbkpTT04oKTtjb25zdHtzcGFuSWQ6bix0cmFjZUlkOmV9PXQuc3BhbkNvbnRleHQoKTtpZihmdW5jdGlvbih0KXtjb25zdCBuPXQ7cmV0dXJuISEobi5hdHRyaWJ1dGVzJiZuLnN0YXJ0VGltZSYmbi5uYW1lJiZuLmVuZFRpbWUmJm4uc3RhdHVzKX0odCkpe2NvbnN0e2F0dHJpYnV0ZXM6cixzdGFydFRpbWU6byxuYW1lOnMsZW5kVGltZTppLHN0YXR1czpjLGxpbmtzOnV9PXQ7cmV0dXJue3NwYW5faWQ6bix0cmFjZV9pZDplLGRhdGE6cixkZXNjcmlwdGlvbjpzLHBhcmVudF9zcGFuX2lkOiJwYXJlbnRTcGFuSWQiaW4gdD90LnBhcmVudFNwYW5JZDoicGFyZW50U3BhbkNvbnRleHQiaW4gdD90LnBhcmVudFNwYW5Db250ZXh0Py5zcGFuSWQ6dm9pZCAwLHN0YXJ0X3RpbWVzdGFtcDpsdChvKSx0aW1lc3RhbXA6bHQoaSl8fHZvaWQgMCxzdGF0dXM6Z3QoYyksb3A6clsic2VudHJ5Lm9wIl0sb3JpZ2luOnJbInNlbnRyeS5vcmlnaW4iXSxsaW5rczpwdCh1KX19cmV0dXJue3NwYW5faWQ6bix0cmFjZV9pZDplLHN0YXJ0X3RpbWVzdGFtcDowLGRhdGE6e319fWZ1bmN0aW9uIGd0KHQpe2lmKHQmJjAhPT10LmNvZGUpcmV0dXJuIDE9PT10LmNvZGU/Im9rIjp0Lm1lc3NhZ2V8fCJ1bmtub3duX2Vycm9yIn1mdW5jdGlvbiB5dCh0KXtyZXR1cm4gdC5fc2VudHJ5Um9vdFNwYW58fHR9ZnVuY3Rpb24gYnQodCl7Y29uc3Qgbj1ydCgpO2lmKCFuKXJldHVybnt9O2NvbnN0IGU9eXQodCkscj1tdChlKSxvPXIuZGF0YSxzPWUuc3BhbkNvbnRleHQoKS50cmFjZVN0YXRlLGk9cz8uZ2V0KCJzZW50cnkuc2FtcGxlX3JhdGUiKT8/b1sic2VudHJ5LnNhbXBsZV9yYXRlIl0/P29bInNlbnRyeS5wcmV2aW91c190cmFjZV9zYW1wbGVfcmF0ZSJdO2Z1bmN0aW9uIGModCl7cmV0dXJuIm51bWJlciIhPXR5cGVvZiBpJiYic3RyaW5nIiE9dHlwZW9mIGl8fCh0LnNhbXBsZV9yYXRlPWAke2l9YCksdH1jb25zdCB1PWUuX2Zyb3plbkRzYztpZih1KXJldHVybiBjKHUpO2NvbnN0IGE9cz8uZ2V0KCJzZW50cnkuZHNjIiksZj1hJiZpdChhKTtpZihmKXJldHVybiBjKGYpO2NvbnN0IGg9ZnVuY3Rpb24odCxuKXtjb25zdCBlPW4uZ2V0T3B0aW9ucygpLHtwdWJsaWNLZXk6cn09bi5nZXREc24oKXx8e30sbz17ZW52aXJvbm1lbnQ6ZS5lbnZpcm9ubWVudHx8InByb2R1Y3Rpb24iLHJlbGVhc2U6ZS5yZWxlYXNlLHB1YmxpY19rZXk6cix0cmFjZV9pZDp0LG9yZ19pZDpmdChuKX07cmV0dXJuIG4uZW1pdCgiY3JlYXRlRHNjIixvKSxvfSh0LnNwYW5Db250ZXh0KCkudHJhY2VJZCxuKSxwPW9bInNlbnRyeS5zb3VyY2UiXSxsPXIuZGVzY3JpcHRpb247cmV0dXJuInVybCIhPT1wJiZsJiYoaC50cmFuc2FjdGlvbj1sKSxmdW5jdGlvbigpe2lmKCJib29sZWFuIj09dHlwZW9mIF9fU0VOVFJZX1RSQUNJTkdfXyYmIV9fU0VOVFJZX1RSQUNJTkdfXylyZXR1cm4hMTtjb25zdCB0PXJ0KCk/LmdldE9wdGlvbnMoKTtyZXR1cm4hKCF0fHxudWxsPT10LnRyYWNlc1NhbXBsZVJhdGUmJiF0LnRyYWNlc1NhbXBsZXIpfSgpJiYoaC5zYW1wbGVkPVN0cmluZyhmdW5jdGlvbih0KXtjb25zdHt0cmFjZUZsYWdzOm59PXQuc3BhbkNvbnRleHQoKTtyZXR1cm4gMT09PW59KGUpKSxoLnNhbXBsZV9yYW5kPXM/LmdldCgic2VudHJ5LnNhbXBsZV9yYW5kIik/P290KGUpLnNjb3BlPy5nZXRQcm9wYWdhdGlvbkNvbnRleHQoKS5zYW1wbGVSYW5kLnRvU3RyaW5nKCkpLGMoaCksbi5lbWl0KCJjcmVhdGVEc2MiLGgsZSksaH1mdW5jdGlvbiB2dCh0LG49MTAwLGU9MS8wKXt0cnl7cmV0dXJuIF90KCIiLHQsbixlKX1jYXRjaCh0KXtyZXR1cm57RVJST1I6YCoqbm9uLXNlcmlhbGl6YWJsZSoqICgke3R9KWB9fX1mdW5jdGlvbiBfdCh0LG4sZT0xLzAscj0xLzAsbz1mdW5jdGlvbigpe2NvbnN0IHQ9bmV3IFdlYWtTZXQ7ZnVuY3Rpb24gbihuKXtyZXR1cm4hIXQuaGFzKG4pfHwodC5hZGQobiksITEpfWZ1bmN0aW9uIGUobil7dC5kZWxldGUobil9cmV0dXJuW24sZV19KCkpe2NvbnN0W3MsaV09bztpZihudWxsPT1ufHxbImJvb2xlYW4iLCJzdHJpbmciXS5pbmNsdWRlcyh0eXBlb2Ygbil8fCJudW1iZXIiPT10eXBlb2YgbiYmTnVtYmVyLmlzRmluaXRlKG4pKXJldHVybiBuO2NvbnN0IGM9ZnVuY3Rpb24odCxuKXt0cnl7aWYoImRvbWFpbiI9PT10JiZuJiYib2JqZWN0Ij09dHlwZW9mIG4mJm4uVSlyZXR1cm4iW0RvbWFpbl0iO2lmKCJkb21haW5FbWl0dGVyIj09PXQpcmV0dXJuIltEb21haW5FbWl0dGVyXSI7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWwmJm49PT1nbG9iYWwpcmV0dXJuIltHbG9iYWxdIjtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmbj09PXdpbmRvdylyZXR1cm4iW1dpbmRvd10iO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQmJm49PT1kb2N1bWVudClyZXR1cm4iW0RvY3VtZW50XSI7aWYoIm9iamVjdCI9PXR5cGVvZihlPW4pJiZudWxsIT09ZSYmKGUuX19pc1Z1ZXx8ZS5NKSlyZXR1cm4iW1Z1ZVZpZXdNb2RlbF0iO2lmKGZ1bmN0aW9uKHQpe3JldHVybiBUKHQpJiYibmF0aXZlRXZlbnQiaW4gdCYmInByZXZlbnREZWZhdWx0ImluIHQmJiJzdG9wUHJvcGFnYXRpb24iaW4gdH0obikpcmV0dXJuIltTeW50aGV0aWNFdmVudF0iO2lmKCJudW1iZXIiPT10eXBlb2YgbiYmIU51bWJlci5pc0Zpbml0ZShuKSlyZXR1cm5gWyR7bn1dYDtpZigiZnVuY3Rpb24iPT10eXBlb2YgbilyZXR1cm5gW0Z1bmN0aW9uOiAke2Z1bmN0aW9uKHQpe3RyeXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQubmFtZXx8eH1jYXRjaHtyZXR1cm4geH19KG4pfV1gO2lmKCJzeW1ib2wiPT10eXBlb2YgbilyZXR1cm5gWyR7U3RyaW5nKG4pfV1gO2lmKCJiaWdpbnQiPT10eXBlb2YgbilyZXR1cm5gW0JpZ0ludDogJHtTdHJpbmcobil9XWA7Y29uc3Qgcj1mdW5jdGlvbih0KXtjb25zdCBuPU9iamVjdC5nZXRQcm90b3R5cGVPZih0KTtyZXR1cm4gbj8uY29uc3RydWN0b3I/bi5jb25zdHJ1Y3Rvci5uYW1lOiJudWxsIHByb3RvdHlwZSJ9KG4pO3JldHVybi9eSFRNTChcdyopRWxlbWVudCQvLnRlc3Qocik/YFtIVE1MRWxlbWVudDogJHtyfV1gOmBbb2JqZWN0ICR7cn1dYH1jYXRjaCh0KXtyZXR1cm5gKipub24tc2VyaWFsaXphYmxlKiogKCR7dH0pYH12YXIgZX0odCxuKTtpZighYy5zdGFydHNXaXRoKCJbb2JqZWN0ICIpKXJldHVybiBjO2lmKG4uX19zZW50cnlfc2tpcF9ub3JtYWxpemF0aW9uX18pcmV0dXJuIG47Y29uc3QgdT0ibnVtYmVyIj09dHlwZW9mIG4uX19zZW50cnlfb3ZlcnJpZGVfbm9ybWFsaXphdGlvbl9kZXB0aF9fP24uX19zZW50cnlfb3ZlcnJpZGVfbm9ybWFsaXphdGlvbl9kZXB0aF9fOmU7aWYoMD09PXUpcmV0dXJuIGMucmVwbGFjZSgib2JqZWN0ICIsIiIpO2lmKHMobikpcmV0dXJuIltDaXJjdWxhciB+XSI7Y29uc3QgYT1uO2lmKGEmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLnRvSlNPTil0cnl7cmV0dXJuIF90KCIiLGEudG9KU09OKCksdS0xLHIsbyl9Y2F0Y2h7fWNvbnN0IGY9QXJyYXkuaXNBcnJheShuKT9bXTp7fTtsZXQgaD0wO2NvbnN0IHA9RChuKTtmb3IoY29uc3QgdCBpbiBwKXtpZighT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHAsdCkpY29udGludWU7aWYoaD49cil7Zlt0XT0iW01heFByb3BlcnRpZXMgfl0iO2JyZWFrfWNvbnN0IG49cFt0XTtmW3RdPV90KHQsbix1LTEscixvKSxoKyt9cmV0dXJuIGkobiksZn1mdW5jdGlvbiB3dCh0LG4pe2NvbnN0IGU9bi5yZXBsYWNlKC9cXC9nLCIvIikucmVwbGFjZSgvW3xcXHt9KClbXF1eJCsqPy5dL2csIlxcJCYiKTtsZXQgcj10O3RyeXtyPWRlY29kZVVSSSh0KX1jYXRjaHt9cmV0dXJuIHIucmVwbGFjZSgvXFwvZywiLyIpLnJlcGxhY2UoL3dlYnBhY2s6XC8/L2csIiIpLnJlcGxhY2UobmV3IFJlZ0V4cChgKGZpbGU6Ly8pPy8qJHtlfS8qYCwiaWciKSwiYXBwOi8vLyIpfWZ1bmN0aW9uIFN0KHQsbj1bXSl7cmV0dXJuW3Qsbl19ZnVuY3Rpb24gJHQodCxuKXtjb25zdCBlPXRbMV07Zm9yKGNvbnN0IHQgb2YgZSl7aWYobih0LHRbMF0udHlwZSkpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gRXQodCl7Y29uc3Qgbj1tKHApO3JldHVybiBuLmVuY29kZVBvbHlmaWxsP24uZW5jb2RlUG9seWZpbGwodCk6KG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKHQpfWZ1bmN0aW9uIHh0KHQpe2NvbnN0W24sZV09dDtsZXQgcj1KU09OLnN0cmluZ2lmeShuKTtmdW5jdGlvbiBvKHQpeyJzdHJpbmciPT10eXBlb2Ygcj9yPSJzdHJpbmciPT10eXBlb2YgdD9yK3Q6W0V0KHIpLHRdOnIucHVzaCgic3RyaW5nIj09dHlwZW9mIHQ/RXQodCk6dCl9Zm9yKGNvbnN0IHQgb2YgZSl7Y29uc3RbbixlXT10O2lmKG8oYFxuJHtKU09OLnN0cmluZ2lmeShuKX1cbmApLCJzdHJpbmciPT10eXBlb2YgZXx8ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpbyhlKTtlbHNle2xldCB0O3RyeXt0PUpTT04uc3RyaW5naWZ5KGUpfWNhdGNoe3Q9SlNPTi5zdHJpbmdpZnkodnQoZSkpfW8odCl9fXJldHVybiJzdHJpbmciPT10eXBlb2Ygcj9yOmZ1bmN0aW9uKHQpe2NvbnN0IG49dC5yZWR1Y2UoKHQsbik9PnQrbi5sZW5ndGgsMCksZT1uZXcgVWludDhBcnJheShuKTtsZXQgcj0wO2Zvcihjb25zdCBuIG9mIHQpZS5zZXQobixyKSxyKz1uLmxlbmd0aDtyZXR1cm4gZX0ocil9Y29uc3QgTnQ9e3Nlc3Npb246InNlc3Npb24iLHNlc3Npb25zOiJzZXNzaW9uIixhdHRhY2htZW50OiJhdHRhY2htZW50Iix0cmFuc2FjdGlvbjoidHJhbnNhY3Rpb24iLGV2ZW50OiJlcnJvciIsY2xpZW50X3JlcG9ydDoiaW50ZXJuYWwiLHVzZXJfcmVwb3J0OiJkZWZhdWx0Iixwcm9maWxlOiJwcm9maWxlIixwcm9maWxlX2NodW5rOiJwcm9maWxlIixyZXBsYXlfZXZlbnQ6InJlcGxheSIscmVwbGF5X3JlY29yZGluZzoicmVwbGF5IixjaGVja19pbjoibW9uaXRvciIsZmVlZGJhY2s6ImZlZWRiYWNrIixzcGFuOiJzcGFuIixyYXdfc2VjdXJpdHk6InNlY3VyaXR5Iixsb2c6ImxvZ19pdGVtIn07ZnVuY3Rpb24gQ3QodCl7aWYoIXQ/LnNkaylyZXR1cm47Y29uc3R7bmFtZTpuLHZlcnNpb246ZX09dC5zZGs7cmV0dXJue25hbWU6bix2ZXJzaW9uOmV9fWZ1bmN0aW9uIGt0KHQsbixlLHIpe2NvbnN0IG89Q3QoZSkscz10LnR5cGUmJiJyZXBsYXlfZXZlbnQiIT09dC50eXBlP3QudHlwZToiZXZlbnQiOyFmdW5jdGlvbih0LG4pe2lmKCFuKXJldHVybiB0O2NvbnN0IGU9dC5zZGt8fHt9O3Quc2RrPXsuLi5lLG5hbWU6ZS5uYW1lfHxuLm5hbWUsdmVyc2lvbjplLnZlcnNpb258fG4udmVyc2lvbixpbnRlZ3JhdGlvbnM6Wy4uLnQuc2RrPy5pbnRlZ3JhdGlvbnN8fFtdLC4uLm4uaW50ZWdyYXRpb25zfHxbXV0scGFja2FnZXM6Wy4uLnQuc2RrPy5wYWNrYWdlc3x8W10sLi4ubi5wYWNrYWdlc3x8W11dLHNldHRpbmdzOnQuc2RrPy5zZXR0aW5nc3x8bi5zZXR0aW5ncz97Li4udC5zZGs/LnNldHRpbmdzLC4uLm4uc2V0dGluZ3N9OnZvaWQgMH19KHQsZT8uc2RrKTtjb25zdCBpPWZ1bmN0aW9uKHQsbixlLHIpe2NvbnN0IG89dC5zZGtQcm9jZXNzaW5nTWV0YWRhdGE/LmR5bmFtaWNTYW1wbGluZ0NvbnRleHQ7cmV0dXJue2V2ZW50X2lkOnQuZXZlbnRfaWQsc2VudF9hdDoobmV3IERhdGUpLnRvSVNPU3RyaW5nKCksLi4ubiYme3NkazpufSwuLi4hIWUmJnImJntkc246YXQocil9LC4uLm8mJnt0cmFjZTpvfX19KHQsbyxyLG4pO2RlbGV0ZSB0LnNka1Byb2Nlc3NpbmdNZXRhZGF0YTtyZXR1cm4gU3QoaSxbW3t0eXBlOnN9LHRdXSl9Y29uc3QgVHQ9Il9fU0VOVFJZX1NVUFBSRVNTX1RSQUNJTkdfXyI7ZnVuY3Rpb24ganQodCl7Y29uc3Qgbj1ldChkKCkpO3JldHVybiBuLnN1cHByZXNzVHJhY2luZz9uLnN1cHByZXNzVHJhY2luZyh0KTpmdW5jdGlvbiguLi50KXtjb25zdCBuPWV0KGQoKSk7aWYoMj09PXQubGVuZ3RoKXtjb25zdFtlLHJdPXQ7cmV0dXJuIGU/bi53aXRoU2V0U2NvcGUoZSxyKTpuLndpdGhTY29wZShyKX1yZXR1cm4gbi53aXRoU2NvcGUodFswXSl9KG49PntuLnNldFNES1Byb2Nlc3NpbmdNZXRhZGF0YSh7W1R0XTohMH0pO2NvbnN0IGU9dCgpO3JldHVybiBuLnNldFNES1Byb2Nlc3NpbmdNZXRhZGF0YSh7W1R0XTp2b2lkIDB9KSxlfSl9ZnVuY3Rpb24gSXQodCl7cmV0dXJuIG5ldyBPdChuPT57bih0KX0pfWNsYXNzIE90e2NvbnN0cnVjdG9yKHQpe3RoaXMuTD0wLHRoaXMuQj1bXSx0aGlzLkcodCl9dGhlbih0LG4pe3JldHVybiBuZXcgT3QoKGUscik9Pnt0aGlzLkIucHVzaChbITEsbj0+e2lmKHQpdHJ5e2UodChuKSl9Y2F0Y2godCl7cih0KX1lbHNlIGUobil9LHQ9PntpZihuKXRyeXtlKG4odCkpfWNhdGNoKHQpe3IodCl9ZWxzZSByKHQpfV0pLHRoaXMuSCgpfSl9Y2F0Y2godCl7cmV0dXJuIHRoaXMudGhlbih0PT50LHQpfWZpbmFsbHkodCl7cmV0dXJuIG5ldyBPdCgobixlKT0+e2xldCByLG87cmV0dXJuIHRoaXMudGhlbihuPT57bz0hMSxyPW4sdCYmdCgpfSxuPT57bz0hMCxyPW4sdCYmdCgpfSkudGhlbigoKT0+e28/ZShyKTpuKHIpfSl9KX1IKCl7aWYoMD09PXRoaXMuTClyZXR1cm47Y29uc3QgdD10aGlzLkIuc2xpY2UoKTt0aGlzLkI9W10sdC5mb3JFYWNoKHQ9Pnt0WzBdfHwoMT09PXRoaXMuTCYmdFsxXSh0aGlzLkopLDI9PT10aGlzLkwmJnRbMl0odGhpcy5KKSx0WzBdPSEwKX0pfUcodCl7Y29uc3Qgbj0odCxuKT0+ezA9PT10aGlzLkwmJihqKG4pP24udGhlbihlLHIpOih0aGlzLkw9dCx0aGlzLko9bix0aGlzLkgoKSkpfSxlPXQ9PntuKDEsdCl9LHI9dD0+e24oMix0KX07dHJ5e3QoZSxyKX1jYXRjaCh0KXtyKHQpfX19ZnVuY3Rpb24gUnQodCxuKXtjb25zdHtmaW5nZXJwcmludDplLHNwYW46cixicmVhZGNydW1iczpvLHNka1Byb2Nlc3NpbmdNZXRhZGF0YTpzfT1uOyFmdW5jdGlvbih0LG4pe2NvbnN0e2V4dHJhOmUsdGFnczpyLHVzZXI6byxjb250ZXh0czpzLGxldmVsOmksdHJhbnNhY3Rpb25OYW1lOmN9PW47T2JqZWN0LmtleXMoZSkubGVuZ3RoJiYodC5leHRyYT17Li4uZSwuLi50LmV4dHJhfSk7T2JqZWN0LmtleXMocikubGVuZ3RoJiYodC50YWdzPXsuLi5yLC4uLnQudGFnc30pO09iamVjdC5rZXlzKG8pLmxlbmd0aCYmKHQudXNlcj17Li4ubywuLi50LnVzZXJ9KTtPYmplY3Qua2V5cyhzKS5sZW5ndGgmJih0LmNvbnRleHRzPXsuLi5zLC4uLnQuY29udGV4dHN9KTtpJiYodC5sZXZlbD1pKTtjJiYidHJhbnNhY3Rpb24iIT09dC50eXBlJiYodC50cmFuc2FjdGlvbj1jKX0odCxuKSxyJiZmdW5jdGlvbih0LG4pe3QuY29udGV4dHM9e3RyYWNlOmh0KG4pLC4uLnQuY29udGV4dHN9LHQuc2RrUHJvY2Vzc2luZ01ldGFkYXRhPXtkeW5hbWljU2FtcGxpbmdDb250ZXh0OmJ0KG4pLC4uLnQuc2RrUHJvY2Vzc2luZ01ldGFkYXRhfTtjb25zdCBlPXl0KG4pLHI9bXQoZSkuZGVzY3JpcHRpb247ciYmIXQudHJhbnNhY3Rpb24mJiJ0cmFuc2FjdGlvbiI9PT10LnR5cGUmJih0LnRyYW5zYWN0aW9uPXIpfSh0LHIpLGZ1bmN0aW9uKHQsbil7dC5maW5nZXJwcmludD10LmZpbmdlcnByaW50P0FycmF5LmlzQXJyYXkodC5maW5nZXJwcmludCk/dC5maW5nZXJwcmludDpbdC5maW5nZXJwcmludF06W10sbiYmKHQuZmluZ2VycHJpbnQ9dC5maW5nZXJwcmludC5jb25jYXQobikpO3QuZmluZ2VycHJpbnQubGVuZ3RofHxkZWxldGUgdC5maW5nZXJwcmludH0odCxlKSxmdW5jdGlvbih0LG4pe2NvbnN0IGU9Wy4uLnQuYnJlYWRjcnVtYnN8fFtdLC4uLm5dO3QuYnJlYWRjcnVtYnM9ZS5sZW5ndGg/ZTp2b2lkIDB9KHQsbyksZnVuY3Rpb24odCxuKXt0LnNka1Byb2Nlc3NpbmdNZXRhZGF0YT17Li4udC5zZGtQcm9jZXNzaW5nTWV0YWRhdGEsLi4ubn19KHQscyl9Y29uc3QgQXQ9U3ltYm9sLmZvcigiU2VudHJ5QnVmZmVyRnVsbEVycm9yIik7ZnVuY3Rpb24gRHQodCl7Y29uc3Qgbj1bXTtmdW5jdGlvbiBlKHQpe3JldHVybiBuLnNwbGljZShuLmluZGV4T2YodCksMSlbMF18fFByb21pc2UucmVzb2x2ZSh2b2lkIDApfXJldHVybnskOm4sYWRkOmZ1bmN0aW9uKHIpe2lmKCEodm9pZCAwPT09dHx8bi5sZW5ndGg8dCkpcmV0dXJuIG89QXQsbmV3IE90KCh0LG4pPT57bihvKX0pO3ZhciBvO2NvbnN0IHM9cigpO3JldHVybi0xPT09bi5pbmRleE9mKHMpJiZuLnB1c2gocykscy50aGVuKCgpPT5lKHMpKS50aGVuKG51bGwsKCk9PmUocykudGhlbihudWxsLCgpPT57fSkpLHN9LGRyYWluOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgT3QoKGUscik9PntsZXQgbz1uLmxlbmd0aDtpZighbylyZXR1cm4gZSghMCk7Y29uc3Qgcz1zZXRUaW1lb3V0KCgpPT57dCYmdD4wJiZlKCExKX0sdCk7bi5mb3JFYWNoKHQ9PntJdCh0KS50aGVuKCgpPT57LS1vfHwoY2xlYXJUaW1lb3V0KHMpLGUoITApKX0scil9KX0pfX19ZnVuY3Rpb24gUHQodCx7c3RhdHVzQ29kZTpuLGhlYWRlcnM6ZX0scj1EYXRlLm5vdygpKXtjb25zdCBvPXsuLi50fSxzPWU/LlsieC1zZW50cnktcmF0ZS1saW1pdHMiXSxpPWU/LlsicmV0cnktYWZ0ZXIiXTtpZihzKWZvcihjb25zdCB0IG9mIHMudHJpbSgpLnNwbGl0KCIsIikpe2NvbnN0W24sZSwsLHNdPXQuc3BsaXQoIjoiLDUpLGk9cGFyc2VJbnQobiwxMCksYz0xZTMqKGlzTmFOKGkpPzYwOmkpO2lmKGUpZm9yKGNvbnN0IHQgb2YgZS5zcGxpdCgiOyIpKSJtZXRyaWNfYnVja2V0Ij09PXQmJnMmJiFzLnNwbGl0KCI7IikuaW5jbHVkZXMoImN1c3RvbSIpfHwob1t0XT1yK2MpO2Vsc2Ugby5hbGw9citjfWVsc2UgaT9vLmFsbD1yK2Z1bmN0aW9uKHQsbj1EYXRlLm5vdygpKXtjb25zdCBlPXBhcnNlSW50KGAke3R9YCwxMCk7aWYoIWlzTmFOKGUpKXJldHVybiAxZTMqZTtjb25zdCByPURhdGUucGFyc2UoYCR7dH1gKTtyZXR1cm4gaXNOYU4ocik/NmU0OnItbn0oaSxyKTo0Mjk9PT1uJiYoby5hbGw9cis2ZTQpO3JldHVybiBvfWZ1bmN0aW9uIFV0KHQsbixlPUR0KHQuYnVmZmVyU2l6ZXx8NjQpKXtsZXQgcj17fTtyZXR1cm57c2VuZDpmdW5jdGlvbih0KXtjb25zdCBvPVtdO2lmKCR0KHQsKHQsbik9Pntjb25zdCBlPWZ1bmN0aW9uKHQpe3JldHVybiBOdFt0XX0obik7KGZ1bmN0aW9uKHQsbixlPURhdGUubm93KCkpe3JldHVybiBmdW5jdGlvbih0LG4pe3JldHVybiB0W25dfHx0LmFsbHx8MH0odCxuKT5lfSkocixlKXx8by5wdXNoKHQpfSksMD09PW8ubGVuZ3RoKXJldHVybiBJdCh7fSk7Y29uc3Qgcz1TdCh0WzBdLG8pLGk9dD0+eyR0KHMsKHQsbik9Pnt9KX07cmV0dXJuIGUuYWRkKCgpPT5uKHtib2R5Onh0KHMpfSkudGhlbih0PT4odm9pZCAwIT09dC5zdGF0dXNDb2RlJiYodC5zdGF0dXNDb2RlPDIwMHx8dC5zdGF0dXNDb2RlPj0zMDApJiZoJiZTLndhcm4oYFNlbnRyeSByZXNwb25kZWQgd2l0aCBzdGF0dXMgY29kZSAke3Quc3RhdHVzQ29kZX0gdG8gc2VudCBldmVudC5gKSxyPVB0KHIsdCksdCksdD0+e3Rocm93IGkoKSxoJiZTLmVycm9yKCJFbmNvdW50ZXJlZCBlcnJvciBydW5uaW5nIHRyYW5zcG9ydCByZXF1ZXN0OiIsdCksdH0pKS50aGVuKHQ9PnQsdD0+e2lmKHQ9PT1BdClyZXR1cm4gaCYmUy5lcnJvcigiU2tpcHBlZCBzZW5kaW5nIGV2ZW50IGJlY2F1c2UgYnVmZmVyIGlzIGZ1bGwuIiksaSgpLEl0KHt9KTt0aHJvdyB0fSl9LGZsdXNoOnQ9PmUuZHJhaW4odCl9fWNvbnN0IE10PS9eKFxTKzpcXHxcLz8pKFtcc1xTXSo/KSgoPzpcLnsxLDJ9fFteL1xcXSs/fCkoXC5bXi4vXFxdKnwpKSg/OlsvXFxdKikkLztmdW5jdGlvbiBMdCh0KXtjb25zdCBuPWZ1bmN0aW9uKHQpe2NvbnN0IG49dC5sZW5ndGg+MTAyND9gPHRydW5jYXRlZD4ke3Quc2xpY2UoLTEwMjQpfWA6dCxlPU10LmV4ZWMobik7cmV0dXJuIGU/ZS5zbGljZSgxKTpbXX0odCksZT1uWzBdfHwiIjtsZXQgcj1uWzFdO3JldHVybiBlfHxyPyhyJiYocj1yLnNsaWNlKDAsci5sZW5ndGgtMSkpLGUrcik6Ii4ifWZ1bmN0aW9uIEJ0KHQsbj0hMSl7cmV0dXJuIShufHx0JiYhdC5zdGFydHNXaXRoKCIvIikmJiF0Lm1hdGNoKC9eW0EtWl06LykmJiF0LnN0YXJ0c1dpdGgoIi4iKSYmIXQubWF0Y2goL15bYS16QS1aXShbYS16QS1aMC05LlwtK10pKjpcL1wvLykpJiZ2b2lkIDAhPT10JiYhdC5pbmNsdWRlcygibm9kZV9tb2R1bGVzLyIpfWNvbnN0IEd0PVN5bWJvbCgiQWdlbnRCYXNlSW50ZXJuYWxTdGF0ZSIpO2NsYXNzIEh0IGV4dGVuZHMgcy5BZ2VudHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzW0d0XT17fX1pc1NlY3VyZUVuZHBvaW50KHQpe2lmKHQpe2lmKCJib29sZWFuIj09dHlwZW9mIHQuc2VjdXJlRW5kcG9pbnQpcmV0dXJuIHQuc2VjdXJlRW5kcG9pbnQ7aWYoInN0cmluZyI9PXR5cGVvZiB0LnByb3RvY29sKXJldHVybiJodHRwczoiPT09dC5wcm90b2NvbH1jb25zdHtzdGFjazpufT1uZXcgRXJyb3I7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBuJiZuLnNwbGl0KCJcbiIpLnNvbWUodD0+LTEhPT10LmluZGV4T2YoIihodHRwcy5qczoiKXx8LTEhPT10LmluZGV4T2YoIm5vZGU6aHR0cHM6IikpfWNyZWF0ZVNvY2tldCh0LG4sZSl7Y29uc3Qgcj17Li4ubixzZWN1cmVFbmRwb2ludDp0aGlzLmlzU2VjdXJlRW5kcG9pbnQobil9O1Byb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PnRoaXMuY29ubmVjdCh0LHIpKS50aGVuKG89PntpZihvIGluc3RhbmNlb2Ygcy5BZ2VudClyZXR1cm4gby5hZGRSZXF1ZXN0KHQscik7dGhpc1tHdF0uY3VycmVudFNvY2tldD1vLHN1cGVyLmNyZWF0ZVNvY2tldCh0LG4sZSl9LGUpfWNyZWF0ZUNvbm5lY3Rpb24oKXtjb25zdCB0PXRoaXNbR3RdLmN1cnJlbnRTb2NrZXQ7aWYodGhpc1tHdF0uY3VycmVudFNvY2tldD12b2lkIDAsIXQpdGhyb3cgbmV3IEVycm9yKCJObyBzb2NrZXQgd2FzIHJldHVybmVkIGluIHRoZSBgY29ubmVjdCgpYCBmdW5jdGlvbiIpO3JldHVybiB0fWdldCBkZWZhdWx0UG9ydCgpe3JldHVybiB0aGlzW0d0XS5kZWZhdWx0UG9ydD8/KCJodHRwczoiPT09dGhpcy5wcm90b2NvbD80NDM6ODApfXNldCBkZWZhdWx0UG9ydCh0KXt0aGlzW0d0XSYmKHRoaXNbR3RdLmRlZmF1bHRQb3J0PXQpfWdldCBwcm90b2NvbCgpe3JldHVybiB0aGlzW0d0XS5wcm90b2NvbD8/KHRoaXMuaXNTZWN1cmVFbmRwb2ludCgpPyJodHRwczoiOiJodHRwOiIpfXNldCBwcm90b2NvbCh0KXt0aGlzW0d0XSYmKHRoaXNbR3RdLnByb3RvY29sPXQpfX1mdW5jdGlvbiBKdCguLi50KXtTLmxvZygiW2h0dHBzLXByb3h5LWFnZW50OnBhcnNlLXByb3h5LXJlc3BvbnNlXSIsLi4udCl9ZnVuY3Rpb24genQodCl7cmV0dXJuIG5ldyBQcm9taXNlKChuLGUpPT57bGV0IHI9MDtjb25zdCBvPVtdO2Z1bmN0aW9uIHMoKXtjb25zdCBjPXQucmVhZCgpO2M/ZnVuY3Rpb24oYyl7by5wdXNoKGMpLHIrPWMubGVuZ3RoO2NvbnN0IHU9QnVmZmVyLmNvbmNhdChvLHIpLGE9dS5pbmRleE9mKCJcclxuXHJcbiIpO2lmKC0xPT09YSlyZXR1cm4gSnQoImhhdmUgbm90IHJlY2VpdmVkIGVuZCBvZiBIVFRQIGhlYWRlcnMgeWV0Li4uIiksdm9pZCBzKCk7Y29uc3QgZj11LnN1YmFycmF5KDAsYSkudG9TdHJpbmcoImFzY2lpIikuc3BsaXQoIlxyXG4iKSxoPWYuc2hpZnQoKTtpZighaClyZXR1cm4gdC5kZXN0cm95KCksZShuZXcgRXJyb3IoIk5vIGhlYWRlciByZWNlaXZlZCBmcm9tIHByb3h5IENPTk5FQ1QgcmVzcG9uc2UiKSk7Y29uc3QgcD1oLnNwbGl0KCIgIiksbD0rKHBbMV18fDApLGQ9cC5zbGljZSgyKS5qb2luKCIgIiksbT17fTtmb3IoY29uc3QgbiBvZiBmKXtpZighbiljb250aW51ZTtjb25zdCByPW4uaW5kZXhPZigiOiIpO2lmKC0xPT09cilyZXR1cm4gdC5kZXN0cm95KCksZShuZXcgRXJyb3IoYEludmFsaWQgaGVhZGVyIGZyb20gcHJveHkgQ09OTkVDVCByZXNwb25zZTogIiR7bn0iYCkpO2NvbnN0IG89bi5zbGljZSgwLHIpLnRvTG93ZXJDYXNlKCkscz1uLnNsaWNlKHIrMSkudHJpbVN0YXJ0KCksaT1tW29dOyJzdHJpbmciPT10eXBlb2YgaT9tW29dPVtpLHNdOkFycmF5LmlzQXJyYXkoaSk/aS5wdXNoKHMpOm1bb109c31KdCgiZ290IHByb3h5IHNlcnZlciByZXNwb25zZTogJW8gJW8iLGgsbSksaSgpLG4oe2Nvbm5lY3Q6e3N0YXR1c0NvZGU6bCxzdGF0dXNUZXh0OmQsaGVhZGVyczptfSxidWZmZXJlZDp1fSl9KGMpOnQub25jZSgicmVhZGFibGUiLHMpfWZ1bmN0aW9uIGkoKXt0LnJlbW92ZUxpc3RlbmVyKCJlbmQiLGMpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIix1KSx0LnJlbW92ZUxpc3RlbmVyKCJyZWFkYWJsZSIscyl9ZnVuY3Rpb24gYygpe2koKSxKdCgib25lbmQiKSxlKG5ldyBFcnJvcigiUHJveHkgY29ubmVjdGlvbiBlbmRlZCBiZWZvcmUgcmVjZWl2aW5nIENPTk5FQ1QgcmVzcG9uc2UiKSl9ZnVuY3Rpb24gdSh0KXtpKCksSnQoIm9uZXJyb3IgJW8iLHQpLGUodCl9dC5vbigiZXJyb3IiLHUpLHQub24oImVuZCIsYykscygpfSl9ZnVuY3Rpb24gRnQoLi4udCl7Uy5sb2coIltodHRwcy1wcm94eS1hZ2VudF0iLC4uLnQpfWNsYXNzIFd0IGV4dGVuZHMgSHR7c3RhdGljIF9faW5pdFN0YXRpYygpe3RoaXMucHJvdG9jb2xzPVsiaHR0cCIsImh0dHBzIl19Y29uc3RydWN0b3IodCxuKXtzdXBlcihuKSx0aGlzLm9wdGlvbnM9e30sdGhpcy5wcm94eT0ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IFVSTCh0KTp0LHRoaXMucHJveHlIZWFkZXJzPW4/LmhlYWRlcnM/P3t9LEZ0KCJDcmVhdGluZyBuZXcgSHR0cHNQcm94eUFnZW50IGluc3RhbmNlOiAlbyIsdGhpcy5wcm94eS5ocmVmKTtjb25zdCBlPSh0aGlzLnByb3h5Lmhvc3RuYW1lfHx0aGlzLnByb3h5Lmhvc3QpLnJlcGxhY2UoL15cW3xcXSQvZywiIikscj10aGlzLnByb3h5LnBvcnQ/cGFyc2VJbnQodGhpcy5wcm94eS5wb3J0LDEwKToiaHR0cHM6Ij09PXRoaXMucHJveHkucHJvdG9jb2w/NDQzOjgwO3RoaXMuY29ubmVjdE9wdHM9e0FMUE5Qcm90b2NvbHM6WyJodHRwLzEuMSJdLC4uLm4/S3QobiwiaGVhZGVycyIpOm51bGwsaG9zdDplLHBvcnQ6cn19YXN5bmMgY29ubmVjdCh0LG4pe2NvbnN0e3Byb3h5OmV9PXRoaXM7aWYoIW4uaG9zdCl0aHJvdyBuZXcgVHlwZUVycm9yKCdObyAiaG9zdCIgcHJvdmlkZWQnKTtsZXQgcjtpZigiaHR0cHM6Ij09PWUucHJvdG9jb2wpe0Z0KCJDcmVhdGluZyBgdGxzLlNvY2tldGA6ICVvIix0aGlzLmNvbm5lY3RPcHRzKTtjb25zdCB0PXRoaXMuY29ubmVjdE9wdHMuc2VydmVybmFtZXx8dGhpcy5jb25uZWN0T3B0cy5ob3N0O3I9Zi5jb25uZWN0KHsuLi50aGlzLmNvbm5lY3RPcHRzLHNlcnZlcm5hbWU6dCYmYS5pc0lQKHQpP3ZvaWQgMDp0fSl9ZWxzZSBGdCgiQ3JlYXRpbmcgYG5ldC5Tb2NrZXRgOiAlbyIsdGhpcy5jb25uZWN0T3B0cykscj1hLmNvbm5lY3QodGhpcy5jb25uZWN0T3B0cyk7Y29uc3Qgbz0iZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wcm94eUhlYWRlcnM/dGhpcy5wcm94eUhlYWRlcnMoKTp7Li4udGhpcy5wcm94eUhlYWRlcnN9LHM9YS5pc0lQdjYobi5ob3N0KT9gWyR7bi5ob3N0fV1gOm4uaG9zdDtsZXQgaT1gQ09OTkVDVCAke3N9OiR7bi5wb3J0fSBIVFRQLzEuMVxyXG5gO2lmKGUudXNlcm5hbWV8fGUucGFzc3dvcmQpe2NvbnN0IHQ9YCR7ZGVjb2RlVVJJQ29tcG9uZW50KGUudXNlcm5hbWUpfToke2RlY29kZVVSSUNvbXBvbmVudChlLnBhc3N3b3JkKX1gO29bIlByb3h5LUF1dGhvcml6YXRpb24iXT1gQmFzaWMgJHtCdWZmZXIuZnJvbSh0KS50b1N0cmluZygiYmFzZTY0Iil9YH1vLkhvc3Q9YCR7c306JHtuLnBvcnR9YCxvWyJQcm94eS1Db25uZWN0aW9uIl18fChvWyJQcm94eS1Db25uZWN0aW9uIl09dGhpcy5rZWVwQWxpdmU/IktlZXAtQWxpdmUiOiJjbG9zZSIpO2Zvcihjb25zdCB0IG9mIE9iamVjdC5rZXlzKG8pKWkrPWAke3R9OiAke29bdF19XHJcbmA7Y29uc3QgYz16dChyKTtyLndyaXRlKGAke2l9XHJcbmApO2NvbnN0e2Nvbm5lY3Q6dSxidWZmZXJlZDpofT1hd2FpdCBjO2lmKHQuZW1pdCgicHJveHlDb25uZWN0Iix1KSx0aGlzLmVtaXQoInByb3h5Q29ubmVjdCIsdSx0KSwyMDA9PT11LnN0YXR1c0NvZGUpe2lmKHQub25jZSgic29ja2V0IixZdCksbi5zZWN1cmVFbmRwb2ludCl7RnQoIlVwZ3JhZGluZyBzb2NrZXQgY29ubmVjdGlvbiB0byBUTFMiKTtjb25zdCB0PW4uc2VydmVybmFtZXx8bi5ob3N0O3JldHVybiBmLmNvbm5lY3Qoey4uLkt0KG4sImhvc3QiLCJwYXRoIiwicG9ydCIpLHNvY2tldDpyLHNlcnZlcm5hbWU6YS5pc0lQKHQpP3ZvaWQgMDp0fSl9cmV0dXJuIHJ9ci5kZXN0cm95KCk7Y29uc3QgcD1uZXcgYS5Tb2NrZXQoe3dyaXRhYmxlOiExfSk7cmV0dXJuIHAucmVhZGFibGU9ITAsdC5vbmNlKCJzb2NrZXQiLHQ9PntGdCgiUmVwbGF5aW5nIHByb3h5IGJ1ZmZlciBmb3IgZmFpbGVkIHJlcXVlc3QiKSx0LnB1c2goaCksdC5wdXNoKG51bGwpfSkscH19ZnVuY3Rpb24gWXQodCl7dC5yZXN1bWUoKX1mdW5jdGlvbiBLdCh0LC4uLm4pe2NvbnN0IGU9e307bGV0IHI7Zm9yKHIgaW4gdCluLmluY2x1ZGVzKHIpfHwoZVtyXT10W3JdKTtyZXR1cm4gZX1XdC5fX2luaXRTdGF0aWMoKTtmdW5jdGlvbiBadCh0KXtyZXR1cm4gdC5yZXBsYWNlKC9eW0EtWl06LywiIikucmVwbGFjZSgvXFwvZywiLyIpfWNvbnN0IFZ0PW47bGV0IHF0LFF0PTAsWHQ9e307ZnVuY3Rpb24gdG4odCl7VnQuZGVidWcmJmNvbnNvbGUubG9nKGBbQU5SIFdvcmtlcl0gJHt0fWApfXZhciBubixlbixybjtjb25zdCBvbj1mdW5jdGlvbih0KXtsZXQgbjt0cnl7bj1uZXcgVVJMKHQudXJsKX1jYXRjaChuKXtyZXR1cm4gYigoKT0+e2NvbnNvbGUud2FybigiW0BzZW50cnkvbm9kZV06IEludmFsaWQgZHNuIG9yIHR1bm5lbCBvcHRpb24sIHdpbGwgbm90IHNlbmQgYW55IGV2ZW50cy4gVGhlIHR1bm5lbCBvcHRpb24gbXVzdCBiZSBhIGZ1bGwgVVJMIHdoZW4gdXNlZC4iKX0pLFV0KHQsKCk9PlByb21pc2UucmVzb2x2ZSh7fSkpfWNvbnN0IGU9Imh0dHBzOiI9PT1uLnByb3RvY29sLHI9ZnVuY3Rpb24odCxuKXtjb25zdHtub19wcm94eTplfT1wcm9jZXNzLmVudixyPWU/LnNwbGl0KCIsIikuc29tZShuPT50Lmhvc3QuZW5kc1dpdGgobil8fHQuaG9zdG5hbWUuZW5kc1dpdGgobikpO3JldHVybiByP3ZvaWQgMDpufShuLHQucHJveHl8fChlP3Byb2Nlc3MuZW52Lmh0dHBzX3Byb3h5OnZvaWQgMCl8fHByb2Nlc3MuZW52Lmh0dHBfcHJveHkpLG89ZT9pOnMsYT12b2lkIDAhPT10LmtlZXBBbGl2ZSYmdC5rZWVwQWxpdmUsZj1yP25ldyBXdChyKTpuZXcgby5BZ2VudCh7a2VlcEFsaXZlOmEsbWF4U29ja2V0czozMCx0aW1lb3V0OjJlM30pLGg9ZnVuY3Rpb24odCxuLGUpe2NvbnN0e2hvc3RuYW1lOnIscGF0aG5hbWU6byxwb3J0OnMscHJvdG9jb2w6aSxzZWFyY2g6YX09bmV3IFVSTCh0LnVybCk7cmV0dXJuIGZ1bmN0aW9uKGYpe3JldHVybiBuZXcgUHJvbWlzZSgoaCxwKT0+e2p0KCgpPT57bGV0IGw9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBjKHtyZWFkKCl7dGhpcy5wdXNoKHQpLHRoaXMucHVzaChudWxsKX19KX0oZi5ib2R5KTtjb25zdCBkPXsuLi50LmhlYWRlcnN9O2YuYm9keS5sZW5ndGg+MzI3NjgmJihkWyJjb250ZW50LWVuY29kaW5nIl09Imd6aXAiLGw9bC5waXBlKHUoKSkpO2NvbnN0IG09bi5yZXF1ZXN0KHttZXRob2Q6IlBPU1QiLGFnZW50OmUsaGVhZGVyczpkLGhvc3RuYW1lOnIscGF0aDpgJHtvfSR7YX1gLHBvcnQ6cyxwcm90b2NvbDppLGNhOnQuY2FDZXJ0c30sdD0+e3Qub24oImRhdGEiLCgpPT57fSksdC5vbigiZW5kIiwoKT0+e30pLHQuc2V0RW5jb2RpbmcoInV0ZjgiKTtjb25zdCBuPXQuaGVhZGVyc1sicmV0cnktYWZ0ZXIiXT8/bnVsbCxlPXQuaGVhZGVyc1sieC1zZW50cnktcmF0ZS1saW1pdHMiXT8/bnVsbDtoKHtzdGF0dXNDb2RlOnQuc3RhdHVzQ29kZSxoZWFkZXJzOnsicmV0cnktYWZ0ZXIiOm4sIngtc2VudHJ5LXJhdGUtbGltaXRzIjpBcnJheS5pc0FycmF5KGUpP2VbMF18fG51bGw6ZX19KX0pO20ub24oImVycm9yIixwKSxsLnBpcGUobSl9KX0pfX0odCx0Lmh0dHBNb2R1bGU/P28sZik7cmV0dXJuIFV0KHQsaCl9KHt1cmw6KG5uPVZ0LmRzbixlbj1WdC50dW5uZWwscm49VnQuc2RrTWV0YWRhdGEuc2RrLGVufHxgJHtmdW5jdGlvbih0KXtyZXR1cm5gJHtmdW5jdGlvbih0KXtjb25zdCBuPXQucHJvdG9jb2w/YCR7dC5wcm90b2NvbH06YDoiIixlPXQucG9ydD9gOiR7dC5wb3J0fWA6IiI7cmV0dXJuYCR7bn0vLyR7dC5ob3N0fSR7ZX0ke3QucGF0aD9gLyR7dC5wYXRofWA6IiJ9L2FwaS9gfSh0KX0ke3QucHJvamVjdElkfS9lbnZlbG9wZS9gfShubil9PyR7ZnVuY3Rpb24odCxuKXtjb25zdCBlPXtzZW50cnlfdmVyc2lvbjoiNyJ9O3JldHVybiB0LnB1YmxpY0tleSYmKGUuc2VudHJ5X2tleT10LnB1YmxpY0tleSksbiYmKGUuc2VudHJ5X2NsaWVudD1gJHtuLm5hbWV9LyR7bi52ZXJzaW9ufWApLG5ldyBVUkxTZWFyY2hQYXJhbXMoZSkudG9TdHJpbmcoKX0obm4scm4pfWApfSk7YXN5bmMgZnVuY3Rpb24gc24oKXtpZihxdCl7dG4oIlNlbmRpbmcgYWJub3JtYWwgc2Vzc2lvbiIpLEoocXQse3N0YXR1czoiYWJub3JtYWwiLGFibm9ybWFsX21lY2hhbmlzbToiYW5yX2ZvcmVncm91bmQiLHJlbGVhc2U6VnQucmVsZWFzZSxlbnZpcm9ubWVudDpWdC5lbnZpcm9ubWVudH0pO2NvbnN0IHQ9ZnVuY3Rpb24odCxuLGUscil7Y29uc3Qgbz1DdChlKTtyZXR1cm4gU3Qoe3NlbnRfYXQ6KG5ldyBEYXRlKS50b0lTT1N0cmluZygpLC4uLm8mJntzZGs6b30sLi4uISFyJiZuJiZ7ZHNuOmF0KG4pfX0sWyJhZ2dyZWdhdGVzImluIHQ/W3t0eXBlOiJzZXNzaW9ucyJ9LHRdOlt7dHlwZToic2Vzc2lvbiJ9LHQudG9KU09OKCldXSl9KHF0LFZ0LmRzbixWdC5zZGtNZXRhZGF0YSxWdC50dW5uZWwpO3RuKEpTT04uc3RyaW5naWZ5KHQpKSxhd2FpdCBvbi5zZW5kKHQpO3RyeXtlPy5wb3N0TWVzc2FnZSgic2Vzc2lvbi1lbmRlZCIpfWNhdGNoe319fWZ1bmN0aW9uIGNuKHQpe2lmKCF0KXJldHVybjtjb25zdCBuPWZ1bmN0aW9uKHQpe2lmKCF0Lmxlbmd0aClyZXR1cm5bXTtjb25zdCBuPUFycmF5LmZyb20odCk7cmV0dXJuL3NlbnRyeVdyYXBwZWQvLnRlc3QoRShuKS5mdW5jdGlvbnx8IiIpJiZuLnBvcCgpLG4ucmV2ZXJzZSgpLCQudGVzdChFKG4pLmZ1bmN0aW9ufHwiIikmJihuLnBvcCgpLCQudGVzdChFKG4pLmZ1bmN0aW9ufHwiIikmJm4ucG9wKCkpLG4uc2xpY2UoMCw1MCkubWFwKHQ9Pih7Li4udCxmaWxlbmFtZTp0LmZpbGVuYW1lfHxFKG4pLmZpbGVuYW1lLGZ1bmN0aW9uOnQuZnVuY3Rpb258fCI/In0pKX0odCk7aWYoVnQuYXBwUm9vdFBhdGgpZm9yKGNvbnN0IHQgb2Ygbil0LmZpbGVuYW1lJiYodC5maWxlbmFtZT13dCh0LmZpbGVuYW1lLFZ0LmFwcFJvb3RQYXRoKSk7cmV0dXJuIG59YXN5bmMgZnVuY3Rpb24gdW4odCxuKXtpZihRdD49VnQubWF4QW5yRXZlbnRzKXJldHVybjtRdCs9MSxhd2FpdCBzbigpLHRuKCJTZW5kaW5nIGV2ZW50Iik7Y29uc3QgZT17ZXZlbnRfaWQ6TSgpLGNvbnRleHRzOlZ0LmNvbnRleHRzLHJlbGVhc2U6VnQucmVsZWFzZSxlbnZpcm9ubWVudDpWdC5lbnZpcm9ubWVudCxkaXN0OlZ0LmRpc3QscGxhdGZvcm06Im5vZGUiLGxldmVsOiJlcnJvciIsZXhjZXB0aW9uOnt2YWx1ZXM6W3t0eXBlOiJBcHBsaWNhdGlvbk5vdFJlc3BvbmRpbmciLHZhbHVlOmBBcHBsaWNhdGlvbiBOb3QgUmVzcG9uZGluZyBmb3IgYXQgbGVhc3QgJHtWdC5hbnJUaHJlc2hvbGR9IG1zYCxzdGFja3RyYWNlOntmcmFtZXM6Y24odCl9LG1lY2hhbmlzbTp7dHlwZToiQU5SIn19XX0sdGFnczpWdC5zdGF0aWNUYWdzfTtuJiZmdW5jdGlvbih0LG4pe2lmKFJ0KHQsbiksIXQuY29udGV4dHM/LnRyYWNlKXtjb25zdHt0cmFjZUlkOmUscGFyZW50U3BhbklkOnIscHJvcGFnYXRpb25TcGFuSWQ6b309bi5wcm9wYWdhdGlvbkNvbnRleHQ7dC5jb250ZXh0cz17dHJhY2U6e3RyYWNlX2lkOmUsc3Bhbl9pZDpvfHxXKCkscGFyZW50X3NwYW5faWQ6cn0sLi4udC5jb250ZXh0c319fShlLG4pLGZ1bmN0aW9uKHQpe2lmKDA9PT1PYmplY3Qua2V5cyhYdCkubGVuZ3RoKXJldHVybjtjb25zdCBuPVZ0LmFwcFJvb3RQYXRoP3t9Olh0O2lmKFZ0LmFwcFJvb3RQYXRoKWZvcihjb25zdFt0LGVdb2YgT2JqZWN0LmVudHJpZXMoWHQpKW5bd3QodCxWdC5hcHBSb290UGF0aCldPWU7Y29uc3QgZT1uZXcgTWFwO2Zvcihjb25zdCByIG9mIHQuZXhjZXB0aW9uPy52YWx1ZXN8fFtdKWZvcihjb25zdCB0IG9mIHIuc3RhY2t0cmFjZT8uZnJhbWVzfHxbXSl7Y29uc3Qgcj10LmFic19wYXRofHx0LmZpbGVuYW1lO3ImJm5bcl0mJmUuc2V0KHIsbltyXSl9aWYoZS5zaXplPjApe2NvbnN0IG49W107Zm9yKGNvbnN0W3Qscl1vZiBlLmVudHJpZXMoKSluLnB1c2goe3R5cGU6InNvdXJjZW1hcCIsY29kZV9maWxlOnQsZGVidWdfaWQ6cn0pO3QuZGVidWdfbWV0YT17aW1hZ2VzOm59fX0oZSk7Y29uc3Qgcj1rdChlLFZ0LmRzbixWdC5zZGtNZXRhZGF0YSxWdC50dW5uZWwpO3RuKEpTT04uc3RyaW5naWZ5KHIpKSxhd2FpdCBvbi5zZW5kKHIpLGF3YWl0IG9uLmZsdXNoKDJlMyksUXQ+PVZ0Lm1heEFuckV2ZW50cyYmc2V0VGltZW91dCgoKT0+e3Byb2Nlc3MuZXhpdCgwKX0sNWUzKX1sZXQgYW47aWYodG4oIlN0YXJ0ZWQiKSxWdC5jYXB0dXJlU3RhY2tUcmFjZSl7dG4oIkNvbm5lY3RpbmcgdG8gZGVidWdnZXIiKTtjb25zdCBuPW5ldyB0O24uY29ubmVjdFRvTWFpblRocmVhZCgpLHRuKCJDb25uZWN0ZWQgdG8gZGVidWdnZXIiKTtjb25zdCBlPW5ldyBNYXA7bi5vbigiRGVidWdnZXIuc2NyaXB0UGFyc2VkIix0PT57ZS5zZXQodC5wYXJhbXMuc2NyaXB0SWQsdC5wYXJhbXMudXJsKX0pLG4ub24oIkRlYnVnZ2VyLnBhdXNlZCIsdD0+e2lmKCJvdGhlciI9PT10LnBhcmFtcy5yZWFzb24pdHJ5e3RuKCJEZWJ1Z2dlciBwYXVzZWQiKTtjb25zdCBzPVsuLi50LnBhcmFtcy5jYWxsRnJhbWVzXSxpPVZ0LmFwcFJvb3RQYXRoP2Z1bmN0aW9uKHQ9KHByb2Nlc3MuYXJndlsxXT9MdChwcm9jZXNzLmFyZ3ZbMV0pOnByb2Nlc3MuY3dkKCkpLG49IlxcIj09PW8pe2NvbnN0IGU9bj9adCh0KTp0O3JldHVybiB0PT57aWYoIXQpcmV0dXJuO2NvbnN0IG89bj9adCh0KTp0O2xldHtkaXI6cyxiYXNlOmksZXh0OmN9PXIucGFyc2Uobyk7Ii5qcyIhPT1jJiYiLm1qcyIhPT1jJiYiLmNqcyIhPT1jfHwoaT1pLnNsaWNlKDAsLTEqYy5sZW5ndGgpKTtjb25zdCB1PWRlY29kZVVSSUNvbXBvbmVudChpKTtzfHwocz0iLiIpO2NvbnN0IGE9cy5sYXN0SW5kZXhPZigiL25vZGVfbW9kdWxlcyIpO2lmKGE+LTEpcmV0dXJuYCR7cy5zbGljZShhKzE0KS5yZXBsYWNlKC9cLy9nLCIuIil9OiR7dX1gO2lmKHMuc3RhcnRzV2l0aChlKSl7Y29uc3QgdD1zLnNsaWNlKGUubGVuZ3RoKzEpLnJlcGxhY2UoL1wvL2csIi4iKTtyZXR1cm4gdD9gJHt0fToke3V9YDp1fXJldHVybiB1fX0oVnQuYXBwUm9vdFBhdGgpOigpPT57fSxjPXMubWFwKHQ9PmZ1bmN0aW9uKHQsbixlKXtjb25zdCByPW4/bi5yZXBsYWNlKC9eZmlsZTpcL1wvLywiIik6dm9pZCAwLG89dC5sb2NhdGlvbi5jb2x1bW5OdW1iZXI/dC5sb2NhdGlvbi5jb2x1bW5OdW1iZXIrMTp2b2lkIDAscz10LmxvY2F0aW9uLmxpbmVOdW1iZXI/dC5sb2NhdGlvbi5saW5lTnVtYmVyKzE6dm9pZCAwO3JldHVybntmaWxlbmFtZTpyLG1vZHVsZTplKHIpLGZ1bmN0aW9uOnQuZnVuY3Rpb25OYW1lfHwiPyIsY29sbm86byxsaW5lbm86cyxpbl9hcHA6cj9CdChyKTp2b2lkIDB9fSh0LGUuZ2V0KHQubG9jYXRpb24uc2NyaXB0SWQpLGkpKSx1PXNldFRpbWVvdXQoKCk9Pnt1bihjKS50aGVuKG51bGwsKCk9Pnt0bigiU2VuZGluZyBBTlIgZXZlbnQgZmFpbGVkLiIpfSl9LDVlMyk7bi5wb3N0KCJSdW50aW1lLmV2YWx1YXRlIix7ZXhwcmVzc2lvbjoiZ2xvYmFsLl9fU0VOVFJZX0dFVF9TQ09QRVNfXygpOyIsc2lsZW50OiEwLHJldHVybkJ5VmFsdWU6ITB9LCh0LGUpPT57dCYmdG4oYEVycm9yIGV4ZWN1dGluZyBzY3JpcHQ6ICcke3QubWVzc2FnZX0nYCksY2xlYXJUaW1lb3V0KHUpO2NvbnN0IHI9ZT8ucmVzdWx0P2UucmVzdWx0LnZhbHVlOnZvaWQgMDtuLnBvc3QoIkRlYnVnZ2VyLnJlc3VtZSIpLG4ucG9zdCgiRGVidWdnZXIuZGlzYWJsZSIpLHVuKGMscikudGhlbihudWxsLCgpPT57dG4oIlNlbmRpbmcgQU5SIGV2ZW50IGZhaWxlZC4iKX0pfSl9Y2F0Y2godCl7dGhyb3cgbi5wb3N0KCJEZWJ1Z2dlci5yZXN1bWUiKSxuLnBvc3QoIkRlYnVnZ2VyLmRpc2FibGUiKSx0fX0pLGFuPSgpPT57dHJ5e24ucG9zdCgiRGVidWdnZXIuZW5hYmxlIiwoKT0+e24ucG9zdCgiRGVidWdnZXIucGF1c2UiKX0pfWNhdGNoe319fWNvbnN0e3BvbGw6Zm59PWZ1bmN0aW9uKHQsbixlLHIpe2NvbnN0IG89dCgpO2xldCBzPSExLGk9ITA7cmV0dXJuIHNldEludGVydmFsKCgpPT57Y29uc3QgdD1vLmdldFRpbWVNcygpOyExPT09cyYmdD5uK2UmJihzPSEwLGkmJnIoKSksdDxuK2UmJihzPSExKX0sMjApLHtwb2xsOigpPT57by5yZXNldCgpfSxlbmFibGVkOnQ9PntpPXR9fX0oZnVuY3Rpb24oKXtsZXQgdD1wcm9jZXNzLmhydGltZSgpO3JldHVybntnZXRUaW1lTXM6KCk9Pntjb25zdFtuLGVdPXByb2Nlc3MuaHJ0aW1lKHQpO3JldHVybiBNYXRoLmZsb29yKDFlMypuK2UvMWU2KX0scmVzZXQ6KCk9Pnt0PXByb2Nlc3MuaHJ0aW1lKCl9fX0sVnQucG9sbEludGVydmFsLFZ0LmFuclRocmVzaG9sZCxmdW5jdGlvbigpe3RuKCJXYXRjaGRvZyB0aW1lb3V0IiksYW4/KHRuKCJQYXVzaW5nIGRlYnVnZ2VyIHRvIGNhcHR1cmUgc3RhY2sgdHJhY2UiKSxhbigpKToodG4oIkNhcHR1cmluZyBldmVudCB3aXRob3V0IGEgc3RhY2sgdHJhY2UiKSx1bigpLnRoZW4obnVsbCwoKT0+e3RuKCJTZW5kaW5nIEFOUiBldmVudCBmYWlsZWQgb24gd2F0Y2hkb2cgdGltZW91dC4iKX0pKX0pO2U/Lm9uKCJtZXNzYWdlIix0PT57dC5zZXNzaW9uJiYocXQ9SCh0LnNlc3Npb24pKSx0LmRlYnVnSW1hZ2VzJiYoWHQ9dC5kZWJ1Z0ltYWdlcyksZm4oKX0pOw==", DEFAULT_INTERVAL = 50, DEFAULT_HANG_THRESHOLD = 5000, INTEGRATION_NAME26 = "Anr", _anrIntegration = (options = {}) => {
|
|
38886
38649
|
if (NODE_VERSION.major < 16 || NODE_VERSION.major === 16 && NODE_VERSION.minor < 17) {
|
|
38887
38650
|
throw new Error("ANR detection requires Node 16.17.0 or later");
|
|
38888
38651
|
}
|
|
@@ -39945,7 +39708,8 @@ var init_client3 = __esm(() => {
|
|
|
39945
39708
|
return tracer;
|
|
39946
39709
|
}
|
|
39947
39710
|
async flush(timeout) {
|
|
39948
|
-
|
|
39711
|
+
const provider = this.traceProvider;
|
|
39712
|
+
await provider?.forceFlush();
|
|
39949
39713
|
if (this.getOptions().sendClientReports) {
|
|
39950
39714
|
this._flushOutcomes();
|
|
39951
39715
|
}
|
|
@@ -39961,7 +39725,7 @@ var init_client3 = __esm(() => {
|
|
|
39961
39725
|
if (this._logOnExitFlushListener) {
|
|
39962
39726
|
process.off("beforeExit", this._logOnExitFlushListener);
|
|
39963
39727
|
}
|
|
39964
|
-
return super.close(timeout)
|
|
39728
|
+
return super.close(timeout);
|
|
39965
39729
|
}
|
|
39966
39730
|
startClientReportTracking() {
|
|
39967
39731
|
const clientOptions = this.getOptions();
|
|
@@ -40441,7 +40205,7 @@ var init_esm5 = __esm(() => {
|
|
|
40441
40205
|
});
|
|
40442
40206
|
|
|
40443
40207
|
// ../../node_modules/@sentry/node/build/esm/integrations/http.js
|
|
40444
|
-
function
|
|
40208
|
+
function _shouldInstrumentSpans(options, clientOptions = {}) {
|
|
40445
40209
|
if (typeof options.spans === "boolean") {
|
|
40446
40210
|
return options.spans;
|
|
40447
40211
|
}
|
|
@@ -40453,8 +40217,16 @@ function _shouldUseOtelHttpInstrumentation(options, clientOptions = {}) {
|
|
|
40453
40217
|
}
|
|
40454
40218
|
return true;
|
|
40455
40219
|
}
|
|
40220
|
+
function _isClientRequest(req) {
|
|
40221
|
+
return "outputData" in req && "outputSize" in req && !("client" in req) && !("statusCode" in req);
|
|
40222
|
+
}
|
|
40223
|
+
function isKnownPrefetchRequest(req) {
|
|
40224
|
+
return req.headers["next-router-prefetch"] === "1";
|
|
40225
|
+
}
|
|
40456
40226
|
function getConfigWithDefaults(options = {}) {
|
|
40457
40227
|
const instrumentationConfig = {
|
|
40228
|
+
...options.instrumentation?._experimentalConfig,
|
|
40229
|
+
disableIncomingRequestInstrumentation: options.disableIncomingRequestSpans,
|
|
40458
40230
|
ignoreOutgoingRequestHook: (request2) => {
|
|
40459
40231
|
const url = getRequestUrl(request2);
|
|
40460
40232
|
if (!url) {
|
|
@@ -40466,9 +40238,28 @@ function getConfigWithDefaults(options = {}) {
|
|
|
40466
40238
|
}
|
|
40467
40239
|
return false;
|
|
40468
40240
|
},
|
|
40241
|
+
ignoreIncomingRequestHook: (request2) => {
|
|
40242
|
+
const urlPath = request2.url;
|
|
40243
|
+
const method = request2.method?.toUpperCase();
|
|
40244
|
+
if (method === "OPTIONS" || method === "HEAD") {
|
|
40245
|
+
return true;
|
|
40246
|
+
}
|
|
40247
|
+
if (options.ignoreStaticAssets !== false && method === "GET" && urlPath && isStaticAssetRequest(urlPath)) {
|
|
40248
|
+
return true;
|
|
40249
|
+
}
|
|
40250
|
+
const _ignoreIncomingRequests = options.ignoreIncomingRequests;
|
|
40251
|
+
if (urlPath && _ignoreIncomingRequests?.(urlPath, request2)) {
|
|
40252
|
+
return true;
|
|
40253
|
+
}
|
|
40254
|
+
return false;
|
|
40255
|
+
},
|
|
40469
40256
|
requireParentforOutgoingSpans: false,
|
|
40257
|
+
requireParentforIncomingSpans: false,
|
|
40470
40258
|
requestHook: (span, req) => {
|
|
40471
40259
|
addOriginToSpan2(span, "auto.http.otel.http");
|
|
40260
|
+
if (!_isClientRequest(req) && isKnownPrefetchRequest(req)) {
|
|
40261
|
+
span.setAttribute("sentry.http.prefetch", true);
|
|
40262
|
+
}
|
|
40472
40263
|
options.instrumentation?.requestHook?.(span, req);
|
|
40473
40264
|
},
|
|
40474
40265
|
responseHook: (span, res) => {
|
|
@@ -40480,6 +40271,16 @@ function getConfigWithDefaults(options = {}) {
|
|
|
40480
40271
|
};
|
|
40481
40272
|
return instrumentationConfig;
|
|
40482
40273
|
}
|
|
40274
|
+
function isStaticAssetRequest(urlPath) {
|
|
40275
|
+
const path = stripUrlQueryAndFragment(urlPath);
|
|
40276
|
+
if (path.match(/\.(ico|png|jpg|jpeg|gif|svg|css|js|woff|woff2|ttf|eot|webp|avif)$/)) {
|
|
40277
|
+
return true;
|
|
40278
|
+
}
|
|
40279
|
+
if (path.match(/^\/(robots\.txt|sitemap\.xml|manifest\.json|browserconfig\.xml)$/)) {
|
|
40280
|
+
return true;
|
|
40281
|
+
}
|
|
40282
|
+
return false;
|
|
40283
|
+
}
|
|
40483
40284
|
var import_api10, import_instrumentation_http, INTEGRATION_NAME31 = "Http", INSTRUMENTATION_NAME2 = "@opentelemetry_sentry-patched/instrumentation-http", instrumentSentryHttp2, instrumentOtelHttp, httpIntegration2;
|
|
40484
40285
|
var init_http3 = __esm(() => {
|
|
40485
40286
|
import_api10 = __toESM(require_src(), 1);
|
|
@@ -40490,10 +40291,7 @@ var init_http3 = __esm(() => {
|
|
|
40490
40291
|
return new SentryHttpInstrumentation(options);
|
|
40491
40292
|
});
|
|
40492
40293
|
instrumentOtelHttp = generateInstrumentOnce(INTEGRATION_NAME31, (config) => {
|
|
40493
|
-
const instrumentation = new import_instrumentation_http.HttpInstrumentation(
|
|
40494
|
-
...config,
|
|
40495
|
-
disableIncomingRequestInstrumentation: true
|
|
40496
|
-
});
|
|
40294
|
+
const instrumentation = new import_instrumentation_http.HttpInstrumentation(config);
|
|
40497
40295
|
try {
|
|
40498
40296
|
instrumentation["_diag"] = import_api10.diag.createComponentLogger({
|
|
40499
40297
|
namespace: INSTRUMENTATION_NAME2
|
|
@@ -40510,16 +40308,13 @@ var init_http3 = __esm(() => {
|
|
|
40510
40308
|
return {
|
|
40511
40309
|
name: INTEGRATION_NAME31,
|
|
40512
40310
|
setupOnce() {
|
|
40513
|
-
const
|
|
40514
|
-
const useOtelHttpInstrumentation = _shouldUseOtelHttpInstrumentation(options, clientOptions);
|
|
40515
|
-
const disableIncomingRequestSpans = options.disableIncomingRequestSpans ?? !hasSpansEnabled(clientOptions);
|
|
40311
|
+
const instrumentSpans = _shouldInstrumentSpans(options, getClient()?.getOptions());
|
|
40516
40312
|
instrumentSentryHttp2({
|
|
40517
40313
|
...options,
|
|
40518
|
-
|
|
40519
|
-
|
|
40520
|
-
propagateTraceInOutgoingRequests: !useOtelHttpInstrumentation
|
|
40314
|
+
extractIncomingTraceFromHeader: !instrumentSpans,
|
|
40315
|
+
propagateTraceInOutgoingRequests: !instrumentSpans
|
|
40521
40316
|
});
|
|
40522
|
-
if (
|
|
40317
|
+
if (instrumentSpans) {
|
|
40523
40318
|
const instrumentationConfig = getConfigWithDefaults(options);
|
|
40524
40319
|
instrumentOtelHttp(instrumentationConfig);
|
|
40525
40320
|
}
|
|
@@ -40910,7 +40705,7 @@ function getAbsoluteUrl4(origin, path = "/") {
|
|
|
40910
40705
|
}
|
|
40911
40706
|
return `${url}${path}`;
|
|
40912
40707
|
}
|
|
40913
|
-
function
|
|
40708
|
+
function _shouldInstrumentSpans2(options, clientOptions = {}) {
|
|
40914
40709
|
return typeof options.spans === "boolean" ? options.spans : !clientOptions.skipOpenTelemetrySetup && hasSpansEnabled(clientOptions);
|
|
40915
40710
|
}
|
|
40916
40711
|
function getConfigWithDefaults2(options = {}) {
|
|
@@ -40934,7 +40729,7 @@ var import_instrumentation_undici, INTEGRATION_NAME32 = "NodeFetch", instrumentO
|
|
|
40934
40729
|
return {
|
|
40935
40730
|
name: "NodeFetch",
|
|
40936
40731
|
setupOnce() {
|
|
40937
|
-
const instrumentSpans =
|
|
40732
|
+
const instrumentSpans = _shouldInstrumentSpans2(options, getClient()?.getOptions());
|
|
40938
40733
|
if (instrumentSpans) {
|
|
40939
40734
|
instrumentOtelNodeFetch(options);
|
|
40940
40735
|
}
|
|
@@ -43396,12 +43191,12 @@ var init_esm6 = __esm(() => {
|
|
|
43396
43191
|
|
|
43397
43192
|
// ../../node_modules/@sentry/node/build/esm/integrations/tracing/fastify/fastify-otel/index.js
|
|
43398
43193
|
import dc__default from "node:diagnostics_channel";
|
|
43399
|
-
var import_api11,
|
|
43194
|
+
var import_api11, import_core48, import_instrumentation6, import_semantic_conventions2, PACKAGE_NAME = "@fastify/otel", PACKAGE_VERSION = "0.8.0", SUPPORTED_VERSIONS = ">=4.0.0 <6", FASTIFY_HOOKS, ATTRIBUTE_NAMES, HOOK_TYPES, ANONYMOUS_FUNCTION_NAME = "anonymous", kInstrumentation, kRequestSpan, kRequestContext, kAddHookOriginal, kSetNotFoundOriginal, kIgnorePaths, FastifyOtelInstrumentation;
|
|
43400
43195
|
var init_fastify_otel = __esm(() => {
|
|
43401
43196
|
import_api11 = __toESM(require_src(), 1);
|
|
43402
|
-
|
|
43197
|
+
import_core48 = __toESM(require_src3(), 1);
|
|
43403
43198
|
import_instrumentation6 = __toESM(require_src6(), 1);
|
|
43404
|
-
|
|
43199
|
+
import_semantic_conventions2 = __toESM(require_src2(), 1);
|
|
43405
43200
|
init_esm6();
|
|
43406
43201
|
FASTIFY_HOOKS = [
|
|
43407
43202
|
"onRequest",
|
|
@@ -43511,20 +43306,20 @@ var init_fastify_otel = __esm(() => {
|
|
|
43511
43306
|
const handlerLike = routeOptions[hook];
|
|
43512
43307
|
if (typeof handlerLike === "function") {
|
|
43513
43308
|
routeOptions[hook] = handlerWrapper(handlerLike, {
|
|
43514
|
-
[
|
|
43309
|
+
[import_semantic_conventions2.ATTR_SERVICE_NAME]: instance[kInstrumentation].servername,
|
|
43515
43310
|
[ATTRIBUTE_NAMES.HOOK_NAME]: `${this.pluginName} - route -> ${hook}`,
|
|
43516
43311
|
[ATTRIBUTE_NAMES.FASTIFY_TYPE]: HOOK_TYPES.ROUTE,
|
|
43517
|
-
[
|
|
43312
|
+
[import_semantic_conventions2.ATTR_HTTP_ROUTE]: routeOptions.url,
|
|
43518
43313
|
[ATTRIBUTE_NAMES.HOOK_CALLBACK_NAME]: handlerLike.name?.length > 0 ? handlerLike.name : ANONYMOUS_FUNCTION_NAME
|
|
43519
43314
|
});
|
|
43520
43315
|
} else if (Array.isArray(handlerLike)) {
|
|
43521
43316
|
const wrappedHandlers = [];
|
|
43522
43317
|
for (const handler of handlerLike) {
|
|
43523
43318
|
wrappedHandlers.push(handlerWrapper(handler, {
|
|
43524
|
-
[
|
|
43319
|
+
[import_semantic_conventions2.ATTR_SERVICE_NAME]: instance[kInstrumentation].servername,
|
|
43525
43320
|
[ATTRIBUTE_NAMES.HOOK_NAME]: `${this.pluginName} - route -> ${hook}`,
|
|
43526
43321
|
[ATTRIBUTE_NAMES.FASTIFY_TYPE]: HOOK_TYPES.ROUTE,
|
|
43527
|
-
[
|
|
43322
|
+
[import_semantic_conventions2.ATTR_HTTP_ROUTE]: routeOptions.url,
|
|
43528
43323
|
[ATTRIBUTE_NAMES.HOOK_CALLBACK_NAME]: handler.name?.length > 0 ? handler.name : ANONYMOUS_FUNCTION_NAME
|
|
43529
43324
|
}));
|
|
43530
43325
|
}
|
|
@@ -43543,10 +43338,10 @@ var init_fastify_otel = __esm(() => {
|
|
|
43543
43338
|
routeOptions.onError = onErrorHook;
|
|
43544
43339
|
}
|
|
43545
43340
|
routeOptions.handler = handlerWrapper(routeOptions.handler, {
|
|
43546
|
-
[
|
|
43341
|
+
[import_semantic_conventions2.ATTR_SERVICE_NAME]: instance[kInstrumentation].servername,
|
|
43547
43342
|
[ATTRIBUTE_NAMES.HOOK_NAME]: `${this.pluginName} - route-handler`,
|
|
43548
43343
|
[ATTRIBUTE_NAMES.FASTIFY_TYPE]: HOOK_TYPES.HANDLER,
|
|
43549
|
-
[
|
|
43344
|
+
[import_semantic_conventions2.ATTR_HTTP_ROUTE]: routeOptions.url,
|
|
43550
43345
|
[ATTRIBUTE_NAMES.HOOK_CALLBACK_NAME]: routeOptions.handler.name.length > 0 ? routeOptions.handler.name : ANONYMOUS_FUNCTION_NAME
|
|
43551
43346
|
});
|
|
43552
43347
|
});
|
|
@@ -43564,16 +43359,16 @@ var init_fastify_otel = __esm(() => {
|
|
|
43564
43359
|
if (import_api11.trace.getSpan(ctx) == null) {
|
|
43565
43360
|
ctx = import_api11.propagation.extract(ctx, request2.headers);
|
|
43566
43361
|
}
|
|
43567
|
-
const rpcMetadata =
|
|
43568
|
-
if (request2.routeOptions.url != null && rpcMetadata?.type ===
|
|
43362
|
+
const rpcMetadata = import_core48.getRPCMetadata(ctx);
|
|
43363
|
+
if (request2.routeOptions.url != null && rpcMetadata?.type === import_core48.RPCType.HTTP) {
|
|
43569
43364
|
rpcMetadata.route = request2.routeOptions.url;
|
|
43570
43365
|
}
|
|
43571
43366
|
const span = this[kInstrumentation].tracer.startSpan("request", {
|
|
43572
43367
|
attributes: {
|
|
43573
|
-
[
|
|
43368
|
+
[import_semantic_conventions2.ATTR_SERVICE_NAME]: instance[kInstrumentation].servername,
|
|
43574
43369
|
[ATTRIBUTE_NAMES.ROOT]: "@fastify/otel",
|
|
43575
|
-
[
|
|
43576
|
-
[
|
|
43370
|
+
[import_semantic_conventions2.ATTR_HTTP_ROUTE]: request2.url,
|
|
43371
|
+
[import_semantic_conventions2.ATTR_HTTP_REQUEST_METHOD]: request2.method
|
|
43577
43372
|
}
|
|
43578
43373
|
}, ctx);
|
|
43579
43374
|
request2[kRequestContext] = import_api11.trace.setSpan(ctx, span);
|
|
@@ -43590,7 +43385,7 @@ var init_fastify_otel = __esm(() => {
|
|
|
43590
43385
|
message: "OK"
|
|
43591
43386
|
});
|
|
43592
43387
|
span.setAttributes({
|
|
43593
|
-
[
|
|
43388
|
+
[import_semantic_conventions2.ATTR_HTTP_RESPONSE_STATUS_CODE]: 404
|
|
43594
43389
|
});
|
|
43595
43390
|
span.end();
|
|
43596
43391
|
}
|
|
@@ -43610,7 +43405,7 @@ var init_fastify_otel = __esm(() => {
|
|
|
43610
43405
|
});
|
|
43611
43406
|
}
|
|
43612
43407
|
span.setAttributes({
|
|
43613
|
-
[
|
|
43408
|
+
[import_semantic_conventions2.ATTR_HTTP_RESPONSE_STATUS_CODE]: reply.statusCode
|
|
43614
43409
|
});
|
|
43615
43410
|
span.end();
|
|
43616
43411
|
}
|
|
@@ -43632,7 +43427,7 @@ var init_fastify_otel = __esm(() => {
|
|
|
43632
43427
|
const addHookOriginal = this[kAddHookOriginal];
|
|
43633
43428
|
if (FASTIFY_HOOKS.includes(name)) {
|
|
43634
43429
|
return addHookOriginal.call(this, name, handlerWrapper(hook, {
|
|
43635
|
-
[
|
|
43430
|
+
[import_semantic_conventions2.ATTR_SERVICE_NAME]: instance[kInstrumentation].servername,
|
|
43636
43431
|
[ATTRIBUTE_NAMES.HOOK_NAME]: `${this.pluginName} - ${name}`,
|
|
43637
43432
|
[ATTRIBUTE_NAMES.FASTIFY_TYPE]: HOOK_TYPES.INSTANCE,
|
|
43638
43433
|
[ATTRIBUTE_NAMES.HOOK_CALLBACK_NAME]: hook.name?.length > 0 ? hook.name : ANONYMOUS_FUNCTION_NAME
|
|
@@ -43645,7 +43440,7 @@ var init_fastify_otel = __esm(() => {
|
|
|
43645
43440
|
const setNotFoundHandlerOriginal = this[kSetNotFoundOriginal];
|
|
43646
43441
|
if (typeof hooks === "function") {
|
|
43647
43442
|
handler = handlerWrapper(hooks, {
|
|
43648
|
-
[
|
|
43443
|
+
[import_semantic_conventions2.ATTR_SERVICE_NAME]: instance[kInstrumentation].servername,
|
|
43649
43444
|
[ATTRIBUTE_NAMES.HOOK_NAME]: `${this.pluginName} - not-found-handler`,
|
|
43650
43445
|
[ATTRIBUTE_NAMES.FASTIFY_TYPE]: HOOK_TYPES.INSTANCE,
|
|
43651
43446
|
[ATTRIBUTE_NAMES.HOOK_CALLBACK_NAME]: hooks.name?.length > 0 ? hooks.name : ANONYMOUS_FUNCTION_NAME
|
|
@@ -43654,7 +43449,7 @@ var init_fastify_otel = __esm(() => {
|
|
|
43654
43449
|
} else {
|
|
43655
43450
|
if (hooks.preValidation != null) {
|
|
43656
43451
|
hooks.preValidation = handlerWrapper(hooks.preValidation, {
|
|
43657
|
-
[
|
|
43452
|
+
[import_semantic_conventions2.ATTR_SERVICE_NAME]: instance[kInstrumentation].servername,
|
|
43658
43453
|
[ATTRIBUTE_NAMES.HOOK_NAME]: `${this.pluginName} - not-found-handler - preValidation`,
|
|
43659
43454
|
[ATTRIBUTE_NAMES.FASTIFY_TYPE]: HOOK_TYPES.INSTANCE,
|
|
43660
43455
|
[ATTRIBUTE_NAMES.HOOK_CALLBACK_NAME]: hooks.preValidation.name?.length > 0 ? hooks.preValidation.name : ANONYMOUS_FUNCTION_NAME
|
|
@@ -43662,14 +43457,14 @@ var init_fastify_otel = __esm(() => {
|
|
|
43662
43457
|
}
|
|
43663
43458
|
if (hooks.preHandler != null) {
|
|
43664
43459
|
hooks.preHandler = handlerWrapper(hooks.preHandler, {
|
|
43665
|
-
[
|
|
43460
|
+
[import_semantic_conventions2.ATTR_SERVICE_NAME]: instance[kInstrumentation].servername,
|
|
43666
43461
|
[ATTRIBUTE_NAMES.HOOK_NAME]: `${this.pluginName} - not-found-handler - preHandler`,
|
|
43667
43462
|
[ATTRIBUTE_NAMES.FASTIFY_TYPE]: HOOK_TYPES.INSTANCE,
|
|
43668
43463
|
[ATTRIBUTE_NAMES.HOOK_CALLBACK_NAME]: hooks.preHandler.name?.length > 0 ? hooks.preHandler.name : ANONYMOUS_FUNCTION_NAME
|
|
43669
43464
|
});
|
|
43670
43465
|
}
|
|
43671
43466
|
handler = handlerWrapper(handler, {
|
|
43672
|
-
[
|
|
43467
|
+
[import_semantic_conventions2.ATTR_SERVICE_NAME]: instance[kInstrumentation].servername,
|
|
43673
43468
|
[ATTRIBUTE_NAMES.HOOK_NAME]: `${this.pluginName} - not-found-handler`,
|
|
43674
43469
|
[ATTRIBUTE_NAMES.FASTIFY_TYPE]: HOOK_TYPES.INSTANCE,
|
|
43675
43470
|
[ATTRIBUTE_NAMES.HOOK_CALLBACK_NAME]: handler.name?.length > 0 ? handler.name : ANONYMOUS_FUNCTION_NAME
|
|
@@ -43840,12 +43635,12 @@ function addFastifyV3SpanAttributes(span) {
|
|
|
43840
43635
|
span.updateName(updatedName);
|
|
43841
43636
|
}
|
|
43842
43637
|
}
|
|
43843
|
-
var import_api13,
|
|
43638
|
+
var import_api13, import_core49, import_instrumentation7, import_semantic_conventions3, PACKAGE_VERSION2 = "0.1.0", PACKAGE_NAME2 = "@sentry/instrumentation-fastify-v3", ANONYMOUS_NAME = "anonymous", hooksNamesToWrap, FastifyInstrumentationV3;
|
|
43844
43639
|
var init_instrumentation = __esm(() => {
|
|
43845
43640
|
import_api13 = __toESM(require_src(), 1);
|
|
43846
|
-
|
|
43641
|
+
import_core49 = __toESM(require_src3(), 1);
|
|
43847
43642
|
import_instrumentation7 = __toESM(require_src6(), 1);
|
|
43848
|
-
|
|
43643
|
+
import_semantic_conventions3 = __toESM(require_src2(), 1);
|
|
43849
43644
|
init_esm();
|
|
43850
43645
|
init_AttributeNames();
|
|
43851
43646
|
init_utils8();
|
|
@@ -43879,9 +43674,9 @@ var init_instrumentation = __esm(() => {
|
|
|
43879
43674
|
}
|
|
43880
43675
|
instrumentation._wrap(reply, "send", instrumentation._patchSend());
|
|
43881
43676
|
const anyRequest = request2;
|
|
43882
|
-
const rpcMetadata =
|
|
43677
|
+
const rpcMetadata = import_core49.getRPCMetadata(import_api13.context.active());
|
|
43883
43678
|
const routeName = anyRequest.routeOptions ? anyRequest.routeOptions.url : request2.routerPath;
|
|
43884
|
-
if (routeName && rpcMetadata?.type ===
|
|
43679
|
+
if (routeName && rpcMetadata?.type === import_core49.RPCType.HTTP) {
|
|
43885
43680
|
rpcMetadata.route = routeName;
|
|
43886
43681
|
}
|
|
43887
43682
|
const method = request2.method || "GET";
|
|
@@ -43999,7 +43794,7 @@ var init_instrumentation = __esm(() => {
|
|
|
43999
43794
|
const spanAttributes = {
|
|
44000
43795
|
[AttributeNames.PLUGIN_NAME]: this.pluginName,
|
|
44001
43796
|
[AttributeNames.FASTIFY_TYPE]: FastifyTypes.REQUEST_HANDLER,
|
|
44002
|
-
[
|
|
43797
|
+
[import_semantic_conventions3.SEMATTRS_HTTP_ROUTE]: anyRequest.routeOptions ? anyRequest.routeOptions.url : request2.routerPath
|
|
44003
43798
|
};
|
|
44004
43799
|
if (handlerName) {
|
|
44005
43800
|
spanAttributes[AttributeNames.FASTIFY_NAME] = handlerName;
|
|
@@ -48735,7 +48530,7 @@ var init_postgres = __esm(() => {
|
|
|
48735
48530
|
});
|
|
48736
48531
|
|
|
48737
48532
|
// ../../node_modules/@sentry/node/build/esm/integrations/tracing/postgresjs.js
|
|
48738
|
-
var import_api15, import_instrumentation9,
|
|
48533
|
+
var import_api15, import_instrumentation9, import_semantic_conventions4, INTEGRATION_NAME45 = "PostgresJs", SUPPORTED_VERSIONS2, instrumentPostgresJs, PostgresJsInstrumentation, _postgresJsIntegration = () => {
|
|
48739
48534
|
return {
|
|
48740
48535
|
name: INTEGRATION_NAME45,
|
|
48741
48536
|
setupOnce() {
|
|
@@ -48746,7 +48541,7 @@ var import_api15, import_instrumentation9, import_semantic_conventions5, INTEGRA
|
|
|
48746
48541
|
var init_postgresjs = __esm(() => {
|
|
48747
48542
|
import_api15 = __toESM(require_src(), 1);
|
|
48748
48543
|
import_instrumentation9 = __toESM(require_src6(), 1);
|
|
48749
|
-
|
|
48544
|
+
import_semantic_conventions4 = __toESM(require_src2(), 1);
|
|
48750
48545
|
init_esm();
|
|
48751
48546
|
init_esm5();
|
|
48752
48547
|
SUPPORTED_VERSIONS2 = [">=3.0.0 <4"];
|
|
@@ -48779,8 +48574,8 @@ var init_postgresjs = __esm(() => {
|
|
|
48779
48574
|
message: rejectArgs?.[0]?.message || "unknown_error"
|
|
48780
48575
|
});
|
|
48781
48576
|
const result = Reflect.apply(rejectTarget2, rejectThisArg, rejectArgs);
|
|
48782
|
-
span.setAttribute(
|
|
48783
|
-
span.setAttribute(
|
|
48577
|
+
span.setAttribute(import_semantic_conventions4.ATTR_DB_RESPONSE_STATUS_CODE, rejectArgs?.[0]?.code || "Unknown error");
|
|
48578
|
+
span.setAttribute(import_semantic_conventions4.ATTR_ERROR_TYPE, rejectArgs?.[0]?.name || "Unknown error");
|
|
48784
48579
|
span.end();
|
|
48785
48580
|
return result;
|
|
48786
48581
|
}
|
|
@@ -48792,7 +48587,7 @@ var init_postgresjs = __esm(() => {
|
|
|
48792
48587
|
const result = Reflect.apply(resolveTarget2, resolveThisArg, resolveArgs);
|
|
48793
48588
|
const sqlCommand = resolveArgs?.[0]?.command;
|
|
48794
48589
|
if (sqlCommand) {
|
|
48795
|
-
span.setAttribute(
|
|
48590
|
+
span.setAttribute(import_semantic_conventions4.ATTR_DB_OPERATION_NAME, sqlCommand);
|
|
48796
48591
|
}
|
|
48797
48592
|
span.end();
|
|
48798
48593
|
return result;
|
|
@@ -48824,11 +48619,11 @@ var init_postgresjs = __esm(() => {
|
|
|
48824
48619
|
const databaseName = postgresConnectionContext?.ATTR_DB_NAMESPACE || "<unknown database>";
|
|
48825
48620
|
const databaseHost = postgresConnectionContext?.ATTR_SERVER_ADDRESS || "<unknown host>";
|
|
48826
48621
|
const databasePort = postgresConnectionContext?.ATTR_SERVER_PORT || "<unknown port>";
|
|
48827
|
-
span.setAttribute(
|
|
48828
|
-
span.setAttribute(
|
|
48829
|
-
span.setAttribute(
|
|
48830
|
-
span.setAttribute(
|
|
48831
|
-
span.setAttribute(
|
|
48622
|
+
span.setAttribute(import_semantic_conventions4.ATTR_DB_SYSTEM_NAME, "postgres");
|
|
48623
|
+
span.setAttribute(import_semantic_conventions4.ATTR_DB_NAMESPACE, databaseName);
|
|
48624
|
+
span.setAttribute(import_semantic_conventions4.ATTR_SERVER_ADDRESS, databaseHost);
|
|
48625
|
+
span.setAttribute(import_semantic_conventions4.ATTR_SERVER_PORT, databasePort);
|
|
48626
|
+
span.setAttribute(import_semantic_conventions4.ATTR_DB_QUERY_TEXT, sanitizedSqlQuery);
|
|
48832
48627
|
handleThisArg.resolve = this._patchResolve(handleThisArg.resolve, span);
|
|
48833
48628
|
handleThisArg.reject = this._patchReject(handleThisArg.reject, span);
|
|
48834
48629
|
try {
|
|
@@ -50757,7 +50552,7 @@ var require_src29 = __commonJS((exports) => {
|
|
|
50757
50552
|
});
|
|
50758
50553
|
|
|
50759
50554
|
// ../../node_modules/@sentry/node/build/esm/integrations/tracing/koa.js
|
|
50760
|
-
var import_instrumentation_koa,
|
|
50555
|
+
var import_instrumentation_koa, import_semantic_conventions5, INTEGRATION_NAME48 = "Koa", instrumentKoa, _koaIntegration = (options = {}) => {
|
|
50761
50556
|
return {
|
|
50762
50557
|
name: INTEGRATION_NAME48,
|
|
50763
50558
|
setupOnce() {
|
|
@@ -50777,7 +50572,7 @@ var import_instrumentation_koa, import_semantic_conventions6, INTEGRATION_NAME48
|
|
|
50777
50572
|
};
|
|
50778
50573
|
var init_koa = __esm(() => {
|
|
50779
50574
|
import_instrumentation_koa = __toESM(require_src29(), 1);
|
|
50780
|
-
|
|
50575
|
+
import_semantic_conventions5 = __toESM(require_src2(), 1);
|
|
50781
50576
|
init_esm();
|
|
50782
50577
|
init_esm5();
|
|
50783
50578
|
init_debug_build5();
|
|
@@ -50799,7 +50594,7 @@ var init_koa = __esm(() => {
|
|
|
50799
50594
|
DEBUG_BUILD6 && debug.warn("Isolation scope is default isolation scope - skipping setting transactionName");
|
|
50800
50595
|
return;
|
|
50801
50596
|
}
|
|
50802
|
-
const route = attributes[
|
|
50597
|
+
const route = attributes[import_semantic_conventions5.ATTR_HTTP_ROUTE];
|
|
50803
50598
|
const method = info2.context?.request?.method?.toUpperCase() || "GET";
|
|
50804
50599
|
if (route) {
|
|
50805
50600
|
getIsolationScope().setTransactionName(`${method} ${route}`);
|
|
@@ -53137,7 +52932,7 @@ function executeContextWithSpan(span, callback) {
|
|
|
53137
52932
|
function startDBSpan(tracer, spanName, reference) {
|
|
53138
52933
|
const span = tracer.startSpan(`${spanName} ${reference.path}`, { kind: import_api18.SpanKind.CLIENT });
|
|
53139
52934
|
addAttributes(span, reference);
|
|
53140
|
-
span.setAttribute(
|
|
52935
|
+
span.setAttribute(import_semantic_conventions6.ATTR_DB_OPERATION_NAME, spanName);
|
|
53141
52936
|
return span;
|
|
53142
52937
|
}
|
|
53143
52938
|
function getPortAndAddress(settings2) {
|
|
@@ -53179,9 +52974,9 @@ function addAttributes(span, reference) {
|
|
|
53179
52974
|
const json = reference.firestore.toJSON() || {};
|
|
53180
52975
|
const settings2 = json.settings || {};
|
|
53181
52976
|
const attributes = {
|
|
53182
|
-
[
|
|
53183
|
-
[
|
|
53184
|
-
[
|
|
52977
|
+
[import_semantic_conventions6.ATTR_DB_COLLECTION_NAME]: reference.path,
|
|
52978
|
+
[import_semantic_conventions6.ATTR_DB_NAMESPACE]: firestoreApp.name,
|
|
52979
|
+
[import_semantic_conventions6.ATTR_DB_SYSTEM_NAME]: "firebase.firestore",
|
|
53185
52980
|
"firebase.firestore.type": reference.type,
|
|
53186
52981
|
"firebase.firestore.options.projectId": firestoreOptions.projectId,
|
|
53187
52982
|
"firebase.firestore.options.appId": firestoreOptions.appId,
|
|
@@ -53190,18 +52985,18 @@ function addAttributes(span, reference) {
|
|
|
53190
52985
|
};
|
|
53191
52986
|
const { address, port } = getPortAndAddress(settings2);
|
|
53192
52987
|
if (address) {
|
|
53193
|
-
attributes[
|
|
52988
|
+
attributes[import_semantic_conventions6.ATTR_SERVER_ADDRESS] = address;
|
|
53194
52989
|
}
|
|
53195
52990
|
if (port) {
|
|
53196
|
-
attributes[
|
|
52991
|
+
attributes[import_semantic_conventions6.ATTR_SERVER_PORT] = port;
|
|
53197
52992
|
}
|
|
53198
52993
|
span.setAttributes(attributes);
|
|
53199
52994
|
}
|
|
53200
|
-
var import_api18, import_instrumentation18,
|
|
52995
|
+
var import_api18, import_instrumentation18, import_semantic_conventions6;
|
|
53201
52996
|
var init_firestore = __esm(() => {
|
|
53202
52997
|
import_api18 = __toESM(require_src(), 1);
|
|
53203
52998
|
import_instrumentation18 = __toESM(require_src6(), 1);
|
|
53204
|
-
|
|
52999
|
+
import_semantic_conventions6 = __toESM(require_src2(), 1);
|
|
53205
53000
|
});
|
|
53206
53001
|
|
|
53207
53002
|
// ../../node_modules/@sentry/node/build/esm/integrations/tracing/firebase/otel/firebaseInstrumentation.js
|
|
@@ -53280,7 +53075,6 @@ function getAutoPerformanceIntegrations() {
|
|
|
53280
53075
|
}
|
|
53281
53076
|
function getOpenTelemetryInstrumentationToPreload() {
|
|
53282
53077
|
return [
|
|
53283
|
-
instrumentSentryHttp2,
|
|
53284
53078
|
instrumentOtelHttp,
|
|
53285
53079
|
instrumentExpress,
|
|
53286
53080
|
instrumentConnect,
|
|
@@ -53393,9 +53187,9 @@ function setupOtel(client2, options = {}) {
|
|
|
53393
53187
|
const provider = new import_sdk_trace_base2.BasicTracerProvider({
|
|
53394
53188
|
sampler: new SentrySampler(client2),
|
|
53395
53189
|
resource: import_resources.defaultResource().merge(import_resources.resourceFromAttributes({
|
|
53396
|
-
[
|
|
53397
|
-
[
|
|
53398
|
-
[
|
|
53190
|
+
[import_semantic_conventions7.ATTR_SERVICE_NAME]: "node",
|
|
53191
|
+
[import_semantic_conventions7.SEMRESATTRS_SERVICE_NAMESPACE]: "sentry",
|
|
53192
|
+
[import_semantic_conventions7.ATTR_SERVICE_VERSION]: SDK_VERSION
|
|
53399
53193
|
})),
|
|
53400
53194
|
forceFlushTimeoutMillis: 500,
|
|
53401
53195
|
spanProcessors: [
|
|
@@ -53423,12 +53217,12 @@ function _clampSpanProcessorTimeout(maxSpanWaitDuration) {
|
|
|
53423
53217
|
}
|
|
53424
53218
|
return maxSpanWaitDuration;
|
|
53425
53219
|
}
|
|
53426
|
-
var import_api19, import_resources, import_sdk_trace_base2,
|
|
53220
|
+
var import_api19, import_resources, import_sdk_trace_base2, import_semantic_conventions7, import_import_in_the_middle2, MAX_MAX_SPAN_WAIT_DURATION = 1e6;
|
|
53427
53221
|
var init_initOtel = __esm(() => {
|
|
53428
53222
|
import_api19 = __toESM(require_src(), 1);
|
|
53429
53223
|
import_resources = __toESM(require_src8(), 1);
|
|
53430
53224
|
import_sdk_trace_base2 = __toESM(require_src9(), 1);
|
|
53431
|
-
|
|
53225
|
+
import_semantic_conventions7 = __toESM(require_src2(), 1);
|
|
53432
53226
|
init_esm();
|
|
53433
53227
|
init_esm5();
|
|
53434
53228
|
init_esm4();
|
|
@@ -69633,7 +69427,7 @@ var getDefaultProjectName = () => {
|
|
|
69633
69427
|
};
|
|
69634
69428
|
|
|
69635
69429
|
// ../../node_modules/langsmith/dist/index.js
|
|
69636
|
-
var __version__ = "0.3.
|
|
69430
|
+
var __version__ = "0.3.66";
|
|
69637
69431
|
|
|
69638
69432
|
// ../../node_modules/langsmith/dist/utils/env.js
|
|
69639
69433
|
var globalEnv;
|
|
@@ -72293,7 +72087,7 @@ Message: ${Array.isArray(result.detail) ? result.detail.join(`
|
|
|
72293
72087
|
}
|
|
72294
72088
|
throw new Error("No projects found to resolve tenant.");
|
|
72295
72089
|
}
|
|
72296
|
-
async* listProjects({ projectIds, name, nameContains, referenceDatasetId, referenceDatasetName,
|
|
72090
|
+
async* listProjects({ projectIds, name, nameContains, referenceDatasetId, referenceDatasetName, datasetVersion, referenceFree, metadata } = {}) {
|
|
72297
72091
|
const params = new URLSearchParams;
|
|
72298
72092
|
if (projectIds !== undefined) {
|
|
72299
72093
|
for (const projectId of projectIds) {
|
|
@@ -72314,9 +72108,6 @@ Message: ${Array.isArray(result.detail) ? result.detail.join(`
|
|
|
72314
72108
|
});
|
|
72315
72109
|
params.append("reference_dataset", dataset.id);
|
|
72316
72110
|
}
|
|
72317
|
-
if (includeStats !== undefined) {
|
|
72318
|
-
params.append("include_stats", includeStats.toString());
|
|
72319
|
-
}
|
|
72320
72111
|
if (datasetVersion !== undefined) {
|
|
72321
72112
|
params.append("dataset_version", datasetVersion);
|
|
72322
72113
|
}
|
|
@@ -85155,7 +84946,7 @@ function createLogger(bindings = false) {
|
|
|
85155
84946
|
}
|
|
85156
84947
|
return [obj, ...args];
|
|
85157
84948
|
};
|
|
85158
|
-
const
|
|
84949
|
+
const trace11 = (obj, msg, ...args) => invoke("verbose", ...adaptArgs(obj, msg, ...args));
|
|
85159
84950
|
const debug5 = (obj, msg, ...args) => invoke("debug", ...adaptArgs(obj, msg, ...args));
|
|
85160
84951
|
const info2 = (obj, msg, ...args) => invoke("info", ...adaptArgs(obj, msg, ...args));
|
|
85161
84952
|
const warn5 = (obj, msg, ...args) => invoke("warn", ...adaptArgs(obj, msg, ...args));
|
|
@@ -85177,7 +84968,7 @@ function createLogger(bindings = false) {
|
|
|
85177
84968
|
};
|
|
85178
84969
|
return {
|
|
85179
84970
|
level: currentLevel,
|
|
85180
|
-
trace:
|
|
84971
|
+
trace: trace11,
|
|
85181
84972
|
debug: debug5,
|
|
85182
84973
|
info: info2,
|
|
85183
84974
|
warn: warn5,
|
|
@@ -89810,5 +89601,5 @@ export {
|
|
|
89810
89601
|
AgentRuntime
|
|
89811
89602
|
};
|
|
89812
89603
|
|
|
89813
|
-
//# debugId=
|
|
89604
|
+
//# debugId=2C20B5167165F8B264756E2164756E21
|
|
89814
89605
|
//# sourceMappingURL=index.node.js.map
|