UNPKG

@tai-kun/surrealdb

Version:

The SurrealDB SDK for JavaScript

170 lines (168 loc) 24.2 kB
"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/data-types/standard/uuid.ts var uuid_exports = {}; __export(uuid_exports, { default: () => Uuid }); module.exports = __toCommonJS(uuid_exports); var import_encodable_datatypes = require("../encodable/index.cjs"); var import_errors = require("../../errors/index.cjs"); var import_uuid = require("../_internals/uuid.cjs"); var BYTE_TO_HEX = /* @__PURE__ */ Array.from( { length: 256 }, (_, i) => (i + 256).toString(16).slice(1) ); var HEX_TO_BYTES = /* @__PURE__ */ Array.from( { length: 16 }, (_, i) => Array.from({ length: 16 }, (_2, j) => i * 16 + j) ); function parseUuid36(uuid) { if (uuid.length !== 36) { throw new import_errors.SurrealValueError("a valid uuid", uuid); } const bytes = new Uint8Array(16); for (let a, b, i = 0, j = 0; i < 36; i++) { if ((a = uuid.charCodeAt(i)) !== 45) { b = uuid.charCodeAt(++i); a = a < 58 ? a - 48 : a < 71 ? a - 55 : a - 87; b = b < 58 ? b - 48 : b < 71 ? b - 55 : b - 87; bytes[j++] = HEX_TO_BYTES[a][b]; } } return bytes; } __name(parseUuid36, "parseUuid36"); var _Uuid = class _Uuid extends import_encodable_datatypes.Uuid { get bytes() { return this._bytes; } set bytes(v) { if (!(0, import_uuid.isValidBytes)(v)) { throw new import_errors.SurrealValueError("a valid uuid", v); } this._bytes = v; this._variant = void 0; this._version = void 0; this._timestamp = void 0; } constructor(source) { super(typeof source === "string" ? parseUuid36(source) : source); } get variant() { if (this._variant === void 0) { const bytes = this.bytes; const v = bytes[8] >>> 4; switch (true) { case v < 0: (0, import_errors.unreachable)(); case (v === 0 && bytes.every((b) => b === 0)): this._variant = "NIL"; break; case v <= 7: this._variant = "NCS"; break; case v <= 11: this._variant = "RFC"; break; case v <= 13: this._variant = "MS"; break; case (v === 15 && bytes.every((b) => b === 255)): this._variant = "MAX"; break; case v <= 15: this._variant = "RESERVED"; break; default: (0, import_errors.unreachable)(); } } return this._variant; } get version() { if (this._version === void 0) { this._version = this.variant === "RFC" ? this.bytes[6] >>> 4 : null; } return this._version; } get timestamp() { if (this._timestamp === void 0) { this._timestamp = unsafe_getUnixMillisecondsFromUuid(this); } return this._timestamp; } clone() { const This = this.constructor; return new This(this.bytes.slice()); } // TODO(tai-kun): 時間でイコール判定? bytes でイコール判定? // equals(other): boolean {} compareTo(other) { let a = this.timestamp, b; if (a === null) { return 0; } b = "timestamp" in other ? other.timestamp : unsafe_getUnixMillisecondsFromUuid(other); if (b === null) { return 0; } return a < b ? -1 : a > b ? 1 : 0; } }; __name(_Uuid, "Uuid"); var Uuid = _Uuid; function unsafe_getUnixMillisecondsFromUuid(uuid) { switch (uuid.version) { case 1: return unsafe_getUnixMillisecondsFromUuidV1(uuid.bytes); case 6: return unsafe_getUnixMillisecondsFromUuidV6(uuid.bytes); case 7: return unsafe_getUnixMillisecondsFromUuidV7(uuid.bytes); default: return null; } } __name(unsafe_getUnixMillisecondsFromUuid, "unsafe_getUnixMillisecondsFromUuid"); var GREGORIAN_OFFSET = 122192928000000000n; function unsafe_getUnixMillisecondsFromUuidV1(bytes) { const hex = "0x" + BYTE_TO_HEX[bytes[6]][1] + BYTE_TO_HEX[bytes[7]] + BYTE_TO_HEX[bytes[4]] + BYTE_TO_HEX[bytes[5]] + BYTE_TO_HEX[bytes[0]] + BYTE_TO_HEX[bytes[1]] + BYTE_TO_HEX[bytes[2]] + BYTE_TO_HEX[bytes[3]]; const timestamp = BigInt(hex); const fromUnixEpoch = timestamp - GREGORIAN_OFFSET; const unixMilliseconds = fromUnixEpoch / 10000n; return Number(unixMilliseconds); } __name(unsafe_getUnixMillisecondsFromUuidV1, "unsafe_getUnixMillisecondsFromUuidV1"); function unsafe_getUnixMillisecondsFromUuidV6(bytes) { const hex = "0x" + BYTE_TO_HEX[bytes[0]] + BYTE_TO_HEX[bytes[1]] + BYTE_TO_HEX[bytes[2]] + BYTE_TO_HEX[bytes[3]] + BYTE_TO_HEX[bytes[4]] + BYTE_TO_HEX[bytes[5]] + BYTE_TO_HEX[bytes[6]][1] + BYTE_TO_HEX[bytes[7]]; const timestamp = BigInt(hex); const fromUnixEpoch = timestamp - GREGORIAN_OFFSET; const unixMilliseconds = fromUnixEpoch / 10000n; return Number(unixMilliseconds); } __name(unsafe_getUnixMillisecondsFromUuidV6, "unsafe_getUnixMillisecondsFromUuidV6"); function unsafe_getUnixMillisecondsFromUuidV7(bytes) { const hex = "0x" + BYTE_TO_HEX[bytes[0]] + BYTE_TO_HEX[bytes[1]] + BYTE_TO_HEX[bytes[2]] + BYTE_TO_HEX[bytes[3]] + BYTE_TO_HEX[bytes[4]] + BYTE_TO_HEX[bytes[5]]; const unixMilliseconds = parseInt(hex); return unixMilliseconds; } __name(unsafe_getUnixMillisecondsFromUuidV7, "unsafe_getUnixMillisecondsFromUuidV7"); //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RhdGEtdHlwZXMvc3RhbmRhcmQvdXVpZC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHtcbiAgVXVpZCBhcyBCYXNlLFxuICB0eXBlIFV1aWRTb3VyY2UsXG59IGZyb20gXCJAdGFpLWt1bi9zdXJyZWFsZGIvZW5jb2RhYmxlLWRhdGF0eXBlc1wiO1xuaW1wb3J0IHsgU3VycmVhbFZhbHVlRXJyb3IsIHVucmVhY2hhYmxlIH0gZnJvbSBcIkB0YWkta3VuL3N1cnJlYWxkYi9lcnJvcnNcIjtcbmltcG9ydCB7IGlzVmFsaWRCeXRlcyB9IGZyb20gXCIuLi9faW50ZXJuYWxzL3V1aWRcIjtcblxuZXhwb3J0IHR5cGUgKiBmcm9tIFwiLi4vZW5jb2RhYmxlL3V1aWRcIjtcblxuLy8gY29uc3QgVVVJRF8zNl9SRUdFWCA9XG4vLyAgIC9eWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtN11bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn0kL1xuXG5leHBvcnQgdHlwZSBVdWlkVmFyaWFudCA9XG4gIHwgXCJOSUxcIiAvLyAwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDBcbiAgfCBcIk1BWFwiIC8vIGZmZmZmZmZmLWZmZmYtZmZmZi1mZmZmLWZmZmZmZmZmZmZmZlxuICB8IFwiTkNTXCIgLy8gMHh4eCAoMGIwMDAwIH4gMGIwMTExKVxuICB8IFwiUkZDXCIgLy8gMTB4eCAoMGIxMDAwIH4gMGIxMDExKVxuICB8IFwiTVNcIiAvLyAxMTB4ICgwYjExMDAgfiAwYjExMDEpXG4gIHwgXCJSRVNFUlZFRFwiOyAvLyAxMTF4ICgwYjExMTAgfiAwYjExMTEpXG5cbmV4cG9ydCB0eXBlIFV1aWRWZXJzaW9uID0gMSB8IDIgfCAzIHwgNCB8IDUgfCA2IHwgNztcblxuLyoqXG4gKiBgYGB0c1xuICogW1xuICogICBcIjAwXCIsIC8vIEJZVEVfVE9fSEVYWzBdXG4gKiAgIFwiMDFcIiwgLy8gQllURV9UT19IRVhbMV1cbiAqICAgLi4uXG4gKiAgIFwiZmVcIiwgLy8gQllURV9UT19IRVhbMjU0XVxuICogICBcImZmXCIsIC8vIEJZVEVfVE9fSEVYWzI1NV1cbiAqIF1cbiAqIGBgYFxuICovXG5jb25zdCBCWVRFX1RPX0hFWCA9IC8qIEBfX1BVUkVfXyAqLyBBcnJheS5mcm9tKFxuICB7IGxlbmd0aDogMjU2IH0sXG4gIChfLCBpKSA9PiAoaSArIDB4MTAwKS50b1N0cmluZygxNikuc2xpY2UoMSksXG4pO1xuXG4vKipcbiAqIGBgYHRzXG4gKiBbXG4gKiAgIFtcbiAqICAgICAweDAwLCAvLyBIRVhfVE9fQllURVNbMF1bMF1cbiAqICAgICAweDAxLCAvLyBIRVhfVE9fQllURVNbMF1bMV1cbiAqICAgICAuLi5cbiAqICAgXSxcbiAqICAgLi4uXG4gKiAgIFtcbiAqICAgICAuLi5cbiAqICAgICAweGZlLCAvLyBIRVhfVE9fQllURVNbMTVdWzE0XVxuICogICAgIDB4ZmYsIC8vIEhFWF9UT19CWVRFU1sxNV1bMTVdXG4gKiAgIF0sXG4gKiBdXG4gKiBgYGBcbiAqL1xuY29uc3QgSEVYX1RPX0JZVEVTID0gLyogQF9fUFVSRV9fICovIEFycmF5LmZyb20oXG4gIHsgbGVuZ3RoOiAxNiB9LFxuICAoXywgaSkgPT4gQXJyYXkuZnJvbSh7IGxlbmd0aDogMTYgfSwgKF8sIGopID0+IGkgKiAxNiArIGopLFxuKTtcblxuZnVuY3Rpb24gcGFyc2VVdWlkMzYodXVpZDogc3RyaW5nKTogVWludDhBcnJheSB7XG4gIC8vIGlmICh1dWlkID09PSBcIjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMFwiKSB7XG4gIC8vICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KDE2KTtcbiAgLy8gfVxuXG4gIC8vIGlmICh1dWlkID09PSBcImZmZmZmZmZmLWZmZmYtZmZmZi1mZmZmLWZmZmZmZmZmZmZmZlwiKSB7XG4gIC8vICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KDE2KS5maWxsKDB4ZmYpO1xuICAvLyB9XG5cbiAgaWYgKHV1aWQubGVuZ3RoICE9PSAzNikge1xuICAgIHRocm93IG5ldyBTdXJyZWFsVmFsdWVFcnJvcihcImEgdmFsaWQgdXVpZFwiLCB1dWlkKTtcbiAgfVxuXG4gIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuXG4gIGZvciAobGV0IGEsIGIsIGkgPSAwLCBqID0gMDsgaSA8IDM2OyBpKyspIHtcbiAgICBpZiAoKGEgPSB1dWlkLmNoYXJDb2RlQXQoaSkpICE9PSA0NSAvKiBcIi1cIiAqLykge1xuICAgICAgYiA9IHV1aWQuY2hhckNvZGVBdCgrK2kpO1xuICAgICAgYSA9IGEgPCA1OCA/IChhIC0gNDgpIDogKGEgPCA3MSA/IChhIC0gNTUpIDogKGEgLSA4NykpO1xuICAgICAgYiA9IGIgPCA1OCA/IChiIC0gNDgpIDogKGIgPCA3MSA/IChiIC0gNTUpIDogKGIgLSA4NykpO1xuICAgICAgYnl0ZXNbaisrXSA9IEhFWF9UT19CWVRFU1thXSFbYl0hO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBieXRlcztcbn1cblxuLyoqXG4gKiBbQVBJIFJlZmVyZW5jZV0oaHR0cHM6Ly90YWkta3VuLmdpdGh1Yi5pby9zdXJyZWFsZGIuanMvdjIvYXBpL2RhdGEvdXVpZClcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXVpZCBleHRlbmRzIEJhc2Uge1xuICBwcm90ZWN0ZWQgX3ZhcmlhbnQ6IFV1aWRWYXJpYW50IHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgX3ZlcnNpb246IFV1aWRWZXJzaW9uIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIF90aW1lc3RhbXA6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbiAgb3ZlcnJpZGUgZ2V0IGJ5dGVzKCk6IFVpbnQ4QXJyYXkge1xuICAgIHJldHVybiB0aGlzLl9ieXRlcztcbiAgfVxuXG4gIG92ZXJyaWRlIHNldCBieXRlcyh2OiBVaW50OEFycmF5KSB7XG4gICAgaWYgKCFpc1ZhbGlkQnl0ZXModikpIHtcbiAgICAgIHRocm93IG5ldyBTdXJyZWFsVmFsdWVFcnJvcihcImEgdmFsaWQgdXVpZFwiLCB2KTtcbiAgICB9XG5cbiAgICB0aGlzLl9ieXRlcyA9IHY7XG4gICAgLy8gQ2xlYXIgY2FjaGVcbiAgICB0aGlzLl92YXJpYW50ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3ZlcnNpb24gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fdGltZXN0YW1wID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3RydWN0b3Ioc291cmNlOiBVdWlkU291cmNlIHwgc3RyaW5nKSB7XG4gICAgc3VwZXIodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIiA/IHBhcnNlVXVpZDM2KHNvdXJjZSkgOiBzb3VyY2UpO1xuICB9XG5cbiAgZ2V0IHZhcmlhbnQoKTogVXVpZFZhcmlhbnQge1xuICAgIGlmICh0aGlzLl92YXJpYW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGJ5dGVzID0gdGhpcy5ieXRlcztcbiAgICAgIGNvbnN0IHYgPSBieXRlc1s4XSEgPj4+IDQ7XG5cbiAgICAgIHN3aXRjaCAodHJ1ZSkge1xuICAgICAgICBjYXNlIHYgPCAwYjAwMDA6XG4gICAgICAgICAgdW5yZWFjaGFibGUoKTtcblxuICAgICAgICBjYXNlIHYgPT09IDBiMDAwMCAmJiBieXRlcy5ldmVyeShiID0+IGIgPT09IDB4MDApOlxuICAgICAgICAgIHRoaXMuX3ZhcmlhbnQgPSBcIk5JTFwiO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgdiA8PSAwYjAxMTE6XG4gICAgICAgICAgdGhpcy5fdmFyaWFudCA9IFwiTkNTXCI7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSB2IDw9IDBiMTAxMTpcbiAgICAgICAgICB0aGlzLl92YXJpYW50ID0gXCJSRkNcIjtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIHYgPD0gMGIxMTAxOlxuICAgICAgICAgIHRoaXMuX3ZhcmlhbnQgPSBcIk1TXCI7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSB2ID09PSAwYjExMTEgJiYgYnl0ZXMuZXZlcnkoYiA9PiBiID09PSAweGZmKTpcbiAgICAgICAgICB0aGlzLl92YXJpYW50ID0gXCJNQVhcIjtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIHYgPD0gMGIxMTExOlxuICAgICAgICAgIHRoaXMuX3ZhcmlhbnQgPSBcIlJFU0VSVkVEXCI7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB1bnJlYWNoYWJsZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl92YXJpYW50O1xuICB9XG5cbiAgZ2V0IHZlcnNpb24oKTogVXVpZFZlcnNpb24gfCBudWxsIHtcbiAgICBpZiAodGhpcy5fdmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl92ZXJzaW9uID0gdGhpcy52YXJpYW50ID09PSBcIlJGQ1wiXG4gICAgICAgID8gKHRoaXMuYnl0ZXNbNl0hID4+PiA0KSBhcyBVdWlkVmVyc2lvblxuICAgICAgICA6IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3ZlcnNpb247XG4gIH1cblxuICBnZXQgdGltZXN0YW1wKCk6IG51bWJlciB8IG51bGwge1xuICAgIGlmICh0aGlzLl90aW1lc3RhbXAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fdGltZXN0YW1wID0gdW5zYWZlX2dldFVuaXhNaWxsaXNlY29uZHNGcm9tVXVpZCh0aGlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fdGltZXN0YW1wO1xuICB9XG5cbiAgY2xvbmUoKTogdGhpcyB7XG4gICAgY29uc3QgVGhpcyA9IHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIFV1aWQ7XG5cbiAgICByZXR1cm4gbmV3IFRoaXModGhpcy5ieXRlcy5zbGljZSgpKSBhcyB0aGlzO1xuICB9XG5cbiAgLy8gVE9ETyh0YWkta3VuKTogXHU2NjQyXHU5NTkzXHUzMDY3XHUzMEE0XHUzMEIzXHUzMEZDXHUzMEVCXHU1MjI0XHU1QjlBPyBieXRlcyBcdTMwNjdcdTMwQTRcdTMwQjNcdTMwRkNcdTMwRUJcdTUyMjRcdTVCOUE/XG4gIC8vIGVxdWFscyhvdGhlcik6IGJvb2xlYW4ge31cblxuICBjb21wYXJlVG8oXG4gICAgb3RoZXI6IHtcbiAgICAgIHJlYWRvbmx5IGJ5dGVzOiBVaW50OEFycmF5O1xuICAgICAgcmVhZG9ubHkgdmVyc2lvbjogVXVpZFZlcnNpb24gfCBudWxsO1xuICAgICAgcmVhZG9ubHkgdGltZXN0YW1wPzogbnVtYmVyIHwgbnVsbDtcbiAgICB9LFxuICApOiAtMSB8IDAgfCAxIHtcbiAgICBsZXQgYSA9IHRoaXMudGltZXN0YW1wLCBiOiBudW1iZXIgfCBudWxsO1xuXG4gICAgaWYgKGEgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGIgPSBcInRpbWVzdGFtcFwiIGluIG90aGVyXG4gICAgICA/IG90aGVyLnRpbWVzdGFtcFxuICAgICAgOiB1bnNhZmVfZ2V0VW5peE1pbGxpc2Vjb25kc0Zyb21VdWlkKG90aGVyKTtcblxuICAgIGlmIChiID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDA7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5zYWZlX2dldFVuaXhNaWxsaXNlY29uZHNGcm9tVXVpZChcbiAgdXVpZDoge1xuICAgIHJlYWRvbmx5IGJ5dGVzOiBVaW50OEFycmF5O1xuICAgIHJlYWRvbmx5IHZlcnNpb246IFV1aWRWZXJzaW9uIHwgbnVsbDtcbiAgfSxcbik6IG51bWJlciB8IG51bGwge1xuICBzd2l0Y2ggKHV1aWQudmVyc2lvbikge1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiB1bnNhZmVfZ2V0VW5peE1pbGxpc2Vjb25kc0Zyb21VdWlkVjEodXVpZC5ieXRlcyk7XG5cbiAgICBjYXNlIDY6XG4gICAgICByZXR1cm4gdW5zYWZlX2dldFVuaXhNaWxsaXNlY29uZHNGcm9tVXVpZFY2KHV1aWQuYnl0ZXMpO1xuXG4gICAgY2FzZSA3OlxuICAgICAgcmV0dXJuIHVuc2FmZV9nZXRVbml4TWlsbGlzZWNvbmRzRnJvbVV1aWRWNyh1dWlkLmJ5dGVzKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vLyBcdTMwQjBcdTMwRUNcdTMwQjRcdTMwRUFcdTMwQUFcdTY2QTZcdTMwNkVcdTk1OEJcdTU5Q0JcdTY1RTVcdTY2NDI6IDE1ODItMTAtMTVUMDA6MDA6MDAuMDAwWlxuY29uc3QgR1JFR09SSUFOX09GRlNFVCA9IDEyMl8xOTJfOTI4XzAwMF8wMDBfMDAwbjtcblxuZnVuY3Rpb24gdW5zYWZlX2dldFVuaXhNaWxsaXNlY29uZHNGcm9tVXVpZFYxKGJ5dGVzOiBVaW50OEFycmF5KTogbnVtYmVyIHtcbiAgLy8gIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDNcbiAgLy8gIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMVxuICAvLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstK1xuICAvLyB8ICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX2xvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAvLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstK1xuICAvLyB8ICAgICAgICAgICB0aW1lX21pZCAgICAgICAgICAgIHwgICAgIHRpbWVfaGlnaF9hbmRfdmVyc2lvbiAgICAgfFxuICAvLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstK1xuICAvLyB8Y2xrX3NlcV9oaV9yZXMgfCAgY2xrX3NlcV9sb3cgIHwgICAgICAgICBub2RlICgwLTEpICAgICAgICAgICAgfFxuICAvLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstK1xuICAvLyB8ICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgKDItNSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAvLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstK1xuICBjb25zdCBoZXggPSBcIjB4XCJcbiAgICAvLyBfX19fX19fXy1fX19fLTFYWFgtX19fXy1fX19fX19fX19fX19cbiAgICArIEJZVEVfVE9fSEVYW2J5dGVzWzZdIV0hWzFdXG4gICAgKyBCWVRFX1RPX0hFWFtieXRlc1s3XSFdXG4gICAgLy8gX19fX19fX18tWFhYWC0xX19fLV9fX18tX19fX19fX19fX19fXG4gICAgKyBCWVRFX1RPX0hFWFtieXRlc1s0XSFdXG4gICAgKyBCWVRFX1RPX0hFWFtieXRlc1s1XSFdXG4gICAgLy8gWFhYWFhYWFgtX19fXy0xX19fLV9fX18tX19fX19fX19fX19fXG4gICAgKyBCWVRFX1RPX0hFWFtieXRlc1swXSFdXG4gICAgKyBCWVRFX1RPX0hFWFtieXRlc1sxXSFdXG4gICAgKyBCWVRFX1RPX0hFWFtieXRlc1syXSFdXG4gICAgKyBCWVRFX1RPX0hFWFtieXRlc1szXSFdO1xuICBjb25zdCB0aW1lc3RhbXAgPSBCaWdJbnQoaGV4KTtcbiAgY29uc3QgZnJvbVVuaXhFcG9jaCA9IHRpbWVzdGFtcCAtIEdSRUdPUklBTl9PRkZTRVQ7XG4gIGNvbnN0IHVuaXhNaWxsaXNlY29uZHMgPSBmcm9tVW5peEVwb2NoIC8gMTBfMDAwbjsgLy8gMTAwbnMgLT4gbXNcblxuICByZXR1cm4gTnVtYmVyKHVuaXhNaWxsaXNlY29uZHMpO1xufVxuXG5mdW5jdGlvbiB1bnNhZmVfZ2V0VW5peE1pbGxpc2Vjb25kc0Zyb21VdWlkVjYoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBudW1iZXIge1xuICAvLyBodHRwczovL3d3dy5pZXRmLm9yZy9hcmNoaXZlL2lkL2RyYWZ0LXBlYWJvZHktZGlzcGF0Y2gtbmV3LXV1aWQtZm9ybWF0LTA0Lmh0bWxfbmFtZS11dWlkLXZlcnNpb24tNlxuICAvLyAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgM1xuICAvLyAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxXG4gIC8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rXG4gIC8vIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX2hpZ2ggICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gIC8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rXG4gIC8vIHwgICAgICAgICAgIHRpbWVfbWlkICAgICAgICAgICAgfCAgICAgIHRpbWVfbG93X2FuZF92ZXJzaW9uICAgICB8XG4gIC8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rXG4gIC8vIHxjbGtfc2VxX2hpX3JlcyB8ICBjbGtfc2VxX2xvdyAgfCAgICAgICAgIG5vZGUgKDAtMSkgICAgICAgICAgICB8XG4gIC8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rXG4gIC8vIHwgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSAoMi01KSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gIC8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rXG4gIGNvbnN0IGhleCA9IFwiMHhcIlxuICAgIC8vIFhYWFhYWFhYLV9fX18tNl9fXy1fX19fLV9fX19fX19fX19fX1xuICAgICsgQllURV9UT19IRVhbYnl0ZXNbMF0hXVxuICAgICsgQllURV9UT19IRVhbYnl0ZXNbMV0hXVxuICAgICsgQllURV9UT19IRVhbYnl0ZXNbMl0hXVxuICAgICsgQllURV9UT19IRVhbYnl0ZXNbM10hXVxuICAgIC8vIF9fX19fX19fLVhYWFgtNl9fXy1fX19fLV9fX19fX19fX19fX1xuICAgICsgQllURV9UT19IRVhbYnl0ZXNbNF0hXVxuICAgICsgQllURV9UT19IRVhbYnl0ZXNbNV0hXVxuICAgIC8vIF9fX19fX19fLV9fX18tNlhYWC1fX19fLV9fX19fX19fX19fX1xuICAgICsgQllURV9UT19IRVhbYnl0ZXNbNl0hXSFbMV1cbiAgICArIEJZVEVfVE9fSEVYW2J5dGVzWzddIV07XG4gIGNvbnN0IHRpbWVzdGFtcCA9IEJpZ0ludChoZXgpO1xuICBjb25zdCBmcm9tVW5peEVwb2NoID0gdGltZXN0YW1wIC0gR1JFR09SSUFOX09GRlNFVDtcbiAgY29uc3QgdW5peE1pbGxpc2Vjb25kcyA9IGZyb21Vbml4RXBvY2ggLyAxMF8wMDBuOyAvLyAxMDBucyAtPiBtc1xuXG4gIHJldHVybiBOdW1iZXIodW5peE1pbGxpc2Vjb25kcyk7XG59XG5cbmZ1bmN0aW9uIHVuc2FmZV9nZXRVbml4TWlsbGlzZWNvbmRzRnJvbVV1aWRWNyhieXRlczogVWludDhBcnJheSk6IG51bWJlciB7XG4gIC8vIGh0dHBzOi8vd3d3LmlldGYub3JnL2FyY2hpdmUvaWQvZHJhZnQtcGVhYm9keS1kaXNwYXRjaC1uZXctdXVpZC1mb3JtYXQtMDQuaHRtbF9uYW1lLXV1aWQtdmVyc2lvbi03XG4gIC8vICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzXG4gIC8vICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDFcbiAgLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLStcbiAgLy8gfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXhfdHNfbXMgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLStcbiAgLy8gfCAgICAgICAgICB1bml4X3RzX21zICAgICAgICAgICB8ICB2ZXIgIHwgICAgICAgcmFuZF9hICAgICAgICAgIHxcbiAgLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLStcbiAgLy8gfHZhcnwgICAgICAgICAgICAgICAgICAgICAgICByYW5kX2IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLStcbiAgLy8gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kX2IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLStcbiAgY29uc3QgaGV4ID0gXCIweFwiXG4gICAgLy8gWFhYWFhYWFgtX19fXy03X19fLV9fX18tX19fX19fX19fX19fXG4gICAgKyBCWVRFX1RPX0hFWFtieXRlc1swXSFdXG4gICAgKyBCWVRFX1RPX0hFWFtieXRlc1sxXSFdXG4gICAgKyBCWVRFX1RPX0hFWFtieXRlc1syXSFdXG4gICAgKyBCWVRFX1RPX0hFWFtieXRlc1szXSFdXG4gICAgLy8gX19fX19fX18tWFhYWC03X19fLV9fX18tX19fX19fX19fX19fXG4gICAgKyBCWVRFX1RPX0hFWFtieXRlc1s0XSFdXG4gICAgKyBCWVRFX1RPX0hFWFtieXRlc1s1XSFdO1xuICBjb25zdCB1bml4TWlsbGlzZWNvbmRzID0gcGFyc2VJbnQoaGV4KTtcblxuICByZXR1cm4gdW5peE1pbGxpc2Vjb25kcztcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxpQ0FHTztBQUNQLG9CQUErQztBQUMvQyxrQkFBNkI7QUE0QjdCLElBQU0sY0FBOEIsc0JBQU07QUFBQSxFQUN4QyxFQUFFLFFBQVEsSUFBSTtBQUFBLEVBQ2QsQ0FBQyxHQUFHLE9BQU8sSUFBSSxLQUFPLFNBQVMsRUFBRSxFQUFFLE1BQU0sQ0FBQztBQUM1QztBQW1CQSxJQUFNLGVBQStCLHNCQUFNO0FBQUEsRUFDekMsRUFBRSxRQUFRLEdBQUc7QUFBQSxFQUNiLENBQUMsR0FBRyxNQUFNLE1BQU0sS0FBSyxFQUFFLFFBQVEsR0FBRyxHQUFHLENBQUNBLElBQUcsTUFBTSxJQUFJLEtBQUssQ0FBQztBQUMzRDtBQUVBLFNBQVMsWUFBWSxNQUEwQjtBQVM3QyxNQUFJLEtBQUssV0FBVyxJQUFJO0FBQ3RCLFVBQU0sSUFBSSxnQ0FBa0IsZ0JBQWdCLElBQUk7QUFBQSxFQUNsRDtBQUVBLFFBQU0sUUFBUSxJQUFJLFdBQVcsRUFBRTtBQUUvQixXQUFTLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksSUFBSSxLQUFLO0FBQ3hDLFNBQUssSUFBSSxLQUFLLFdBQVcsQ0FBQyxPQUFPLElBQWM7QUFDN0MsVUFBSSxLQUFLLFdBQVcsRUFBRSxDQUFDO0FBQ3ZCLFVBQUksSUFBSSxLQUFNLElBQUksS0FBTyxJQUFJLEtBQU0sSUFBSSxLQUFPLElBQUk7QUFDbEQs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