@tai-kun/surrealdb
Version:
The SurrealDB SDK for JavaScript
173 lines (171 loc) • 19.2 kB
JavaScript
"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/surreal/utils/auto-reconnect.ts
var auto_reconnect_exports = {};
__export(auto_reconnect_exports, {
default: () => autoReconnect
});
module.exports = __toCommonJS(auto_reconnect_exports);
var import_errors = require("../../errors/index.cjs");
var import_utils = require("../../utils/index.cjs");
var _AutoReconnect = class _AutoReconnect extends import_utils.TaskEmitter {
constructor(db, options = {}) {
super();
this._enabled = true;
this._counter = 0;
this._info = {
state: "waiting",
phase: "waiting"
};
this.db = db;
const {
maxDelay = 3e4,
backoffLimit = Infinity,
initialDelay = 500,
shouldReconnect = {}
} = options;
this.maxDelay = maxDelay;
this.backoffLimit = backoffLimit;
this.initialDelay = initialDelay;
if (typeof shouldReconnect === "function") {
this.shouldReconnect = shouldReconnect;
} else {
const {
ping = {
// デフォルトで「1 分以内に 3 回以上 ping に失敗した場合は再接続すべき」
threshold: 3,
perMillis: 6e4
}
} = shouldReconnect;
const {
threshold,
perMillis
} = ping;
let time = Date.now();
let counter = 0;
this.shouldReconnect = (e) => {
const now = Date.now();
if (now - time > perMillis) {
time = now;
counter = 0;
}
if (e instanceof import_errors.WebSocketEngineError) {
if (e.code === 3153) {
counter += 1;
}
if (e.code === 1012 || e.code === 1013) {
time = now;
counter = 0;
return true;
}
}
if (counter >= threshold) {
time = now;
counter = 0;
return true;
}
return false;
};
}
this.on("failure", (_, endpoint) => {
this._info = {
state: "failure",
phase: "failed"
};
this.emit("enqueue", endpoint);
});
this.on("success", () => {
this._info = {
state: "success",
phase: "succeeded"
};
this.reset();
});
this.on("connect", async ({ signal }, endpoint) => {
this._info = {
state: "running",
phase: "closing"
};
try {
await this.db.close({ signal });
} catch (e) {
this.emit("error", e);
}
this._info = {
state: "running",
phase: "connecting"
};
try {
await this.db.connect(endpoint, { signal });
this.emit("success", endpoint);
} catch (e) {
this.emit("failure", endpoint, e);
}
});
this.on("pending", ({ signal }, endpoint, duration) => {
this._info.phase = "pending";
const t = setTimeout(() => this.emit("connect", endpoint), duration);
signal.addEventListener("abort", () => clearTimeout(t), { once: true });
});
this.on("enqueue", (_, endpoint) => {
const duration = Math.min(
this.initialDelay * 2 ** this._counter++,
this.maxDelay
);
this.emit("pending", endpoint, duration);
});
this.db.on("error", (_, e) => {
if (this.enabled && this.state !== "running" && this._counter < this.backoffLimit && this.shouldReconnect(e)) {
const { endpoint } = this.db;
if (endpoint) {
this.emit("enqueue", endpoint);
}
}
});
}
getReconnectionInfo() {
return Object.assign({}, this._info);
}
get state() {
return this._info.state;
}
get phase() {
return this._info.phase;
}
get enabled() {
return this._enabled;
}
enable() {
this._enabled = true;
}
disable() {
this._enabled = false;
}
reset() {
this._counter = 0;
}
};
__name(_AutoReconnect, "AutoReconnect");
var AutoReconnect = _AutoReconnect;
function autoReconnect(...args) {
return new AutoReconnect(...args);
}
__name(autoReconnect, "autoReconnect");
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3N1cnJlYWwvdXRpbHMvYXV0by1yZWNvbm5lY3QudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB0eXBlIENsaWVudCBmcm9tIFwiQHRhaS1rdW4vc3VycmVhbGRiL2Jhc2ljLWNsaWVudFwiO1xuaW1wb3J0IHR5cGUgeyBFbmdpbmVFdmVudE1hcCB9IGZyb20gXCJAdGFpLWt1bi9zdXJyZWFsZGIvZW5naW5lXCI7XG5pbXBvcnQgeyBXZWJTb2NrZXRFbmdpbmVFcnJvciB9IGZyb20gXCJAdGFpLWt1bi9zdXJyZWFsZGIvZXJyb3JzXCI7XG5pbXBvcnQgeyBUYXNrRW1pdHRlciB9IGZyb20gXCJAdGFpLWt1bi9zdXJyZWFsZGIvdXRpbHNcIjtcblxuZXhwb3J0IHR5cGUgQXV0b1JlY29ubmVjdEV2ZW50TWFwID0ge1xuICBlbnF1ZXVlOiBbZW5kcG9pbnQ6IFVSTF07XG4gIHBlbmRpbmc6IFtlbmRwb2ludDogVVJMLCBkdXJhdGlvbjogbnVtYmVyXTtcbiAgY29ubmVjdDogW2VuZHBvaW50OiBVUkxdO1xuICBzdWNjZXNzOiBbZW5kcG9pbnQ6IFVSTF07XG4gIGZhaWx1cmU6IFtlbmRwb2ludDogVVJMLCBlcnJvcjogdW5rbm93bl07XG4gIGVycm9yOiBbZXJyb3I6IHVua25vd25dO1xufTtcbi8vIFRPRE8odGFpLWt1bik6IFx1MzBCOVx1MzBDNlx1MzBGQ1x1MzBCRlx1MzBCOVx1MzA2OFx1MzBENVx1MzBBN1x1MzBGQ1x1MzBCQVx1MzA2RVx1MzBBNFx1MzBEOVx1MzBGM1x1MzBDOFx1MzBFQVx1MzBCOVx1MzBDQVx1MzBGQ1x1NUZDNVx1ODk4MVx1RkYxRlxuLy8gJiB7XG4vLyAgIFtQIGluIGBzdGF0ZToqYF06IFtldmVudDoge1xuLy8gICAgIHR5cGU6IFJlY29ubmVjdGlvblN0YXRlO1xuLy8gICAgIGVuZHBvaW50OiBVUkw7XG4vLyAgIH1dO1xuLy8gfVxuLy8gJiB7XG4vLyAgIFtQIGluIGBwaGFzZToqYF06IFtldmVudDoge1xuLy8gICAgIHR5cGU6IFJlY29ubmVjdGlvblBoYXNlO1xuLy8gICAgIGVuZHBvaW50OiBVUkw7XG4vLyAgIH1dO1xuLy8gfVxuLy8gJiB7XG4vLyAgIFtQIGluIGBzdGF0ZToke1JlY29ubmVjdGlvblN0YXRlfWBdOiBbZXZlbnQ6IHtcbi8vICAgICB0eXBlOiBSZWNvbm5lY3Rpb25TdGF0ZTtcbi8vICAgICBlbmRwb2ludDogVVJMO1xuLy8gICB9XTtcbi8vIH1cbi8vICYge1xuLy8gICBbUCBpbiBgcGhhc2U6JHtSZWNvbm5lY3Rpb25QaGFzZX1gXTogW2V2ZW50OiB7XG4vLyAgICAgdHlwZTogUmVjb25uZWN0aW9uUGhhc2U7XG4vLyAgICAgZW5kcG9pbnQ6IFVSTDtcbi8vICAgfV07XG4vLyB9O1xuXG5leHBvcnQgaW50ZXJmYWNlIEF1dG9SZWNvbm5lY3RPcHRpb25zIHtcbiAgcmVhZG9ubHkgYmFja29mZkxpbWl0PzogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBpbml0aWFsRGVsYXk/OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IG1heERlbGF5PzogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBzaG91bGRSZWNvbm5lY3Q/OlxuICAgIHwge1xuICAgICAgcmVhZG9ubHkgcGluZz86XG4gICAgICAgIHwge1xuICAgICAgICAgIHJlYWRvbmx5IHRocmVzaG9sZDogbnVtYmVyO1xuICAgICAgICAgIHJlYWRvbmx5IHBlck1pbGxpczogbnVtYmVyO1xuICAgICAgICB9XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICB8ICgoLi4uYXJnczogRW5naW5lRXZlbnRNYXBbXCJlcnJvclwiXSkgPT4gYm9vbGVhbilcbiAgICB8IHVuZGVmaW5lZDtcbn1cblxuLy8gc3RhdGVcbi8vIC0gd2FpdGluZzogXHU1MjFEXHU2NzFGXHU3MkI2XHU2MTRCXG4vLyAtIHJ1bm5pbmc6IFx1NUI5Rlx1ODg0Q1x1NEUyRFxuLy8gLSBzdWNjZXNzOiBcdTY3MDBcdTdENDJcdTc2ODRcdTMwNkFcdTUxOERcdTYzQTVcdTdEOUFcdTMwNkVcdTdENTBcdTY3OUMgKFx1NjIxMFx1NTI5Rilcbi8vIC0gZmFpbHVyZTogXHU2NzAwXHU3RDQyXHU3Njg0XHUzMDZBXHU1MThEXHU2M0E1XHU3RDlBXHUzMDZFXHU3RDUwXHU2NzlDIChcdTU5MzFcdTY1NTcpXG4vLyBwaGFzZVxuLy8gLSB3YWl0aW5nOiBcdTUyMURcdTY3MUZcdTcyQjZcdTYxNEJcbi8vIC0gcGVuZGluZzogXHU1MThEXHU2M0E1XHU3RDlBXHUzMDU5XHUzMDhCXHU2NjQyXHUzMDRDXHU2NzY1XHUzMDhCXHUzMDdFXHUzMDY3XHU1Rjg1XHU2QTVGXG4vLyAtIGNsb3Npbmc6IFx1NTIwN1x1NjVBRFx1NEUyRFxuLy8gLSBjb25uZWN0aW5nOiBcdTUxOERcdTYzQTVcdTdEOUFcdTRFMkRcbi8vIC0gc3VjY2VlZGVkOiBcdTUxOERcdTYzQTVcdTdEOUFcdTMwNkJcdTYyMTBcdTUyOUZcdTMwNTdcdTMwNUZcbi8vIC0gZmFpbGVkOiBcdTUxOERcdTYzQTVcdTdEOUFcdTMwNkJcdTU5MzFcdTY1NTdcdTMwNTdcdTMwNUZcbmV4cG9ydCB0eXBlIFJlY29ubmVjdGlvbkluZm8gPSB7XG4gIHN0YXRlOiBcIndhaXRpbmdcIjtcbiAgcGhhc2U6IFwid2FpdGluZ1wiIHwgXCJwZW5kaW5nXCI7XG59IHwge1xuICBzdGF0ZTogXCJydW5uaW5nXCI7XG4gIHBoYXNlOiBcImNsb3NpbmdcIiB8IFwiY29ubmVjdGluZ1wiO1xufSB8IHtcbiAgc3RhdGU6IFwic3VjY2Vzc1wiO1xuICBwaGFzZTogXCJwZW5kaW5nXCIgfCBcInN1Y2NlZWRlZFwiO1xufSB8IHtcbiAgc3RhdGU6IFwiZmFpbHVyZVwiO1xuICBwaGFzZTogXCJwZW5kaW5nXCIgfCBcImZhaWxlZFwiO1xufTtcblxuZXhwb3J0IHR5cGUgUmVjb25uZWN0aW9uU3RhdGUgPSBSZWNvbm5lY3Rpb25JbmZvW1wic3RhdGVcIl07XG5cbmV4cG9ydCB0eXBlIFJlY29ubmVjdGlvblBoYXNlID0gUmVjb25uZWN0aW9uSW5mb1tcInBoYXNlXCJdO1xuXG5jbGFzcyBBdXRvUmVjb25uZWN0IGV4dGVuZHMgVGFza0VtaXR0ZXI8QXV0b1JlY29ubmVjdEV2ZW50TWFwPiB7XG4gIHJlYWRvbmx5IGRiOiBDbGllbnQ7XG4gIHJlYWRvbmx5IG1heERlbGF5OiBudW1iZXI7XG4gIHJlYWRvbmx5IGJhY2tvZmZMaW1pdDogbnVtYmVyO1xuICByZWFkb25seSBpbml0aWFsRGVsYXk6IG51bWJlcjtcbiAgcmVhZG9ubHkgc2hvdWxkUmVjb25uZWN0OiAoLi4uYXJnczogRW5naW5lRXZlbnRNYXBbXCJlcnJvclwiXSkgPT4gYm9vbGVhbjtcblxuICBwcml2YXRlIF9lbmFibGVkID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfY291bnRlciA9IDA7XG4gIHByaXZhdGUgX2luZm86IFJlY29ubmVjdGlvbkluZm8gPSB7XG4gICAgc3RhdGU6IFwid2FpdGluZ1wiLFxuICAgIHBoYXNlOiBcIndhaXRpbmdcIixcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihkYjogQ2xpZW50LCBvcHRpb25zOiBBdXRvUmVjb25uZWN0T3B0aW9ucyB8IHVuZGVmaW5lZCA9IHt9KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmRiID0gZGI7XG4gICAgY29uc3Qge1xuICAgICAgbWF4RGVsYXkgPSAzMF8wMDAsXG4gICAgICBiYWNrb2ZmTGltaXQgPSBJbmZpbml0eSxcbiAgICAgIGluaXRpYWxEZWxheSA9IDUwMCxcbiAgICAgIHNob3VsZFJlY29ubmVjdCA9IHt9LFxuICAgIH0gPSBvcHRpb25zO1xuICAgIHRoaXMubWF4RGVsYXkgPSBtYXhEZWxheTtcbiAgICB0aGlzLmJhY2tvZmZMaW1pdCA9IGJhY2tvZmZMaW1pdDtcbiAgICB0aGlzLmluaXRpYWxEZWxheSA9IGluaXRpYWxEZWxheTtcblxuICAgIGlmICh0eXBlb2Ygc2hvdWxkUmVjb25uZWN0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRoaXMuc2hvdWxkUmVjb25uZWN0ID0gc2hvdWxkUmVjb25uZWN0O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHBpbmcgPSB7XG4gICAgICAgICAgLy8gXHUzMEM3XHUzMEQ1XHUzMEE5XHUzMEVCXHUzMEM4XHUzMDY3XHUzMDBDMSBcdTUyMDZcdTRFRTVcdTUxODVcdTMwNkIgMyBcdTU2REVcdTRFRTVcdTRFMEEgcGluZyBcdTMwNkJcdTU5MzFcdTY1NTdcdTMwNTdcdTMwNUZcdTU4MzRcdTU0MDhcdTMwNkZcdTUxOERcdTYzQTVcdTdEOUFcdTMwNTlcdTMwNzlcdTMwNERcdTMwMERcbiAgICAgICAgICB0aHJlc2hvbGQ6IDMsXG4gICAgICAgICAgcGVyTWlsbGlzOiA2MF8wMDAsXG4gICAgICAgIH0sXG4gICAgICB9ID0gc2hvdWxkUmVjb25uZWN0O1xuICAgICAgY29uc3Qge1xuICAgICAgICB0aHJlc2hvbGQsXG4gICAgICAgIHBlck1pbGxpcyxcbiAgICAgIH0gPSBwaW5nO1xuICAgICAgbGV0IHRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgbGV0IGNvdW50ZXIgPSAwO1xuICAgICAgdGhpcy5zaG91bGRSZWNvbm5lY3QgPSBlID0+IHtcbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcblxuICAgICAgICBpZiAobm93IC0gdGltZSA+IHBlck1pbGxpcykge1xuICAgICAgICAgIHRpbWUgPSBub3c7XG4gICAgICAgICAgY291bnRlciA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBcdTMwQThcdTMwRTlcdTMwRkNcdTMwQTRcdTMwRDlcdTMwRjNcdTMwQzhcdTMwNkVcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQkZcdTMwQjlcdTMwQjNcdTMwRkNcdTMwQzlcdTMwNENcdTMwMDFcdTMwQjVcdTMwRkNcdTMwRDBcdTMwRkNcdTMwNkJcdTYzQTVcdTdEOUFcdTMwNjdcdTMwNERcdTMwOEJcdTUzRUZcdTgwRkRcdTYwMjdcdTMwNENcdTMwNDJcdTMwOEJcdTMwNTNcdTMwNjhcdTMwOTJcdTc5M0FcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOEJcdTMwNkFcdTMwODlcbiAgICAgICAgLy8gXHU1MThEXHU2M0E1XHU3RDlBXHUzMDkyXHU4QTY2XHUzMDdGXHUzMDhCXHUzMDAyXG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgV2ViU29ja2V0RW5naW5lRXJyb3IpIHtcbiAgICAgICAgICAvLyBwaW5nIFx1MzA2Qlx1NTkzMVx1NjU1N1xuICAgICAgICAgIGlmIChlLmNvZGUgPT09IDMxNTMpIHtcbiAgICAgICAgICAgIGNvdW50ZXIgKz0gMTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBlLmNvZGUgPT09IDEwMTIgLy8gXHUzMEI1XHUzMEZDXHUzMEQwXHUzMEZDXHUzMDRDXHU1MThEXHU4RDc3XHU1MkQ1XHUzMDU5XHUzMDhCXHUzMDVGXHUzMDgxXHUzMDAxXHU2M0E1XHU3RDlBXHUzMDkyXHU0RTAwXHU2NUU2XHU3RDQyXHU0RTg2XG4gICAgICAgICAgICB8fCBlLmNvZGUgPT09IDEwMTMgLy8gXHUzMEI1XHUzMEZDXHUzMEQwXHUzMEZDXHUzMDRDXHU5MDRFXHU4Q0EwXHU4Mzc3XHUzMDZFXHUzMDVGXHUzMDgxXHUzMDAxXHU0RTAwXHU5MEU4XHUzMDZFXHUzMEFGXHUzMEU5XHUzMEE0XHUzMEEyXHUzMEYzXHUzMEM4XHUzMDY4XHUzMDZFXHU2M0E1XHU3RDlBXHUzMDkyXHU3RDQyXHU0RTg2XG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aW1lID0gbm93O1xuICAgICAgICAgICAgY291bnRlciA9IDA7XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb3VudGVyID49IHRocmVzaG9sZCkge1xuICAgICAgICAgIHRpbWUgPSBub3c7XG4gICAgICAgICAgY291bnRlciA9IDA7XG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5vbihcImZhaWx1cmVcIiwgKF8sIGVuZHBvaW50KSA9PiB7XG4gICAgICB0aGlzLl9pbmZvID0ge1xuICAgICAgICBzdGF0ZTogXCJmYWlsdXJlXCIsXG4gICAgICAgIHBoYXNlOiBcImZhaWxlZFwiLFxuICAgICAgfTtcbiAgICAgIHRoaXMuZW1pdChcImVucXVldWVcIiwgZW5kcG9pbnQpO1xuICAgIH0pO1xuICAgIHRoaXMub24oXCJzdWNjZXNzXCIsICgpID0+IHtcbiAgICAgIHRoaXMuX2luZm8gPSB7XG4gICAgICAgIHN0YXRlOiBcInN1Y2Nlc3NcIixcbiAgICAgICAgcGhhc2U6IFwic3VjY2VlZGVkXCIsXG4gICAgICB9O1xuICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH0pO1xuICAgIHRoaXMub24oXCJjb25uZWN0XCIsIGFzeW5jICh7IHNpZ25hbCB9LCBlbmRwb2ludCkgPT4ge1xuICAgICAgdGhpcy5faW5mbyA9IHtcbiAgICAgICAgc3RhdGU6IFwicnVubmluZ1wiLFxuICAgICAgICBwaGFzZTogXCJjbG9zaW5nXCIsXG4gICAgICB9O1xuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmRiLmNsb3NlKHsgc2lnbmFsIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLmVtaXQoXCJlcnJvclwiLCBlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5faW5mbyA9IHtcbiAgICAgICAgc3RhdGU6IFwicnVubmluZ1wiLFxuICAgICAgICBwaGFzZTogXCJjb25uZWN0aW5nXCIsXG4gICAgICB9O1xuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmRiLmNvbm5lY3QoZW5kcG9pbnQsIHsgc2lnbmFsIH0pO1xuICAgICAgICB0aGlzLmVtaXQoXCJzdWNjZXNzXCIsIGVuZHBvaW50KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5lbWl0KFwiZmFpbHVyZVwiLCBlbmRwb2ludCwgZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5vbihcInBlbmRpbmdcIiwgKHsgc2lnbmFsIH0sIGVuZHBvaW50LCBkdXJhdGlvbikgPT4ge1xuICAgICAgdGhpcy5faW5mby5waGFzZSA9IFwicGVuZGluZ1wiO1xuICAgICAgY29uc3QgdCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5lbWl0KFwiY29ubmVjdFwiLCBlbmRwb2ludCksIGR1cmF0aW9uKTtcbiAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgKCkgPT4gY2xlYXJUaW1lb3V0KHQpLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5vbihcImVucXVldWVcIiwgKF8sIGVuZHBvaW50KSA9PiB7XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IE1hdGgubWluKFxuICAgICAgICB0aGlzLmluaXRpYWxEZWxheSAqICgyICoqIHRoaXMuX2NvdW50ZXIrKyksXG4gICAgICAgIHRoaXMubWF4RGVsYXksXG4gICAgICApO1xuICAgICAgdGhpcy5lbWl0KFwicGVuZGluZ1wiLCBlbmRwb2ludCwgZHVyYXRpb24pO1xuICAgIH0pO1xuICAgIHRoaXMuZGIub24oXCJlcnJvclwiLCAoXywgZSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmVuYWJsZWRcbiAgICAgICAgJiYgdGhpcy5zdGF0ZSAhPT0gXCJydW5uaW5nXCJcbiAgICAgICAgLy8gVE9ETyh0YWkta3VuKTogXHU0RTBBXHU5NjUwXHUzMDZCXHU5MDU0XHUzMDU3XHUzMDVGXHUzMDg5IGVycm9yIFx1MzBBNFx1MzBEOVx1MzBGM1x1MzBDOFx1MzA2MFx1MzA1OVx1RkYxRlxuICAgICAgICAmJiB0aGlzLl9jb3VudGVyIDwgdGhpcy5iYWNrb2ZmTGltaXRcbiAgICAgICAgJiYgdGhpcy5zaG91bGRSZWNvbm5lY3QoZSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCB7IGVuZHBvaW50IH0gPSB0aGlzLmRiO1xuXG4gICAgICAgIGlmIChlbmRwb2ludCkge1xuICAgICAgICAgIHRoaXMuZW1pdChcImVucXVldWVcIiwgZW5kcG9pbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZXRSZWNvbm5lY3Rpb25JbmZvKCk6IFJlY29ubmVjdGlvbkluZm8ge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9pbmZvKTtcbiAgfVxuXG4gIGdldCBzdGF0ZSgpOiBSZWNvbm5lY3Rpb25TdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX2luZm8uc3RhdGU7XG4gIH1cblxuICBnZXQgcGhhc2UoKTogUmVjb25uZWN0aW9uUGhhc2Uge1xuICAgIHJldHVybiB0aGlzLl9pbmZvLnBoYXNlO1xuICB9XG5cbiAgZ2V0IGVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2VuYWJsZWQ7XG4gIH1cblxuICBlbmFibGUoKTogdm9pZCB7XG4gICAgdGhpcy5fZW5hYmxlZCA9IHRydWU7XG4gIH1cblxuICBkaXNhYmxlKCk6IHZvaWQge1xuICAgIHRoaXMuX2VuYWJsZWQgPSBmYWxzZTtcbiAgfVxuXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX2NvdW50ZXIgPSAwO1xuICB9XG59XG5cbi8qKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhdXRvUmVjb25uZWN0KFxuICAuLi5hcmdzOiBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8dHlwZW9mIEF1dG9SZWNvbm5lY3Q+XG4pOiBBdXRvUmVjb25uZWN0IHtcbiAgcmV0dXJuIG5ldyBBdXRvUmVjb25uZWN0KC4uLmFyZ3MpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBLG9CQUFxQztBQUNyQyxtQkFBNEI7QUFtRjVCLElBQU0saUJBQU4sTUFBTSx1QkFBc0IseUJBQW1DO0FBQUEs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