socket-function 1.1.49 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/SetProcessVariables.ts.cache +9 -0
- package/dist/SocketFunction.ts.cache +467 -0
- package/hot/dist/HotReloadController.ts.cache +252 -0
- package/index.d.ts +1 -16
- package/package.json +1 -1
- package/require/dist/RequireController.ts.cache +386 -0
- package/require/dist/compileFlags.ts.cache +41 -0
- package/require/dist/extMapper.ts.cache +368 -0
- package/require/dist/require.ts.cache +676 -0
- package/src/JSONLACKS/dist/JSONLACKS.ts.cache +469 -0
- package/src/dist/CallFactory.ts.cache +930 -0
- package/src/dist/Zip.ts.cache +156 -0
- package/src/dist/batching.ts.cache +377 -0
- package/src/dist/bits.ts.cache +121 -0
- package/src/dist/buffers.ts.cache +76 -0
- package/src/dist/caching.ts.cache +302 -0
- package/src/dist/callHTTPHandler.ts.cache +264 -0
- package/src/dist/callManager.ts.cache +159 -0
- package/src/dist/certStore.ts.cache +59 -0
- package/src/dist/createSingleton.ts.cache +62 -0
- package/src/dist/fixLargeNetworkCalls.ts.cache +17 -0
- package/src/dist/forwardPort.ts.cache +222 -0
- package/src/dist/https.ts.cache +141 -0
- package/src/dist/misc.ts.cache +499 -0
- package/src/dist/nodeCache.ts.cache +136 -0
- package/src/dist/nodeProxy.ts.cache +57 -0
- package/src/dist/protocolNegotiation.ts.cache +101 -0
- package/src/dist/tlsParsing.ts.cache +85 -0
- package/src/dist/types.ts.cache +9 -0
- package/src/dist/webSocketServer.ts.cache +365 -0
- package/src/dist/websocketFactory.ts.cache +53 -0
- package/src/formatting/dist/colors.ts.cache +98 -0
- package/src/formatting/dist/format.ts.cache +396 -0
- package/src/formatting/dist/logColors.ts.cache +28 -0
- package/src/lz4/dist/LZ4.ts.cache +53 -0
- package/src/profiling/dist/getOwnTime.ts.cache +100 -0
- package/src/profiling/dist/measure.ts.cache +338 -0
- package/src/profiling/dist/stats.ts.cache +202 -0
- package/src/profiling/dist/statsFormat.ts.cache +45 -0
- package/src/profiling/getOwnTime.ts +7 -1
- package/src/profiling/measure.ts +25 -16
- package/test.ts +11 -5
- package/time/dist/trueTimeShim.ts.cache +656 -0
- package/time/trueTimeShim.d.ts +1 -16
- package/time/trueTimeShim.ts +7 -43
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
"use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
6
|
+
//exports.RequireController = exports.allowAllNodeModules = exports.setRequireBootRequire = exports.getIsAllowClient = exports.lazyImport = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const SocketFunction_1 = require("../SocketFunction");
|
|
9
|
+
const callHTTPHandler_1 = require("../src/callHTTPHandler");
|
|
10
|
+
const misc_1 = require("../src/misc");
|
|
11
|
+
const zlib_1 = __importDefault(require("zlib"));
|
|
12
|
+
const caching_1 = require("../src/caching");
|
|
13
|
+
const createSingleton_1 = require("../src/createSingleton");
|
|
14
|
+
const require_1 = require("./require");
|
|
15
|
+
const path_1 = __importDefault(require("path"));
|
|
16
|
+
const extMapper_1 = require("./extMapper");
|
|
17
|
+
const COMPRESS_CACHE_SIZE = 1024 * 1024 * 128;
|
|
18
|
+
module.allowclient = true;
|
|
19
|
+
/** Imports it, serverside, delayed. For dynamic imports, which we need to include once, but don't want to include
|
|
20
|
+
* immediately (due to cyclic issues), and isn't included initially.
|
|
21
|
+
*/
|
|
22
|
+
function lazyImport(getModule) {
|
|
23
|
+
if (!(0, misc_1.isNode)())
|
|
24
|
+
return;
|
|
25
|
+
// Import it, asynchronously, so it isn't preloaded, but it is available for clientside imports.
|
|
26
|
+
// NOTE: We track delayed imports (somewhere), and don't preload them by default in RequireController.
|
|
27
|
+
void Promise.resolve().then(() => getModule());
|
|
28
|
+
}
|
|
29
|
+
exports.lazyImport = lazyImport;
|
|
30
|
+
let nextModuleSeqNum = 1;
|
|
31
|
+
const requireSeqNumProcessId = "requireSeqNumProcessId_" + Date.now() + "_" + Math.random();
|
|
32
|
+
const BEFORE_ENTRY_TEMPLATE = "<!-- BEFORE_ENTRY_TEMPLATE -->";
|
|
33
|
+
const ENTRY_TEMPLATE = "<!-- ENTRY_TEMPLATE -->";
|
|
34
|
+
const resolvedHTMLFile = (0, caching_1.lazy)(() => {
|
|
35
|
+
const bufferShim = fs_1.default.readFileSync(__dirname + "/buffer.js").toString();
|
|
36
|
+
return fs_1.default.readFileSync(__dirname + "/require.html").toString()
|
|
37
|
+
.replace(BEFORE_ENTRY_TEMPLATE, `
|
|
38
|
+
<script>${bufferShim}</script>
|
|
39
|
+
<script>(${require_1.requireMain.toString()})()</script>
|
|
40
|
+
|
|
41
|
+
${BEFORE_ENTRY_TEMPLATE}
|
|
42
|
+
`);
|
|
43
|
+
});
|
|
44
|
+
// All of these are mutated by the static helpers below (injectHTMLBeforeStartup, addStaticRoot,
|
|
45
|
+
// addMapGetModules), which callers invoke on RequireController. But only the first-registered
|
|
46
|
+
// copy's controller actually serves requireHTML/getModules, and it reads these vars. So they must
|
|
47
|
+
// be shared across copies, or a caller using a different copy would add (ex) before-entry HTML
|
|
48
|
+
// that the serving controller never reads. See createSingleton.
|
|
49
|
+
const beforeEntryText = (0, createSingleton_1.createSingleton)("RequireController.beforeEntryText", 1, () => []).get();
|
|
50
|
+
function injectHTMLBeforeStartup(text) {
|
|
51
|
+
beforeEntryText.push(text);
|
|
52
|
+
}
|
|
53
|
+
const staticRoots = (0, createSingleton_1.createSingleton)("RequireController.staticRoots", 1, () => []).get();
|
|
54
|
+
function addStaticRoot(root) {
|
|
55
|
+
if (!root.endsWith("/")) {
|
|
56
|
+
root += "/";
|
|
57
|
+
}
|
|
58
|
+
staticRoots.push(root);
|
|
59
|
+
}
|
|
60
|
+
const mapGetModules = (0, createSingleton_1.createSingleton)("RequireController.mapGetModules", 1, () => []).get();
|
|
61
|
+
function addMapGetModules(remap) {
|
|
62
|
+
mapGetModules.push({ remap });
|
|
63
|
+
}
|
|
64
|
+
class RequireControllerBase {
|
|
65
|
+
constructor() {
|
|
66
|
+
this.rootResolvePath = "";
|
|
67
|
+
}
|
|
68
|
+
async requireHTML(config) {
|
|
69
|
+
let { requireCalls, cacheTime } = config || {};
|
|
70
|
+
let httpRequest = (0, callHTTPHandler_1.getCurrentHTTPRequest)();
|
|
71
|
+
let headers = {
|
|
72
|
+
"Content-Type": "text/html"
|
|
73
|
+
};
|
|
74
|
+
if (cacheTime) {
|
|
75
|
+
headers["Cache-Control"] = `max-age=${Math.floor(cacheTime / 1000)}`;
|
|
76
|
+
}
|
|
77
|
+
if (httpRequest) {
|
|
78
|
+
let urlObj = new URL("https://" + httpRequest.headers.host + httpRequest.url);
|
|
79
|
+
if (urlObj.pathname !== "/" && staticRoots.length > 0) {
|
|
80
|
+
if (urlObj.pathname.includes("..")) {
|
|
81
|
+
throw new Error(`Invalid path, may not have ".." in the path, ${urlObj.pathname}`);
|
|
82
|
+
}
|
|
83
|
+
let result;
|
|
84
|
+
for (let root of staticRoots) {
|
|
85
|
+
let resolved = root + urlObj.pathname;
|
|
86
|
+
if (fs_1.default.existsSync(resolved)) {
|
|
87
|
+
let rootResolved = path_1.default.resolve(resolved);
|
|
88
|
+
let finalResolved = path_1.default.resolve(rootResolved);
|
|
89
|
+
if (!finalResolved.startsWith(rootResolved)) {
|
|
90
|
+
throw new Error(`Invalid access, did not stay in namespace: ${JSON.stringify(rootResolved)}, but escaped: ${JSON.stringify(finalResolved)}`);
|
|
91
|
+
}
|
|
92
|
+
result = await fs_1.default.promises.readFile(resolved);
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (result) {
|
|
97
|
+
let contentType = (0, extMapper_1.getContentTypeFromBuffer)(result);
|
|
98
|
+
if (!contentType) {
|
|
99
|
+
let ext = path_1.default.extname(urlObj.pathname);
|
|
100
|
+
contentType = (0, extMapper_1.getExtContentType)(ext);
|
|
101
|
+
}
|
|
102
|
+
headers["Content-Type"] = contentType;
|
|
103
|
+
return (0, callHTTPHandler_1.setHTTPResultHeaders)(result, headers);
|
|
104
|
+
}
|
|
105
|
+
return (0, callHTTPHandler_1.setHTTPResultHeaders)(Buffer.from(`Static file not found, ${urlObj.pathname}, have static roots: ${JSON.stringify(staticRoots)}`), headers);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (!this.rootResolvePath) {
|
|
109
|
+
let dir = path_1.default.resolve(".");
|
|
110
|
+
dir = dir.replaceAll("\\", "/");
|
|
111
|
+
this.rootResolvePath = dir;
|
|
112
|
+
}
|
|
113
|
+
let result = resolvedHTMLFile();
|
|
114
|
+
if (beforeEntryText.length > 0) {
|
|
115
|
+
let resolved = [];
|
|
116
|
+
for (let text of beforeEntryText) {
|
|
117
|
+
if (typeof text === "string") {
|
|
118
|
+
resolved.push(text);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
resolved.push(await text());
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
result = result.replace(BEFORE_ENTRY_TEMPLATE, resolved.join("\n"));
|
|
125
|
+
}
|
|
126
|
+
if (requireCalls) {
|
|
127
|
+
async function requireAll(calls) {
|
|
128
|
+
// NOTE: awaiting isn't just for better and consistent load order, it also greatly improves load efficiency,
|
|
129
|
+
// as parallel calls can't know what files will be loaded, so there is a lot of duplicate loading. Loading
|
|
130
|
+
// 1 at a time allows require to efficiently require only files that previous imports haven't loaded.
|
|
131
|
+
for (let call of calls) {
|
|
132
|
+
try {
|
|
133
|
+
await require(call);
|
|
134
|
+
}
|
|
135
|
+
catch (e) {
|
|
136
|
+
// Detach the error so we can continue
|
|
137
|
+
setTimeout(() => { throw e; });
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
result = result.replace(ENTRY_TEMPLATE, `<script>\n(${requireAll.toString()})(${JSON.stringify(requireCalls)});\n</script>`);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
result = result.replace(ENTRY_TEMPLATE, "");
|
|
145
|
+
}
|
|
146
|
+
return (0, callHTTPHandler_1.setHTTPResultHeaders)(Buffer.from(result), headers);
|
|
147
|
+
}
|
|
148
|
+
async getModules(pathRequests, alreadyHave, config) {
|
|
149
|
+
var _a;
|
|
150
|
+
let httpRequest = (0, callHTTPHandler_1.getCurrentHTTPRequest)();
|
|
151
|
+
let seqNums = {};
|
|
152
|
+
if ((alreadyHave === null || alreadyHave === void 0 ? void 0 : alreadyHave.requireSeqNumProcessId) === requireSeqNumProcessId) {
|
|
153
|
+
for (let { s, e } of alreadyHave.seqNumRanges) {
|
|
154
|
+
if (e === undefined) {
|
|
155
|
+
e = s + 1;
|
|
156
|
+
}
|
|
157
|
+
for (let i = s; i < e; i++) {
|
|
158
|
+
seqNums[i] = 1;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
let modules = Object.create(null);
|
|
163
|
+
function addModule(module, rootImport = false) {
|
|
164
|
+
var _a;
|
|
165
|
+
if (!rootImport && module.lazyload)
|
|
166
|
+
return;
|
|
167
|
+
if (!module.requireControllerSeqNum) {
|
|
168
|
+
module.requireControllerSeqNum = nextModuleSeqNum++;
|
|
169
|
+
}
|
|
170
|
+
if (seqNums[module.requireControllerSeqNum]) {
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
if (module.filename in modules)
|
|
174
|
+
return;
|
|
175
|
+
// TODO: Remove unused exports. We know why the module is being requested, so we can
|
|
176
|
+
// actually very effectively know which exports it has which will never be used.
|
|
177
|
+
// - Of course, we would need to make the module specially, so if any new modules
|
|
178
|
+
// use it we can know... what was removed? It becomes complicated with
|
|
179
|
+
// lazy modules, but... it is still very important.
|
|
180
|
+
// IMPORTANT! Use module.filename, to strip the ".CLIENT_NAMEPSACE" extension
|
|
181
|
+
modules[module.filename] = {
|
|
182
|
+
originalId: module.id,
|
|
183
|
+
filename: module.filename,
|
|
184
|
+
// NOTE: Due to recursive sets of allowclient, it is very possible for allowclient && serveronly to be set.
|
|
185
|
+
allowclient: getIsAllowClient(module),
|
|
186
|
+
serveronly: module.serveronly,
|
|
187
|
+
requests: Object.create(null),
|
|
188
|
+
seqNum: module.requireControllerSeqNum,
|
|
189
|
+
size: module.size,
|
|
190
|
+
version: module.version,
|
|
191
|
+
asyncRequests: module.asyncRequires || {},
|
|
192
|
+
flags: {},
|
|
193
|
+
};
|
|
194
|
+
let flags = modules[module.filename].flags;
|
|
195
|
+
for (let [flag, value] of Object.entries(module)) {
|
|
196
|
+
if (value === true) {
|
|
197
|
+
flags[flag] = value;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
let moduleObj = modules[module.filename];
|
|
201
|
+
if (moduleObj.allowclient) {
|
|
202
|
+
moduleObj.source = module.moduleContents;
|
|
203
|
+
if (module.filename.endsWith(".json") && !moduleObj.source) {
|
|
204
|
+
moduleObj.source = module.moduleContents = fs_1.default.readFileSync(module.filename).toString();
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
// NOTE: Iterate on children even if it isn't allowed client, as the module may have children
|
|
208
|
+
// that are allowed clientside, and that have side-effects! (Mostly for static resources)
|
|
209
|
+
// - Surprisingly, this only increases the returned size by about 8% (probably more like 16%
|
|
210
|
+
// if we turn source maps off), so... it's fine. And with compression most of the extra
|
|
211
|
+
// size will go away, as paths are highly repetitive.
|
|
212
|
+
// - And now it increases the size by much less, as we ignore any subtree which are entirely
|
|
213
|
+
// not allowed on the client.
|
|
214
|
+
for (let request in module.requires) {
|
|
215
|
+
let requireResolvedPath = module.requires[request];
|
|
216
|
+
let requiredModule = require.cache[requireResolvedPath];
|
|
217
|
+
if (requiredModule) {
|
|
218
|
+
// Only include synchronous modules. BUT, DO include the requests, so when/if the request is made
|
|
219
|
+
// it can be resolved correctly.
|
|
220
|
+
if (!((_a = module.asyncRequires) === null || _a === void 0 ? void 0 : _a[request])) {
|
|
221
|
+
addModule(requiredModule);
|
|
222
|
+
}
|
|
223
|
+
moduleObj.requests[request] = requiredModule.filename;
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
moduleObj.requests[request] = "";
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
let searchPaths = [];
|
|
231
|
+
{
|
|
232
|
+
searchPaths.push(this.rootResolvePath);
|
|
233
|
+
let pathParts = this.rootResolvePath.replaceAll("\\", "/").split("/");
|
|
234
|
+
for (let i = 0; i < pathParts.length; i++) {
|
|
235
|
+
// Skip empty path parts, to preventing the case where the path ends
|
|
236
|
+
// with a /, which would result in "D:/test//node_modules"
|
|
237
|
+
if (!pathParts[i])
|
|
238
|
+
continue;
|
|
239
|
+
searchPaths.push(pathParts.slice(0, i + 1).join("/") + "/node_modules");
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
let requestsResolvedPaths = [];
|
|
243
|
+
for (let pathRequest of pathRequests) {
|
|
244
|
+
let resolvedPath = "";
|
|
245
|
+
try {
|
|
246
|
+
resolvedPath = require.resolve(pathRequest, { paths: searchPaths });
|
|
247
|
+
}
|
|
248
|
+
catch (_b) { }
|
|
249
|
+
requestsResolvedPaths.push(resolvedPath);
|
|
250
|
+
function createNotFoundModule(error) {
|
|
251
|
+
console.warn(error);
|
|
252
|
+
return {
|
|
253
|
+
exports: {},
|
|
254
|
+
children: [],
|
|
255
|
+
filename: resolvedPath,
|
|
256
|
+
id: resolvedPath,
|
|
257
|
+
isPreloading: false,
|
|
258
|
+
require: null,
|
|
259
|
+
loaded: true,
|
|
260
|
+
load: null,
|
|
261
|
+
parent: undefined,
|
|
262
|
+
path: "",
|
|
263
|
+
paths: [],
|
|
264
|
+
requires: {},
|
|
265
|
+
asyncRequires: {},
|
|
266
|
+
allowclient: true,
|
|
267
|
+
moduleContents: `console.warn(${JSON.stringify(error)})`,
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
// TODO: We could use import() here... but that would only make the root call asynchronous,
|
|
271
|
+
// which wouldn't prevent synchronous blocking by that much anyway...
|
|
272
|
+
//require(rootPath);
|
|
273
|
+
let clientModule = require.cache[resolvedPath];
|
|
274
|
+
if (!clientModule) {
|
|
275
|
+
// NOTE: Root requires will be asynchronous, so throwing should be just as good as
|
|
276
|
+
// warning, except throwing can be caught and retried on another server.
|
|
277
|
+
throw new Error(`Module ${pathRequest} (resolved to ${JSON.stringify(resolvedPath)}) was not included serverside. Resolved from root dir ${JSON.stringify(this.rootResolvePath)} (set by call to setRequireBootRequire), resolve search paths: ${JSON.stringify(searchPaths)})}`);
|
|
278
|
+
}
|
|
279
|
+
if (!clientModule.allowclient) {
|
|
280
|
+
clientModule = createNotFoundModule(`Module ${pathRequest} (resolved to ${resolvedPath}) is not allowed clientside (set module.allowclient in it, or call setFlag when it is imported).`);
|
|
281
|
+
}
|
|
282
|
+
addModule(clientModule, true);
|
|
283
|
+
}
|
|
284
|
+
let result = { requestsResolvedPaths, modules, requireSeqNumProcessId };
|
|
285
|
+
for (let remap of mapGetModules) {
|
|
286
|
+
result = await remap.remap(result, [pathRequests, alreadyHave, config]);
|
|
287
|
+
}
|
|
288
|
+
// NOTE: Handling compression ourself allows us to efficiently cache (otherwise caching would require
|
|
289
|
+
// hashing the output, which takes almost as long as compression!)
|
|
290
|
+
if (httpRequest && SocketFunction_1.SocketFunction.HTTP_COMPRESS && ((_a = httpRequest.headers["accept-encoding"]) === null || _a === void 0 ? void 0 : _a.includes("gzip"))) {
|
|
291
|
+
let simplifiedResult = {
|
|
292
|
+
...result,
|
|
293
|
+
modules: Object.entries(result.modules).map(x => {
|
|
294
|
+
var _a;
|
|
295
|
+
return [x[0], {
|
|
296
|
+
filename: x[1].filename,
|
|
297
|
+
version: x[1].version,
|
|
298
|
+
sourceLength: (_a = x[1].source) === null || _a === void 0 ? void 0 : _a.length,
|
|
299
|
+
}];
|
|
300
|
+
}),
|
|
301
|
+
};
|
|
302
|
+
let key = (0, misc_1.sha256Hash)(JSON.stringify(simplifiedResult));
|
|
303
|
+
let uncompressedBuffer = Buffer.from(JSON.stringify(result));
|
|
304
|
+
let buffer = await compressCached(key, () => uncompressedBuffer);
|
|
305
|
+
(0, callHTTPHandler_1.setHTTPResultHeaders)(buffer, {
|
|
306
|
+
"Content-Type": "application/json",
|
|
307
|
+
"Content-Encoding": "gzip",
|
|
308
|
+
"Content-Length": buffer.length.toString(),
|
|
309
|
+
"X-Uncompressed-Content-Length": uncompressedBuffer.length.toString(),
|
|
310
|
+
});
|
|
311
|
+
return buffer;
|
|
312
|
+
}
|
|
313
|
+
return result;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
let compressCacheSize = 0;
|
|
317
|
+
let compressCache = new Map();
|
|
318
|
+
async function compressCached(bufferKey, buffer) {
|
|
319
|
+
let cached = compressCache.get(bufferKey);
|
|
320
|
+
if (!cached) {
|
|
321
|
+
cached = await new Promise((resolve, reject) => {
|
|
322
|
+
zlib_1.default.gzip(buffer(), {}, (err, result) => {
|
|
323
|
+
if (err) {
|
|
324
|
+
reject(err);
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
resolve(result);
|
|
328
|
+
}
|
|
329
|
+
});
|
|
330
|
+
});
|
|
331
|
+
compressCacheSize += cached.length;
|
|
332
|
+
// TODO: Make the cache LRU eviction, instead of just resetting it
|
|
333
|
+
if (compressCacheSize > COMPRESS_CACHE_SIZE) {
|
|
334
|
+
compressCache.clear();
|
|
335
|
+
compressCacheSize = cached.length;
|
|
336
|
+
}
|
|
337
|
+
compressCache.set(bufferKey, cached);
|
|
338
|
+
}
|
|
339
|
+
return cached;
|
|
340
|
+
}
|
|
341
|
+
function getIsAllowClient(module) {
|
|
342
|
+
if (module.serveronly)
|
|
343
|
+
return false;
|
|
344
|
+
// IMPORTANT! We do not allow everything in node modules by default, as most things in node modules, you don't want to import client-side, and it will break if you import it client-side. Many of these are imported, but will never end up being called client-side, so it's fine to exclude them.
|
|
345
|
+
if (allowAllNodeModulesFlag.get().value && module.filename.includes("node_modules")) {
|
|
346
|
+
return true;
|
|
347
|
+
}
|
|
348
|
+
return module.allowclient;
|
|
349
|
+
}
|
|
350
|
+
exports.getIsAllowClient = getIsAllowClient;
|
|
351
|
+
// Shared across copies of this package, so the registered controller and rootResolvePath (set by
|
|
352
|
+
// setRequireBootRequire) are the same instance everyone reads/writes. See createSingleton.
|
|
353
|
+
const baseController = (0, createSingleton_1.createSingleton)("RequireController.baseController", 1, () => new RequireControllerBase()).get();
|
|
354
|
+
/** @deprecated, not needed, as this defaults to ".", which is a lot easier to reason about anyways. */
|
|
355
|
+
function setRequireBootRequire(dir) {
|
|
356
|
+
dir = path_1.default.resolve(dir);
|
|
357
|
+
dir = dir.replaceAll("\\", "/");
|
|
358
|
+
if (!dir.endsWith("/")) {
|
|
359
|
+
dir += "/";
|
|
360
|
+
}
|
|
361
|
+
baseController.rootResolvePath = dir;
|
|
362
|
+
}
|
|
363
|
+
exports.setRequireBootRequire = setRequireBootRequire;
|
|
364
|
+
// Shared across copies, so calling allowAllNodeModules() on any copy is seen by the serving
|
|
365
|
+
// controller's getIsAllowClient. See createSingleton.
|
|
366
|
+
const allowAllNodeModulesFlag = (0, createSingleton_1.createSingleton)("RequireController.allowAllNodeModules", 1, () => ({ value: false }));
|
|
367
|
+
function allowAllNodeModules() {
|
|
368
|
+
allowAllNodeModulesFlag.get().value = true;
|
|
369
|
+
}
|
|
370
|
+
exports.allowAllNodeModules = allowAllNodeModules;
|
|
371
|
+
exports.RequireController = SocketFunction_1.SocketFunction.register("RequireController-e2f811f3-14b8-4759-b0d6-73f14516cf1d", baseController, () => ({
|
|
372
|
+
getModules: {},
|
|
373
|
+
requireHTML: {},
|
|
374
|
+
bufferJS: {},
|
|
375
|
+
requireJS: {},
|
|
376
|
+
}), undefined, {
|
|
377
|
+
noAutoExpose: true,
|
|
378
|
+
statics: {
|
|
379
|
+
injectHTMLBeforeStartup,
|
|
380
|
+
addMapGetModules,
|
|
381
|
+
addStaticRoot,
|
|
382
|
+
allowAllNodeModules,
|
|
383
|
+
}
|
|
384
|
+
});
|
|
385
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVxdWlyZUNvbnRyb2xsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJSZXF1aXJlQ29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFFQSw0Q0FBb0I7QUFDcEIsc0RBQW1EO0FBQ25ELDREQUFxRjtBQUNyRixzQ0FBc0c7QUFDdEcsZ0RBQXdCO0FBQ3hCLDRDQUFvRDtBQUNwRCw0REFBeUQ7QUFFekQsdUNBQXdDO0FBQ3hDLGdEQUF3QjtBQUN4QiwyQ0FBMEU7QUFFMUUsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQztBQUU5QyxNQUFNLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztBQTRDMUI7O0dBRUc7QUFDSCxTQUFnQixVQUFVLENBQUMsU0FBaUM7SUFDeEQsSUFBSSxDQUFDLElBQUEsYUFBTSxHQUFFO1FBQUUsT0FBTztJQUN0QixnR0FBZ0c7SUFDaEcsdUdBQXVHO0lBQ3ZHLEtBQUssT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFMRCxnQ0FLQztBQUdELElBQUksZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0FBRXpCLE1BQU0sc0JBQXNCLEdBQUcseUJBQXlCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7QUFFNUYsTUFBTSxxQkFBcUIsR0FBRyxnQ0FBZ0MsQ0FBQztBQUMvRCxNQUFNLGNBQWMsR0FBRyx5QkFBeUIsQ0FBQztBQUVqRCxNQUFNLGdCQUFnQixHQUFHLElBQUEsY0FBSSxFQUFDLEdBQUcsRUFBRTtJQUMvQixNQUFNLFVBQVUsR0FBRyxZQUFFLENBQUMsWUFBWSxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN4RSxPQUFPLFlBQUUsQ0FBQyxZQUFZ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QUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDaEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNyQixHQUFHLElBQUksR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUNELGNBQWMsQ0FBQyxlQUFlLEdBQUcsR0FBRyxDQUFDO0FBQ3pDLENBQUM7QUFQRCxzREFPQztBQUVELDRGQUE0RjtBQUM1Rix1REFBdUQ7QUFDdkQsTUFBTSx1QkFBdUIsR0FBRyxJQUFBLGlDQUFlLEVBQUMsdUNBQXVDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3RILFNBQWdCLG1CQUFtQjtJQUMvQix1QkFBdUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQy9DLENBQUM7QUFGRCxrREFFQztBQUVZLFFBQUEsaUJBQWlCLEdBQUcsK0JBQWMsQ0FBQyxRQUFRLENBQ3BELHdEQUF3RCxFQUN4RCxjQUFjLEVBQ2QsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNILFVBQVUsRUFBRSxFQUFFO0lBQ2QsV0FBVyxFQUFFLEVBQUU7SUFDZixRQUFRLEVBQUUsRUFBRTtJQUNaLFNBQVMsRUFBRSxFQUFFO0NBQ2hCLENBQUMsRUFDRixTQUFTLEVBQ1Q7SUFDSSxZQUFZLEVBQUUsSUFBSTtJQUNsQixPQUFPLEVBQUU7UUFDTCx1QkFBdUI7UUFDdkIsZ0JBQWdCO1FBQ2hCLGFBQWE7UUFDYixtQkFBbUI7S0FDdEI7Q0FDSixDQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vdHlwZW5vZGUvaW5kZXguZC50c1wiIC8+XG5pbXBvcnQgZGVidWdicmVhayBmcm9tIFwiZGVidWdicmVha1wiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgU29ja2V0RnVuY3Rpb24gfSBmcm9tIFwiLi4vU29ja2V0RnVuY3Rpb25cIjtcbmltcG9ydCB7IGdldEN1cnJlbnRIVFRQUmVxdWVzdCwgc2V0SFRUUFJlc3VsdEhlYWRlcnMgfSBmcm9tIFwiLi4vc3JjL2NhbGxIVFRQSGFuZGxlclwiO1xuaW1wb3J0IHsgZm9ybWF0TnVtYmVyU3VmZml4ZWQsIGlzTm9kZSwgaXNOb2RlVHJ1ZSwgc2hhMjU2SGFzaCwgc2hhMjU2SGFzaFByb21pc2UgfSBmcm9tIFwiLi4vc3JjL21pc2NcIjtcbmltcG9ydCB6bGliIGZyb20gXCJ6bGliXCI7XG5pbXBvcnQgeyBjYWNoZUxpbWl0ZWQsIGxhenkgfSBmcm9tIFwiLi4vc3JjL2NhY2hpbmdcIjtcbmltcG9ydCB7IGNyZWF0ZVNpbmdsZXRvbiB9IGZyb20gXCIuLi9zcmMvY3JlYXRlU2luZ2xldG9uXCI7XG5pbXBvcnQgeyBmb3JtYXROdW1iZXIgfSBmcm9tIFwiLi4vc3JjL2Zvcm1hdHRpbmcvZm9ybWF0XCI7XG5pbXBvcnQgeyByZXF1aXJlTWFpbiB9IGZyb20gXCIuL3JlcXVpcmVcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBnZXRDb250ZW50VHlwZUZyb21CdWZmZXIsIGdldEV4dENvbnRlbnRUeXBlIH0gZnJvbSBcIi4vZXh0TWFwcGVyXCI7XG5cbmNvbnN0IENPTVBSRVNTX0NBQ0hFX1NJWkUgPSAxMDI0ICogMTAyNCAqIDEyODtcblxubW9kdWxlLmFsbG93Y2xpZW50ID0gdHJ1ZTtcblxuZGVjbGFyZSBnbG9iYWwge1xuICAgIG5hbWVzcGFjZSBOb2RlSlMge1xuICAgICAgICBpbnRlcmZhY2UgTW9kdWxlIHtcbiAgICAgICAgICAgIC8qKiBJbmRpY2F0ZXMgdGhlIG1vZHVsZSBpcyBhbGxvd2VkIGNsaWVudHNpZGUuXG4gICAgICAgICAgICAgKiAgTk9URTogU2V0IHdpdGggYG1vZHVsZS5hbGxvd2NsaWVudCA9IHRydWVgLiBIT1dFVkVSLCBhY2Nlc3MgdmlhIGdldElzQWxsb3dDbGllbnQsIHdoaWNoIHdpbGwgY2hlY2sgXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGFsbG93Y2xpZW50PzogYm9vbGVhbjtcblxuICAgICAgICAgICAgLyoqIENhdXNlcyB0aGUgbW9kdWxlIHRvIG5vdCBwcmVsb2FkLCByZXF1aXJpbmcgYGF3YWl0IGltcG9ydCgpYCBmb3IgaXQgdG8gbG9hZCBjb3JyZWN0bHlcbiAgICAgICAgICAgICAqICAgICAgLSBTaG91bGRuJ3QgYmUgc2V0IHJlY3Vyc2l2ZWx5LCBvdGhlcndpc2UgbmVzdGVkIHBhY2thZ2VzIHdpbGwgYnJlYWsuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGxhenlsb2FkPzogYm9vbGVhbjtcblxuICAgICAgICAgICAgLyoqIEluZGljYXRlcyB0aGUgbW9kdWxlIGlzIGRlZmluaXRlbHkgbm90IGFsbG93ZWQgY2xpZW50c2lkZSAqL1xuICAgICAgICAgICAgc2VydmVyb25seT86IGJvb2xlYW47XG5cbiAgICAgICAgICAgIC8vIFRPRE86IE1vdmUgc2VxTnVtIGludG8gdGhlIGFjdHVhbCBjb21waWxhdGlvbiwgYW5kIG1ha2UgaXQgaW5jcmVtZW50LFxuICAgICAgICAgICAgLy8gIHNvIHRoZSBjbGllbnRzaWRlIGNhbiBwcm9wZXJseSBoYW5kbGUgcmFjZSBjb25kaXRpb25zIGR1cmluZyBob3QgcmVsb2FkaW5nLlxuICAgICAgICAgICAgLy8gIEFuZC4uLiBtYXliZSBpdCBpcyB1c2VmdWwgaW4gb3RoZXIgY2FzZXM/XG4gICAgICAgICAgICAvKiogVXNlZCBpbnRlcm5hbGx5IGJ5IFJlcXVpcmVDb250cm9sbGVyICovXG4gICAgICAgICAgICByZXF1aXJlQ29udHJvbGxlclNlcU51bT86IG51bWJlcjtcblxuICAgICAgICAgICAgLy8gVGltZXMgYXJlIGJvdGggdW5pcXVlICh0d28gbW9kdWxlcyBldmFsdWF0ZWQgYXQgdGhlIHNhbWUgRGF0ZS5ub3coKSB3aWxsIGhhdmUgZGlmZmVyZW50IHZhbHVlcykuXG4gICAgICAgICAgICBldmFsU3RhcnRUaW1lPzogbnVtYmVyO1xuICAgICAgICAgICAgZXZhbEVuZFRpbWU/OiBudW1iZXI7XG5cbiAgICAgICAgICAgIC8qKiAoUHJlc2VudGx5IG9ubHkgY2FsbGVkIGJ5IHJlcXVpcmUuanMpXG4gICAgICAgICAgICAgKiAgICAgIENhbGxlZCBvbiByZXF1aXJlIGNhbGxzLCB0byBhbGxvdyBwcm92aWRlcnMgdG8gY3JlYXRlIGN1c3RvbSBleHBvcnRzIGRlcGVuZGluZyBvbiB0aGUgY2FsbGVyLlxuICAgICAgICAgICAgICogICAgICAgICAgLSBNb3N0bHkgdXNlZCB0byBhbGxvdyBmdW5jdGlvbnMgdG8ga25vdyB0aGUgY2FsbGluZyBtb2R1bGUuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHJlbWFwRXhwb3J0cz86IChleHBvcnRzOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSwgY2FsbGVyTW9kdWxlOiBOb2RlSlMuTW9kdWxlKSA9PiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfTtcblxuICAgICAgICAgICAgLyoqIE9ubHkgc2V0IGlmIGNsaWVudHNpZGUgKGFuZCBhbGxvd2VkIGNsaWVudHNpZGUpICovXG4gICAgICAgICAgICBzb3VyY2U/OiBzdHJpbmc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgICAgIGNsaWVudHNpZGVCb290VGltZTogbnVtYmVyO1xuICAgIH1cbiAgICB2YXIgc3VwcHJlc3NVbmV4cGVjdGVkTW9kdWxlV2FybmluZzogbnVtYmVyIHwgdW5kZWZpbmVkO1xufVxuXG4vKiogSW1wb3J0cyBpdCwgc2VydmVyc2lkZSwgZGVsYXllZC4gRm9yIGR5bmFtaWMgaW1wb3J0cywgd2hpY2ggd2UgbmVlZCB0byBpbmNsdWRlIG9uY2UsIGJ1dCBkb24ndCB3YW50IHRvIGluY2x1ZGVcbiAqICAgICAgaW1tZWRpYXRlbHkgKGR1ZSB0byBjeWNsaWMgaXNzdWVzKSwgYW5kIGlzbid0IGluY2x1ZGVkIGluaXRpYWxseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxhenlJbXBvcnQoZ2V0TW9kdWxlOiAoKSA9PiBQcm9taXNlPHVua25vd24+KSB7XG4gICAgaWYgKCFpc05vZGUoKSkgcmV0dXJuO1xuICAgIC8vIEltcG9ydCBpdCwgYXN5bmNocm9ub3VzbHksIHNvIGl0IGlzbid0IHByZWxvYWRlZCwgYnV0IGl0IGlzIGF2YWlsYWJsZSBmb3IgY2xpZW50c2lkZSBpbXBvcnRzLlxuICAgIC8vICBOT1RFOiBXZSB0cmFjayBkZWxheWVkIGltcG9ydHMgKHNvbWV3aGVyZSksIGFuZCBkb24ndCBwcmVsb2FkIHRoZW0gYnkgZGVmYXVsdCBpbiBSZXF1aXJlQ29udHJvbGxlci5cbiAgICB2b2lkIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gZ2V0TW9kdWxlKCkpO1xufVxuXG5cbmxldCBuZXh0TW9kdWxlU2VxTnVtID0gMTtcblxuY29uc3QgcmVxdWlyZVNlcU51bVByb2Nlc3NJZCA9IFwicmVxdWlyZVNlcU51bVByb2Nlc3NJZF9cIiArIERhdGUubm93KCkgKyBcIl9cIiArIE1hdGgucmFuZG9tKCk7XG5cbmNvbnN0IEJFRk9SRV9FTlRSWV9URU1QTEFURSA9IFwiPCEtLSBCRUZPUkVfRU5UUllfVEVNUExBVEUgLS0+XCI7XG5jb25zdCBFTlRSWV9URU1QTEFURSA9IFwiPCEtLSBFTlRSWV9URU1QTEFURSAtLT5cIjtcblxuY29uc3QgcmVzb2x2ZWRIVE1MRmlsZSA9IGxhenkoKCkgPT4ge1xuICAgIGNvbnN0IGJ1ZmZlclNoaW0gPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgXCIvYnVmZmVyLmpzXCIpLnRvU3RyaW5nKCk7XG4gICAgcmV0dXJuIGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyBcIi9yZXF1aXJlLmh0bWxcIikudG9TdHJpbmcoKVxuICAgICAgICAucmVwbGFjZShCRUZPUkVfRU5UUllfVEVNUExBVEUsXG4gICAgICAgICAgICBgXG4gICAgICAgICAgICAgICAgPHNjcmlwdD4ke2J1ZmZlclNoaW19PC9zY3JpcHQ+XG4gICAgICAgICAgICAgICAgPHNjcmlwdD4oJHtyZXF1aXJlTWFpbi50b1N0cmluZygpfSkoKTwvc2NyaXB0PlxuXG4gICAgICAgICAgICAgICAgJHtCRUZPUkVfRU5UUllfVEVNUExBVEV9XG4gICAgICAgICAgICBgXG4gICAgICAgICk7XG59KTtcblxuLy8gQWxsIG9mIHRoZXNlIGFyZSBtdXRhdGVkIGJ5IHRoZSBzdGF0aWMgaGVscGVycyBiZWxvdyAoaW5qZWN0SFRNTEJlZm9yZVN0YXJ0dXAsIGFkZFN0YXRpY1Jvb3QsXG4vLyAgYWRkTWFwR2V0TW9kdWxlcyksIHdoaWNoIGNhbGxlcnMgaW52b2tlIG9uIFJlcXVpcmVDb250cm9sbGVyLiBCdXQgb25seSB0aGUgZmlyc3QtcmVnaXN0ZXJlZFxuLy8gIGNvcHkncyBjb250cm9sbGVyIGFjdHVhbGx5IHNlcnZlcyByZXF1aXJlSFRNTC9nZXRNb2R1bGVzLCBhbmQgaXQgcmVhZHMgdGhlc2UgdmFycy4gU28gdGhleSBtdXN0XG4vLyAgYmUgc2hhcmVkIGFjcm9zcyBjb3BpZXMsIG9yIGEgY2FsbGVyIHVzaW5nIGEgZGlmZmVyZW50IGNvcHkgd291bGQgYWRkIChleCkgYmVmb3JlLWVudHJ5IEhUTUxcbi8vICB0aGF0IHRoZSBzZXJ2aW5nIGNvbnRyb2xsZXIgbmV2ZXIgcmVhZHMuIFNlZSBjcmVhdGVTaW5nbGV0b24uXG5jb25zdCBiZWZvcmVFbnRyeVRleHQgPSBjcmVhdGVTaW5nbGV0b24oXCJSZXF1aXJlQ29udHJvbGxlci5iZWZvcmVFbnRyeVRleHRcIiwgMSwgKCkgPT4gW10gYXMgKHN0cmluZyB8ICgoKSA9PiBQcm9taXNlPHN0cmluZz4pKVtdKS5nZXQoKTtcbmZ1bmN0aW9uIGluamVjdEhUTUxCZWZvcmVTdGFydHVwKHRleHQ6IHN0cmluZyB8ICgoKSA9PiBQcm9taXNlPHN0cmluZz4pKSB7XG4gICAgYmVmb3JlRW50cnlUZXh0LnB1c2godGV4dCk7XG59XG5jb25zdCBzdGF0aWNSb290cyA9IGNyZWF0ZVNpbmdsZXRvbihcIlJlcXVpcmVDb250cm9sbGVyLnN0YXRpY1Jvb3RzXCIsIDEsICgpID0+IFtdIGFzIHN0cmluZ1tdKS5nZXQoKTtcbmZ1bmN0aW9uIGFkZFN0YXRpY1Jvb3Qocm9vdDogc3RyaW5nKSB7XG4gICAgaWYgKCFyb290LmVuZHNXaXRoKFwiL1wiKSkge1xuICAgICAgICByb290ICs9IFwiL1wiO1xuICAgIH1cbiAgICBzdGF0aWNSb290cy5wdXNoKHJvb3QpO1xufVxuXG50eXBlIEdldE1vZHVsZXNSZXN1bHQgPSBSZXR1cm5UeXBlPFJlcXVpcmVDb250cm9sbGVyQmFzZVtcImdldE1vZHVsZXNcIl0+IGV4dGVuZHMgUHJvbWlzZTxpbmZlciBUPiA/IFQgOiBuZXZlcjtcbmV4cG9ydCB0eXBlIEdldE1vZHVsZXNBcmdzID0gUGFyYW1ldGVyczxSZXF1aXJlQ29udHJvbGxlckJhc2VbXCJnZXRNb2R1bGVzXCJdPjtcbmNvbnN0IG1hcEdldE1vZHVsZXMgPSBjcmVhdGVTaW5nbGV0b24oXCJSZXF1aXJlQ29udHJvbGxlci5tYXBHZXRNb2R1bGVzXCIsIDEsICgpID0+IFtdIGFzIHtcbiAgICByZW1hcChyZXN1bHQ6IEdldE1vZHVsZXNSZXN1bHQsIGFyZ3M6IEdldE1vZHVsZXNBcmdzKTogUHJvbWlzZTxHZXRNb2R1bGVzUmVzdWx0PlxufVtdKS5nZXQoKTtcbmZ1bmN0aW9uIGFkZE1hcEdldE1vZHVsZXMocmVtYXA6IHR5cGVvZiBtYXBHZXRNb2R1bGVzW251bWJlcl1bXCJyZW1hcFwiXSkge1xuICAgIG1hcEdldE1vZHVsZXMucHVzaCh7IHJlbWFwIH0pO1xufVxuXG5jbGFzcyBSZXF1aXJlQ29udHJvbGxlckJhc2Uge1xuICAgIHB1YmxpYyByb290UmVzb2x2ZVBhdGggPSBcIlwiO1xuXG4gICAgcHVibGljIGFzeW5jIHJlcXVpcmVIVE1MKGNvbmZpZz86IHtcbiAgICAgICAgcmVxdWlyZUNhbGxzPzogc3RyaW5nW107XG4gICAgICAgIGNhY2hlVGltZT86IG51bWJlcjtcbiAgICB9KTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICAgICAgbGV0IHsgcmVxdWlyZUNhbGxzLCBjYWNoZVRpbWUgfSA9IGNvbmZpZyB8fCB7fTtcbiAgICAgICAgbGV0IGh0dHBSZXF1ZXN0ID0gZ2V0Q3VycmVudEhUVFBSZXF1ZXN0KCk7XG4gICAgICAgIGxldCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJ0ZXh0L2h0bWxcIlxuICAgICAgICB9O1xuICAgICAgICBpZiAoY2FjaGVUaW1lKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiQ2FjaGUtQ29udHJvbFwiXSA9IGBtYXgtYWdlPSR7TWF0aC5mbG9vcihjYWNoZVRpbWUgLyAxMDAwKX1gO1xuICAgICAgICB9XG4gICAgICAgIGlmIChodHRwUmVxdWVzdCkge1xuICAgICAgICAgICAgbGV0IHVybE9iaiA9IG5ldyBVUkwoXCJodHRwczovL1wiICsgaHR0cFJlcXVlc3QuaGVhZGVycy5ob3N0ICsgaHR0cFJlcXVlc3QudXJsKTtcbiAgICAgICAgICAgIGlmICh1cmxPYmoucGF0aG5hbWUgIT09IFwiL1wiICYmIHN0YXRpY1Jvb3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBpZiAodXJsT2JqLnBhdGhuYW1lLmluY2x1ZGVzKFwiLi5cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhdGgsIG1heSBub3QgaGF2ZSBcIi4uXCIgaW4gdGhlIHBhdGgsICR7dXJsT2JqLnBhdGhuYW1lfWApO1xuICAgICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdDogQnVmZmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHJvb3Qgb2Ygc3RhdGljUm9vdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc29sdmVkID0gcm9vdCArIHVybE9iai5wYXRobmFtZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocmVzb2x2ZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm9vdFJlc29sdmVkID0gcGF0aC5yZXNvbHZlKHJlc29sdmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmaW5hbFJlc29sdmVkID0gcGF0aC5yZXNvbHZlKHJvb3RSZXNvbHZlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbmFsUmVzb2x2ZWQuc3RhcnRzV2l0aChyb290UmVzb2x2ZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFjY2VzcywgZGlkIG5vdCBzdGF5IGluIG5hbWVzcGFjZTogJHtKU09OLnN0cmluZ2lmeShyb290UmVzb2x2ZWQpfSwgYnV0IGVzY2FwZWQ6ICR7SlNPTi5zdHJpbmdpZnkoZmluYWxSZXNvbHZlZCl9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShyZXNvbHZlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50VHlwZSA9IGdldENvbnRlbnRUeXBlRnJvbUJ1ZmZlcihyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRlbnRUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXh0ID0gcGF0aC5leHRuYW1lKHVybE9iai5wYXRobmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZSA9IGdldEV4dENvbnRlbnRUeXBlKGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IGNvbnRlbnRUeXBlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0SFRUUFJlc3VsdEhlYWRlcnMocmVzdWx0LCBoZWFkZXJzKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gc2V0SFRUUFJlc3VsdEhlYWRlcnMoQnVmZmVyLmZyb20oYFN0YXRpYyBmaWxlIG5vdCBmb3VuZCwgJHt1cmxPYmoucGF0aG5hbWV9LCBoYXZlIHN0YXRpYyByb290czogJHtKU09OLnN0cmluZ2lmeShzdGF0aWNSb290cyl9YCksIGhlYWRlcnMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnJvb3RSZXNvbHZlUGF0aCkge1xuICAgICAgICAgICAgbGV0IGRpciA9IHBhdGgucmVzb2x2ZShcIi5cIik7XG4gICAgICAgICAgICBkaXIgPSBkaXIucmVwbGFjZUFsbChcIlxcXFxcIiwgXCIvXCIpO1xuICAgICAgICAgICAgdGhpcy5yb290UmVzb2x2ZVBhdGggPSBkaXI7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc3VsdCA9IHJlc29sdmVkSFRNTEZpbGUoKTtcbiAgICAgICAgaWYgKGJlZm9yZUVudHJ5VGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgcmVzb2x2ZWQ6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCB0ZXh0IG9mIGJlZm9yZUVudHJ5VGV4dCkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGV4dCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlZC5wdXNoKHRleHQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVkLnB1c2goYXdhaXQgdGV4dCgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShCRUZPUkVfRU5UUllfVEVNUExBVEUsIHJlc29sdmVkLmpvaW4oXCJcXG5cIikpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXF1aXJlQ2FsbHMpIHtcbiAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIHJlcXVpcmVBbGwoY2FsbHM6IHN0cmluZ1tdKSB7XG4gICAgICAgICAgICAgICAgLy8gTk9URTogYXdhaXRpbmcgaXNuJ3QganVzdCBmb3IgYmV0dGVyIGFuZCBjb25zaXN0ZW50IGxvYWQgb3JkZXIsIGl0IGFsc28gZ3JlYXRseSBpbXByb3ZlcyBsb2FkIGVmZmljaWVuY3ksXG4gICAgICAgICAgICAgICAgLy8gIGFzIHBhcmFsbGVsIGNhbGxzIGNhbid0IGtub3cgd2hhdCBmaWxlcyB3aWxsIGJlIGxvYWRlZCwgc28gdGhlcmUgaXMgYSBsb3Qgb2YgZHVwbGljYXRlIGxvYWRpbmcuIExvYWRpbmdcbiAgICAgICAgICAgICAgICAvLyAgMSBhdCBhIHRpbWUgYWxsb3dzIHJlcXVpcmUgdG8gZWZmaWNpZW50bHkgcmVxdWlyZSBvbmx5IGZpbGVzIHRoYXQgcHJldmlvdXMgaW1wb3J0cyBoYXZlbid0IGxvYWRlZC5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjYWxsIG9mIGNhbGxzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZXF1aXJlKGNhbGwpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEZXRhY2ggdGhlIGVycm9yIHNvIHdlIGNhbiBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IHRocm93IGU7IH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoRU5UUllfVEVNUExBVEUsIGA8c2NyaXB0Plxcbigke3JlcXVpcmVBbGwudG9TdHJpbmcoKX0pKCR7SlNPTi5zdHJpbmdpZnkocmVxdWlyZUNhbGxzKX0pO1xcbjwvc2NyaXB0PmApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoRU5UUllfVEVNUExBVEUsIFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXRIVFRQUmVzdWx0SGVhZGVycyhCdWZmZXIuZnJvbShyZXN1bHQpLCBoZWFkZXJzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0TW9kdWxlcyhcbiAgICAgICAgcGF0aFJlcXVlc3RzOiBzdHJpbmdbXSxcbiAgICAgICAgYWxyZWFkeUhhdmU/OiB7XG4gICAgICAgICAgICByZXF1aXJlU2VxTnVtUHJvY2Vzc0lkOiBzdHJpbmc7XG4gICAgICAgICAgICAvLyBOT1RFOiBIaWdobHkgb3B0aW1pemVkLCBhcyBvdGhlcndpc2UgdGhpcyBjYW4gZWFzaWx5IGJlIEtCcyAoSSB3YXMgc2VlaW5nIDlLQiksXG4gICAgICAgICAgICAvLyAgd2hpY2ggaXMgdXBsb2FkZWQsIGFuZCBzbyBjYW4gYmUgcXVpdGUgc2xvdyBvbiBzbG93IGNvbm5lY3Rpb25zLlxuICAgICAgICAgICAgc2VxTnVtUmFuZ2VzOiB7XG4gICAgICAgICAgICAgICAgczogbnVtYmVyO1xuICAgICAgICAgICAgICAgIC8vIHVuZGVmaW5lZCBtZWFucyBzICsgMSAoc28ganVzdCBhIHNpbmdsZSBudW1iZXIpXG4gICAgICAgICAgICAgICAgZT86IG51bWJlcjtcbiAgICAgICAgICAgIH1bXTtcbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlnPzoge31cbiAgICApOiBQcm9taXNlPHtcbiAgICAgICAgcmVxdWVzdHNSZXNvbHZlZFBhdGhzOiBzdHJpbmdbXTtcbiAgICAgICAgbW9kdWxlczoge1xuICAgICAgICAgICAgW3Jlc29sdmVkUGF0aDogc3RyaW5nXTogU2VyaWFsaXplZE1vZHVsZTtcbiAgICAgICAgfTtcbiAgICAgICAgcmVxdWlyZVNlcU51bVByb2Nlc3NJZDogc3RyaW5nO1xuICAgIH0+IHtcbiAgICAgICAgbGV0IGh0dHBSZXF1ZXN0ID0gZ2V0Q3VycmVudEhUVFBSZXF1ZXN0KCk7XG5cbiAgICAgICAgbGV0IHNlcU51bXM6IHsgW3NlcU51bTogbnVtYmVyXTogMSB9ID0ge307XG4gICAgICAgIGlmIChhbHJlYWR5SGF2ZT8ucmVxdWlyZVNlcU51bVByb2Nlc3NJZCA9PT0gcmVxdWlyZVNlcU51bVByb2Nlc3NJZCkge1xuICAgICAgICAgICAgZm9yIChsZXQgeyBzLCBlIH0gb2YgYWxyZWFkeUhhdmUuc2VxTnVtUmFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBlID0gcyArIDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBzOyBpIDwgZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlcU51bXNbaV0gPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtb2R1bGVzOiB7XG4gICAgICAgICAgICBbcmVzb2x2ZWRQYXRoOiBzdHJpbmddOiBTZXJpYWxpemVkTW9kdWxlO1xuICAgICAgICB9ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgZnVuY3Rpb24gYWRkTW9kdWxlKG1vZHVsZTogTm9kZUpTLk1vZHVsZSwgcm9vdEltcG9ydCA9IGZhbHNlKSB7XG4gICAgICAgICAgICBpZiAoIXJvb3RJbXBvcnQgJiYgbW9kdWxlLmxhenlsb2FkKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoIW1vZHVsZS5yZXF1aXJlQ29udHJvbGxlclNlcU51bSkge1xuICAgICAgICAgICAgICAgIG1vZHVsZS5yZXF1aXJlQ29udHJvbGxlclNlcU51bSA9IG5leHRNb2R1bGVTZXFOdW0rKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzZXFOdW1zW21vZHVsZS5yZXF1aXJlQ29udHJvbGxlclNlcU51bV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobW9kdWxlLmZpbGVuYW1lIGluIG1vZHVsZXMpIHJldHVybjtcblxuICAgICAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHVudXNlZCBleHBvcnRzLiBXZSBrbm93IHdoeSB0aGUgbW9kdWxlIGlzIGJlaW5nIHJlcXVlc3RlZCwgc28gd2UgY2FuXG4gICAgICAgICAgICAvLyAgYWN0dWFsbHkgdmVyeSBlZmZlY3RpdmVseSBrbm93IHdoaWNoIGV4cG9ydHMgaXQgaGFzIHdoaWNoIHdpbGwgbmV2ZXIgYmUgdXNlZC5cbiAgICAgICAgICAgIC8vICAtIE9mIGNvdXJzZSwgd2Ugd291bGQgbmVlZCB0byBtYWtlIHRoZSBtb2R1bGUgc3BlY2lhbGx5LCBzbyBpZiBhbnkgbmV3IG1vZHVsZXNcbiAgICAgICAgICAgIC8vICAgICAgdXNlIGl0IHdlIGNhbiBrbm93Li4uIHdoYXQgd2FzIHJlbW92ZWQ/IEl0IGJlY29tZXMgY29tcGxpY2F0ZWQgd2l0aFxuICAgICAgICAgICAgLy8gICAgICBsYXp5IG1vZHVsZXMsIGJ1dC4uLiBpdCBpcyBzdGlsbCB2ZXJ5IGltcG9ydGFudC5cblxuICAgICAgICAgICAgLy8gSU1QT1JUQU5UISBVc2UgbW9kdWxlLmZpbGVuYW1lLCB0byBzdHJpcCB0aGUgXCIuQ0xJRU5UX05BTUVQU0FDRVwiIGV4dGVuc2lvblxuICAgICAgICAgICAgbW9kdWxlc1ttb2R1bGUuZmlsZW5hbWVdID0ge1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsSWQ6IG1vZHVsZS5pZCxcbiAgICAgICAgICAgICAgICBmaWxlbmFtZTogbW9kdWxlLmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgIC8vIE5PVEU6IER1ZSB0byByZWN1cnNpdmUgc2V0cyBvZiBhbGxvd2NsaWVudCwgaXQgaXMgdmVyeSBwb3NzaWJsZSBmb3IgYWxsb3djbGllbnQgJiYgc2VydmVyb25seSB0byBiZSBzZXQuXG4gICAgICAgICAgICAgICAgYWxsb3djbGllbnQ6IGdldElzQWxsb3dDbGllbnQobW9kdWxlKSxcbiAgICAgICAgICAgICAgICBzZXJ2ZXJvbmx5OiBtb2R1bGUuc2VydmVyb25seSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0czogT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgICAgICAgICBzZXFOdW06IG1vZHVsZS5yZXF1aXJlQ29udHJvbGxlclNlcU51bSxcbiAgICAgICAgICAgICAgICBzaXplOiBtb2R1bGUuc2l6ZSxcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiBtb2R1bGUudmVyc2lvbixcbiAgICAgICAgICAgICAgICBhc3luY1JlcXVlc3RzOiBtb2R1bGUuYXN5bmNSZXF1aXJlcyB8fCB7fSxcbiAgICAgICAgICAgICAgICBmbGFnczoge30sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGV0IGZsYWdzID0gbW9kdWxlc1ttb2R1bGUuZmlsZW5hbWVdLmZsYWdzITtcbiAgICAgICAgICAgIGZvciAobGV0IFtmbGFnLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobW9kdWxlKSkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBmbGFnc1tmbGFnXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBtb2R1bGVPYmogPSBtb2R1bGVzW21vZHVsZS5maWxlbmFtZV07XG4gICAgICAgICAgICBpZiAobW9kdWxlT2JqLmFsbG93Y2xpZW50KSB7XG4gICAgICAgICAgICAgICAgbW9kdWxlT2JqLnNvdXJjZSA9IG1vZHVsZS5tb2R1bGVDb250ZW50cztcbiAgICAgICAgICAgICAgICBpZiAobW9kdWxlLmZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikgJiYgIW1vZHVsZU9iai5zb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgbW9kdWxlT2JqLnNvdXJjZSA9IG1vZHVsZS5tb2R1bGVDb250ZW50cyA9IGZzLnJlYWRGaWxlU3luYyhtb2R1bGUuZmlsZW5hbWUpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBOT1RFOiBJdGVyYXRlIG9uIGNoaWxkcmVuIGV2ZW4gaWYgaXQgaXNuJ3QgYWxsb3dlZCBjbGllbnQsIGFzIHRoZSBtb2R1bGUgbWF5IGhhdmUgY2hpbGRyZW5cbiAgICAgICAgICAgIC8vICB0aGF0IGFyZSBhbGxvd2VkIGNsaWVudHNpZGUsIGFuZCB0aGF0IGhhdmUgc2lkZS1lZmZlY3RzISAoTW9zdGx5IGZvciBzdGF0aWMgcmVzb3VyY2VzKVxuICAgICAgICAgICAgLy8gIC0gU3VycHJpc2luZ2x5LCB0aGlzIG9ubHkgaW5jcmVhc2VzIHRoZSByZXR1cm5lZCBzaXplIGJ5IGFib3V0IDglIChwcm9iYWJseSBtb3JlIGxpa2UgMTYlXG4gICAgICAgICAgICAvLyAgICAgIGlmIHdlIHR1cm4gc291cmNlIG1hcHMgb2ZmKSwgc28uLi4gaXQncyBmaW5lLiBBbmQgd2l0aCBjb21wcmVzc2lvbiBtb3N0IG9mIHRoZSBleHRyYVxuICAgICAgICAgICAgLy8gICAgICBzaXplIHdpbGwgZ28gYXdheSwgYXMgcGF0aHMgYXJlIGhpZ2hseSByZXBldGl0aXZlLlxuICAgICAgICAgICAgLy8gICAgICAtIEFuZCBub3cgaXQgaW5jcmVhc2VzIHRoZSBzaXplIGJ5IG11Y2ggbGVzcywgYXMgd2UgaWdub3JlIGFueSBzdWJ0cmVlIHdoaWNoIGFyZSBlbnRpcmVseVxuICAgICAgICAgICAgLy8gICAgICAgICAgbm90IGFsbG93ZWQgb24gdGhlIGNsaWVudC5cbiAgICAgICAgICAgIGZvciAobGV0IHJlcXVlc3QgaW4gbW9kdWxlLnJlcXVpcmVzKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgcmVxdWlyZVJlc29sdmVkUGF0aCA9IG1vZHVsZS5yZXF1aXJlc1tyZXF1ZXN0XTtcbiAgICAgICAgICAgICAgICBsZXQgcmVxdWlyZWRNb2R1bGUgPSByZXF1aXJlLmNhY2hlW3JlcXVpcmVSZXNvbHZlZFBhdGhdO1xuXG4gICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkTW9kdWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgaW5jbHVkZSBzeW5jaHJvbm91cyBtb2R1bGVzLiBCVVQsIERPIGluY2x1ZGUgdGhlIHJlcXVlc3RzLCBzbyB3aGVuL2lmIHRoZSByZXF1ZXN0IGlzIG1hZGVcbiAgICAgICAgICAgICAgICAgICAgLy8gIGl0IGNhbiBiZSByZXNvbHZlZCBjb3JyZWN0bHkuXG4gICAgICAgICAgICAgICAgICAgIGlmICghbW9kdWxlLmFzeW5jUmVxdWlyZXM/LltyZXF1ZXN0XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkTW9kdWxlKHJlcXVpcmVkTW9kdWxlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtb2R1bGVPYmoucmVxdWVzdHNbcmVxdWVzdF0gPSByZXF1aXJlZE1vZHVsZS5maWxlbmFtZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBtb2R1bGVPYmoucmVxdWVzdHNbcmVxdWVzdF0gPSBcIlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzZWFyY2hQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAge1xuICAgICAgICAgICAgc2VhcmNoUGF0aHMucHVzaCh0aGlzLnJvb3RSZXNvbHZlUGF0aCk7XG4gICAgICAgICAgICBsZXQgcGF0aFBhcnRzID0gdGhpcy5yb290UmVzb2x2ZVBhdGgucmVwbGFjZUFsbChcIlxcXFxcIiwgXCIvXCIpLnNwbGl0KFwiL1wiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aFBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgLy8gU2tpcCBlbXB0eSBwYXRoIHBhcnRzLCB0byBwcmV2ZW50aW5nIHRoZSBjYXNlIHdoZXJlIHRoZSBwYXRoIGVuZHNcbiAgICAgICAgICAgICAgICAvLyAgd2l0aCBhIC8sIHdoaWNoIHdvdWxkIHJlc3VsdCBpbiBcIkQ6L3Rlc3QvL25vZGVfbW9kdWxlc1wiXG4gICAgICAgICAgICAgICAgaWYgKCFwYXRoUGFydHNbaV0pIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHNlYXJjaFBhdGhzLnB1c2gocGF0aFBhcnRzLnNsaWNlKDAsIGkgKyAxKS5qb2luKFwiL1wiKSArIFwiL25vZGVfbW9kdWxlc1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IHJlcXVlc3RzUmVzb2x2ZWRQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgcGF0aFJlcXVlc3Qgb2YgcGF0aFJlcXVlc3RzKSB7XG4gICAgICAgICAgICBsZXQgcmVzb2x2ZWRQYXRoID0gXCJcIjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZWRQYXRoID0gcmVxdWlyZS5yZXNvbHZlKHBhdGhSZXF1ZXN0LCB7IHBhdGhzOiBzZWFyY2hQYXRocyB9KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggeyB9XG4gICAgICAgICAgICByZXF1ZXN0c1Jlc29sdmVkUGF0aHMucHVzaChyZXNvbHZlZFBhdGgpO1xuXG4gICAgICAgICAgICBmdW5jdGlvbiBjcmVhdGVOb3RGb3VuZE1vZHVsZShlcnJvcjogc3RyaW5nKTogTm9kZUpTLk1vZHVsZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGVycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBleHBvcnRzOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogcmVzb2x2ZWRQYXRoLFxuICAgICAgICAgICAgICAgICAgICBpZDogcmVzb2x2ZWRQYXRoLFxuICAgICAgICAgICAgICAgICAgICBpc1ByZWxvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlOiBudWxsIGFzIGFueSxcbiAgICAgICAgICAgICAgICAgICAgbG9hZGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBsb2FkOiBudWxsIGFzIGFueSxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIHBhdGhzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZXM6IHt9LFxuICAgICAgICAgICAgICAgICAgICBhc3luY1JlcXVpcmVzOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgYWxsb3djbGllbnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIG1vZHVsZUNvbnRlbnRzOiBgY29uc29sZS53YXJuKCR7SlNPTi5zdHJpbmdpZnkoZXJyb3IpfSlgLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRPRE86IFdlIGNvdWxkIHVzZSBpbXBvcnQoKSBoZXJlLi4uIGJ1dCB0aGF0IHdvdWxkIG9ubHkgbWFrZSB0aGUgcm9vdCBjYWxsIGFzeW5jaHJvbm91cyxcbiAgICAgICAgICAgIC8vICB3aGljaCB3b3VsZG4ndCBwcmV2ZW50IHN5bmNocm9ub3VzIGJsb2NraW5nIGJ5IHRoYXQgbXVjaCBhbnl3YXkuLi5cbiAgICAgICAgICAgIC8vcmVxdWlyZShyb290UGF0aCk7XG4gICAgICAgICAgICBsZXQgY2xpZW50TW9kdWxlID0gcmVxdWlyZS5jYWNoZVtyZXNvbHZlZFBhdGhdO1xuICAgICAgICAgICAgaWYgKCFjbGllbnRNb2R1bGUpIHtcbiAgICAgICAgICAgICAgICAvLyBOT1RFOiBSb290IHJlcXVpcmVzIHdpbGwgYmUgYXN5bmNocm9ub3VzLCBzbyB0aHJvd2luZyBzaG91bGQgYmUganVzdCBhcyBnb29kIGFzXG4gICAgICAgICAgICAgICAgLy8gIHdhcm5pbmcsIGV4Y2VwdCB0aHJvd2luZyBjYW4gYmUgY2F1Z2h0IGFuZCByZXRyaWVkIG9uIGFub3RoZXIgc2VydmVyLlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTW9kdWxlICR7cGF0aFJlcXVlc3R9IChyZXNvbHZlZCB0byAke0pTT04uc3RyaW5naWZ5KHJlc29sdmVkUGF0aCl9KSB3YXMgbm90IGluY2x1ZGVkIHNlcnZlcnNpZGUuIFJlc29sdmVkIGZyb20gcm9vdCBkaXIgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnJvb3RSZXNvbHZlUGF0aCl9IChzZXQgYnkgY2FsbCB0byBzZXRSZXF1aXJlQm9vdFJlcXVpcmUpLCByZXNvbHZlIHNlYXJjaCBwYXRoczogJHtKU09OLnN0cmluZ2lmeShzZWFyY2hQYXRocyl9KX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghY2xpZW50TW9kdWxlLmFsbG93Y2xpZW50KSB7XG4gICAgICAgICAgICAgICAgY2xpZW50TW9kdWxlID0gY3JlYXRlTm90Rm91bmRNb2R1bGUoYE1vZHVsZSAke3BhdGhSZXF1ZXN0fSAocmVzb2x2ZWQgdG8gJHtyZXNvbHZlZFBhdGh9KSBpcyBub3QgYWxsb3dlZCBjbGllbnRzaWRlIChzZXQgbW9kdWxlLmFsbG93Y2xpZW50IGluIGl0LCBvciBjYWxsIHNldEZsYWcgd2hlbiBpdCBpcyBpbXBvcnRlZCkuYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGFkZE1vZHVsZShjbGllbnRNb2R1bGUsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3VsdDogR2V0TW9kdWxlc1Jlc3VsdCA9IHsgcmVxdWVzdHNSZXNvbHZlZFBhdGhzLCBtb2R1bGVzLCByZXF1aXJlU2VxTnVtUHJvY2Vzc0lkIH07XG4gICAgICAgIGZvciAobGV0IHJlbWFwIG9mIG1hcEdldE1vZHVsZXMpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHJlbWFwLnJlbWFwKHJlc3VsdCwgW3BhdGhSZXF1ZXN0cywgYWxyZWFkeUhhdmUsIGNvbmZpZ10pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTk9URTogSGFuZGxpbmcgY29tcHJlc3Npb24gb3Vyc2VsZiBhbGxvd3MgdXMgdG8gZWZmaWNpZW50bHkgY2FjaGUgKG90aGVyd2lzZSBjYWNoaW5nIHdvdWxkIHJlcXVpcmVcbiAgICAgICAgLy8gICAgICBoYXNoaW5nIHRoZSBvdXRwdXQsIHdoaWNoIHRha2VzIGFsbW9zdCBhcyBsb25nIGFzIGNvbXByZXNzaW9uISlcbiAgICAgICAgaWYgKGh0dHBSZXF1ZXN0ICYmIFNvY2tldEZ1bmN0aW9uLkhUVFBfQ09NUFJFU1MgJiYgaHR0cFJlcXVlc3QuaGVhZGVyc1tcImFjY2VwdC1lbmNvZGluZ1wiXT8uaW5jbHVkZXMoXCJnemlwXCIpKSB7XG4gICAgICAgICAgICBsZXQgc2ltcGxpZmllZFJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAuLi5yZXN1bHQsXG4gICAgICAgICAgICAgICAgbW9kdWxlczogT2JqZWN0LmVudHJpZXMocmVzdWx0Lm1vZHVsZXMpLm1hcCh4ID0+IFt4WzBdLCB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiB4WzFdLmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiB4WzFdLnZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUxlbmd0aDogeFsxXS5zb3VyY2U/Lmxlbmd0aCxcbiAgICAgICAgICAgICAgICB9XSksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGV0IGtleSA9IHNoYTI1Nkhhc2goSlNPTi5zdHJpbmdpZnkoc2ltcGxpZmllZFJlc3VsdCkpO1xuICAgICAgICAgICAgbGV0IHVuY29tcHJlc3NlZEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHJlc3VsdCkpO1xuICAgICAgICAgICAgbGV0IGJ1ZmZlciA9IGF3YWl0IGNvbXByZXNzQ2FjaGVkKGtleSwgKCkgPT4gdW5jb21wcmVzc2VkQnVmZmVyKTtcbiAgICAgICAgICAgIHNldEhUVFBSZXN1bHRIZWFkZXJzKGJ1ZmZlciwge1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQ29udGVudC1FbmNvZGluZ1wiOiBcImd6aXBcIixcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtTGVuZ3RoXCI6IGJ1ZmZlci5sZW5ndGgudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBcIlgtVW5jb21wcmVzc2VkLUNvbnRlbnQtTGVuZ3RoXCI6IHVuY29tcHJlc3NlZEJ1ZmZlci5sZW5ndGgudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlciBhcyBhbnk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cblxubGV0IGNvbXByZXNzQ2FjaGVTaXplID0gMDtcbmxldCBjb21wcmVzc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIEJ1ZmZlcj4oKTtcbmFzeW5jIGZ1bmN0aW9uIGNvbXByZXNzQ2FjaGVkKGJ1ZmZlcktleTogc3RyaW5nLCBidWZmZXI6ICgpID0+IEJ1ZmZlcik6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgbGV0IGNhY2hlZCA9IGNvbXByZXNzQ2FjaGUuZ2V0KGJ1ZmZlcktleSk7XG4gICAgaWYgKCFjYWNoZWQpIHtcbiAgICAgICAgY2FjaGVkID0gYXdhaXQgbmV3IFByb21pc2U8QnVmZmVyPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB6bGliLmd6aXAoYnVmZmVyKCksIHt9LCAoZXJyLCByZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbXByZXNzQ2FjaGVTaXplICs9IGNhY2hlZC5sZW5ndGg7XG4gICAgICAgIC8vIFRPRE86IE1ha2UgdGhlIGNhY2hlIExSVSBldmljdGlvbiwgaW5zdGVhZCBvZiBqdXN0IHJlc2V0dGluZyBpdFxuICAgICAgICBpZiAoY29tcHJlc3NDYWNoZVNpemUgPiBDT01QUkVTU19DQUNIRV9TSVpFKSB7XG4gICAgICAgICAgICBjb21wcmVzc0NhY2hlLmNsZWFyKCk7XG4gICAgICAgICAgICBjb21wcmVzc0NhY2hlU2l6ZSA9IGNhY2hlZC5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgY29tcHJlc3NDYWNoZS5zZXQoYnVmZmVyS2V5LCBjYWNoZWQpO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SXNBbGxvd0NsaWVudChtb2R1bGU6IE5vZGVKUy5Nb2R1bGUpIHtcbiAgICBpZiAobW9kdWxlLnNlcnZlcm9ubHkpIHJldHVybiBmYWxzZTtcbiAgICAvLyBJTVBPUlRBTlQhIFdlIGRvIG5vdCBhbGxvdyBldmVyeXRoaW5nIGluIG5vZGUgbW9kdWxlcyBieSBkZWZhdWx0LCBhcyBtb3N0IHRoaW5ncyBpbiBub2RlIG1vZHVsZXMsIHlvdSBkb24ndCB3YW50IHRvIGltcG9ydCBjbGllbnQtc2lkZSwgYW5kIGl0IHdpbGwgYnJlYWsgaWYgeW91IGltcG9ydCBpdCBjbGllbnQtc2lkZS4gTWFueSBvZiB0aGVzZSBhcmUgaW1wb3J0ZWQsIGJ1dCB3aWxsIG5ldmVyIGVuZCB1cCBiZWluZyBjYWxsZWQgY2xpZW50LXNpZGUsIHNvIGl0J3MgZmluZSB0byBleGNsdWRlIHRoZW0uXG4gICAgaWYgKGFsbG93QWxsTm9kZU1vZHVsZXNGbGFnLmdldCgpLnZhbHVlICYmIG1vZHVsZS5maWxlbmFtZS5pbmNsdWRlcyhcIm5vZGVfbW9kdWxlc1wiKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIG1vZHVsZS5hbGxvd2NsaWVudDtcbn1cblxudHlwZSBDbGllbnRSZW1hcENhbGxiYWNrID0gKGFyZ3M6IEdldE1vZHVsZXNBcmdzKSA9PiBQcm9taXNlPEdldE1vZHVsZXNBcmdzPjtcbmRlY2xhcmUgZ2xvYmFsIHtcbiAgICAvKiogTXVzdCBiZSBzZXQgY2xpZW50c2lkZSBCRUZPUkUgcmVxdWVzdHMgYXJlIG1hZGUgKHNvIHlvdSBsaWtlbHkgd2FudCB0byB1c2UgUmVxdWlyZUNvbnRyb2xsZXIuYWRkTWFwR2V0TW9kdWxlc1xuICAgICAqICAgICAgdG8gaW5qZWN0IGNvZGUgdGhhdCB3aWxsIHVzZSB0aGlzKSAqL1xuICAgIHZhciByZW1hcEltcG9ydFJlcXVlc3RzQ2xpZW50c2lkZTogdW5kZWZpbmVkIHwgQ2xpZW50UmVtYXBDYWxsYmFja1tdO1xufVxuXG4vLyBTaGFyZWQgYWNyb3NzIGNvcGllcyBvZiB0aGlzIHBhY2thZ2UsIHNvIHRoZSByZWdpc3RlcmVkIGNvbnRyb2xsZXIgYW5kIHJvb3RSZXNvbHZlUGF0aCAoc2V0IGJ5XG4vLyAgc2V0UmVxdWlyZUJvb3RSZXF1aXJlKSBhcmUgdGhlIHNhbWUgaW5zdGFuY2UgZXZlcnlvbmUgcmVhZHMvd3JpdGVzLiBTZWUgY3JlYXRlU2luZ2xldG9uLlxuY29uc3QgYmFzZUNvbnRyb2xsZXIgPSBjcmVhdGVTaW5nbGV0b24oXCJSZXF1aXJlQ29udHJvbGxlci5iYXNlQ29udHJvbGxlclwiLCAxLCAoKSA9PiBuZXcgUmVxdWlyZUNvbnRyb2xsZXJCYXNlKCkpLmdldCgpO1xuLyoqIEBkZXByZWNhdGVkLCBub3QgbmVlZGVkLCBhcyB0aGlzIGRlZmF1bHRzIHRvIFwiLlwiLCB3aGljaCBpcyBhIGxvdCBlYXNpZXIgdG8gcmVhc29uIGFib3V0IGFueXdheXMuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0UmVxdWlyZUJvb3RSZXF1aXJlKGRpcjogc3RyaW5nKSB7XG4gICAgZGlyID0gcGF0aC5yZXNvbHZlKGRpcik7XG4gICAgZGlyID0gZGlyLnJlcGxhY2VBbGwoXCJcXFxcXCIsIFwiL1wiKTtcbiAgICBpZiAoIWRpci5lbmRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgZGlyICs9IFwiL1wiO1xuICAgIH1cbiAgICBiYXNlQ29udHJvbGxlci5yb290UmVzb2x2ZVBhdGggPSBkaXI7XG59XG5cbi8vIFNoYXJlZCBhY3Jvc3MgY29waWVzLCBzbyBjYWxsaW5nIGFsbG93QWxsTm9kZU1vZHVsZXMoKSBvbiBhbnkgY29weSBpcyBzZWVuIGJ5IHRoZSBzZXJ2aW5nXG4vLyAgY29udHJvbGxlcidzIGdldElzQWxsb3dDbGllbnQuIFNlZSBjcmVhdGVTaW5nbGV0b24uXG5jb25zdCBhbGxvd0FsbE5vZGVNb2R1bGVzRmxhZyA9IGNyZWF0ZVNpbmdsZXRvbihcIlJlcXVpcmVDb250cm9sbGVyLmFsbG93QWxsTm9kZU1vZHVsZXNcIiwgMSwgKCkgPT4gKHsgdmFsdWU6IGZhbHNlIH0pKTtcbmV4cG9ydCBmdW5jdGlvbiBhbGxvd0FsbE5vZGVNb2R1bGVzKCkge1xuICAgIGFsbG93QWxsTm9kZU1vZHVsZXNGbGFnLmdldCgpLnZhbHVlID0gdHJ1ZTtcbn1cblxuZXhwb3J0IGNvbnN0IFJlcXVpcmVDb250cm9sbGVyID0gU29ja2V0RnVuY3Rpb24ucmVnaXN0ZXIoXG4gICAgXCJSZXF1aXJlQ29udHJvbGxlci1lMmY4MTFmMy0xNGI4LTQ3NTktYjBkNi03M2YxNDUxNmNmMWRcIixcbiAgICBiYXNlQ29udHJvbGxlcixcbiAgICAoKSA9PiAoe1xuICAgICAgICBnZXRNb2R1bGVzOiB7fSxcbiAgICAgICAgcmVxdWlyZUhUTUw6IHt9LFxuICAgICAgICBidWZmZXJKUzoge30sXG4gICAgICAgIHJlcXVpcmVKUzoge30sXG4gICAgfSksXG4gICAgdW5kZWZpbmVkLFxuICAgIHtcbiAgICAgICAgbm9BdXRvRXhwb3NlOiB0cnVlLFxuICAgICAgICBzdGF0aWNzOiB7XG4gICAgICAgICAgICBpbmplY3RIVE1MQmVmb3JlU3RhcnR1cCxcbiAgICAgICAgICAgIGFkZE1hcEdldE1vZHVsZXMsXG4gICAgICAgICAgICBhZGRTdGF0aWNSb290LFxuICAgICAgICAgICAgYWxsb3dBbGxOb2RlTW9kdWxlcyxcbiAgICAgICAgfVxuICAgIH1cbik7Il19
|
|
386
|
+
/* _JS_SOURCE_HASH = "19bae7930752fabf466cb7a4d149ff9607f66a4131c1b0fcff934a65b9b703fa"; */
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
3
|
+
//exports.setFlag = exports.forceModule = void 0;
|
|
4
|
+
/// <reference path="./RequireController.ts" />
|
|
5
|
+
module.allowclient = true;
|
|
6
|
+
/**
|
|
7
|
+
* Adds a global function setFlag(require, "typescript", flag) which sets a flag on the client
|
|
8
|
+
* - Ex, setFlag(require, "typescript", "allowclient") so allowclient = true on the typescript module.
|
|
9
|
+
* - Passing true as the fourth argument sets it recursively
|
|
10
|
+
*/
|
|
11
|
+
// We need at least 1 export, to force this to be treated like a module
|
|
12
|
+
exports.forceModule = true;
|
|
13
|
+
function setRecursive(bangPart, module) {
|
|
14
|
+
let m = module;
|
|
15
|
+
m.recursiveBangs = m.recursiveBangs || {};
|
|
16
|
+
if (m.recursiveBangs[bangPart])
|
|
17
|
+
return;
|
|
18
|
+
m.recursiveBangs[bangPart] = true;
|
|
19
|
+
Object.assign(module, { [bangPart]: true });
|
|
20
|
+
for (let child of module.children) {
|
|
21
|
+
setRecursive(bangPart, child);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
globalThis.setFlag = setFlag;
|
|
25
|
+
function setFlag(require, request, flag, recursive) {
|
|
26
|
+
let resolvedPath = require.resolve(request);
|
|
27
|
+
let module = require.cache[resolvedPath];
|
|
28
|
+
if (!module) {
|
|
29
|
+
console.warn(`setFlag cannot resolve module ${request}`);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (recursive) {
|
|
33
|
+
setRecursive(flag, module);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
module[flag] = true;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.setFlag = setFlag;
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGlsZUZsYWdzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29tcGlsZUZsYWdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtDQUErQztBQUMvQyxNQUFNLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztBQUUxQjs7OztHQUlHO0FBRUgsdUVBQXVFO0FBQzFELFFBQUEsV0FBVyxHQUFHLElBQUksQ0FBQztBQU1oQyxTQUFTLFlBQVksQ0FBQyxRQUFnQixFQUFFLE1BQXFCO0lBQ3pELElBQUksQ0FBQyxHQUFHLE1BQWEsQ0FBQztJQUN0QixDQUFDLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFDO0lBRTFDLElBQUksQ0FBQyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUM7UUFBRSxPQUFPO0lBRXZDLENBQUMsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBRWxDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzVDLEtBQUssSUFBSSxLQUFLLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hDLFlBQVksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEMsQ0FBQztBQUNMLENBQUM7QUFFQSxVQUFrQixDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7QUFDdEMsU0FBZ0IsT0FBTyxDQUFDLE9BQW9CLEVBQUUsT0FBZSxFQUFFLElBQVksRUFBRSxTQUFtQjtJQUM1RixJQUFJLFlBQVksR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVDLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFRLENBQUM7SUFDaEQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1YsT0FBTyxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN6RCxPQUFPO0lBQ1gsQ0FBQztJQUNELElBQUksU0FBUyxFQUFFLENBQUM7UUFDWixZQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQy9CLENBQUM7U0FBTSxDQUFDO1FBQ0osTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztJQUN4QixDQUFDO0FBQ0wsQ0FBQztBQVpELDBCQVlDIiwic291cmNlc0NvbnRlbnQiOlsiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vUmVxdWlyZUNvbnRyb2xsZXIudHNcIiAvPlxubW9kdWxlLmFsbG93Y2xpZW50ID0gdHJ1ZTtcblxuLyoqXG4gKiAgICAgIEFkZHMgYSBnbG9iYWwgZnVuY3Rpb24gc2V0RmxhZyhyZXF1aXJlLCBcInR5cGVzY3JpcHRcIiwgZmxhZykgd2hpY2ggc2V0cyBhIGZsYWcgb24gdGhlIGNsaWVudFxuICogICAgICAgICAgLSBFeCwgc2V0RmxhZyhyZXF1aXJlLCBcInR5cGVzY3JpcHRcIiwgXCJhbGxvd2NsaWVudFwiKSBzbyBhbGxvd2NsaWVudCA9IHRydWUgb24gdGhlIHR5cGVzY3JpcHQgbW9kdWxlLlxuICogICAgICAgICAgLSBQYXNzaW5nIHRydWUgYXMgdGhlIGZvdXJ0aCBhcmd1bWVudCBzZXRzIGl0IHJlY3Vyc2l2ZWx5XG4gKi9cblxuLy8gV2UgbmVlZCBhdCBsZWFzdCAxIGV4cG9ydCwgdG8gZm9yY2UgdGhpcyB0byBiZSB0cmVhdGVkIGxpa2UgYSBtb2R1bGVcbmV4cG9ydCBjb25zdCBmb3JjZU1vZHVsZSA9IHRydWU7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgICAvL2Z1bmN0aW9uIHNldEZsYWcocmVxdWlyZTogTm9kZVJlcXVpcmUsIHJlcXVlc3Q6IHN0cmluZywgZmxhZzogc3RyaW5nLCByZWN1cnNpdmU/OiBib29sZWFuKTogdm9pZDtcbn1cblxuZnVuY3Rpb24gc2V0UmVjdXJzaXZlKGJhbmdQYXJ0OiBzdHJpbmcsIG1vZHVsZTogTm9kZUpTLk1vZHVsZSkge1xuICAgIGxldCBtID0gbW9kdWxlIGFzIGFueTtcbiAgICBtLnJlY3Vyc2l2ZUJhbmdzID0gbS5yZWN1cnNpdmVCYW5ncyB8fCB7fTtcblxuICAgIGlmIChtLnJlY3Vyc2l2ZUJhbmdzW2JhbmdQYXJ0XSkgcmV0dXJuO1xuXG4gICAgbS5yZWN1cnNpdmVCYW5nc1tiYW5nUGFydF0gPSB0cnVlO1xuXG4gICAgT2JqZWN0LmFzc2lnbihtb2R1bGUsIHsgW2JhbmdQYXJ0XTogdHJ1ZSB9KTtcbiAgICBmb3IgKGxldCBjaGlsZCBvZiBtb2R1bGUuY2hpbGRyZW4pIHtcbiAgICAgICAgc2V0UmVjdXJzaXZlKGJhbmdQYXJ0LCBjaGlsZCk7XG4gICAgfVxufVxuXG4oZ2xvYmFsVGhpcyBhcyBhbnkpLnNldEZsYWcgPSBzZXRGbGFnO1xuZXhwb3J0IGZ1bmN0aW9uIHNldEZsYWcocmVxdWlyZTogTm9kZVJlcXVpcmUsIHJlcXVlc3Q6IHN0cmluZywgZmxhZzogc3RyaW5nLCByZWN1cnNpdmU/OiBib29sZWFuKSB7XG4gICAgbGV0IHJlc29sdmVkUGF0aCA9IHJlcXVpcmUucmVzb2x2ZShyZXF1ZXN0KTtcbiAgICBsZXQgbW9kdWxlID0gcmVxdWlyZS5jYWNoZVtyZXNvbHZlZFBhdGhdIGFzIGFueTtcbiAgICBpZiAoIW1vZHVsZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYHNldEZsYWcgY2Fubm90IHJlc29sdmUgbW9kdWxlICR7cmVxdWVzdH1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocmVjdXJzaXZlKSB7XG4gICAgICAgIHNldFJlY3Vyc2l2ZShmbGFnLCBtb2R1bGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG1vZHVsZVtmbGFnXSA9IHRydWU7XG4gICAgfVxufSJdfQ==
|
|
41
|
+
/* _JS_SOURCE_HASH = "0380e764f1bc13438253f0f07261ad82643382d968e7f2c9cf03511cfafa7697"; */
|