@mnaoumov/typescript-lib 0.0.0 → 1.0.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/@types/debug/package.json +4 -0
- package/LICENSE +21 -0
- package/README.md +7 -1
- package/dist/lib/cjs/@types/debug.d.cts +21 -0
- package/dist/lib/cjs/abort-controller.cjs +202 -0
- package/dist/lib/cjs/abort-controller.d.cts +135 -0
- package/dist/lib/cjs/aggregate-error.cjs +98 -0
- package/dist/lib/cjs/aggregate-error.d.cts +24 -0
- package/dist/lib/cjs/array-buffer.cjs +96 -0
- package/dist/lib/cjs/array-buffer.d.cts +16 -0
- package/dist/lib/cjs/array.cjs +134 -0
- package/dist/lib/cjs/array.d.cts +46 -0
- package/dist/lib/cjs/async-events.cjs +466 -0
- package/dist/lib/cjs/async-events.d.cts +456 -0
- package/dist/lib/cjs/async-operation-hook.cjs +113 -0
- package/dist/lib/cjs/async-operation-hook.d.cts +59 -0
- package/dist/lib/cjs/async.cjs +521 -0
- package/dist/lib/cjs/async.d.cts +414 -0
- package/dist/lib/cjs/beeper.cjs +126 -0
- package/dist/lib/cjs/beeper.d.cts +21 -0
- package/dist/lib/cjs/blob.cjs +160 -0
- package/dist/lib/cjs/blob.d.cts +59 -0
- package/dist/lib/cjs/bytes.cjs +114 -0
- package/dist/lib/cjs/bytes.d.cts +17 -0
- package/dist/lib/cjs/debug-controller.cjs +80 -0
- package/dist/lib/cjs/debug-controller.d.cts +87 -0
- package/dist/lib/cjs/debug.cjs +235 -0
- package/dist/lib/cjs/debug.d.cts +66 -0
- package/dist/lib/cjs/desktop-zip-extractor.cjs +215 -0
- package/dist/lib/cjs/desktop-zip-extractor.d.cts +95 -0
- package/dist/lib/cjs/disposable.cjs +414 -0
- package/dist/lib/cjs/disposable.d.cts +387 -0
- package/dist/lib/cjs/enum.cjs +100 -0
- package/dist/lib/cjs/enum.d.cts +24 -0
- package/dist/lib/cjs/error.cjs +297 -0
- package/dist/lib/cjs/error.d.cts +181 -0
- package/dist/lib/cjs/function.cjs +141 -0
- package/dist/lib/cjs/function.d.cts +128 -0
- package/dist/lib/cjs/html-element.cjs +341 -0
- package/dist/lib/cjs/html-element.d.cts +199 -0
- package/dist/lib/cjs/index.cjs +195 -0
- package/dist/lib/cjs/index.d.cts +33 -0
- package/dist/lib/cjs/jpeg-metadata.cjs +228 -0
- package/dist/lib/cjs/jpeg-metadata.d.cts +42 -0
- package/dist/lib/cjs/library.cjs +158 -0
- package/dist/lib/cjs/library.d.cts +96 -0
- package/dist/lib/cjs/object-utils.cjs +617 -0
- package/dist/lib/cjs/object-utils.d.cts +298 -0
- package/dist/lib/cjs/path.cjs +202 -0
- package/dist/lib/cjs/path.d.cts +154 -0
- package/dist/lib/cjs/reg-exp.cjs +254 -0
- package/dist/lib/cjs/reg-exp.d.cts +87 -0
- package/dist/lib/cjs/string.cjs +326 -0
- package/dist/lib/cjs/string.d.cts +361 -0
- package/dist/lib/cjs/transformers/date-transformer.cjs +129 -0
- package/dist/lib/cjs/transformers/date-transformer.d.cts +39 -0
- package/dist/lib/cjs/transformers/group-transformer.cjs +173 -0
- package/dist/lib/cjs/transformers/group-transformer.d.cts +70 -0
- package/dist/lib/cjs/transformers/index.cjs +123 -0
- package/dist/lib/cjs/transformers/index.d.cts +9 -0
- package/dist/lib/cjs/transformers/map-transformer.cjs +129 -0
- package/dist/lib/cjs/transformers/map-transformer.d.cts +41 -0
- package/dist/lib/cjs/transformers/set-transformer.cjs +129 -0
- package/dist/lib/cjs/transformers/set-transformer.d.cts +39 -0
- package/dist/lib/cjs/transformers/skip-private-property-transformer.cjs +127 -0
- package/dist/lib/cjs/transformers/skip-private-property-transformer.d.cts +36 -0
- package/dist/lib/cjs/transformers/transformer.cjs +170 -0
- package/dist/lib/cjs/transformers/transformer.d.cts +70 -0
- package/dist/lib/cjs/transformers/two-way-map-transformer.cjs +130 -0
- package/dist/lib/cjs/transformers/two-way-map-transformer.d.cts +42 -0
- package/dist/lib/cjs/transformers/typed-transformer.cjs +94 -0
- package/dist/lib/cjs/transformers/typed-transformer.d.cts +39 -0
- package/dist/lib/cjs/two-way-map.cjs +208 -0
- package/dist/lib/cjs/two-way-map.d.cts +101 -0
- package/dist/lib/cjs/type-guards.cjs +128 -0
- package/dist/lib/cjs/type-guards.d.cts +84 -0
- package/dist/lib/cjs/type.cjs +121 -0
- package/dist/lib/cjs/type.d.cts +122 -0
- package/dist/lib/cjs/typescript-lib-state.cjs +126 -0
- package/dist/lib/cjs/typescript-lib-state.d.cts +56 -0
- package/dist/lib/cjs/url.cjs +136 -0
- package/dist/lib/cjs/url.d.cts +74 -0
- package/dist/lib/cjs/value-provider.cjs +100 -0
- package/dist/lib/cjs/value-provider.d.cts +28 -0
- package/dist/lib/cjs/value-wrapper.cjs +144 -0
- package/dist/lib/cjs/value-wrapper.d.cts +47 -0
- package/dist/lib/esm/@types/debug.d.mts +21 -0
- package/dist/lib/esm/abort-controller.d.mts +135 -0
- package/dist/lib/esm/abort-controller.mjs +159 -0
- package/dist/lib/esm/aggregate-error.d.mts +24 -0
- package/dist/lib/esm/aggregate-error.mjs +60 -0
- package/dist/lib/esm/array-buffer.d.mts +16 -0
- package/dist/lib/esm/array-buffer.mjs +58 -0
- package/dist/lib/esm/array.d.mts +46 -0
- package/dist/lib/esm/array.mjs +93 -0
- package/dist/lib/esm/async-events.d.mts +456 -0
- package/dist/lib/esm/async-events.mjs +427 -0
- package/dist/lib/esm/async-operation-hook.d.mts +59 -0
- package/dist/lib/esm/async-operation-hook.mjs +71 -0
- package/dist/lib/esm/async.d.mts +414 -0
- package/dist/lib/esm/async.mjs +479 -0
- package/dist/lib/esm/beeper.d.mts +21 -0
- package/dist/lib/esm/beeper.mjs +88 -0
- package/dist/lib/esm/blob.d.mts +59 -0
- package/dist/lib/esm/blob.mjs +121 -0
- package/dist/lib/esm/bytes.d.mts +17 -0
- package/dist/lib/esm/bytes.mjs +76 -0
- package/dist/lib/esm/debug-controller.d.mts +87 -0
- package/dist/lib/esm/debug-controller.mjs +50 -0
- package/dist/lib/esm/debug.d.mts +66 -0
- package/dist/lib/esm/debug.mjs +185 -0
- package/dist/lib/esm/desktop-zip-extractor.d.mts +95 -0
- package/dist/lib/esm/desktop-zip-extractor.mjs +180 -0
- package/dist/lib/esm/disposable.d.mts +387 -0
- package/dist/lib/esm/disposable.mjs +360 -0
- package/dist/lib/esm/enum.d.mts +24 -0
- package/dist/lib/esm/enum.mjs +61 -0
- package/dist/lib/esm/error.d.mts +181 -0
- package/dist/lib/esm/error.mjs +248 -0
- package/dist/lib/esm/function.d.mts +128 -0
- package/dist/lib/esm/function.mjs +96 -0
- package/dist/lib/esm/html-element.d.mts +199 -0
- package/dist/lib/esm/html-element.mjs +291 -0
- package/dist/lib/esm/index.d.mts +33 -0
- package/dist/lib/esm/index.mjs +116 -0
- package/dist/lib/esm/jpeg-metadata.d.mts +42 -0
- package/dist/lib/esm/jpeg-metadata.mjs +189 -0
- package/dist/lib/esm/library.d.mts +96 -0
- package/dist/lib/esm/library.mjs +118 -0
- package/dist/lib/esm/object-utils.d.mts +298 -0
- package/dist/lib/esm/object-utils.mjs +567 -0
- package/dist/lib/esm/path.d.mts +154 -0
- package/dist/lib/esm/path.mjs +139 -0
- package/dist/lib/esm/reg-exp.d.mts +87 -0
- package/dist/lib/esm/reg-exp.mjs +213 -0
- package/dist/lib/esm/string.d.mts +361 -0
- package/dist/lib/esm/string.mjs +274 -0
- package/dist/lib/esm/transformers/date-transformer.d.mts +39 -0
- package/dist/lib/esm/transformers/date-transformer.mjs +91 -0
- package/dist/lib/esm/transformers/group-transformer.d.mts +70 -0
- package/dist/lib/esm/transformers/group-transformer.mjs +138 -0
- package/dist/lib/esm/transformers/index.d.mts +9 -0
- package/dist/lib/esm/transformers/index.mjs +68 -0
- package/dist/lib/esm/transformers/map-transformer.d.mts +41 -0
- package/dist/lib/esm/transformers/map-transformer.mjs +91 -0
- package/dist/lib/esm/transformers/set-transformer.d.mts +39 -0
- package/dist/lib/esm/transformers/set-transformer.mjs +91 -0
- package/dist/lib/esm/transformers/skip-private-property-transformer.d.mts +36 -0
- package/dist/lib/esm/transformers/skip-private-property-transformer.mjs +89 -0
- package/dist/lib/esm/transformers/transformer.d.mts +70 -0
- package/dist/lib/esm/transformers/transformer.mjs +132 -0
- package/dist/lib/esm/transformers/two-way-map-transformer.d.mts +42 -0
- package/dist/lib/esm/transformers/two-way-map-transformer.mjs +92 -0
- package/dist/lib/esm/transformers/typed-transformer.d.mts +39 -0
- package/dist/lib/esm/transformers/typed-transformer.mjs +56 -0
- package/dist/lib/esm/two-way-map.d.mts +101 -0
- package/dist/lib/esm/two-way-map.mjs +170 -0
- package/dist/lib/esm/type-guards.d.mts +84 -0
- package/dist/lib/esm/type-guards.mjs +85 -0
- package/dist/lib/esm/type.d.mts +122 -0
- package/dist/lib/esm/type.mjs +83 -0
- package/dist/lib/esm/typescript-lib-state.d.mts +56 -0
- package/dist/lib/esm/typescript-lib-state.mjs +84 -0
- package/dist/lib/esm/url.d.mts +74 -0
- package/dist/lib/esm/url.mjs +94 -0
- package/dist/lib/esm/value-provider.d.mts +28 -0
- package/dist/lib/esm/value-provider.mjs +62 -0
- package/dist/lib/esm/value-wrapper.d.mts +47 -0
- package/dist/lib/esm/value-wrapper.mjs +106 -0
- package/package.json +111 -13
- package/transformers/date-transformer/package.json +6 -0
- package/transformers/group-transformer/package.json +6 -0
- package/transformers/index/package.json +6 -0
- package/transformers/map-transformer/package.json +6 -0
- package/transformers/package.json +6 -0
- package/transformers/set-transformer/package.json +6 -0
- package/transformers/skip-private-property-transformer/package.json +6 -0
- package/transformers/transformer/package.json +6 -0
- package/transformers/two-way-map-transformer/package.json +6 -0
- package/transformers/typed-transformer/package.json +6 -0
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/*
|
|
2
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
|
+
if you want to view the source, please visit the github repository of this plugin
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
(function () {
|
|
7
|
+
function ensureDisposeSymbols(symbolConstructor = Symbol) {
|
|
8
|
+
symbolConstructor.asyncDispose ??= symbolConstructor.for('Symbol.asyncDispose');
|
|
9
|
+
symbolConstructor.dispose ??= symbolConstructor.for('Symbol.dispose');
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function ensureBrowserProcess() {
|
|
13
|
+
const browserProcess = {
|
|
14
|
+
browser: true,
|
|
15
|
+
cwd() {
|
|
16
|
+
return '/';
|
|
17
|
+
},
|
|
18
|
+
env: {},
|
|
19
|
+
platform: 'android'
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
// eslint-disable-next-line obsidianmd/no-global-this, unicorn/no-unnecessary-global-this -- Must stay `globalThis`-qualified: in the emitted banner a bare `process` is a free identifier, so reading it where the host has none throws a ReferenceError instead of yielding `undefined`. That is the very case this function exists to handle.
|
|
23
|
+
const existingProcess = globalThis.process;
|
|
24
|
+
|
|
25
|
+
if (!existingProcess) {
|
|
26
|
+
// eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
|
|
27
|
+
globalThis.process = browserProcess;
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (existingProcess.versions?.node) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const existingProcessRecord = existingProcess;
|
|
36
|
+
|
|
37
|
+
for (const [key, value] of Object.entries(browserProcess)) {
|
|
38
|
+
existingProcessRecord[key] ??= value;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
existingProcessRecord['browser'] = true;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
(function initEsm() {
|
|
45
|
+
ensureDisposeSymbols();
|
|
46
|
+
ensureBrowserProcess();
|
|
47
|
+
})();
|
|
48
|
+
})();
|
|
49
|
+
|
|
50
|
+
function getFunctionExpressionString($function) {
|
|
51
|
+
const functionString = $function.toString();
|
|
52
|
+
if (FUNCTION_EXPRESSION_RE.test(functionString)) {
|
|
53
|
+
return functionString;
|
|
54
|
+
}
|
|
55
|
+
const asyncMatch = ASYNC_KEYWORD_RE.exec(functionString);
|
|
56
|
+
return asyncMatch ? `async function ${functionString.slice(asyncMatch[0].length)}` : `function ${functionString}`;
|
|
57
|
+
}
|
|
58
|
+
function noop() {
|
|
59
|
+
}
|
|
60
|
+
const noopAsyncSingletonPromise = Promise.resolve();
|
|
61
|
+
function noopAsync() {
|
|
62
|
+
return noopAsyncSingletonPromise;
|
|
63
|
+
}
|
|
64
|
+
function omitAsyncReturnType($function) {
|
|
65
|
+
return async (...$arguments) => {
|
|
66
|
+
await $function(...$arguments);
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
const FUNCTION_EXPRESSION_RE = /^(?:function\b|async\b\s*(?:function\b|\()|\()/;
|
|
70
|
+
const ASYNC_KEYWORD_RE = /^async\b\s*/;
|
|
71
|
+
function cloneFunction($function) {
|
|
72
|
+
return clonedFunction;
|
|
73
|
+
function clonedFunction(...$arguments) {
|
|
74
|
+
return $function.apply(this, $arguments);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function createFunction(params) {
|
|
78
|
+
const argumentNames = params.argumentNames ?? [];
|
|
79
|
+
return new Function(...argumentNames, params.functionBody);
|
|
80
|
+
}
|
|
81
|
+
function omitReturnType($function) {
|
|
82
|
+
return (...$arguments) => {
|
|
83
|
+
$function(...$arguments);
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
export {
|
|
87
|
+
cloneFunction,
|
|
88
|
+
createFunction,
|
|
89
|
+
getFunctionExpressionString,
|
|
90
|
+
noop,
|
|
91
|
+
noopAsync,
|
|
92
|
+
noopAsyncSingletonPromise,
|
|
93
|
+
omitAsyncReturnType,
|
|
94
|
+
omitReturnType
|
|
95
|
+
};
|
|
96
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2Z1bmN0aW9uLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29udGFpbnMgdXRpbGl0eSBmdW5jdGlvbnMgYW5kIHR5cGVzIGZvciB3b3JraW5nIHdpdGggZnVuY3Rpb25zLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGdlbmVyaWMgYXN5bmMgZnVuY3Rpb24uXG4gKlxuICogQHR5cGVQYXJhbSBBcmd1bWVudHMgLSBUaGUgYXJndW1lbnRzIG9mIHRoZSBmdW5jdGlvbi5cbiAqIEB0eXBlUGFyYW0gUmV0dXJuIC0gVGhlIGF3YWl0ZWQgcmV0dXJuIHR5cGUgb2YgdGhlIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgdHlwZSBHZW5lcmljQXN5bmNGdW5jdGlvbjxBcmd1bWVudHMgZXh0ZW5kcyB1bmtub3duW10gPSBuZXZlcltdLCBSZXR1cm4gPSB1bmtub3duPiA9IEdlbmVyaWNGdW5jdGlvbjxBcmd1bWVudHMsIFByb21pc2U8UmV0dXJuPj47XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGdlbmVyaWMgYXN5bmMgdm9pZCBmdW5jdGlvbi5cbiAqXG4gKiBAdHlwZVBhcmFtIEFyZ3VtZW50cyAtIFRoZSBhcmd1bWVudHMgb2YgdGhlIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgdHlwZSBHZW5lcmljQXN5bmNWb2lkRnVuY3Rpb248QXJndW1lbnRzIGV4dGVuZHMgdW5rbm93bltdID0gbmV2ZXJbXT4gPSBHZW5lcmljQXN5bmNGdW5jdGlvbjxBcmd1bWVudHMsIHZvaWQ+O1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBnZW5lcmljIGZ1bmN0aW9uLlxuICpcbiAqIEB0eXBlUGFyYW0gQXJndW1lbnRzIC0gVGhlIGFyZ3VtZW50cyBvZiB0aGUgZnVuY3Rpb24uXG4gKiBAdHlwZVBhcmFtIFJldHVybiAtIFRoZSByZXR1cm4gdHlwZSBvZiB0aGUgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCB0eXBlIEdlbmVyaWNGdW5jdGlvbjxBcmd1bWVudHMgZXh0ZW5kcyB1bmtub3duW10gPSBuZXZlcltdLCBSZXR1cm4gPSB1bmtub3duPiA9ICguLi4kYXJndW1lbnRzOiBBcmd1bWVudHMpID0+IFJldHVybjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgZ2VuZXJpYyBwcm9taXNhYmxlIGZ1bmN0aW9uLlxuICpcbiAqIEB0eXBlUGFyYW0gQXJndW1lbnRzIC0gVGhlIGFyZ3VtZW50cyBvZiB0aGUgZnVuY3Rpb24uXG4gKiBAdHlwZVBhcmFtIFJldHVybiAtIFRoZSBhd2FpdGVkIHJldHVybiB0eXBlIG9mIHRoZSBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgR2VuZXJpY1Byb21pc2FibGVGdW5jdGlvbjxBcmd1bWVudHMgZXh0ZW5kcyB1bmtub3duW10gPSBuZXZlcltdLCBSZXR1cm4gPSB1bmtub3duPiA9IEdlbmVyaWNGdW5jdGlvbjxBcmd1bWVudHMsIFByb21pc2FibGU8UmV0dXJuPj47XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGdlbmVyaWMgcHJvbWlzYWJsZSB2b2lkIGZ1bmN0aW9uLlxuICpcbiAqIEB0eXBlUGFyYW0gQXJndW1lbnRzIC0gVGhlIGFyZ3VtZW50cyBvZiB0aGUgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCB0eXBlIEdlbmVyaWNQcm9taXNhYmxlVm9pZEZ1bmN0aW9uPEFyZ3VtZW50cyBleHRlbmRzIHVua25vd25bXSA9IG5ldmVyW10+ID0gR2VuZXJpY1Byb21pc2FibGVGdW5jdGlvbjxBcmd1bWVudHMsIHZvaWQ+O1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBnZW5lcmljIHZvaWQgZnVuY3Rpb24uXG4gKlxuICogQHR5cGVQYXJhbSBBcmd1bWVudHMgLSBUaGUgYXJndW1lbnRzIG9mIHRoZSBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgR2VuZXJpY1ZvaWRGdW5jdGlvbjxBcmd1bWVudHMgZXh0ZW5kcyB1bmtub3duW10gPSBuZXZlcltdPiA9IEdlbmVyaWNGdW5jdGlvbjxBcmd1bWVudHMsIHZvaWQ+O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgZnVuY3Rpb24gaW50byBhIHN0cmluZyB0aGF0IGlzIGEgdmFsaWQgZnVuY3Rpb24gZXhwcmVzc2lvbi5cbiAqXG4gKiBgRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nKClgIG9uIGEgc2hvcnRoYW5kIG1ldGhvZCBsaWtlIGB7IGZuKCkge30gfWBcbiAqIHJldHVybnMgYFwiZm4oKSB7fVwiYCwgd2hpY2ggaXMgbm90IGEgdmFsaWQgZXhwcmVzc2lvbi5cbiAqIFRoaXMgaGVscGVyIGRldGVjdHMgdGhhdCBmb3JtIGFuZCBwcmVmaXhlcyBpdCB3aXRoIGBmdW5jdGlvbiBgLlxuICpcbiAqIEBwYXJhbSAkZnVuY3Rpb24gLSBUaGUgZnVuY3Rpb24gdG8gY29udmVydC5cbiAqIEByZXR1cm5zIEEgc3RyaW5nIHRoYXQgaXMgYSB2YWxpZCBmdW5jdGlvbiBleHByZXNzaW9uLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlIC0tIFdlIG5lZWQgdG8gdXNlIGBGdW5jdGlvbmAgdHlwZS5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGdW5jdGlvbkV4cHJlc3Npb25TdHJpbmcoJGZ1bmN0aW9uOiBGdW5jdGlvbik6IHN0cmluZyB7XG4gIGNvbnN0IGZ1bmN0aW9uU3RyaW5nID0gJGZ1bmN0aW9uLnRvU3RyaW5nKCk7XG5cbiAgaWYgKEZVTkNUSU9OX0VYUFJFU1NJT05fUkUudGVzdChmdW5jdGlvblN0cmluZykpIHtcbiAgICByZXR1cm4gZnVuY3Rpb25TdHJpbmc7XG4gIH1cblxuICBjb25zdCBhc3luY01hdGNoID0gQVNZTkNfS0VZV09SRF9SRS5leGVjKGZ1bmN0aW9uU3RyaW5nKTtcbiAgcmV0dXJuIGFzeW5jTWF0Y2ggPyBgYXN5bmMgZnVuY3Rpb24gJHtmdW5jdGlvblN0cmluZy5zbGljZShhc3luY01hdGNoWzBdLmxlbmd0aCl9YCA6IGBmdW5jdGlvbiAke2Z1bmN0aW9uU3RyaW5nfWA7XG59XG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IGRvZXMgbm90aGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vb3AoKTogdm9pZCB7XG4gIC8vIERvZXMgbm90aGluZy5cbn1cblxuLyoqXG4gKiBBIHNpbmdsZXRvbiBuby1vcCBwcm9taXNlLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb2JzaWRpYW4tZGV2LXV0aWxzL3ByZWZlci1ub29wLWFzeW5jIC0tIEF2b2lkIGNpcmN1bGFyIHJlZmVyZW5jZS5cbmV4cG9ydCBjb25zdCBub29wQXN5bmNTaW5nbGV0b25Qcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IGRvZXMgbm90aGluZy5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjb21wbGV0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vb3BBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5vb3BBc3luY1NpbmdsZXRvblByb21pc2U7XG59XG5cbi8qKlxuICogTWFrZXMgYW4gYXN5bmMgZnVuY3Rpb24gdGhhdCBjYWxscyB0aGUgb3JpZ2luYWwgYXN5bmMgZnVuY3Rpb24gd2l0aCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzIGFuZCBvbWl0cyB0aGUgcmV0dXJuIHZhbHVlLlxuICpcbiAqIEB0eXBlUGFyYW0gQXJndW1lbnRzIC0gQXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24uXG4gKiBAcGFyYW0gJGZ1bmN0aW9uIC0gRnVuY3Rpb24gdG8gYmUgY2FsbGVkLlxuICogQHJldHVybnMgQW4gYXN5bmMgZnVuY3Rpb24gdGhhdCBjYWxscyB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gd2l0aCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzIGFuZCBvbWl0cyB0aGUgcmV0dXJuIHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb21pdEFzeW5jUmV0dXJuVHlwZTxBcmd1bWVudHMgZXh0ZW5kcyB1bmtub3duW10+KCRmdW5jdGlvbjogR2VuZXJpY0FzeW5jRnVuY3Rpb248QXJndW1lbnRzPik6IEdlbmVyaWNBc3luY1ZvaWRGdW5jdGlvbjxBcmd1bWVudHM+IHtcbiAgcmV0dXJuIGFzeW5jICguLi4kYXJndW1lbnRzOiBBcmd1bWVudHMpID0+IHtcbiAgICBhd2FpdCAkZnVuY3Rpb24oLi4uJGFyZ3VtZW50cyk7XG4gIH07XG59XG5cbi8qKlxuICogTWF0Y2hlcyBzdHJpbmdzIHRoYXQgYXJlIGFscmVhZHkgdmFsaWQgZnVuY3Rpb24gZXhwcmVzc2lvbnM6XG4gKiAtIGBmdW5jdGlvbiAuLi5gIChrZXl3b3JkLCBub3QgaWRlbnRpZmllciBsaWtlIGBmdW5jdGlvbjFgKVxuICogLSBgKGAgKGFycm93IGZ1bmN0aW9uKVxuICogLSBgYXN5bmNcXGJgIGZvbGxvd2VkIGJ5IGBmdW5jdGlvblxcYmAgb3IgYChgIChhc3luYyBmdW5jdGlvbi9hcnJvdylcbiAqL1xuY29uc3QgRlVOQ1RJT05fRVhQUkVTU0lPTl9SRSA9IC9eKD86ZnVuY3Rpb25cXGJ8YXN5bmNcXGJcXHMqKD86ZnVuY3Rpb25cXGJ8XFwoKXxcXCgpLztcblxuLyoqXG4gKiBNYXRjaGVzIHRoZSBgYXN5bmNgIGtleXdvcmQgKHdvcmQgYm91bmRhcnksIG5vdCBgYXN5bmMxYCkgZm9sbG93ZWQgYnkgb3B0aW9uYWwgd2hpdGVzcGFjZS5cbiAqIFVzZWQgdG8gc3RyaXAgdGhlIGBhc3luY2AgcHJlZml4IGZyb20gYXN5bmMgc2hvcnRoYW5kIG1ldGhvZHMgYmVmb3JlIHJlLWFkZGluZyBgYXN5bmMgZnVuY3Rpb25gLlxuICovXG5jb25zdCBBU1lOQ19LRVlXT1JEX1JFID0gL15hc3luY1xcYlxccyovO1xuXG50eXBlIEFyZ3VtZW50TmFtZXNPZjxUIGV4dGVuZHMgR2VuZXJpY0Z1bmN0aW9uPiA9IE1hcFRvQXJndW1lbnROYW1lczxQYXJhbWV0ZXJzPFQ+PjtcblxuaW50ZXJmYWNlIENyZWF0ZUZ1bmN0aW9uQXJndW1lbnRsZXNzUGFyYW1zIHtcbiAgcmVhZG9ubHkgZnVuY3Rpb25Cb2R5OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBDcmVhdGVGdW5jdGlvblBhcmFtczxURnVuY3Rpb24gZXh0ZW5kcyBHZW5lcmljRnVuY3Rpb24+IGV4dGVuZHMgQ3JlYXRlRnVuY3Rpb25Bcmd1bWVudGxlc3NQYXJhbXMge1xuICByZWFkb25seSBhcmd1bWVudE5hbWVzOiBBcmd1bWVudE5hbWVzT2Y8VEZ1bmN0aW9uPjtcbn1cblxudHlwZSBNYXBUb0FyZ3VtZW50TmFtZXM8VEFyZ3VtZW50cyBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXT4gPSB7XG4gIHJlYWRvbmx5IFtLIGluIGtleW9mIFRBcmd1bWVudHNdOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIENsb25lIGEgZnVuY3Rpb24gYnkgY3JlYXRpbmcgYSBuZXcgZnVuY3Rpb24gdGhhdCBjYWxscyB0aGUgb3JpZ2luYWwgZnVuY3Rpb24uXG4gKlxuICogVGhpcyBpcyB1c2VmdWwgZm9yIGNyZWF0aW5nIGEgbmV3IGluc3RhbmNlIG9mIGEgZnVuY3Rpb24gdGhhdCBoYXMgdGhlIHNhbWUgYmVoYXZpb3IgYnV0IGlzIG5vdCBzdHJpY3RseSBlcXVhbCB0byB0aGUgb3JpZ2luYWwgZnVuY3Rpb24uXG4gKlxuICogQHR5cGVQYXJhbSBURnVuY3Rpb24gLSBUaGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24gdG8gY2xvbmUuXG4gKiBAcGFyYW0gJGZ1bmN0aW9uIC0gVGhlIGZ1bmN0aW9uIHRvIGNsb25lLlxuICogQHJldHVybnMgQSBuZXcgZnVuY3Rpb24gdGhhdCBoYXMgdGhlIHNhbWUgYmVoYXZpb3IgYXMgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xvbmVGdW5jdGlvbjxURnVuY3Rpb24gZXh0ZW5kcyBHZW5lcmljRnVuY3Rpb24+KCRmdW5jdGlvbjogVEZ1bmN0aW9uKTogVEZ1bmN0aW9uIHtcbiAgcmV0dXJuIGNsb25lZEZ1bmN0aW9uIGFzIFRGdW5jdGlvbjtcblxuICBmdW5jdGlvbiBjbG9uZWRGdW5jdGlvbih0aGlzOiBUaGlzUGFyYW1ldGVyVHlwZTxURnVuY3Rpb24+LCAuLi4kYXJndW1lbnRzOiBQYXJhbWV0ZXJzPFRGdW5jdGlvbj4pOiBSZXR1cm5UeXBlPFRGdW5jdGlvbj4ge1xuICAgIHJldHVybiAkZnVuY3Rpb24uYXBwbHkodGhpcywgJGFyZ3VtZW50cykgYXMgUmV0dXJuVHlwZTxURnVuY3Rpb24+O1xuICB9XG59XG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiBmcm9tIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEZ1bmN0aW9uIGlzIGFyZ3VtZW50bGVzcywgc28gYGFyZ05hbWVzYCBpcyBub3QgbmVlZGVkLlxuICpcbiAqIEB0eXBlUGFyYW0gVEZ1bmN0aW9uIC0gVGhlIHR5cGUgb2YgdGhlIGZ1bmN0aW9uIHRvIGNyZWF0ZS5cbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyB0byBjcmVhdGUgdGhlIGZ1bmN0aW9uIHdpdGguXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIGNyZWF0ZWQgZnJvbSB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCByZXR1cm4gdHlwZS5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGdW5jdGlvbjxURnVuY3Rpb24gZXh0ZW5kcyAoKSA9PiB1bmtub3duPihwYXJhbXM6IENyZWF0ZUZ1bmN0aW9uQXJndW1lbnRsZXNzUGFyYW1zKTogVEZ1bmN0aW9uO1xuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gZnJvbSB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy5cbiAqXG4gKiBGdW5jdGlvbiBoYXMgYXJndW1lbnRzLCBzbyBgYXJnTmFtZXNgIGlzIHJlcXVpcmVkLlxuICpcbiAqIEB0eXBlUGFyYW0gVEZ1bmN0aW9uIC0gVGhlIHR5cGUgb2YgdGhlIGZ1bmN0aW9uIHRvIGNyZWF0ZS5cbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyB0byBjcmVhdGUgdGhlIGZ1bmN0aW9uIHdpdGguXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIGNyZWF0ZWQgZnJvbSB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uPFRGdW5jdGlvbiBleHRlbmRzIEdlbmVyaWNGdW5jdGlvbj4ocGFyYW1zOiBDcmVhdGVGdW5jdGlvblBhcmFtczxURnVuY3Rpb24+KTogVEZ1bmN0aW9uO1xuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gZnJvbSB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy5cbiAqXG4gKiBAdHlwZVBhcmFtIFRGdW5jdGlvbiAtIFRoZSB0eXBlIG9mIHRoZSBmdW5jdGlvbiB0byBjcmVhdGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSB0aGUgZnVuY3Rpb24gd2l0aC5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gY3JlYXRlZCBmcm9tIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRnVuY3Rpb248VEZ1bmN0aW9uIGV4dGVuZHMgR2VuZXJpY0Z1bmN0aW9uPihcbiAgcGFyYW1zOiBDcmVhdGVGdW5jdGlvbkFyZ3VtZW50bGVzc1BhcmFtcyAmIFBhcnRpYWw8Q3JlYXRlRnVuY3Rpb25QYXJhbXM8VEZ1bmN0aW9uPj5cbik6IFRGdW5jdGlvbiB7XG4gIGNvbnN0IGFyZ3VtZW50TmFtZXMgPSBwYXJhbXMuYXJndW1lbnROYW1lcyA/PyBbXTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW1wbGllZC1ldmFsIC0tIE5lZWQgZnVuY3Rpb24gY29uc3RydWN0b3JcbiAgcmV0dXJuIG5ldyBGdW5jdGlvbiguLi5hcmd1bWVudE5hbWVzLCBwYXJhbXMuZnVuY3Rpb25Cb2R5KSBhcyBURnVuY3Rpb247XG59XG5cbi8qKlxuICogTWFrZXMgYSBmdW5jdGlvbiB0aGF0IGNhbGxzIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiB3aXRoIHRoZSBwcm92aWRlZCBhcmd1bWVudHMgYW5kIG9taXRzIHRoZSByZXR1cm4gdmFsdWUuXG4gKlxuICogQHR5cGVQYXJhbSBBcmd1bWVudHMgLSBBcmd1bWVudHMgdG8gYmUgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbi5cbiAqIEBwYXJhbSAkZnVuY3Rpb24gLSBGdW5jdGlvbiB0byBiZSBjYWxsZWQuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgY2FsbHMgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIHdpdGggdGhlIHByb3ZpZGVkIGFyZ3VtZW50cyBhbmQgb21pdHMgdGhlIHJldHVybiB2YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9taXRSZXR1cm5UeXBlPEFyZ3VtZW50cyBleHRlbmRzIHVua25vd25bXT4oJGZ1bmN0aW9uOiBHZW5lcmljRnVuY3Rpb248QXJndW1lbnRzPik6IEdlbmVyaWNWb2lkRnVuY3Rpb248QXJndW1lbnRzPiB7XG4gIHJldHVybiAoLi4uJGFyZ3VtZW50czogQXJndW1lbnRzKSA9PiB7XG4gICAgJGZ1bmN0aW9uKC4uLiRhcmd1bWVudHMpO1xuICB9O1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWdFTyxTQUFTLDRCQUE0QixXQUE2QjtBQUN2RSxRQUFNLGlCQUFpQixVQUFVLFNBQVM7QUFFMUMsTUFBSSx1QkFBdUIsS0FBSyxjQUFjLEdBQUc7QUFDL0MsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLGFBQWEsaUJBQWlCLEtBQUssY0FBYztBQUN2RCxTQUFPLGFBQWEsa0JBQWtCLGVBQWUsTUFBTSxXQUFXLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxZQUFZLGNBQWM7QUFDakg7QUFLTyxTQUFTLE9BQWE7QUFFN0I7QUFNTyxNQUFNLDRCQUE0QixRQUFRLFFBQVE7QUFPbEQsU0FBUyxZQUEyQjtBQUN6QyxTQUFPO0FBQ1Q7QUFTTyxTQUFTLG9CQUFpRCxXQUFpRjtBQUNoSixTQUFPLFVBQVUsZUFBMEI7QUFDekMsVUFBTSxVQUFVLEdBQUcsVUFBVTtBQUFBLEVBQy9CO0FBQ0Y7QUFRQSxNQUFNLHlCQUF5QjtBQU0vQixNQUFNLG1CQUFtQjtBQXlCbEIsU0FBUyxjQUFpRCxXQUFpQztBQUNoRyxTQUFPO0FBRVAsV0FBUyxrQkFBc0QsWUFBMEQ7QUFDdkgsV0FBTyxVQUFVLE1BQU0sTUFBTSxVQUFVO0FBQUEsRUFDekM7QUFDRjtBQThCTyxTQUFTLGVBQ2QsUUFDVztBQUNYLFFBQU0sZ0JBQWdCLE9BQU8saUJBQWlCLENBQUM7QUFFL0MsU0FBTyxJQUFJLFNBQVMsR0FBRyxlQUFlLE9BQU8sWUFBWTtBQUMzRDtBQVNPLFNBQVMsZUFBNEMsV0FBdUU7QUFDakksU0FBTyxJQUFJLGVBQTBCO0FBQ25DLGNBQVUsR0FBRyxVQUFVO0FBQUEsRUFDekI7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/// <reference path="./library.d.mts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* Obsidian-runtime-agnostic helpers for working with HTML elements.
|
|
6
|
+
*
|
|
7
|
+
* Several helpers here mirror behavior that the Obsidian runtime injects onto the DOM prototypes
|
|
8
|
+
* (`createEl`/`createDiv`/`createSpan`/`createSvg`/`createFragment`, `Node.prototype.instanceOf`,
|
|
9
|
+
* `Element.prototype.setText`/`setAttrs`). To stay independent of the Obsidian runtime, that behavior
|
|
10
|
+
* is reimplemented here in standard DOM, ported from Obsidian's own implementation in
|
|
11
|
+
* `obsidian.asar/enhance.js`. See the `obsidian-versions` project; revalidate the port when Obsidian
|
|
12
|
+
* changes `enhance.js` (there is a reminder in `CLAUDE.md`).
|
|
13
|
+
*/
|
|
14
|
+
import type { Promisable } from 'type-fest';
|
|
15
|
+
/**
|
|
16
|
+
* The element information {@link createElAsync} and its siblings apply: the element-type-agnostic subset of
|
|
17
|
+
* Obsidian's `DomElementInfo`, declared here so this module needs no Obsidian typings. An Obsidian
|
|
18
|
+
* `DomElementInfo` value is assignable to it.
|
|
19
|
+
*/
|
|
20
|
+
export interface CreateHtmlElementInfo {
|
|
21
|
+
/**
|
|
22
|
+
* The attributes to set; `null` removes the attribute.
|
|
23
|
+
*/
|
|
24
|
+
readonly attr?: Record<string, boolean | null | number | string>;
|
|
25
|
+
/**
|
|
26
|
+
* The CSS class or classes.
|
|
27
|
+
*/
|
|
28
|
+
readonly cls?: string | string[];
|
|
29
|
+
/**
|
|
30
|
+
* The parent to insert the element into.
|
|
31
|
+
*/
|
|
32
|
+
readonly parent?: Node;
|
|
33
|
+
/**
|
|
34
|
+
* Whether to insert the element as the parent's first child instead of its last.
|
|
35
|
+
*/
|
|
36
|
+
readonly prepend?: boolean;
|
|
37
|
+
/**
|
|
38
|
+
* The text content.
|
|
39
|
+
*/
|
|
40
|
+
readonly text?: DocumentFragment | string;
|
|
41
|
+
/**
|
|
42
|
+
* The tooltip text.
|
|
43
|
+
*/
|
|
44
|
+
readonly title?: string;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* The SVG element information {@link createSvgAsync} applies: the subset of Obsidian's `SvgElementInfo` it
|
|
48
|
+
* supports, declared here so this module needs no Obsidian typings.
|
|
49
|
+
*/
|
|
50
|
+
export interface CreateSvgElementInfo {
|
|
51
|
+
/**
|
|
52
|
+
* The attributes to set; `null` removes the attribute.
|
|
53
|
+
*/
|
|
54
|
+
readonly attr?: Record<string, boolean | null | number | string>;
|
|
55
|
+
/**
|
|
56
|
+
* The CSS class or classes.
|
|
57
|
+
*/
|
|
58
|
+
readonly cls?: string | string[];
|
|
59
|
+
/**
|
|
60
|
+
* The parent to insert the element into.
|
|
61
|
+
*/
|
|
62
|
+
readonly parent?: Node;
|
|
63
|
+
/**
|
|
64
|
+
* Whether to insert the element as the parent's first child instead of its last.
|
|
65
|
+
*/
|
|
66
|
+
readonly prepend?: boolean;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* A HTML element that can be validated.
|
|
70
|
+
*/
|
|
71
|
+
export interface ValidatorElement extends HTMLElement {
|
|
72
|
+
/**
|
|
73
|
+
* Checks the validity of the element.
|
|
74
|
+
*
|
|
75
|
+
* @returns `true` if the element is valid, `false` otherwise.
|
|
76
|
+
*/
|
|
77
|
+
checkValidity: () => boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Reports the validity of the element.
|
|
80
|
+
*/
|
|
81
|
+
reportValidity: () => boolean;
|
|
82
|
+
/**
|
|
83
|
+
* Sets a custom error message on the element.
|
|
84
|
+
*
|
|
85
|
+
* @param error - The error message to set on the element.
|
|
86
|
+
*/
|
|
87
|
+
setCustomValidity: (error: string) => void;
|
|
88
|
+
/**
|
|
89
|
+
* An error message of the element.
|
|
90
|
+
*/
|
|
91
|
+
readonly validationMessage: string;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Creates a div asynchronously.
|
|
95
|
+
*
|
|
96
|
+
* @param o - The element information.
|
|
97
|
+
* @param callback - The callback to call when the div is created.
|
|
98
|
+
* @returns A {@link Promise} that resolves to the div.
|
|
99
|
+
*/
|
|
100
|
+
export declare function createDivAsync(o?: CreateHtmlElementInfo | string, callback?: (element: HTMLDivElement) => Promisable<void>): Promise<HTMLDivElement>;
|
|
101
|
+
/**
|
|
102
|
+
* Creates an element asynchronously.
|
|
103
|
+
*
|
|
104
|
+
* @typeParam K - The tag name key from `HTMLElementTagNameMap`.
|
|
105
|
+
* @param tag - The tag name of the element to create.
|
|
106
|
+
* @param o - The element information.
|
|
107
|
+
* @param callback - The callback to call when the element is created.
|
|
108
|
+
* @returns A {@link Promise} that resolves to the element.
|
|
109
|
+
* @remarks Not refactored to parameter-object pattern, to keep the parity with Obsidian's `createEl` (or createSvg, correspondingly).
|
|
110
|
+
*/
|
|
111
|
+
export declare function createElAsync<K extends keyof HTMLElementTagNameMap>(tag: K, o?: CreateHtmlElementInfo | string, callback?: (element: HTMLElementTagNameMap[K]) => Promisable<void>): Promise<HTMLElementTagNameMap[K]>;
|
|
112
|
+
/**
|
|
113
|
+
* Creates a DocumentFragment asynchronously.
|
|
114
|
+
*
|
|
115
|
+
* @param callback - The callback to call when the DocumentFragment is created.
|
|
116
|
+
* @returns A {@link Promise} that resolves to the DocumentFragment.
|
|
117
|
+
*/
|
|
118
|
+
export declare function createFragmentAsync(callback?: (element: DocumentFragment) => Promisable<void>): Promise<DocumentFragment>;
|
|
119
|
+
/**
|
|
120
|
+
* Creates a span asynchronously.
|
|
121
|
+
*
|
|
122
|
+
* @param o - The element information.
|
|
123
|
+
* @param callback - The callback to call when the span is created.
|
|
124
|
+
* @returns A {@link Promise} that resolves to the span.
|
|
125
|
+
*/
|
|
126
|
+
export declare function createSpanAsync(o?: CreateHtmlElementInfo | string, callback?: (element: HTMLSpanElement) => Promisable<void>): Promise<HTMLSpanElement>;
|
|
127
|
+
/**
|
|
128
|
+
* Creates a svg asynchronously.
|
|
129
|
+
*
|
|
130
|
+
* @typeParam K - The tag name key from `SVGElementTagNameMap`.
|
|
131
|
+
* @param tag - The tag name of the svg to create.
|
|
132
|
+
* @param o - The svg information.
|
|
133
|
+
* @param callback - The callback to call when the svg is created.
|
|
134
|
+
* @returns A {@link Promise} that resolves to the svg.
|
|
135
|
+
* @remarks Not refactored to parameter-object pattern, to keep the parity with Obsidian's `createSvg` (or createEl, correspondingly).
|
|
136
|
+
*/
|
|
137
|
+
export declare function createSvgAsync<K extends keyof SVGElementTagNameMap>(tag: K, o?: CreateSvgElementInfo | string, callback?: (element: SVGElementTagNameMap[K]) => Promisable<void>): Promise<SVGElementTagNameMap[K]>;
|
|
138
|
+
/**
|
|
139
|
+
* Ensures that the given element is loaded.
|
|
140
|
+
*
|
|
141
|
+
* @param element - The element to ensure is loaded.
|
|
142
|
+
* @returns A {@link Promise} that resolves when the element is loaded.
|
|
143
|
+
*/
|
|
144
|
+
export declare function ensureLoaded(element: Element): Promise<void>;
|
|
145
|
+
/**
|
|
146
|
+
* Gets the window a document belongs to.
|
|
147
|
+
*
|
|
148
|
+
* A document is the one node whose `ownerDocument` is `null`, so the `ownerDocument`-chasing lookup
|
|
149
|
+
* used for ordinary nodes resolves a document to the wrong window. Reading `defaultView` off the
|
|
150
|
+
* document itself is what keeps a pop-out window's coordinates measured against that window.
|
|
151
|
+
*
|
|
152
|
+
* @param doc - The document to get the window of.
|
|
153
|
+
* @returns The window the document belongs to.
|
|
154
|
+
* @throws An {@link Error} if the document is detached and therefore has no window.
|
|
155
|
+
*/
|
|
156
|
+
export declare function getDocumentWindow(doc: Document): Window;
|
|
157
|
+
/**
|
|
158
|
+
* Gets the z-index of the given element.
|
|
159
|
+
*
|
|
160
|
+
* @param element - The element to get the z-index of.
|
|
161
|
+
* @returns The z-index of the element.
|
|
162
|
+
*/
|
|
163
|
+
export declare function getZIndex(element: Element): number;
|
|
164
|
+
/**
|
|
165
|
+
* Checks if the element is visible in the offset parent.
|
|
166
|
+
*
|
|
167
|
+
* @param element - The element to check.
|
|
168
|
+
* @returns `true` if the element is visible in the offset parent, `false` otherwise.
|
|
169
|
+
*/
|
|
170
|
+
export declare function isElementVisibleInOffsetParent(element: HTMLElement): boolean;
|
|
171
|
+
/**
|
|
172
|
+
* Checks if the element is loaded.
|
|
173
|
+
*
|
|
174
|
+
* @param element - The element to check.
|
|
175
|
+
* @returns `true` if the element is loaded, `false` otherwise.
|
|
176
|
+
*/
|
|
177
|
+
export declare function isLoaded(element: Element): boolean;
|
|
178
|
+
/**
|
|
179
|
+
* Adds an event listener to the ancestor nodes of the given node.
|
|
180
|
+
*
|
|
181
|
+
* @param node - The node to add the event listener to.
|
|
182
|
+
* @param callback - The callback to call when the event is triggered.
|
|
183
|
+
* @returns A {@link Disposable} that removes the event listeners when disposed, for use with `using`.
|
|
184
|
+
*/
|
|
185
|
+
export declare function onAncestorScrollOrResize(node: Node, callback: () => void): Disposable;
|
|
186
|
+
/**
|
|
187
|
+
* Converts a number to a string with 'px' appended.
|
|
188
|
+
*
|
|
189
|
+
* @param value - The number to convert.
|
|
190
|
+
* @returns The number as a string with 'px' appended.
|
|
191
|
+
*/
|
|
192
|
+
export declare function toPx(value: number): string;
|
|
193
|
+
/**
|
|
194
|
+
* Waits until the given element is connected to the DOM.
|
|
195
|
+
*
|
|
196
|
+
* @param element - The element to check.
|
|
197
|
+
* @returns A promise that resolves when the element is connected.
|
|
198
|
+
*/
|
|
199
|
+
export declare function waitUntilConnected(element: HTMLElement): Promise<void>;
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
/*
|
|
2
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
|
+
if you want to view the source, please visit the github repository of this plugin
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
(function () {
|
|
7
|
+
function ensureDisposeSymbols(symbolConstructor = Symbol) {
|
|
8
|
+
symbolConstructor.asyncDispose ??= symbolConstructor.for('Symbol.asyncDispose');
|
|
9
|
+
symbolConstructor.dispose ??= symbolConstructor.for('Symbol.dispose');
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function ensureBrowserProcess() {
|
|
13
|
+
const browserProcess = {
|
|
14
|
+
browser: true,
|
|
15
|
+
cwd() {
|
|
16
|
+
return '/';
|
|
17
|
+
},
|
|
18
|
+
env: {},
|
|
19
|
+
platform: 'android'
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
// eslint-disable-next-line obsidianmd/no-global-this, unicorn/no-unnecessary-global-this -- Must stay `globalThis`-qualified: in the emitted banner a bare `process` is a free identifier, so reading it where the host has none throws a ReferenceError instead of yielding `undefined`. That is the very case this function exists to handle.
|
|
23
|
+
const existingProcess = globalThis.process;
|
|
24
|
+
|
|
25
|
+
if (!existingProcess) {
|
|
26
|
+
// eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
|
|
27
|
+
globalThis.process = browserProcess;
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (existingProcess.versions?.node) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const existingProcessRecord = existingProcess;
|
|
36
|
+
|
|
37
|
+
for (const [key, value] of Object.entries(browserProcess)) {
|
|
38
|
+
existingProcessRecord[key] ??= value;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
existingProcessRecord['browser'] = true;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
(function initEsm() {
|
|
45
|
+
ensureDisposeSymbols();
|
|
46
|
+
ensureBrowserProcess();
|
|
47
|
+
})();
|
|
48
|
+
})();
|
|
49
|
+
|
|
50
|
+
import { CallbackDisposable } from "./disposable.mjs";
|
|
51
|
+
import { ensureNonNullable } from "./type-guards.mjs";
|
|
52
|
+
const SVG_NAMESPACE = "http://www.w3.org/2000/svg";
|
|
53
|
+
async function createDivAsync(o, callback) {
|
|
54
|
+
const div = createHtmlElement("div", o);
|
|
55
|
+
await callback?.(div);
|
|
56
|
+
return div;
|
|
57
|
+
}
|
|
58
|
+
async function createElAsync(tag, o, callback) {
|
|
59
|
+
const element = createHtmlElement(tag, o);
|
|
60
|
+
await callback?.(element);
|
|
61
|
+
return element;
|
|
62
|
+
}
|
|
63
|
+
async function createFragmentAsync(callback) {
|
|
64
|
+
const fragment = document.createDocumentFragment();
|
|
65
|
+
await callback?.(fragment);
|
|
66
|
+
return fragment;
|
|
67
|
+
}
|
|
68
|
+
async function createSpanAsync(o, callback) {
|
|
69
|
+
const span = createHtmlElement("span", o);
|
|
70
|
+
await callback?.(span);
|
|
71
|
+
return span;
|
|
72
|
+
}
|
|
73
|
+
async function createSvgAsync(tag, o, callback) {
|
|
74
|
+
const svg = createSvgElement(tag, o);
|
|
75
|
+
await callback?.(svg);
|
|
76
|
+
return svg;
|
|
77
|
+
}
|
|
78
|
+
async function ensureLoaded(element) {
|
|
79
|
+
if (isLoaded(element)) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const win = getNodeWindow(element);
|
|
83
|
+
if (isInstanceOf(element, win.HTMLBodyElement) || isInstanceOf(element, win.HTMLImageElement) || isInstanceOf(element, win.HTMLIFrameElement) || isInstanceOf(element, win.HTMLEmbedElement) || isInstanceOf(element, win.HTMLLinkElement) || isInstanceOf(element, win.HTMLObjectElement) || isInstanceOf(element, win.HTMLStyleElement) || isInstanceOf(element, win.HTMLTrackElement)) {
|
|
84
|
+
await new Promise((resolve) => {
|
|
85
|
+
element.addEventListener("load", resolve);
|
|
86
|
+
element.addEventListener("error", resolve);
|
|
87
|
+
});
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
await Promise.all(getLoadableElements(element).map((loadableElement) => ensureLoaded(loadableElement)));
|
|
91
|
+
}
|
|
92
|
+
function getDocumentWindow(doc) {
|
|
93
|
+
return ensureNonNullable(doc.defaultView, "The document has no window");
|
|
94
|
+
}
|
|
95
|
+
function getZIndex(element) {
|
|
96
|
+
let element2 = element;
|
|
97
|
+
while (element2) {
|
|
98
|
+
const zIndexString = getComputedStyle(element2).zIndex;
|
|
99
|
+
const zIndex = Number.parseInt(zIndexString, 10);
|
|
100
|
+
if (!Number.isNaN(zIndex)) {
|
|
101
|
+
return zIndex;
|
|
102
|
+
}
|
|
103
|
+
element2 = element2.parentElement;
|
|
104
|
+
}
|
|
105
|
+
return 0;
|
|
106
|
+
}
|
|
107
|
+
function isElementVisibleInOffsetParent(element) {
|
|
108
|
+
const parentElement = element.offsetParent;
|
|
109
|
+
if (!parentElement) {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
const elementRect = element.getBoundingClientRect();
|
|
113
|
+
const parentElementRect = parentElement.getBoundingClientRect();
|
|
114
|
+
return parentElementRect.top <= elementRect.top && elementRect.bottom <= parentElementRect.bottom && parentElementRect.left <= elementRect.left && elementRect.right <= parentElementRect.right;
|
|
115
|
+
}
|
|
116
|
+
function isLoaded(element) {
|
|
117
|
+
const win = getNodeWindow(element);
|
|
118
|
+
if (isInstanceOf(element, win.HTMLBodyElement)) {
|
|
119
|
+
const readyState = element.ownerDocument.readyState;
|
|
120
|
+
return readyState === "complete" || readyState === "interactive";
|
|
121
|
+
}
|
|
122
|
+
if (isInstanceOf(element, win.HTMLImageElement)) {
|
|
123
|
+
return element.complete && element.naturalWidth > 0;
|
|
124
|
+
}
|
|
125
|
+
if (isInstanceOf(element, win.HTMLIFrameElement)) {
|
|
126
|
+
return !!element.contentDocument;
|
|
127
|
+
}
|
|
128
|
+
if (isInstanceOf(element, win.HTMLEmbedElement)) {
|
|
129
|
+
return !!element.getSVGDocument();
|
|
130
|
+
}
|
|
131
|
+
if (isInstanceOf(element, win.HTMLLinkElement)) {
|
|
132
|
+
return element.rel !== "stylesheet" || element.sheet !== null;
|
|
133
|
+
}
|
|
134
|
+
if (isInstanceOf(element, win.HTMLObjectElement)) {
|
|
135
|
+
return !!element.contentDocument || !!element.getSVGDocument();
|
|
136
|
+
}
|
|
137
|
+
if (isInstanceOf(element, win.HTMLScriptElement)) {
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
if (isInstanceOf(element, win.HTMLStyleElement)) {
|
|
141
|
+
return !!element.sheet;
|
|
142
|
+
}
|
|
143
|
+
if (isInstanceOf(element, win.HTMLTrackElement)) {
|
|
144
|
+
const READY_STATE_LOADED = 2;
|
|
145
|
+
return element.readyState === READY_STATE_LOADED;
|
|
146
|
+
}
|
|
147
|
+
return getLoadableElements(element).every((loadableElement) => isLoaded(loadableElement));
|
|
148
|
+
}
|
|
149
|
+
function onAncestorScrollOrResize(node, callback) {
|
|
150
|
+
const win = getNodeWindow(node);
|
|
151
|
+
const ancestors = [node.ownerDocument ?? win.document, win];
|
|
152
|
+
let currentNode = node;
|
|
153
|
+
while (currentNode) {
|
|
154
|
+
ancestors.push(currentNode);
|
|
155
|
+
currentNode = currentNode.parentNode;
|
|
156
|
+
}
|
|
157
|
+
let isEventTriggered = false;
|
|
158
|
+
for (const ancestor of ancestors) {
|
|
159
|
+
ancestor.addEventListener("scroll", callbackSmooth, { capture: true });
|
|
160
|
+
ancestor.addEventListener("resize", callbackSmooth, { capture: true });
|
|
161
|
+
}
|
|
162
|
+
return new CallbackDisposable({
|
|
163
|
+
callback: () => {
|
|
164
|
+
for (const ancestor of ancestors) {
|
|
165
|
+
ancestor.removeEventListener("scroll", callbackSmooth, { capture: true });
|
|
166
|
+
ancestor.removeEventListener("resize", callbackSmooth, { capture: true });
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
function callbackSmooth() {
|
|
171
|
+
if (isEventTriggered) {
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
isEventTriggered = true;
|
|
175
|
+
win.requestAnimationFrame(() => {
|
|
176
|
+
try {
|
|
177
|
+
callback();
|
|
178
|
+
} finally {
|
|
179
|
+
isEventTriggered = false;
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
function toPx(value) {
|
|
185
|
+
return `${String(value)}px`;
|
|
186
|
+
}
|
|
187
|
+
function waitUntilConnected(element) {
|
|
188
|
+
return new Promise((resolve) => {
|
|
189
|
+
if (element.isConnected) {
|
|
190
|
+
resolve();
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
const ownerDocument = element.ownerDocument;
|
|
194
|
+
const observer = new (getNodeWindow(element)).MutationObserver(() => {
|
|
195
|
+
if (!element.isConnected) {
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
observer.disconnect();
|
|
199
|
+
resolve();
|
|
200
|
+
});
|
|
201
|
+
observer.observe(ownerDocument, { childList: true, subtree: true });
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
function applyDomElementInfo(element, o) {
|
|
205
|
+
const info = typeof o === "string" ? { cls: o } : o ?? {};
|
|
206
|
+
if (info.cls !== void 0) {
|
|
207
|
+
element.className = Array.isArray(info.cls) ? info.cls.join(" ") : info.cls;
|
|
208
|
+
}
|
|
209
|
+
if (info.text !== void 0) {
|
|
210
|
+
setElementText(element, info.text);
|
|
211
|
+
}
|
|
212
|
+
if (info.attr) {
|
|
213
|
+
setElementAttributes(element, info.attr);
|
|
214
|
+
}
|
|
215
|
+
if (info.title !== void 0) {
|
|
216
|
+
element.title = info.title;
|
|
217
|
+
}
|
|
218
|
+
insertIntoParent(element, info);
|
|
219
|
+
}
|
|
220
|
+
function createHtmlElement(tag, o) {
|
|
221
|
+
const element = document.createElement(tag);
|
|
222
|
+
applyDomElementInfo(element, o);
|
|
223
|
+
return element;
|
|
224
|
+
}
|
|
225
|
+
function createSvgElement(tag, o) {
|
|
226
|
+
const svg = document.createElementNS(SVG_NAMESPACE, tag);
|
|
227
|
+
const info = typeof o === "string" ? { cls: o } : o ?? {};
|
|
228
|
+
if (info.cls !== void 0) {
|
|
229
|
+
if (Array.isArray(info.cls)) {
|
|
230
|
+
svg.classList.add(...info.cls);
|
|
231
|
+
} else {
|
|
232
|
+
svg.classList.add(info.cls);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
if (info.attr) {
|
|
236
|
+
setElementAttributes(svg, info.attr);
|
|
237
|
+
}
|
|
238
|
+
insertIntoParent(svg, info);
|
|
239
|
+
return svg;
|
|
240
|
+
}
|
|
241
|
+
function getLoadableElements(element) {
|
|
242
|
+
return [...element.querySelectorAll("body, img, iframe, embed, link, object, script, style, track")];
|
|
243
|
+
}
|
|
244
|
+
function getNodeWindow(node) {
|
|
245
|
+
return node.ownerDocument?.defaultView ?? window;
|
|
246
|
+
}
|
|
247
|
+
function insertIntoParent(element, info) {
|
|
248
|
+
if (!info.parent) {
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
if (info.prepend) {
|
|
252
|
+
info.parent.insertBefore(element, info.parent.firstChild);
|
|
253
|
+
} else {
|
|
254
|
+
info.parent.appendChild(element);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
function isInstanceOf(node, ctor) {
|
|
258
|
+
return node instanceof ctor;
|
|
259
|
+
}
|
|
260
|
+
function setElementAttributes(element, attribute) {
|
|
261
|
+
for (const [name, value] of Object.entries(attribute)) {
|
|
262
|
+
if (value === null) {
|
|
263
|
+
element.removeAttribute(name);
|
|
264
|
+
} else {
|
|
265
|
+
element.setAttribute(name, String(value));
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
function setElementText(element, text) {
|
|
270
|
+
if (text instanceof DocumentFragment) {
|
|
271
|
+
element.replaceChildren(text);
|
|
272
|
+
} else {
|
|
273
|
+
element.textContent = text;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
export {
|
|
277
|
+
createDivAsync,
|
|
278
|
+
createElAsync,
|
|
279
|
+
createFragmentAsync,
|
|
280
|
+
createSpanAsync,
|
|
281
|
+
createSvgAsync,
|
|
282
|
+
ensureLoaded,
|
|
283
|
+
getDocumentWindow,
|
|
284
|
+
getZIndex,
|
|
285
|
+
isElementVisibleInOffsetParent,
|
|
286
|
+
isLoaded,
|
|
287
|
+
onAncestorScrollOrResize,
|
|
288
|
+
toPx,
|
|
289
|
+
waitUntilConnected
|
|
290
|
+
};
|
|
291
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2h0bWwtZWxlbWVudC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIE9ic2lkaWFuLXJ1bnRpbWUtYWdub3N0aWMgaGVscGVycyBmb3Igd29ya2luZyB3aXRoIEhUTUwgZWxlbWVudHMuXG4gKlxuICogU2V2ZXJhbCBoZWxwZXJzIGhlcmUgbWlycm9yIGJlaGF2aW9yIHRoYXQgdGhlIE9ic2lkaWFuIHJ1bnRpbWUgaW5qZWN0cyBvbnRvIHRoZSBET00gcHJvdG90eXBlc1xuICogKGBjcmVhdGVFbGAvYGNyZWF0ZURpdmAvYGNyZWF0ZVNwYW5gL2BjcmVhdGVTdmdgL2BjcmVhdGVGcmFnbWVudGAsIGBOb2RlLnByb3RvdHlwZS5pbnN0YW5jZU9mYCxcbiAqIGBFbGVtZW50LnByb3RvdHlwZS5zZXRUZXh0YC9gc2V0QXR0cnNgKS4gVG8gc3RheSBpbmRlcGVuZGVudCBvZiB0aGUgT2JzaWRpYW4gcnVudGltZSwgdGhhdCBiZWhhdmlvclxuICogaXMgcmVpbXBsZW1lbnRlZCBoZXJlIGluIHN0YW5kYXJkIERPTSwgcG9ydGVkIGZyb20gT2JzaWRpYW4ncyBvd24gaW1wbGVtZW50YXRpb24gaW5cbiAqIGBvYnNpZGlhbi5hc2FyL2VuaGFuY2UuanNgLiBTZWUgdGhlIGBvYnNpZGlhbi12ZXJzaW9uc2AgcHJvamVjdDsgcmV2YWxpZGF0ZSB0aGUgcG9ydCB3aGVuIE9ic2lkaWFuXG4gKiBjaGFuZ2VzIGBlbmhhbmNlLmpzYCAodGhlcmUgaXMgYSByZW1pbmRlciBpbiBgQ0xBVURFLm1kYCkuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBQcm9taXNhYmxlIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgQ2FsbGJhY2tEaXNwb3NhYmxlIH0gZnJvbSAnLi9kaXNwb3NhYmxlLnRzJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnLi90eXBlLWd1YXJkcy50cyc7XG5cbmNvbnN0IFNWR19OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnO1xuXG4vKipcbiAqIFRoZSBlbGVtZW50IGluZm9ybWF0aW9uIHtAbGluayBjcmVhdGVFbEFzeW5jfSBhbmQgaXRzIHNpYmxpbmdzIGFwcGx5OiB0aGUgZWxlbWVudC10eXBlLWFnbm9zdGljIHN1YnNldCBvZlxuICogT2JzaWRpYW4ncyBgRG9tRWxlbWVudEluZm9gLCBkZWNsYXJlZCBoZXJlIHNvIHRoaXMgbW9kdWxlIG5lZWRzIG5vIE9ic2lkaWFuIHR5cGluZ3MuIEFuIE9ic2lkaWFuXG4gKiBgRG9tRWxlbWVudEluZm9gIHZhbHVlIGlzIGFzc2lnbmFibGUgdG8gaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlSHRtbEVsZW1lbnRJbmZvIHtcbiAgLyoqXG4gICAqIFRoZSBhdHRyaWJ1dGVzIHRvIHNldDsgYG51bGxgIHJlbW92ZXMgdGhlIGF0dHJpYnV0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGF0dHI/OiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuIHwgbnVsbCB8IG51bWJlciB8IHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFRoZSBDU1MgY2xhc3Mgb3IgY2xhc3Nlcy5cbiAgICovXG4gIHJlYWRvbmx5IGNscz86IHN0cmluZyB8IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFyZW50IHRvIGluc2VydCB0aGUgZWxlbWVudCBpbnRvLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFyZW50PzogTm9kZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbnNlcnQgdGhlIGVsZW1lbnQgYXMgdGhlIHBhcmVudCdzIGZpcnN0IGNoaWxkIGluc3RlYWQgb2YgaXRzIGxhc3QuXG4gICAqL1xuICByZWFkb25seSBwcmVwZW5kPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHRleHQgY29udGVudC5cbiAgICovXG4gIHJlYWRvbmx5IHRleHQ/OiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdG9vbHRpcCB0ZXh0LlxuICAgKi9cbiAgcmVhZG9ubHkgdGl0bGU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIFNWRyBlbGVtZW50IGluZm9ybWF0aW9uIHtAbGluayBjcmVhdGVTdmdBc3luY30gYXBwbGllczogdGhlIHN1YnNldCBvZiBPYnNpZGlhbidzIGBTdmdFbGVtZW50SW5mb2AgaXRcbiAqIHN1cHBvcnRzLCBkZWNsYXJlZCBoZXJlIHNvIHRoaXMgbW9kdWxlIG5lZWRzIG5vIE9ic2lkaWFuIHR5cGluZ3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlU3ZnRWxlbWVudEluZm8ge1xuICAvKipcbiAgICogVGhlIGF0dHJpYnV0ZXMgdG8gc2V0OyBgbnVsbGAgcmVtb3ZlcyB0aGUgYXR0cmlidXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXR0cj86IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4gfCBudWxsIHwgbnVtYmVyIHwgc3RyaW5nPjtcblxuICAvKipcbiAgICogVGhlIENTUyBjbGFzcyBvciBjbGFzc2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgY2xzPzogc3RyaW5nIHwgc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBwYXJlbnQgdG8gaW5zZXJ0IHRoZSBlbGVtZW50IGludG8uXG4gICAqL1xuICByZWFkb25seSBwYXJlbnQ/OiBOb2RlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluc2VydCB0aGUgZWxlbWVudCBhcyB0aGUgcGFyZW50J3MgZmlyc3QgY2hpbGQgaW5zdGVhZCBvZiBpdHMgbGFzdC5cbiAgICovXG4gIHJlYWRvbmx5IHByZXBlbmQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEEgSFRNTCBlbGVtZW50IHRoYXQgY2FuIGJlIHZhbGlkYXRlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0b3JFbGVtZW50IGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuICAvKipcbiAgICogQ2hlY2tzIHRoZSB2YWxpZGl0eSBvZiB0aGUgZWxlbWVudC5cbiAgICpcbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBlbGVtZW50IGlzIHZhbGlkLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICovXG4gIGNoZWNrVmFsaWRpdHk6ICgpID0+IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgdGhlIHZhbGlkaXR5IG9mIHRoZSBlbGVtZW50LlxuICAgKi9cbiAgcmVwb3J0VmFsaWRpdHk6ICgpID0+IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldHMgYSBjdXN0b20gZXJyb3IgbWVzc2FnZSBvbiB0aGUgZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVycm9yIC0gVGhlIGVycm9yIG1lc3NhZ2UgdG8gc2V0IG9uIHRoZSBlbGVtZW50LlxuICAgKi9cbiAgc2V0Q3VzdG9tVmFsaWRpdHk6IChlcnJvcjogc3RyaW5nKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBbiBlcnJvciBtZXNzYWdlIG9mIHRoZSBlbGVtZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsaWRhdGlvbk1lc3NhZ2U6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZGl2IGFzeW5jaHJvbm91c2x5LlxuICpcbiAqIEBwYXJhbSBvIC0gVGhlIGVsZW1lbnQgaW5mb3JtYXRpb24uXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBkaXYgaXMgY3JlYXRlZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGRpdi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZURpdkFzeW5jKFxuICBvPzogQ3JlYXRlSHRtbEVsZW1lbnRJbmZvIHwgc3RyaW5nLFxuICBjYWxsYmFjaz86IChlbGVtZW50OiBIVE1MRGl2RWxlbWVudCkgPT4gUHJvbWlzYWJsZTx2b2lkPlxuKTogUHJvbWlzZTxIVE1MRGl2RWxlbWVudD4ge1xuICBjb25zdCBkaXYgPSBjcmVhdGVIdG1sRWxlbWVudCgnZGl2Jywgbyk7XG4gIGF3YWl0IGNhbGxiYWNrPy4oZGl2KTtcbiAgcmV0dXJuIGRpdjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGVsZW1lbnQgYXN5bmNocm9ub3VzbHkuXG4gKlxuICogQHR5cGVQYXJhbSBLIC0gVGhlIHRhZyBuYW1lIGtleSBmcm9tIGBIVE1MRWxlbWVudFRhZ05hbWVNYXBgLlxuICogQHBhcmFtIHRhZyAtIFRoZSB0YWcgbmFtZSBvZiB0aGUgZWxlbWVudCB0byBjcmVhdGUuXG4gKiBAcGFyYW0gbyAtIFRoZSBlbGVtZW50IGluZm9ybWF0aW9uLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgZWxlbWVudCBpcyBjcmVhdGVkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgZWxlbWVudC5cbiAqIEByZW1hcmtzIE5vdCByZWZhY3RvcmVkIHRvIHBhcmFtZXRlci1vYmplY3QgcGF0dGVybiwgdG8ga2VlcCB0aGUgcGFyaXR5IHdpdGggT2JzaWRpYW4ncyBgY3JlYXRlRWxgIChvciBjcmVhdGVTdmcsIGNvcnJlc3BvbmRpbmdseSkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVFbEFzeW5jPEsgZXh0ZW5kcyBrZXlvZiBIVE1MRWxlbWVudFRhZ05hbWVNYXA+KFxuICB0YWc6IEssXG4gIG8/OiBDcmVhdGVIdG1sRWxlbWVudEluZm8gfCBzdHJpbmcsXG4gIGNhbGxiYWNrPzogKGVsZW1lbnQ6IEhUTUxFbGVtZW50VGFnTmFtZU1hcFtLXSkgPT4gUHJvbWlzYWJsZTx2b2lkPlxuKTogUHJvbWlzZTxIVE1MRWxlbWVudFRhZ05hbWVNYXBbS10+IHtcbiAgY29uc3QgZWxlbWVudCA9IGNyZWF0ZUh0bWxFbGVtZW50KHRhZywgbyk7XG4gIGF3YWl0IGNhbGxiYWNrPy4oZWxlbWVudCk7XG4gIHJldHVybiBlbGVtZW50O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBEb2N1bWVudEZyYWdtZW50IGFzeW5jaHJvbm91c2x5LlxuICpcbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIERvY3VtZW50RnJhZ21lbnQgaXMgY3JlYXRlZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIERvY3VtZW50RnJhZ21lbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVGcmFnbWVudEFzeW5jKGNhbGxiYWNrPzogKGVsZW1lbnQ6IERvY3VtZW50RnJhZ21lbnQpID0+IFByb21pc2FibGU8dm9pZD4pOiBQcm9taXNlPERvY3VtZW50RnJhZ21lbnQ+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9ic2lkaWFubWQvcHJlZmVyLWNyZWF0ZS1lbCAtLSBBZ25vc3RpYyBtb2R1bGUuXG4gIGNvbnN0IGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICBhd2FpdCBjYWxsYmFjaz8uKGZyYWdtZW50KTtcbiAgcmV0dXJuIGZyYWdtZW50O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzcGFuIGFzeW5jaHJvbm91c2x5LlxuICpcbiAqIEBwYXJhbSBvIC0gVGhlIGVsZW1lbnQgaW5mb3JtYXRpb24uXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBzcGFuIGlzIGNyZWF0ZWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBzcGFuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlU3BhbkFzeW5jKFxuICBvPzogQ3JlYXRlSHRtbEVsZW1lbnRJbmZvIHwgc3RyaW5nLFxuICBjYWxsYmFjaz86IChlbGVtZW50OiBIVE1MU3BhbkVsZW1lbnQpID0+IFByb21pc2FibGU8dm9pZD5cbik6IFByb21pc2U8SFRNTFNwYW5FbGVtZW50PiB7XG4gIGNvbnN0IHNwYW4gPSBjcmVhdGVIdG1sRWxlbWVudCgnc3BhbicsIG8pO1xuICBhd2FpdCBjYWxsYmFjaz8uKHNwYW4pO1xuICByZXR1cm4gc3Bhbjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc3ZnIGFzeW5jaHJvbm91c2x5LlxuICpcbiAqIEB0eXBlUGFyYW0gSyAtIFRoZSB0YWcgbmFtZSBrZXkgZnJvbSBgU1ZHRWxlbWVudFRhZ05hbWVNYXBgLlxuICogQHBhcmFtIHRhZyAtIFRoZSB0YWcgbmFtZSBvZiB0aGUgc3ZnIHRvIGNyZWF0ZS5cbiAqIEBwYXJhbSBvIC0gVGhlIHN2ZyBpbmZvcm1hdGlvbi5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIHN2ZyBpcyBjcmVhdGVkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgc3ZnLlxuICogQHJlbWFya3MgTm90IHJlZmFjdG9yZWQgdG8gcGFyYW1ldGVyLW9iamVjdCBwYXR0ZXJuLCB0byBrZWVwIHRoZSBwYXJpdHkgd2l0aCBPYnNpZGlhbidzIGBjcmVhdGVTdmdgIChvciBjcmVhdGVFbCwgY29ycmVzcG9uZGluZ2x5KS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVN2Z0FzeW5jPEsgZXh0ZW5kcyBrZXlvZiBTVkdFbGVtZW50VGFnTmFtZU1hcD4oXG4gIHRhZzogSyxcbiAgbz86IENyZWF0ZVN2Z0VsZW1lbnRJbmZvIHwgc3RyaW5nLFxuICBjYWxsYmFjaz86IChlbGVtZW50OiBTVkdFbGVtZW50VGFnTmFtZU1hcFtLXSkgPT4gUHJvbWlzYWJsZTx2b2lkPlxuKTogUHJvbWlzZTxTVkdFbGVtZW50VGFnTmFtZU1hcFtLXT4ge1xuICBjb25zdCBzdmcgPSBjcmVhdGVTdmdFbGVtZW50KHRhZywgbyk7XG4gIGF3YWl0IGNhbGxiYWNrPy4oc3ZnKTtcbiAgcmV0dXJuIHN2Zztcbn1cblxuLyoqXG4gKiBFbnN1cmVzIHRoYXQgdGhlIGdpdmVuIGVsZW1lbnQgaXMgbG9hZGVkLlxuICpcbiAqIEBwYXJhbSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gZW5zdXJlIGlzIGxvYWRlZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZWxlbWVudCBpcyBsb2FkZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVMb2FkZWQoZWxlbWVudDogRWxlbWVudCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoaXNMb2FkZWQoZWxlbWVudCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgd2luID0gZ2V0Tm9kZVdpbmRvdyhlbGVtZW50KTtcbiAgaWYgKFxuICAgIGlzSW5zdGFuY2VPZihlbGVtZW50LCB3aW4uSFRNTEJvZHlFbGVtZW50KVxuICAgIHx8IGlzSW5zdGFuY2VPZihlbGVtZW50LCB3aW4uSFRNTEltYWdlRWxlbWVudClcbiAgICB8fCBpc0luc3RhbmNlT2YoZWxlbWVudCwgd2luLkhUTUxJRnJhbWVFbGVtZW50KVxuICAgIHx8IGlzSW5zdGFuY2VPZihlbGVtZW50LCB3aW4uSFRNTEVtYmVkRWxlbWVudClcbiAgICB8fCBpc0luc3RhbmNlT2YoZWxlbWVudCwgd2luLkhUTUxMaW5rRWxlbWVudClcbiAgICB8fCBpc0luc3RhbmNlT2YoZWxlbWVudCwgd2luLkhUTUxPYmplY3RFbGVtZW50KVxuICAgIHx8IGlzSW5zdGFuY2VPZihlbGVtZW50LCB3aW4uSFRNTFN0eWxlRWxlbWVudClcbiAgICB8fCBpc0luc3RhbmNlT2YoZWxlbWVudCwgd2luLkhUTUxUcmFja0VsZW1lbnQpXG4gICkge1xuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCByZXNvbHZlKTtcbiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCByZXNvbHZlKTtcbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBhd2FpdCBQcm9taXNlLmFsbChnZXRMb2FkYWJsZUVsZW1lbnRzKGVsZW1lbnQpLm1hcCgobG9hZGFibGVFbGVtZW50KSA9PiBlbnN1cmVMb2FkZWQobG9hZGFibGVFbGVtZW50KSkpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHdpbmRvdyBhIGRvY3VtZW50IGJlbG9uZ3MgdG8uXG4gKlxuICogQSBkb2N1bWVudCBpcyB0aGUgb25lIG5vZGUgd2hvc2UgYG93bmVyRG9jdW1lbnRgIGlzIGBudWxsYCwgc28gdGhlIGBvd25lckRvY3VtZW50YC1jaGFzaW5nIGxvb2t1cFxuICogdXNlZCBmb3Igb3JkaW5hcnkgbm9kZXMgcmVzb2x2ZXMgYSBkb2N1bWVudCB0byB0aGUgd3Jvbmcgd2luZG93LiBSZWFkaW5nIGBkZWZhdWx0Vmlld2Agb2ZmIHRoZVxuICogZG9jdW1lbnQgaXRzZWxmIGlzIHdoYXQga2VlcHMgYSBwb3Atb3V0IHdpbmRvdydzIGNvb3JkaW5hdGVzIG1lYXN1cmVkIGFnYWluc3QgdGhhdCB3aW5kb3cuXG4gKlxuICogQHBhcmFtIGRvYyAtIFRoZSBkb2N1bWVudCB0byBnZXQgdGhlIHdpbmRvdyBvZi5cbiAqIEByZXR1cm5zIFRoZSB3aW5kb3cgdGhlIGRvY3VtZW50IGJlbG9uZ3MgdG8uXG4gKiBAdGhyb3dzIEFuIHtAbGluayBFcnJvcn0gaWYgdGhlIGRvY3VtZW50IGlzIGRldGFjaGVkIGFuZCB0aGVyZWZvcmUgaGFzIG5vIHdpbmRvdy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERvY3VtZW50V2luZG93KGRvYzogRG9jdW1lbnQpOiBXaW5kb3cge1xuICByZXR1cm4gZW5zdXJlTm9uTnVsbGFibGUoZG9jLmRlZmF1bHRWaWV3LCAnVGhlIGRvY3VtZW50IGhhcyBubyB3aW5kb3cnKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSB6LWluZGV4IG9mIHRoZSBnaXZlbiBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gZ2V0IHRoZSB6LWluZGV4IG9mLlxuICogQHJldHVybnMgVGhlIHotaW5kZXggb2YgdGhlIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRaSW5kZXgoZWxlbWVudDogRWxlbWVudCk6IG51bWJlciB7XG4gIGxldCBlbGVtZW50MjogRWxlbWVudCB8IG51bGwgPSBlbGVtZW50O1xuXG4gIHdoaWxlIChlbGVtZW50Mikge1xuICAgIGNvbnN0IHpJbmRleFN0cmluZyA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudDIpLnpJbmRleDtcbiAgICBjb25zdCB6SW5kZXggPSBOdW1iZXIucGFyc2VJbnQoekluZGV4U3RyaW5nLCAxMCk7XG4gICAgaWYgKCFOdW1iZXIuaXNOYU4oekluZGV4KSkge1xuICAgICAgcmV0dXJuIHpJbmRleDtcbiAgICB9XG4gICAgZWxlbWVudDIgPSBlbGVtZW50Mi5wYXJlbnRFbGVtZW50O1xuICB9XG5cbiAgcmV0dXJuIDA7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBlbGVtZW50IGlzIHZpc2libGUgaW4gdGhlIG9mZnNldCBwYXJlbnQuXG4gKlxuICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgZWxlbWVudCBpcyB2aXNpYmxlIGluIHRoZSBvZmZzZXQgcGFyZW50LCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRWxlbWVudFZpc2libGVJbk9mZnNldFBhcmVudChlbGVtZW50OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJlbnRFbGVtZW50ID0gZWxlbWVudC5vZmZzZXRQYXJlbnQ7XG4gIGlmICghcGFyZW50RWxlbWVudCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGVsZW1lbnRSZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgY29uc3QgcGFyZW50RWxlbWVudFJlY3QgPSBwYXJlbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gIHJldHVybiAoXG4gICAgcGFyZW50RWxlbWVudFJlY3QudG9wIDw9IGVsZW1lbnRSZWN0LnRvcFxuICAgICYmIGVsZW1lbnRSZWN0LmJvdHRvbSA8PSBwYXJlbnRFbGVtZW50UmVjdC5ib3R0b21cbiAgICAmJiBwYXJlbnRFbGVtZW50UmVjdC5sZWZ0IDw9IGVsZW1lbnRSZWN0LmxlZnRcbiAgICAmJiBlbGVtZW50UmVjdC5yaWdodCA8PSBwYXJlbnRFbGVtZW50UmVjdC5yaWdodFxuICApO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZWxlbWVudCBpcyBsb2FkZWQuXG4gKlxuICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgZWxlbWVudCBpcyBsb2FkZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNMb2FkZWQoZWxlbWVudDogRWxlbWVudCk6IGJvb2xlYW4ge1xuICBjb25zdCB3aW4gPSBnZXROb2RlV2luZG93KGVsZW1lbnQpO1xuXG4gIGlmIChpc0luc3RhbmNlT2YoZWxlbWVudCwgd2luLkhUTUxCb2R5RWxlbWVudCkpIHtcbiAgICBjb25zdCByZWFkeVN0YXRlID0gZWxlbWVudC5vd25lckRvY3VtZW50LnJlYWR5U3RhdGU7XG4gICAgcmV0dXJuIHJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScgfHwgcmVhZHlTdGF0ZSA9PT0gJ2ludGVyYWN0aXZlJztcbiAgfVxuXG4gIGlmIChpc0luc3RhbmNlT2YoZWxlbWVudCwgd2luLkhUTUxJbWFnZUVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQuY29tcGxldGUgJiYgZWxlbWVudC5uYXR1cmFsV2lkdGggPiAwO1xuICB9XG5cbiAgaWYgKGlzSW5zdGFuY2VPZihlbGVtZW50LCB3aW4uSFRNTElGcmFtZUVsZW1lbnQpKSB7XG4gICAgcmV0dXJuICEhZWxlbWVudC5jb250ZW50RG9jdW1lbnQ7XG4gIH1cblxuICBpZiAoaXNJbnN0YW5jZU9mKGVsZW1lbnQsIHdpbi5IVE1MRW1iZWRFbGVtZW50KSkge1xuICAgIHJldHVybiAhIWVsZW1lbnQuZ2V0U1ZHRG9jdW1lbnQoKTtcbiAgfVxuXG4gIGlmIChpc0luc3RhbmNlT2YoZWxlbWVudCwgd2luLkhUTUxMaW5rRWxlbWVudCkpIHtcbiAgICByZXR1cm4gZWxlbWVudC5yZWwgIT09ICdzdHlsZXNoZWV0JyB8fCBlbGVtZW50LnNoZWV0ICE9PSBudWxsO1xuICB9XG5cbiAgaWYgKGlzSW5zdGFuY2VPZihlbGVtZW50LCB3aW4uSFRNTE9iamVjdEVsZW1lbnQpKSB7XG4gICAgcmV0dXJuICEhZWxlbWVudC5jb250ZW50RG9jdW1lbnQgfHwgISFlbGVtZW50LmdldFNWR0RvY3VtZW50KCk7XG4gIH1cblxuICBpZiAoaXNJbnN0YW5jZU9mKGVsZW1lbnQsIHdpbi5IVE1MU2NyaXB0RWxlbWVudCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChpc0luc3RhbmNlT2YoZWxlbWVudCwgd2luLkhUTUxTdHlsZUVsZW1lbnQpKSB7XG4gICAgcmV0dXJuICEhZWxlbWVudC5zaGVldDtcbiAgfVxuXG4gIGlmIChpc0luc3RhbmNlT2YoZWxlbWVudCwgd2luLkhUTUxUcmFja0VsZW1lbnQpKSB7XG4gICAgY29uc3QgUkVBRFlfU1RBVEVfTE9BREVEID0gMjtcbiAgICByZXR1cm4gZWxlbWVudC5yZWFkeVN0YXRlID09PSBSRUFEWV9TVEFURV9MT0FERUQ7XG4gIH1cblxuICByZXR1cm4gZ2V0TG9hZGFibGVFbGVtZW50cyhlbGVtZW50KS5ldmVyeSgobG9hZGFibGVFbGVtZW50KSA9PiBpc0xvYWRlZChsb2FkYWJsZUVsZW1lbnQpKTtcbn1cblxuLyoqXG4gKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBhbmNlc3RvciBub2RlcyBvZiB0aGUgZ2l2ZW4gbm9kZS5cbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBub2RlIHRvIGFkZCB0aGUgZXZlbnQgbGlzdGVuZXIgdG8uXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBEaXNwb3NhYmxlfSB0aGF0IHJlbW92ZXMgdGhlIGV2ZW50IGxpc3RlbmVycyB3aGVuIGRpc3Bvc2VkLCBmb3IgdXNlIHdpdGggYHVzaW5nYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uQW5jZXN0b3JTY3JvbGxPclJlc2l6ZShub2RlOiBOb2RlLCBjYWxsYmFjazogKCkgPT4gdm9pZCk6IERpc3Bvc2FibGUge1xuICBjb25zdCB3aW4gPSBnZXROb2RlV2luZG93KG5vZGUpO1xuICBjb25zdCBhbmNlc3RvcnM6IEV2ZW50VGFyZ2V0W10gPSBbbm9kZS5vd25lckRvY3VtZW50ID8/IHdpbi5kb2N1bWVudCwgd2luXTtcblxuICBsZXQgY3VycmVudE5vZGU6IE5vZGUgfCBudWxsID0gbm9kZTtcblxuICB3aGlsZSAoY3VycmVudE5vZGUpIHtcbiAgICBhbmNlc3RvcnMucHVzaChjdXJyZW50Tm9kZSk7XG4gICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wYXJlbnROb2RlO1xuICB9XG5cbiAgbGV0IGlzRXZlbnRUcmlnZ2VyZWQgPSBmYWxzZTtcblxuICBmb3IgKGNvbnN0IGFuY2VzdG9yIG9mIGFuY2VzdG9ycykge1xuICAgIGFuY2VzdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGNhbGxiYWNrU21vb3RoLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gICAgYW5jZXN0b3IuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgY2FsbGJhY2tTbW9vdGgsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIHJldHVybiBuZXcgQ2FsbGJhY2tEaXNwb3NhYmxlKHtcbiAgICBjYWxsYmFjazogKCk6IHZvaWQgPT4ge1xuICAgICAgZm9yIChjb25zdCBhbmNlc3RvciBvZiBhbmNlc3RvcnMpIHtcbiAgICAgICAgYW5jZXN0b3IucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgY2FsbGJhY2tTbW9vdGgsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICAgICAgYW5jZXN0b3IucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgY2FsbGJhY2tTbW9vdGgsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGNhbGxiYWNrU21vb3RoKCk6IHZvaWQge1xuICAgIGlmIChpc0V2ZW50VHJpZ2dlcmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaXNFdmVudFRyaWdnZXJlZCA9IHRydWU7XG5cbiAgICB3aW4ucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpc0V2ZW50VHJpZ2dlcmVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIG51bWJlciB0byBhIHN0cmluZyB3aXRoICdweCcgYXBwZW5kZWQuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIG51bWJlciB0byBjb252ZXJ0LlxuICogQHJldHVybnMgVGhlIG51bWJlciBhcyBhIHN0cmluZyB3aXRoICdweCcgYXBwZW5kZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1B4KHZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7U3RyaW5nKHZhbHVlKX1weGA7XG59XG5cbi8qKlxuICogV2FpdHMgdW50aWwgdGhlIGdpdmVuIGVsZW1lbnQgaXMgY29ubmVjdGVkIHRvIHRoZSBET00uXG4gKlxuICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byBjaGVjay5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGVsZW1lbnQgaXMgY29ubmVjdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2FpdFVudGlsQ29ubmVjdGVkKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGlmIChlbGVtZW50LmlzQ29ubmVjdGVkKSB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gT2JzaWRpYW4ncyBgZWwub25Ob2RlSW5zZXJ0ZWRgIHVzZXMgYSBgbm9kZS1pbnNlcnRlZGAgQ1NTIGtleWZyYW1lIGZyb20gT2JzaWRpYW4ncyBzdHlsZXNoZWV0LlxuICAgIC8vIFRoZSBhZ25vc3RpYyBlcXVpdmFsZW50IGluc3RlYWQgb2JzZXJ2ZXMgdGhlIGVsZW1lbnQncyBkb2N1bWVudCBmb3IgaXQgYmVjb21pbmcgY29ubmVjdGVkLlxuICAgIGNvbnN0IG93bmVyRG9jdW1lbnQgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG4gICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgKGdldE5vZGVXaW5kb3coZWxlbWVudCkpLk11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgaWYgKCFlbGVtZW50LmlzQ29ubmVjdGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICAgIG9ic2VydmVyLm9ic2VydmUob3duZXJEb2N1bWVudCwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEFwcGxpZXMgdGhlIGVsZW1lbnQtdHlwZS1hZ25vc3RpYyBzdWJzZXQgb2YgT2JzaWRpYW4ncyBgRG9tRWxlbWVudEluZm9gIHRoYXQgaXRzIGBjcmVhdGVFbGBcbiAqIHN1cHBvcnRzIFx1MjAxNCBgY2xzYCwgYHRleHRgLCBgYXR0cmAsIGB0aXRsZWAsIGFuZCBgcGFyZW50YC9gcHJlcGVuZGAuIFRoZSBlbGVtZW50LXR5cGUtc3BlY2lmaWNcbiAqIGZpZWxkcyAoYHZhbHVlYCwgYHR5cGVgLCBgcGxhY2Vob2xkZXJgLCBgaHJlZmApIGFuZCB0aGUgYG9uKmAgZXZlbnQtaGFuZGxlciBrZXlzIGFyZSBpbnRlbnRpb25hbGx5XG4gKiBOT1QgcG9ydGVkIChubyBpbnRlcm5hbCBjYWxsZXIgbmVlZHMgdGhlbSk7IGV4dGVuZCB0aGlzIGlmIGEgY29uc3VtZXIgZG9lcyBcdTIwMTQgYW5kIHJldmFsaWRhdGUgYWdhaW5zdFxuICogYGVuaGFuY2UuanNgIChzZWUgdGhlIGBAZmlsZWAgbm90ZSBhbmQgYENMQVVERS5tZGApLlxuICpcbiAqIEBwYXJhbSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gYXBwbHkgdGhlIGluZm8gdG8uXG4gKiBAcGFyYW0gbyAtIFRoZSBlbGVtZW50IGluZm8gKG9yIGEgYmFyZSBjbGFzcyBzdHJpbmcpLlxuICovXG5mdW5jdGlvbiBhcHBseURvbUVsZW1lbnRJbmZvKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvOiBDcmVhdGVIdG1sRWxlbWVudEluZm8gfCBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgY29uc3QgaW5mbzogQ3JlYXRlSHRtbEVsZW1lbnRJbmZvID0gdHlwZW9mIG8gPT09ICdzdHJpbmcnID8geyBjbHM6IG8gfSA6IG8gPz8ge307XG5cbiAgaWYgKGluZm8uY2xzICE9PSB1bmRlZmluZWQpIHtcbiAgICBlbGVtZW50LmNsYXNzTmFtZSA9IEFycmF5LmlzQXJyYXkoaW5mby5jbHMpID8gaW5mby5jbHMuam9pbignICcpIDogaW5mby5jbHM7XG4gIH1cbiAgaWYgKGluZm8udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgc2V0RWxlbWVudFRleHQoZWxlbWVudCwgaW5mby50ZXh0KTtcbiAgfVxuICBpZiAoaW5mby5hdHRyKSB7XG4gICAgc2V0RWxlbWVudEF0dHJpYnV0ZXMoZWxlbWVudCwgaW5mby5hdHRyKTtcbiAgfVxuICBpZiAoaW5mby50aXRsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZWxlbWVudC50aXRsZSA9IGluZm8udGl0bGU7XG4gIH1cbiAgaW5zZXJ0SW50b1BhcmVudChlbGVtZW50LCBpbmZvKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlSHRtbEVsZW1lbnQ8SyBleHRlbmRzIGtleW9mIEhUTUxFbGVtZW50VGFnTmFtZU1hcD4odGFnOiBLLCBvPzogQ3JlYXRlSHRtbEVsZW1lbnRJbmZvIHwgc3RyaW5nKTogSFRNTEVsZW1lbnRUYWdOYW1lTWFwW0tdIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9ic2lkaWFubWQvcHJlZmVyLWNyZWF0ZS1lbCAtLSBBZ25vc3RpYyBtb2R1bGUuXG4gIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7XG4gIGFwcGx5RG9tRWxlbWVudEluZm8oZWxlbWVudCwgbyk7XG4gIHJldHVybiBlbGVtZW50O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTdmdFbGVtZW50PEsgZXh0ZW5kcyBrZXlvZiBTVkdFbGVtZW50VGFnTmFtZU1hcD4odGFnOiBLLCBvPzogQ3JlYXRlU3ZnRWxlbWVudEluZm8gfCBzdHJpbmcpOiBTVkdFbGVtZW50VGFnTmFtZU1hcFtLXSB7XG4gIGNvbnN0IHN2ZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTkFNRVNQQUNFLCB0YWcpO1xuICBjb25zdCBpbmZvOiBDcmVhdGVTdmdFbGVtZW50SW5mbyA9IHR5cGVvZiBvID09PSAnc3RyaW5nJyA/IHsgY2xzOiBvIH0gOiBvID8/IHt9O1xuXG4gIGlmIChpbmZvLmNscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaW5mby5jbHMpKSB7XG4gICAgICBzdmcuY2xhc3NMaXN0LmFkZCguLi5pbmZvLmNscyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN2Zy5jbGFzc0xpc3QuYWRkKGluZm8uY2xzKTtcbiAgICB9XG4gIH1cbiAgaWYgKGluZm8uYXR0cikge1xuICAgIHNldEVsZW1lbnRBdHRyaWJ1dGVzKHN2ZywgaW5mby5hdHRyKTtcbiAgfVxuICBpbnNlcnRJbnRvUGFyZW50KHN2ZywgaW5mbyk7XG4gIHJldHVybiBzdmc7XG59XG5cbmZ1bmN0aW9uIGdldExvYWRhYmxlRWxlbWVudHMoZWxlbWVudDogRWxlbWVudCk6IEVsZW1lbnRbXSB7XG4gIHJldHVybiBbLi4uZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdib2R5LCBpbWcsIGlmcmFtZSwgZW1iZWQsIGxpbmssIG9iamVjdCwgc2NyaXB0LCBzdHlsZSwgdHJhY2snKV07XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYnNpZGlhbm1kL25vLWdsb2JhbC10aGlzIC0tIFR5cGUtb25seTogdGhlIHJlc29sdmVkIHdpbmRvdyBuZWVkcyB0aGUgZ2xvYmFsIERPTSBjb25zdHJ1Y3RvciB0eXBpbmdzLlxuZnVuY3Rpb24gZ2V0Tm9kZVdpbmRvdyhub2RlOiBOb2RlKTogdHlwZW9mIGdsb2JhbFRoaXMgJiBXaW5kb3cge1xuICByZXR1cm4gbm9kZS5vd25lckRvY3VtZW50Py5kZWZhdWx0VmlldyA/PyB3aW5kb3c7XG59XG5cbmZ1bmN0aW9uIGluc2VydEludG9QYXJlbnQoZWxlbWVudDogRWxlbWVudCwgaW5mbzogQ3JlYXRlSHRtbEVsZW1lbnRJbmZvIHwgQ3JlYXRlU3ZnRWxlbWVudEluZm8pOiB2b2lkIHtcbiAgaWYgKCFpbmZvLnBhcmVudCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoaW5mby5wcmVwZW5kKSB7XG4gICAgaW5mby5wYXJlbnQuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIGluZm8ucGFyZW50LmZpcnN0Q2hpbGQpO1xuICB9IGVsc2Uge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL3ByZWZlci1kb20tbm9kZS1hcHBlbmQgLS0gYHBhcmVudGAgaXMgYSBgTm9kZWAsIGFuZCBgYXBwZW5kYCBpcyBkZWNsYXJlZCBvbiBgUGFyZW50Tm9kZWAsIG5vdCBvbiBgTm9kZWAuXG4gICAgaW5mby5wYXJlbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNJbnN0YW5jZU9mPFQgZXh0ZW5kcyBOb2RlPihub2RlOiBOb2RlLCBjdG9yOiBhYnN0cmFjdCBuZXcgKC4uLiRhcmd1bWVudHM6IG5ldmVyW10pID0+IFQpOiBub2RlIGlzIFQge1xuICAvLyBBZ25vc3RpYyByZWltcGxlbWVudGF0aW9uIG9mIE9ic2lkaWFuJ3MgYE5vZGUucHJvdG90eXBlLmluc3RhbmNlT2ZgIChlbmhhbmNlLmpzKS5cbiAgLy8gVGhlIGNhbGxlciByZXNvbHZlcyBgY3RvcmAgaW4gdGhlIG5vZGUncyBvd24gcmVhbG0gKHZpYSBgZ2V0Tm9kZVdpbmRvd2ApLCBrZWVwaW5nIGl0IGNyb3NzLXdpbmRvdyBzYWZlLlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb2JzaWRpYW5tZC9wcmVmZXItaW5zdGFuY2VvZiAtLSBUaGlzIElTIHRoZSBhZ25vc3RpYyBgLmluc3RhbmNlT2ZgIHJlcGxhY2VtZW50LlxuICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIGN0b3I7XG59XG5cbmZ1bmN0aW9uIHNldEVsZW1lbnRBdHRyaWJ1dGVzKGVsZW1lbnQ6IEVsZW1lbnQsIGF0dHJpYnV0ZTogTm9uTnVsbGFibGU8Q3JlYXRlSHRtbEVsZW1lbnRJbmZvWydhdHRyJ10+KTogdm9pZCB7XG4gIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhdHRyaWJ1dGUpKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLXRvZ2dsZS1hdHRyaWJ1dGUgLS0gYHRvZ2dsZUF0dHJpYnV0ZWAgb25seSBldmVyIHNldHMgdGhlIGVtcHR5IHN0cmluZywgc28gaXQgY2Fubm90IGNhcnJ5IGBTdHJpbmcodmFsdWUpYC4gVGhlIHJ1bGUgbWF0Y2hlcyB0aGUgcmVtb3ZlL3NldCBzaGFwZSB3aXRob3V0IHNlZWluZyB0aGF0IHRoZSB2YWx1ZSBpcyB3aGF0IHRoaXMgYnJhbmNoIGV4aXN0cyB0byB3cml0ZS5cbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCBTdHJpbmcodmFsdWUpKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0RWxlbWVudFRleHQoZWxlbWVudDogSFRNTEVsZW1lbnQsIHRleHQ6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKHRleHQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSB7XG4gICAgZWxlbWVudC5yZXBsYWNlQ2hpbGRyZW4odGV4dCk7XG4gIH0gZWxzZSB7XG4gICAgZWxlbWVudC50ZXh0Q29udGVudCA9IHRleHQ7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFlQSxTQUFTLDBCQUEwQjtBQUNuQyxTQUFTLHlCQUF5QjtBQUVsQyxNQUFNLGdCQUFnQjtBQXFHdEIsZUFBc0IsZUFDcEIsR0FDQSxVQUN5QjtBQUN6QixRQUFNLE1BQU0sa0JBQWtCLE9BQU8sQ0FBQztBQUN0QyxRQUFNLFdBQVcsR0FBRztBQUNwQixTQUFPO0FBQ1Q7QUFZQSxlQUFzQixjQUNwQixLQUNBLEdBQ0EsVUFDbUM7QUFDbkMsUUFBTSxVQUFVLGtCQUFrQixLQUFLLENBQUM7QUFDeEMsUUFBTSxXQUFXLE9BQU87QUFDeEIsU0FBTztBQUNUO0FBUUEsZUFBc0Isb0JBQW9CLFVBQXVGO0FBRS9ILFFBQU0sV0FBVyxTQUFTLHVCQUF1QjtBQUNqRCxRQUFNLFdBQVcsUUFBUTtBQUN6QixTQUFPO0FBQ1Q7QUFTQSxlQUFzQixnQkFDcEIsR0FDQSxVQUMwQjtBQUMxQixRQUFNLE9BQU8sa0JBQWtCLFFBQVEsQ0FBQztBQUN4QyxRQUFNLFdBQVcsSUFBSTtBQUNyQixTQUFPO0FBQ1Q7QUFZQSxlQUFzQixlQUNwQixLQUNBLEdBQ0EsVUFDa0M7QUFDbEMsUUFBTSxNQUFNLGlCQUFpQixLQUFLLENBQUM7QUFDbkMsUUFBTSxXQUFXLEdBQUc7QUFDcEIsU0FBTztBQUNUO0FBUUEsZUFBc0IsYUFBYSxTQUFpQztBQUNsRSxNQUFJLFNBQVMsT0FBTyxHQUFHO0FBQ3JCO0FBQUEsRUFDRjtBQUNBLFFBQU0sTUFBTSxjQUFjLE9BQU87QUFDakMsTUFDRSxhQUFhLFNBQVMsSUFBSSxlQUFlLEtBQ3RDLGFBQWEsU0FBUyxJQUFJLGdCQUFnQixLQUMxQyxhQUFhLFNBQVMsSUFBSSxpQkFBaUIsS0FDM0MsYUFBYSxTQUFTLElBQUksZ0JBQWdCLEtBQzFDLGFBQWEsU0FBUyxJQUFJLGVBQWUsS0FDekMsYUFBYSxTQUFTLElBQUksaUJBQWlCLEtBQzNDLGFBQWEsU0FBUyxJQUFJLGdCQUFnQixLQUMxQyxhQUFhLFNBQVMsSUFBSSxnQkFBZ0IsR0FDN0M7QUFDQSxVQUFNLElBQUksUUFBUSxDQUFDLFlBQVk7QUFDN0IsY0FBUSxpQkFBaUIsUUFBUSxPQUFPO0FBQ3hDLGNBQVEsaUJBQWlCLFNBQVMsT0FBTztBQUFBLElBQzNDLENBQUM7QUFDRDtBQUFBLEVBQ0Y7QUFFQSxRQUFNLFFBQVEsSUFBSSxvQkFBb0IsT0FBTyxFQUFFLElBQUksQ0FBQyxvQkFBb0IsYUFBYSxlQUFlLENBQUMsQ0FBQztBQUN4RztBQWFPLFNBQVMsa0JBQWtCLEtBQXVCO0FBQ3ZELFNBQU8sa0JBQWtCLElBQUksYUFBYSw0QkFBNEI7QUFDeEU7QUFRTyxTQUFTLFVBQVUsU0FBMEI7QUFDbEQsTUFBSSxXQUEyQjtBQUUvQixTQUFPLFVBQVU7QUFDZixVQUFNLGVBQWUsaUJBQWlCLFFBQVEsRUFBRTtBQUNoRCxVQUFNLFNBQVMsT0FBTyxTQUFTLGNBQWMsRUFBRTtBQUMvQyxRQUFJLENBQUMsT0FBTyxNQUFNLE1BQU0sR0FBRztBQUN6QixhQUFPO0FBQUEsSUFDVDtBQUNBLGVBQVcsU0FBUztBQUFBLEVBQ3RCO0FBRUEsU0FBTztBQUNUO0FBUU8sU0FBUywrQkFBK0IsU0FBK0I7QUFDNUUsUUFBTSxnQkFBZ0IsUUFBUTtBQUM5QixNQUFJLENBQUMsZUFBZTtBQUNsQixXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sY0FBYyxRQUFRLHNCQUFzQjtBQUNsRCxRQUFNLG9CQUFvQixjQUFjLHNCQUFzQjtBQUU5RCxTQUNFLGtCQUFrQixPQUFPLFlBQVksT0FDbEMsWUFBWSxVQUFVLGtCQUFrQixVQUN4QyxrQkFBa0IsUUFBUSxZQUFZLFFBQ3RDLFlBQVksU0FBUyxrQkFBa0I7QUFFOUM7QUFRTyxTQUFTLFNBQVMsU0FBMkI7QUFDbEQsUUFBTSxNQUFNLGNBQWMsT0FBTztBQUVqQyxNQUFJLGFBQWEsU0FBUyxJQUFJLGVBQWUsR0FBRztBQUM5QyxVQUFNLGFBQWEsUUFBUSxjQUFjO0FBQ3pDLFdBQU8sZUFBZSxjQUFjLGVBQWU7QUFBQSxFQUNyRDtBQUVBLE1BQUksYUFBYSxTQUFTLElBQUksZ0JBQWdCLEdBQUc7QUFDL0MsV0FBTyxRQUFRLFlBQVksUUFBUSxlQUFlO0FBQUEsRUFDcEQ7QUFFQSxNQUFJLGFBQWEsU0FBUyxJQUFJLGlCQUFpQixHQUFHO0FBQ2hELFdBQU8sQ0FBQyxDQUFDLFFBQVE7QUFBQSxFQUNuQjtBQUVBLE1BQUksYUFBYSxTQUFTLElBQUksZ0JBQWdCLEdBQUc7QUFDL0MsV0FBTyxDQUFDLENBQUMsUUFBUSxlQUFlO0FBQUEsRUFDbEM7QUFFQSxNQUFJLGFBQWEsU0FBUyxJQUFJLGVBQWUsR0FBRztBQUM5QyxXQUFPLFFBQVEsUUFBUSxnQkFBZ0IsUUFBUSxVQUFVO0FBQUEsRUFDM0Q7QUFFQSxNQUFJLGFBQWEsU0FBUyxJQUFJLGlCQUFpQixHQUFHO0FBQ2hELFdBQU8sQ0FBQyxDQUFDLFFBQVEsbUJBQW1CLENBQUMsQ0FBQyxRQUFRLGVBQWU7QUFBQSxFQUMvRDtBQUVBLE1BQUksYUFBYSxTQUFTLElBQUksaUJBQWlCLEdBQUc7QUFDaEQsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJLGFBQWEsU0FBUyxJQUFJLGdCQUFnQixHQUFHO0FBQy9DLFdBQU8sQ0FBQyxDQUFDLFFBQVE7QUFBQSxFQUNuQjtBQUVBLE1BQUksYUFBYSxTQUFTLElBQUksZ0JBQWdCLEdBQUc7QUFDL0MsVUFBTSxxQkFBcUI7QUFDM0IsV0FBTyxRQUFRLGVBQWU7QUFBQSxFQUNoQztBQUVBLFNBQU8sb0JBQW9CLE9BQU8sRUFBRSxNQUFNLENBQUMsb0JBQW9CLFNBQVMsZUFBZSxDQUFDO0FBQzFGO0FBU08sU0FBUyx5QkFBeUIsTUFBWSxVQUFrQztBQUNyRixRQUFNLE1BQU0sY0FBYyxJQUFJO0FBQzlCLFFBQU0sWUFBMkIsQ0FBQyxLQUFLLGlCQUFpQixJQUFJLFVBQVUsR0FBRztBQUV6RSxNQUFJLGNBQTJCO0FBRS9CLFNBQU8sYUFBYTtBQUNsQixjQUFVLEtBQUssV0FBVztBQUMxQixrQkFBYyxZQUFZO0FBQUEsRUFDNUI7QUFFQSxNQUFJLG1CQUFtQjtBQUV2QixhQUFXLFlBQVksV0FBVztBQUNoQyxhQUFTLGlCQUFpQixVQUFVLGdCQUFnQixFQUFFLFNBQVMsS0FBSyxDQUFDO0FBQ3JFLGFBQVMsaUJBQWlCLFVBQVUsZ0JBQWdCLEVBQUUsU0FBUyxLQUFLLENBQUM7QUFBQSxFQUN2RTtBQUVBLFNBQU8sSUFBSSxtQkFBbUI7QUFBQSxJQUM1QixVQUFVLE1BQVk7QUFDcEIsaUJBQVcsWUFBWSxXQUFXO0FBQ2hDLGlCQUFTLG9CQUFvQixVQUFVLGdCQUFnQixFQUFFLFNBQVMsS0FBSyxDQUFDO0FBQ3hFLGlCQUFTLG9CQUFvQixVQUFVLGdCQUFnQixFQUFFLFNBQVMsS0FBSyxDQUFDO0FBQUEsTUFDMUU7QUFBQSxJQUNGO0FBQUEsRUFDRixDQUFDO0FBRUQsV0FBUyxpQkFBdUI7QUFDOUIsUUFBSSxrQkFBa0I7QUFDcEI7QUFBQSxJQUNGO0FBRUEsdUJBQW1CO0FBRW5CLFFBQUksc0JBQXNCLE1BQU07QUFDOUIsVUFBSTtBQUNGLGlCQUFTO0FBQUEsTUFDWCxVQUFFO0FBQ0EsMkJBQW1CO0FBQUEsTUFDckI7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNIO0FBQ0Y7QUFRTyxTQUFTLEtBQUssT0FBdUI7QUFDMUMsU0FBTyxHQUFHLE9BQU8sS0FBSyxDQUFDO0FBQ3pCO0FBUU8sU0FBUyxtQkFBbUIsU0FBcUM7QUFDdEUsU0FBTyxJQUFJLFFBQVEsQ0FBQyxZQUFZO0FBQzlCLFFBQUksUUFBUSxhQUFhO0FBQ3ZCLGNBQVE7QUFDUjtBQUFBLElBQ0Y7QUFJQSxVQUFNLGdCQUFnQixRQUFRO0FBQzlCLFVBQU0sV0FBVyxLQUFLLGNBQWMsT0FBTyxHQUFHLGlCQUFpQixNQUFNO0FBQ25FLFVBQUksQ0FBQyxRQUFRLGFBQWE7QUFDeEI7QUFBQSxNQUNGO0FBRUEsZUFBUyxXQUFXO0FBQ3BCLGNBQVE7QUFBQSxJQUNWLENBQUM7QUFDRCxhQUFTLFFBQVEsZUFBZSxFQUFFLFdBQVcsTUFBTSxTQUFTLEtBQUssQ0FBQztBQUFBLEVBQ3BFLENBQUM7QUFDSDtBQVlBLFNBQVMsb0JBQW9CLFNBQXNCLEdBQXFEO0FBQ3RHLFFBQU0sT0FBOEIsT0FBTyxNQUFNLFdBQVcsRUFBRSxLQUFLLEVBQUUsSUFBSSxLQUFLLENBQUM7QUFFL0UsTUFBSSxLQUFLLFFBQVEsUUFBVztBQUMxQixZQUFRLFlBQVksTUFBTSxRQUFRLEtBQUssR0FBRyxJQUFJLEtBQUssSUFBSSxLQUFLLEdBQUcsSUFBSSxLQUFLO0FBQUEsRUFDMUU7QUFDQSxNQUFJLEtBQUssU0FBUyxRQUFXO0FBQzNCLG1CQUFlLFNBQVMsS0FBSyxJQUFJO0FBQUEsRUFDbkM7QUFDQSxNQUFJLEtBQUssTUFBTTtBQUNiLHlCQUFxQixTQUFTLEtBQUssSUFBSTtBQUFBLEVBQ3pDO0FBQ0EsTUFBSSxLQUFLLFVBQVUsUUFBVztBQUM1QixZQUFRLFFBQVEsS0FBSztBQUFBLEVBQ3ZCO0FBQ0EsbUJBQWlCLFNBQVMsSUFBSTtBQUNoQztBQUVBLFNBQVMsa0JBQXlELEtBQVEsR0FBOEQ7QUFFdEksUUFBTSxVQUFVLFNBQVMsY0FBYyxHQUFHO0FBQzFDLHNCQUFvQixTQUFTLENBQUM7QUFDOUIsU0FBTztBQUNUO0FBRUEsU0FBUyxpQkFBdUQsS0FBUSxHQUE0RDtBQUNsSSxRQUFNLE1BQU0sU0FBUyxnQkFBZ0IsZUFBZSxHQUFHO0FBQ3ZELFFBQU0sT0FBNkIsT0FBTyxNQUFNLFdBQVcsRUFBRSxLQUFLLEVBQUUsSUFBSSxLQUFLLENBQUM7QUFFOUUsTUFBSSxLQUFLLFFBQVEsUUFBVztBQUMxQixRQUFJLE1BQU0sUUFBUSxLQUFLLEdBQUcsR0FBRztBQUMzQixVQUFJLFVBQVUsSUFBSSxHQUFHLEtBQUssR0FBRztBQUFBLElBQy9CLE9BQU87QUFDTCxVQUFJLFVBQVUsSUFBSSxLQUFLLEdBQUc7QUFBQSxJQUM1QjtBQUFBLEVBQ0Y7QUFDQSxNQUFJLEtBQUssTUFBTTtBQUNiLHlCQUFxQixLQUFLLEtBQUssSUFBSTtBQUFBLEVBQ3JDO0FBQ0EsbUJBQWlCLEtBQUssSUFBSTtBQUMxQixTQUFPO0FBQ1Q7QUFFQSxTQUFTLG9CQUFvQixTQUE2QjtBQUN4RCxTQUFPLENBQUMsR0FBRyxRQUFRLGlCQUFpQiw4REFBOEQsQ0FBQztBQUNyRztBQUdBLFNBQVMsY0FBYyxNQUF3QztBQUM3RCxTQUFPLEtBQUssZUFBZSxlQUFlO0FBQzVDO0FBRUEsU0FBUyxpQkFBaUIsU0FBa0IsTUFBMEQ7QUFDcEcsTUFBSSxDQUFDLEtBQUssUUFBUTtBQUNoQjtBQUFBLEVBQ0Y7QUFDQSxNQUFJLEtBQUssU0FBUztBQUNoQixTQUFLLE9BQU8sYUFBYSxTQUFTLEtBQUssT0FBTyxVQUFVO0FBQUEsRUFDMUQsT0FBTztBQUVMLFNBQUssT0FBTyxZQUFZLE9BQU87QUFBQSxFQUNqQztBQUNGO0FBRUEsU0FBUyxhQUE2QixNQUFZLE1BQTZEO0FBSTdHLFNBQU8sZ0JBQWdCO0FBQ3pCO0FBRUEsU0FBUyxxQkFBcUIsU0FBa0IsV0FBNkQ7QUFDM0csYUFBVyxDQUFDLE1BQU0sS0FBSyxLQUFLLE9BQU8sUUFBUSxTQUFTLEdBQUc7QUFFckQsUUFBSSxVQUFVLE1BQU07QUFDbEIsY0FBUSxnQkFBZ0IsSUFBSTtBQUFBLElBQzlCLE9BQU87QUFDTCxjQUFRLGFBQWEsTUFBTSxPQUFPLEtBQUssQ0FBQztBQUFBLElBQzFDO0FBQUEsRUFDRjtBQUNGO0FBRUEsU0FBUyxlQUFlLFNBQXNCLE1BQXVDO0FBQ25GLE1BQUksZ0JBQWdCLGtCQUFrQjtBQUNwQyxZQUFRLGdCQUFnQixJQUFJO0FBQUEsRUFDOUIsT0FBTztBQUNMLFlBQVEsY0FBYztBQUFBLEVBQ3hCO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
|