UNPKG

@tai-kun/surrealdb

Version:

The SurrealDB SDK for JavaScript

213 lines (211 loc) 46.2 kB
"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; 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 __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/clients/standard/client.ts var client_exports = {}; __export(client_exports, { default: () => Client }); module.exports = __toCommonJS(client_exports); var import_basic_client = __toESM(require("../basic/index.cjs"), 1); var import_errors = require("../../errors/index.cjs"); var import_utils = require("../../utils/index.cjs"); var import_jwt = __toESM(require("./jwt.cjs"), 1); var _Client = class _Client extends import_basic_client.default { async ping(options) { await this.rpc("ping", [], options); } async use(...args) { let namespace; let database; let options; if (typeof args[0] === "string" || args[0] == null) { const [ns, arg1, arg2] = args; const [db, opts] = typeof arg1 === "string" || arg1 == null ? [arg1, arg2] : [void 0, arg2]; namespace = ns; database = db; options = opts; } else if (Array.isArray(args[0])) { const [[ns, db], opts] = args; namespace = ns; database = db; options = opts; } else if ("ns" in args[0] || "db" in args[0]) { const [{ ns, db }, opts] = args; namespace = ns; database = db; options = opts; } else if ("namespace" in args[0] || "database" in args[0]) { const [{ namespace: ns, database: db }, opts] = args; namespace = ns; database = db; options = opts; } await this.rpc("use", [namespace, database], options); } async info(options) { return await this.rpc("info", [], options); } /** * [API Reference](https://tai-kun.github.io/surrealdb.js/v2/guides/connecting/#signup) */ async signup(auth, options) { return new import_jwt.default(await this.rpc("signup", [auth], options)); } /** * [API Reference](https://tai-kun.github.io/surrealdb.js/v2/guides/connecting/#signin) */ async signin(auth, options) { return new import_jwt.default(await this.rpc("signin", [auth], options)); } /** * [API Reference](https://tai-kun.github.io/surrealdb.js/v2/guides/connecting/#authenticate) */ async authenticate(token, options) { if (typeof token !== "string") { token = token.raw; } await this.rpc("authenticate", [token], options); } /** * [API Reference](https://tai-kun.github.io/surrealdb.js/v2/guides/connecting/#invalidate) */ async invalidate(options) { await this.rpc("invalidate", [], options); } // TODO(tai-kun): バッファリングオプションを追加 async live(table, options = {}) { const { diff, ...rest } = options; const queryUuid = await this.rpc("live", [table, diff], rest); return queryUuid; } subscribe(queryUuid, callback) { this.ee.on(`live_${queryUuid}`, callback); } unsubscribe(queryUuid, callback) { this.ee.off(`live_${queryUuid}`, callback); } async kill(queryUuid, options) { if (Array.isArray(queryUuid)) { await Promise.all(queryUuid.map(async (uuid) => { await this.kill(uuid, options); })); } else { this.ee.off(`live_${queryUuid}`); await this.rpc("kill", [queryUuid], options); } } /** * [API Reference](https://tai-kun.github.io/surrealdb.js/v2/guides/querying/#queryraw) */ async queryRaw(surql, vars, options) { const results = await this.rpc( "query", [surql, vars], options ); return results; } async query(surql, vars, options) { const results = await this.queryRaw(surql, vars, options); const output = []; const errors = []; for (const result of results) { if (result.status === "OK") { output.push(result.result); } else { errors.push(result.result); } } if (errors.length > 0) { throw new import_errors.QueryFailedError(errors); } if (typeof surql === "string") { return output; } return surql._trans(surql._parse(output)); } async let(name, value, options) { await this.rpc("let", [name, value], options); } async unset(name, options) { await this.rpc("unset", [name], options); } async select(target, options) { return await this.rpc("select", [target], options); } async create(target, data, options) { return await this.rpc("create", [target, data], options); } async insert(...args) { const [table, data, options] = (0, import_utils.isTable)(args[0]) || typeof args[0] === "string" || typeof args[0] == null ? args : [null, args[0], args[1]]; return await this.rpc("insert", [table, data], options); } async insert_relation(...args) { const [table, data, options] = (0, import_utils.isTable)(args[0]) || typeof args[0] === "string" || typeof args[0] == null ? args : [null, args[0], args[1]]; return await this.rpc("insert_relation", [table, data], options); } async update(target, data, options) { return await this.rpc("update", [target, data], options); } async upsert(target, data, options) { return await this.rpc("upsert", [target, data], options); } async merge(target, data, options) { return await this.rpc("merge", [target, data], options); } async patch(target, patches, options) { const { diff, ...rest } = options || {}; return await this.rpc("patch", [target, patches, diff], rest); } async delete(target, options) { return await this.rpc("delete", [target], options); } async version(options) { return await this.rpc("version", [], options); } async run(funcName, arg1, arg2) { const [args, opts] = Array.isArray(arg1) || arg1 === void 0 ? [arg1, arg2] : [, arg1]; const { version, ...rest } = opts || {}; return await this.rpc("run", [funcName, version, args], rest); } /** * @experimental */ async graphql(query, options = {}) { const { signal, ...gqlOptions } = options; return await this.rpc("graphql", [query, gqlOptions], { signal }); } async relate(from, thing, to, data, options) { return await this.rpc("relate", [from, thing, to, data], options); } }; __name(_Client, "Client"); var Client = _Client; //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NsaWVudHMvc3RhbmRhcmQvY2xpZW50LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgQmFzZSwgeyB0eXBlIENsaWVudFJwY09wdGlvbnMgfSBmcm9tIFwiQHRhaS1rdW4vc3VycmVhbGRiL2Jhc2ljLWNsaWVudFwiO1xuaW1wb3J0IHsgUXVlcnlGYWlsZWRFcnJvciB9IGZyb20gXCJAdGFpLWt1bi9zdXJyZWFsZGIvZXJyb3JzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEF1dGgsXG4gIExpdmVQYXlsb2FkLFxuICBQYXRjaCxcbiAgUHJlcGFyZWRRdWVyeUxpa2UsXG4gIFF1ZXJ5UmVzdWx0LFxuICBSZWFkb25seVBhdGNoLFxuICBSZWNvcmRBY2Nlc3NBdXRoLFxuICBScGNHcmFwaHFsUmVxdWVzdCxcbiAgUnBjUmVzdWx0TWFwcGluZyxcbiAgU2xvdExpa2UsXG59IGZyb20gXCJAdGFpLWt1bi9zdXJyZWFsZGIvdHlwZXNcIjtcbmltcG9ydCB7IGlzVGFibGUsIHR5cGUgVGFza0xpc3RlbmVyIH0gZnJvbSBcIkB0YWkta3VuL3N1cnJlYWxkYi91dGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBTaW1wbGlmeSwgVW5pb25Ub0ludGVyc2VjdGlvbiB9IGZyb20gXCJ0eXBlLWZlc3RcIjtcbmltcG9ydCB0eXBlIHsgRGF0YVR5cGUgfSBmcm9tIFwiLi4vLi4vc3VycmVhbC9kYXRhLXR5cGVzXCI7XG5pbXBvcnQgSnd0IGZyb20gXCIuL2p3dFwiO1xuXG4vLyByZS1leHBvcnRzXG5leHBvcnQgdHlwZSAqIGZyb20gXCJAdGFpLWt1bi9zdXJyZWFsZGIvYmFzaWMtY2xpZW50XCI7XG5cbnR5cGUgT3ZlcnJpZGU8VCwgVT4gPSBTaW1wbGlmeTxPbWl0PFQsIGtleW9mIFU+ICYgVT47XG5cbmV4cG9ydCB0eXBlIEluZmVyU2xvdFZhcnM8VFNsb3QgZXh0ZW5kcyBTbG90TGlrZT4gPSBVbmlvblRvSW50ZXJzZWN0aW9uPFxuICAvLyBkcHJpbnQtaWdub3JlXG4gIHtcbiAgICBbVE5hbWUgaW4gVFNsb3RbXCJuYW1lXCJdXTpcbiAgICAgIFRTbG90IGV4dGVuZHMgU2xvdExpa2U8VE5hbWUsIGluZmVyIFRSZXF1aXJlZCwgaW5mZXIgVFZhbHVlPlxuICAgICAgICA/IFRSZXF1aXJlZCBleHRlbmRzIGZhbHNlXG4gICAgICAgID8geyByZWFkb25seSBbXyBpbiBUTmFtZV0/OiBUVmFsdWUgfVxuICAgICAgICA6IHsgcmVhZG9ubHkgW18gaW4gVE5hbWVdOiAgVFZhbHVlIH0gLy8gYm9vbGVhbiBcdTMwNkVcdTU4MzRcdTU0MDhcdTMwODJcdTVGQzVcdTk4MDhcdTMwNjdcdTMwMDJcbiAgICAgICAgOiBuZXZlcjtcbiAgfVtUU2xvdFtcIm5hbWVcIl1dXG4+O1xuXG5leHBvcnQgaW50ZXJmYWNlIExpdmVPcHRpb25zIGV4dGVuZHMgQ2xpZW50UnBjT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGRpZmY/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgdHlwZSBMaXZlSGFuZGxlcjxUUGF5bG9hZCBleHRlbmRzIExpdmVQYXlsb2FkPGFueSwgYW55PiA9IExpdmVQYXlsb2FkPiA9XG4gIFRhc2tMaXN0ZW5lcjxbcGF5bG9hZDogVFBheWxvYWRdPjtcblxuZXhwb3J0IHR5cGUgSW5mZXJMaXZlUGF5bG9hZDxcbiAgVFV1aWQsXG4gIFREYXRhIGV4dGVuZHMgUmVhZG9ubHk8UmVjb3JkRGF0YT4gPSBSZWNvcmREYXRhLFxuICBUUGF0Y2ggZXh0ZW5kcyBQYXRjaFtdID0gUGF0Y2hbXSxcbj4gPSBUVXVpZCBleHRlbmRzIHsgX19kaWZmOiBmYWxzZSB9XG4gID8gTGl2ZVBheWxvYWQuRGF0YTxURGF0YSwgRGF0YVR5cGUuVGhpbmcgfCBzdHJpbmc+XG4gIDogVFV1aWQgZXh0ZW5kcyB7IF9fZGlmZjogdHJ1ZSB9XG4gICAgPyBMaXZlUGF5bG9hZC5EaWZmPFREYXRhLCBUUGF0Y2gsIERhdGFUeXBlLlRoaW5nIHwgc3RyaW5nPlxuICA6IExpdmVQYXlsb2FkPFREYXRhLCBUUGF0Y2g+O1xuXG5leHBvcnQgdHlwZSBBY3Rpb25SZXN1bHQ8XG4gIFREYXRhIGV4dGVuZHMgUmVhZG9ubHk8UmVjb3JkRGF0YT4gPSBSZWNvcmREYXRhLFxuPiA9IFtFeHRyYWN0PGtleW9mIFREYXRhLCBcImlkXCI+XSBleHRlbmRzIFtuZXZlcl1cbiAgPyAoeyBpZDogRGF0YVR5cGUuVGhpbmcgfCBzdHJpbmcgfSAmIFREYXRhKVxuICA6IFREYXRhO1xuXG50eXBlIF9JbjxUPiA9IFtFeHRyYWN0PGtleW9mIFQsIFwiaW5cIj5dIGV4dGVuZHMgW25ldmVyXVxuICA/ICh7IGluOiBEYXRhVHlwZS5UaGluZyB8IHN0cmluZyB9ICYgVClcbiAgOiBUO1xuXG50eXBlIF9PdXQ8VD4gPSBbRXh0cmFjdDxrZXlvZiBULCBcIm91dFwiPl0gZXh0ZW5kcyBbbmV2ZXJdXG4gID8gKHsgb3V0OiBEYXRhVHlwZS5UaGluZyB8IHN0cmluZyB9ICYgVClcbiAgOiBUO1xuXG5leHBvcnQgdHlwZSBSZWxhdGVSZXN1bHQ8XG4gIFREYXRhIGV4dGVuZHMgUmVhZG9ubHk8UmVjb3JkRGF0YT4gPSBSZWNvcmREYXRhLFxuPiA9IEFjdGlvblJlc3VsdDxfSW48X091dDxURGF0YT4+PjtcblxuZXhwb3J0IGludGVyZmFjZSBQYXRjaE9wdGlvbnMgZXh0ZW5kcyBDbGllbnRScGNPcHRpb25zIHtcbiAgcmVhZG9ubHkgZGlmZj86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVuT3B0aW9ucyBleHRlbmRzIENsaWVudFJwY09wdGlvbnMge1xuICByZWFkb25seSB2ZXJzaW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdyYXBocWxPcHRpb25zXG4gIGV4dGVuZHMgQ2xpZW50UnBjT3B0aW9ucywgTm9uTnVsbGFibGU8UnBjR3JhcGhxbFJlcXVlc3RbXCJwYXJhbXNcIl1bMV0+XG57fVxuXG50eXBlIFJlY29yZERhdGEgPSB7XG4gIFtwOiBzdHJpbmddOiB1bmtub3duO1xufTtcblxuLy8gREVGSU5FIFRBQkxFIC4uLiBUWVBFIE5PUk1BTFxudHlwZSBOb3JtYWxSZWNvcmQgPSB7XG4gIGlkOiBEYXRhVHlwZS5UaGluZyB8IHN0cmluZztcbiAgLy8gUmVjb3JkRGF0YVxuICBbcDogc3RyaW5nXTogdW5rbm93bjtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENsaWVudCBleHRlbmRzIEJhc2Uge1xuICBhc3luYyBwaW5nKG9wdGlvbnM/OiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5ycGMoXCJwaW5nXCIsIFtdLCBvcHRpb25zKTtcbiAgfVxuXG4gIGFzeW5jIHVzZShcbiAgICBuczogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTx2b2lkPjtcblxuICBhc3luYyB1c2UoXG4gICAgbnM6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsXG4gICAgZGI/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM/OiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPHZvaWQ+O1xuXG4gIGFzeW5jIHVzZShcbiAgICB0YXJnZXQ6IFtuczogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgZGI/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkXSxcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTx2b2lkPjtcblxuICBhc3luYyB1c2UoXG4gICAgdGFyZ2V0OiB7XG4gICAgICByZWFkb25seSBucz86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG4gICAgICByZWFkb25seSBkYj86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG4gICAgfSxcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTx2b2lkPjtcblxuICBhc3luYyB1c2UoXG4gICAgdGFyZ2V0OiB7XG4gICAgICByZWFkb25seSBuYW1lc3BhY2U/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgICAgcmVhZG9ubHkgZGF0YWJhc2U/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgIH0sXG4gICAgb3B0aW9ucz86IENsaWVudFJwY09wdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IFByb21pc2U8dm9pZD47XG5cbiAgYXN5bmMgdXNlKFxuICAgIC4uLmFyZ3M6XG4gICAgICB8IFtcbiAgICAgICAgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgICAgICAgKENsaWVudFJwY09wdGlvbnMgfCB1bmRlZmluZWQpPyxcbiAgICAgIF1cbiAgICAgIHwgW1xuICAgICAgICBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxuICAgICAgICAoc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk/LFxuICAgICAgICAoQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCk/LFxuICAgICAgXVxuICAgICAgfCBbXG4gICAgICAgIFtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCAoc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk/XSxcbiAgICAgICAgKENsaWVudFJwY09wdGlvbnMgfCB1bmRlZmluZWQpPyxcbiAgICAgIF1cbiAgICAgIHwgW1xuICAgICAgICB7XG4gICAgICAgICAgcmVhZG9ubHkgbnM/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIHJlYWRvbmx5IGRiPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgICAgICAgfSxcbiAgICAgICAgKENsaWVudFJwY09wdGlvbnMgfCB1bmRlZmluZWQpPyxcbiAgICAgIF1cbiAgICAgIHwgW1xuICAgICAgICB7XG4gICAgICAgICAgcmVhZG9ubHkgbmFtZXNwYWNlPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgICAgICAgICByZWFkb25seSBkYXRhYmFzZT86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIChDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkKT8sXG4gICAgICBdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBuYW1lc3BhY2U6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGRhdGFiYXNlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgIGxldCBvcHRpb25zOiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKHR5cGVvZiBhcmdzWzBdID09PSBcInN0cmluZ1wiIHx8IGFyZ3NbMF0gPT0gbnVsbCkge1xuICAgICAgY29uc3QgW25zLCBhcmcxLCBhcmcyXSA9IGFyZ3M7XG4gICAgICBjb25zdCBbZGIsIG9wdHNdID0gdHlwZW9mIGFyZzEgPT09IFwic3RyaW5nXCIgfHwgYXJnMSA9PSBudWxsXG4gICAgICAgID8gW2FyZzEsIGFyZzJdXG4gICAgICAgIDogW3VuZGVmaW5lZCwgYXJnMl07XG4gICAgICBuYW1lc3BhY2UgPSBucztcbiAgICAgIGRhdGFiYXNlID0gZGI7XG4gICAgICBvcHRpb25zID0gb3B0cztcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoYXJnc1swXSkpIHtcbiAgICAgIGNvbnN0IFtbbnMsIGRiXSwgb3B0c10gPSBhcmdzO1xuICAgICAgbmFtZXNwYWNlID0gbnM7XG4gICAgICBkYXRhYmFzZSA9IGRiO1xuICAgICAgb3B0aW9ucyA9IG9wdHMgYXMgQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKFwibnNcIiBpbiBhcmdzWzBdIHx8IFwiZGJcIiBpbiBhcmdzWzBdKSB7XG4gICAgICBjb25zdCBbeyBucywgZGIgfSwgb3B0c10gPSBhcmdzO1xuICAgICAgbmFtZXNwYWNlID0gbnM7XG4gICAgICBkYXRhYmFzZSA9IGRiO1xuICAgICAgb3B0aW9ucyA9IG9wdHMgYXMgQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKFwibmFtZXNwYWNlXCIgaW4gYXJnc1swXSB8fCBcImRhdGFiYXNlXCIgaW4gYXJnc1swXSkge1xuICAgICAgY29uc3QgW3sgbmFtZXNwYWNlOiBucywgZGF0YWJhc2U6IGRiIH0sIG9wdHNdID0gYXJncztcbiAgICAgIG5hbWVzcGFjZSA9IG5zO1xuICAgICAgZGF0YWJhc2UgPSBkYjtcbiAgICAgIG9wdGlvbnMgPSBvcHRzIGFzIENsaWVudFJwY09wdGlvbnMgfCB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5ycGMoXCJ1c2VcIiwgW25hbWVzcGFjZSwgZGF0YWJhc2VdLCBvcHRpb25zKTtcbiAgfVxuXG4gIGFzeW5jIGluZm88VCBleHRlbmRzIFJwY1Jlc3VsdE1hcHBpbmdbXCJpbmZvXCJdID0gUnBjUmVzdWx0TWFwcGluZ1tcImluZm9cIl0+KFxuICAgIG9wdGlvbnM/OiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5ycGMoXCJpbmZvXCIsIFtdLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBbQVBJIFJlZmVyZW5jZV0oaHR0cHM6Ly90YWkta3VuLmdpdGh1Yi5pby9zdXJyZWFsZGIuanMvdjIvZ3VpZGVzL2Nvbm5lY3RpbmcvI3NpZ251cClcbiAgICovXG4gIGFzeW5jIHNpZ251cChcbiAgICBhdXRoOiBSZWNvcmRBY2Nlc3NBdXRoLFxuICAgIG9wdGlvbnM/OiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPEp3dD4ge1xuICAgIHJldHVybiBuZXcgSnd0KGF3YWl0IHRoaXMucnBjKFwic2lnbnVwXCIsIFthdXRoXSwgb3B0aW9ucykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFtBUEkgUmVmZXJlbmNlXShodHRwczovL3RhaS1rdW4uZ2l0aHViLmlvL3N1cnJlYWxkYi5qcy92Mi9ndWlkZXMvY29ubmVjdGluZy8jc2lnbmluKVxuICAgKi9cbiAgYXN5bmMgc2lnbmluKFxuICAgIGF1dGg6IEF1dGgsXG4gICAgb3B0aW9ucz86IENsaWVudFJwY09wdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IFByb21pc2U8Snd0PiB7XG4gICAgcmV0dXJuIG5ldyBKd3QoYXdhaXQgdGhpcy5ycGMoXCJzaWduaW5cIiwgW2F1dGhdLCBvcHRpb25zKSk7XG4gIH1cblxuICAvKipcbiAgICogW0FQSSBSZWZlcmVuY2VdKGh0dHBzOi8vdGFpLWt1bi5naXRodWIuaW8vc3VycmVhbGRiLmpzL3YyL2d1aWRlcy9jb25uZWN0aW5nLyNhdXRoZW50aWNhdGUpXG4gICAqL1xuICBhc3luYyBhdXRoZW50aWNhdGUoXG4gICAgdG9rZW46IHN0cmluZyB8IEp3dCxcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHR5cGVvZiB0b2tlbiAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgdG9rZW4gPSB0b2tlbi5yYXc7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5ycGMoXCJhdXRoZW50aWNhdGVcIiwgW3Rva2VuXSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogW0FQSSBSZWZlcmVuY2VdKGh0dHBzOi8vdGFpLWt1bi5naXRodWIuaW8vc3VycmVhbGRiLmpzL3YyL2d1aWRlcy9jb25uZWN0aW5nLyNpbnZhbGlkYXRlKVxuICAgKi9cbiAgYXN5bmMgaW52YWxpZGF0ZShcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5ycGMoXCJpbnZhbGlkYXRlXCIsIFtdLCBvcHRpb25zKTtcbiAgfVxuXG4gIGFzeW5jIGxpdmU8VCBleHRlbmRzIERhdGFUeXBlLlV1aWQgfCBzdHJpbmcgPSBEYXRhVHlwZS5VdWlkIHwgc3RyaW5nPihcbiAgICB0YWJsZTogRGF0YVR5cGUuVGFibGUgfCBzdHJpbmcsXG4gICAgb3B0aW9uczogQ2xpZW50UnBjT3B0aW9ucyAmIHsgcmVhZG9ubHkgZGlmZjogdHJ1ZSB9LFxuICApOiBQcm9taXNlPFQgJiB7IF9fZGlmZjogdHJ1ZSB9PjtcblxuICBhc3luYyBsaXZlPFQgZXh0ZW5kcyBEYXRhVHlwZS5VdWlkIHwgc3RyaW5nID0gRGF0YVR5cGUuVXVpZCB8IHN0cmluZz4oXG4gICAgdGFibGU6IERhdGFUeXBlLlRhYmxlIHwgc3RyaW5nLFxuICAgIG9wdGlvbnM/OlxuICAgICAgfCAoQ2xpZW50UnBjT3B0aW9ucyAmIHsgcmVhZG9ubHkgZGlmZj86IGZhbHNlIHwgdW5kZWZpbmVkIH0pXG4gICAgICB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTxUICYgeyBfX2RpZmY6IGZhbHNlIH0+O1xuXG4gIGFzeW5jIGxpdmU8VCBleHRlbmRzIERhdGFUeXBlLlV1aWQgfCBzdHJpbmcgPSBEYXRhVHlwZS5VdWlkIHwgc3RyaW5nPihcbiAgICB0YWJsZTogRGF0YVR5cGUuVGFibGUgfCBzdHJpbmcsXG4gICAgb3B0aW9ucz86IExpdmVPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPFQgJiB7IF9fZGlmZjogYm9vbGVhbiB9PjtcblxuICAvLyBUT0RPKHRhaS1rdW4pOiBcdTMwRDBcdTMwQzNcdTMwRDVcdTMwQTFcdTMwRUFcdTMwRjNcdTMwQjBcdTMwQUFcdTMwRDdcdTMwQjdcdTMwRTdcdTMwRjNcdTMwOTJcdThGRkRcdTUyQTBcbiAgYXN5bmMgbGl2ZShcbiAgICB0YWJsZTogRGF0YVR5cGUuVGFibGUgfCBzdHJpbmcsXG4gICAgb3B0aW9uczogTGl2ZU9wdGlvbnMgfCB1bmRlZmluZWQgPSB7fSxcbiAgKSB7XG4gICAgY29uc3QgeyBkaWZmLCAuLi5yZXN0IH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHF1ZXJ5VXVpZCA9IGF3YWl0IHRoaXMucnBjKFwibGl2ZVwiLCBbdGFibGUsIGRpZmZdLCByZXN0KTtcblxuICAgIHJldHVybiBxdWVyeVV1aWQ7XG4gIH1cblxuICBzdWJzY3JpYmU8XG4gICAgVFV1aWQsXG4gICAgVFBheWxvYWQgZXh0ZW5kcyBMaXZlUGF5bG9hZDxhbnksIGFueT4gPSBJbmZlckxpdmVQYXlsb2FkPFRVdWlkPixcbiAgPihcbiAgICBxdWVyeVV1aWQ6IFRVdWlkLFxuICAgIGNhbGxiYWNrOiBMaXZlSGFuZGxlcjxUUGF5bG9hZD4sXG4gICk6IHZvaWQge1xuICAgIHRoaXMuZWUub24oYGxpdmVfJHtxdWVyeVV1aWR9YCwgY2FsbGJhY2sgYXMgTGl2ZUhhbmRsZXI8YW55Pik7XG4gIH1cblxuICB1bnN1YnNjcmliZShcbiAgICBxdWVyeVV1aWQ6IERhdGFUeXBlLlV1aWQgfCBzdHJpbmcsXG4gICAgY2FsbGJhY2s6IExpdmVIYW5kbGVyPGFueT4sXG4gICk6IHZvaWQge1xuICAgIHRoaXMuZWUub2ZmKGBsaXZlXyR7cXVlcnlVdWlkfWAsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIGFzeW5jIGtpbGwoXG4gICAgcXVlcnlVdWlkOiBEYXRhVHlwZS5VdWlkIHwgc3RyaW5nIHwgcmVhZG9ubHkgKERhdGFUeXBlLlV1aWQgfCBzdHJpbmcpW10sXG4gICAgb3B0aW9ucz86IENsaWVudFJwY09wdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHF1ZXJ5VXVpZCkpIHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHF1ZXJ5VXVpZC5tYXAoYXN5bmMgdXVpZCA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMua2lsbCh1dWlkLCBvcHRpb25zKTtcbiAgICAgIH0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lZS5vZmYoYGxpdmVfJHtxdWVyeVV1aWR9YCk7XG4gICAgICBhd2FpdCB0aGlzLnJwYyhcImtpbGxcIiwgW3F1ZXJ5VXVpZF0sIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBbQVBJIFJlZmVyZW5jZV0oaHR0cHM6Ly90YWkta3VuLmdpdGh1Yi5pby9zdXJyZWFsZGIuanMvdjIvZ3VpZGVzL3F1ZXJ5aW5nLyNxdWVyeXJhdylcbiAgICovXG4gIGFzeW5jIHF1ZXJ5UmF3PFRSZXN1bHRzIGV4dGVuZHMgcmVhZG9ubHkgUXVlcnlSZXN1bHRbXSA9IFF1ZXJ5UmVzdWx0W10+KFxuICAgIHN1cnFsOiBzdHJpbmcgfCBQcmVwYXJlZFF1ZXJ5TGlrZSxcbiAgICB2YXJzPzogUmVhZG9ubHk8UmVjb3JkRGF0YT4gfCB1bmRlZmluZWQsXG4gICAgb3B0aW9ucz86IENsaWVudFJwY09wdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IFByb21pc2U8VFJlc3VsdHM+IHtcbiAgICBjb25zdCByZXN1bHRzOiByZWFkb25seSBRdWVyeVJlc3VsdFtdID0gYXdhaXQgdGhpcy5ycGMoXG4gICAgICBcInF1ZXJ5XCIsXG4gICAgICBbc3VycWwsIHZhcnNdLFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuXG4gICAgcmV0dXJuIHJlc3VsdHMgYXMgVFJlc3VsdHM7XG4gIH1cblxuICAvKipcbiAgICogW0FQSSBSZWZlcmVuY2VdKGh0dHBzOi8vdGFpLWt1bi5naXRodWIuaW8vc3VycmVhbGRiLmpzL3YyL2d1aWRlcy9xdWVyeWluZy8jcXVlcnkpXG4gICAqL1xuICBhc3luYyBxdWVyeTxUUmV0dXJucyBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXSA9IHVua25vd25bXT4oXG4gICAgc3VycWw6IHN0cmluZyxcbiAgICB2YXJzPzogUmVhZG9ubHk8UmVjb3JkRGF0YT4gfCB1bmRlZmluZWQsXG4gICAgb3B0aW9ucz86IENsaWVudFJwY09wdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IFByb21pc2U8VFJldHVybnM+O1xuXG4gIC8qKlxuICAgKiBbQVBJIFJlZmVyZW5jZV0oaHR0cHM6Ly90YWkta3VuLmdpdGh1Yi5pby9zdXJyZWFsZGIuanMvdjIvZ3VpZGVzL3F1ZXJ5aW5nLyNxdWVyeSlcbiAgICovXG4gIGFzeW5jIHF1ZXJ5PFRSZXN1bHQ+KFxuICAgIHN1cnFsOiBPdmVycmlkZTxQcmVwYXJlZFF1ZXJ5TGlrZSwge1xuICAgICAgcmVhZG9ubHkgc2xvdHM6IHJlYWRvbmx5IFNsb3RMaWtlPGFueSwgZmFsc2UsIGFueT5bXTtcbiAgICAgIHJlYWRvbmx5IF9fdHlwZTogVFJlc3VsdDtcbiAgICB9PixcbiAgICB2YXJzPzogUmVhZG9ubHk8UmVjb3JkRGF0YT4gfCB1bmRlZmluZWQsXG4gICAgb3B0aW9ucz86IENsaWVudFJwY09wdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IFByb21pc2U8VFJlc3VsdD47XG5cbiAgLyoqXG4gICAqIFtBUEkgUmVmZXJlbmNlXShodHRwczovL3RhaS1rdW4uZ2l0aHViLmlvL3N1cnJlYWxkYi5qcy92Mi9ndWlkZXMvcXVlcnlpbmcvI3F1ZXJ5KVxuICAgKi9cbiAgYXN5bmMgcXVlcnk8VFNsb3QgZXh0ZW5kcyBTbG90TGlrZSwgVFJlc3VsdD4oXG4gICAgc3VycWw6IE92ZXJyaWRlPFByZXBhcmVkUXVlcnlMaWtlLCB7XG4gICAgICByZWFkb25seSBzbG90czogcmVhZG9ubHkgVFNsb3RbXTtcbiAgICAgIHJlYWRvbmx5IF9fdHlwZTogVFJlc3VsdDtcbiAgICB9PixcbiAgICB2YXJzOiBTaW1wbGlmeTxJbmZlclNsb3RWYXJzPFRTbG90Pj4gJiBSZWFkb25seTxSZWNvcmREYXRhPixcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTxUUmVzdWx0PjtcblxuICBhc3luYyBxdWVyeShcbiAgICBzdXJxbDogc3RyaW5nIHwgUHJlcGFyZWRRdWVyeUxpa2UsXG4gICAgdmFycz86IFJlYWRvbmx5PFJlY29yZERhdGE+IHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM/OiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5xdWVyeVJhdyhzdXJxbCwgdmFycywgb3B0aW9ucyk7XG4gICAgY29uc3Qgb3V0cHV0OiB1bmtub3duW10gPSBbXTtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJPS1wiKSB7XG4gICAgICAgIG91dHB1dC5wdXNoKHJlc3VsdC5yZXN1bHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3JzLnB1c2gocmVzdWx0LnJlc3VsdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgUXVlcnlGYWlsZWRFcnJvcihlcnJvcnMpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygc3VycWwgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cnFsLl90cmFucyhzdXJxbC5fcGFyc2Uob3V0cHV0KSk7XG4gIH1cblxuICBhc3luYyBsZXQoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnJwYyhcImxldFwiLCBbbmFtZSwgdmFsdWVdLCBvcHRpb25zKTtcbiAgfVxuXG4gIGFzeW5jIHVuc2V0KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5ycGMoXCJ1bnNldFwiLCBbbmFtZV0sIG9wdGlvbnMpO1xuICB9XG5cbiAgYXN5bmMgc2VsZWN0PFxuICAgIFRSZXN1bHQgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmREYXRhPiA9IFJlY29yZERhdGEsXG4gID4oXG4gICAgdGFibGU6IERhdGFUeXBlLlRhYmxlIHwgc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPEFjdGlvblJlc3VsdDxUUmVzdWx0PltdPjtcblxuICBhc3luYyBzZWxlY3Q8XG4gICAgVFJlc3VsdCBleHRlbmRzIFJlYWRvbmx5PFJlY29yZERhdGE+ID0gUmVjb3JkRGF0YSxcbiAgPihcbiAgICB0aGluZzogRGF0YVR5cGUuVGhpbmcsXG4gICAgb3B0aW9ucz86IENsaWVudFJwY09wdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IFByb21pc2U8QWN0aW9uUmVzdWx0PFRSZXN1bHQ+PjtcblxuICBhc3luYyBzZWxlY3QoXG4gICAgdGFyZ2V0OlxuICAgICAgfCAoRGF0YVR5cGUuVGFibGUgfCBzdHJpbmcpXG4gICAgICB8IERhdGFUeXBlLlRoaW5nLFxuICAgIG9wdGlvbnM/OiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5ycGMoXCJzZWxlY3RcIiwgW3RhcmdldF0sIG9wdGlvbnMpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlPFxuICAgIFRSZXN1bHQgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmREYXRhPiA9IFJlY29yZERhdGEsXG4gICAgVERhdGEgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmREYXRhPiA9IFRSZXN1bHQsXG4gID4oXG4gICAgdGFibGU6IERhdGFUeXBlLlRhYmxlIHwgc3RyaW5nLFxuICAgIGRhdGE/OiBURGF0YSB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTxBY3Rpb25SZXN1bHQ8VFJlc3VsdD4+O1xuXG4gIGFzeW5jIGNyZWF0ZTxcbiAgICBUUmVzdWx0IGV4dGVuZHMgUmVhZG9ubHk8UmVjb3JkRGF0YT4gPSBSZWNvcmREYXRhLFxuICAgIFREYXRhIGV4dGVuZHMgUmVhZG9ubHk8UmVjb3JkRGF0YT4gPSBUUmVzdWx0LFxuICA+KFxuICAgIHRoaW5nOiBEYXRhVHlwZS5UaGluZyxcbiAgICBkYXRhPzogVERhdGEgfCB1bmRlZmluZWQsXG4gICAgb3B0aW9ucz86IENsaWVudFJwY09wdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IFByb21pc2U8QWN0aW9uUmVzdWx0PFRSZXN1bHQ+PjtcblxuICBhc3luYyBjcmVhdGUoXG4gICAgdGFyZ2V0OlxuICAgICAgfCAoRGF0YVR5cGUuVGFibGUgfCBzdHJpbmcpXG4gICAgICB8IERhdGFUeXBlLlRoaW5nLFxuICAgIGRhdGE/OiBSZWFkb25seTxSZWNvcmREYXRhPiB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucnBjKFwiY3JlYXRlXCIsIFt0YXJnZXQsIGRhdGFdLCBvcHRpb25zKTtcbiAgfVxuXG4gIGFzeW5jIGluc2VydDxcbiAgICBUUmVzdWx0IGV4dGVuZHMgUmVhZG9ubHk8UmVjb3JkRGF0YT4gPSBSZWNvcmREYXRhLFxuICAgIFREYXRhIGV4dGVuZHMgUmVhZG9ubHk8UmVjb3JkRGF0YT4gPSBUUmVzdWx0LFxuICA+KFxuICAgIHRhYmxlOiBEYXRhVHlwZS5UYWJsZSB8IHN0cmluZyxcbiAgICBkYXRhPzogVERhdGEgfCByZWFkb25seSBURGF0YVtdIHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM/OiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPEFjdGlvblJlc3VsdDxUUmVzdWx0PltdPjtcblxuICBhc3luYyBpbnNlcnQ8XG4gICAgVFJlc3VsdCBleHRlbmRzIFJlYWRvbmx5PFJlY29yZERhdGE+ID0gUmVjb3JkRGF0YSxcbiAgICBURGF0YSBleHRlbmRzIFJlYWRvbmx5PE5vcm1hbFJlY29yZD4gPSAoXG4gICAgICBUUmVzdWx0IGV4dGVuZHMgeyByZWFkb25seSBpZDogYW55IH0gPyBUUmVzdWx0XG4gICAgICAgIDogKHsgaWQ6IERhdGFUeXBlLlRoaW5nIHwgc3RyaW5nIH0gJiBUUmVzdWx0KVxuICAgICksXG4gID4oXG4gICAgdGFibGU6IERhdGFUeXBlLlRhYmxlIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgICBkYXRhPzogVERhdGEgfCByZWFkb25seSBURGF0YVtdIHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM/OiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPEFjdGlvblJlc3VsdDxUUmVzdWx0PltdPjtcblxuICBhc3luYyBpbnNlcnQ8XG4gICAgVFJlc3VsdCBleHRlbmRzIFJlYWRvbmx5PFJlY29yZERhdGE+ID0gUmVjb3JkRGF0YSxcbiAgICBURGF0YSBleHRlbmRzIFJlYWRvbmx5PE5vcm1hbFJlY29yZD4gPSAoXG4gICAgICBUUmVzdWx0IGV4dGVuZHMgeyByZWFkb25seSBpZDogYW55IH0gPyBUUmVzdWx0XG4gICAgICAgIDogKHsgaWQ6IERhdGFUeXBlLlRoaW5nIHwgc3RyaW5nIH0gJiBUUmVzdWx0KVxuICAgICksXG4gID4oXG4gICAgZGF0YTogVERhdGEgfCByZWFkb25seSBURGF0YVtdLFxuICAgIG9wdGlvbnM/OiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPEFjdGlvblJlc3VsdDxUUmVzdWx0PltdPjtcblxuICBhc3luYyBpbnNlcnQoXG4gICAgLi4uYXJnczpcbiAgICAgIHwgW1xuICAgICAgICB0YWJsZTogRGF0YVR5cGUuVGFibGUgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxuICAgICAgICBkYXRhPzpcbiAgICAgICAgICB8IFJlYWRvbmx5PFJlY29yZERhdGE+XG4gICAgICAgICAgfCByZWFkb25seSBSZWFkb25seTxSZWNvcmREYXRhPltdXG4gICAgICAgICAgfCB1bmRlZmluZWQsXG4gICAgICAgIG9wdGlvbnM/OiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkLFxuICAgICAgXVxuICAgICAgfCBbXG4gICAgICAgIGRhdGE6IFJlYWRvbmx5PE5vcm1hbFJlY29yZD4gfCByZWFkb25seSBSZWFkb25seTxOb3JtYWxSZWNvcmQ+W10sXG4gICAgICAgIG9wdGlvbnM/OiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkLFxuICAgICAgXVxuICApIHtcbiAgICBjb25zdCBbdGFibGUsIGRhdGEsIG9wdGlvbnNdOiBbYW55PywgYW55PywgYW55P10gPVxuICAgICAgaXNUYWJsZTxEYXRhVHlwZS5UYWJsZT4oYXJnc1swXSlcbiAgICAgICAgfHwgdHlwZW9mIGFyZ3NbMF0gPT09IFwic3RyaW5nXCJcbiAgICAgICAgfHwgdHlwZW9mIGFyZ3NbMF0gPT0gbnVsbFxuICAgICAgICA/IGFyZ3NcbiAgICAgICAgOiBbbnVsbCwgYXJnc1swXSwgYXJnc1sxXV07XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5ycGMoXCJpbnNlcnRcIiwgW3RhYmxlLCBkYXRhXSwgb3B0aW9ucyk7XG4gIH1cblxuICBhc3luYyBpbnNlcnRfcmVsYXRpb248XG4gICAgVFJlc3VsdCBleHRlbmRzIFJlYWRvbmx5PFJlY29yZERhdGE+ID0gUmVjb3JkRGF0YSxcbiAgICBURGF0YSBleHRlbmRzIFJlYWRvbmx5PFJlY29yZERhdGE+ID0gVFJlc3VsdCxcbiAgPihcbiAgICB0YWJsZTogRGF0YVR5cGUuVGFibGUgfCBzdHJpbmcsXG4gICAgZGF0YT86IFREYXRhIHwgcmVhZG9ubHkgVERhdGFbXSB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTxSZWxhdGVSZXN1bHQ8VFJlc3VsdD5bXT47XG5cbiAgYXN5bmMgaW5zZXJ0X3JlbGF0aW9uPFxuICAgIFRSZXN1bHQgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmREYXRhPiA9IFJlY29yZERhdGEsXG4gICAgVERhdGEgZXh0ZW5kcyBSZWFkb25seTxOb3JtYWxSZWNvcmQ+ID0gKFxuICAgICAgVFJlc3VsdCBleHRlbmRzIHsgcmVhZG9ubHkgaWQ6IGFueSB9ID8gVFJlc3VsdFxuICAgICAgICA6ICh7IGlkOiBEYXRhVHlwZS5UaGluZyB8IHN0cmluZyB9ICYgVFJlc3VsdClcbiAgICApLFxuICA+KFxuICAgIHRhYmxlOiBEYXRhVHlwZS5UYWJsZSB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsXG4gICAgZGF0YT86IFREYXRhIHwgcmVhZG9ubHkgVERhdGFbXSB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTxSZWxhdGVSZXN1bHQ8VFJlc3VsdD5bXT47XG5cbiAgYXN5bmMgaW5zZXJ0X3JlbGF0aW9uPFxuICAgIFRSZXN1bHQgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmREYXRhPiA9IFJlY29yZERhdGEsXG4gICAgVERhdGEgZXh0ZW5kcyBSZWFkb25seTxOb3JtYWxSZWNvcmQ+ID0gKFxuICAgICAgVFJlc3VsdCBleHRlbmRzIHsgcmVhZG9ubHkgaWQ6IGFueSB9ID8gVFJlc3VsdFxuICAgICAgICA6ICh7IGlkOiBEYXRhVHlwZS5UaGluZyB8IHN0cmluZyB9ICYgVFJlc3VsdClcbiAgICApLFxuICA+KFxuICAgIGRhdGE6IFREYXRhIHwgcmVhZG9ubHkgVERhdGFbXSxcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTxSZWxhdGVSZXN1bHQ8VFJlc3VsdD5bXT47XG5cbiAgYXN5bmMgaW5zZXJ0X3JlbGF0aW9uKFxuICAgIC4uLmFyZ3M6XG4gICAgICB8IFtcbiAgICAgICAgdGFibGU6IERhdGFUeXBlLlRhYmxlIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgICAgICAgZGF0YT86XG4gICAgICAgICAgfCBSZWFkb25seTxSZWNvcmREYXRhPlxuICAgICAgICAgIHwgcmVhZG9ubHkgUmVhZG9ubHk8UmVjb3JkRGF0YT5bXVxuICAgICAgICAgIHwgdW5kZWZpbmVkLFxuICAgICAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgICAgIF1cbiAgICAgIHwgW1xuICAgICAgICBkYXRhOiBSZWFkb25seTxOb3JtYWxSZWNvcmQ+IHwgcmVhZG9ubHkgUmVhZG9ubHk8Tm9ybWFsUmVjb3JkPltdLFxuICAgICAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgICAgIF1cbiAgKSB7XG4gICAgY29uc3QgW3RhYmxlLCBkYXRhLCBvcHRpb25zXTogW2FueT8sIGFueT8sIGFueT9dID1cbiAgICAgIGlzVGFibGU8RGF0YVR5cGUuVGFibGU+KGFyZ3NbMF0pXG4gICAgICAgIHx8IHR5cGVvZiBhcmdzWzBdID09PSBcInN0cmluZ1wiXG4gICAgICAgIHx8IHR5cGVvZiBhcmdzWzBdID09IG51bGxcbiAgICAgICAgPyBhcmdzXG4gICAgICAgIDogW251bGwsIGFyZ3NbMF0sIGFyZ3NbMV1dO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucnBjKFwiaW5zZXJ0X3JlbGF0aW9uXCIsIFt0YWJsZSwgZGF0YV0sIG9wdGlvbnMpO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlPFxuICAgIFRSZXN1bHQgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmREYXRhPiA9IFJlY29yZERhdGEsXG4gICAgVERhdGEgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmREYXRhPiA9IFRSZXN1bHQsXG4gID4oXG4gICAgdGFibGU6IERhdGFUeXBlLlRhYmxlIHwgc3RyaW5nLFxuICAgIGRhdGE/OiBURGF0YSB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTxBY3Rpb25SZXN1bHQ8VFJlc3VsdD5bXT47XG5cbiAgYXN5bmMgdXBkYXRlPFxuICAgIFRSZXN1bHQgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmREYXRhPiA9IFJlY29yZERhdGEsXG4gICAgVERhdGEgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmREYXRhPiA9IFRSZXN1bHQsXG4gID4oXG4gICAgdGhpbmc6IERhdGFUeXBlLlRoaW5nLFxuICAgIGRhdGE/OiBURGF0YSB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTxBY3Rpb25SZXN1bHQ8VFJlc3VsdD4+O1xuXG4gIGFzeW5jIHVwZGF0ZShcbiAgICB0YXJnZXQ6XG4gICAgICB8IChEYXRhVHlwZS5UYWJsZSB8IHN0cmluZylcbiAgICAgIHwgRGF0YVR5cGUuVGhpbmcsXG4gICAgZGF0YT86IFJlYWRvbmx5PFJlY29yZERhdGE+IHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM/OiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5ycGMoXCJ1cGRhdGVcIiwgW3RhcmdldCwgZGF0YV0sIG9wdGlvbnMpO1xuICB9XG5cbiAgYXN5bmMgdXBzZXJ0PFxuICAgIFRSZXN1bHQgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmREYXRhPiA9IFJlY29yZERhdGEsXG4gICAgVERhdGEgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmREYXRhPiA9IFRSZXN1bHQsXG4gID4oXG4gICAgdGFibGU6IERhdGFUeXBlLlRhYmxlIHwgc3RyaW5nLFxuICAgIGRhdGE/OiBURGF0YSB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTxBY3Rpb25SZXN1bHQ8VFJlc3VsdD5bXT47XG5cbiAgYXN5bmMgdXBzZXJ0PFxuICAgIFRSZXN1bHQgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmREYXRhPiA9IFJlY29yZERhdGEsXG4gICAgVERhdGEgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmREYXRhPiA9IFRSZXN1bHQsXG4gID4oXG4gICAgdGhpbmc6IERhdGFUeXBlLlRoaW5nLFxuICAgIGRhdGE/OiBURGF0YSB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTxBY3Rpb25SZXN1bHQ8VFJlc3VsdD4+O1xuXG4gIGFzeW5jIHVwc2VydChcbiAgICB0YXJnZXQ6XG4gICAgICB8IChEYXRhVHlwZS5UYWJsZSB8IHN0cmluZylcbiAgICAgIHwgRGF0YVR5cGUuVGhpbmcsXG4gICAgZGF0YT86IFJlYWRvbmx5PFJlY29yZERhdGE+IHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM/OiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5ycGMoXCJ1cHNlcnRcIiwgW3RhcmdldCwgZGF0YV0sIG9wdGlvbnMpO1xuICB9XG5cbiAgYXN5bmMgbWVyZ2U8XG4gICAgVFJlc3VsdCBleHRlbmRzIFJlYWRvbmx5PFJlY29yZERhdGE+ID0gUmVjb3JkRGF0YSxcbiAgICBURGF0YSBleHRlbmRzIFJlYWRvbmx5PFJlY29yZERhdGE+ID0gVFJlc3VsdCxcbiAgPihcbiAgICB0YWJsZTogRGF0YVR5cGUuVGFibGUgfCBzdHJpbmcsXG4gICAgZGF0YTogVERhdGEsXG4gICAgb3B0aW9ucz86IENsaWVudFJwY09wdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IFByb21pc2U8QWN0aW9uUmVzdWx0PFRSZXN1bHQ+W10+O1xuXG4gIGFzeW5jIG1lcmdlPFxuICAgIFRSZXN1bHQgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmREYXRhPiA9IFJlY29yZERhdGEsXG4gICAgVERhdGEgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmREYXRhPiA9IFRSZXN1bHQsXG4gID4oXG4gICAgdGhpbmc6IERhdGFUeXBlLlRoaW5nLFxuICAgIGRhdGE6IFREYXRhLFxuICAgIG9wdGlvbnM/OiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPEFjdGlvblJlc3VsdDxUUmVzdWx0Pj47XG5cbiAgYXN5bmMgbWVyZ2UoXG4gICAgdGFyZ2V0OlxuICAgICAgfCAoRGF0YVR5cGUuVGFibGUgfCBzdHJpbmcpXG4gICAgICB8IERhdGFUeXBlLlRoaW5nLFxuICAgIGRhdGE6IFJlYWRvbmx5PFJlY29yZERhdGE+LFxuICAgIG9wdGlvbnM/OiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5ycGMoXCJtZXJnZVwiLCBbdGFyZ2V0LCBkYXRhXSwgb3B0aW9ucyk7XG4gIH1cblxuICBhc3luYyBwYXRjaDxcbiAgICBUUmVzdWx0IGV4dGVuZHMgUmVhZG9ubHk8UmVjb3JkRGF0YT4gPSBSZWNvcmREYXRhLFxuICA+KFxuICAgIHRhYmxlOiBEYXRhVHlwZS5UYWJsZSB8IHN0cmluZyxcbiAgICBwYXRjaGVzOiByZWFkb25seSBSZWFkb25seVBhdGNoW10sXG4gICAgb3B0aW9ucz86XG4gICAgICB8IChDbGllbnRScGNPcHRpb25zICYgeyByZWFkb25seSBkaWZmPzogZmFsc2UgfCB1bmRlZmluZWQgfSlcbiAgICAgIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPEFjdGlvblJlc3VsdDxUUmVzdWx0PltdPjtcblxuICBhc3luYyBwYXRjaDxcbiAgICBUUmVzdWx0IGV4dGVuZHMgUmVhZG9ubHk8UmVjb3JkRGF0YT4gPSBSZWNvcmREYXRhLFxuICA+KFxuICAgIHRoaW5nOiBEYXRhVHlwZS5UaGluZyxcbiAgICBwYXRjaGVzOiByZWFkb25seSBSZWFkb25seVBhdGNoW10sXG4gICAgb3B0aW9ucz86XG4gICAgICB8IChDbGllbnRScGNPcHRpb25zICYgeyByZWFkb25seSBkaWZmPzogZmFsc2UgfCB1bmRlZmluZWQgfSlcbiAgICAgIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPEFjdGlvblJlc3VsdDxUUmVzdWx0Pj47XG5cbiAgYXN5bmMgcGF0Y2goXG4gICAgdGFibGU6IERhdGFUeXBlLlRhYmxlIHwgc3RyaW5nLFxuICAgIHBhdGNoZXM6IHJlYWRvbmx5IFJlYWRvbmx5UGF0Y2hbXSxcbiAgICBvcHRpb25zOiBDbGllbnRScGNPcHRpb25zICYgeyByZWFkb25seSBkaWZmOiB0cnVlIH0sXG4gICk6IFByb21pc2U8UGF0Y2hbXVtdPjtcblxuICBhc3luYyBwYXRjaChcbiAgICB0aGluZzogRGF0YVR5cGUuVGhpbmcsXG4gICAgcGF0Y2hlczogcmVhZG9ubHkgUmVhZG9ubHlQYXRjaFtdLFxuICAgIG9wdGlvbnM6IENsaWVudFJwY09wdGlvbnMgJiB7IHJlYWRvbmx5IGRpZmY6IHRydWUgfSxcbiAgKTogUHJvbWlzZTxQYXRjaFtdPjtcblxuICBhc3luYyBwYXRjaChcbiAgICB0YXJnZXQ6XG4gICAgICB8IChEYXRhVHlwZS5UYWJsZSB8IHN0cmluZylcbiAgICAgIHwgRGF0YVR5cGUuVGhpbmcsXG4gICAgcGF0Y2hlczogcmVhZG9ubHkgUmVhZG9ubHlQYXRjaFtdLFxuICAgIG9wdGlvbnM/OiBQYXRjaE9wdGlvbnMgfCB1bmRlZmluZWQsXG4gICkge1xuICAgIGNvbnN0IHsgZGlmZiwgLi4ucmVzdCB9ID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLnJwYyhcInBhdGNoXCIsIFt0YXJnZXQsIHBhdGNoZXMsIGRpZmZdLCByZXN0KTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZTxcbiAgICBUUmVzdWx0IGV4dGVuZHMgUmVhZG9ubHk8UmVjb3JkRGF0YT4gPSBSZWNvcmREYXRhLFxuICA+KFxuICAgIHRhYmxlOiBEYXRhVHlwZS5UYWJsZSB8IHN0cmluZyxcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTxBY3Rpb25SZXN1bHQ8VFJlc3VsdD5bXT47XG5cbiAgYXN5bmMgZGVsZXRlPFxuICAgIFRSZXN1bHQgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmREYXRhPiA9IFJlY29yZERhdGEsXG4gID4oXG4gICAgdGhpbmc6IERhdGFUeXBlLlRoaW5nLFxuICAgIG9wdGlvbnM/OiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPEFjdGlvblJlc3VsdDxUUmVzdWx0Pj47XG5cbiAgYXN5bmMgZGVsZXRlKFxuICAgIHRhcmdldDpcbiAgICAgIHwgKERhdGFUeXBlLlRhYmxlIHwgc3RyaW5nKVxuICAgICAgfCBEYXRhVHlwZS5UaGluZyxcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucnBjKFwiZGVsZXRlXCIsIFt0YXJnZXRdLCBvcHRpb25zKTtcbiAgfVxuXG4gIGFzeW5jIHZlcnNpb24ob3B0aW9ucz86IENsaWVudFJwY09wdGlvbnMgfCB1bmRlZmluZWQpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnJwYyhcInZlcnNpb25cIiwgW10sIG9wdGlvbnMpO1xuICB9XG5cbiAgYXN5bmMgcnVuPFQgPSB1bmtub3duPihcbiAgICBmdW5jTmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBSdW5PcHRpb25zIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPFQ+O1xuXG4gIGFzeW5jIHJ1bjxUID0gdW5rbm93bj4oXG4gICAgZnVuY05hbWU6IHN0cmluZyxcbiAgICBhcmdzPzogcmVhZG9ubHkgdW5rbm93bltdIHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM/OiBSdW5PcHRpb25zIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPFQ+O1xuXG4gIGFzeW5jIHJ1bihcbiAgICBmdW5jTmFtZTogc3RyaW5nLFxuICAgIGFyZzE/OiByZWFkb25seSB1bmtub3duW10gfCBSdW5PcHRpb25zIHwgdW5kZWZpbmVkLFxuICAgIGFyZzI/OiBSdW5PcHRpb25zIHwgdW5kZWZpbmVkLFxuICApIHtcbiAgICBjb25zdCBbYXJncywgb3B0c10gPSBBcnJheS5pc0FycmF5KGFyZzEpIHx8IGFyZzEgPT09IHVuZGVmaW5lZFxuICAgICAgPyBbYXJnMSwgYXJnMl0gYXMgY29uc3RcbiAgICAgIDogWywgYXJnMV0gYXMgY29uc3Q7XG4gICAgY29uc3QgeyB2ZXJzaW9uLCAuLi5yZXN0IH0gPSBvcHRzIHx8IHt9O1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucnBjKFwicnVuXCIsIFtmdW5jTmFtZSwgdmVyc2lvbiwgYXJnc10sIHJlc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBleHBlcmltZW50YWxcbiAgICovXG4gIGFzeW5jIGdyYXBocWwoXG4gICAgLy8gYHZhcnNgIG9mIGB2YXJpYWJsZXNgXG4gICAgLy8gYG9wZXJhdGlvbmAgb3IgYG9wZXJhdGlvbk5hbWVgXG4gICAgcXVlcnk6IHN0cmluZyB8IHtcbiAgICAgIHJlYWRvbmx5IHF1ZXJ5OiBzdHJpbmc7XG4gICAgICByZWFkb25seSB2YXJzPzogUmVhZG9ubHk8UmVjb3JkRGF0YT4gfCB1bmRlZmluZWQ7XG4gICAgICByZWFkb25seSBvcGVyYXRpb24/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgfSB8IHtcbiAgICAgIHJlYWRvbmx5IHF1ZXJ5OiBzdHJpbmc7XG4gICAgICByZWFkb25seSB2YXJzPzogUmVhZG9ubHk8UmVjb3JkRGF0YT4gfCB1bmRlZmluZWQ7XG4gICAgICByZWFkb25seSBvcGVyYXRpb25OYW1lPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIH0gfCB7XG4gICAgICByZWFkb25seSBxdWVyeTogc3RyaW5nO1xuICAgICAgcmVhZG9ubHkgdmFyaWFibGVzPzogUmVhZG9ubHk8UmVjb3JkRGF0YT4gfCB1bmRlZmluZWQ7XG4gICAgICByZWFkb25seSBvcGVyYXRpb24/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgfSB8IHtcbiAgICAgIHJlYWRvbmx5IHF1ZXJ5OiBzdHJpbmc7XG4gICAgICByZWFkb25seSB2YXJpYWJsZXM/OiBSZWFkb25seTxSZWNvcmREYXRhPiB8IHVuZGVmaW5lZDtcbiAgICAgIHJlYWRvbmx5IG9wZXJhdGlvbk5hbWU/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgfSxcbiAgICBvcHRpb25zOiBHcmFwaHFsT3B0aW9ucyB8IHVuZGVmaW5lZCA9IHt9LFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHsgc2lnbmFsLCAuLi5ncWxPcHRpb25zIH0gPSBvcHRpb25zO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucnBjKFwiZ3JhcGhxbFwiLCBbcXVlcnksIGdxbE9wdGlvbnNdLCB7IHNpZ25hbCB9KTtcbiAgfVxuXG4gIGFzeW5jIHJlbGF0ZTxcbiAgICBUUmVzdWx0IGV4dGVuZHMgUmVhZG9ubHk8UmVjb3JkRGF0YT4gPSBSZWNvcmREYXRhLFxuICAgIFREYXRhIGV4dGVuZHMgUmVhZG9ubHk8UmVjb3JkRGF0YT4gPSBUUmVzdWx0LFxuICA+KFxuICAgIGZyb206IERhdGFUeXBlLlRoaW5nIHwgc3RyaW5nIHwgcmVhZG9ubHkgKERhdGFUeXBlLlRoaW5nIHwgc3RyaW5nKVtdLFxuICAgIHRoaW5nOiBzdHJpbmcsXG4gICAgdG86IERhdGFUeXBlLlRoaW5nIHwgc3RyaW5nIHwgcmVhZG9ubHkgKERhdGFUeXBlLlRoaW5nIHwgc3RyaW5nKVtdLFxuICAgIGRhdGE/OiBURGF0YSB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTxSZWxhdGVSZXN1bHQ8VFJlc3VsdD5bXT47XG5cbiAgYXN5bmMgcmVsYXRlPFxuICAgIFRSZXN1bHQgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmREYXRhPiA9IFJlY29yZERhdGEsXG4gICAgVERhdGEgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmREYXRhPiA9IFRSZXN1bHQsXG4gID4oXG4gICAgZnJvbTogRGF0YVR5cGUuVGhpbmcgfCBzdHJpbmcgfCByZWFkb25seSAoRGF0YVR5cGUuVGhpbmcgfCBzdHJpbmcpW10sXG4gICAgdGhpbmc6IERhdGFUeXBlLlRoaW5nLFxuICAgIHRvOiBEYXRhVHlwZS5UaGluZyB8IHN0cmluZyB8IHJlYWRvbmx5IChEYXRhVHlwZS5UaGluZyB8IHN0cmluZylbXSxcbiAgICBkYXRhPzogVERhdGEgfCB1bmRlZmluZWQsXG4gICAgb3B0aW9ucz86IENsaWVudFJwY09wdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IFByb21pc2U8UmVsYXRlUmVzdWx0PFRSZXN1bHQ+PjtcblxuICBhc3luYyByZWxhdGUoXG4gICAgZnJvbTogRGF0YVR5cGUuVGhpbmcgfCBzdHJpbmcgfCByZWFkb25seSAoRGF0YVR5cGUuVGhpbmcgfCBzdHJpbmcpW10sXG4gICAgdGhpbmc6IERhdGFUeXBlLlRoaW5nIHwgc3RyaW5nLFxuICAgIHRvOiBEYXRhVHlwZS5UaGluZyB8IHN0cmluZyB8IHJlYWRvbmx5IChEYXRhVHlwZS5UaGluZyB8IHN0cmluZylbXSxcbiAgICBkYXRhPzogUmVhZG9ubHk8UmVjb3JkRGF0YT4gfCB1bmRlZmluZWQsXG4gICAgb3B0aW9ucz86IENsaWVudFJwY09wdGlvbnMgfCB1bmRlZmluZWQsXG4gICkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnJwYyhcInJlbGF0ZVwiLCBbZnJvbSwgdGhpbmcsIHRvLCBkYXRhXSwgb3B0aW9ucyk7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsMEJBQTRDO0FBQzVDLG9CQUFpQztBQWFqQyxtQkFBMkM7QUFHM0MsaUJBQWdCO0FBNkVoQixJQUFxQixVQUFyQixNQUFxQixnQkFBZSxvQkFBQUEsUUFBSztBQUFBLEVBQ3ZDLE1BQU0sS0FBSyxTQUF1RDtBQUNoRSxVQUFNLEtBQUssSUFBSSxRQUFRLENBQUMsR0FBRyxPQUFP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