@alauda-fe/common
Version:
Alauda frontend team common codes.
183 lines • 28.1 kB
JavaScript
import { get } from 'lodash-es';
import { GenericStatusColor, GenericStatusIcon, } from '../constants/status-icons';
export var WorkloadKind;
(function (WorkloadKind) {
WorkloadKind["Deployment"] = "Deployment";
WorkloadKind["StatefulSet"] = "StatefulSet";
WorkloadKind["DaemonSet"] = "DaemonSet";
})(WorkloadKind || (WorkloadKind = {}));
export var JobStatusEnum;
(function (JobStatusEnum) {
JobStatusEnum["EXECUTING"] = "executing";
JobStatusEnum["EXECUTE_SUCCEEDED"] = "execute_succeeded";
JobStatusEnum["EXECUTE_FAILED"] = "execute_failed";
JobStatusEnum["UNKNOWN"] = "unknown";
})(JobStatusEnum || (JobStatusEnum = {}));
export const JobStatusColorMapper = {
[JobStatusEnum.EXECUTING]: GenericStatusColor.Pending,
[JobStatusEnum.EXECUTE_SUCCEEDED]: GenericStatusColor.Succeeded,
[JobStatusEnum.EXECUTE_FAILED]: GenericStatusColor.Failed,
[JobStatusEnum.UNKNOWN]: GenericStatusColor.Empty,
};
export const JobStatusIconMapper = {
[JobStatusEnum.EXECUTING]: GenericStatusIcon.Pending,
[JobStatusEnum.EXECUTE_SUCCEEDED]: GenericStatusIcon.Check,
[JobStatusEnum.EXECUTE_FAILED]: GenericStatusIcon.Error,
[JobStatusEnum.UNKNOWN]: GenericStatusIcon.Question,
};
export var WorkloadStatusEnum;
(function (WorkloadStatusEnum) {
WorkloadStatusEnum["running"] = "running";
WorkloadStatusEnum["stopped"] = "stopped";
WorkloadStatusEnum["pending"] = "pending";
WorkloadStatusEnum["killed"] = "killed";
})(WorkloadStatusEnum || (WorkloadStatusEnum = {}));
export const WorkloadStatusColorMapper = {
[WorkloadStatusEnum.running]: GenericStatusColor.Running,
[WorkloadStatusEnum.pending]: GenericStatusColor.Pending,
[WorkloadStatusEnum.stopped]: GenericStatusColor.Stopped,
[WorkloadStatusEnum.killed]: GenericStatusColor.Stopped,
};
export const WorkloadStatusIconMapper = {
[WorkloadStatusEnum.running]: GenericStatusIcon.Running,
[WorkloadStatusEnum.pending]: GenericStatusIcon.Pending,
[WorkloadStatusEnum.stopped]: GenericStatusIcon.Stopped,
[WorkloadStatusEnum.killed]: GenericStatusIcon.Stopped,
};
export const STATUS = 'status';
export function parseDeploymentStatus(res) {
const status = res.status;
if (larger(res.spec.replicas, 0) &&
equal(status.updatedReplicas, res.spec.replicas) &&
equal(status.replicas, res.spec.replicas) &&
equal(status.availableReplicas, res.spec.replicas) &&
largerEqual(status.observedGeneration, res.metadata.generation)) {
return WorkloadStatusEnum.running;
}
if (equal(res.spec.replicas, 0) &&
equal(status.replicas, res.spec.replicas) &&
equal(status.updatedReplicas, res.spec.replicas) &&
equal(status.availableReplicas, res.spec.replicas) &&
largerEqual(status.observedGeneration, res.metadata.generation)) {
return WorkloadStatusEnum.stopped;
}
return WorkloadStatusEnum.pending;
}
export function parseDaemonSetStatus(res) {
const status = res.status;
if (larger(status.desiredNumberScheduled, 0) &&
largerEqual(status.observedGeneration, res.metadata.generation) &&
equal(status.desiredNumberScheduled, status.currentNumberScheduled) &&
equal(status.numberReady, status.desiredNumberScheduled) &&
equal(status.numberAvailable, status.desiredNumberScheduled) &&
(res.spec.updateStrategy.type !== 'RollingUpdate' ||
equal(status.updatedNumberScheduled, status.desiredNumberScheduled))) {
return WorkloadStatusEnum.running;
}
if (equal(status.desiredNumberScheduled, 0) &&
largerEqual(status.observedGeneration, res.metadata.generation) &&
equal(status.desiredNumberScheduled, status.desiredNumberScheduled) &&
equal(status.numberReady, status.desiredNumberScheduled) &&
equal(status.numberAvailable, status.desiredNumberScheduled) &&
equal(status.currentNumberScheduled, status.desiredNumberScheduled) &&
(res.spec.updateStrategy.type !== 'RollingUpdate' ||
equal(status.updatedNumberScheduled, status.desiredNumberScheduled))) {
return WorkloadStatusEnum.stopped;
}
return WorkloadStatusEnum.pending;
}
export function parseStatefulSetStatus(res) {
const status = res.status;
if (larger(res.spec.replicas, 0) &&
equal(status.replicas, res.spec.replicas) &&
equal(status.readyReplicas, res.spec.replicas) &&
largerEqual(status.observedGeneration, res.metadata.generation) &&
(res.spec.updateStrategy.type !== 'RollingUpdate' ||
(equal(status.currentRevision, status.updateRevision)
? equal(status.currentReplicas, res.spec.replicas)
: largerEqual(status?.updatedReplicas, status.replicas - +res.spec.updateStrategy.rollingUpdate?.partition)))) {
return WorkloadStatusEnum.running;
}
if (equal(res.spec.replicas, 0) &&
equal(status.replicas, res.spec.replicas) &&
equal(status.readyReplicas, res.spec.replicas) &&
largerEqual(status.observedGeneration, res.metadata.generation) &&
(res.spec.updateStrategy.type !== 'RollingUpdate' ||
(equal(status.currentRevision, status.updateRevision) &&
equal(status.currentReplicas, res.spec.replicas)))) {
return WorkloadStatusEnum.stopped;
}
return WorkloadStatusEnum.pending;
}
export function parseToWorkloadStatus(data) {
switch (data?.kind) {
case WorkloadKind.Deployment: {
return {
status: parseDeploymentStatus(data),
desired: get(data, ['spec', 'replicas'], 0),
current: get(data, [STATUS, 'availableReplicas'], 0),
};
}
case WorkloadKind.DaemonSet: {
return {
status: parseDaemonSetStatus(data),
desired: get(data, [STATUS, 'desiredNumberScheduled'], 0),
current: get(data, [STATUS, 'numberReady'], 0),
};
}
case WorkloadKind.StatefulSet: {
return {
status: parseStatefulSetStatus(data),
desired: get(data, ['spec', 'replicas'], 0),
current: get(data, [STATUS, 'readyReplicas'], 0),
};
}
default: {
return {
status: WorkloadStatusEnum.stopped,
desired: 0,
current: 0,
};
}
}
}
function equal(x, y) {
return defaultZero(x) === defaultZero(y);
}
function largerEqual(x, y) {
return defaultZero(x) >= defaultZero(y);
}
function larger(x, y) {
return defaultZero(x) > defaultZero(y);
}
function defaultZero(x) {
return x || 0;
}
export function getJobStatus(data) {
const status = data.status;
if (status.conditions?.some(_item => _item.type === 'Failed')) {
return JobStatusEnum.EXECUTE_FAILED;
}
// when Complete and succeeded, judge to execute_succeeded
if (status.conditions?.some(_item => _item.type === 'Complete')) {
if (status.succeeded) {
return JobStatusEnum.EXECUTE_SUCCEEDED;
}
if (status.failed) {
return JobStatusEnum.EXECUTE_FAILED;
}
}
// no condition and no Complete when running
if (status.active) {
return JobStatusEnum.EXECUTING;
}
return JobStatusEnum.UNKNOWN;
}
export function getWorkloadStatus(status) {
return status.status.toLowerCase();
}
export function getPodIPs(pod) {
const podIPs = pod.status.podIPs?.map(({ ip }) => ip);
return podIPs?.length ? podIPs : [pod.status.podIP].filter(Boolean);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2xvYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvY29yZS91dGlscy93b3JrbG9hZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWhDLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsaUJBQWlCLEdBQ2xCLE1BQU0sMkJBQTJCLENBQUM7QUFLbkMsTUFBTSxDQUFOLElBQVksWUFJWDtBQUpELFdBQVksWUFBWTtJQUN0Qix5Q0FBeUIsQ0FBQTtJQUN6QiwyQ0FBMkIsQ0FBQTtJQUMzQix1Q0FBdUIsQ0FBQTtBQUN6QixDQUFDLEVBSlcsWUFBWSxLQUFaLFlBQVksUUFJdkI7QUFFRCxNQUFNLENBQU4sSUFBWSxhQUtYO0FBTEQsV0FBWSxhQUFhO0lBQ3ZCLHdDQUF1QixDQUFBO0lBQ3ZCLHdEQUF1QyxDQUFBO0lBQ3ZDLGtEQUFpQyxDQUFBO0lBQ2pDLG9DQUFtQixDQUFBO0FBQ3JCLENBQUMsRUFMVyxhQUFhLEtBQWIsYUFBYSxRQUt4QjtBQUVELE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHO0lBQ2xDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLE9BQU87SUFDckQsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxTQUFTO0lBQy9ELENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLE1BQU07SUFDekQsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEVBQUUsa0JBQWtCLENBQUMsS0FBSztDQUNsRCxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUc7SUFDakMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsT0FBTztJQUNwRCxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxF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R0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN0RCxPQUFPLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN0RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0IH0gZnJvbSAnbG9kYXNoLWVzJztcblxuaW1wb3J0IHtcbiAgR2VuZXJpY1N0YXR1c0NvbG9yLFxuICBHZW5lcmljU3RhdHVzSWNvbixcbn0gZnJvbSAnLi4vY29uc3RhbnRzL3N0YXR1cy1pY29ucyc7XG5pbXBvcnQgeyBEYWVtb25TZXQsIERlcGxveW1lbnQsIEpvYiwgUG9kLCBTdGF0ZWZ1bFNldCB9IGZyb20gJy4uL3R5cGVzL2s4cy9yYXcnO1xuXG5leHBvcnQgdHlwZSBXb3JrbG9hZCA9IERlcGxveW1lbnQgfCBTdGF0ZWZ1bFNldCB8IERhZW1vblNldDtcblxuZXhwb3J0IGVudW0gV29ya2xvYWRLaW5kIHtcbiAgRGVwbG95bWVudCA9ICdEZXBsb3ltZW50JyxcbiAgU3RhdGVmdWxTZXQgPSAnU3RhdGVmdWxTZXQnLFxuICBEYWVtb25TZXQgPSAnRGFlbW9uU2V0Jyxcbn1cblxuZXhwb3J0IGVudW0gSm9iU3RhdHVzRW51bSB7XG4gIEVYRUNVVElORyA9ICdleGVjdXRpbmcnLFxuICBFWEVDVVRFX1NVQ0NFRURFRCA9ICdleGVjdXRlX3N1Y2NlZWRlZCcsXG4gIEVYRUNVVEVfRkFJTEVEID0gJ2V4ZWN1dGVfZmFpbGVkJyxcbiAgVU5LTk9XTiA9ICd1bmtub3duJywgLy8g5q+U5aaCIG5hbWVzcGFjZSBwb2Qg5pWw6YeP6L6+5Yiw6ZmQ6aKd5LiK6ZmQ77yM5Lu75Yqh5bCx5Lya5Y+q6Kem5Y+R77yM5L2G5piv5rKh5pyJ54q25oCBXG59XG5cbmV4cG9ydCBjb25zdCBKb2JTdGF0dXNDb2xvck1hcHBlciA9IHtcbiAgW0pvYlN0YXR1c0VudW0uRVhFQ1VUSU5HXTogR2VuZXJpY1N0YXR1c0NvbG9yLlBlbmRpbmcsXG4gIFtKb2JTdGF0dXNFbnVtLkVYRUNVVEVfU1VDQ0VFREVEXTogR2VuZXJpY1N0YXR1c0NvbG9yLlN1Y2NlZWRlZCxcbiAgW0pvYlN0YXR1c0VudW0uRVhFQ1VURV9GQUlMRURdOiBHZW5lcmljU3RhdHVzQ29sb3IuRmFpbGVkLFxuICBbSm9iU3RhdHVzRW51bS5VTktOT1dOXTogR2VuZXJpY1N0YXR1c0NvbG9yLkVtcHR5LFxufTtcblxuZXhwb3J0IGNvbnN0IEpvYlN0YXR1c0ljb25NYXBwZXIgPSB7XG4gIFtKb2JTdGF0dXNFbnVtLkVYRUNVVElOR106IEdlbmVyaWNTdGF0dXNJY29uLlBlbmRpbmcsXG4gIFtKb2JTdGF0dXNFbnVtLkVYRUNVVEVfU1VDQ0VFREVEXTogR2VuZXJpY1N0YXR1c0ljb24uQ2hlY2ssXG4gIFtKb2JTdGF0dXNFbnVtLkVYRUNVVEVfRkFJTEVEXTogR2VuZXJpY1N0YXR1c0ljb24uRXJyb3IsXG4gIFtKb2JTdGF0dXNFbnVtLlVOS05PV05dOiBHZW5lcmljU3RhdHVzSWNvbi5RdWVzdGlvbixcbn07XG5cbmV4cG9ydCBlbnVtIFdvcmtsb2FkU3RhdHVzRW51bSB7XG4gIHJ1bm5pbmcgPSAncnVubmluZycsXG4gIHN0b3BwZWQgPSAnc3RvcHBlZCcsXG4gIHBlbmRpbmcgPSAncGVuZGluZycsXG4gIGtpbGxlZCA9ICdraWxsZWQnLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyaWNXb3JrbG9hZFN0YXR1cyB7XG4gIHN0YXR1cz86IFdvcmtsb2FkU3RhdHVzRW51bTtcbiAgZGVzaXJlZD86IG51bWJlcjtcbiAgY3VycmVudD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXb3JrbG9hZFN0YXR1cyBleHRlbmRzIEdlbmVyaWNXb3JrbG9hZFN0YXR1cyB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGdyb3VwPzogc3RyaW5nO1xuICBraW5kPzogc3RyaW5nO1xuICBtZXNzYWdlcz86IEFycmF5PHtcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgcmVhc29uPzogc3RyaW5nO1xuICB9Pjtcbn1cblxuZXhwb3J0IGNvbnN0IFdvcmtsb2FkU3RhdHVzQ29sb3JNYXBwZXIgPSB7XG4gIFtXb3JrbG9hZFN0YXR1c0VudW0ucnVubmluZ106IEdlbmVyaWNTdGF0dXNDb2xvci5SdW5uaW5nLFxuICBbV29ya2xvYWRTdGF0dXNFbnVtLnBlbmRpbmddOiBHZW5lcmljU3RhdHVzQ29sb3IuUGVuZGluZyxcbiAgW1dvcmtsb2FkU3RhdHVzRW51bS5zdG9wcGVkXTogR2VuZXJpY1N0YXR1c0NvbG9yLlN0b3BwZWQsXG4gIFtXb3JrbG9hZFN0YXR1c0VudW0ua2lsbGVkXTogR2VuZXJpY1N0YXR1c0NvbG9yLlN0b3BwZWQsXG59O1xuXG5leHBvcnQgY29uc3QgV29ya2xvYWRTdGF0dXNJY29uTWFwcGVyID0ge1xuICBbV29ya2xvYWRTdGF0dXNFbnVtLnJ1bm5pbmddOiBHZW5lcmljU3RhdHVzSWNvbi5SdW5uaW5nLFxuICBbV29ya2xvYWRTdGF0dXNFbnVtLnBlbmRpbmddOiBHZW5lcmljU3RhdHVzSWNvbi5QZW5kaW5nLFxuICBbV29ya2xvYWRTdGF0dXNFbnVtLnN0b3BwZWRdOiBHZW5lcmljU3RhdHVzSWNvbi5TdG9wcGVkLFxuICBbV29ya2xvYWRTdGF0dXNFbnVtLmtpbGxlZF06IEdlbmVyaWNTdGF0dXNJY29uLlN0b3BwZWQsXG59O1xuXG5leHBvcnQgY29uc3QgU1RBVFVTID0gJ3N0YXR1cyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZURlcGxveW1lbnRTdGF0dXMocmVzOiBEZXBsb3ltZW50KSB7XG4gIGNvbnN0IHN0YXR1cyA9IHJlcy5zdGF0dXM7XG4gIGlmIChcbiAgICBsYXJnZXIocmVzLnNwZWMucmVwbGljYXMsIDApICYmXG4gICAgZXF1YWwoc3RhdHVzLnVwZGF0ZWRSZXBsaWNhcywgcmVzLnNwZWMucmVwbGljYXMpICYmXG4gICAgZXF1YWwoc3RhdHVzLnJlcGxpY2FzLCByZXMuc3BlYy5yZXBsaWNhcykgJiZcbiAgICBlcXVhbChzdGF0dXMuYXZhaWxhYmxlUmVwbGljYXMsIHJlcy5zcGVjLnJlcGxpY2FzKSAmJlxuICAgIGxhcmdlckVxdWFsKHN0YXR1cy5vYnNlcnZlZEdlbmVyYXRpb24sIHJlcy5tZXRhZGF0YS5nZW5lcmF0aW9uKVxuICApIHtcbiAgICByZXR1cm4gV29ya2xvYWRTdGF0dXNFbnVtLnJ1bm5pbmc7XG4gIH1cbiAgaWYgKFxuICAgIGVxdWFsKHJlcy5zcGVjLnJlcGxpY2FzLCAwKSAmJlxuICAgIGVxdWFsKHN0YXR1cy5yZXBsaWNhcywgcmVzLnNwZWMucmVwbGljYXMpICYmXG4gICAgZXF1YWwoc3RhdHVzLnVwZGF0ZWRSZXBsaWNhcywgcmVzLnNwZWMucmVwbGljYXMpICYmXG4gICAgZXF1YWwoc3RhdHVzLmF2YWlsYWJsZVJlcGxpY2FzLCByZXMuc3BlYy5yZXBsaWNhcykgJiZcbiAgICBsYXJnZXJFcXVhbChzdGF0dXMub2JzZXJ2ZWRHZW5lcmF0aW9uLCByZXMubWV0YWRhdGEuZ2VuZXJhdGlvbilcbiAgKSB7XG4gICAgcmV0dXJuIFdvcmtsb2FkU3RhdHVzRW51bS5zdG9wcGVkO1xuICB9XG4gIHJldHVybiBXb3JrbG9hZFN0YXR1c0VudW0ucGVuZGluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRGFlbW9uU2V0U3RhdHVzKHJlczogRGFlbW9uU2V0KSB7XG4gIGNvbnN0IHN0YXR1cyA9IHJlcy5zdGF0dXM7XG4gIGlmIChcbiAgICBsYXJnZXIoc3RhdHVzLmRlc2lyZWROdW1iZXJTY2hlZHVsZWQsIDApICYmXG4gICAgbGFyZ2VyRXF1YWwoc3RhdHVzLm9ic2VydmVkR2VuZXJhdGlvbiwgcmVzLm1ldGFkYXRhLmdlbmVyYXRpb24pICYmXG4gICAgZXF1YWwoc3RhdHVzLmRlc2lyZWROdW1iZXJTY2hlZHVsZWQsIHN0YXR1cy5jdXJyZW50TnVtYmVyU2NoZWR1bGVkKSAmJlxuICAgIGVxdWFsKHN0YXR1cy5udW1iZXJSZWFkeSwgc3RhdHVzLmRlc2lyZWROdW1iZXJTY2hlZHVsZWQpICYmXG4gICAgZXF1YWwoc3RhdHVzLm51bWJlckF2YWlsYWJsZSwgc3RhdHVzLmRlc2lyZWROdW1iZXJTY2hlZHVsZWQpICYmXG4gICAgKHJlcy5zcGVjLnVwZGF0ZVN0cmF0ZWd5LnR5cGUgIT09ICdSb2xsaW5nVXBkYXRlJyB8fFxuICAgICAgZXF1YWwoc3RhdHVzLnVwZGF0ZWROdW1iZXJTY2hlZHVsZWQsIHN0YXR1cy5kZXNpcmVkTnVtYmVyU2NoZWR1bGVkKSlcbiAgKSB7XG4gICAgcmV0dXJuIFdvcmtsb2FkU3RhdHVzRW51bS5ydW5uaW5nO1xuICB9XG4gIGlmIChcbiAgICBlcXVhbChzdGF0dXMuZGVzaXJlZE51bWJlclNjaGVkdWxlZCwgMCkgJiZcbiAgICBsYXJnZXJFcXVhbChzdGF0dXMub2JzZXJ2ZWRHZW5lcmF0aW9uLCByZXMubWV0YWRhdGEuZ2VuZXJhdGlvbikgJiZcbiAgICBlcXVhbChzdGF0dXMuZGVzaXJlZE51bWJlclNjaGVkdWxlZCwgc3RhdHVzLmRlc2lyZWROdW1iZXJTY2hlZHVsZWQpICYmXG4gICAgZXF1YWwoc3RhdHVzLm51bWJlclJlYWR5LCBzdGF0dXMuZGVzaXJlZE51bWJlclNjaGVkdWxlZCkgJiZcbiAgICBlcXVhbChzdGF0dXMubnVtYmVyQXZhaWxhYmxlLCBzdGF0dXMuZGVzaXJlZE51bWJlclNjaGVkdWxlZCkgJiZcbiAgICBlcXVhbChzdGF0dXMuY3VycmVudE51bWJlclNjaGVkdWxlZCwgc3RhdHVzLmRlc2lyZWROdW1iZXJTY2hlZHVsZWQpICYmXG4gICAgKHJlcy5zcGVjLnVwZGF0ZVN0cmF0ZWd5LnR5cGUgIT09ICdSb2xsaW5nVXBkYXRlJyB8fFxuICAgICAgZXF1YWwoc3RhdHVzLnVwZGF0ZWROdW1iZXJTY2hlZHVsZWQsIHN0YXR1cy5kZXNpcmVkTnVtYmVyU2NoZWR1bGVkKSlcbiAgKSB7XG4gICAgcmV0dXJuIFdvcmtsb2FkU3RhdHVzRW51bS5zdG9wcGVkO1xuICB9XG4gIHJldHVybiBXb3JrbG9hZFN0YXR1c0VudW0ucGVuZGluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3RhdGVmdWxTZXRTdGF0dXMocmVzOiBTdGF0ZWZ1bFNldCkge1xuICBjb25zdCBzdGF0dXMgPSByZXMuc3RhdHVzO1xuICBpZiAoXG4gICAgbGFyZ2VyKHJlcy5zcGVjLnJlcGxpY2FzLCAwKSAmJlxuICAgIGVxdWFsKHN0YXR1cy5yZXBsaWNhcywgcmVzLnNwZWMucmVwbGljYXMpICYmXG4gICAgZXF1YWwoc3RhdHVzLnJlYWR5UmVwbGljYXMsIHJlcy5zcGVjLnJlcGxpY2FzKSAmJlxuICAgIGxhcmdlckVxdWFsKHN0YXR1cy5vYnNlcnZlZEdlbmVyYXRpb24sIHJlcy5tZXRhZGF0YS5nZW5lcmF0aW9uKSAmJlxuICAgIChyZXMuc3BlYy51cGRhdGVTdHJhdGVneS50eXBlICE9PSAnUm9sbGluZ1VwZGF0ZScgfHxcbiAgICAgIChlcXVhbChzdGF0dXMuY3VycmVudFJldmlzaW9uLCBzdGF0dXMudXBkYXRlUmV2aXNpb24pXG4gICAgICAgID8gZXF1YWwoc3RhdHVzLmN1cnJlbnRSZXBsaWNhcywgcmVzLnNwZWMucmVwbGljYXMpXG4gICAgICAgIDogbGFyZ2VyRXF1YWwoXG4gICAgICAgICAgICBzdGF0dXM/LnVwZGF0ZWRSZXBsaWNhcyxcbiAgICAgICAgICAgIHN0YXR1cy5yZXBsaWNhcyAtICtyZXMuc3BlYy51cGRhdGVTdHJhdGVneS5yb2xsaW5nVXBkYXRlPy5wYXJ0aXRpb24sXG4gICAgICAgICAgKSkpXG4gICkge1xuICAgIHJldHVybiBXb3JrbG9hZFN0YXR1c0VudW0ucnVubmluZztcbiAgfVxuICBpZiAoXG4gICAgZXF1YWwocmVzLnNwZWMucmVwbGljYXMsIDApICYmXG4gICAgZXF1YWwoc3RhdHVzLnJlcGxpY2FzLCByZXMuc3BlYy5yZXBsaWNhcykgJiZcbiAgICBlcXVhbChzdGF0dXMucmVhZHlSZXBsaWNhcywgcmVzLnNwZWMucmVwbGljYXMpICYmXG4gICAgbGFyZ2VyRXF1YWwoc3RhdHVzLm9ic2VydmVkR2VuZXJhdGlvbiwgcmVzLm1ldGFkYXRhLmdlbmVyYXRpb24pICYmXG4gICAgKHJlcy5zcGVjLnVwZGF0ZVN0cmF0ZWd5LnR5cGUgIT09ICdSb2xsaW5nVXBkYXRlJyB8fFxuICAgICAgKGVxdWFsKHN0YXR1cy5jdXJyZW50UmV2aXNpb24sIHN0YXR1cy51cGRhdGVSZXZpc2lvbikgJiZcbiAgICAgICAgZXF1YWwoc3RhdHVzLmN1cnJlbnRSZXBsaWNhcywgcmVzLnNwZWMucmVwbGljYXMpKSlcbiAgKSB7XG4gICAgcmV0dXJuIFdvcmtsb2FkU3RhdHVzRW51bS5zdG9wcGVkO1xuICB9XG4gIHJldHVybiBXb3JrbG9hZFN0YXR1c0VudW0ucGVuZGluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVG9Xb3JrbG9hZFN0YXR1cyhkYXRhOiBEZXBsb3ltZW50KTogR2VuZXJpY1dvcmtsb2FkU3RhdHVzIHtcbiAgc3dpdGNoIChkYXRhPy5raW5kKSB7XG4gICAgY2FzZSBXb3JrbG9hZEtpbmQuRGVwbG95bWVudDoge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhdHVzOiBwYXJzZURlcGxveW1lbnRTdGF0dXMoZGF0YSksXG4gICAgICAgIGRlc2lyZWQ6IGdldChkYXRhLCBbJ3NwZWMnLCAncmVwbGljYXMnXSwgMCksXG4gICAgICAgIGN1cnJlbnQ6IGdldChkYXRhLCBbU1RBVFVTLCAnYXZhaWxhYmxlUmVwbGljYXMnXSwgMCksXG4gICAgICB9O1xuICAgIH1cbiAgICBjYXNlIFdvcmtsb2FkS2luZC5EYWVtb25TZXQ6IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1czogcGFyc2VEYWVtb25TZXRTdGF0dXMoZGF0YSksXG4gICAgICAgIGRlc2lyZWQ6IGdldChkYXRhLCBbU1RBVFVTLCAnZGVzaXJlZE51bWJlclNjaGVkdWxlZCddLCAwKSxcbiAgICAgICAgY3VycmVudDogZ2V0KGRhdGEsIFtTVEFUVVMsICdudW1iZXJSZWFkeSddLCAwKSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgV29ya2xvYWRLaW5kLlN0YXRlZnVsU2V0OiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGF0dXM6IHBhcnNlU3RhdGVmdWxTZXRTdGF0dXMoZGF0YSksXG4gICAgICAgIGRlc2lyZWQ6IGdldChkYXRhLCBbJ3NwZWMnLCAncmVwbGljYXMnXSwgMCksXG4gICAgICAgIGN1cnJlbnQ6IGdldChkYXRhLCBbU1RBVFVTLCAncmVhZHlSZXBsaWNhcyddLCAwKSxcbiAgICAgIH07XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1czogV29ya2xvYWRTdGF0dXNFbnVtLnN0b3BwZWQsXG4gICAgICAgIGRlc2lyZWQ6IDAsXG4gICAgICAgIGN1cnJlbnQ6IDAsXG4gICAgICB9O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBlcXVhbCh4OiBudW1iZXIgfCBzdHJpbmcsIHk6IG51bWJlciB8IHN0cmluZykge1xuICByZXR1cm4gZGVmYXVsdFplcm8oeCkgPT09IGRlZmF1bHRaZXJvKHkpO1xufVxuXG5mdW5jdGlvbiBsYXJnZXJFcXVhbCh4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICByZXR1cm4gZGVmYXVsdFplcm8oeCkgPj0gZGVmYXVsdFplcm8oeSk7XG59XG5cbmZ1bmN0aW9uIGxhcmdlcih4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICByZXR1cm4gZGVmYXVsdFplcm8oeCkgPiBkZWZhdWx0WmVybyh5KTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFplcm8oeDogbnVtYmVyIHwgc3RyaW5nKSB7XG4gIHJldHVybiB4IHx8IDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRKb2JTdGF0dXMoZGF0YTogSm9iKTogSm9iU3RhdHVzRW51bSB7XG4gIGNvbnN0IHN0YXR1cyA9IGRhdGEuc3RhdHVzO1xuICBpZiAoc3RhdHVzLmNvbmRpdGlvbnM/LnNvbWUoX2l0ZW0gPT4gX2l0ZW0udHlwZSA9PT0gJ0ZhaWxlZCcpKSB7XG4gICAgcmV0dXJuIEpvYlN0YXR1c0VudW0uRVhFQ1VURV9GQUlMRUQ7XG4gIH1cbiAgLy8gd2hlbiBDb21wbGV0ZSBhbmQgc3VjY2VlZGVkLCBqdWRnZSB0byBleGVjdXRlX3N1Y2NlZWRlZFxuICBpZiAoc3RhdHVzLmNvbmRpdGlvbnM/LnNvbWUoX2l0ZW0gPT4gX2l0ZW0udHlwZSA9PT0gJ0NvbXBsZXRlJykpIHtcbiAgICBpZiAoc3RhdHVzLnN1Y2NlZWRlZCkge1xuICAgICAgcmV0dXJuIEpvYlN0YXR1c0VudW0uRVhFQ1VURV9TVUNDRUVERUQ7XG4gICAgfVxuICAgIGlmIChzdGF0dXMuZmFpbGVkKSB7XG4gICAgICByZXR1cm4gSm9iU3RhdHVzRW51bS5FWEVDVVRFX0ZBSUxFRDtcbiAgICB9XG4gIH1cbiAgLy8gbm8gY29uZGl0aW9uIGFuZCBubyBDb21wbGV0ZSB3aGVuIHJ1bm5pbmdcbiAgaWYgKHN0YXR1cy5hY3RpdmUpIHtcbiAgICByZXR1cm4gSm9iU3RhdHVzRW51bS5FWEVDVVRJTkc7XG4gIH1cbiAgcmV0dXJuIEpvYlN0YXR1c0VudW0uVU5LTk9XTjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtsb2FkU3RhdHVzKHN0YXR1czogR2VuZXJpY1dvcmtsb2FkU3RhdHVzKSB7XG4gIHJldHVybiBzdGF0dXMuc3RhdHVzLnRvTG93ZXJDYXNlKCkgYXMgV29ya2xvYWRTdGF0dXNFbnVtO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UG9kSVBzKHBvZDogUG9kKSB7XG4gIGNvbnN0IHBvZElQcyA9IHBvZC5zdGF0dXMucG9kSVBzPy5tYXAoKHsgaXAgfSkgPT4gaXApO1xuICByZXR1cm4gcG9kSVBzPy5sZW5ndGggPyBwb2RJUHMgOiBbcG9kLnN0YXR1cy5wb2RJUF0uZmlsdGVyKEJvb2xlYW4pO1xufVxuIl19