@expressive/mvc 0.73.0 → 0.78.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.
Files changed (53) hide show
  1. package/README.md +137 -0
  2. package/dist/component.d.ts +87 -0
  3. package/dist/component.js +111 -0
  4. package/dist/component.js.map +1 -0
  5. package/dist/context.d.ts +56 -0
  6. package/dist/context.js +201 -0
  7. package/dist/context.js.map +1 -0
  8. package/dist/field/def.d.ts +17 -0
  9. package/dist/field/def.js +29 -0
  10. package/dist/field/def.js.map +1 -0
  11. package/dist/field/get.d.ts +57 -0
  12. package/dist/field/get.js +90 -0
  13. package/dist/field/get.js.map +1 -0
  14. package/dist/field/hot.d.ts +16 -0
  15. package/dist/field/hot.js +98 -0
  16. package/dist/field/hot.js.map +1 -0
  17. package/dist/field/ref.d.ts +78 -0
  18. package/dist/field/ref.js +85 -0
  19. package/dist/field/ref.js.map +1 -0
  20. package/dist/field/set.d.ts +59 -0
  21. package/dist/field/set.js +84 -0
  22. package/dist/field/set.js.map +1 -0
  23. package/dist/index.d.ts +10 -502
  24. package/dist/index.js +11 -872
  25. package/dist/jsx-dev-runtime.d.ts +2 -0
  26. package/dist/jsx-dev-runtime.js +3 -0
  27. package/dist/jsx-runtime.d.ts +90 -0
  28. package/dist/jsx-runtime.js +57 -0
  29. package/dist/jsx-runtime.js.map +1 -0
  30. package/dist/observable.d.ts +58 -0
  31. package/dist/observable.js +184 -0
  32. package/dist/observable.js.map +1 -0
  33. package/dist/state.d.ts +311 -0
  34. package/dist/state.js +424 -0
  35. package/dist/state.js.map +1 -0
  36. package/package.json +35 -18
  37. package/dist/esm/context.d.ts +0 -62
  38. package/dist/esm/context.js +0 -158
  39. package/dist/esm/index.d.ts +0 -8
  40. package/dist/esm/index.js +0 -9
  41. package/dist/esm/instruction/get.d.ts +0 -36
  42. package/dist/esm/instruction/get.js +0 -77
  43. package/dist/esm/instruction/ref.d.ts +0 -71
  44. package/dist/esm/instruction/ref.js +0 -68
  45. package/dist/esm/instruction/set.d.ts +0 -69
  46. package/dist/esm/instruction/set.js +0 -118
  47. package/dist/esm/instruction/use.d.ts +0 -23
  48. package/dist/esm/instruction/use.js +0 -56
  49. package/dist/esm/observable.d.ts +0 -42
  50. package/dist/esm/observable.js +0 -121
  51. package/dist/esm/state.d.ts +0 -234
  52. package/dist/esm/state.js +0 -293
  53. package/dist/index.js.map +0 -1
