@expressive/mvc 0.53.6 → 0.54.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.
@@ -0,0 +1,83 @@
1
+ import { context } from "../control";
2
+ import { event, update } from "../model";
3
+ import { use } from "./use";
4
+ function set(value, argument) {
5
+ return use((key, subject) => {
6
+ const property = {};
7
+ if (typeof value == "function" || value instanceof Promise) {
8
+ let init2 = function() {
9
+ if (typeof value == "function")
10
+ try {
11
+ value = attempt(value.bind(subject, key));
12
+ } catch (err) {
13
+ console.warn(`Generating initial value for ${subject}.${key} failed.`);
14
+ throw err;
15
+ }
16
+ property.get = argument === true;
17
+ if (value instanceof Promise) {
18
+ value.then((value2) => {
19
+ update(subject, key, value2);
20
+ return value2;
21
+ }).catch((err) => {
22
+ event(subject, key);
23
+ property.get = () => {
24
+ throw err;
25
+ };
26
+ });
27
+ } else
28
+ update(subject, key, value);
29
+ if (0 in arguments)
30
+ return subject[key];
31
+ };
32
+ var init = init2;
33
+ if (argument)
34
+ init2();
35
+ else
36
+ property.get = init2;
37
+ } else if (value !== void 0)
38
+ property.value = value;
39
+ if (typeof argument == "function") {
40
+ let unset;
41
+ property.set = function(value2, previous) {
42
+ const ctx = context();
43
+ const out = argument.call(this, value2, previous);
44
+ const flush = ctx();
45
+ if (out === false)
46
+ return out;
47
+ if (typeof unset == "function")
48
+ unset(value2);
49
+ unset = (next) => {
50
+ if (typeof out == "function")
51
+ out(next);
52
+ flush();
53
+ };
54
+ };
55
+ } else
56
+ property.set = (value2) => {
57
+ property.get = void 0;
58
+ update(subject, key, value2);
59
+ };
60
+ return property;
61
+ });
62
+ }
63
+ function attempt(fn) {
64
+ function retry(err) {
65
+ if (err instanceof Promise)
66
+ return err.then(compute);
67
+ else
68
+ throw err;
69
+ }
70
+ function compute() {
71
+ try {
72
+ const output = fn();
73
+ return output instanceof Promise ? output.catch(retry) : output;
74
+ } catch (err) {
75
+ return retry(err);
76
+ }
77
+ }
78
+ return compute();
79
+ }
80
+ export {
81
+ set
82
+ };
83
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luc3RydWN0aW9uL3NldC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgY29udGV4dCB9IGZyb20gJy4uL2NvbnRyb2wnO1xuaW1wb3J0IHsgTW9kZWwsIGV2ZW50LCB1cGRhdGUgfSBmcm9tICcuLi9tb2RlbCc7XG5pbXBvcnQgeyB1c2UgfSBmcm9tICcuL3VzZSc7XG5cbmRlY2xhcmUgbmFtZXNwYWNlIHNldCB7XG4gIHR5cGUgQ2FsbGJhY2s8VCwgUyA9IGFueT4gPSAodGhpczogUywgbmV4dDogVCwgcHJldmlvdXM6IFQpID0+XG4gICAgKChuZXh0OiBUKSA9PiB2b2lkKSB8IFByb21pc2U8YW55PiB8IHZvaWQgfCBib29sZWFuO1xuXG4gIHR5cGUgRmFjdG9yeTxULCBTID0gYW55PiA9ICh0aGlzOiBTLCBrZXk6IHN0cmluZykgPT4gUHJvbWlzZTxUPiB8IFQ7XG59XG5cbi8qKlxuICogU2V0IHByb3BlcnR5IGFzIGB1bmRlZmluZWRgIGJ1dCByZXF1aXJlZC5cbiAqIFxuICogUHJvcGVydHkgY2Fubm90IGJlIGFjY2Vzc2VkIHVudGlsIGl0IGlzIGRlZmluZWQuIElmIGFjY2Vzc2VkIHdoaWxlIHVuZGVmaW5lZCwgYSBoeWJyaWRcbiAqIGBQcm9taXNlYC9gRXJyb3JgIChha2E6IFtTdXNwZW5zZV0oaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL2NvbmN1cnJlbnQtbW9kZS1zdXNwZW5zZS5odG1sKSkgd2lsbCBiZSB0aHJvd24uXG4gKi9cbmZ1bmN0aW9uIHNldCA8VCA9IGFueT4oKTogVDtcblxuLyoqXG4gKiBTZXQgcHJvcGVydHkgd2l0aCBhIGZhY3RvcnkgZnVuY3Rpb24uXG4gKiBcbiAqIFJ1biBmYWN0b3J5IG9ubHkgaWYvd2hlbiBhY2Nlc3NlZC4gVmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgdW50aWxcbiAqIGZhY3RvcnkgcmVzb2x2ZXMsIHdoaWNoIHdpbGwgYWxzbyBkaXNwYXRjaCBhbiB1cGRhdGUgZm9yIHRoZSBwcm9wZXJ0eS5cbiAqL1xuZnVuY3Rpb24gc2V0IDxUPiAoZmFjdG9yeTogc2V0LkZhY3Rvcnk8VD4gfCBQcm9taXNlPFQ+LCByZXF1aXJlZDogZmFsc2UpOiBUIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFNldCBwcm9wZXJ0eSB3aXRoIGEgZmFjdG9yeSBmdW5jdGlvbi5cbiAqXG4gKiBJZiBhc3luYywgcHJvcGVydHkgY2Fubm90IGJlIGFjY2Vzc2VkIHVudGlsIHJlc29sdmVzLCB5ZWlsZGluZyBhIHJlc3VsdC5cbiAqIElmIGFjY2Vzc2VkIHdoaWxlIHN0aWxsIHByb2Nlc3NpbmcsIFJlYWN0IFN1c3BlbnNlIHdpbGwgYmUgdGhyb3duLlxuICpcbiAqIEBwYXJhbSBmYWN0b3J5IC0gQ2FsbGJhY2sgcnVuIHRvIGRlcnJpdmUgcHJvcGVydHkgdmFsdWUuXG4gKiBAcGFyYW0gcmVxdWlyZWQgLSBJZiB0cnVlIHJ1biBmYWN0b3J5IGltbWVkaWF0ZWx5IG9uIGNyZWF0aW9uLCBvdGhlcndpc2Ugb24gYWNjZXNzLlxuICovXG5mdW5jdGlvbiBzZXQgPFQ+IChmYWN0b3J5OiBzZXQuRmFjdG9yeTxUPiB8IFByb21pc2U8VD4sIHJlcXVpcmVkPzogYm9vbGVhbik6IFQ7XG5cbi8qKlxuICogU2V0IGEgcHJvcGVydHkgd2l0aCBlbXB0eSBwbGFjZWhvbGRlciBhbmQvb3IgdXBkYXRlIGNhbGxiYWNrLlxuICogXG4gKiBAcGFyYW0gdmFsdWUgLSBTdGFydGluZyB2YWx1ZSBmb3IgcHJvcGVydHkuIElmIHVuZGVmaW5lZCwgc3VzcGVuc2Ugd2lsbCBiZSB0aHJvd24gb24gYWNjZXNzLCB1bnRpbCB2YWx1ZSBpcyBzZXQgYW5kIGFjY2VwdGVkIGJ5IGNhbGxiYWNrLlxuICogQHBhcmFtIG9uVXBkYXRlIC0gQ2FsbGJhY2sgcnVuIHdoZW4gcHJvcGVydHkgaXMgc2V0LiBJZiByZXR1cm5zIGZhbHNlLCB1cGRhdGUgaXMgbm90IGFjY2VwdGVkIGFuZCBwcm9wZXJ0eSB3aWxsIGtlZXAgcHJldmlvdXMgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHNldCA8VD4gKHZhbHVlOiBUIHwgdW5kZWZpbmVkLCBvblVwZGF0ZT86IHNldC5DYWxsYmFjazxUPik6IFQ7XG5cbmZ1bmN0aW9uIHNldCA8VD4gKFxuICB2YWx1ZT86IHNldC5GYWN0b3J5PFQ+IHwgUHJvbWlzZTxUPiB8IFQsXG4gIGFyZ3VtZW50Pzogc2V0LkNhbGxiYWNrPGFueT4gfCBib29sZWFuKXtcblxuICByZXR1cm4gdXNlPFQ+KChrZXksIHN1YmplY3QpID0+IHtcbiAgICBjb25zdCBwcm9wZXJ0eTogTW9kZWwuRGVzY3JpcHRvciA9IHt9O1xuXG4gICAgaWYodHlwZW9mIHZhbHVlID09IFwiZnVuY3Rpb25cIiB8fCB2YWx1ZSBpbnN0YW5jZW9mIFByb21pc2Upe1xuICAgICAgZnVuY3Rpb24gaW5pdCgpe1xuICAgICAgICBpZih0eXBlb2YgdmFsdWUgPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGF0dGVtcHQodmFsdWUuYmluZChzdWJqZWN0LCBrZXkpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2F0Y2goZXJyKXtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgR2VuZXJhdGluZyBpbml0aWFsIHZhbHVlIGZvciAke3N1YmplY3R9LiR7a2V5fSBmYWlsZWQuYCk7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuXG4gICAgICAgIHByb3BlcnR5LmdldCA9IGFyZ3VtZW50ID09PSB0cnVlO1xuXG4gICAgICAgIGlmKHZhbHVlIGluc3RhbmNlb2YgUHJvbWlzZSl7XG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgIC50aGVuKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgdXBkYXRlKHN1YmplY3QsIGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgIGV2ZW50KHN1YmplY3QsIGtleSk7XG4gICAgICAgICAgICAgIHByb3BlcnR5LmdldCA9ICgpID0+IHsgdGhyb3cgZXJyIH07XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICB1cGRhdGUoc3ViamVjdCwga2V5LCB2YWx1ZSk7XG5cbiAgICAgICAgaWYoMCBpbiBhcmd1bWVudHMpXG4gICAgICAgICAgcmV0dXJuIHN1YmplY3Rba2V5XTtcbiAgICAgIH1cblxuICAgICAgaWYoYXJndW1lbnQpXG4gICAgICAgIGluaXQoKTtcbiAgICAgIGVsc2VcbiAgICAgICAgcHJvcGVydHkuZ2V0ID0gaW5pdDtcbiAgICB9XG4gICAgZWxzZSBpZih2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgcHJvcGVydHkudmFsdWUgPSB2YWx1ZTtcblxuICAgIGlmKHR5cGVvZiBhcmd1bWVudCA9PSBcImZ1bmN0aW9uXCIpe1xuICAgICAgbGV0IHVuc2V0OiAoKG5leHQ6IFQpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuXG4gICAgICBwcm9wZXJ0eS5zZXQgPSBmdW5jdGlvbih0aGlzOiBhbnksIHZhbHVlOiBhbnksIHByZXZpb3VzOiBhbnkpe1xuICAgICAgICBjb25zdCBjdHggPSBjb250ZXh0KCk7XG4gICAgICAgIGNvbnN0IG91dCA9IGFyZ3VtZW50LmNhbGwodGhpcywgdmFsdWUsIHByZXZpb3VzKTtcbiAgICAgICAgY29uc3QgZmx1c2ggPSBjdHgoKTtcblxuICAgICAgICBpZihvdXQgPT09IGZhbHNlKVxuICAgICAgICAgIHJldHVybiBvdXQ7XG5cbiAgICAgICAgaWYodHlwZW9mIHVuc2V0ID09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICB1bnNldCh2YWx1ZSk7XG5cbiAgICAgICAgdW5zZXQgPSAobmV4dDogVCkgPT4ge1xuICAgICAgICAgIGlmKHR5cGVvZiBvdXQgPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgb3V0KG5leHQpO1xuXG4gICAgICAgICAgZmx1c2goKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlXG4gICAgICBwcm9wZXJ0eS5zZXQgPSB2YWx1ZSA9PiB7XG4gICAgICAgIHByb3BlcnR5LmdldCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdXBkYXRlKHN1YmplY3QsIGtleSwgdmFsdWUpO1xuICAgICAgfVxuXG4gICAgcmV0dXJuIHByb3BlcnR5O1xuICB9KVxufVxuXG5mdW5jdGlvbiBhdHRlbXB0KGZuOiAoKSA9PiBhbnkpOiBhbnkge1xuICBmdW5jdGlvbiByZXRyeShlcnI6IHVua25vd24pe1xuICAgIGlmKGVyciBpbnN0YW5jZW9mIFByb21pc2UpXG4gICAgICByZXR1cm4gZXJyLnRoZW4oY29tcHV0ZSk7XG4gICAgZWxzZVxuICAgICAgdGhyb3cgZXJyO1xuICB9XG5cbiAgZnVuY3Rpb24gY29tcHV0ZSgpOiBhbnkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvdXRwdXQgPSBmbigpO1xuXG4gICAgICByZXR1cm4gb3V0cHV0IGluc3RhbmNlb2YgUHJvbWlzZVxuICAgICAgICA/IG91dHB1dC5jYXRjaChyZXRyeSlcbiAgICAgICAgOiBvdXRwdXQ7XG4gICAgfVxuICAgIGNhdGNoKGVycil7XG4gICAgICByZXR1cm4gcmV0cnkoZXJyKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29tcHV0ZSgpO1xufVxuXG5leHBvcnQgeyBzZXQgfSJdLAogICJtYXBwaW5ncyI6ICJBQUFBLFNBQVMsZUFBZTtBQUN4QixTQUFnQixPQUFPLGNBQWM7QUFDckMsU0FBUyxXQUFXO0FBNENwQixTQUFTLElBQ1AsT0FDQSxVQUF1QztBQUV2QyxTQUFPLElBQU8sQ0FBQyxLQUFLLFlBQVk7QUFDOUIsVUFBTSxXQUE2QixDQUFDO0FBRXBDLFFBQUcsT0FBTyxTQUFTLGNBQWMsaUJBQWlCLFNBQVE7QUFDeEQsVUFBU0EsUUFBVCxXQUFlO0FBQ2IsWUFBRyxPQUFPLFNBQVM7QUFDakIsY0FBSTtBQUNGLG9CQUFRLFFBQVEsTUFBTSxLQUFLLFNBQVMsR0FBRyxDQUFDO0FBQUEsVUFDMUMsU0FDTSxLQUFJO0FBQ1Isb0JBQVEsS0FBSyxnQ0FBZ0MsT0FBTyxJQUFJLEdBQUcsVUFBVTtBQUNyRSxrQkFBTTtBQUFBLFVBQ1I7QUFFRixpQkFBUyxNQUFNLGFBQWE7QUFFNUIsWUFBRyxpQkFBaUIsU0FBUTtBQUMxQixnQkFDRyxLQUFLLENBQUFDLFdBQVM7QUFDYixtQkFBTyxTQUFTLEtBQUtBLE1BQUs7QUFDMUIsbUJBQU9BO0FBQUEsVUFDVCxDQUFDLEVBQ0EsTUFBTSxTQUFPO0FBQ1osa0JBQU0sU0FBUyxHQUFHO0FBQ2xCLHFCQUFTLE1BQU0sTUFBTTtBQUFFLG9CQUFNO0FBQUEsWUFBSTtBQUFBLFVBQ25DLENBQUM7QUFBQSxRQUNMO0FBRUUsaUJBQU8sU0FBUyxLQUFLLEtBQUs7QUFFNUIsWUFBRyxLQUFLO0FBQ04saUJBQU8sUUFBUSxHQUFHO0FBQUEsTUFDdEI7QUE1QlMsaUJBQUFEO0FBOEJULFVBQUc7QUFDRCxRQUFBQSxNQUFLO0FBQUE7QUFFTCxpQkFBUyxNQUFNQTtBQUFBLElBQ25CLFdBQ1EsVUFBVTtBQUNoQixlQUFTLFFBQVE7QUFFbkIsUUFBRyxPQUFPLFlBQVksWUFBVztBQUMvQixVQUFJO0FBRUosZUFBUyxNQUFNLFNBQW9CQyxRQUFZLFVBQWM7QUFDM0QsY0FBTSxNQUFNLFFBQVE7QUFDcEIsY0FBTSxNQUFNLFNBQVMsS0FBSyxNQUFNQSxRQUFPLFFBQVE7QUFDL0MsY0FBTSxRQUFRLElBQUk7QUFFbEIsWUFBRyxRQUFRO0FBQ1QsaUJBQU87QUFFVCxZQUFHLE9BQU8sU0FBUztBQUNqQixnQkFBTUEsTUFBSztBQUViLGdCQUFRLENBQUMsU0FBWTtBQUNuQixjQUFHLE9BQU8sT0FBTztBQUNmLGdCQUFJLElBQUk7QUFFVixnQkFBTTtBQUFBLFFBQ1I7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUVFLGVBQVMsTUFBTSxDQUFBQSxXQUFTO0FBQ3RCLGlCQUFTLE1BQU07QUFDZixlQUFPLFNBQVMsS0FBS0EsTUFBSztBQUFBLE1BQzVCO0FBRUYsV0FBTztBQUFBLEVBQ1QsQ0FBQztBQUNIO0FBRUEsU0FBUyxRQUFRLElBQW9CO0FBQ25DLFdBQVMsTUFBTSxLQUFhO0FBQzFCLFFBQUcsZUFBZTtBQUNoQixhQUFPLElBQUksS0FBSyxPQUFPO0FBQUE7QUFFdkIsWUFBTTtBQUFBLEVBQ1Y7QUFFQSxXQUFTLFVBQWU7QUFDdEIsUUFBSTtBQUNGLFlBQU0sU0FBUyxHQUFHO0FBRWxCLGFBQU8sa0JBQWtCLFVBQ3JCLE9BQU8sTUFBTSxLQUFLLElBQ2xCO0FBQUEsSUFDTixTQUNNLEtBQUk7QUFDUixhQUFPLE1BQU0sR0FBRztBQUFBLElBQ2xCO0FBQUEsRUFDRjtBQUVBLFNBQU8sUUFBUTtBQUNqQjsiLAogICJuYW1lcyI6IFsiaW5pdCIsICJ2YWx1ZSJdCn0K
@@ -0,0 +1,65 @@
1
+ import { watch } from "../control";
2
+ import { define, fetch, mayAdopt, Model, PARENT, STATE, update } from "../model";
3
+ const INSTRUCT = /* @__PURE__ */ new Map();
4
+ function use(arg1, arg2) {
5
+ const token = Symbol("instruction");
6
+ if (Model.is(arg1)) {
7
+ const type = arg1;
8
+ arg1 = (key, subject) => {
9
+ const value = new type();
10
+ const desc = { set };
11
+ set(value);
12
+ PARENT.set(value, subject);
13
+ function set(next) {
14
+ if (next ? !(next instanceof type) : arg2 !== false)
15
+ throw new Error(`${subject}.${key} expected Model of type ${type} but got ${next && next.constructor}.`);
16
+ update(subject, key, next);
17
+ if (next && typeof arg2 == "function")
18
+ arg2(next);
19
+ return false;
20
+ }
21
+ return desc;
22
+ };
23
+ }
24
+ INSTRUCT.set(token, arg1);
25
+ return token;
26
+ }
27
+ Model.on((_, model) => {
28
+ const state = STATE.get(model);
29
+ for (const key in model) {
30
+ const { value } = Object.getOwnPropertyDescriptor(model, key);
31
+ const instruction = INSTRUCT.get(value);
32
+ if (!instruction) {
33
+ mayAdopt(model, value);
34
+ continue;
35
+ }
36
+ INSTRUCT.delete(value);
37
+ delete model[key];
38
+ const output = instruction.call(model, key, model, state);
39
+ if (!output)
40
+ continue;
41
+ const desc = typeof output == "object" ? output : { get: output };
42
+ if ("value" in desc)
43
+ state[key] = desc.value;
44
+ define(model, key, {
45
+ enumerable: desc.enumerable !== false,
46
+ get() {
47
+ return watch(
48
+ this,
49
+ key,
50
+ typeof desc.get == "function" ? desc.get(this) : fetch(model, key, desc.get)
51
+ );
52
+ },
53
+ set(next) {
54
+ if (desc.set === false)
55
+ throw new Error(`${model}.${key} is read-only.`);
56
+ update(model, key, next, desc.set);
57
+ }
58
+ });
59
+ }
60
+ return null;
61
+ });
62
+ export {
63
+ use
64
+ };
65
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luc3RydWN0aW9uL3VzZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi9jb250cm9sJztcbmltcG9ydCB7IGRlZmluZSwgZmV0Y2gsIG1heUFkb3B0LCBNb2RlbCwgUEFSRU5ULCBTVEFURSwgdXBkYXRlIH0gZnJvbSAnLi4vbW9kZWwnO1xuXG5jb25zdCBJTlNUUlVDVCA9IG5ldyBNYXA8c3ltYm9sLCBNb2RlbC5JbnN0cnVjdGlvbj4oKTtcblxuZnVuY3Rpb24gdXNlIDxUPiAoaW5zdHJ1Y3Rpb246IE1vZGVsLkluc3RydWN0aW9uPFQ+KTogVCBleHRlbmRzIHZvaWQgPyB1bmtub3duIDogVDtcblxuZnVuY3Rpb24gdXNlIDxUIGV4dGVuZHMgTW9kZWw+IChUeXBlOiBNb2RlbC5Jbml0PFQ+LCByZXF1aXJlZDogZmFsc2UpOiBUIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiB1c2UgPFQgZXh0ZW5kcyBNb2RlbD4gKFR5cGU6IE1vZGVsLkluaXQ8VD4sIHJlYWR5PzogKGk6IFQpID0+IHZvaWQpOiBUO1xuXG5mdW5jdGlvbiB1c2UoXG4gIGFyZzE6IE1vZGVsLkluaXQgfCBNb2RlbC5JbnN0cnVjdGlvbixcbiAgYXJnMj86ICgoaTogTW9kZWwpID0+IHZvaWQpIHwgYm9vbGVhbil7XG5cbiAgY29uc3QgdG9rZW4gPSBTeW1ib2woXCJpbnN0cnVjdGlvblwiKTtcblxuICBpZihNb2RlbC5pcyhhcmcxKSl7XG4gICAgY29uc3QgdHlwZSA9IGFyZzE7XG5cbiAgICBhcmcxID0gKGtleSwgc3ViamVjdCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBuZXcgdHlwZSgpO1xuICAgICAgY29uc3QgZGVzYzogTW9kZWwuRGVzY3JpcHRvciA9IHsgc2V0IH07XG5cbiAgICAgIHNldCh2YWx1ZSk7XG4gICAgICBQQVJFTlQuc2V0KHZhbHVlLCBzdWJqZWN0KTtcblxuICAgICAgZnVuY3Rpb24gc2V0KG5leHQ6IE1vZGVsIHwgdW5kZWZpbmVkKXtcbiAgICAgICAgaWYobmV4dCA/ICEobmV4dCBpbnN0YW5jZW9mIHR5cGUpIDogYXJnMiAhPT0gZmFsc2UpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3N1YmplY3R9LiR7a2V5fSBleHBlY3RlZCBNb2RlbCBvZiB0eXBlICR7dHlwZX0gYnV0IGdvdCAke25leHQgJiYgbmV4dC5jb25zdHJ1Y3Rvcn0uYClcbiAgXG4gICAgICAgIHVwZGF0ZShzdWJqZWN0LCBrZXksIG5leHQpO1xuICBcbiAgICAgICAgaWYobmV4dCAmJiB0eXBlb2YgYXJnMiA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgYXJnMihuZXh0KTtcbiAgXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgXG4gICAgICByZXR1cm4gZGVzYztcbiAgICB9XG4gIH1cblxuICBJTlNUUlVDVC5zZXQodG9rZW4sIGFyZzEpO1xuICByZXR1cm4gdG9rZW47XG59XG5cbk1vZGVsLm9uKChfLCBtb2RlbCkgPT4ge1xuICBjb25zdCBzdGF0ZSA9IFNUQVRFLmdldChtb2RlbCkhO1xuXG4gIGZvcihjb25zdCBrZXkgaW4gbW9kZWwpe1xuICAgIGNvbnN0IHsgdmFsdWUgfSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobW9kZWwsIGtleSkhO1xuICAgIGNvbnN0IGluc3RydWN0aW9uID0gSU5TVFJVQ1QuZ2V0KHZhbHVlKTtcblxuICAgIGlmKCFpbnN0cnVjdGlvbil7XG4gICAgICBtYXlBZG9wdChtb2RlbCwgdmFsdWUpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgSU5TVFJVQ1QuZGVsZXRlKHZhbHVlKTtcbiAgICBkZWxldGUgKG1vZGVsIGFzIGFueSlba2V5XTtcblxuICAgIGNvbnN0IG91dHB1dCA9IGluc3RydWN0aW9uLmNhbGwobW9kZWwsIGtleSwgbW9kZWwsIHN0YXRlKTtcblxuICAgIGlmKCFvdXRwdXQpXG4gICAgICBjb250aW51ZTtcblxuICAgIGNvbnN0IGRlc2MgPSB0eXBlb2Ygb3V0cHV0ID09IFwib2JqZWN0XCIgPyBvdXRwdXQgOiB7IGdldDogb3V0cHV0IH07XG5cbiAgICBpZihcInZhbHVlXCIgaW4gZGVzYylcbiAgICAgIHN0YXRlW2tleV0gPSBkZXNjLnZhbHVlO1xuXG4gICAgZGVmaW5lKG1vZGVsLCBrZXksIHtcbiAgICAgIGVudW1lcmFibGU6IGRlc2MuZW51bWVyYWJsZSAhPT0gZmFsc2UsXG4gICAgICBnZXQodGhpczogTW9kZWwpe1xuICAgICAgICByZXR1cm4gd2F0Y2godGhpcywga2V5LCBcbiAgICAgICAgICB0eXBlb2YgZGVzYy5nZXQgPT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICA/IGRlc2MuZ2V0KHRoaXMpXG4gICAgICAgICAgICA6IGZldGNoKG1vZGVsLCBrZXksIGRlc2MuZ2V0KVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIHNldChuZXh0KXtcbiAgICAgICAgaWYoZGVzYy5zZXQgPT09IGZhbHNlKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHttb2RlbH0uJHtrZXl9IGlzIHJlYWQtb25seS5gKTtcblxuICAgICAgICB1cGRhdGUobW9kZWwsIGtleSwgbmV4dCwgZGVzYy5zZXQpO1xuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn0pO1xuXG5leHBvcnQgeyB1c2UgfSJdLAogICJtYXBwaW5ncyI6ICJBQUFBLFNBQVMsYUFBYTtBQUN0QixTQUFTLFFBQVEsT0FBTyxVQUFVLE9BQU8sUUFBUSxPQUFPLGNBQWM7QUFFdEUsTUFBTSxXQUFXLG9CQUFJLElBQStCO0FBUXBELFNBQVMsSUFDUCxNQUNBLE1BQXNDO0FBRXRDLFFBQU0sUUFBUSxPQUFPLGFBQWE7QUFFbEMsTUFBRyxNQUFNLEdBQUcsSUFBSSxHQUFFO0FBQ2hCLFVBQU0sT0FBTztBQUViLFdBQU8sQ0FBQyxLQUFLLFlBQVk7QUFDdkIsWUFBTSxRQUFRLElBQUksS0FBSztBQUN2QixZQUFNLE9BQXlCLEVBQUUsSUFBSTtBQUVyQyxVQUFJLEtBQUs7QUFDVCxhQUFPLElBQUksT0FBTyxPQUFPO0FBRXpCLGVBQVMsSUFBSSxNQUF3QjtBQUNuQyxZQUFHLE9BQU8sRUFBRSxnQkFBZ0IsUUFBUSxTQUFTO0FBQzNDLGdCQUFNLElBQUksTUFBTSxHQUFHLE9BQU8sSUFBSSxHQUFHLDJCQUEyQixJQUFJLFlBQVksUUFBUSxLQUFLLFdBQVcsR0FBRztBQUV6RyxlQUFPLFNBQVMsS0FBSyxJQUFJO0FBRXpCLFlBQUcsUUFBUSxPQUFPLFFBQVE7QUFDeEIsZUFBSyxJQUFJO0FBRVgsZUFBTztBQUFBLE1BQ1Q7QUFFQSxhQUFPO0FBQUEsSUFDVDtBQUFBLEVBQ0Y7QUFFQSxXQUFTLElBQUksT0FBTyxJQUFJO0FBQ3hCLFNBQU87QUFDVDtBQUVBLE1BQU0sR0FBRyxDQUFDLEdBQUcsVUFBVTtBQUNyQixRQUFNLFFBQVEsTUFBTSxJQUFJLEtBQUs7QUFFN0IsYUFBVSxPQUFPLE9BQU07QUFDckIsVUFBTSxFQUFFLE1BQU0sSUFBSSxPQUFPLHlCQUF5QixPQUFPLEdBQUc7QUFDNUQsVUFBTSxjQUFjLFNBQVMsSUFBSSxLQUFLO0FBRXRDLFFBQUcsQ0FBQyxhQUFZO0FBQ2QsZUFBUyxPQUFPLEtBQUs7QUFDckI7QUFBQSxJQUNGO0FBRUEsYUFBUyxPQUFPLEtBQUs7QUFDckIsV0FBUSxNQUFjLEdBQUc7QUFFekIsVUFBTSxTQUFTLFlBQVksS0FBSyxPQUFPLEtBQUssT0FBTyxLQUFLO0FBRXhELFFBQUcsQ0FBQztBQUNGO0FBRUYsVUFBTSxPQUFPLE9BQU8sVUFBVSxXQUFXLFNBQVMsRUFBRSxLQUFLLE9BQU87QUFFaEUsUUFBRyxXQUFXO0FBQ1osWUFBTSxHQUFHLElBQUksS0FBSztBQUVwQixXQUFPLE9BQU8sS0FBSztBQUFBLE1BQ2pCLFlBQVksS0FBSyxlQUFlO0FBQUEsTUFDaEMsTUFBZ0I7QUFDZCxlQUFPO0FBQUEsVUFBTTtBQUFBLFVBQU07QUFBQSxVQUNqQixPQUFPLEtBQUssT0FBTyxhQUNmLEtBQUssSUFBSSxJQUFJLElBQ2IsTUFBTSxPQUFPLEtBQUssS0FBSyxHQUFHO0FBQUEsUUFDaEM7QUFBQSxNQUNGO0FBQUEsTUFDQSxJQUFJLE1BQUs7QUFDUCxZQUFHLEtBQUssUUFBUTtBQUNkLGdCQUFNLElBQUksTUFBTSxHQUFHLEtBQUssSUFBSSxHQUFHLGdCQUFnQjtBQUVqRCxlQUFPLE9BQU8sS0FBSyxNQUFNLEtBQUssR0FBRztBQUFBLE1BQ25DO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDSDtBQUVBLFNBQU87QUFDVCxDQUFDOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,274 @@
1
+ import { addListener, createEffect, event, pending, PENDING_KEYS, watch } from "./control";
2
+ const define = Object.defineProperty;
3
+ const ID = /* @__PURE__ */ new WeakMap();
4
+ const STATE = /* @__PURE__ */ new WeakMap();
5
+ const NOTIFY = /* @__PURE__ */ new WeakMap();
6
+ const PARENT = /* @__PURE__ */ new WeakMap();
7
+ const METHODS = /* @__PURE__ */ new WeakMap();
8
+ const METHOD = /* @__PURE__ */ new WeakMap();
9
+ class Model {
10
+ constructor(...args) {
11
+ prepare(this);
12
+ define(this, "is", { value: this });
13
+ init(this, args);
14
+ }
15
+ get(arg1, arg2) {
16
+ const self = this.is;
17
+ if (typeof arg1 == "function") {
18
+ let pending2 = /* @__PURE__ */ new Set();
19
+ return createEffect(self, (proxy) => {
20
+ const cb = arg1.call(proxy, proxy, pending2);
21
+ return cb === null ? null : (update2) => {
22
+ pending2 = PENDING_KEYS.get(self);
23
+ if (typeof cb == "function")
24
+ cb(update2);
25
+ };
26
+ });
27
+ }
28
+ if (arg1 === void 0)
29
+ return snapshot(self);
30
+ if (typeof arg2 == "function")
31
+ return addListener(self, arg2, arg1);
32
+ return arg1 === null ? Object.isFrozen(STATE.get(self)) : fetch(self, arg1, arg2);
33
+ }
34
+ set(arg1, arg2) {
35
+ const self = this.is;
36
+ if (typeof arg1 == "function")
37
+ return addListener(self, (key) => {
38
+ if (typeof key == "string")
39
+ return arg1.call(self, key, self);
40
+ });
41
+ if (arg1 && typeof arg1 == "object") {
42
+ const methods = METHODS.get(self.constructor);
43
+ for (const key in arg1)
44
+ if (methods.has(key))
45
+ self[key] = arg1[key];
46
+ else if (key in self)
47
+ update(self, key, arg1[key], arg2 === true);
48
+ } else
49
+ event(self, arg1);
50
+ return pending(self);
51
+ }
52
+ /**
53
+ * Iterate over managed properties in this instance of Model.
54
+ * Yeilds the key and current value for each property.
55
+ */
56
+ [Symbol.iterator]() {
57
+ return Object.entries(STATE.get(this.is))[Symbol.iterator]();
58
+ }
59
+ /**
60
+ * Create and activate a new instance of this model.
61
+ *
62
+ * **Important** - Unlike `new this(...)` - this method also activates state.
63
+ *
64
+ * @param args - arguments sent to constructor
65
+ */
66
+ static new(...args) {
67
+ const instance = new this(...args);
68
+ event(instance);
69
+ return instance;
70
+ }
71
+ /**
72
+ * Static equivalent of `x instanceof this`.
73
+ * Determines if provided class is a subtype of this one.
74
+ * If so, language server will make available all static
75
+ * methods and properties of this class.
76
+ */
77
+ static is(maybe) {
78
+ return maybe === this || typeof maybe == "function" && maybe.prototype instanceof this;
79
+ }
80
+ /**
81
+ * Register a callback to run when any instance of this Model is updated.
82
+ */
83
+ static on(listener) {
84
+ let notify = NOTIFY.get(this);
85
+ if (!notify)
86
+ NOTIFY.set(this, notify = /* @__PURE__ */ new Set());
87
+ notify.add(listener);
88
+ return () => notify.delete(listener);
89
+ }
90
+ }
91
+ define(Model.prototype, "toString", {
92
+ value() {
93
+ return ID.get(this.is);
94
+ }
95
+ });
96
+ define(Model, "toString", {
97
+ value() {
98
+ return this.name;
99
+ }
100
+ });
101
+ function prepare(model) {
102
+ let T = model.constructor;
103
+ if (T === Model)
104
+ throw new Error("Cannot create base Model.");
105
+ const chain = [];
106
+ let keys = /* @__PURE__ */ new Set();
107
+ ID.set(model, `${T}-${uid()}`);
108
+ while (T.name) {
109
+ for (const cb of NOTIFY.get(T) || [])
110
+ addListener(model, cb);
111
+ if (T === Model) break;
112
+ else chain.unshift(T);
113
+ T = Object.getPrototypeOf(T);
114
+ }
115
+ for (const type of chain) {
116
+ if (METHODS.has(type)) {
117
+ keys = METHODS.get(type);
118
+ continue;
119
+ }
120
+ METHODS.set(type, keys = new Set(keys));
121
+ for (const [key, { value }] of Object.entries(
122
+ Object.getOwnPropertyDescriptors(type.prototype)
123
+ )) {
124
+ let bind2 = function(method = value) {
125
+ const value2 = method.bind(this.is);
126
+ METHOD.set(value2, method);
127
+ define(this.is, key, { value: value2, writable: true });
128
+ return value2;
129
+ };
130
+ var bind = bind2;
131
+ if (!value || key == "constructor")
132
+ continue;
133
+ keys.add(key);
134
+ define(type.prototype, key, { get: bind2, set: bind2 });
135
+ }
136
+ }
137
+ }
138
+ function init(model, args) {
139
+ const methods = METHODS.get(model.constructor);
140
+ const state = {};
141
+ STATE.set(model, state);
142
+ args = args.flat().filter((arg) => {
143
+ if (typeof arg != "string")
144
+ return true;
145
+ ID.set(model, arg);
146
+ });
147
+ addListener(model, () => {
148
+ if (!PARENT.has(model))
149
+ PARENT.set(model, null);
150
+ args.forEach((arg) => {
151
+ const use = typeof arg == "function" ? arg.call(model, model) : arg;
152
+ if (use instanceof Promise)
153
+ use.catch((err) => {
154
+ console.error(`Async error in constructor for ${model}:`);
155
+ console.error(err);
156
+ });
157
+ else if (typeof use == "function")
158
+ addListener(model, use, null);
159
+ else if (typeof use == "object") {
160
+ for (const key in use)
161
+ if (key in model || methods.has(key))
162
+ model[key] = use[key];
163
+ }
164
+ });
165
+ for (const key in model) {
166
+ const desc = Object.getOwnPropertyDescriptor(model, key);
167
+ if ("value" in desc) {
168
+ update(model, key, desc.value, true);
169
+ define(model, key, {
170
+ configurable: false,
171
+ get() {
172
+ return watch(this, key, state[key]);
173
+ },
174
+ set(value) {
175
+ update(model, key, value);
176
+ mayAdopt(model, value);
177
+ }
178
+ });
179
+ }
180
+ }
181
+ addListener(model, () => {
182
+ for (const [_, value] of model)
183
+ if (value instanceof Model && PARENT.get(value) === model)
184
+ value.set(null);
185
+ Object.freeze(state);
186
+ }, null);
187
+ return null;
188
+ });
189
+ }
190
+ function mayAdopt(parent, child) {
191
+ if (child instanceof Model && !PARENT.has(child)) {
192
+ PARENT.set(child, parent);
193
+ event(child);
194
+ }
195
+ }
196
+ function fetch(subject, property, required) {
197
+ const state = STATE.get(subject);
198
+ if (property in state || required === false) {
199
+ const value = state[property];
200
+ if (value !== void 0 || !required)
201
+ return value;
202
+ }
203
+ const error = new Error(`${subject}.${property} is not yet available.`);
204
+ const promise = new Promise((resolve, reject) => {
205
+ addListener(subject, (key) => {
206
+ if (key === property) {
207
+ resolve(state[key]);
208
+ return null;
209
+ }
210
+ if (key === null)
211
+ reject(new Error(`${subject} is destroyed.`));
212
+ });
213
+ });
214
+ throw Object.assign(promise, {
215
+ toString: () => String(error),
216
+ name: "Suspense",
217
+ message: error.message,
218
+ stack: error.stack
219
+ });
220
+ }
221
+ let EXPORT;
222
+ function snapshot(model) {
223
+ const values = {};
224
+ let isNotRecursive;
225
+ if (!EXPORT) {
226
+ isNotRecursive = true;
227
+ EXPORT = /* @__PURE__ */ new Map([[model, values]]);
228
+ }
229
+ for (let [key, value] of model) {
230
+ if (EXPORT.has(value))
231
+ value = EXPORT.get(value);
232
+ else if (value && typeof value == "object" && "get" in value && typeof value.get === "function")
233
+ EXPORT.set(value, value = value.get());
234
+ values[key] = value;
235
+ }
236
+ if (isNotRecursive)
237
+ EXPORT = void 0;
238
+ return Object.freeze(values);
239
+ }
240
+ function update(subject, key, value, arg) {
241
+ const state = STATE.get(subject);
242
+ if (Object.isFrozen(state))
243
+ throw new Error(`Tried to update ${String(key)} but ${subject} is destroyed.`);
244
+ const previous = state[key];
245
+ if (typeof arg == "function") {
246
+ const out = arg.call(subject, value, previous);
247
+ if (out === false)
248
+ return false;
249
+ if (typeof out == "function")
250
+ value = out();
251
+ }
252
+ if (value === previous)
253
+ return;
254
+ state[key] = value;
255
+ if (arg !== true)
256
+ event(subject, key);
257
+ return true;
258
+ }
259
+ function uid() {
260
+ return (0.278 + Math.random() * 0.722).toString(36).substring(2, 8).toUpperCase();
261
+ }
262
+ export {
263
+ METHOD,
264
+ Model,
265
+ PARENT,
266
+ STATE,
267
+ define,
268
+ event,
269
+ fetch,
270
+ mayAdopt,
271
+ uid,
272
+ update
273
+ };
274
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL21vZGVsLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBhZGRMaXN0ZW5lciwgY3JlYXRlRWZmZWN0LCBldmVudCwgT25VcGRhdGUsIHBlbmRpbmcsIFBFTkRJTkdfS0VZUywgd2F0Y2ggfSBmcm9tICcuL2NvbnRyb2wnO1xuXG5leHBvcnQgY29uc3QgZGVmaW5lID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG4vKiogUmVnaXN0ZXIgZm9yIGFsbCBhY3RpdmUgbW9kZWxzIHZpYSBzdHJpbmcgaWRlbnRpZmllcnMgKHVzdWFsbHkgdW5pcXVlKS4gKi9cbmNvbnN0IElEID0gbmV3IFdlYWtNYXA8TW9kZWwsIHN0cmluZz4oKTtcblxuLyoqIEludGVybmFsIHN0YXRlIGFzc2lnbmVkIHRvIG1vZGVscy4gKi9cbmNvbnN0IFNUQVRFID0gbmV3IFdlYWtNYXA8TW9kZWwsIFJlY29yZDxzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wsIHVua25vd24+PigpO1xuXG4vKiogRXh0ZXJuYWwgbGlzdGVuZXJzIGZvciBhbnkgZ2l2ZW4gTW9kZWwuICovXG5jb25zdCBOT1RJRlkgPSBuZXcgV2Vha01hcDxNb2RlbC5UeXBlLCBTZXQ8T25VcGRhdGU+PigpO1xuXG4vKiogUGFyZW50LWNoaWxkIHJlbGF0aW9uc2hpcHMuICovXG5jb25zdCBQQVJFTlQgPSBuZXcgV2Vha01hcDxNb2RlbCwgTW9kZWwgfCBudWxsPigpO1xuXG4vKiogTGlzdCBvZiBtZXRob2RzIGRlZmluZWQgYnkgYSBnaXZlbiB0eXBlLiAqL1xuY29uc3QgTUVUSE9EUyA9IG5ldyBXZWFrTWFwPE1vZGVsLlR5cGUsIFNldDxzdHJpbmc+PigpO1xuXG4vKiogUmVmZXJlbmNlIGJvdW5kIGluc3RhbmNlIG1ldGhvZHMgdG8gcmVhbCBvbmVzLiAqL1xuY29uc3QgTUVUSE9EID0gbmV3IFdlYWtNYXA8YW55LCBhbnk+KCk7XG5cbmRlY2xhcmUgbmFtZXNwYWNlIE1vZGVsIHtcbiAgLyoqIEFueSB0eXBlIG9mIE1vZGVsLCB1c2luZyBvd24gY2xhc3MgY29uc3RydWN0b3IgYXMgaXRzIGlkZW50aWZpZXIuICovXG4gIHR5cGUgVHlwZTxUIGV4dGVuZHMgTW9kZWwgPSBNb2RlbD4gPVxuICAgIChhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUKSAmIHR5cGVvZiBNb2RlbDtcblxuICAvKiogQSBNb2RlbCBjb25zdHJ1Y3RvciwgYnV0IHdoaWNoIGlzIG5vdCBhYnN0cmFjdC4gKi9cbiAgdHlwZSBJbml0PFQgZXh0ZW5kcyBNb2RlbCA9IE1vZGVsPiA9XG4gICAgKG5ldyAoLi4uYXJnczogTW9kZWwuQXJnczxUPikgPT4gVCkgJiBPbWl0PHR5cGVvZiBNb2RlbCwgbmV2ZXI+O1xuXG4gIC8qKlxuICAgKiBNb2RlbCBjb25zdHJ1Y3RvciBjYWxsYmFjayAtIGlzIGNhbGxlZCB3aGVuIE1vZGVsIGZpbmlzaGVzIGludGlhbGl6aW5nLlxuICAgKiBSZXR1cm5lZCBmdW5jdGlvbiB3aWxsIHJ1biB3aGVuIG1vZGVsIGlzIGRlc3Ryb3llZC5cbiAgICovXG4gIHR5cGUgQ2FsbGJhY2s8VCBleHRlbmRzIE1vZGVsID0gTW9kZWw+ID1cbiAgICAodGhpczogVCwgdGhpc0FyZzogVCkgPT4gUHJvbWlzZTx2b2lkPiB8ICgoKSA9PiB2b2lkKSB8IEFzc2lnbjxUPiB8IHZvaWQ7XG5cbiAgLyoqIE1vZGVsIGNvbnN0cnVjdG9yIGFyZ3VtZW50ICovXG4gIHR5cGUgQXJndW1lbnQ8VCBleHRlbmRzIE1vZGVsID0gTW9kZWw+ID0gQXNzaWduPFQ+IHwgQ2FsbGJhY2s8VD4gfCBzdHJpbmcgfCB2b2lkO1xuXG4gIC8qKiBNb2RlbCBjb25zdHJ1Y3RvciBhcmd1bWVudHMgKi9cbiAgdHlwZSBBcmdzPFQgZXh0ZW5kcyBNb2RlbCA9IGFueT4gPSAoQXJndW1lbnQ8VD4gfCBBcmdzPFQ+KVtdO1xuXG4gIC8qKiBTdWJzZXQgb2YgYGtleW9mIFRgIHdoaWNoIGFyZSBub3QgbWV0aG9kcyBvciBkZWZpbmVkIGJ5IGJhc2UgTW9kZWwgVS4gKiovXG4gIHR5cGUgRmllbGQ8VD4gPSBFeGNsdWRlPGtleW9mIFQsIGtleW9mIE1vZGVsPjtcblxuICAvKiogQW55IHZhbGlkIGtleSBmb3IgbW9kZWwsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gRmllbGQ8VD4uICovXG4gIHR5cGUgRXZlbnQ8VD4gPSBGaWVsZDxUPiB8IChzdHJpbmcgJiB7fSkgfCBudW1iZXIgfCBzeW1ib2w7XG5cbiAgLyoqIE9iamVjdCBvdmVybGF5IHRvIG92ZXJyaWRlIHZhbHVlcyBhbmQgbWV0aG9kcyBvbiBhIG1vZGVsLiAqL1xuICB0eXBlIEFzc2lnbjxUPiA9IHtcbiAgICBbSyBpbiBFeGNsdWRlPGtleW9mIFQsIGtleW9mIE1vZGVsPl0/OlxuICAgICAgVFtLXSBleHRlbmRzICguLi5hcmdzOiBpbmZlciBBKSA9PiBpbmZlciBSIFxuICAgICAgICA/ICh0aGlzOiBULCAuLi5hcmdzOiBBKSA9PiBSXG4gICAgICAgIDogVFtLXTtcbiAgfSAmIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8qKiBFeHBvcnQvSW1wb3J0IGNvbXBhdGlibGUgdmFsdWUgZm9yIGEgZ2l2ZW4gcHJvcGVydHkgaW4gYSBNb2RlbC4gKi9cbiAgdHlwZSBFeHBvcnQ8Uj4gPSBSIGV4dGVuZHMgeyBnZXQoKTogaW5mZXIgVCB9ID8gVCA6IFI7XG5cbiAgLyoqIFZhbHVlIGZvciBhIHByb3BlcnR5IG1hbmFnZWQgYnkgYSBtb2RlbC4gKi9cbiAgdHlwZSBWYWx1ZTxUIGV4dGVuZHMgTW9kZWwsIEsgZXh0ZW5kcyBFdmVudDxUPj4gPVxuICAgIEsgZXh0ZW5kcyBrZXlvZiBUID8gRXhwb3J0PFRbS10+IDogdW5rbm93bjtcblxuICB0eXBlIE9uRXZlbnQ8VCBleHRlbmRzIE1vZGVsPiA9XG4gICAgKHRoaXM6IFQsIGtleTogdW5rbm93biwgc291cmNlOiBUKSA9PiAoKCkgPT4gdm9pZCkgfCB2b2lkIHwgbnVsbDtcblxuICB0eXBlIE9uVXBkYXRlPFQgZXh0ZW5kcyBNb2RlbCwgSyBleHRlbmRzIEV2ZW50PFQ+PiA9XG4gICAgKHRoaXM6IFQsIGtleTogSywgdGhpc0FyZzogSykgPT4gdm9pZDtcblxuICAvKipcbiAgICogVmFsdWVzIGZyb20gY3VycmVudCBzdGF0ZSBvZiBnaXZlbiBtb2RlbC5cbiAgICogRGlmZmVycyBmcm9tIGBWYWx1ZXNgIGFzIHZhbHVlcyBoZXJlIHdpbGwgZHJpbGxcbiAgICogaW50byBcInJlYWxcIiB2YWx1ZXMgaGVsZCBieSBleG90aWNzIGxpa2UgcmVmLk9iamVjdC5cbiAgICovXG4gIHR5cGUgU3RhdGU8VD4gPSB7IFtQIGluIEZpZWxkPFQ+XTogRXhwb3J0PFRbUF0+IH07XG5cbiAgLyoqIE9iamVjdCBjb21wZXJhYmxlIHRvIGRhdGEgZm91bmQgaW4gVC4gKi9cbiAgdHlwZSBWYWx1ZXM8VD4gPSB7IFtQIGluIEZpZWxkPFQ+XT86IEV4cG9ydDxUW1BdPiB9O1xuXG4gIC8qKiBFeG90aWMgdmFsdWUsIHdoZXJlIGFjdHVhbCB2YWx1ZSBpcyBjb250YWluZWQgd2l0aGluLiAqL1xuICB0eXBlIFJlZjxUID0gYW55PiA9IHtcbiAgICAobmV4dDogVCk6IHZvaWQ7XG4gICAgY3VycmVudDogVCB8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQSBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCBpcyBzdWJzY3JpYmVkIHRvIHBhcmVudCBhbmQgdXBkYXRlcyB3aGVuIGFjY2Vzc2VkIHByb3BlcnRpZXMgY2hhbmdlLlxuICAgKiBcbiAgICogQHBhcmFtIGN1cnJlbnQgLSBDdXJyZW50IHN0YXRlIG9mIHRoaXMgbW9kZWwuIFRoaXMgaXMgYSBwcm94eSB3aGljaCBkZXRlY3RzIHByb3BlcnRpZXMgd2hpY2hcbiAgICogd2hlcmUgYWNjZXNzZWQsIGFuZCB0aHVzIGRlcGVuZGVkIHVwb24gdG8gc3RheSBjdXJyZW50LlxuICAgKiBcbiAgICogQHBhcmFtIHVwZGF0ZSAtIFNldCBvZiBwcm9wZXJ0aWVzIHdoaWNoIGhhdmUgY2hhbmdlZCwgYW5kIGV2ZW50cyBmaXJlZCwgc2luY2UgbGFzdCB1cGRhdGUuXG4gICAqIFxuICAgKiBAcmV0dXJucyBBIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhpcyBlZmZlY3QgaXMgc3RhbGUuXG4gICAqL1xuICB0eXBlIEVmZmVjdDxUPiA9ICh0aGlzOiBULCBjdXJyZW50OiBULCB1cGRhdGU6IFNldDxFdmVudDxUPj4pID0+XG4gICAgRWZmZWN0Q2FsbGJhY2sgfCBQcm9taXNlPHZvaWQ+IHwgbnVsbCB8IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEEgY2FsbGJhY2sgZnVuY3Rpb24gcmV0dXJuZWQgYnkgZWZmZWN0LiBXaWxsIGJlIGNhbGxlZCB3aGVuIGVmZmVjdCBpcyBzdGFsZS5cbiAgICogXG4gICAqIEBwYXJhbSB1cGRhdGUgLSBgdHJ1ZWAgaWYgdXBkYXRlIGlzIHBlbmRpbmcsIGBmYWxzZWAgZWZmZWN0IGhhcyBiZWVuIGNhbmNlbGxlZCwgYG51bGxgIGlmIG1vZGVsIGlzIGRlc3Ryb3llZC5cbiAgICovXG4gIHR5cGUgRWZmZWN0Q2FsbGJhY2sgPSAoKHVwZGF0ZTogYm9vbGVhbiB8IG51bGwpID0+IHZvaWQpO1xuXG4gIC8qKlxuICAgKiBQcm9wZXJ0eSBpbml0aWFsaXplciwgd2lsbCBydW4gdXBvbiBpbnN0YW5jZSBjcmVhdGlvbi5cbiAgICogT3B0aW9uYWwgcmV0dXJuZWQgY2FsbGJhY2sgd2lsbCBydW4gd2hlbiBvbmNlIHVwb24gZmlyc3QgYWNjZXNzLlxuICAgKi9cbiAgdHlwZSBJbnN0cnVjdGlvbjxUID0gYW55LCBNIGV4dGVuZHMgTW9kZWwgPSBhbnk+ID1cbiAgICAvLyBUT0RPOiBTaG91bGQgdGhpcyBhbGxvdyBmb3IgbnVtYmVycy9zeW1ib2wgcHJvcGVydGllcz9cbiAgICAodGhpczogTSwga2V5OiBFeHRyYWN0PEZpZWxkPE0+LCBzdHJpbmc+LCB0aGlzQXJnOiBNLCBzdGF0ZTogU3RhdGU8TT4pID0+XG4gICAgICBEZXNjcmlwdG9yPFQ+IHwgKChzb3VyY2U6IE0pID0+IFQpIHwgdm9pZDtcblxuICB0eXBlIEdldHRlcjxUPiA9IChzb3VyY2U6IE1vZGVsKSA9PiBUO1xuICB0eXBlIFNldHRlcjxUPiA9ICh2YWx1ZTogVCwgcHJldmlvdXM6IFQpID0+IGJvb2xlYW4gfCB2b2lkIHwgKCgpID0+IFQpO1xuXG4gIHR5cGUgRGVzY3JpcHRvcjxUID0gYW55PiA9IHtcbiAgICBnZXQ/OiBHZXR0ZXI8VD4gfCBib29sZWFuO1xuICAgIHNldD86IFNldHRlcjxUPiB8IGJvb2xlYW47XG4gICAgZW51bWVyYWJsZT86IGJvb2xlYW47XG4gICAgdmFsdWU/OiBUO1xuICB9XG59XG5cbmludGVyZmFjZSBNb2RlbCB7XG4gIC8qKlxuICAgKiBMb29wYmFjayB0byBpbnN0YW5jZSBvZiB0aGlzIG1vZGVsLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGluIGEgc3Vic2NyaWJlZCBjb250ZXh0LFxuICAgKiB0byBrZWVwIHdyaXRlIGFjY2VzcyB0byBgdGhpc2AgYWZ0ZXIgYSBkZXN0cnVjdHVyZS4gWW91IGNhbiB1c2UgaXQgdG8gcmVhZCB2YXJpYWJsZXMgc2lsZW50bHkgYXMgd2VsbC5cbiAgICoqL1xuICBpczogdGhpcztcbn1cblxuYWJzdHJhY3QgY2xhc3MgTW9kZWwge1xuICBjb25zdHJ1Y3RvciguLi5hcmdzOiBNb2RlbC5BcmdzKXtcbiAgICBwcmVwYXJlKHRoaXMpO1xuICAgIGRlZmluZSh0aGlzLCBcImlzXCIsIHsgdmFsdWU6IHRoaXMgfSk7XG4gICAgaW5pdCh0aGlzLCBhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWxsIGN1cnJlbnQgdmFsdWVzIGZyb20gc3RhdGUuIEZsYXR0ZW5zIGFsbCBtb2RlbHMgYW5kIGV4b3RpYyB2YWx1ZXMgcmVjdXJzaXZlbHkuXG4gICAqIFxuICAgKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBhbGwgdmFsdWVzIGZyb20gdGhpcyBtb2RlbC5cbiAgICoqL1xuICBnZXQoKTogTW9kZWwuU3RhdGU8dGhpcz47XG5cbiAgLyoqXG4gICAqIFJ1biBhIGZ1bmN0aW9uIHdoaWNoIHdpbGwgcnVuIGF1dG9tYXRpY2FsbHkgd2hlbiBhY2Nlc3NlZCB2YWx1ZXMgY2hhbmdlLlxuICAgKiBcbiAgICogQHBhcmFtIGVmZmVjdCBGdW5jdGlvbiB0byBydW4sIGFuZCBhZ2FpbiB3aGVuZXZlciBhY2Nlc3NlZCB2YWx1ZXMgY2hhbmdlLlxuICAgKiAgICAgICAgICAgICAgIElmIGVmZmVjdCByZXR1cm5zIGEgZnVuY3Rpb24sIGl0IHdpbGwgYmUgY2FsbGVkIHdoZW4gYSBjaGFuZ2Ugb2NjdXJzIChzeW5jcm9ub3VzbHkpLFxuICAgKiAgICAgICAgICAgICAgIGVmZmVjdCBpcyBjYW5jZWxsZWQsIG9yIHBhcmVudCBtb2RlbCBpcyBkZXN0cm95ZWQuXG4gICAqIEByZXR1cm5zIEZ1bmN0aW9uIHRvIGNhbmNlbCBsaXN0ZW5lci5cbiAgICovXG4gIGdldChlZmZlY3Q6IE1vZGVsLkVmZmVjdDx0aGlzPik6ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEdldCB2YWx1ZSBvZiBhIHByb3BlcnR5LlxuICAgKiBcbiAgICogQHBhcmFtIGtleSAtIFByb3BlcnR5IHRvIGdldCB2YWx1ZSBvZi5cbiAgICogQHBhcmFtIHJlcXVpcmVkIC0gSWYgdHJ1ZSwgd2lsbCB0aHJvdyBhbiBlcnJvciBpZiBwcm9wZXJ0eSBpcyBub3QgYXZhaWxhYmxlLlxuICAgKiBAcmV0dXJucyBWYWx1ZSBvZiBwcm9wZXJ0eS5cbiAgICovXG4gIGdldDxUIGV4dGVuZHMgTW9kZWwuRXZlbnQ8dGhpcz4+KGtleTogVCwgcmVxdWlyZWQ/OiBib29sZWFuKTogTW9kZWwuVmFsdWU8dGhpcywgVD47XG5cbiAgLyoqXG4gICAqIFJ1biBhIGZ1bmN0aW9uIHdoZW4gYSBwcm9wZXJ0eSBpcyB1cGRhdGVkLlxuICAgKiBcbiAgICogQHBhcmFtIGtleSAtIFByb3BlcnR5IHRvIHdhdGNoIGZvciB1cGRhdGVzLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsIHdoZW4gcHJvcGVydHkgaXMgdXBkYXRlZC5cbiAgICogQHJldHVybnMgRnVuY3Rpb24gdG8gY2FuY2VsIGxpc3RlbmVyLlxuICAgKi9cbiAgZ2V0PFQgZXh0ZW5kcyBNb2RlbC5FdmVudDx0aGlzPj4oa2V5OiBULCBjYWxsYmFjazogTW9kZWwuT25VcGRhdGU8dGhpcywgVD4pOiAoKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBtb2RlbCBpcyBleHBpcmVkLlxuICAgKiBcbiAgICogQHBhcmFtIHN0YXR1cyAtIGBudWxsYCB0byBjaGVjayBpZiBtb2RlbCBpcyBleHBpcmVkLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgbW9kZWwgaXMgZXhwaXJlZCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqL1xuICBnZXQoc3RhdHVzOiBudWxsKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ2FsbGJhY2sgd2hlbiBtb2RlbCBpcyB0byBiZSBkZXN0cm95ZWQuXG4gICAqIFxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsIHdoZW4gbW9kZWwgaXMgZGVzdHJveWVkLlxuICAgKiBAcmV0dXJucyBGdW5jdGlvbiB0byBjYW5jZWwgbGlzdGVuZXIuXG4gICAqL1xuICBnZXQoc3RhdHVzOiBudWxsLCBjYWxsYmFjazogKCkgPT4gdm9pZCk6ICgpID0+IHZvaWQ7XG5cbiAgZ2V0KGFyZzE/OiBNb2RlbC5FZmZlY3Q8dGhpcz4gfCBzdHJpbmcgfCBudWxsLCBhcmcyPzogYm9vbGVhbiB8IE1vZGVsLk9uVXBkYXRlPHRoaXMsIGFueT4pe1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzLmlzO1xuXG4gICAgaWYodHlwZW9mIGFyZzEgPT0gXCJmdW5jdGlvblwiKXtcbiAgICAgIGxldCBwZW5kaW5nID0gbmV3IFNldDxNb2RlbC5FdmVudDx0aGlzPj4oKTtcblxuICAgICAgcmV0dXJuIGNyZWF0ZUVmZmVjdChzZWxmLCAocHJveHkpID0+IHtcbiAgICAgICAgY29uc3QgY2IgPSBhcmcxLmNhbGwocHJveHksIHByb3h5LCBwZW5kaW5nKTtcblxuICAgICAgICByZXR1cm4gY2IgPT09IG51bGwgPyBudWxsIDogKCh1cGRhdGUpID0+IHtcbiAgICAgICAgICBwZW5kaW5nID0gUEVORElOR19LRVlTLmdldChzZWxmKSE7XG4gICAgICAgICAgaWYodHlwZW9mIGNiID09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgIGNiKHVwZGF0ZSk7XG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZihhcmcxID09PSB1bmRlZmluZWQpXG4gICAgICByZXR1cm4gc25hcHNob3Qoc2VsZik7XG5cbiAgICBpZih0eXBlb2YgYXJnMiA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICByZXR1cm4gYWRkTGlzdGVuZXIoc2VsZiwgYXJnMiwgYXJnMSlcblxuICAgIHJldHVybiBhcmcxID09PSBudWxsXG4gICAgICA/IE9iamVjdC5pc0Zyb3plbihTVEFURS5nZXQoc2VsZikpXG4gICAgICA6IGZldGNoKHNlbGYsIGFyZzEsIGFyZzIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1cGRhdGUgaW4gcHJvZ3Jlc3MuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgb2JqZWN0IHdpdGggdXBkYXRlZCB2YWx1ZXMsIGB1bmRlZmluZWRgIGlmIHRoZXJlIG5vIHVwZGF0ZSBpcyBwZW5kaW5nLlxuICAgKiovXG4gIHNldCgpOiBQcm9taXNlTGlrZTxNb2RlbC5FdmVudDx0aGlzPltdPiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVXBkYXRlIG11bGl0cGxlIHByb3BlcnRpZXMgYXQgb25jZS4gTWVyZ2VzIGFyZ3VtZW50IHdpdGggY3VycmVudCBzdGF0ZS5cbiAgICogUHJvcGVydGllcyB3aGljaCBhcmUgbm90IG1hbmFnZWQgYnkgdGhpcyBtb2RlbCB3aWxsIGJlIGlnbm9yZWQuXG4gICAqIFxuICAgKiBAcGFyYW0gYXNzaWduIC0gT2JqZWN0IHdpdGggcHJvcGVydGllcyB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSBzaWxlbnQgLSBJZiBhbiB1cGRhdGUgZG9lcyBvY2N1ciwgbGlzdGVuZXJzIHdpbGwgbm90IGJlIHJlZnJlc2hlZCBhdXRvbWF0aWNhbGx5LlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyBhbiBhcnJheSBvZiBrZXlzIHVwZGF0ZWQsIGB1bmRlZmluZWRgIChpbW1lZGlhdGVseSkgaWYgYSBub29wLlxuICAgKi9cbiAgc2V0KGFzc2lnbjogTW9kZWwuQXNzaWduPHRoaXM+LCBzaWxlbnQ/OiBib29sZWFuKTogUHJvbWlzZUxpa2U8TW9kZWwuRXZlbnQ8dGhpcz5bXT4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFB1c2ggYW4gdXBkYXRlLiBUaGlzIHdpbGwgbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgYXNzb2NpYXRlZCBwcm9wZXJ0eS5cbiAgICogXG4gICAqIFVzZWZ1bCB3aGVyZSBhIHByb3BlcnR5IHZhbHVlIGludGVybmFsbHkgaGFzIGNoYW5nZWQsIGJ1dCB0aGUgb2JqZWN0IGlzIHRoZSBzYW1lLlxuICAgKiBGb3IgZXhhbXBsZTogQW4gYXJyYXkgaGFzIHB1c2hlZCBhIG5ldyB2YWx1ZSwgb3IgYSBuZXN0ZWQgcHJvcGVydHkgaXMgdXBkYXRlZC5cbiAgICogXG4gICAqIFlvdSBjYW4gYWxzbyB1c2UgdGhpcyB0byBkaXNwYXRjaCBhcmJpdHJhcnkgZXZlbnRzLlxuICAgKiBTeW1ib2xzIGFyZSByZWNvbW1lbmRlZCBhcyBub24tcHJvcGVydHkgZXZlbnRzLCBob3dldmVyIHlvdSBjYW4gdXNlIGFueSBzdHJpbmcuXG4gICAqIElmIGRvaW5nIHNvLCBiZSBzdXJlIHRvIGF2b2lkIGNvbGxpc2lvbnMgd2l0aCBwcm9wZXJ0eSBuYW1lcyEgQW4gZWFzeSB3YXkgdG8gZG8gdGhpcyBpc1xuICAgKiB0byBwcmVmaXggYW4gZXZlbnQgd2l0aCBcIiFcIiBhbmQvb3IgdXNlIGRhc2gtY2FzZS4gZS5nLiBgc2V0KFwiIWV2ZW50XCIpYCBvciBgc2V0KFwibXktZXZlbnRcIilgLlxuICAgKiBcbiAgICogQHBhcmFtIGtleSAtIFByb3BlcnR5IG9yIGV2ZW50IHRvIGRpc3BhdGNoLlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIGFuIGFycmF5IG9mIGtleXMgdXBkYXRlZC5cbiAgICovXG4gIHNldChrZXk6IE1vZGVsLkV2ZW50PHRoaXM+KTogUHJvbWlzZUxpa2U8TW9kZWwuRXZlbnQ8dGhpcz5bXT47XG5cbiAgLyoqXG4gICAqIENhbGwgYSBmdW5jdGlvbiB3aGVuIHVwZGF0ZSBvY2N1cnMuXG4gICAqIFxuICAgKiBHaXZlbiBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGV2ZXJ5IGFzc2lnbm1lbnQgKHdoaWNoIGNoYW5nZXMgdmFsdWUpIG9yIGV4cGxpY2l0IGBzZXRgLlxuICAgKiBcbiAgICogVG8gcnVuIGxvZ2ljIG9uIGZpbmFsIHZhbHVlIG9ubHksIGNhbGxiYWNrIG1heSByZXR1cm4gYSBmdW5jdGlvbi4gVXNpbmcgdGhlIHNhbWVcbiAgICogZnVuY3Rpb24gZm9yIG9uZSBvciBtb3JlIGV2ZW50cyB3aWxsIGVuc3VyZSBpdCBpcyBjYWxsZWQgb25seSB3aGVuIGV2ZW50cyBhcmUgc2V0dGxlZC5cbiAgICogXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIEZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB1cGRhdGUgb2NjdXJzLlxuICAgKiBAcmV0dXJucyBGdW5jdGlvbiB0byByZW1vdmUgbGlzdGVuZXIuIFdpbGwgcmV0dXJuIGB0cnVlYCBpZiByZW1vdmVkLCBgZmFsc2VgIGlmIGluYWN0aXZlIGFscmVhZHkuXG4gICAqIFxuICAqL1xuICBzZXQoY2FsbGJhY2s6IE1vZGVsLk9uRXZlbnQ8dGhpcz4pOiAoKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEZWNsYXJlIGFuIGVuZCB0byB1cGRhdGVzLiBUaGlzIGV2ZW50IGlzIGZpbmFsIGFuZCB3aWxsIGZyZWV6ZSBzdGF0ZS5cbiAgICogVGhpcyBldmVudCBjYW4gYmUgd2F0Y2hlZCBmb3IgYXMgd2VsbCwgdG8gcnVuIGNsZWFudXAgbG9naWMgYW5kIGludGVybmFsbHkgd2lsbCByZW1vdmUgYWxsIGxpc3RlbmVycy5cbiAgICogXG4gICAqIEBwYXJhbSBzdGF0dXMgLSBgbnVsbGAgdG8gZW5kIHVwZGF0ZXMuXG4gICAqL1xuICBzZXQoc3RhdHVzOiBudWxsKTogdm9pZDtcblxuICBzZXQoXG4gICAgYXJnMT86IE1vZGVsLk9uRXZlbnQ8dGhpcz4gfCBNb2RlbC5Bc3NpZ248dGhpcz4gfCBNb2RlbC5FdmVudDx0aGlzPiB8IG51bGwsXG4gICAgYXJnMj86IHVua25vd24pe1xuXG4gICAgY29uc3Qgc2VsZiA9IHRoaXMuaXM7XG5cbiAgICBpZih0eXBlb2YgYXJnMSA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICByZXR1cm4gYWRkTGlzdGVuZXIoc2VsZiwga2V5ID0+IHtcbiAgICAgICAgaWYodHlwZW9mIGtleSA9PSBcInN0cmluZ1wiKVxuICAgICAgICAgIHJldHVybiBhcmcxLmNhbGwoc2VsZiwga2V5LCBzZWxmKTtcbiAgICAgIH0pXG5cbiAgICBpZihhcmcxICYmIHR5cGVvZiBhcmcxID09IFwib2JqZWN0XCIpe1xuICAgICAgY29uc3QgbWV0aG9kcyA9IE1FVEhPRFMuZ2V0KHNlbGYuY29uc3RydWN0b3IgYXMgTW9kZWwuVHlwZSkhO1xuICAgIFxuICAgICAgZm9yKGNvbnN0IGtleSBpbiBhcmcxKVxuICAgICAgICBpZihtZXRob2RzLmhhcyhrZXkpKVxuICAgICAgICAgIHNlbGZba2V5IGFzIGtleW9mIHRoaXNdID0gYXJnMVtrZXldIGFzIGFueTtcbiAgICAgICAgZWxzZSBpZihrZXkgaW4gc2VsZilcbiAgICAgICAgICB1cGRhdGUoc2VsZiwga2V5LCBhcmcxW2tleV0sIGFyZzIgPT09IHRydWUpO1xuICAgIH1cbiAgICBlbHNlXG4gICAgICBldmVudChzZWxmLCBhcmcxKTtcblxuICAgIHJldHVybiBwZW5kaW5nKHNlbGYpO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGUgb3ZlciBtYW5hZ2VkIHByb3BlcnRpZXMgaW4gdGhpcyBpbnN0YW5jZSBvZiBNb2RlbC5cbiAgICogWWVpbGRzIHRoZSBrZXkgYW5kIGN1cnJlbnQgdmFsdWUgZm9yIGVhY2ggcHJvcGVydHkuXG4gICAqL1xuICBbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYXRvcjxbc3RyaW5nLCB1bmtub3duXT4ge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhTVEFURS5nZXQodGhpcy5pcykhKVtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuZCBhY3RpdmF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIG1vZGVsLlxuICAgKiBcbiAgICogKipJbXBvcnRhbnQqKiAtIFVubGlrZSBgbmV3IHRoaXMoLi4uKWAgLSB0aGlzIG1ldGhvZCBhbHNvIGFjdGl2YXRlcyBzdGF0ZS5cbiAgICogXG4gICAqIEBwYXJhbSBhcmdzIC0gYXJndW1lbnRzIHNlbnQgdG8gY29uc3RydWN0b3JcbiAgICovXG4gIHN0YXRpYyBuZXc8VCBleHRlbmRzIE1vZGVsPih0aGlzOiBNb2RlbC5Jbml0PFQ+LCAuLi5hcmdzOiBNb2RlbC5BcmdzPFQ+KXtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyB0aGlzKC4uLmFyZ3MpO1xuICAgIGV2ZW50KGluc3RhbmNlKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogU3RhdGljIGVxdWl2YWxlbnQgb2YgYHggaW5zdGFuY2VvZiB0aGlzYC5cbiAgICogRGV0ZXJtaW5lcyBpZiBwcm92aWRlZCBjbGFzcyBpcyBhIHN1YnR5cGUgb2YgdGhpcyBvbmUuXG4gICAqIElmIHNvLCBsYW5ndWFnZSBzZXJ2ZXIgd2lsbCBtYWtlIGF2YWlsYWJsZSBhbGwgc3RhdGljXG4gICAqIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMgb2YgdGhpcyBjbGFzcy5cbiAgICovXG4gIHN0YXRpYyBpczxUIGV4dGVuZHMgTW9kZWwuVHlwZT4odGhpczogVCwgbWF5YmU6IHVua25vd24pOiBtYXliZSBpcyBUIHtcbiAgICByZXR1cm4gbWF5YmUgPT09IHRoaXMgfHwgdHlwZW9mIG1heWJlID09IFwiZnVuY3Rpb25cIiAmJiBtYXliZS5wcm90b3R5cGUgaW5zdGFuY2VvZiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gcnVuIHdoZW4gYW55IGluc3RhbmNlIG9mIHRoaXMgTW9kZWwgaXMgdXBkYXRlZC4gXG4gICAqL1xuICBzdGF0aWMgb248VCBleHRlbmRzIE1vZGVsPih0aGlzOiBNb2RlbC5UeXBlPFQ+LCBsaXN0ZW5lcjogTW9kZWwuT25FdmVudDxUPil7XG4gICAgbGV0IG5vdGlmeSA9IE5PVElGWS5nZXQodGhpcyk7XG5cbiAgICBpZighbm90aWZ5KVxuICAgICAgTk9USUZZLnNldCh0aGlzLCBub3RpZnkgPSBuZXcgU2V0KTtcblxuICAgIG5vdGlmeS5hZGQobGlzdGVuZXIpO1xuXG4gICAgcmV0dXJuICgpID0+IG5vdGlmeS5kZWxldGUobGlzdGVuZXIpO1xuICB9XG59XG5cbmRlZmluZShNb2RlbC5wcm90b3R5cGUsIFwidG9TdHJpbmdcIiwge1xuICB2YWx1ZSgpe1xuICAgIHJldHVybiBJRC5nZXQodGhpcy5pcyk7XG4gIH1cbn0pO1xuXG5kZWZpbmUoTW9kZWwsIFwidG9TdHJpbmdcIiwge1xuICB2YWx1ZSgpe1xuICAgIHJldHVybiB0aGlzLm5hbWU7XG4gIH1cbn0pO1xuXG4vKiogQXBwbHkgaW5zdHJ1Y3Rpb25zIGFuZCBpbmhlcml0ZWQgZXZlbnQgbGlzdGVuZXJzLiBFbnN1cmUgY2xhc3MgbWV0YWRhdGEgaXMgcmVhZHkuICovXG5mdW5jdGlvbiBwcmVwYXJlKG1vZGVsOiBNb2RlbCl7XG4gIGxldCBUID0gbW9kZWwuY29uc3RydWN0b3IgYXMgTW9kZWwuVHlwZTtcblxuICBpZihUID09PSBNb2RlbClcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY3JlYXRlIGJhc2UgTW9kZWwuXCIpO1xuXG4gIGNvbnN0IGNoYWluID0gW10gYXMgTW9kZWwuVHlwZVtdO1xuICBsZXQga2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIElELnNldChtb2RlbCwgYCR7VH0tJHt1aWQoKX1gKTtcblxuICB3aGlsZShULm5hbWUpe1xuICAgIGZvcihjb25zdCBjYiBvZiBOT1RJRlkuZ2V0KFQpIHx8IFtdKVxuICAgICAgYWRkTGlzdGVuZXIobW9kZWwsIGNiKTtcblxuICAgIGlmKFQgPT09IE1vZGVsKSBicmVhaztcbiAgICBlbHNlIGNoYWluLnVuc2hpZnQoVCk7XG5cbiAgICBUID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKFQpXG4gIH1cblxuICBmb3IoY29uc3QgdHlwZSBvZiBjaGFpbil7XG4gICAgaWYoTUVUSE9EUy5oYXModHlwZSkpe1xuICAgICAga2V5cyA9IE1FVEhPRFMuZ2V0KHR5cGUpITtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIE1FVEhPRFMuc2V0KHR5cGUsIGtleXMgPSBuZXcgU2V0KGtleXMpKTtcblxuICAgIGZvcihjb25zdCBba2V5LCB7IHZhbHVlIH1dIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModHlwZS5wcm90b3R5cGUpXG4gICAgKSl7XG4gICAgICBpZighdmFsdWUgfHwga2V5ID09IFwiY29uc3RydWN0b3JcIilcbiAgICAgICAgY29udGludWU7XG4gICAgICBcbiAgICAgIGZ1bmN0aW9uIGJpbmQodGhpczogTW9kZWwsIG1ldGhvZCA9IHZhbHVlKXtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBtZXRob2QuYmluZCh0aGlzLmlzKTtcbiAgICAgICAgXG4gICAgICAgIE1FVEhPRC5zZXQodmFsdWUsIG1ldGhvZCk7XG4gICAgICAgIGRlZmluZSh0aGlzLmlzLCBrZXksIHsgdmFsdWUsIHdyaXRhYmxlOiB0cnVlIH0pO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuXG4gICAgICBrZXlzLmFkZChrZXkpO1xuICAgICAgZGVmaW5lKHR5cGUucHJvdG90eXBlLCBrZXksIHsgZ2V0OiBiaW5kLCBzZXQ6IGJpbmQgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQXBwbHkgbW9kZWwgYXJndWVtbnRzLCBydW4gY2FsbGJhY2tzIGFuZCBvYnNlcnZlIHByb3BlcnRpZXMuXG4gKiBBY2N1bXVsYXRlIGFuZCBoYW5kbGUgY2xlYW51cCBldmVudHMuXG4gKiovXG5mdW5jdGlvbiBpbml0KG1vZGVsOiBNb2RlbCwgYXJnczogTW9kZWwuQXJncyl7XG4gIGNvbnN0IG1ldGhvZHMgPSBNRVRIT0RTLmdldChtb2RlbC5jb25zdHJ1Y3RvciBhcyBNb2RlbC5UeXBlKSE7XG4gIGNvbnN0IHN0YXRlID0ge30gYXMgUmVjb3JkPHN0cmluZyB8IG51bWJlciB8IHN5bWJvbCwgdW5rbm93bj47XG5cbiAgU1RBVEUuc2V0KG1vZGVsLCBzdGF0ZSk7XG5cbiAgYXJncyA9IGFyZ3MuZmxhdCgpLmZpbHRlcihhcmcgPT4ge1xuICAgIGlmKHR5cGVvZiBhcmcgIT0gXCJzdHJpbmdcIilcbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgSUQuc2V0KG1vZGVsLCBhcmcpO1xuICB9KTtcblxuICBhZGRMaXN0ZW5lcihtb2RlbCwgKCkgPT4ge1xuICAgIGlmKCFQQVJFTlQuaGFzKG1vZGVsKSlcbiAgICAgIFBBUkVOVC5zZXQobW9kZWwsIG51bGwpO1xuICAgIFxuICAgIGFyZ3MuZm9yRWFjaCgoYXJnKSA9PiB7XG4gICAgICBjb25zdCB1c2UgPSB0eXBlb2YgYXJnID09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IGFyZy5jYWxsKG1vZGVsLCBtb2RlbClcbiAgICAgICAgOiBhcmcgYXMgTW9kZWwuQXNzaWduPE1vZGVsPjtcblxuICAgICAgaWYodXNlIGluc3RhbmNlb2YgUHJvbWlzZSlcbiAgICAgICAgdXNlLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgQXN5bmMgZXJyb3IgaW4gY29uc3RydWN0b3IgZm9yICR7bW9kZWx9OmApO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgICBlbHNlIGlmKHR5cGVvZiB1c2UgPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBhZGRMaXN0ZW5lcihtb2RlbCwgdXNlLCBudWxsKVxuICAgICAgZWxzZSBpZih0eXBlb2YgdXNlID09IFwib2JqZWN0XCIpXG4gICAgICAgIGZvcihjb25zdCBrZXkgaW4gdXNlKVxuICAgICAgICAgIGlmKGtleSBpbiBtb2RlbCB8fCBtZXRob2RzLmhhcyhrZXkpKVxuICAgICAgICAgICAgbW9kZWxba2V5IGFzIGtleW9mIE1vZGVsXSA9IHVzZVtrZXldIGFzIGFueTtcbiAgICB9KTtcblxuICAgIGZvcihjb25zdCBrZXkgaW4gbW9kZWwpe1xuICAgICAgY29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobW9kZWwsIGtleSkhO1xuXG4gICAgICBpZihcInZhbHVlXCIgaW4gZGVzYyl7XG4gICAgICAgIHVwZGF0ZShtb2RlbCwga2V5LCBkZXNjLnZhbHVlLCB0cnVlKTtcbiAgICAgICAgZGVmaW5lKG1vZGVsLCBrZXksIHtcbiAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgIGdldCgpe1xuICAgICAgICAgICAgcmV0dXJuIHdhdGNoKHRoaXMsIGtleSwgc3RhdGVba2V5XSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXQodmFsdWUpe1xuICAgICAgICAgICAgdXBkYXRlKG1vZGVsLCBrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIG1heUFkb3B0KG1vZGVsLCB2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRMaXN0ZW5lcihtb2RlbCwgKCkgPT4ge1xuICAgICAgZm9yKGNvbnN0IFtfLCB2YWx1ZV0gb2YgbW9kZWwpXG4gICAgICAgIGlmKHZhbHVlIGluc3RhbmNlb2YgTW9kZWwgJiYgUEFSRU5ULmdldCh2YWx1ZSkgPT09IG1vZGVsKVxuICAgICAgICAgIHZhbHVlLnNldChudWxsKTtcbiAgXG4gICAgICBPYmplY3QuZnJlZXplKHN0YXRlKTtcbiAgICB9LCBudWxsKTtcbiAgXG4gICAgcmV0dXJuIG51bGw7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBtYXlBZG9wdChwYXJlbnQ6IE1vZGVsLCBjaGlsZDogdW5rbm93bil7XG4gIGlmKGNoaWxkIGluc3RhbmNlb2YgTW9kZWwgJiYgIVBBUkVOVC5oYXMoY2hpbGQpKXtcbiAgICBQQVJFTlQuc2V0KGNoaWxkLCBwYXJlbnQpO1xuICAgIGV2ZW50KGNoaWxkKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmZXRjaChzdWJqZWN0OiBNb2RlbCwgcHJvcGVydHk6IHN0cmluZywgcmVxdWlyZWQ/OiBib29sZWFuKXtcbiAgY29uc3Qgc3RhdGUgPSBTVEFURS5nZXQoc3ViamVjdCkhO1xuICBcbiAgaWYocHJvcGVydHkgaW4gc3RhdGUgfHwgcmVxdWlyZWQgPT09IGZhbHNlKXtcbiAgICBjb25zdCB2YWx1ZSA9IHN0YXRlW3Byb3BlcnR5XTtcblxuICAgIGlmKHZhbHVlICE9PSB1bmRlZmluZWQgfHwgIXJlcXVpcmVkKVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYCR7c3ViamVjdH0uJHtwcm9wZXJ0eX0gaXMgbm90IHlldCBhdmFpbGFibGUuYCk7XG4gIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBhZGRMaXN0ZW5lcihzdWJqZWN0LCBrZXkgPT4ge1xuICAgICAgaWYoa2V5ID09PSBwcm9wZXJ0eSl7XG4gICAgICAgIHJlc29sdmUoc3RhdGVba2V5XSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZihrZXkgPT09IG51bGwpXG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYCR7c3ViamVjdH0gaXMgZGVzdHJveWVkLmApKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGhyb3cgT2JqZWN0LmFzc2lnbihwcm9taXNlLCB7XG4gICAgdG9TdHJpbmc6ICgpID0+IFN0cmluZyhlcnJvciksXG4gICAgbmFtZTogXCJTdXNwZW5zZVwiLFxuICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgc3RhY2s6IGVycm9yLnN0YWNrXG4gIH0pO1xufVxuXG4vKiogQ3VycmVudGx5IGFjY3VtdWxhdGluZyBleHBvcnQuIFN0b3JlcyByZWFsIHZhbHVlcyBvZiBwbGFjZWhvbGRlciBwcm9wZXJ0aWVzIHN1Y2ggYXMgcmVmKCkgb3IgY2hpbGQgbW9kZWxzLiAqL1xubGV0IEVYUE9SVDogTWFwPGFueSwgYW55PiB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gc25hcHNob3Q8VCBleHRlbmRzIE1vZGVsPihtb2RlbDogVCk6IE1vZGVsLlN0YXRlPFQ+IHtcbiAgY29uc3QgdmFsdWVzID0ge30gYXMgYW55O1xuICBsZXQgaXNOb3RSZWN1cnNpdmU7XG5cbiAgaWYoIUVYUE9SVCl7XG4gICAgaXNOb3RSZWN1cnNpdmUgPSB0cnVlO1xuICAgIEVYUE9SVCA9IG5ldyBNYXAoW1ttb2RlbCwgdmFsdWVzXV0pO1xuICB9XG5cbiAgZm9yKGxldCBba2V5LCB2YWx1ZV0gb2YgbW9kZWwpe1xuICAgIGlmKEVYUE9SVC5oYXModmFsdWUpKVxuICAgICAgdmFsdWUgPSBFWFBPUlQuZ2V0KHZhbHVlKTtcbiAgICBlbHNlIGlmKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSBcIm9iamVjdFwiICYmIFwiZ2V0XCIgaW4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLmdldCA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgRVhQT1JULnNldCh2YWx1ZSwgdmFsdWUgPSB2YWx1ZS5nZXQoKSk7XG5cbiAgICB2YWx1ZXNba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgaWYoaXNOb3RSZWN1cnNpdmUpXG4gICAgRVhQT1JUID0gdW5kZWZpbmVkO1xuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKHZhbHVlcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZTxUPihcbiAgc3ViamVjdDogTW9kZWwsXG4gIGtleTogc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sLFxuICB2YWx1ZTogVCxcbiAgYXJnPzogYm9vbGVhbiB8IE1vZGVsLlNldHRlcjxUPil7XG5cbiAgY29uc3Qgc3RhdGUgPSBTVEFURS5nZXQoc3ViamVjdCkhO1xuXG4gIGlmKE9iamVjdC5pc0Zyb3plbihzdGF0ZSkpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBUcmllZCB0byB1cGRhdGUgJHtTdHJpbmcoa2V5KX0gYnV0ICR7c3ViamVjdH0gaXMgZGVzdHJveWVkLmApO1xuXG4gIGNvbnN0IHByZXZpb3VzID0gc3RhdGVba2V5XSBhcyBUO1xuXG4gIGlmKHR5cGVvZiBhcmcgPT0gXCJmdW5jdGlvblwiKXtcbiAgICBjb25zdCBvdXQgPSBhcmcuY2FsbChzdWJqZWN0LCB2YWx1ZSwgcHJldmlvdXMpO1xuXG4gICAgaWYob3V0ID09PSBmYWxzZSlcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIGlmKHR5cGVvZiBvdXQgPT0gXCJmdW5jdGlvblwiKVxuICAgICAgdmFsdWUgPSBvdXQoKTtcbiAgfVxuXG4gIGlmKHZhbHVlID09PSBwcmV2aW91cylcbiAgICByZXR1cm47XG5cbiAgc3RhdGVba2V5XSA9IHZhbHVlO1xuXG4gIGlmKGFyZyAhPT0gdHJ1ZSlcbiAgICBldmVudChzdWJqZWN0LCBrZXkpO1xuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogUmFuZG9tIGFscGhhbnVtYmVyaWMgb2YgbGVuZ3RoIDY7IGFsd2F5cyBzdGFydHMgd2l0aCBhIGxldHRlci4gKi9cbmZ1bmN0aW9uIHVpZCgpe1xuICByZXR1cm4gKDAuMjc4ICsgTWF0aC5yYW5kb20oKSAqIDAuNzIyKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDgpLnRvVXBwZXJDYXNlKCk7XG59XG5cbmV4cG9ydCB7XG4gIGV2ZW50LFxuICBmZXRjaCxcbiAgbWF5QWRvcHQsXG4gIE1FVEhPRCxcbiAgTW9kZWwsXG4gIFBBUkVOVCxcbiAgU1RBVEUsXG4gIHVpZCxcbiAgdXBkYXRlLFxufSJdLAogICJtYXBwaW5ncyI6ICJBQUFBLFNBQVMsYUFBYSxjQUFjLE9BQWlCLFNBQVMsY0FBYyxhQUFhO0FBRWxGLE1BQU0sU0FBUyxPQUFPO0FBRzdCLE1BQU0sS0FBSyxvQkFBSSxRQUF1QjtBQUd0QyxNQUFNLFFBQVEsb0JBQUksUUFBMEQ7QUFHNUUsTUFBTSxTQUFTLG9CQUFJLFFBQW1DO0FBR3RELE1BQU0sU0FBUyxvQkFBSSxRQUE2QjtBQUdoRCxNQUFNLFVBQVUsb0JBQUksUUFBaUM7QUFHckQsTUFBTSxTQUFTLG9CQUFJLFFBQWtCO0FBbUhyQyxNQUFlLE1BQU07QUFBQSxFQUNuQixlQUFlLE1BQWlCO0FBQzlCLFlBQVEsSUFBSTtBQUNaLFdBQU8sTUFBTSxNQUFNLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDbEMsU0FBSyxNQUFNLElBQUk7QUFBQSxFQUNqQjtBQUFBLEVBcURBLElBQUksTUFBMkMsTUFBMkM7QUFDeEYsVUFBTSxPQUFPLEtBQUs7QUFFbEIsUUFBRyxPQUFPLFFBQVEsWUFBVztBQUMzQixVQUFJQSxXQUFVLG9CQUFJLElBQXVCO0FBRXpDLGFBQU8sYUFBYSxNQUFNLENBQUMsVUFBVTtBQUNuQyxjQUFNLEtBQUssS0FBSyxLQUFLLE9BQU8sT0FBT0EsUUFBTztBQUUxQyxlQUFPLE9BQU8sT0FBTyxPQUFRLENBQUNDLFlBQVc7QUFDdkMsVUFBQUQsV0FBVSxhQUFhLElBQUksSUFBSTtBQUMvQixjQUFHLE9BQU8sTUFBTTtBQUNkLGVBQUdDLE9BQU07QUFBQSxRQUNiO0FBQUEsTUFDRixDQUFDO0FBQUEsSUFDSDtBQUVBLFFBQUcsU0FBUztBQUNWLGFBQU8sU0FBUyxJQUFJO0FBRXRCLFFBQUcsT0FBTyxRQUFRO0FBQ2hCLGFB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QUNQLFNBQ0EsS0FDQSxPQUNBLEtBQWdDO0FBRWhDLFFBQU0sUUFBUSxNQUFNLElBQUksT0FBTztBQUUvQixNQUFHLE9BQU8sU0FBUyxLQUFLO0FBQ3RCLFVBQU0sSUFBSSxNQUFNLG1CQUFtQixPQUFPLEdBQUcsQ0FBQyxRQUFRLE9BQU8sZ0JBQWdCO0FBRS9FLFFBQU0sV0FBVyxNQUFNLEdBQUc7QUFFMUIsTUFBRyxPQUFPLE9BQU8sWUFBVztBQUMxQixVQUFNLE1BQU0sSUFBSSxLQUFLLFNBQVMsT0FBTyxRQUFRO0FBRTdDLFFBQUcsUUFBUTtBQUNULGFBQU87QUFFVCxRQUFHLE9BQU8sT0FBTztBQUNmLGNBQVEsSUFBSTtBQUFBLEVBQ2hCO0FBRUEsTUFBRyxVQUFVO0FBQ1g7QUFFRixRQUFNLEdBQUcsSUFBSTtBQUViLE1BQUcsUUFBUTtBQUNULFVBQU0sU0FBUyxHQUFHO0FBRXBCLFNBQU87QUFDVDtBQUdBLFNBQVMsTUFBSztBQUNaLFVBQVEsUUFBUSxLQUFLLE9BQU8sSUFBSSxPQUFPLFNBQVMsRUFBRSxFQUFFLFVBQVUsR0FBRyxDQUFDLEVBQUUsWUFBWTtBQUNsRjsiLAogICJuYW1lcyI6IFsicGVuZGluZyIsICJ1cGRhdGUiLCAiYmluZCIsICJ2YWx1ZSJdCn0K
package/dist/index.js CHANGED
@@ -974,3 +974,4 @@ function has(arg1, arg2) {
974
974
  set,
975
975
  use
976
976
  });
977
+ //# sourceMappingURL=index.js.map