@@ -1,234 +0,0 @@
1
- import { Observable, event } from "./observable.js";
2
-
3
- //#region src/state.d.ts
4
- /** Internal state assigned to states. */
5
- declare const STATE: WeakMap<State, Record<string | number | symbol, unknown>>;
6
- /** Parent-child relationships. */
7
- declare const PARENT: WeakMap<State, State | null>;
8
- /** Reference bound instance methods to real ones. */
9
- declare const METHOD: WeakMap<any, any>;
10
- declare namespace State {
11
- /** Any type of State, using own class constructor as its identifier. */
12
- type Extends<T extends State = State> = (abstract new (...args: any[]) => T) & typeof State;
13
- /** A State constructor which may be instanciated. */
14
- type Type<T extends State = State> = (new (...args: State.Args<T>) => T) & Omit<typeof State, never>;
15
- /** State constructor arguments */
16
- type Args<T extends State = any> = (Args<T> | Init<T> | Assign<T> | string | void)[];
17
- /**
18
- * State constructor callback - is called when State finishes intializing.
19
- * Returned function will run when state is destroyed.
20
- */
21
- type Init<T extends State = State> = (this: T, thisArg: T) => Promise<void> | (() => void) | Args<T> | Assign<T> | void;
22
- /** Object overlay to override values and methods on a state. */
23
- type Assign<T> = Record<string, unknown> & { [K in Field<T>]?: T[K] extends ((...args: infer A) => infer R) ? (this: T, ...args: A) => R : T[K] };
24
- /** Subset of `keyof T` which are not methods or defined by base State U. **/
25
- type Field<T> = Exclude<keyof T, keyof State>;
26
- /** Any valid key for state, including but not limited to Field<T>. */
27
- type Event<T> = Field<T> | number | symbol | (string & {});
28
- /** Export/Import compatible value for a given property in a State. */
29
- type Export<R> = R extends {
30
- get(): infer T;
31
- } ? T : R;
32
- /** Value for a property managed by a state. */
33
- type Value<T extends State, K extends State.Event<T>> = K extends keyof T ? Export<T[K]> : unknown;
34
- type Setter<T> = (value: T, previous: T) => boolean | void | (() => T);
35
- type OnEvent<T extends State> = (this: T, key: unknown, source: T) => void | (() => void) | null;
36
- type OnUpdate<T extends State, K extends State.Event<T>> = (this: T, key: K, thisArg: K) => void;
37
- /**
38
- * Values from current state of given state.
39
- * Differs from `Values` as values here will drill
40
- * into "real" values held by exotics like ref.Object.
41
- */
42
- type Values<T> = { [P in Field<T>]: Export<T[P]> };
43
- /** Object comperable to data found in T. */
44
- type Partial<T> = { [P in Field<T>]?: Export<T[P]> };
45
- /** Exotic value, where actual value is contained within. */
46
- type Ref<T = any> = {
47
- (next: T): void;
48
- current: T | null;
49
- };
50
- /**
51
- * A callback function which is subscribed to parent and updates when accessed properties change.
52
- *
53
- * @param current - Current state of this state. This is a proxy which detects properties which
54
- * where accessed, and thus depended upon to stay current.
55
- *
56
- * @param update - Set of properties which have changed, and events fired, since last update.
57
- *
58
- * @returns A callback function which will be called when this effect is stale.
59
- */
60
- type Effect<T> = (this: T, current: T, update: Set<State.Event<T>>) => EffectCallback | Promise<void> | null | void;
61
- /**
62
- * A callback function returned by effect. Will be called when effect is stale.
63
- *
64
- * @param update - `true` if update is pending, `false` effect has been cancelled, `null` if state is destroyed.
65
- */
66
- type EffectCallback = (update: boolean | null) => void;
67
- }
68
- interface State {
69
- /**
70
- * Loopback to instance of this state. This is useful when in a subscribed context,
71
- * to keep write access to `this` after a destructure. You can use it to read variables silently as well.
72
- **/
73
- is: this;
74
- }
75
- declare abstract class State implements Observable {
76
- constructor(...args: State.Args);
77
- [Observable](callback: Observable.Callback, required?: boolean): this;
78
- /**
79
- * Optional lifecycle hook called during State initialization.
80
- * Can return a cleanup function to run when state is destroyed.
81
- */
82
- protected new?(): void | (() => void);
83
- /**
84
- * Pull current values from state. Flattens all states and exotic values recursively.
85
- *
86
- * @returns Object with all values from this state.
87
- **/
88
- get(): State.Values<this>;
89
- /**
90
- * Run a function which will run automatically when accessed values change.
91
- *
92
- * @param effect Function to run, and again whenever accessed values change.
93
- * If effect returns a function, it will be called when a change occurs (syncronously),
94
- * effect is cancelled, or parent state is destroyed.
95
- * @returns Function to cancel listener.
96
- */
97
- get(effect: State.Effect<this>): () => void;
98
- /**
99
- * Get value of a property.
100
- *
101
- * @param key - Property to get value of.
102
- * @param required - If true, will throw an error if property is not available.
103
- * @returns Value of property.
104
- */
105
- get<T extends State.Event<this>>(key: T, required?: boolean): State.Value<this, T>;
106
- /**
107
- * Run a function when a property is updated.
108
- *
109
- * @param key - Property to watch for updates.
110
- * @param callback - Function to call when property is updated.
111
- * @returns Function to cancel listener.
112
- */
113
- get<T extends State.Event<this>>(key: T, callback: State.OnUpdate<this, T>): () => void;
114
- /**
115
- * Check if state is expired.
116
- *
117
- * @param status - `null` to check if state is expired.
118
- * @returns `true` if state is expired, `false` otherwise.
119
- */
120
- get(status: null): boolean;
121
- /**
122
- * Callback when state is to be destroyed.
123
- *
124
- * @param callback - Function to call when state is destroyed.
125
- * @returns Function to cancel listener.
126
- */
127
- get(status: null, callback: () => void): () => void;
128
- /**
129
- * Get update in progress.
130
- *
131
- * @returns Promise which resolves object with updated values, `undefined` if there no update is pending.
132
- **/
133
- set(): PromiseLike<State.Event<this>[]> | undefined;
134
- /**
135
- * Update mulitple properties at once. Merges argument with current state.
136
- * Properties which are not managed by this state will be ignored.
137
- *
138
- * @param assign - Object with properties to update.
139
- * @param silent - If an update does occur, listeners will not be refreshed automatically.
140
- * @returns Promise resolving an array of keys updated, `undefined` (immediately) if a noop.
141
- */
142
- set(assign?: State.Assign<this>, silent?: boolean): PromiseLike<State.Event<this>[]> | undefined;
143
- /**
144
- * Push an update. This will not change the value of associated property.
145
- *
146
- * Useful where a property value internally has changed, but the object is the same.
147
- * For example: An array has pushed a new value, or a nested property is updated.
148
- *
149
- * You can also use this to dispatch arbitrary events.
150
- * Symbols are recommended as non-property events, however you can use any string.
151
- * If doing so, be sure to avoid collisions with property names! An easy way to do this is
152
- * to prefix an event with "!" and/or use dash-case. e.g. `set("!event")` or `set("my-event")`.
153
- *
154
- * @param key - Property or event to dispatch.
155
- * @returns Promise resolves an array of keys updated.
156
- */
157
- set(key: State.Event<this>): PromiseLike<State.Event<this>[]>;
158
- /**
159
- * Set a value for a property. This will update the value and notify listeners.
160
- *
161
- * **Use with caution!** Key nor value are checked for validity.
162
- *
163
- * This is meant for assigning values programmatically,
164
- * where simple assignment is not practicable.
165
- *
166
- * For example: `(this as any)[myProperty] = value;`
167
- *
168
- * @param key - Property to set value for.
169
- * @param value - Value to set for property.
170
- * @param init - If true, state will begin to manage the property if it is not already.
171
- * @returns Promise resolves an array of keys updated.
172
- */
173
- set(key: State.Event<this>, value: unknown, init?: boolean): PromiseLike<State.Event<this>[]>;
174
- /**
175
- * Call a function when update occurs.
176
- *
177
- * Given function is called for every assignment (which changes value) or explicit `set`.
178
- *
179
- * To run logic on final value only, callback may return a function. Using the same
180
- * function for one or more events will ensure it is called only when events are settled.
181
- *
182
- * @param callback - Function to call when update occurs.
183
- * @returns Function to remove listener. Will return `true` if removed, `false` if inactive already.
184
- *
185
- */
186
- set(callback: State.OnEvent<this>): () => boolean;
187
- /**
188
- * Call a function when a property is updated.
189
- * Unlike `get`, this calls synchronously and will fire as many times as the property is updated.
190
- *
191
- * @param callback - Function to call when property is updated.
192
- * @param event - Property to watch for updates.
193
- */
194
- set(callback: State.OnEvent<this>, event: State.Event<this> | null): () => boolean;
195
- /**
196
- * Declare an end to updates. This event is final and will freeze state.
197
- * This event can be watched for as well, to run cleanup logic and internally will remove all listeners.
198
- *
199
- * @param status - `null` to end updates.
200
- */
201
- set(status: null): void;
202
- /**
203
- * Iterate over managed properties in this instance of State.
204
- * Yeilds the key and current value for each property.
205
- */
206
- [Symbol.iterator](): Iterator<[string, unknown]>;
207
- /**
208
- * Create and activate a new instance of this state.
209
- *
210
- * **Important** - Unlike `new this(...)` - this method also activates state.
211
- *
212
- * @param args - arguments sent to constructor
213
- */
214
- static new<T extends State>(this: State.Type<T>, ...args: State.Args<T>): T;
215
- /**
216
- * Static equivalent of `x instanceof this`.
217
- * Determines if provided class is a subtype of this one.
218
- * If so, language server will make available all static
219
- * methods and properties of this class.
220
- */
221
- static is<T extends State.Extends>(this: T, maybe: unknown): maybe is T;
222
- /**
223
- * Register a callback to run when any instance of this State is updated.
224
- */
225
- static on<T extends State>(this: State.Extends<T>, listener: State.OnEvent<T>): () => boolean;
226
- }
227
- declare function follow(from: State, key: string | number, value?: any): any;
228
- declare function access(subject: State, property: string, required?: boolean): any;
229
- declare function update<T>(subject: State, key: string | number | symbol, value: T, arg?: boolean | State.Setter<T>): boolean | undefined;
230
- /** Random alphanumberic of length 6; always starts with a letter. */
231
- declare function uid(): string;
232
- //#endregion
233
- export { METHOD, PARENT, STATE, State, access, event, follow, uid, update };
234
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuZC50cyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RhdGUuZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBldmVudCwgT2JzZXJ2YWJsZSB9IGZyb20gJy4vb2JzZXJ2YWJsZSc7XG4vKiogSW50ZXJuYWwgc3RhdGUgYXNzaWduZWQgdG8gc3RhdGVzLiAqL1xuZGVjbGFyZSBjb25zdCBTVEFURTogV2Vha01hcDxTdGF0ZSwgUmVjb3JkPHN0cmluZyB8IG51bWJlciB8IHN5bWJvbCwgdW5rbm93bj4+O1xuLyoqIFBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXBzLiAqL1xuZGVjbGFyZSBjb25zdCBQQVJFTlQ6IFdlYWtNYXA8U3RhdGUsIFN0YXRlIHwgbnVsbD47XG4vKiogUmVmZXJlbmNlIGJvdW5kIGluc3RhbmNlIG1ldGhvZHMgdG8gcmVhbCBvbmVzLiAqL1xuZGVjbGFyZSBjb25zdCBNRVRIT0Q6IFdlYWtNYXA8YW55LCBhbnk+O1xuZGVjbGFyZSBuYW1lc3BhY2UgU3RhdGUge1xuICAgIC8qKiBBbnkgdHlwZSBvZiBTdGF0ZSwgdXNpbmcgb3duIGNsYXNzIGNvbnN0cnVjdG9yIGFzIGl0cyBpZGVudGlmaWVyLiAqL1xuICAgIHR5cGUgRXh0ZW5kczxUIGV4dGVuZHMgU3RhdGUgPSBTdGF0ZT4gPSAoYWJzdHJhY3QgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVCkgJiB0eXBlb2YgU3RhdGU7XG4gICAgLyoqIEEgU3RhdGUgY29uc3RydWN0b3Igd2hpY2ggbWF5IGJlIGluc3RhbmNpYXRlZC4gKi9cbiAgICB0eXBlIFR5cGU8VCBleHRlbmRzIFN0YXRlID0gU3RhdGU+ID0gKG5ldyAoLi4uYXJnczogU3RhdGUuQXJnczxUPikgPT4gVCkgJiBPbWl0PHR5cGVvZiBTdGF0ZSwgbmV2ZXI+O1xuICAgIC8qKiBTdGF0ZSBjb25zdHJ1Y3RvciBhcmd1bWVudHMgKi9cbiAgICB0eXBlIEFyZ3M8VCBleHRlbmRzIFN0YXRlID0gYW55PiA9IChBcmdzPFQ+IHwgSW5pdDxUPiB8IEFzc2lnbjxUPiB8IHN0cmluZyB8IHZvaWQpW107XG4gICAgLyoqXG4gICAgICogU3RhdGUgY29uc3RydWN0b3IgY2FsbGJhY2sgLSBpcyBjYWxsZWQgd2hlbiBTdGF0ZSBmaW5pc2hlcyBpbnRpYWxpemluZy5cbiAgICAgKiBSZXR1cm5lZCBmdW5jdGlvbiB3aWxsIHJ1biB3aGVuIHN0YXRlIGlzIGRlc3Ryb3llZC5cbiAgICAgKi9cbiAgICB0eXBlIEluaXQ8VCBleHRlbmRzIFN0YXRlID0gU3RhdGU+ID0gKHRoaXM6IFQsIHRoaXNBcmc6IFQpID0+IFByb21pc2U8dm9pZD4gfCAoKCkgPT4gdm9pZCkgfCBBcmdzPFQ+IHwgQXNzaWduPFQ+IHwgdm9pZDtcbiAgICAvKiogT2JqZWN0IG92ZXJsYXkgdG8gb3ZlcnJpZGUgdmFsdWVzIGFuZCBtZXRob2RzIG9uIGEgc3RhdGUuICovXG4gICAgdHlwZSBBc3NpZ248VD4gPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiAmIHtcbiAgICAgICAgW0sgaW4gRmllbGQ8VD5dPzogVFtLXSBleHRlbmRzICguLi5hcmdzOiBpbmZlciBBKSA9PiBpbmZlciBSID8gKHRoaXM6IFQsIC4uLmFyZ3M6IEEpID0+IFIgOiBUW0tdO1xuICAgIH07XG4gICAgLyoqIFN1YnNldCBvZiBga2V5b2YgVGAgd2hpY2ggYXJlIG5vdCBtZXRob2RzIG9yIGRlZmluZWQgYnkgYmFzZSBTdGF0ZSBVLiAqKi9cbiAgICB0eXBlIEZpZWxkPFQ+ID0gRXhjbHVkZTxrZXlvZiBULCBrZXlvZiBTdGF0ZT47XG4gICAgLyoqIEFueSB2YWxpZCBrZXkgZm9yIHN0YXRlLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIEZpZWxkPFQ+LiAqL1xuICAgIHR5cGUgRXZlbnQ8VD4gPSBGaWVsZDxUPiB8IG51bWJlciB8IHN5bWJvbCB8IChzdHJpbmcgJiB7fSk7XG4gICAgLyoqIEV4cG9ydC9JbXBvcnQgY29tcGF0aWJsZSB2YWx1ZSBmb3IgYSBnaXZlbiBwcm9wZXJ0eSBpbiBhIFN0YXRlLiAqL1xuICAgIHR5cGUgRXhwb3J0PFI+ID0gUiBleHRlbmRzIHtcbiAgICAgICAgZ2V0KCk6IGluZmVyIFQ7XG4gICAgfSA/IFQgOiBSO1xuICAgIC8qKiBWYWx1ZSBmb3IgYSBwcm9wZXJ0eSBtYW5hZ2VkIGJ5IGEgc3RhdGUuICovXG4gICAgdHlwZSBWYWx1ZTxUIGV4dGVuZHMgU3RhdGUsIEsgZXh0ZW5kcyBTdGF0ZS5FdmVudDxUPj4gPSBLIGV4dGVuZHMga2V5b2YgVCA/IEV4cG9ydDxUW0tdPiA6IHVua25vd247XG4gICAgdHlwZSBTZXR0ZXI8VD4gPSAodmFsdWU6IFQsIHByZXZpb3VzOiBUKSA9PiBib29sZWFuIHwgdm9pZCB8ICgoKSA9PiBUKTtcbiAgICB0eXBlIE9uRXZlbnQ8VCBleHRlbmRzIFN0YXRlPiA9ICh0aGlzOiBULCBrZXk6IHVua25vd24sIHNvdXJjZTogVCkgPT4gdm9pZCB8ICgoKSA9PiB2b2lkKSB8IG51bGw7XG4gICAgdHlwZSBPblVwZGF0ZTxUIGV4dGVuZHMgU3RhdGUsIEsgZXh0ZW5kcyBTdGF0ZS5FdmVudDxUPj4gPSAodGhpczogVCwga2V5OiBLLCB0aGlzQXJnOiBLKSA9PiB2b2lkO1xuICAgIC8qKlxuICAgICAqIFZhbHVlcyBmcm9tIGN1cnJlbnQgc3RhdGUgb2YgZ2l2ZW4gc3RhdGUuXG4gICAgICogRGlmZmVycyBmcm9tIGBWYWx1ZXNgIGFzIHZhbHVlcyBoZXJlIHdpbGwgZHJpbGxcbiAgICAgKiBpbnRvIFwicmVhbFwiIHZhbHVlcyBoZWxkIGJ5IGV4b3RpY3MgbGlrZSByZWYuT2JqZWN0LlxuICAgICAqL1xuICAgIHR5cGUgVmFsdWVzPFQ+ID0ge1xuICAgICAgICBbUCBpbiBGaWVsZDxUPl06IEV4cG9ydDxUW1BdPjtcbiAgICB9O1xuICAgIC8qKiBPYmplY3QgY29tcGVyYWJsZSB0byBkYXRhIGZvdW5kIGluIFQuICovXG4gICAgdHlwZSBQYXJ0aWFsPFQ+ID0ge1xuICAgICAgICBbUCBpbiBGaWVsZDxUPl0/OiBFeHBvcnQ8VFtQXT47XG4gICAgfTtcbiAgICAvKiogRXhvdGljIHZhbHVlLCB3aGVyZSBhY3R1YWwgdmFsdWUgaXMgY29udGFpbmVkIHdpdGhpbi4gKi9cbiAgICB0eXBlIFJlZjxUID0gYW55PiA9IHtcbiAgICAgICAgKG5leHQ6IFQpOiB2b2lkO1xuICAgICAgICBjdXJyZW50OiBUIHwgbnVsbDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEEgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggaXMgc3Vic2NyaWJlZCB0byBwYXJlbnQgYW5kIHVwZGF0ZXMgd2hlbiBhY2Nlc3NlZCBwcm9wZXJ0aWVzIGNoYW5nZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjdXJyZW50IC0gQ3VycmVudCBzdGF0ZSBvZiB0aGlzIHN0YXRlLiBUaGlzIGlzIGEgcHJveHkgd2hpY2ggZGV0ZWN0cyBwcm9wZXJ0aWVzIHdoaWNoXG4gICAgICogd2hlcmUgYWNjZXNzZWQsIGFuZCB0aHVzIGRlcGVuZGVkIHVwb24gdG8gc3RheSBjdXJyZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHVwZGF0ZSAtIFNldCBvZiBwcm9wZXJ0aWVzIHdoaWNoIGhhdmUgY2hhbmdlZCwgYW5kIGV2ZW50cyBmaXJlZCwgc2luY2UgbGFzdCB1cGRhdGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhpcyBlZmZlY3QgaXMgc3RhbGUuXG4gICAgICovXG4gICAgdHlwZSBFZmZlY3Q8VD4gPSAodGhpczogVCwgY3VycmVudDogVCwgdXBkYXRlOiBTZXQ8U3RhdGUuRXZlbnQ8VD4+KSA9PiBFZmZlY3RDYWxsYmFjayB8IFByb21pc2U8dm9pZD4gfCBudWxsIHwgdm9pZDtcbiAgICAvKipcbiAgICAgKiBBIGNhbGxiYWNrIGZ1bmN0aW9uIHJldHVybmVkIGJ5IGVmZmVjdC4gV2lsbCBiZSBjYWxsZWQgd2hlbiBlZmZlY3QgaXMgc3RhbGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdXBkYXRlIC0gYHRydWVgIGlmIHVwZGF0ZSBpcyBwZW5kaW5nLCBgZmFsc2VgIGVmZmVjdCBoYXMgYmVlbiBjYW5jZWxsZWQsIGBudWxsYCBpZiBzdGF0ZSBpcyBkZXN0cm95ZWQuXG4gICAgICovXG4gICAgdHlwZSBFZmZlY3RDYWxsYmFjayA9ICh1cGRhdGU6IGJvb2xlYW4gfCBudWxsKSA9PiB2b2lkO1xufVxuaW50ZXJmYWNlIFN0YXRlIHtcbiAgICAvKipcbiAgICAgKiBMb29wYmFjayB0byBpbnN0YW5jZSBvZiB0aGlzIHN0YXRlLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGluIGEgc3Vic2NyaWJlZCBjb250ZXh0LFxuICAgICAqIHRvIGtlZXAgd3JpdGUgYWNjZXNzIHRvIGB0aGlzYCBhZnRlciBhIGRlc3RydWN0dXJlLiBZb3UgY2FuIHVzZSBpdCB0byByZWFkIHZhcmlhYmxlcyBzaWxlbnRseSBhcyB3ZWxsLlxuICAgICAqKi9cbiAgICBpczogdGhpcztcbn1cbmRlY2xhcmUgYWJzdHJhY3QgY2xhc3MgU3RhdGUgaW1wbGVtZW50cyBPYnNlcnZhYmxlIHtcbiAgICBjb25zdHJ1Y3RvciguLi5hcmdzOiBTdGF0ZS5BcmdzKTtcbiAgICBbT2JzZXJ2YWJsZV0oY2FsbGJhY2s6IE9ic2VydmFibGUuQ2FsbGJhY2ssIHJlcXVpcmVkPzogYm9vbGVhbik6IHRoaXM7XG4gICAgLyoqXG4gICAgICogT3B0aW9uYWwgbGlmZWN5Y2xlIGhvb2sgY2FsbGVkIGR1cmluZyBTdGF0ZSBpbml0aWFsaXphdGlvbi5cbiAgICAgKiBDYW4gcmV0dXJuIGEgY2xlYW51cCBmdW5jdGlvbiB0byBydW4gd2hlbiBzdGF0ZSBpcyBkZXN0cm95ZWQuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG5ldz8oKTogdm9pZCB8ICgoKSA9PiB2b2lkKTtcbiAgICAvKipcbiAgICAgKiBQdWxsIGN1cnJlbnQgdmFsdWVzIGZyb20gc3RhdGUuIEZsYXR0ZW5zIGFsbCBzdGF0ZXMgYW5kIGV4b3RpYyB2YWx1ZXMgcmVjdXJzaXZlbHkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBhbGwgdmFsdWVzIGZyb20gdGhpcyBzdGF0ZS5cbiAgICAgKiovXG4gICAgZ2V0KCk6IFN0YXRlLlZhbHVlczx0aGlzPjtcbiAgICAvKipcbiAgICAgKiBSdW4gYSBmdW5jdGlvbiB3aGljaCB3aWxsIHJ1biBhdXRvbWF0aWNhbGx5IHdoZW4gYWNjZXNzZWQgdmFsdWVzIGNoYW5nZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlZmZlY3QgRnVuY3Rpb24gdG8gcnVuLCBhbmQgYWdhaW4gd2hlbmV2ZXIgYWNjZXNzZWQgdmFsdWVzIGNoYW5nZS5cbiAgICAgKiAgICAgICAgICAgICAgIElmIGVmZmVjdCByZXR1cm5zIGEgZnVuY3Rpb24sIGl0IHdpbGwgYmUgY2FsbGVkIHdoZW4gYSBjaGFuZ2Ugb2NjdXJzIChzeW5jcm9ub3VzbHkpLFxuICAgICAqICAgICAgICAgICAgICAgZWZmZWN0IGlzIGNhbmNlbGxlZCwgb3IgcGFyZW50IHN0YXRlIGlzIGRlc3Ryb3llZC5cbiAgICAgKiBAcmV0dXJucyBGdW5jdGlvbiB0byBjYW5jZWwgbGlzdGVuZXIuXG4gICAgICovXG4gICAgZ2V0KGVmZmVjdDogU3RhdGUuRWZmZWN0PHRoaXM+KTogKCkgPT4gdm9pZDtcbiAgICAvKipcbiAgICAgKiBHZXQgdmFsdWUgb2YgYSBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBrZXkgLSBQcm9wZXJ0eSB0byBnZXQgdmFsdWUgb2YuXG4gICAgICogQHBhcmFtIHJlcXVpcmVkIC0gSWYgdHJ1ZSwgd2lsbCB0aHJvdyBhbiBlcnJvciBpZiBwcm9wZXJ0eSBpcyBub3QgYXZhaWxhYmxlLlxuICAgICAqIEByZXR1cm5zIFZhbHVlIG9mIHByb3BlcnR5LlxuICAgICAqL1xuICAgIGdldDxUIGV4dGVuZHMgU3RhdGUuRXZlbnQ8dGhpcz4+KGtleTogVCwgcmVxdWlyZWQ/OiBib29sZWFuKTogU3RhdGUuVmFsdWU8dGhpcywgVD47XG4gICAgLyoqXG4gICAgICogUnVuIGEgZnVuY3Rpb24gd2hlbiBhIHByb3BlcnR5IGlzIHVwZGF0ZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ga2V5IC0gUHJvcGVydHkgdG8gd2F0Y2ggZm9yIHVwZGF0ZXMuXG4gICAgICogQHBhcmFtIGNhbGxiYWNrIC0gRnVuY3Rpb24gdG8gY2FsbCB3aGVuIHByb3BlcnR5IGlzIHVwZGF0ZWQuXG4gICAgICogQHJldHVybnMgRnVuY3Rpb24gdG8gY2FuY2VsIGxpc3RlbmVyLlxuICAgICAqL1xuICAgIGdldDxUIGV4dGVuZHMgU3RhdGUuRXZlbnQ8dGhpcz4+KGtleTogVCwgY2FsbGJhY2s6IFN0YXRlLk9uVXBkYXRlPHRoaXMsIFQ+KTogKCkgPT4gdm9pZDtcbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBzdGF0ZSBpcyBleHBpcmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHN0YXR1cyAtIGBudWxsYCB0byBjaGVjayBpZiBzdGF0ZSBpcyBleHBpcmVkLlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiBzdGF0ZSBpcyBleHBpcmVkLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBnZXQoc3RhdHVzOiBudWxsKTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBDYWxsYmFjayB3aGVuIHN0YXRlIGlzIHRvIGJlIGRlc3Ryb3llZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjYWxsYmFjayAtIEZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBzdGF0ZSBpcyBkZXN0cm95ZWQuXG4gICAgICogQHJldHVybnMgRnVuY3Rpb24gdG8gY2FuY2VsIGxpc3RlbmVyLlxuICAgICAqL1xuICAgIGdldChzdGF0dXM6IG51bGwsIGNhbGxiYWNrOiAoKSA9PiB2b2lkKTogKCkgPT4gdm9pZDtcbiAgICAvKipcbiAgICAgKiBHZXQgdXBkYXRlIGluIHByb2dyZXNzLlxuICAgICAqXG4gICAgICogQHJldHVybnMgUHJvbWlzZSB3aGljaCByZXNvbHZlcyBvYmplY3Qgd2l0aCB1cGRhdGVkIHZhbHVlcywgYHVuZGVmaW5lZGAgaWYgdGhlcmUgbm8gdXBkYXRlIGlzIHBlbmRpbmcuXG4gICAgICoqL1xuICAgIHNldCgpOiBQcm9taXNlTGlrZTxTdGF0ZS5FdmVudDx0aGlzPltdPiB8IHVuZGVmaW5lZDtcbiAgICAvKipcbiAgICAgKiBVcGRhdGUgbXVsaXRwbGUgcHJvcGVydGllcyBhdCBvbmNlLiBNZXJnZXMgYXJndW1lbnQgd2l0aCBjdXJyZW50IHN0YXRlLlxuICAgICAqIFByb3BlcnRpZXMgd2hpY2ggYXJlIG5vdCBtYW5hZ2VkIGJ5IHRoaXMgc3RhdGUgd2lsbCBiZSBpZ25vcmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFzc2lnbiAtIE9iamVjdCB3aXRoIHByb3BlcnRpZXMgdG8gdXBkYXRlLlxuICAgICAqIEBwYXJhbSBzaWxlbnQgLSBJZiBhbiB1cGRhdGUgZG9lcyBvY2N1ciwgbGlzdGVuZXJzIHdpbGwgbm90IGJlIHJlZnJlc2hlZCBhdXRvbWF0aWNhbGx5LlxuICAgICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIGFuIGFycmF5IG9mIGtleXMgdXBkYXRlZCwgYHVuZGVmaW5lZGAgKGltbWVkaWF0ZWx5KSBpZiBhIG5vb3AuXG4gICAgICovXG4gICAgc2V0KGFzc2lnbj86IFN0YXRlLkFzc2lnbjx0aGlzPiwgc2lsZW50PzogYm9vbGVhbik6IFByb21pc2VMaWtlPFN0YXRlLkV2ZW50PHRoaXM+W10+IHwgdW5kZWZpbmVkO1xuICAgIC8qKlxuICAgICAqIFB1c2ggYW4gdXBkYXRlLiBUaGlzIHdpbGwgbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgYXNzb2NpYXRlZCBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIFVzZWZ1bCB3aGVyZSBhIHByb3BlcnR5IHZhbHVlIGludGVybmFsbHkgaGFzIGNoYW5nZWQsIGJ1dCB0aGUgb2JqZWN0IGlzIHRoZSBzYW1lLlxuICAgICAqIEZvciBleGFtcGxlOiBBbiBhcnJheSBoYXMgcHVzaGVkIGEgbmV3IHZhbHVlLCBvciBhIG5lc3RlZCBwcm9wZXJ0eSBpcyB1cGRhdGVkLlxuICAgICAqXG4gICAgICogWW91IGNhbiBhbHNvIHVzZSB0aGlzIHRvIGRpc3BhdGNoIGFyYml0cmFyeSBldmVudHMuXG4gICAgICogU3ltYm9scyBhcmUgcmVjb21tZW5kZWQgYXMgbm9uLXByb3BlcnR5IGV2ZW50cywgaG93ZXZlciB5b3UgY2FuIHVzZSBhbnkgc3RyaW5nLlxuICAgICAqIElmIGRvaW5nIHNvLCBiZSBzdXJlIHRvIGF2b2lkIGNvbGxpc2lvbnMgd2l0aCBwcm9wZXJ0eSBuYW1lcyEgQW4gZWFzeSB3YXkgdG8gZG8gdGhpcyBpc1xuICAgICAqIHRvIHByZWZpeCBhbiBldmVudCB3aXRoIFwiIVwiIGFuZC9vciB1c2UgZGFzaC1jYXNlLiBlLmcuIGBzZXQoXCIhZXZlbnRcIilgIG9yIGBzZXQoXCJteS1ldmVudFwiKWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ga2V5IC0gUHJvcGVydHkgb3IgZXZlbnQgdG8gZGlzcGF0Y2guXG4gICAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBhbiBhcnJheSBvZiBrZXlzIHVwZGF0ZWQuXG4gICAgICovXG4gICAgc2V0KGtleTogU3RhdGUuRXZlbnQ8dGhpcz4pOiBQcm9taXNlTGlrZTxTdGF0ZS5FdmVudDx0aGlzPltdPjtcbiAgICAvKipcbiAgICAgKiBTZXQgYSB2YWx1ZSBmb3IgYSBwcm9wZXJ0eS4gVGhpcyB3aWxsIHVwZGF0ZSB0aGUgdmFsdWUgYW5kIG5vdGlmeSBsaXN0ZW5lcnMuXG4gICAgICpcbiAgICAgKiAqKlVzZSB3aXRoIGNhdXRpb24hKiogS2V5IG5vciB2YWx1ZSBhcmUgY2hlY2tlZCBmb3IgdmFsaWRpdHkuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIG1lYW50IGZvciBhc3NpZ25pbmcgdmFsdWVzIHByb2dyYW1tYXRpY2FsbHksXG4gICAgICogd2hlcmUgc2ltcGxlIGFzc2lnbm1lbnQgaXMgbm90IHByYWN0aWNhYmxlLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6IGAodGhpcyBhcyBhbnkpW215UHJvcGVydHldID0gdmFsdWU7YFxuICAgICAqXG4gICAgICogQHBhcmFtIGtleSAtIFByb3BlcnR5IHRvIHNldCB2YWx1ZSBmb3IuXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdG8gc2V0IGZvciBwcm9wZXJ0eS5cbiAgICAgKiBAcGFyYW0gaW5pdCAtIElmIHRydWUsIHN0YXRlIHdpbGwgYmVnaW4gdG8gbWFuYWdlIHRoZSBwcm9wZXJ0eSBpZiBpdCBpcyBub3QgYWxyZWFkeS5cbiAgICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIGFuIGFycmF5IG9mIGtleXMgdXBkYXRlZC5cbiAgICAgKi9cbiAgICBzZXQoa2V5OiBTdGF0ZS5FdmVudDx0aGlzPiwgdmFsdWU6IHVua25vd24sIGluaXQ/OiBib29sZWFuKTogUHJvbWlzZUxpa2U8U3RhdGUuRXZlbnQ8dGhpcz5bXT47XG4gICAgLyoqXG4gICAgICogQ2FsbCBhIGZ1bmN0aW9uIHdoZW4gdXBkYXRlIG9jY3Vycy5cbiAgICAgKlxuICAgICAqIEdpdmVuIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZXZlcnkgYXNzaWdubWVudCAod2hpY2ggY2hhbmdlcyB2YWx1ZSkgb3IgZXhwbGljaXQgYHNldGAuXG4gICAgICpcbiAgICAgKiBUbyBydW4gbG9naWMgb24gZmluYWwgdmFsdWUgb25seSwgY2FsbGJhY2sgbWF5IHJldHVybiBhIGZ1bmN0aW9uLiBVc2luZyB0aGUgc2FtZVxuICAgICAqIGZ1bmN0aW9uIGZvciBvbmUgb3IgbW9yZSBldmVudHMgd2lsbCBlbnN1cmUgaXQgaXMgY2FsbGVkIG9ubHkgd2hlbiBldmVudHMgYXJlIHNldHRsZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsIHdoZW4gdXBkYXRlIG9jY3Vycy5cbiAgICAgKiBAcmV0dXJucyBGdW5jdGlvbiB0byByZW1vdmUgbGlzdGVuZXIuIFdpbGwgcmV0dXJuIGB0cnVlYCBpZiByZW1vdmVkLCBgZmFsc2VgIGlmIGluYWN0aXZlIGFscmVhZHkuXG4gICAgICpcbiAgICAgKi9cbiAgICBzZXQoY2FsbGJhY2s6IFN0YXRlLk9uRXZlbnQ8dGhpcz4pOiAoKSA9PiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIENhbGwgYSBmdW5jdGlvbiB3aGVuIGEgcHJvcGVydHkgaXMgdXBkYXRlZC5cbiAgICAgKiBVbmxpa2UgYGdldGAsIHRoaXMgY2FsbHMgc3luY2hyb25vdXNseSBhbmQgd2lsbCBmaXJlIGFzIG1hbnkgdGltZXMgYXMgdGhlIHByb3BlcnR5IGlzIHVwZGF0ZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsIHdoZW4gcHJvcGVydHkgaXMgdXBkYXRlZC5cbiAgICAgKiBAcGFyYW0gZXZlbnQgLSBQcm9wZXJ0eSB0byB3YXRjaCBmb3IgdXBkYXRlcy5cbiAgICAgKi9cbiAgICBzZXQoY2FsbGJhY2s6IFN0YXRlLk9uRXZlbnQ8dGhpcz4sIGV2ZW50OiBTdGF0ZS5FdmVudDx0aGlzPiB8IG51bGwpOiAoKSA9PiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIERlY2xhcmUgYW4gZW5kIHRvIHVwZGF0ZXMuIFRoaXMgZXZlbnQgaXMgZmluYWwgYW5kIHdpbGwgZnJlZXplIHN0YXRlLlxuICAgICAqIFRoaXMgZXZlbnQgY2FuIGJlIHdhdGNoZWQgZm9yIGFzIHdlbGwsIHRvIHJ1biBjbGVhbnVwIGxvZ2ljIGFuZCBpbnRlcm5hbGx5IHdpbGwgcmVtb3ZlIGFsbCBsaXN0ZW5lcnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3RhdHVzIC0gYG51bGxgIHRvIGVuZCB1cGRhdGVzLlxuICAgICAqL1xuICAgIHNldChzdGF0dXM6IG51bGwpOiB2b2lkO1xuICAgIC8qKlxuICAgICAqIEl0ZXJhdGUgb3ZlciBtYW5hZ2VkIHByb3BlcnRpZXMgaW4gdGhpcyBpbnN0YW5jZSBvZiBTdGF0ZS5cbiAgICAgKiBZZWlsZHMgdGhlIGtleSBhbmQgY3VycmVudCB2YWx1ZSBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAgICAgKi9cbiAgICBbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYXRvcjxbc3RyaW5nLCB1bmtub3duXT47XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFuZCBhY3RpdmF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIHN0YXRlLlxuICAgICAqXG4gICAgICogKipJbXBvcnRhbnQqKiAtIFVubGlrZSBgbmV3IHRoaXMoLi4uKWAgLSB0aGlzIG1ldGhvZCBhbHNvIGFjdGl2YXRlcyBzdGF0ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhcmdzIC0gYXJndW1lbnRzIHNlbnQgdG8gY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBzdGF0aWMgbmV3PFQgZXh0ZW5kcyBTdGF0ZT4odGhpczogU3RhdGUuVHlwZTxUPiwgLi4uYXJnczogU3RhdGUuQXJnczxUPik6IFQ7XG4gICAgLyoqXG4gICAgICogU3RhdGljIGVxdWl2YWxlbnQgb2YgYHggaW5zdGFuY2VvZiB0aGlzYC5cbiAgICAgKiBEZXRlcm1pbmVzIGlmIHByb3ZpZGVkIGNsYXNzIGlzIGEgc3VidHlwZSBvZiB0aGlzIG9uZS5cbiAgICAgKiBJZiBzbywgbGFuZ3VhZ2Ugc2VydmVyIHdpbGwgbWFrZSBhdmFpbGFibGUgYWxsIHN0YXRpY1xuICAgICAqIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMgb2YgdGhpcyBjbGFzcy5cbiAgICAgKi9cbiAgICBzdGF0aWMgaXM8VCBleHRlbmRzIFN0YXRlLkV4dGVuZHM+KHRoaXM6IFQsIG1heWJlOiB1bmtub3duKTogbWF5YmUgaXMgVDtcbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIHJ1biB3aGVuIGFueSBpbnN0YW5jZSBvZiB0aGlzIFN0YXRlIGlzIHVwZGF0ZWQuXG4gICAgICovXG4gICAgc3RhdGljIG9uPFQgZXh0ZW5kcyBTdGF0ZT4odGhpczogU3RhdGUuRXh0ZW5kczxUPiwgbGlzdGVuZXI6IFN0YXRlLk9uRXZlbnQ8VD4pOiAoKSA9PiBib29sZWFuO1xufVxuZGVjbGFyZSBmdW5jdGlvbiBmb2xsb3coZnJvbTogU3RhdGUsIGtleTogc3RyaW5nIHwgbnVtYmVyLCB2YWx1ZT86IGFueSk6IGFueTtcbmRlY2xhcmUgZnVuY3Rpb24gYWNjZXNzKHN1YmplY3Q6IFN0YXRlLCBwcm9wZXJ0eTogc3RyaW5nLCByZXF1aXJlZD86IGJvb2xlYW4pOiBhbnk7XG5kZWNsYXJlIGZ1bmN0aW9uIHVwZGF0ZTxUPihzdWJqZWN0OiBTdGF0ZSwga2V5OiBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wsIHZhbHVlOiBULCBhcmc/OiBib29sZWFuIHwgU3RhdGUuU2V0dGVyPFQ+KTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbi8qKiBSYW5kb20gYWxwaGFudW1iZXJpYyBvZiBsZW5ndGggNjsgYWx3YXlzIHN0YXJ0cyB3aXRoIGEgbGV0dGVyLiAqL1xuZGVjbGFyZSBmdW5jdGlvbiB1aWQoKTogc3RyaW5nO1xuZXhwb3J0IHsgZXZlbnQsIE1FVEhPRCwgU3RhdGUsIFBBUkVOVCwgU1RBVEUsIHVpZCwgYWNjZXNzLCB1cGRhdGUsIGZvbGxvdyB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7QUFDQSxJQUFJLFFBQVE7Q0FBQztPQUFNO0VBQUE7RUFBWTtFQUFRO0VBQUM7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7QUFDeEMsSUFBQSxTQUFhO0NBQUM7T0FBTztFQUFBO0VBQVE7RUFBTztFQUFPO0NBQU07RUFBQztFQUFFO0VBQU07RUFBRztDQUFBO0FBQzdELElBQUksU0FBTztDQUFBO09BQU0sQ0FBQSxRQUFnQjtDQUFBLENBQUEsR0FBQTtDQUFBO0FBQ2pDLElBQUEsUUFBUTtDQUFLO0VBQUMsR0FBTyxHQUFDLE1BQVE7RUFBQTtFQUFPO0VBQVE7RUFBQTtFQUFLO0VBQUE7RUFBQTtFQUFBLE1BQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUEsTUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUEsTUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBLE1BQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0FBQ2xELElBQUksUUFBQTtDQUFTO09BQU8sRUFBQTtDQUFBLENBQVEsR0FBQztDQUFBO0FBQzdCLElBQUEsUUFBUTtDQUFLO0VBQUMsTUFBUTtFQUFBLE1BQU87RUFBTSxXQUFJO0VBQUE7RUFBQSxNQUFBO0VBQUEsTUFBQTtFQUFBLE1BQUE7RUFBQTtFQUFBO0VBQUEsTUFBQTtFQUFBLE1BQUE7RUFBQTtFQUFBO0VBQUEsTUFBQTtFQUFBLE1BQUE7RUFBQTtFQUFBLE1BQUE7RUFBQSxNQUFBO0VBQUE7RUFBQSxNQUFBO0VBQUEsTUFBQTtFQUFBO0VBQUEsTUFBQTtFQUFBLE1BQUE7RUFBQTtFQUFBLE1BQUE7RUFBQSxNQUFBO0VBQUEsTUFBQTtFQUFBO0VBQUEsT0FBQTtFQUFBO0VBQUE7RUFBQSxNQUFBO0VBQUE7RUFBQSxNQUFBO0VBQUE7RUFBQSxNQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQSxNQUFBO0VBQUE7RUFBQSxNQUFBO0VBQUE7RUFBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7QUFDdkMsSUFBQSxTQUFRO0NBQUE7T0FBZ0IsQ0FBQSxNQUFBO0NBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7QUFDeEIsSUFBSSxTQUFRO0NBQUE7T0FBUSxDQUFLLE1BQUU7Q0FBTTtFQUFBO0VBQUk7RUFBSztFQUFDO0VBQUE7Q0FBQTtBQUMzQyxJQUFJLFNBQUs7Q0FBQTtFQUFTLE1BQUM7RUFBQTtFQUFRO0VBQU87RUFBQyxNQUFRO0VBQUU7Q0FBQTtFQUFRO0VBQUk7RUFBSTtFQUFDO0VBQU07RUFBSztFQUFJO0VBQUk7RUFBRTtFQUFNO0VBQUM7Q0FBQTtBQUMxRixJQUFJLE1BQU07Q0FBQTtPQUFNLEVBQUE7Q0FBQSxFQUFXO0NBQUMifQ==
package/dist/esm/state.js DELETED
@@ -1,293 +0,0 @@
1
- import { Observable, PENDING_KEYS, addListener, event, watch } from "./observable.js";
2
-
3
- //#region src/state.ts
4
- const define = Object.defineProperty;
5
- /** Register for all active states via string identifiers (usually unique). */
6
- const ID = /* @__PURE__ */ new WeakMap();
7
- /** Internal state assigned to states. */
8
- const STATE = /* @__PURE__ */ new WeakMap();
9
- /** External listeners for any given State. */
10
- const NOTIFY = /* @__PURE__ */ new WeakMap();
11
- /** Parent-child relationships. */
12
- const PARENT = /* @__PURE__ */ new WeakMap();
13
- /** List of methods defined by a given type. */
14
- const METHODS = /* @__PURE__ */ new WeakMap();
15
- /** Reference bound instance methods to real ones. */
16
- const METHOD = /* @__PURE__ */ new WeakMap();
17
- /** Currently accumulating export. Stores real values of placeholder properties such as ref() or child states. */
18
- let EXPORT;
19
- var State = class {
20
- constructor(...args) {
21
- prepare(this);
22
- define(this, "is", { value: this });
23
- init(this, ...args, (x) => x.new && x.new());
24
- }
25
- [Observable](callback, required) {
26
- const watch = /* @__PURE__ */ new Set();
27
- const proxy = Object.create(this);
28
- addListener(this, (key) => {
29
- if (watch.has(key)) callback();
30
- });
31
- OBSERVER.set(proxy, (key, value) => {
32
- if (value === void 0 && required) throw new Error(`${this}.${key} is required in this context.`);
33
- watch.add(key);
34
- if (value instanceof Object && Observable in value) return value[Observable](callback, required) || value;
35
- return value;
36
- });
37
- return proxy;
38
- }
39
- get(arg1, arg2) {
40
- const self = this.is;
41
- if (arg1 === void 0) return values(self);
42
- if (typeof arg1 == "function") return effect(self, arg1);
43
- if (typeof arg2 == "function") return addListener(self, arg2, arg1);
44
- if (arg1 === null) return Object.isFrozen(STATE.get(self));
45
- return access(self, arg1, arg2);
46
- }
47
- set(arg1, arg2, arg3) {
48
- const self = this.is;
49
- if (typeof arg1 == "function") return addListener(self, (key) => {
50
- if (arg2 === key || arg2 === void 0 && typeof key == "string") return arg1.call(self, key, self);
51
- });
52
- if (arg1 && typeof arg1 == "object") assign(self, arg1, arg2 === true);
53
- else if (!arg2) event(self, arg1);
54
- else if (arg3) manage(self, arg1, arg2);
55
- else update(self, arg1, arg2);
56
- const pending = PENDING_KEYS.get(this);
57
- if (pending) return { then: (resolve) => new Promise((res) => {
58
- const remove = addListener(this, (key) => {
59
- if (key !== true) {
60
- remove();
61
- return () => res(Array.from(pending));
62
- }
63
- });
64
- }).then(resolve) };
65
- }
66
- /**
67
- * Iterate over managed properties in this instance of State.
68
- * Yeilds the key and current value for each property.
69
- */
70
- [Symbol.iterator]() {
71
- return Object.entries(STATE.get(this.is))[Symbol.iterator]();
72
- }
73
- /**
74
- * Create and activate a new instance of this state.
75
- *
76
- * **Important** - Unlike `new this(...)` - this method also activates state.
77
- *
78
- * @param args - arguments sent to constructor
79
- */
80
- static new(...args) {
81
- const instance = new this(...args);
82
- event(instance);
83
- return instance;
84
- }
85
- /**
86
- * Static equivalent of `x instanceof this`.
87
- * Determines if provided class is a subtype of this one.
88
- * If so, language server will make available all static
89
- * methods and properties of this class.
90
- */
91
- static is(maybe) {
92
- return maybe === this || typeof maybe == "function" && maybe.prototype instanceof this;
93
- }
94
- /**
95
- * Register a callback to run when any instance of this State is updated.
96
- */
97
- static on(listener) {
98
- let notify = NOTIFY.get(this);
99
- if (!notify) NOTIFY.set(this, notify = /* @__PURE__ */ new Set());
100
- notify.add(listener);
101
- return () => notify.delete(listener);
102
- }
103
- };
104
- define(State.prototype, "toString", { value() {
105
- return ID.get(this.is);
106
- } });
107
- define(State, "toString", { value() {
108
- return this.name;
109
- } });
110
- function assign(subject, data, silent) {
111
- const methods = METHODS.get(subject.constructor);
112
- for (const key in data) {
113
- const bind = methods.get(key);
114
- if (bind) bind.call(subject, data[key]);
115
- else if (key in subject && key !== "is") {
116
- const desc = Object.getOwnPropertyDescriptor(subject, key);
117
- const set = desc && desc.set;
118
- if (set) set.call(subject, data[key], silent);
119
- else subject[key] = data[key];
120
- }
121
- }
122
- }
123
- /** Apply instructions and inherited event listeners. Ensure class metadata is ready. */
124
- function prepare(state) {
125
- let T = state.constructor;
126
- if (T === State) throw new Error("Cannot create base State.");
127
- const chain = [];
128
- let keys = /* @__PURE__ */ new Map();
129
- ID.set(state, `${T}-${uid()}`);
130
- while (T.name) {
131
- for (const cb of NOTIFY.get(T) || []) addListener(state, cb);
132
- if (T === State) break;
133
- else chain.unshift(T);
134
- T = Object.getPrototypeOf(T);
135
- }
136
- for (const type of chain) {
137
- if (METHODS.has(type)) {
138
- keys = METHODS.get(type);
139
- continue;
140
- }
141
- METHODS.set(type, keys = new Map(keys));
142
- for (const [key, { value }] of Object.entries(Object.getOwnPropertyDescriptors(type.prototype))) {
143
- if (!value || key == "constructor") continue;
144
- function bind(original) {
145
- const { is } = this;
146
- if (is.hasOwnProperty(key) && !original) return value;
147
- const fn = original || value;
148
- const bound = fn.bind(is);
149
- METHOD.set(bound, fn);
150
- define(is, key, {
151
- value: bound,
152
- writable: true
153
- });
154
- return bound;
155
- }
156
- keys.set(key, bind);
157
- define(type.prototype, key, {
158
- get: bind,
159
- set: bind
160
- });
161
- }
162
- }
163
- }
164
- /**
165
- * Apply state arguemnts, run callbacks and observe properties.
166
- * Accumulate and handle cleanup events.
167
- **/
168
- function init(self, ...args) {
169
- const state = {};
170
- STATE.set(self, state);
171
- args = args.flat().filter((arg) => {
172
- if (typeof arg == "string") ID.set(self, arg);
173
- else return true;
174
- });
175
- addListener(self, () => {
176
- if (!PARENT.has(self)) PARENT.set(self, null);
177
- for (const key in self) {
178
- const desc = Object.getOwnPropertyDescriptor(self, key);
179
- if ("value" in desc) manage(self, key, desc.value, true);
180
- }
181
- for (const arg of args) {
182
- const use = typeof arg == "function" ? arg.call(self, self) : arg;
183
- if (use instanceof Promise) use.catch((err) => {
184
- console.error(`Async error in constructor for ${self}:`);
185
- console.error(err);
186
- });
187
- else if (Array.isArray(use)) args.push(...use);
188
- else if (typeof use == "function") addListener(self, use, null);
189
- else if (typeof use == "object") assign(self, use, true);
190
- }
191
- addListener(self, () => {
192
- for (const [_, value] of self) if (value instanceof State && PARENT.get(value) === self) value.set(null);
193
- Object.freeze(state);
194
- }, null);
195
- return null;
196
- });
197
- }
198
- function manage(target, key, value, silent) {
199
- const state = STATE.get(target);
200
- function get() {
201
- return follow(this, key, state[key]);
202
- }
203
- function set(value, silent) {
204
- update(target, key, value, silent);
205
- if (value instanceof State && !PARENT.has(value)) {
206
- PARENT.set(value, target);
207
- event(value);
208
- }
209
- }
210
- define(target, key, {
211
- set,
212
- get
213
- });
214
- set(value, silent);
215
- }
216
- function effect(target, fn) {
217
- const effect = METHOD.get(fn) || fn;
218
- let pending = /* @__PURE__ */ new Set();
219
- return watch(target, (proxy) => {
220
- const cb = effect.call(proxy, proxy, pending);
221
- if (cb === null) return cb;
222
- return (update) => {
223
- pending = PENDING_KEYS.get(target);
224
- if (typeof cb == "function") cb(update);
225
- };
226
- });
227
- }
228
- function values(target) {
229
- const values = {};
230
- let isNotRecursive;
231
- if (!EXPORT) {
232
- isNotRecursive = true;
233
- EXPORT = new Map([[target, values]]);
234
- }
235
- for (let [key, value] of target) {
236
- if (EXPORT.has(value)) value = EXPORT.get(value);
237
- else if (value && typeof value == "object" && "get" in value && typeof value.get === "function") EXPORT.set(value, value = value.get());
238
- values[key] = value;
239
- }
240
- if (isNotRecursive) EXPORT = void 0;
241
- return Object.freeze(values);
242
- }
243
- const OBSERVER = /* @__PURE__ */ new WeakMap();
244
- function follow(from, key, value) {
245
- const observe = OBSERVER.get(from);
246
- return observe ? observe(key, value) : value;
247
- }
248
- function access(subject, property, required) {
249
- const state = STATE.get(subject);
250
- if (property in state || required === false) {
251
- const value = state[property];
252
- if (value !== void 0 || !required) return value;
253
- }
254
- if (METHODS.get(subject.constructor).has(property)) return METHOD.get(subject[property]);
255
- const error = /* @__PURE__ */ new Error(`${subject}.${property} is not yet available.`);
256
- const promise = new Promise((resolve, reject) => {
257
- addListener(subject, (key) => {
258
- if (key === property) {
259
- resolve(state[key]);
260
- return null;
261
- }
262
- if (key === null) reject(/* @__PURE__ */ new Error(`${subject} is destroyed.`));
263
- });
264
- });
265
- throw Object.assign(promise, {
266
- toString: () => String(error),
267
- name: "Suspense",
268
- message: error.message,
269
- stack: error.stack
270
- });
271
- }
272
- function update(subject, key, value, arg) {
273
- const state = STATE.get(subject);
274
- if (Object.isFrozen(state)) throw new Error(`Tried to update ${subject}.${String(key)} but state is destroyed.`);
275
- const previous = state[key];
276
- if (typeof arg == "function") {
277
- const out = arg.call(subject, value, previous);
278
- if (out === false) return false;
279
- if (typeof out == "function") value = out();
280
- }
281
- if (value === previous && key in state) return;
282
- state[key] = value;
283
- if (arg !== true) event(subject, key);
284
- return true;
285
- }
286
- /** Random alphanumberic of length 6; always starts with a letter. */
287
- function uid() {
288
- return (.278 + Math.random() * .722).toString(36).substring(2, 8).toUpperCase();
289
- }
290
-
291
- //#endregion
292
- export { METHOD, PARENT, STATE, State, access, event, follow, uid, update };
293
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0YXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGFkZExpc3RlbmVyLFxuICB3YXRjaCxcbiAgZXZlbnQsXG4gIE9ic2VydmFibGUsXG4gIE5vdGlmeSxcbiAgUEVORElOR19LRVlTXG59IGZyb20gJy4vb2JzZXJ2YWJsZSc7XG5cbmNvbnN0IGRlZmluZSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxuLyoqIFJlZ2lzdGVyIGZvciBhbGwgYWN0aXZlIHN0YXRlcyB2aWEgc3RyaW5nIGlkZW50aWZpZXJzICh1c3VhbGx5IHVuaXF1ZSkuICovXG5jb25zdCBJRCA9IG5ldyBXZWFrTWFwPFN0YXRlLCBzdHJpbmc+KCk7XG5cbi8qKiBJbnRlcm5hbCBzdGF0ZSBhc3NpZ25lZCB0byBzdGF0ZXMuICovXG5jb25zdCBTVEFURSA9IG5ldyBXZWFrTWFwPFN0YXRlLCBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sLCB1bmtub3duPj4oKTtcblxuLyoqIEV4dGVybmFsIGxpc3RlbmVycyBmb3IgYW55IGdpdmVuIFN0YXRlLiAqL1xuY29uc3QgTk9USUZZID0gbmV3IFdlYWtNYXA8U3RhdGUuRXh0ZW5kcywgU2V0PE5vdGlmeT4+KCk7XG5cbi8qKiBQYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwcy4gKi9cbmNvbnN0IFBBUkVOVCA9IG5ldyBXZWFrTWFwPFN0YXRlLCBTdGF0ZSB8IG51bGw+KCk7XG5cbi8qKiBMaXN0IG9mIG1ldGhvZHMgZGVmaW5lZCBieSBhIGdpdmVuIHR5cGUuICovXG5jb25zdCBNRVRIT0RTID0gbmV3IFdlYWtNYXA8RnVuY3Rpb24sIE1hcDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiB2b2lkPj4oKTtcblxuLyoqIFJlZmVyZW5jZSBib3VuZCBpbnN0YW5jZSBtZXRob2RzIHRvIHJlYWwgb25lcy4gKi9cbmNvbnN0IE1FVEhPRCA9IG5ldyBXZWFrTWFwPGFueSwgYW55PigpO1xuXG4vKiogQ3VycmVudGx5IGFjY3VtdWxhdGluZyBleHBvcnQuIFN0b3JlcyByZWFsIHZhbHVlcyBvZiBwbGFjZWhvbGRlciBwcm9wZXJ0aWVzIHN1Y2ggYXMgcmVmKCkgb3IgY2hpbGQgc3RhdGVzLiAqL1xubGV0IEVYUE9SVDogTWFwPGFueSwgYW55PiB8IHVuZGVmaW5lZDtcblxuZGVjbGFyZSBuYW1lc3BhY2UgU3RhdGUge1xuICAvKiogQW55IHR5cGUgb2YgU3RhdGUsIHVzaW5nIG93biBjbGFzcyBjb25zdHJ1Y3RvciBhcyBpdHMgaWRlbnRpZmllci4gKi9cbiAgdHlwZSBFeHRlbmRzPFQgZXh0ZW5kcyBTdGF0ZSA9IFN0YXRlPiA9IChhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUKSAmXG4gICAgdHlwZW9mIFN0YXRlO1xuXG4gIC8qKiBBIFN0YXRlIGNvbnN0cnVjdG9yIHdoaWNoIG1heSBiZSBpbnN0YW5jaWF0ZWQuICovXG4gIHR5cGUgVHlwZTxUIGV4dGVuZHMgU3RhdGUgPSBTdGF0ZT4gPSAobmV3ICguLi5hcmdzOiBTdGF0ZS5BcmdzPFQ+KSA9PiBUKSAmXG4gICAgT21pdDx0eXBlb2YgU3RhdGUsIG5ldmVyPjtcblxuICAvKiogU3RhdGUgY29uc3RydWN0b3IgYXJndW1lbnRzICovXG4gIHR5cGUgQXJnczxUIGV4dGVuZHMgU3RhdGUgPSBhbnk+ID0gKFxuICAgIHwgQXJnczxUPlxuICAgIHwgSW5pdDxUPlxuICAgIHwgQXNzaWduPFQ+XG4gICAgfCBzdHJpbmdcbiAgICB8IHZvaWRcbiAgKVtdO1xuXG4gIC8qKlxuICAgKiBTdGF0ZSBjb25zdHJ1Y3RvciBjYWxsYmFjayAtIGlzIGNhbGxlZCB3aGVuIFN0YXRlIGZpbmlzaGVzIGludGlhbGl6aW5nLlxuICAgKiBSZXR1cm5lZCBmdW5jdGlvbiB3aWxsIHJ1biB3aGVuIHN0YXRlIGlzIGRlc3Ryb3llZC5cbiAgICovXG4gIHR5cGUgSW5pdDxUIGV4dGVuZHMgU3RhdGUgPSBTdGF0ZT4gPSAoXG4gICAgdGhpczogVCxcbiAgICB0aGlzQXJnOiBUXG4gICkgPT4gUHJvbWlzZTx2b2lkPiB8ICgoKSA9PiB2b2lkKSB8IEFyZ3M8VD4gfCBBc3NpZ248VD4gfCB2b2lkO1xuXG4gIC8qKiBPYmplY3Qgb3ZlcmxheSB0byBvdmVycmlkZSB2YWx1ZXMgYW5kIG1ldGhvZHMgb24gYSBzdGF0ZS4gKi9cbiAgdHlwZSBBc3NpZ248VD4gPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiAmIHtcbiAgICBbSyBpbiBGaWVsZDxUPl0/OiBUW0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGluZmVyIEEpID0+IGluZmVyIFJcbiAgICAgID8gKHRoaXM6IFQsIC4uLmFyZ3M6IEEpID0+IFJcbiAgICAgIDogVFtLXTtcbiAgfTtcblxuICAvKiogU3Vic2V0IG9mIGBrZXlvZiBUYCB3aGljaCBhcmUgbm90IG1ldGhvZHMgb3IgZGVmaW5lZCBieSBiYXNlIFN0YXRlIFUuICoqL1xuICB0eXBlIEZpZWxkPFQ+ID0gRXhjbHVkZTxrZXlvZiBULCBrZXlvZiBTdGF0ZT47XG5cbiAgLyoqIEFueSB2YWxpZCBrZXkgZm9yIHN0YXRlLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIEZpZWxkPFQ+LiAqL1xuICB0eXBlIEV2ZW50PFQ+ID0gRmllbGQ8VD4gfCBudW1iZXIgfCBzeW1ib2wgfCAoc3RyaW5nICYge30pO1xuXG4gIC8qKiBFeHBvcnQvSW1wb3J0IGNvbXBhdGlibGUgdmFsdWUgZm9yIGEgZ2l2ZW4gcHJvcGVydHkgaW4gYSBTdGF0ZS4gKi9cbiAgdHlwZSBFeHBvcnQ8Uj4gPSBSIGV4dGVuZHMgeyBnZXQoKTogaW5mZXIgVCB9ID8gVCA6IFI7XG5cbiAgLyoqIFZhbHVlIGZvciBhIHByb3BlcnR5IG1hbmFnZWQgYnkgYSBzdGF0ZS4gKi9cbiAgdHlwZSBWYWx1ZTxUIGV4dGVuZHMgU3RhdGUsIEsgZXh0ZW5kcyBTdGF0ZS5FdmVudDxUPj4gPSBLIGV4dGVuZHMga2V5b2YgVFxuICAgID8gRXhwb3J0PFRbS10+XG4gICAgOiB1bmtub3duO1xuXG4gIHR5cGUgU2V0dGVyPFQ+ID0gKHZhbHVlOiBULCBwcmV2aW91czogVCkgPT4gYm9vbGVhbiB8IHZvaWQgfCAoKCkgPT4gVCk7XG5cbiAgdHlwZSBPbkV2ZW50PFQgZXh0ZW5kcyBTdGF0ZT4gPSAoXG4gICAgdGhpczogVCxcbiAgICBrZXk6IHVua25vd24sXG4gICAgc291cmNlOiBUXG4gICkgPT4gdm9pZCB8ICgoKSA9PiB2b2lkKSB8IG51bGw7XG5cbiAgdHlwZSBPblVwZGF0ZTxUIGV4dGVuZHMgU3RhdGUsIEsgZXh0ZW5kcyBTdGF0ZS5FdmVudDxUPj4gPSAoXG4gICAgdGhpczogVCxcbiAgICBrZXk6IEssXG4gICAgdGhpc0FyZzogS1xuICApID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFZhbHVlcyBmcm9tIGN1cnJlbnQgc3RhdGUgb2YgZ2l2ZW4gc3RhdGUuXG4gICAqIERpZmZlcnMgZnJvbSBgVmFsdWVzYCBhcyB2YWx1ZXMgaGVyZSB3aWxsIGRyaWxsXG4gICAqIGludG8gXCJyZWFsXCIgdmFsdWVzIGhlbGQgYnkgZXhvdGljcyBsaWtlIHJlZi5PYmplY3QuXG4gICAqL1xuICB0eXBlIFZhbHVlczxUPiA9IHsgW1AgaW4gRmllbGQ8VD5dOiBFeHBvcnQ8VFtQXT4gfTtcblxuICAvKiogT2JqZWN0IGNvbXBlcmFibGUgdG8gZGF0YSBmb3VuZCBpbiBULiAqL1xuICB0eXBlIFBhcnRpYWw8VD4gPSB7IFtQIGluIEZpZWxkPFQ+XT86IEV4cG9ydDxUW1BdPiB9O1xuXG4gIC8qKiBFeG90aWMgdmFsdWUsIHdoZXJlIGFjdHVhbCB2YWx1ZSBpcyBjb250YWluZWQgd2l0aGluLiAqL1xuICB0eXBlIFJlZjxUID0gYW55PiA9IHtcbiAgICAobmV4dDogVCk6IHZvaWQ7XG4gICAgY3VycmVudDogVCB8IG51bGw7XG4gIH07XG5cbiAgLyoqXG4gICAqIEEgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggaXMgc3Vic2NyaWJlZCB0byBwYXJlbnQgYW5kIHVwZGF0ZXMgd2hlbiBhY2Nlc3NlZCBwcm9wZXJ0aWVzIGNoYW5nZS5cbiAgICpcbiAgICogQHBhcmFtIGN1cnJlbnQgLSBDdXJyZW50IHN0YXRlIG9mIHRoaXMgc3RhdGUuIFRoaXMgaXMgYSBwcm94eSB3aGljaCBkZXRlY3RzIHByb3BlcnRpZXMgd2hpY2hcbiAgICogd2hlcmUgYWNjZXNzZWQsIGFuZCB0aHVzIGRlcGVuZGVkIHVwb24gdG8gc3RheSBjdXJyZW50LlxuICAgKlxuICAgKiBAcGFyYW0gdXBkYXRlIC0gU2V0IG9mIHByb3BlcnRpZXMgd2hpY2ggaGF2ZSBjaGFuZ2VkLCBhbmQgZXZlbnRzIGZpcmVkLCBzaW5jZSBsYXN0IHVwZGF0ZS5cbiAgICpcbiAgICogQHJldHVybnMgQSBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoaXMgZWZmZWN0IGlzIHN0YWxlLlxuICAgKi9cbiAgdHlwZSBFZmZlY3Q8VD4gPSAoXG4gICAgdGhpczogVCxcbiAgICBjdXJyZW50OiBULFxuICAgIHVwZGF0ZTogU2V0PFN0YXRlLkV2ZW50PFQ+PlxuICApID0+IEVmZmVjdENhbGxiYWNrIHwgUHJvbWlzZTx2b2lkPiB8IG51bGwgfCB2b2lkO1xuXG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIGZ1bmN0aW9uIHJldHVybmVkIGJ5IGVmZmVjdC4gV2lsbCBiZSBjYWxsZWQgd2hlbiBlZmZlY3QgaXMgc3RhbGUuXG4gICAqXG4gICAqIEBwYXJhbSB1cGRhdGUgLSBgdHJ1ZWAgaWYgdXBkYXRlIGlzIHBlbmRpbmcsIGBmYWxzZWAgZWZmZWN0IGhhcyBiZWVuIGNhbmNlbGxlZCwgYG51bGxgIGlmIHN0YXRlIGlzIGRlc3Ryb3llZC5cbiAgICovXG4gIHR5cGUgRWZmZWN0Q2FsbGJhY2sgPSAodXBkYXRlOiBib29sZWFuIHwgbnVsbCkgPT4gdm9pZDtcbn1cblxuaW50ZXJmYWNlIFN0YXRlIHtcbiAgLyoqXG4gICAqIExvb3BiYWNrIHRvIGluc3RhbmNlIG9mIHRoaXMgc3RhdGUuIFRoaXMgaXMgdXNlZnVsIHdoZW4gaW4gYSBzdWJzY3JpYmVkIGNvbnRleHQsXG4gICAqIHRvIGtlZXAgd3JpdGUgYWNjZXNzIHRvIGB0aGlzYCBhZnRlciBhIGRlc3RydWN0dXJlLiBZb3UgY2FuIHVzZSBpdCB0byByZWFkIHZhcmlhYmxlcyBzaWxlbnRseSBhcyB3ZWxsLlxuICAgKiovXG4gIGlzOiB0aGlzO1xufVxuXG5hYnN0cmFjdCBjbGFzcyBTdGF0ZSBpbXBsZW1lbnRzIE9ic2VydmFibGUge1xuICBjb25zdHJ1Y3RvciguLi5hcmdzOiBTdGF0ZS5BcmdzKSB7XG4gICAgcHJlcGFyZSh0aGlzKTtcbiAgICBkZWZpbmUodGhpcywgJ2lzJywgeyB2YWx1ZTogdGhpcyB9KTtcbiAgICBpbml0KHRoaXMsIC4uLmFyZ3MsICh4OiB0aGlzKSA9PiB4Lm5ldyAmJiB4Lm5ldygpKTtcbiAgfVxuXG4gIFtPYnNlcnZhYmxlXShjYWxsYmFjazogT2JzZXJ2YWJsZS5DYWxsYmFjaywgcmVxdWlyZWQ/OiBib29sZWFuKSB7XG4gICAgY29uc3Qgd2F0Y2ggPSBuZXcgU2V0PHVua25vd24+KCk7XG4gICAgY29uc3QgcHJveHkgPSBPYmplY3QuY3JlYXRlKHRoaXMpO1xuXG4gICAgYWRkTGlzdGVuZXIodGhpcywgKGtleSkgPT4ge1xuICAgICAgaWYgKHdhdGNoLmhhcyhrZXkpKSBjYWxsYmFjaygpO1xuICAgIH0pO1xuXG4gICAgT0JTRVJWRVIuc2V0KHByb3h5LCAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgcmVxdWlyZWQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzfS4ke2tleX0gaXMgcmVxdWlyZWQgaW4gdGhpcyBjb250ZXh0LmApO1xuXG4gICAgICB3YXRjaC5hZGQoa2V5KTtcblxuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgT2JqZWN0ICYmIE9ic2VydmFibGUgaW4gdmFsdWUpXG4gICAgICAgIHJldHVybiB2YWx1ZVtPYnNlcnZhYmxlXShjYWxsYmFjaywgcmVxdWlyZWQpIHx8IHZhbHVlO1xuXG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcHJveHkgYXMgdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBsaWZlY3ljbGUgaG9vayBjYWxsZWQgZHVyaW5nIFN0YXRlIGluaXRpYWxpemF0aW9uLlxuICAgKiBDYW4gcmV0dXJuIGEgY2xlYW51cCBmdW5jdGlvbiB0byBydW4gd2hlbiBzdGF0ZSBpcyBkZXN0cm95ZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgbmV3PygpOiB2b2lkIHwgKCgpID0+IHZvaWQpO1xuXG4gIC8qKlxuICAgKiBQdWxsIGN1cnJlbnQgdmFsdWVzIGZyb20gc3RhdGUuIEZsYXR0ZW5zIGFsbCBzdGF0ZXMgYW5kIGV4b3RpYyB2YWx1ZXMgcmVjdXJzaXZlbHkuXG4gICAqXG4gICAqIEByZXR1cm5zIE9iamVjdCB3aXRoIGFsbCB2YWx1ZXMgZnJvbSB0aGlzIHN0YXRlLlxuICAgKiovXG4gIGdldCgpOiBTdGF0ZS5WYWx1ZXM8dGhpcz47XG5cbiAgLyoqXG4gICAqIFJ1biBhIGZ1bmN0aW9uIHdoaWNoIHdpbGwgcnVuIGF1dG9tYXRpY2FsbHkgd2hlbiBhY2Nlc3NlZCB2YWx1ZXMgY2hhbmdlLlxuICAgKlxuICAgKiBAcGFyYW0gZWZmZWN0IEZ1bmN0aW9uIHRvIHJ1biwgYW5kIGFnYWluIHdoZW5ldmVyIGFjY2Vzc2VkIHZhbHVlcyBjaGFuZ2UuXG4gICAqICAgICAgICAgICAgICAgSWYgZWZmZWN0IHJldHVybnMgYSBmdW5jdGlvbiwgaXQgd2lsbCBiZSBjYWxsZWQgd2hlbiBhIGNoYW5nZSBvY2N1cnMgKHN5bmNyb25vdXNseSksXG4gICAqICAgICAgICAgICAgICAgZWZmZWN0IGlzIGNhbmNlbGxlZCwgb3IgcGFyZW50IHN0YXRlIGlzIGRlc3Ryb3llZC5cbiAgICogQHJldHVybnMgRnVuY3Rpb24gdG8gY2FuY2VsIGxpc3RlbmVyLlxuICAgKi9cbiAgZ2V0KGVmZmVjdDogU3RhdGUuRWZmZWN0PHRoaXM+KTogKCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogR2V0IHZhbHVlIG9mIGEgcHJvcGVydHkuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBQcm9wZXJ0eSB0byBnZXQgdmFsdWUgb2YuXG4gICAqIEBwYXJhbSByZXF1aXJlZCAtIElmIHRydWUsIHdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgcHJvcGVydHkgaXMgbm90IGF2YWlsYWJsZS5cbiAgICogQHJldHVybnMgVmFsdWUgb2YgcHJvcGVydHkuXG4gICAqL1xuICBnZXQ8VCBleHRlbmRzIFN0YXRlLkV2ZW50PHRoaXM+PihcbiAgICBrZXk6IFQsXG4gICAgcmVxdWlyZWQ/OiBib29sZWFuXG4gICk6IFN0YXRlLlZhbHVlPHRoaXMsIFQ+O1xuXG4gIC8qKlxuICAgKiBSdW4gYSBmdW5jdGlvbiB3aGVuIGEgcHJvcGVydHkgaXMgdXBkYXRlZC5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFByb3BlcnR5IHRvIHdhdGNoIGZvciB1cGRhdGVzLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsIHdoZW4gcHJvcGVydHkgaXMgdXBkYXRlZC5cbiAgICogQHJldHVybnMgRnVuY3Rpb24gdG8gY2FuY2VsIGxpc3RlbmVyLlxuICAgKi9cbiAgZ2V0PFQgZXh0ZW5kcyBTdGF0ZS5FdmVudDx0aGlzPj4oXG4gICAga2V5OiBULFxuICAgIGNhbGxiYWNrOiBTdGF0ZS5PblVwZGF0ZTx0aGlzLCBUPlxuICApOiAoKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBzdGF0ZSBpcyBleHBpcmVkLlxuICAgKlxuICAgKiBAcGFyYW0gc3RhdHVzIC0gYG51bGxgIHRvIGNoZWNrIGlmIHN0YXRlIGlzIGV4cGlyZWQuXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiBzdGF0ZSBpcyBleHBpcmVkLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICovXG4gIGdldChzdGF0dXM6IG51bGwpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB3aGVuIHN0YXRlIGlzIHRvIGJlIGRlc3Ryb3llZC5cbiAgICpcbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gRnVuY3Rpb24gdG8gY2FsbCB3aGVuIHN0YXRlIGlzIGRlc3Ryb3llZC5cbiAgICogQHJldHVybnMgRnVuY3Rpb24gdG8gY2FuY2VsIGxpc3RlbmVyLlxuICAgKi9cbiAgZ2V0KHN0YXR1czogbnVsbCwgY2FsbGJhY2s6ICgpID0+IHZvaWQpOiAoKSA9PiB2b2lkO1xuXG4gIGdldChcbiAgICBhcmcxPzogU3RhdGUuRWZmZWN0PHRoaXM+IHwgc3RyaW5nIHwgbnVsbCxcbiAgICBhcmcyPzogYm9vbGVhbiB8IFN0YXRlLk9uVXBkYXRlPHRoaXMsIGFueT5cbiAgKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXMuaXM7XG5cbiAgICBpZiAoYXJnMSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdmFsdWVzKHNlbGYpO1xuICAgIGlmICh0eXBlb2YgYXJnMSA9PSAnZnVuY3Rpb24nKSByZXR1cm4gZWZmZWN0KHNlbGYsIGFyZzEpO1xuICAgIGlmICh0eXBlb2YgYXJnMiA9PSAnZnVuY3Rpb24nKSByZXR1cm4gYWRkTGlzdGVuZXIoc2VsZiwgYXJnMiwgYXJnMSk7XG4gICAgaWYgKGFyZzEgPT09IG51bGwpIHJldHVybiBPYmplY3QuaXNGcm96ZW4oU1RBVEUuZ2V0KHNlbGYpKTtcbiAgICByZXR1cm4gYWNjZXNzKHNlbGYsIGFyZzEsIGFyZzIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1cGRhdGUgaW4gcHJvZ3Jlc3MuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgb2JqZWN0IHdpdGggdXBkYXRlZCB2YWx1ZXMsIGB1bmRlZmluZWRgIGlmIHRoZXJlIG5vIHVwZGF0ZSBpcyBwZW5kaW5nLlxuICAgKiovXG4gIHNldCgpOiBQcm9taXNlTGlrZTxTdGF0ZS5FdmVudDx0aGlzPltdPiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVXBkYXRlIG11bGl0cGxlIHByb3BlcnRpZXMgYXQgb25jZS4gTWVyZ2VzIGFyZ3VtZW50IHdpdGggY3VycmVudCBzdGF0ZS5cbiAgICogUHJvcGVydGllcyB3aGljaCBhcmUgbm90IG1hbmFnZWQgYnkgdGhpcyBzdGF0ZSB3aWxsIGJlIGlnbm9yZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhc3NpZ24gLSBPYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIHRvIHVwZGF0ZS5cbiAgICogQHBhcmFtIHNpbGVudCAtIElmIGFuIHVwZGF0ZSBkb2VzIG9jY3VyLCBsaXN0ZW5lcnMgd2lsbCBub3QgYmUgcmVmcmVzaGVkIGF1dG9tYXRpY2FsbHkuXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIGFuIGFycmF5IG9mIGtleXMgdXBkYXRlZCwgYHVuZGVmaW5lZGAgKGltbWVkaWF0ZWx5KSBpZiBhIG5vb3AuXG4gICAqL1xuICBzZXQoXG4gICAgYXNzaWduPzogU3RhdGUuQXNzaWduPHRoaXM+LFxuICAgIHNpbGVudD86IGJvb2xlYW5cbiAgKTogUHJvbWlzZUxpa2U8U3RhdGUuRXZlbnQ8dGhpcz5bXT4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFB1c2ggYW4gdXBkYXRlLiBUaGlzIHdpbGwgbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgYXNzb2NpYXRlZCBwcm9wZXJ0eS5cbiAgICpcbiAgICogVXNlZnVsIHdoZXJlIGEgcHJvcGVydHkgdmFsdWUgaW50ZXJuYWxseSBoYXMgY2hhbmdlZCwgYnV0IHRoZSBvYmplY3QgaXMgdGhlIHNhbWUuXG4gICAqIEZvciBleGFtcGxlOiBBbiBhcnJheSBoYXMgcHVzaGVkIGEgbmV3IHZhbHVlLCBvciBhIG5lc3RlZCBwcm9wZXJ0eSBpcyB1cGRhdGVkLlxuICAgKlxuICAgKiBZb3UgY2FuIGFsc28gdXNlIHRoaXMgdG8gZGlzcGF0Y2ggYXJiaXRyYXJ5IGV2ZW50cy5cbiAgICogU3ltYm9scyBhcmUgcmVjb21tZW5kZWQgYXMgbm9uLXByb3BlcnR5IGV2ZW50cywgaG93ZXZlciB5b3UgY2FuIHVzZSBhbnkgc3RyaW5nLlxuICAgKiBJZiBkb2luZyBzbywgYmUgc3VyZSB0byBhdm9pZCBjb2xsaXNpb25zIHdpdGggcHJvcGVydHkgbmFtZXMhIEFuIGVhc3kgd2F5IHRvIGRvIHRoaXMgaXNcbiAgICogdG8gcHJlZml4IGFuIGV2ZW50IHdpdGggXCIhXCIgYW5kL29yIHVzZSBkYXNoLWNhc2UuIGUuZy4gYHNldChcIiFldmVudFwiKWAgb3IgYHNldChcIm15LWV2ZW50XCIpYC5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFByb3BlcnR5IG9yIGV2ZW50IHRvIGRpc3BhdGNoLlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIGFuIGFycmF5IG9mIGtleXMgdXBkYXRlZC5cbiAgICovXG4gIHNldChrZXk6IFN0YXRlLkV2ZW50PHRoaXM+KTogUHJvbWlzZUxpa2U8U3RhdGUuRXZlbnQ8dGhpcz5bXT47XG5cbiAgLyoqXG4gICAqIFNldCBhIHZhbHVlIGZvciBhIHByb3BlcnR5LiBUaGlzIHdpbGwgdXBkYXRlIHRoZSB2YWx1ZSBhbmQgbm90aWZ5IGxpc3RlbmVycy5cbiAgICpcbiAgICogKipVc2Ugd2l0aCBjYXV0aW9uISoqIEtleSBub3IgdmFsdWUgYXJlIGNoZWNrZWQgZm9yIHZhbGlkaXR5LlxuICAgKlxuICAgKiBUaGlzIGlzIG1lYW50IGZvciBhc3NpZ25pbmcgdmFsdWVzIHByb2dyYW1tYXRpY2FsbHksXG4gICAqIHdoZXJlIHNpbXBsZSBhc3NpZ25tZW50IGlzIG5vdCBwcmFjdGljYWJsZS5cbiAgICpcbiAgICogRm9yIGV4YW1wbGU6IGAodGhpcyBhcyBhbnkpW215UHJvcGVydHldID0gdmFsdWU7YFxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gUHJvcGVydHkgdG8gc2V0IHZhbHVlIGZvci5cbiAgICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdG8gc2V0IGZvciBwcm9wZXJ0eS5cbiAgICogQHBhcmFtIGluaXQgLSBJZiB0cnVlLCBzdGF0ZSB3aWxsIGJlZ2luIHRvIG1hbmFnZSB0aGUgcHJvcGVydHkgaWYgaXQgaXMgbm90IGFscmVhZHkuXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgYW4gYXJyYXkgb2Yga2V5cyB1cGRhdGVkLlxuICAgKi9cbiAgc2V0KFxuICAgIGtleTogU3RhdGUuRXZlbnQ8dGhpcz4sXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgaW5pdD86IGJvb2xlYW5cbiAgKTogUHJvbWlzZUxpa2U8U3RhdGUuRXZlbnQ8dGhpcz5bXT47XG5cbiAgLyoqXG4gICAqIENhbGwgYSBmdW5jdGlvbiB3aGVuIHVwZGF0ZSBvY2N1cnMuXG4gICAqXG4gICAqIEdpdmVuIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZXZlcnkgYXNzaWdubWVudCAod2hpY2ggY2hhbmdlcyB2YWx1ZSkgb3IgZXhwbGljaXQgYHNldGAuXG4gICAqXG4gICAqIFRvIHJ1biBsb2dpYyBvbiBmaW5hbCB2YWx1ZSBvbmx5LCBjYWxsYmFjayBtYXkgcmV0dXJuIGEgZnVuY3Rpb24uIFVzaW5nIHRoZSBzYW1lXG4gICAqIGZ1bmN0aW9uIGZvciBvbmUgb3IgbW9yZSBldmVudHMgd2lsbCBlbnN1cmUgaXQgaXMgY2FsbGVkIG9ubHkgd2hlbiBldmVudHMgYXJlIHNldHRsZWQuXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIEZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB1cGRhdGUgb2NjdXJzLlxuICAgKiBAcmV0dXJucyBGdW5jdGlvbiB0byByZW1vdmUgbGlzdGVuZXIuIFdpbGwgcmV0dXJuIGB0cnVlYCBpZiByZW1vdmVkLCBgZmFsc2VgIGlmIGluYWN0aXZlIGFscmVhZHkuXG4gICAqXG4gICAqL1xuICBzZXQoY2FsbGJhY2s6IFN0YXRlLk9uRXZlbnQ8dGhpcz4pOiAoKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDYWxsIGEgZnVuY3Rpb24gd2hlbiBhIHByb3BlcnR5IGlzIHVwZGF0ZWQuXG4gICAqIFVubGlrZSBgZ2V0YCwgdGhpcyBjYWxscyBzeW5jaHJvbm91c2x5IGFuZCB3aWxsIGZpcmUgYXMgbWFueSB0aW1lcyBhcyB0aGUgcHJvcGVydHkgaXMgdXBkYXRlZC5cbiAgICpcbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gRnVuY3Rpb24gdG8gY2FsbCB3aGVuIHByb3BlcnR5IGlzIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSBldmVudCAtIFByb3BlcnR5IHRvIHdhdGNoIGZvciB1cGRhdGVzLlxuICAgKi9cbiAgc2V0KFxuICAgIGNhbGxiYWNrOiBTdGF0ZS5PbkV2ZW50PHRoaXM+LFxuICAgIGV2ZW50OiBTdGF0ZS5FdmVudDx0aGlzPiB8IG51bGxcbiAgKTogKCkgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogRGVjbGFyZSBhbiBlbmQgdG8gdXBkYXRlcy4gVGhpcyBldmVudCBpcyBmaW5hbCBhbmQgd2lsbCBmcmVlemUgc3RhdGUuXG4gICAqIFRoaXMgZXZlbnQgY2FuIGJlIHdhdGNoZWQgZm9yIGFzIHdlbGwsIHRvIHJ1biBjbGVhbnVwIGxvZ2ljIGFuZCBpbnRlcm5hbGx5IHdpbGwgcmVtb3ZlIGFsbCBsaXN0ZW5lcnMuXG4gICAqXG4gICAqIEBwYXJhbSBzdGF0dXMgLSBgbnVsbGAgdG8gZW5kIHVwZGF0ZXMuXG4gICAqL1xuICBzZXQoc3RhdHVzOiBudWxsKTogdm9pZDtcblxuICBzZXQoXG4gICAgYXJnMT86IFN0YXRlLk9uRXZlbnQ8dGhpcz4gfCBTdGF0ZS5Bc3NpZ248dGhpcz4gfCBTdGF0ZS5FdmVudDx0aGlzPiB8IG51bGwsXG4gICAgYXJnMj86IHVua25vd24sXG4gICAgYXJnMz86IGJvb2xlYW5cbiAgKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXMuaXM7XG5cbiAgICBpZiAodHlwZW9mIGFyZzEgPT0gJ2Z1bmN0aW9uJylcbiAgICAgIHJldHVybiBhZGRMaXN0ZW5lcihzZWxmLCAoa2V5KSA9PiB7XG4gICAgICAgIGlmIChhcmcyID09PSBrZXkgfHwgKGFyZzIgPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Yga2V5ID09ICdzdHJpbmcnKSlcbiAgICAgICAgICByZXR1cm4gYXJnMS5jYWxsKHNlbGYsIGtleSwgc2VsZik7XG4gICAgICB9KTtcblxuICAgIGlmIChhcmcxICYmIHR5cGVvZiBhcmcxID09ICdvYmplY3QnKSB7XG4gICAgICBhc3NpZ24oc2VsZiwgYXJnMSwgYXJnMiA9PT0gdHJ1ZSk7XG4gICAgfSBlbHNlIGlmICghYXJnMikge1xuICAgICAgZXZlbnQoc2VsZiwgYXJnMSk7XG4gICAgfSBlbHNlIGlmIChhcmczKSB7XG4gICAgICBtYW5hZ2Uoc2VsZiwgYXJnMSBhcyBzdHJpbmcgfCBudW1iZXIsIGFyZzIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB1cGRhdGUoc2VsZiwgYXJnMSBhcyBzdHJpbmcgfCBudW1iZXIsIGFyZzIpO1xuICAgIH1cblxuICAgIGNvbnN0IHBlbmRpbmcgPSBQRU5ESU5HX0tFWVMuZ2V0KHRoaXMpO1xuXG4gICAgaWYgKHBlbmRpbmcpXG4gICAgICByZXR1cm4gPFByb21pc2VMaWtlPFN0YXRlLkV2ZW50PHRoaXM+W10+PntcbiAgICAgICAgdGhlbjogKHJlc29sdmUpID0+XG4gICAgICAgICAgbmV3IFByb21pc2U8YW55PigocmVzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZW1vdmUgPSBhZGRMaXN0ZW5lcih0aGlzLCAoa2V5KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChrZXkgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICByZW1vdmUoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4gcmVzKEFycmF5LmZyb20ocGVuZGluZykpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KS50aGVuKHJlc29sdmUpXG4gICAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGUgb3ZlciBtYW5hZ2VkIHByb3BlcnRpZXMgaW4gdGhpcyBpbnN0YW5jZSBvZiBTdGF0ZS5cbiAgICogWWVpbGRzIHRoZSBrZXkgYW5kIGN1cnJlbnQgdmFsdWUgZm9yIGVhY2ggcHJvcGVydHkuXG4gICAqL1xuICBbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYXRvcjxbc3RyaW5nLCB1bmtub3duXT4ge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhTVEFURS5nZXQodGhpcy5pcykhKVtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuZCBhY3RpdmF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIHN0YXRlLlxuICAgKlxuICAgKiAqKkltcG9ydGFudCoqIC0gVW5saWtlIGBuZXcgdGhpcyguLi4pYCAtIHRoaXMgbWV0aG9kIGFsc28gYWN0aXZhdGVzIHN0YXRlLlxuICAgKlxuICAgKiBAcGFyYW0gYXJncyAtIGFyZ3VtZW50cyBzZW50IHRvIGNvbnN0cnVjdG9yXG4gICAqL1xuICBzdGF0aWMgbmV3PFQgZXh0ZW5kcyBTdGF0ZT4odGhpczogU3RhdGUuVHlwZTxUPiwgLi4uYXJnczogU3RhdGUuQXJnczxUPik6IFQge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IHRoaXMoLi4uYXJncyk7XG4gICAgZXZlbnQoaW5zdGFuY2UpO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgZXF1aXZhbGVudCBvZiBgeCBpbnN0YW5jZW9mIHRoaXNgLlxuICAgKiBEZXRlcm1pbmVzIGlmIHByb3ZpZGVkIGNsYXNzIGlzIGEgc3VidHlwZSBvZiB0aGlzIG9uZS5cbiAgICogSWYgc28sIGxhbmd1YWdlIHNlcnZlciB3aWxsIG1ha2UgYXZhaWxhYmxlIGFsbCBzdGF0aWNcbiAgICogbWV0aG9kcyBhbmQgcHJvcGVydGllcyBvZiB0aGlzIGNsYXNzLlxuICAgKi9cbiAgc3RhdGljIGlzPFQgZXh0ZW5kcyBTdGF0ZS5FeHRlbmRzPih0aGlzOiBULCBtYXliZTogdW5rbm93bik6IG1heWJlIGlzIFQge1xuICAgIHJldHVybiAoXG4gICAgICBtYXliZSA9PT0gdGhpcyB8fFxuICAgICAgKHR5cGVvZiBtYXliZSA9PSAnZnVuY3Rpb24nICYmIG1heWJlLnByb3RvdHlwZSBpbnN0YW5jZW9mIHRoaXMpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIHJ1biB3aGVuIGFueSBpbnN0YW5jZSBvZiB0aGlzIFN0YXRlIGlzIHVwZGF0ZWQuXG4gICAqL1xuICBzdGF0aWMgb248VCBleHRlbmRzIFN0YXRlPihcbiAgICB0aGlzOiBTdGF0ZS5FeHRlbmRzPFQ+LFxuICAgIGxpc3RlbmVyOiBTdGF0ZS5PbkV2ZW50PFQ+XG4gICkge1xuICAgIGxldCBub3RpZnkgPSBOT1RJRlkuZ2V0KHRoaXMpO1xuXG4gICAgaWYgKCFub3RpZnkpIE5PVElGWS5zZXQodGhpcywgKG5vdGlmeSA9IG5ldyBTZXQoKSkpO1xuXG4gICAgbm90aWZ5LmFkZChsaXN0ZW5lcik7XG5cbiAgICByZXR1cm4gKCkgPT4gbm90aWZ5LmRlbGV0ZShsaXN0ZW5lcik7XG4gIH1cbn1cblxuZGVmaW5lKFN0YXRlLnByb3RvdHlwZSwgJ3RvU3RyaW5nJywge1xuICB2YWx1ZSgpIHtcbiAgICByZXR1cm4gSUQuZ2V0KHRoaXMuaXMpO1xuICB9XG59KTtcblxuZGVmaW5lKFN0YXRlLCAndG9TdHJpbmcnLCB7XG4gIHZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLm5hbWU7XG4gIH1cbn0pO1xuXG5mdW5jdGlvbiBhc3NpZ24oc3ViamVjdDogU3RhdGUsIGRhdGE6IFN0YXRlLkFzc2lnbjxTdGF0ZT4sIHNpbGVudD86IGJvb2xlYW4pIHtcbiAgY29uc3QgbWV0aG9kcyA9IE1FVEhPRFMuZ2V0KHN1YmplY3QuY29uc3RydWN0b3IpITtcblxuICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgY29uc3QgYmluZCA9IG1ldGhvZHMuZ2V0KGtleSk7XG5cbiAgICBpZiAoYmluZCkgYmluZC5jYWxsKHN1YmplY3QsIGRhdGFba2V5XSk7XG4gICAgZWxzZSBpZiAoa2V5IGluIHN1YmplY3QgJiYga2V5ICE9PSAnaXMnKSB7XG4gICAgICBjb25zdCBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzdWJqZWN0LCBrZXkpITtcbiAgICAgIGNvbnN0IHNldCA9IGRlc2MgJiYgKGRlc2Muc2V0IGFzICh2YWx1ZTogYW55LCBzaWxlbnQ/OiBib29sZWFuKSA9PiB2b2lkKTtcblxuICAgICAgaWYgKHNldCkge1xuICAgICAgICBzZXQuY2FsbChzdWJqZWN0LCBkYXRhW2tleV0sIHNpbGVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAoc3ViamVjdCBhcyBhbnkpW2tleV0gPSBkYXRhW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKiBBcHBseSBpbnN0cnVjdGlvbnMgYW5kIGluaGVyaXRlZCBldmVudCBsaXN0ZW5lcnMuIEVuc3VyZSBjbGFzcyBtZXRhZGF0YSBpcyByZWFkeS4gKi9cbmZ1bmN0aW9uIHByZXBhcmUoc3RhdGU6IFN0YXRlKSB7XG4gIGxldCBUID0gc3RhdGUuY29uc3RydWN0b3IgYXMgU3RhdGUuRXh0ZW5kcztcblxuICBpZiAoVCA9PT0gU3RhdGUpIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNyZWF0ZSBiYXNlIFN0YXRlLicpO1xuXG4gIGNvbnN0IGNoYWluID0gW10gYXMgU3RhdGUuRXh0ZW5kc1tdO1xuICBsZXQga2V5cyA9IG5ldyBNYXA8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gdm9pZD4oKTtcblxuICBJRC5zZXQoc3RhdGUsIGAke1R9LSR7dWlkKCl9YCk7XG5cbiAgd2hpbGUgKFQubmFtZSkge1xuICAgIGZvciAoY29uc3QgY2Igb2YgTk9USUZZLmdldChUKSB8fCBbXSkge1xuICAgICAgYWRkTGlzdGVuZXIoc3RhdGUsIGNiKTtcbiAgICB9XG5cbiAgICBpZiAoVCA9PT0gU3RhdGUpIGJyZWFrO1xuICAgIGVsc2UgY2hhaW4udW5zaGlmdChUKTtcblxuICAgIFQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoVCk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHR5cGUgb2YgY2hhaW4pIHtcbiAgICBpZiAoTUVUSE9EUy5oYXModHlwZSkpIHtcbiAgICAgIGtleXMgPSBNRVRIT0RTLmdldCh0eXBlKSE7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBNRVRIT0RTLnNldCh0eXBlLCAoa2V5cyA9IG5ldyBNYXAoa2V5cykpKTtcblxuICAgIGZvciAoY29uc3QgW2tleSwgeyB2YWx1ZSB9XSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHR5cGUucHJvdG90eXBlKVxuICAgICkpIHtcbiAgICAgIGlmICghdmFsdWUgfHwga2V5ID09ICdjb25zdHJ1Y3RvcicpIGNvbnRpbnVlO1xuXG4gICAgICBmdW5jdGlvbiBiaW5kKHRoaXM6IFN0YXRlLCBvcmlnaW5hbD86IEZ1bmN0aW9uKSB7XG4gICAgICAgIGNvbnN0IHsgaXMgfSA9IHRoaXM7XG5cbiAgICAgICAgaWYgKGlzLmhhc093blByb3BlcnR5KGtleSkgJiYgIW9yaWdpbmFsKSByZXR1cm4gdmFsdWUgYXMgRnVuY3Rpb247XG5cbiAgICAgICAgY29uc3QgZm4gPSBvcmlnaW5hbCB8fCB2YWx1ZTtcbiAgICAgICAgY29uc3QgYm91bmQgPSBmbi5iaW5kKGlzKTtcblxuICAgICAgICBNRVRIT0Quc2V0KGJvdW5kLCBmbik7XG4gICAgICAgIGRlZmluZShpcywga2V5LCB7IHZhbHVlOiBib3VuZCwgd3JpdGFibGU6IHRydWUgfSk7XG5cbiAgICAgICAgcmV0dXJuIGJvdW5kO1xuICAgICAgfVxuXG4gICAgICBrZXlzLnNldChrZXksIGJpbmQpO1xuICAgICAgZGVmaW5lKHR5cGUucHJvdG90eXBlLCBrZXksIHsgZ2V0OiBiaW5kLCBzZXQ6IGJpbmQgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQXBwbHkgc3RhdGUgYXJndWVtbnRzLCBydW4gY2FsbGJhY2tzIGFuZCBvYnNlcnZlIHByb3BlcnRpZXMuXG4gKiBBY2N1bXVsYXRlIGFuZCBoYW5kbGUgY2xlYW51cCBldmVudHMuXG4gKiovXG5mdW5jdGlvbiBpbml0KHNlbGY6IFN0YXRlLCAuLi5hcmdzOiBTdGF0ZS5BcmdzKSB7XG4gIGNvbnN0IHN0YXRlID0ge30gYXMgUmVjb3JkPHN0cmluZyB8IG51bWJlciB8IHN5bWJvbCwgdW5rbm93bj47XG5cbiAgU1RBVEUuc2V0KHNlbGYsIHN0YXRlKTtcblxuICBhcmdzID0gYXJncy5mbGF0KCkuZmlsdGVyKChhcmcpID0+IHtcbiAgICBpZiAodHlwZW9mIGFyZyA9PSAnc3RyaW5nJykgSUQuc2V0KHNlbGYsIGFyZyk7XG4gICAgZWxzZSByZXR1cm4gdHJ1ZTtcbiAgfSk7XG5cbiAgYWRkTGlzdGVuZXIoc2VsZiwgKCkgPT4ge1xuICAgIGlmICghUEFSRU5ULmhhcyhzZWxmKSkgUEFSRU5ULnNldChzZWxmLCBudWxsKTtcblxuICAgIGZvciAoY29uc3Qga2V5IGluIHNlbGYpIHtcbiAgICAgIGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNlbGYsIGtleSkhO1xuXG4gICAgICBpZiAoJ3ZhbHVlJyBpbiBkZXNjKSBtYW5hZ2Uoc2VsZiwga2V5LCBkZXNjLnZhbHVlLCB0cnVlKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7XG4gICAgICBjb25zdCB1c2UgPVxuICAgICAgICB0eXBlb2YgYXJnID09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IGFyZy5jYWxsKHNlbGYsIHNlbGYpXG4gICAgICAgICAgOiAoYXJnIGFzIFN0YXRlLkFzc2lnbjxTdGF0ZT4pO1xuXG4gICAgICBpZiAodXNlIGluc3RhbmNlb2YgUHJvbWlzZSlcbiAgICAgICAgdXNlLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBBc3luYyBlcnJvciBpbiBjb25zdHJ1Y3RvciBmb3IgJHtzZWxmfTpgKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIH0pO1xuICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh1c2UpKSBhcmdzLnB1c2goLi4udXNlKTtcbiAgICAgIGVsc2UgaWYgKHR5cGVvZiB1c2UgPT0gJ2Z1bmN0aW9uJykgYWRkTGlzdGVuZXIoc2VsZiwgdXNlLCBudWxsKTtcbiAgICAgIGVsc2UgaWYgKHR5cGVvZiB1c2UgPT0gJ29iamVjdCcpIGFzc2lnbihzZWxmLCB1c2UsIHRydWUpO1xuICAgIH1cblxuICAgIGFkZExpc3RlbmVyKFxuICAgICAgc2VsZixcbiAgICAgICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBbXywgdmFsdWVdIG9mIHNlbGYpXG4gICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RhdGUgJiYgUEFSRU5ULmdldCh2YWx1ZSkgPT09IHNlbGYpXG4gICAgICAgICAgICB2YWx1ZS5zZXQobnVsbCk7XG5cbiAgICAgICAgT2JqZWN0LmZyZWV6ZShzdGF0ZSk7XG4gICAgICB9LFxuICAgICAgbnVsbFxuICAgICk7XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1hbmFnZShcbiAgdGFyZ2V0OiBTdGF0ZSxcbiAga2V5OiBzdHJpbmcgfCBudW1iZXIsXG4gIHZhbHVlOiBhbnksXG4gIHNpbGVudD86IGJvb2xlYW5cbikge1xuICBjb25zdCBzdGF0ZSA9IFNUQVRFLmdldCh0YXJnZXQpITtcblxuICBmdW5jdGlvbiBnZXQodGhpczogU3RhdGUpIHtcbiAgICByZXR1cm4gZm9sbG93KHRoaXMsIGtleSwgc3RhdGVba2V5XSk7XG4gIH1cblxuICBmdW5jdGlvbiBzZXQodmFsdWU6IHVua25vd24sIHNpbGVudD86IGJvb2xlYW4pIHtcbiAgICB1cGRhdGUodGFyZ2V0LCBrZXksIHZhbHVlLCBzaWxlbnQpO1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0YXRlICYmICFQQVJFTlQuaGFzKHZhbHVlKSkge1xuICAgICAgUEFSRU5ULnNldCh2YWx1ZSwgdGFyZ2V0KTtcbiAgICAgIGV2ZW50KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBkZWZpbmUodGFyZ2V0LCBrZXksIHsgc2V0LCBnZXQgfSk7XG4gIHNldCh2YWx1ZSwgc2lsZW50KTtcbn1cblxuZnVuY3Rpb24gZWZmZWN0PFQgZXh0ZW5kcyBTdGF0ZT4odGFyZ2V0OiBULCBmbjogU3RhdGUuRWZmZWN0PFQ+KSB7XG4gIGNvbnN0IGVmZmVjdCA9IE1FVEhPRC5nZXQoZm4pIHx8IGZuO1xuICBsZXQgcGVuZGluZyA9IG5ldyBTZXQ8U3RhdGUuRXZlbnQ8VD4+KCk7XG5cbiAgcmV0dXJuIHdhdGNoKHRhcmdldCwgKHByb3h5KSA9PiB7XG4gICAgY29uc3QgY2IgPSBlZmZlY3QuY2FsbChwcm94eSwgcHJveHksIHBlbmRpbmcpO1xuXG4gICAgaWYgKGNiID09PSBudWxsKSByZXR1cm4gY2I7XG5cbiAgICByZXR1cm4gKHVwZGF0ZSkgPT4ge1xuICAgICAgcGVuZGluZyA9IFBFTkRJTkdfS0VZUy5nZXQodGFyZ2V0KSE7XG4gICAgICBpZiAodHlwZW9mIGNiID09ICdmdW5jdGlvbicpIGNiKHVwZGF0ZSk7XG4gICAgfTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHZhbHVlczxUIGV4dGVuZHMgU3RhdGU+KHRhcmdldDogVCk6IFN0YXRlLlZhbHVlczxUPiB7XG4gIGNvbnN0IHZhbHVlcyA9IHt9IGFzIGFueTtcbiAgbGV0IGlzTm90UmVjdXJzaXZlO1xuXG4gIGlmICghRVhQT1JUKSB7XG4gICAgaXNOb3RSZWN1cnNpdmUgPSB0cnVlO1xuICAgIEVYUE9SVCA9IG5ldyBNYXAoW1t0YXJnZXQsIHZhbHVlc11dKTtcbiAgfVxuXG4gIGZvciAobGV0IFtrZXksIHZhbHVlXSBvZiB0YXJnZXQpIHtcbiAgICBpZiAoRVhQT1JULmhhcyh2YWx1ZSkpIHZhbHVlID0gRVhQT1JULmdldCh2YWx1ZSk7XG4gICAgZWxzZSBpZiAoXG4gICAgICB2YWx1ZSAmJlxuICAgICAgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnICYmXG4gICAgICAnZ2V0JyBpbiB2YWx1ZSAmJlxuICAgICAgdHlwZW9mIHZhbHVlLmdldCA9PT0gJ2Z1bmN0aW9uJ1xuICAgIClcbiAgICAgIEVYUE9SVC5zZXQodmFsdWUsICh2YWx1ZSA9IHZhbHVlLmdldCgpKSk7XG5cbiAgICB2YWx1ZXNba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgaWYgKGlzTm90UmVjdXJzaXZlKSBFWFBPUlQgPSB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUodmFsdWVzKTtcbn1cblxudHlwZSBQcm94eTxUID0gYW55PiA9IChrZXk6IHN0cmluZyB8IG51bWJlciwgdmFsdWU6IFQpID0+IFQ7XG5cbmNvbnN0IE9CU0VSVkVSID0gbmV3IFdlYWtNYXA8U3RhdGUsIFByb3h5PigpO1xuXG5mdW5jdGlvbiBmb2xsb3coZnJvbTogU3RhdGUsIGtleTogc3RyaW5nIHwgbnVtYmVyLCB2YWx1ZT86IGFueSkge1xuICBjb25zdCBvYnNlcnZlID0gT0JTRVJWRVIuZ2V0KGZyb20pO1xuICByZXR1cm4gb2JzZXJ2ZSA/IG9ic2VydmUoa2V5LCB2YWx1ZSkgOiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gYWNjZXNzKHN1YmplY3Q6IFN0YXRlLCBwcm9wZXJ0eTogc3RyaW5nLCByZXF1aXJlZD86IGJvb2xlYW4pIHtcbiAgY29uc3Qgc3RhdGUgPSBTVEFURS5nZXQoc3ViamVjdCkhO1xuXG4gIGlmIChwcm9wZXJ0eSBpbiBzdGF0ZSB8fCByZXF1aXJlZCA9PT0gZmFsc2UpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHN0YXRlW3Byb3BlcnR5XTtcblxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkIHx8ICFyZXF1aXJlZCkgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgaWYgKE1FVEhPRFMuZ2V0KHN1YmplY3QuY29uc3RydWN0b3IpIS5oYXMocHJvcGVydHkpKVxuICAgIHJldHVybiBNRVRIT0QuZ2V0KChzdWJqZWN0IGFzIGFueSlbcHJvcGVydHldKTtcblxuICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihgJHtzdWJqZWN0fS4ke3Byb3BlcnR5fSBpcyBub3QgeWV0IGF2YWlsYWJsZS5gKTtcbiAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGFkZExpc3RlbmVyKHN1YmplY3QsIChrZXkpID0+IHtcbiAgICAgIGlmIChrZXkgPT09IHByb3BlcnR5KSB7XG4gICAgICAgIHJlc29sdmUoc3RhdGVba2V5XSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAoa2V5ID09PSBudWxsKSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYCR7c3ViamVjdH0gaXMgZGVzdHJveWVkLmApKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgdGhyb3cgT2JqZWN0LmFzc2lnbihwcm9taXNlLCB7XG4gICAgdG9TdHJpbmc6ICgpID0+IFN0cmluZyhlcnJvciksXG4gICAgbmFtZTogJ1N1c3BlbnNlJyxcbiAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlLFxuICAgIHN0YWNrOiBlcnJvci5zdGFja1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlPFQ+KFxuICBzdWJqZWN0OiBTdGF0ZSxcbiAga2V5OiBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wsXG4gIHZhbHVlOiBULFxuICBhcmc/OiBib29sZWFuIHwgU3RhdGUuU2V0dGVyPFQ+XG4pIHtcbiAgY29uc3Qgc3RhdGUgPSBTVEFURS5nZXQoc3ViamVjdCkhO1xuXG4gIGlmIChPYmplY3QuaXNGcm96ZW4oc3RhdGUpKVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUcmllZCB0byB1cGRhdGUgJHtzdWJqZWN0fS4ke1N0cmluZyhrZXkpfSBidXQgc3RhdGUgaXMgZGVzdHJveWVkLmBcbiAgICApO1xuXG4gIGNvbnN0IHByZXZpb3VzID0gc3RhdGVba2V5XSBhcyBUO1xuXG4gIGlmICh0eXBlb2YgYXJnID09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zdCBvdXQgPSBhcmcuY2FsbChzdWJqZWN0LCB2YWx1ZSwgcHJldmlvdXMpO1xuXG4gICAgaWYgKG91dCA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcblxuICAgIGlmICh0eXBlb2Ygb3V0ID09ICdmdW5jdGlvbicpIHZhbHVlID0gb3V0KCk7XG4gIH1cblxuICBpZiAodmFsdWUgPT09IHByZXZpb3VzICYmIGtleSBpbiBzdGF0ZSkgcmV0dXJuO1xuXG4gIHN0YXRlW2tleV0gPSB2YWx1ZTtcblxuICBpZiAoYXJnICE9PSB0cnVlKSBldmVudChzdWJqZWN0LCBrZXkpO1xuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogUmFuZG9tIGFscGhhbnVtYmVyaWMgb2YgbGVuZ3RoIDY7IGFsd2F5cyBzdGFydHMgd2l0aCBhIGxldHRlci4gKi9cbmZ1bmN0aW9uIHVpZCgpIHtcbiAgcmV0dXJuICgwLjI3OCArIE1hdGgucmFuZG9tKCkgKiAwLjcyMilcbiAgICAudG9TdHJpbmcoMzYpXG4gICAgLnN1YnN0cmluZygyLCA4KVxuICAgIC50b1VwcGVyQ2FzZSgpO1xufVxuXG5leHBvcnQgeyBldmVudCwgTUVUSE9ELCBTdGF0ZSwgUEFSRU5ULCBTVEFURSwgdWlkLCBhY2Nlc3MsIHVwZGF0ZSwgZm9sbG93IH07XG4iXSwibWFwcGluZ3MiOiI7OztBQVNBLE1BQU0sU0FBUyxPQUFPOztBQUd0QixNQUFNLHFCQUFLLElBQUksU0FBd0I7O0FBR3ZDLE1BQU0sd0JBQVEsSUFBSSxTQUEyRDs7QUFHN0UsTUFBTSx5QkFBUyxJQUFJLFNBQXFDOztBQUd4RCxNQUFNLHlCQUFTLElBQUksU0FBOEI7O0FBR2pELE1BQU0sMEJBQVUsSUFBSSxTQUFzRDs7QUFHMUUsTUFBTSx5QkFBUyxJQUFJLFNBQW1COztBQUd0QyxJQUFJO0FBZ0hKLElBQWUsUUFBZixNQUEyQztDQUN6QyxZQUFZLEdBQUcsTUFBa0I7QUFDL0IsVUFBUSxLQUFLO0FBQ2IsU0FBTyxNQUFNLE1BQU0sRUFBRSxPQUFPLE1BQU0sQ0FBQztBQUNuQyxPQUFLLE1BQU0sR0FBRyxPQUFPLE1BQVks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