@rusticarcade/palette 0.3.1 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -17
- package/dist/dev/index.js +1178 -1052
- package/dist/prod/index.d.ts +245 -547
- package/dist/prod/index.js +1 -3
- package/dist/test/index.d.ts +202 -481
- package/dist/test/index.js +15 -196
- package/package.json +1 -1
package/dist/test/index.js
CHANGED
|
@@ -16,155 +16,6 @@ async function cleanupGlobalTestDOM() {
|
|
|
16
16
|
GlobalRegistrator.unregister();
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
|
-
// src/errors.ts
|
|
20
|
-
function getDevError(code) {
|
|
21
|
-
const DEV_ERROR_INFO = {
|
|
22
|
-
[0 /* INVARIANT */]: `
|
|
23
|
-
INVARIANT
|
|
24
|
-
A condition has occurred which should never happen, such as a code path that
|
|
25
|
-
shouldn't be reachable when using correct types, or a disallowed state.
|
|
26
|
-
`,
|
|
27
|
-
[1 /* INVALID_ENV */]: `
|
|
28
|
-
INVALID_ENV
|
|
29
|
-
Failed to find a custom elements registry in this environment. Is a window
|
|
30
|
-
global available with a customElements property?
|
|
31
|
-
`,
|
|
32
|
-
[100 /* DUPE_TAGNAME */]: `
|
|
33
|
-
DUPE_TAGNAME
|
|
34
|
-
Failed to register a custom element with the tagname %s because another
|
|
35
|
-
custom element is already defined with that name.
|
|
36
|
-
`,
|
|
37
|
-
[101 /* INVALID_TAGNAME */]: `
|
|
38
|
-
INVALID_TAGNAME
|
|
39
|
-
Failed to determine a valid HTML Tag to use when registering a component as a
|
|
40
|
-
custom element. Specify a static readonly tagName property on your component
|
|
41
|
-
class or provide a tagName argument to Component.register.
|
|
42
|
-
|
|
43
|
-
Alternatively, you can directly register your element as you would any other
|
|
44
|
-
HTML custom element: customElements.define("my-tag", MyComponentClass);
|
|
45
|
-
`,
|
|
46
|
-
[300 /* MISSING_ELEMENT */]: `
|
|
47
|
-
MISSING_ELEMENT
|
|
48
|
-
An element was expected to exist but was not found when the DOM was queried.
|
|
49
|
-
`,
|
|
50
|
-
[301 /* MISSING_STATE */]: `
|
|
51
|
-
MISSING_STATE
|
|
52
|
-
A Component's reactive state was accessed, but no initialState is defined for
|
|
53
|
-
the Component's class. Initial state must be defined as an object or function.
|
|
54
|
-
`,
|
|
55
|
-
[302 /* INVALID_CONTENT */]: `
|
|
56
|
-
INVALID_CONTENT
|
|
57
|
-
Tried to set a value as content in a template, but the value was not a supported
|
|
58
|
-
type. Values must be a string, HTMLElement.
|
|
59
|
-
|
|
60
|
-
Instead, got %s: %s.
|
|
61
|
-
`,
|
|
62
|
-
[200 /* TEMPLATE_INVALID */]: `
|
|
63
|
-
TEMPLATE_INVALID
|
|
64
|
-
The value %s cannot be interpolated via the Template html string helper.
|
|
65
|
-
Values may only be HTMLTemplateElements (template content is adopted) or
|
|
66
|
-
strings (shorthand for a ::swap directive on an element)
|
|
67
|
-
`,
|
|
68
|
-
[201 /* TEMPLATE_INVALID_NOTATION */]: `
|
|
69
|
-
TEMPLATE_INVALID_NOTATION
|
|
70
|
-
A template value notation failed to parse. Notations must begin with one of
|
|
71
|
-
@, $, *, or #, followed by a dot-separated path of accessor names. Optionally,
|
|
72
|
-
notations may have modifiers around them, such as the NOT() modifier.
|
|
73
|
-
|
|
74
|
-
The notation that failed to parse was "%s"
|
|
75
|
-
`,
|
|
76
|
-
[202 /* TEMPLATE_INVALID_COMPONENT */]: `
|
|
77
|
-
TEMPLATE_INVALID_COMPONENT
|
|
78
|
-
Failed to interpolate a Component in an html template string due to the
|
|
79
|
-
Component having an invalid tagName property.
|
|
80
|
-
|
|
81
|
-
Component "%s" has an invalid tagName property "%s"
|
|
82
|
-
`,
|
|
83
|
-
[205 /* TEMPLATE_MISSING_LIST_PARENT */]: `
|
|
84
|
-
TEMPLATE_MISSING_LIST_PARENT
|
|
85
|
-
A template failed to prepare an ::each directive because no valid parent node
|
|
86
|
-
was found for the list to render into.
|
|
87
|
-
`,
|
|
88
|
-
[203 /* TEMPLATE_INVALID_LIST */]: `
|
|
89
|
-
TEMPLATE_INVALID_LIST
|
|
90
|
-
A template failed to render because an ::each directive fetched a value which
|
|
91
|
-
was not an array of actionable data.
|
|
92
|
-
`,
|
|
93
|
-
[204 /* TEMPLATE_INVALID_NODE_REF */]: `
|
|
94
|
-
TEMPLATE_INVALID_NODE_REF
|
|
95
|
-
A template failed to prepare a node from a compiled source. Typically, this
|
|
96
|
-
means something is broken within the compiled template rather than an error with
|
|
97
|
-
the template content itself.
|
|
98
|
-
`,
|
|
99
|
-
[206 /* TEMPLATE_MISSING_LIST_KEY */]: `
|
|
100
|
-
TEMPLATE_MISSING_LIST_KEY
|
|
101
|
-
A template failed to compile because an ::each directive was found on an element
|
|
102
|
-
without a corresponding ::key directive. ::each directives must have a ::key
|
|
103
|
-
directive specified on the same element, whose notation evaluates to a unique
|
|
104
|
-
value for each item in the list.
|
|
105
|
-
|
|
106
|
-
Example: <li ::each="$items" ::key="#id"> ... </li>
|
|
107
|
-
`,
|
|
108
|
-
[207 /* TEMPLATE_DUPLICATE_LIST_KEY */]: `
|
|
109
|
-
TEMPLATE_DUPLICATE_LIST_KEY
|
|
110
|
-
A list failed to render because item key %s appeared multiple times when
|
|
111
|
-
resolving list item keys. Each ::key directive must reference a notation whose
|
|
112
|
-
value is unique for each list item.
|
|
113
|
-
`,
|
|
114
|
-
[303 /* INVALID_STATE_KEY */]: `
|
|
115
|
-
INVALID_STATE_KEY
|
|
116
|
-
Tried to access a state property which does not exist
|
|
117
|
-
|
|
118
|
-
Key path: %s
|
|
119
|
-
`,
|
|
120
|
-
[304 /* INVALID_STATE_UPDATE */]: `
|
|
121
|
-
INVALID_STATE_UPDATE
|
|
122
|
-
A Component's setState() was called with a value which could not be patched in
|
|
123
|
-
to the existing component state.
|
|
124
|
-
|
|
125
|
-
setState() takes a partial object describing state keys to update.
|
|
126
|
-
|
|
127
|
-
Instead, received: %s
|
|
128
|
-
`,
|
|
129
|
-
[305 /* STATE_LOCKED */]: `
|
|
130
|
-
STATE_LOCKED
|
|
131
|
-
A State received a request to update or lock while already locked.
|
|
132
|
-
States may be locked using the .lock() method and unlocked using the .unlock()
|
|
133
|
-
method. States lock during async mutations done through the .mutateAsync()
|
|
134
|
-
method if "true" is passed as the second parameter.
|
|
135
|
-
|
|
136
|
-
You can check the lock status of a State instance with .isLocked
|
|
137
|
-
`,
|
|
138
|
-
[306 /* MAX_SEQUENTIAL_RENDERS */]: `
|
|
139
|
-
MAX_SEQUENTIAL_RENDERS
|
|
140
|
-
A component has errored after re-rendering more than %s times in the same frame.
|
|
141
|
-
|
|
142
|
-
This typically happens because state or live attributes are being modified
|
|
143
|
-
during a render lifecycle method such as beforeUpdate() or afterUpdate(). If
|
|
144
|
-
state changes unconditionally during a render, the render will infinitely loop.
|
|
145
|
-
Updating render source data during a render cycle is supported, but infinite
|
|
146
|
-
update loops may occur if unchecked.
|
|
147
|
-
`
|
|
148
|
-
};
|
|
149
|
-
return DEV_ERROR_INFO[code];
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
class PaletteError extends Error {
|
|
153
|
-
name = "PaletteError";
|
|
154
|
-
code;
|
|
155
|
-
constructor(code, ...values) {
|
|
156
|
-
let message = `Code: ${code}`;
|
|
157
|
-
if (true) {
|
|
158
|
-
message += getDevError(code);
|
|
159
|
-
for (const val of values) {
|
|
160
|
-
message = message.replace(`%s`, String(val));
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
super(message);
|
|
164
|
-
this.code = code;
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
|
|
168
19
|
// src/util/attributes.ts
|
|
169
20
|
function serializeAttribute(value) {
|
|
170
21
|
if (typeof value === "string" || typeof value === "number") {
|
|
@@ -178,41 +29,22 @@ function serializeAttribute(value) {
|
|
|
178
29
|
}
|
|
179
30
|
return value.toString();
|
|
180
31
|
}
|
|
181
|
-
function
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
}
|
|
187
|
-
return map;
|
|
32
|
+
function applyAttribute(element, name, value) {
|
|
33
|
+
if (value === null) {
|
|
34
|
+
element.removeAttribute(name);
|
|
35
|
+
} else {
|
|
36
|
+
element.setAttribute(name, value);
|
|
188
37
|
}
|
|
189
|
-
if (source instanceof Map) {
|
|
190
|
-
for (const [key, val] of source) {
|
|
191
|
-
map.set(key, serializeAttribute(val));
|
|
192
|
-
}
|
|
193
|
-
return map;
|
|
194
|
-
}
|
|
195
|
-
if (typeof source === "object" && source !== null) {
|
|
196
|
-
for (const [key, val] of Object.entries(source)) {
|
|
197
|
-
map.set(key, serializeAttribute(val));
|
|
198
|
-
}
|
|
199
|
-
return map;
|
|
200
|
-
}
|
|
201
|
-
throw new PaletteError(0 /* INVARIANT */);
|
|
202
38
|
}
|
|
203
|
-
function
|
|
39
|
+
function applyElementAttributes(target, attrs) {
|
|
204
40
|
const currentNames = new Set(target.getAttributeNames());
|
|
205
|
-
const incomingNames = new Set(
|
|
41
|
+
const incomingNames = new Set(Object.keys(attrs));
|
|
206
42
|
const attributesToRemove = currentNames.difference(incomingNames);
|
|
207
43
|
for (const attr of attributesToRemove) {
|
|
208
44
|
target.removeAttribute(attr);
|
|
209
45
|
}
|
|
210
|
-
for (const [name, val] of attrs) {
|
|
211
|
-
|
|
212
|
-
target.removeAttribute(name);
|
|
213
|
-
} else {
|
|
214
|
-
target.setAttribute(name, val);
|
|
215
|
-
}
|
|
46
|
+
for (const [name, val] of Object.entries(attrs)) {
|
|
47
|
+
applyAttribute(target, name, serializeAttribute(val));
|
|
216
48
|
}
|
|
217
49
|
}
|
|
218
50
|
// src/util/lru-cache.ts
|
|
@@ -239,7 +71,7 @@ class LRUCache {
|
|
|
239
71
|
this._data.delete(firstKey);
|
|
240
72
|
}
|
|
241
73
|
};
|
|
242
|
-
|
|
74
|
+
getMetrics() {
|
|
243
75
|
if (true) {
|
|
244
76
|
const { hits = 0, misses = 0 } = this._metrics ?? {};
|
|
245
77
|
const lookups = hits + misses;
|
|
@@ -253,14 +85,6 @@ class LRUCache {
|
|
|
253
85
|
hitRate
|
|
254
86
|
};
|
|
255
87
|
}
|
|
256
|
-
return {
|
|
257
|
-
lookups: 0,
|
|
258
|
-
hits: 0,
|
|
259
|
-
misses: 0,
|
|
260
|
-
capacity: 0,
|
|
261
|
-
entries: 0,
|
|
262
|
-
hitRate: 0
|
|
263
|
-
};
|
|
264
88
|
}
|
|
265
89
|
setCapacity = (maxSize) => {
|
|
266
90
|
if (maxSize <= 0 && true) {
|
|
@@ -321,19 +145,14 @@ async function renderTestComponent(component, attributes2) {
|
|
|
321
145
|
customElements.define(useTagname, component);
|
|
322
146
|
}
|
|
323
147
|
const $component = document.createElement(component.tagName);
|
|
324
|
-
|
|
325
|
-
applyAttributeMap($component, attributeMap);
|
|
148
|
+
applyElementAttributes($component, attributes2 ?? {});
|
|
326
149
|
document.body.append($component);
|
|
327
150
|
await Bun.sleep(1);
|
|
328
151
|
return $component;
|
|
329
152
|
}
|
|
330
153
|
async function rerenderTestComponent(element) {
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
await Bun.sleep(1);
|
|
334
|
-
resolve();
|
|
335
|
-
});
|
|
336
|
-
});
|
|
154
|
+
element.render();
|
|
155
|
+
await Bun.sleep(1);
|
|
337
156
|
}
|
|
338
157
|
export {
|
|
339
158
|
rerenderTestComponent,
|
|
@@ -343,5 +162,5 @@ export {
|
|
|
343
162
|
cleanupGlobalTestDOM
|
|
344
163
|
};
|
|
345
164
|
|
|
346
|
-
//# debugId=
|
|
347
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL3Rlc3QtdXRpbC9nbG9iYWwtZW52LnRzIiwgInNyYy9lcnJvcnMudHMiLCAic3JjL3V0aWwvYXR0cmlidXRlcy50cyIsICJzcmMvdXRpbC9scnUtY2FjaGUudHMiLCAic3JjL3V0aWwvZnJhZ21lbnRzLnRzIiwgInNyYy90ZXN0LXV0aWwvdGFncy50cyIsICJzcmMvdGVzdC11dGlsL3JlbmRlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICIvKlxuICogQ29weXJpZ2h0IMKpIFJ1c3RpYyBBcmNhZGUsIExMQyAyMDI2XG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuXG5pbXBvcnQgeyBHbG9iYWxSZWdpc3RyYXRvciB9IGZyb20gXCJAaGFwcHktZG9tL2dsb2JhbC1yZWdpc3RyYXRvclwiO1xuXG4vKipcbiAqIEluaXRpYWxpemUgdGhlIGdsb2JhbCB0ZXN0IERPTSBlbnZpcm9ubWVudCAodXNpbmcgSGFwcHlET00pXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcmVwYXJlR2xvYmFsVGVzdERPTSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgY2xlYW51cEdsb2JhbFRlc3RET00oKTtcbiAgR2xvYmFsUmVnaXN0cmF0b3IucmVnaXN0ZXIoKTtcbn1cblxuLyoqXG4gKiBDbGVhbnVwIHRoZSBnbG9iYWwgdGVzdCBET00gZW52aXJvbm1lbnQgKHVzaW5nIEhhcHB5RE9NKVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xlYW51cEdsb2JhbFRlc3RET00oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB3aGlsZSAoZG9jdW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlQ2hpbGQoZG9jdW1lbnQuZmlyc3RDaGlsZCk7XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgQnVuLnNsZWVwKDEpO1xuXG4gIGlmIChHbG9iYWxSZWdpc3RyYXRvci5pc1JlZ2lzdGVyZWQpIHtcbiAgICBHbG9iYWxSZWdpc3RyYXRvci51bnJlZ2lzdGVyKCk7XG4gIH1cbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG4vKipcbiAqIFBvc3NpYmxlIGVycm9yIHR5cGVzIGZvciB7QGxpbmsgUGFsZXR0ZUVycm9yfVxuICpcbiAqIENvZGVzIGFyZSBjYXRlZ29yaXplZCBpbnRvIGdyb3VwcyBieSB0aGUgMTAwJ3M6XG4gKlxuICogLSAwIC0gOTk6IEludmFyaWFudHNcbiAqIC0gMTAwIC0gMTk5OiBDdXN0b20gRWxlbWVudHMgLyBFbnZpcm9ubWVudCBFcnJvcnNcbiAqIC0gMjAwIC0gMjk5OiBUZW1wbGF0aW5nIEVycm9yc1xuICogLSAzMDAgLSAzOTk6IFJ1bnRpbWUgRXJyb3JzXG4gKi9cbmV4cG9ydCBjb25zdCBlbnVtIEVycm9yQ29kZSB7XG4gIC8vIDAgLSA5OTogSW52YXJpYW50c1xuICBJTlZBUklBTlQgPSAwLFxuICBJTlZBTElEX0VOViA9IDEsXG5cbiAgLy8gMTAwIC0gMTk5OiBDdXN0b20gRWxlbWVudHMgRXJyb3JzXG4gIERVUEVfVEFHTkFNRSA9IDEwMCxcbiAgSU5WQUxJRF9UQUdOQU1FID0gMTAxLFxuXG4gIC8vIDIwMCAtIDI5OTogVGVtcGxhdGUgRXJyb3JzXG4gIFRFTVBMQVRFX0lOVkFMSUQgPSAyMDAsXG4gIFRFTVBMQVRFX0lOVkFMSURfTk9UQVRJT04gPSAyMDEsXG4gIFRFTVBMQVRFX0lOVkFMSURfQ09NUE9ORU5UID0gMjAyLFxuICBURU1QTEFURV9JTlZBTElEX0xJU1QgPSAyMDMsXG4gIFRFTVBMQVRFX0lOVkFMSURfTk9ERV9SRUYgPSAyMDQsXG4gIFRFTVBMQVRFX01JU1NJTkdfTElTVF9QQVJFTlQgPSAyMDUsXG4gIFRFTVBMQVRFX01JU1NJTkdfTElTVF9LRVkgPSAyMDYsXG4gIFRFTVBMQVRFX0RVUExJQ0FURV9MSVNUX0tFWSA9IDIwNyxcblxuICAvLyAzMDAgLSAzOTk6IFJ1bnRpbWUgRXJyb3JzXG4gIE1JU1NJTkdfRUxFTUVOVCA9IDMwMCxcbiAgTUlTU0lOR19TVEFURSA9IDMwMSxcbiAgSU5WQUxJRF9DT05URU5UID0gMzAyLFxuICBJTlZBTElEX1NUQVRFX0tFWSA9IDMwMyxcbiAgSU5WQUxJRF9TVEFURV9VUERBVEUgPSAzMDQsXG4gIFNUQVRFX0xPQ0tFRCA9IDMwNSxcbiAgTUFYX1NFUVVFTlRJQUxfUkVOREVSUyA9IDMwNixcbn1cblxuZnVuY3Rpb24gZ2V0RGV2RXJyb3IoY29kZTogRXJyb3JDb2RlKSB7XG4gIGNvbnN0IERFVl9FUlJPUl9JTkZPOiBSZWNvcmQ8RXJyb3JDb2RlLCBzdHJpbmc+ID0ge1xuICAgIFtFcnJvckNvZGUuSU5WQVJJQU5UXTogYFxuSU5WQVJJQU5UXG5BIGNvbmRpdGlvbiBoYXMgb2NjdXJyZWQgd2hpY2ggc2hvdWxkIG5ldmVyIGhhcHBlbiwgc3VjaCBhcyBhIGNvZGUgcGF0aCB0aGF0XG5zaG91bGRuJ3QgYmUgcmVhY2hhYmxlIHdoZW4gdXNpbmcgY29ycmVjdCB0eXBlcywgb3IgYSBkaXNhbGxvd2VkIHN0YXRlLlxuYCxcblxuICAgIFtFcnJvckNvZGUuSU5WQUxJRF9FTlZdOiBgXG5JTlZBTElEX0VOVlxuRmFpbGVkIHRvIGZpbmQgYSBjdXN0b20gZWxlbWVudHMgcmVnaXN0cnkgaW4gdGhpcyBlbnZpcm9ubWVudC4gSXMgYSB3aW5kb3dcbmdsb2JhbCBhdmFpbGFibGUgd2l0aCBhIGN1c3RvbUVsZW1lbnRzIHByb3BlcnR5P1xuYCxcblxuICAgIFtFcnJvckNvZGUuRFVQRV9UQUdOQU1FXTogYFxuRFVQRV9UQUdOQU1FXG5GYWlsZWQgdG8gcmVnaXN0ZXIgYSBjdXN0b20gZWxlbWVudCB3aXRoIHRoZSB0YWduYW1lICVzIGJlY2F1c2UgYW5vdGhlclxuY3VzdG9tIGVsZW1lbnQgaXMgYWxyZWFkeSBkZWZpbmVkIHdpdGggdGhhdCBuYW1lLlxuYCxcblxuICAgIFtFcnJvckNvZGUuSU5WQUxJRF9UQUdOQU1FXTogYFxuSU5WQUxJRF9UQUdOQU1FXG5GYWlsZWQgdG8gZGV0ZXJtaW5lIGEgdmFsaWQgSFRNTCBUYWcgdG8gdXNlIHdoZW4gcmVnaXN0ZXJpbmcgYSBjb21wb25lbnQgYXMgYVxuY3VzdG9tIGVsZW1lbnQuIFNwZWNpZnkgYSBzdGF0aWMgcmVhZG9ubHkgdGFnTmFtZSBwcm9wZXJ0eSBvbiB5b3VyIGNvbXBvbmVudFxuY2xhc3Mgb3IgcHJvdmlkZSBhIHRhZ05hbWUgYXJndW1lbnQgdG8gQ29tcG9uZW50LnJlZ2lzdGVyLlxuXG5BbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGRpcmVjdGx5IHJlZ2lzdGVyIHlvdXIgZWxlbWVudCBhcyB5b3Ugd291bGQgYW55IG90aGVyXG5IVE1MIGN1c3RvbSBlbGVtZW50OiBjdXN0b21FbGVtZW50cy5kZWZpbmUoXCJteS10YWdcIiwgTXlDb21wb25lbnRDbGFzcyk7XG5gLFxuXG4gICAgW0Vycm9yQ29kZS5NSVNTSU5HX0VMRU1FTlRdOiBgXG5NSVNTSU5HX0VMRU1FTlRcbkFuIGVsZW1lbnQgd2FzIGV4cGVjdGVkIHRvIGV4aXN0IGJ1dCB3YXMgbm90IGZvdW5kIHdoZW4gdGhlIERPTSB3YXMgcXVlcmllZC5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLk1JU1NJTkdfU1RBVEVdOiBgXG5NSVNTSU5HX1NUQVRFXG5BIENvbXBvbmVudCdzIHJlYWN0aXZlIHN0YXRlIHdhcyBhY2Nlc3NlZCwgYnV0IG5vIGluaXRpYWxTdGF0ZSBpcyBkZWZpbmVkIGZvclxudGhlIENvbXBvbmVudCdzIGNsYXNzLiBJbml0aWFsIHN0YXRlIG11c3QgYmUgZGVmaW5lZCBhcyBhbiBvYmplY3Qgb3IgZnVuY3Rpb24uXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5JTlZBTElEX0NPTlRFTlRdOiBgXG5JTlZBTElEX0NPTlRFTlRcblRyaWVkIHRvIHNldCBhIHZhbHVlIGFzIGNvbnRlbnQgaW4gYSB0ZW1wbGF0ZSwgYnV0IHRoZSB2YWx1ZSB3YXMgbm90IGEgc3VwcG9ydGVkXG50eXBlLiBWYWx1ZXMgbXVzdCBiZSBhIHN0cmluZywgSFRNTEVsZW1lbnQuXG5cbkluc3RlYWQsIGdvdCAlczogJXMuXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5URU1QTEFURV9JTlZBTElEXTogYFxuVEVNUExBVEVfSU5WQUxJRFxuVGhlIHZhbHVlICVzIGNhbm5vdCBiZSBpbnRlcnBvbGF0ZWQgdmlhIHRoZSBUZW1wbGF0ZSBodG1sIHN0cmluZyBoZWxwZXIuXG5WYWx1ZXMgbWF5IG9ubHkgYmUgSFRNTFRlbXBsYXRlRWxlbWVudHMgKHRlbXBsYXRlIGNvbnRlbnQgaXMgYWRvcHRlZCkgb3JcbnN0cmluZ3MgKHNob3J0aGFuZCBmb3IgYSA6OnN3YXAgZGlyZWN0aXZlIG9uIGFuIGVsZW1lbnQpXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5URU1QTEFURV9JTlZBTElEX05PVEFUSU9OXTogYFxuVEVNUExBVEVfSU5WQUxJRF9OT1RBVElPTlxuQSB0ZW1wbGF0ZSB2YWx1ZSBub3RhdGlvbiBmYWlsZWQgdG8gcGFyc2UuIE5vdGF0aW9ucyBtdXN0IGJlZ2luIHdpdGggb25lIG9mXG5ALCAkLCAqLCBvciAjLCBmb2xsb3dlZCBieSBhIGRvdC1zZXBhcmF0ZWQgcGF0aCBvZiBhY2Nlc3NvciBuYW1lcy4gT3B0aW9uYWxseSxcbm5vdGF0aW9ucyBtYXkgaGF2ZSBtb2RpZmllcnMgYXJvdW5kIHRoZW0sIHN1Y2ggYXMgdGhlIE5PVCgpIG1vZGlmaWVyLlxuXG5UaGUgbm90YXRpb24gdGhhdCBmYWlsZWQgdG8gcGFyc2Ugd2FzIFwiJXNcIlxuYCxcbiAgICBbRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfQ09NUE9ORU5UXTogYFxuVEVNUExBVEVfSU5WQUxJRF9DT01QT05FTlRcbkZhaWxlZCB0byBpbnRlcnBvbGF0ZSBhIENvbXBvbmVudCBpbiBhbiBodG1sIHRlbXBsYXRlIHN0cmluZyBkdWUgdG8gdGhlXG5Db21wb25lbnQgaGF2aW5nIGFuIGludmFsaWQgdGFnTmFtZSBwcm9wZXJ0eS5cblxuQ29tcG9uZW50IFwiJXNcIiBoYXMgYW4gaW52YWxpZCB0YWdOYW1lIHByb3BlcnR5IFwiJXNcIlxuICAgIGAsXG5cbiAgICBbRXJyb3JDb2RlLlRFTVBMQVRFX01JU1NJTkdfTElTVF9QQVJFTlRdOiBgXG5URU1QTEFURV9NSVNTSU5HX0xJU1RfUEFSRU5UXG5BIHRlbXBsYXRlIGZhaWxlZCB0byBwcmVwYXJlIGFuIDo6ZWFjaCBkaXJlY3RpdmUgYmVjYXVzZSBubyB2YWxpZCBwYXJlbnQgbm9kZVxud2FzIGZvdW5kIGZvciB0aGUgbGlzdCB0byByZW5kZXIgaW50by5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfTElTVF06IGBcblRFTVBMQVRFX0lOVkFMSURfTElTVFxuQSB0ZW1wbGF0ZSBmYWlsZWQgdG8gcmVuZGVyIGJlY2F1c2UgYW4gOjplYWNoIGRpcmVjdGl2ZSBmZXRjaGVkIGEgdmFsdWUgd2hpY2hcbndhcyBub3QgYW4gYXJyYXkgb2YgYWN0aW9uYWJsZSBkYXRhLlxuYCxcblxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9OT0RFX1JFRl06IGBcblRFTVBMQVRFX0lOVkFMSURfTk9ERV9SRUZcbkEgdGVtcGxhdGUgZmFpbGVkIHRvIHByZXBhcmUgYSBub2RlIGZyb20gYSBjb21waWxlZCBzb3VyY2UuIFR5cGljYWxseSwgdGhpc1xubWVhbnMgc29tZXRoaW5nIGlzIGJyb2tlbiB3aXRoaW4gdGhlIGNvbXBpbGVkIHRlbXBsYXRlIHJhdGhlciB0aGFuIGFuIGVycm9yIHdpdGhcbnRoZSB0ZW1wbGF0ZSBjb250ZW50IGl0c2VsZi5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLlRFTVBMQVRFX01JU1NJTkdfTElTVF9LRVldOiBgXG5URU1QTEFURV9NSVNTSU5HX0xJU1RfS0VZXG5BIHRlbXBsYXRlIGZhaWxlZCB0byBjb21waWxlIGJlY2F1c2UgYW4gOjplYWNoIGRpcmVjdGl2ZSB3YXMgZm91bmQgb24gYW4gZWxlbWVudFxud2l0aG91dCBhIGNvcnJlc3BvbmRpbmcgOjprZXkgZGlyZWN0aXZlLiA6OmVhY2ggZGlyZWN0aXZlcyBtdXN0IGhhdmUgYSA6OmtleVxuZGlyZWN0aXZlIHNwZWNpZmllZCBvbiB0aGUgc2FtZSBlbGVtZW50LCB3aG9zZSBub3RhdGlvbiBldmFsdWF0ZXMgdG8gYSB1bmlxdWVcbnZhbHVlIGZvciBlYWNoIGl0ZW0gaW4gdGhlIGxpc3QuXG5cbkV4YW1wbGU6IDxsaSA6OmVhY2g9XCIkaXRlbXNcIiA6OmtleT1cIiNpZFwiPiAuLi4gPC9saT5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLlRFTVBMQVRFX0RVUExJQ0FURV9MSVNUX0tFWV06IGBcblRFTVBMQVRFX0RVUExJQ0FURV9MSVNUX0tFWVxuQSBsaXN0IGZhaWxlZCB0byByZW5kZXIgYmVjYXVzZSBpdGVtIGtleSAlcyBhcHBlYXJlZCBtdWx0aXBsZSB0aW1lcyB3aGVuXG5yZXNvbHZpbmcgbGlzdCBpdGVtIGtleXMuIEVhY2ggOjprZXkgZGlyZWN0aXZlIG11c3QgcmVmZXJlbmNlIGEgbm90YXRpb24gd2hvc2VcbnZhbHVlIGlzIHVuaXF1ZSBmb3IgZWFjaCBsaXN0IGl0ZW0uXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5JTlZBTElEX1NUQVRFX0tFWV06IGBcbklOVkFMSURfU1RBVEVfS0VZXG5UcmllZCB0byBhY2Nlc3MgYSBzdGF0ZSBwcm9wZXJ0eSB3aGljaCBkb2VzIG5vdCBleGlzdFxuXG5LZXkgcGF0aDogJXNcbmAsXG5cbiAgICBbRXJyb3JDb2RlLklOVkFMSURfU1RBVEVfVVBEQVRFXTogYFxuSU5WQUxJRF9TVEFURV9VUERBVEVcbkEgQ29tcG9uZW50J3Mgc2V0U3RhdGUoKSB3YXMgY2FsbGVkIHdpdGggYSB2YWx1ZSB3aGljaCBjb3VsZCBub3QgYmUgcGF0Y2hlZCBpblxudG8gdGhlIGV4aXN0aW5nIGNvbXBvbmVudCBzdGF0ZS5cblxuc2V0U3RhdGUoKSB0YWtlcyBhIHBhcnRpYWwgb2JqZWN0IGRlc2NyaWJpbmcgc3RhdGUga2V5cyB0byB1cGRhdGUuXG5cbkluc3RlYWQsIHJlY2VpdmVkOiAlc1xuYCxcblxuICAgIFtFcnJvckNvZGUuU1RBVEVfTE9DS0VEXTogYFxuU1RBVEVfTE9DS0VEXG5BIFN0YXRlIHJlY2VpdmVkIGEgcmVxdWVzdCB0byB1cGRhdGUgb3IgbG9jayB3aGlsZSBhbHJlYWR5IGxvY2tlZC5cblN0YXRlcyBtYXkgYmUgbG9ja2VkIHVzaW5nIHRoZSAubG9jaygpIG1ldGhvZCBhbmQgdW5sb2NrZWQgdXNpbmcgdGhlIC51bmxvY2soKVxubWV0aG9kLiBTdGF0ZXMgbG9jayBkdXJpbmcgYXN5bmMgbXV0YXRpb25zIGRvbmUgdGhyb3VnaCB0aGUgLm11dGF0ZUFzeW5jKClcbm1ldGhvZCBpZiBcInRydWVcIiBpcyBwYXNzZWQgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIuXG5cbllvdSBjYW4gY2hlY2sgdGhlIGxvY2sgc3RhdHVzIG9mIGEgU3RhdGUgaW5zdGFuY2Ugd2l0aCAuaXNMb2NrZWRcbmAsXG5cbiAgICBbRXJyb3JDb2RlLk1BWF9TRVFVRU5USUFMX1JFTkRFUlNdOiBgXG5NQVhfU0VRVUVOVElBTF9SRU5ERVJTXG5BIGNvbXBvbmVudCBoYXMgZXJyb3JlZCBhZnRlciByZS1yZW5kZXJpbmcgbW9yZSB0aGFuICVzIHRpbWVzIGluIHRoZSBzYW1lIGZyYW1lLlxuXG5UaGlzIHR5cGljYWxseSBoYXBwZW5zIGJlY2F1c2Ugc3RhdGUgb3IgbGl2ZSBhdHRyaWJ1dGVzIGFyZSBiZWluZyBtb2RpZmllZFxuZHVyaW5nIGEgcmVuZGVyIGxpZmVjeWNsZSBtZXRob2Qgc3VjaCBhcyBiZWZvcmVVcGRhdGUoKSBvciBhZnRlclVwZGF0ZSgpLiBJZlxuc3RhdGUgY2hhbmdlcyB1bmNvbmRpdGlvbmFsbHkgZHVyaW5nIGEgcmVuZGVyLCB0aGUgcmVuZGVyIHdpbGwgaW5maW5pdGVseSBsb29wLlxuVXBkYXRpbmcgcmVuZGVyIHNvdXJjZSBkYXRhIGR1cmluZyBhIHJlbmRlciBjeWNsZSBpcyBzdXBwb3J0ZWQsIGJ1dCBpbmZpbml0ZVxudXBkYXRlIGxvb3BzIG1heSBvY2N1ciBpZiB1bmNoZWNrZWQuXG5gLFxuICB9O1xuXG4gIHJldHVybiBERVZfRVJST1JfSU5GT1tjb2RlXTtcbn1cblxuLyoqXG4gKiBBbiBlcnJvciBvcmlnaW5hdGluZyBmcm9tIHdpdGhpbiBhIFBhbGV0dGUgc3Vic3lzdGVtLlxuICpcbiAqIEluIHRoZSBgZGV2ZWxvcG1lbnRgIGVudmlyb25tZW50LCB0aGUgZXJyb3Igd2lsbCBzdXJmYWNlIHdpdGggZXh0ZW5kZWQgaW5mb1xuICogYWJvdXQgdGhlIGVycm9yIGFuZCBhbnkgZGV0YWlscyB3aGljaCBtYXkgYmUgcmVsZXZhbnQgdG8gaGVscCB3aXRoIGRlYnVnZ2luZy5cbiAqXG4gKiBJbiB0aGUgYHByb2R1Y3Rpb25gIGVudmlyb25tZW50LCBhIG1pbmltYWwgZXJyb3Igb25seSBzdXJmYWNpbmcgdGhlIG51bWVyaWNcbiAqIGVycm9yIGNvZGUgaXMgdGhyb3duIGluc3RlYWQuXG4gKlxuICogQ29kZXMgYXJlIGNhdGVnb3JpemVkIGludG8gZ3JvdXBzIGJ5IHRoZSAxMDAnczpcbiAqXG4gKiAtIDAgLSA5OTogSW52YXJpYW50c1xuICogLSAxMDAgLSAxOTk6IEN1c3RvbSBFbGVtZW50cyAvIEVudmlyb25tZW50IEVycm9yc1xuICogLSAyMDAgLSAyOTk6IFRlbXBsYXRpbmcgRXJyb3JzXG4gKiAtIDMwMCAtIDM5OTogUnVudGltZSBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIFBhbGV0dGVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgbmFtZSA9IFwiUGFsZXR0ZUVycm9yXCI7XG4gIGNvZGU6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihjb2RlOiBudW1iZXIsIC4uLnZhbHVlczogc3RyaW5nW10pIHtcbiAgICBsZXQgbWVzc2FnZSA9IGBDb2RlOiAke2NvZGV9YDtcbiAgICBpZiAoX19ERVZfXykge1xuICAgICAgbWVzc2FnZSArPSBnZXREZXZFcnJvcihjb2RlKTtcblxuICAgICAgZm9yIChjb25zdCB2YWwgb2YgdmFsdWVzKSB7XG4gICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UoYCVzYCwgU3RyaW5nKHZhbCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gIH1cbn1cbiIsCiAgICAiLypcbiAqIENvcHlyaWdodCDCqSBSdXN0aWMgQXJjYWRlLCBMTEMgMjAyNlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cblxuaW1wb3J0IHsgRXJyb3JDb2RlLCBQYWxldHRlRXJyb3IgfSBmcm9tIFwiI2Vycm9yXCI7XG5cbi8qKiBBbiBhdHRyaWJ1dGUgdmFsdWUgYXMgcmVhZCBmcm9tIGEgRE9NIGVsZW1lbnQgKi9cbnR5cGUgQXR0cmlidXRlVmFsdWUgPSBzdHJpbmcgfCBudWxsO1xuXG4vKiogQSBNYXAgb2Ygc3RyaW5nIGF0dHJpYnV0ZSBuYW1lcyB0byB7QGxpbmsgQXR0cmlidXRlVmFsdWV9ICovXG50eXBlIEF0dHJpYnV0ZU1hcCA9IE1hcDxzdHJpbmcsIEF0dHJpYnV0ZVZhbHVlPjtcblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUF0dHJpYnV0ZSh2YWx1ZTogdW5rbm93bik6IEF0dHJpYnV0ZVZhbHVlIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICByZXR1cm4gYCR7dmFsdWV9YDtcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG5cbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSBmYWxzZSB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUF0dHJpYnV0ZU1hcChcbiAgc291cmNlOiBvYmplY3QgfCBNYXA8c3RyaW5nLCB1bmtub3duPiB8IEhUTUxFbGVtZW50LFxuKTogQXR0cmlidXRlTWFwIHtcbiAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IG51bGw+KCk7XG5cbiAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHNvdXJjZS5nZXRBdHRyaWJ1dGVOYW1lcygpKSB7XG4gICAgICBtYXAuc2V0KG5hbWUsIHNlcmlhbGl6ZUF0dHJpYnV0ZShzb3VyY2UuZ2V0QXR0cmlidXRlKG5hbWUpKSk7XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICBpZiAoc291cmNlIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIHNvdXJjZSkge1xuICAgICAgbWFwLnNldChrZXksIHNlcmlhbGl6ZUF0dHJpYnV0ZSh2YWwpKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hcDtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc291cmNlID09PSBcIm9iamVjdFwiICYmIHNvdXJjZSAhPT0gbnVsbCkge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhzb3VyY2UpKSB7XG4gICAgICBtYXAuc2V0KGtleSwgc2VyaWFsaXplQXR0cmlidXRlKHZhbCkpO1xuICAgIH1cbiAgICByZXR1cm4gbWFwO1xuICB9XG5cbiAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuSU5WQVJJQU5UKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5QXR0cmlidXRlTWFwKFxuICB0YXJnZXQ6IEhUTUxFbGVtZW50LFxuICBhdHRyczogQXR0cmlidXRlTWFwLFxuKTogdm9pZCB7XG4gIGNvbnN0IGN1cnJlbnROYW1lcyA9IG5ldyBTZXQodGFyZ2V0LmdldEF0dHJpYnV0ZU5hbWVzKCkpO1xuICBjb25zdCBpbmNvbWluZ05hbWVzID0gbmV3IFNldChhdHRycy5rZXlzKCkpO1xuICBjb25zdCBhdHRyaWJ1dGVzVG9SZW1vdmUgPSBjdXJyZW50TmFtZXMuZGlmZmVyZW5jZShpbmNvbWluZ05hbWVzKTtcblxuICBmb3IgKGNvbnN0IGF0dHIgb2YgYXR0cmlidXRlc1RvUmVtb3ZlKSB7XG4gICAgdGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZShhdHRyKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgW25hbWUsIHZhbF0gb2YgYXR0cnMpIHtcbiAgICBpZiAodmFsID09PSBudWxsKSB7XG4gICAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKG5hbWUsIHZhbCk7XG4gICAgfVxuICB9XG59XG4iLAogICAgIi8qXG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xudHlwZSBNZXRyaWNzID0ge1xuICBoaXRzOiBudW1iZXI7XG4gIG1pc3NlczogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgTFJVQ2FjaGVNZXRyaWNzID0ge1xuICBsb29rdXBzOiBudW1iZXI7XG4gIGhpdHM6IG51bWJlcjtcbiAgbWlzc2VzOiBudW1iZXI7XG4gIGNhcGFjaXR5OiBudW1iZXI7XG4gIGVudHJpZXM6IG51bWJlcjtcbiAgaGl0UmF0ZTogbnVtYmVyO1xufTtcblxuLyoqXG4gKiBBIHNpbXBsZSBpbi1tZW1vcnkgTFJVIENhY2hlIHVzaW5nIEphdmFTY3JpcHQgbWFwcy5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIENhY2hlZCBuZXR3b3JrIHJlcXVlc3RcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBBIGNhY2hlIG9mIEFQSSBVUkxzIHRvIHRoZWlyIHJldHVybmVkIHBheWxvYWRzXG4gKiBjb25zdCBjYWNoZSA9IG5ldyBMUlVDYWNoZTxzdHJpbmcsIEFQSVBheWxvYWQ+KCk7XG4gKlxuICogYXN5bmMgZnVuY3Rpb24gbWFrZVJlcXVlc3QodXJsOiBzdHJpbmcpIHtcbiAqICAgbGV0IGNhY2hlZCA9IGNhY2hlLmdldCh1cmwpO1xuICogICBpZiAoY2FjaGVkKSB7XG4gKiAgICAgcmV0dXJuIGNhY2hlZDtcbiAqICAgfVxuICpcbiAqICAgLy8gLi4uIE1ha2UgdGhlIHJlcXVlc3QgYW5kIGNhY2hlLnNldCgpIHRoZSByZXNwb25zZVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBMUlVDYWNoZTxLLCBWPiB7XG4gIHByaXZhdGUgX21heFNpemU6IG51bWJlcjtcbiAgcHJpdmF0ZSBfZGF0YTogTWFwPEssIFY+O1xuICBwcml2YXRlIF9tZXRyaWNzOiBNZXRyaWNzID0geyBoaXRzOiAwLCBtaXNzZXM6IDAgfTtcblxuICBjb25zdHJ1Y3RvcihtYXhTaXplOiBudW1iZXIgPSA1MDApIHtcbiAgICBpZiAobWF4U2l6ZSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJMUlUgQ2FjaGUgY2FwYWNpdHkgbXVzdCBiZSA+PSAxXCIpO1xuICAgIH1cblxuICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICB0aGlzLl9tZXRyaWNzID0geyBoaXRzOiAwLCBtaXNzZXM6IDAgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9tYXhTaXplID0gbWF4U2l6ZTtcbiAgICB0aGlzLl9kYXRhID0gbmV3IE1hcDxLLCBWPigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdHJpbSA9ICgpID0+IHtcbiAgICB3aGlsZSAodGhpcy5fZGF0YS5zaXplID4gdGhpcy5fbWF4U2l6ZSkge1xuICAgICAgY29uc3QgZmlyc3RLZXkgPSB0aGlzLl9kYXRhLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICBpZiAoZmlyc3RLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBYnN1cmRcIik7XG4gICAgICB9XG4gICAgICB0aGlzLl9kYXRhLmRlbGV0ZShmaXJzdEtleSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgY2FjaGUgcGVyZm9ybWFuY2UgbWV0cmljcyBmcm9tIHRoaXMgTFJVIENhY2hlIGluc3RhbmNlLlxuICAgKlxuICAgKiBJbiBkZXZlbG9wbWVudCBtb2RlLCB0aGlzIHJldHVybnMgaW5zaWdodHMgaW50byBoaXRzL21pc3NlcyBvZiB0aGUgY2FjaGUsXG4gICAqIGFzIHdlbGwgYXMgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBhbmQgZW50cnkgY291bnQuXG4gICAqXG4gICAqIEluIHByb2R1Y3Rpb24gbW9kZSwgdGhpcyByZXR1cm5zIGEgcGxhY2Vob2xkZXIgb2JqZWN0LCBhcyBtZXRyaWMgY29sbGVjdGlvblxuICAgKiBpcyBub3QgYWN0aXZlIGluIHByb2R1Y3Rpb24uXG4gICAqL1xuICBnZXQgbWV0cmljcygpOiBMUlVDYWNoZU1ldHJpY3Mge1xuICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICBjb25zdCB7IGhpdHMgPSAwLCBtaXNzZXMgPSAwIH0gPSB0aGlzLl9tZXRyaWNzID8/IHt9O1xuICAgICAgY29uc3QgbG9va3VwcyA9IGhpdHMgKyBtaXNzZXM7XG4gICAgICBjb25zdCBoaXRSYXRlID0gbG9va3VwcyA9PT0gMCA/IDAgOiBoaXRzIC8gbG9va3VwcztcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbG9va3VwcyxcbiAgICAgICAgaGl0czogaGl0cyxcbiAgICAgICAgbWlzc2VzOiBtaXNzZXMsXG4gICAgICAgIGNhcGFjaXR5OiB0aGlzLl9tYXhTaXplLFxuICAgICAgICBlbnRyaWVzOiB0aGlzLl9kYXRhLnNpemUsXG4gICAgICAgIGhpdFJhdGUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBsb29rdXBzOiAwLFxuICAgICAgaGl0czogMCxcbiAgICAgIG1pc3NlczogMCxcbiAgICAgIGNhcGFjaXR5OiAwLFxuICAgICAgZW50cmllczogMCxcbiAgICAgIGhpdFJhdGU6IDAsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIG1heGltdW0gY2FjaGUgc2l6ZSBmb3IgdGhpcyBpbnN0YW5jZS4gSW1tZWRpYXRlbHkgdHJpZ2dlcnMgYVxuICAgKiBwdXJnZSBvZiBjYWNoZWQgY29udGVudHMgaWYgdGhlIG5ldyBjYXBhY2l0eSBpcyBsZXNzIHRoYW4gdGhlIGN1cnJlbnRcbiAgICogbnVtYmVyIG9mIGNhY2hlZCBlbnRyaWVzLlxuICAgKi9cbiAgc2V0Q2FwYWNpdHkgPSAobWF4U2l6ZTogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgaWYgKG1heFNpemUgPD0gMCAmJiBfX0RFVl9fKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiW1BhbGV0dGUgTFJVIENhY2hlXSBDYWNoZSBzaXplIGlzIDw9IDAuIENhY2hlIGlzIGRpc2FibGVkLlwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLl9tYXhTaXplID0gbWF4U2l6ZTtcbiAgICB0aGlzLl90cmltKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZldGNoIGEgdmFsdWUgZnJvbSB0aGUgY2FjaGUsIHJldHVybmluZyBgdW5kZWZpbmVkYCBpZiBubyB2YWx1ZSB3YXMgZm91bmRcbiAgICovXG4gIGdldChrZXk6IEspOiBWIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2RhdGEuZ2V0KGtleSk7XG5cbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKF9fREVWX18pIHtcbiAgICAgICAgdGhpcy5fbWV0cmljcy5taXNzZXMgKz0gMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gRGVsZXRlIGFuZCByZS1zZXQgdGhlIHZhbHVlIHRvIG1vdmUgdGhlIGtleSB0byB0aGUgZW5kIG9mIHRoZSBrZXkgbGlzdFxuICAgIHRoaXMuX2RhdGEuZGVsZXRlKGtleSk7XG4gICAgdGhpcy5fZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG5cbiAgICBpZiAoX19ERVZfXykge1xuICAgICAgdGhpcy5fbWV0cmljcy5oaXRzICs9IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIHZhbHVlIGluIHRoZSBjYWNoZS4gVGhpcyBhbHNvIG1vdmVzIHRoZSB2YWx1ZSB0byB0aGUgYmFjayBvZiB0aGUgbGlzdFxuICAgKiBvZiB2YWx1ZXMgdG8gY29uc2lkZXIgZXZpY3Rpbmcgd2hlbiB0aGUgY2FjaGUgaXMgZnVsbC5cbiAgICovXG4gIHNldChrZXk6IEssIHZhbHVlOiBWKTogdm9pZCB7XG4gICAgLy8gUmVtb3ZlIGlmIGV4aXN0cyB0byB1cGRhdGUgcG9zaXRpb25cbiAgICBpZiAodGhpcy5fZGF0YS5oYXMoa2V5KSkge1xuICAgICAgdGhpcy5fZGF0YS5kZWxldGUoa2V5KTtcbiAgICB9XG5cbiAgICB0aGlzLl9kYXRhLnNldChrZXksIHZhbHVlKTtcblxuICAgIGlmICh0aGlzLl9kYXRhLnNpemUgPiB0aGlzLl9tYXhTaXplKSB7XG4gICAgICB0aGlzLl90cmltKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBjb250ZW50cyBvZiB0aGlzIGNhY2hlIGluc3RhbmNlXG4gICAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLl9kYXRhLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGlzIGNhY2hlIGluc3RhbmNlXG4gICAqL1xuICBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLnNpemU7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTFJVQ2FjaGU7XG4iLAogICAgIi8qXG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuaW1wb3J0IExSVUNhY2hlIGZyb20gXCIuL2xydS1jYWNoZVwiO1xuXG5leHBvcnQgY29uc3QgZnJhZ21lbnRDYWNoZSA9IG5ldyBMUlVDYWNoZTxzdHJpbmcsIERvY3VtZW50RnJhZ21lbnQ+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBodG1sVG9GcmFnbWVudChodG1sOiBzdHJpbmcpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgY29uc3QgbG9va3VwID0gZnJhZ21lbnRDYWNoZS5nZXQoaHRtbCk7XG5cbiAgaWYgKGxvb2t1cCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGxvb2t1cC5jbG9uZU5vZGUodHJ1ZSkgYXMgRG9jdW1lbnRGcmFnbWVudDtcbiAgfVxuXG4gIGNvbnN0IHRlbXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG4gIHRlbXAuaW5uZXJIVE1MID0gaHRtbDtcbiAgZnJhZ21lbnRDYWNoZS5zZXQoaHRtbCwgdGVtcC5jb250ZW50KTtcbiAgcmV0dXJuIHRlbXAuY29udGVudC5jbG9uZU5vZGUodHJ1ZSkgYXMgRG9jdW1lbnRGcmFnbWVudDtcbn1cbiIsCiAgICAiLypcbiAqIENvcHlyaWdodCDCqSBSdXN0aWMgQXJjYWRlLCBMTEMgMjAyNlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cblxuLyoqXG4gKiBSZXR1cm5zIGEgcmFuZG9tIHRhZyBuYW1lIGZvciB1c2UgaW4gYSB0ZXN0IGVsZW1lbnRcbiAqL1xuZXhwb3J0IGNvbnN0IHJhbmRvbVRhZ05hbWUgPSAoKSA9PiB7XG4gIGNvbnN0IGlkID0gY3J5cHRvLnJhbmRvbVVVSUQoKS5yZXBsYWNlQWxsKFwiLVwiLCBcIlwiKS5zbGljZSgwLCAxMCk7XG4gIHJldHVybiBgdGVzdC1lbGVtZW50LSR7aWR9YDtcbn07XG4iLAogICAgIi8qXG4gKiBDb3B5cmlnaHQgwqkgUnVzdGljIEFyY2FkZSwgTExDIDIwMjZcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQ29tcG9uZW50IH0gZnJvbSBcIiNjb21wb25lbnRcIjtcbmltcG9ydCB7IGFwcGx5QXR0cmlidXRlTWFwLCBjcmVhdGVBdHRyaWJ1dGVNYXAgfSBmcm9tIFwiI3V0aWxcIjtcbmltcG9ydCB7IHJhbmRvbVRhZ05hbWUgfSBmcm9tIFwiLi90YWdzXCI7XG5cbi8qKlxuICogUmVuZGVyIGEgUGFsZXR0ZSBDb21wb25lbnQgY2xhc3MgYXMgYSB0ZXN0IGVsZW1lbnRcbiAqXG4gKiBJZiB0aGUgY2xhc3MgaXMgbm90IHlldCByZWdpc3RlcmVkLCBpdCBpcyBhdXRvLXJlZ2lzdGVyZWQgYmVmb3JlIGNyZWF0aW9uLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogdGVzdChcImNvbXBvbmVudCBkb2VzIHNvbWV0aGluZ1wiLCBhc3luYyAoKSA9PiB7XG4gKiAgIGxldCBzb21ldGhpbmdNb2NrID0gbW9jaygpO1xuICpcbiAqICAgY2xhc3MgTXlUZXN0Q29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50IHtcbiAqICAgICBzY3JpcHQoKSB7XG4gKiAgICAgICBzb21ldGhpbmdNb2NrKCk7XG4gKiAgICAgfVxuICogICB9XG4gKlxuICogICBhd2FpdCByZW5kZXJUZXN0Q29tcG9uZW50KE15VGVzdENvbXBvbmVudCk7XG4gKiAgIGV4cGVjdChzb21ldGhpbmdNb2NrKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBjb21wb25lbnQgVGhlIGNvbXBvbmVudCBjbGFzcyB0byByZWdpc3RlciBhbmQgY3JlYXRlXG4gKiBAcGFyYW0gYXR0cmlidXRlcyBBIHJlY29yZCBvZiBhdHRyaWJ1dGVzIHRvIGFwcGx5XG4gKiBAcmV0dXJucyBBIHJlZmVyZW5jZSB0byB0aGUgcmVuZGVyZWQgQ29tcG9uZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5kZXJUZXN0Q29tcG9uZW50PEUgZXh0ZW5kcyB0eXBlb2YgQ29tcG9uZW50PGFueT4+KFxuICBjb21wb25lbnQ6IEUsXG4gIGF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbik6IFByb21pc2U8SW5zdGFuY2VUeXBlPEU+PiB7XG4gIC8vIEVycm9yIGVhcmx5IGlmIG1pc2NvbmZpZ3VyZWRcbiAgaWYgKFxuICAgIHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICB0eXBlb2Ygd2luZG93LmN1c3RvbUVsZW1lbnRzID09PSBcInVuZGVmaW5lZFwiXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiRmFpbGVkIHRvIHJlbmRlciB0ZXN0IGNvbXBvbmVudDogXCIgK1xuICAgICAgICBcIndpbmRvdy5jdXN0b21FbGVtZW50cyBpcyBub3QgYXZhaWxhYmxlIGluIHRoaXMgZW52aXJvbm1lbnQuXCIsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHVzZVRhZ25hbWUgPVxuICAgIGNvbXBvbmVudC50YWdOYW1lID09PSBcIlwiID8gcmFuZG9tVGFnTmFtZSgpIDogY29tcG9uZW50LnRhZ05hbWU7XG5cbiAgLy8gUmVhc3NpZ24gdGhlIHRhZ25hbWUgYmFjayB0byB0aGUgY29tcG9uZW50IHRvIGVuc3VyZSBpdCBpcyBzZXQgYmVmb3JlIHJlZ2lzdHJhdGlvblxuICBjb21wb25lbnQudGFnTmFtZSA9IHVzZVRhZ25hbWU7XG5cbiAgLy8gUmVnaXN0ZXIgdGhlIGNvbXBvbmVudCBpZiBuZWVkIGJlXG4gIGlmICghY3VzdG9tRWxlbWVudHMuZ2V0KHVzZVRhZ25hbWUpKSB7XG4gICAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKFxuICAgICAgdXNlVGFnbmFtZSxcbiAgICAgIGNvbXBvbmVudCBhcyB1bmtub3duIGFzIEN1c3RvbUVsZW1lbnRDb25zdHJ1Y3RvcixcbiAgICApO1xuICB9XG5cbiAgLy8gQ29uc3RydWN0IGEgdGVzdCBpbnN0YW5jZVxuICBjb25zdCAkY29tcG9uZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChjb21wb25lbnQudGFnTmFtZSk7XG5cbiAgLy8gQXBwbHkgYXR0cmlidXRlcyBiZWZvcmUgcmVuZGVyaW5nXG4gIGNvbnN0IGF0dHJpYnV0ZU1hcCA9IGNyZWF0ZUF0dHJpYnV0ZU1hcChhdHRyaWJ1dGVzID8/IHt9KTtcbiAgYXBwbHlBdHRyaWJ1dGVNYXAoJGNvbXBvbmVudCwgYXR0cmlidXRlTWFwKTtcblxuICAvLyBSZW5kZXIgYW5kIGF3YWl0IHRvIGFsbG93IG1pY3JvdGFza3MgdG8gc2V0dGxlXG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kKCRjb21wb25lbnQpO1xuICBhd2FpdCBCdW4uc2xlZXAoMSk7XG5cbiAgLy8gUmV0dXJuIHRoZSByZW5kZXJlZCBpbnN0YW5jZVxuICByZXR1cm4gJGNvbXBvbmVudCBhcyBJbnN0YW5jZVR5cGU8RT47XG59XG5cbi8qKlxuICogRm9yY2UgYSByZW5kZXIgb24gdGhlIHRhcmdldCBlbGVtZW50XG4gKlxuICogUmV0dXJucyBhIHByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgd2hlbiB0aGUgcmVuZGVyIGhhcyBjb21wbGV0ZWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcmVuZGVyVGVzdENvbXBvbmVudChlbGVtZW50OiBDb21wb25lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgZWxlbWVudC5yZXF1ZXN0UmVuZGVyKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IEJ1bi5zbGVlcCgxKTtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfSk7XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOztB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
|
|
165
|
+
//# debugId=6550070DCFC2AA2864756E2164756E21
|
|
166
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL3Rlc3QtdXRpbC9nbG9iYWwtZW52LnRzIiwgInNyYy91dGlsL2F0dHJpYnV0ZXMudHMiLCAic3JjL3V0aWwvbHJ1LWNhY2hlLnRzIiwgInNyYy91dGlsL2ZyYWdtZW50cy50cyIsICJzcmMvdGVzdC11dGlsL3RhZ3MudHMiLCAic3JjL3Rlc3QtdXRpbC9yZW5kZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiLypcbiAqIENvcHlyaWdodCDCqSBSdXN0aWMgQXJjYWRlLCBMTEMgMjAyNlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cblxuaW1wb3J0IHsgR2xvYmFsUmVnaXN0cmF0b3IgfSBmcm9tIFwiQGhhcHB5LWRvbS9nbG9iYWwtcmVnaXN0cmF0b3JcIjtcblxuLyoqXG4gKiBJbml0aWFsaXplIHRoZSBnbG9iYWwgdGVzdCBET00gZW52aXJvbm1lbnQgKHVzaW5nIEhhcHB5RE9NKVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJlcGFyZUdsb2JhbFRlc3RET00oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGNsZWFudXBHbG9iYWxUZXN0RE9NKCk7XG4gIEdsb2JhbFJlZ2lzdHJhdG9yLnJlZ2lzdGVyKCk7XG59XG5cbi8qKlxuICogQ2xlYW51cCB0aGUgZ2xvYmFsIHRlc3QgRE9NIGVudmlyb25tZW50ICh1c2luZyBIYXBweURPTSlcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsZWFudXBHbG9iYWxUZXN0RE9NKCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgd2hpbGUgKGRvY3VtZW50LmZpcnN0Q2hpbGQpIHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUNoaWxkKGRvY3VtZW50LmZpcnN0Q2hpbGQpO1xuICAgIH1cbiAgfVxuXG4gIGF3YWl0IEJ1bi5zbGVlcCgxKTtcblxuICBpZiAoR2xvYmFsUmVnaXN0cmF0b3IuaXNSZWdpc3RlcmVkKSB7XG4gICAgR2xvYmFsUmVnaXN0cmF0b3IudW5yZWdpc3RlcigpO1xuICB9XG59XG4iLAogICAgIi8qXG4gKiBDb3B5cmlnaHQgwqkgUnVzdGljIEFyY2FkZSwgTExDIDIwMjZcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplQXR0cmlidXRlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgcmV0dXJuIGAke3ZhbHVlfWA7XG4gIH1cblxuICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gZmFsc2UgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUF0dHJpYnV0ZShcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gIG5hbWU6IHN0cmluZyxcbiAgdmFsdWU6IHN0cmluZyB8IG51bGwsXG4pOiB2b2lkIHtcbiAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gIH0gZWxzZSB7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbGVtZW50QXR0cmlidXRlcyhcbiAgc291cmNlOiBIVE1MRWxlbWVudCxcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+IHtcbiAgY29uc3QgYXR0cnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+ID0ge307XG5cbiAgZm9yIChjb25zdCBuYW1lIG9mIHNvdXJjZS5nZXRBdHRyaWJ1dGVOYW1lcygpKSB7XG4gICAgYXR0cnNbbmFtZV0gPSBzZXJpYWxpemVBdHRyaWJ1dGUoc291cmNlLmdldEF0dHJpYnV0ZShuYW1lKSk7XG4gIH1cblxuICByZXR1cm4gYXR0cnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUVsZW1lbnRBdHRyaWJ1dGVzKFxuICB0YXJnZXQ6IEhUTUxFbGVtZW50LFxuICBhdHRyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4pOiB2b2lkIHtcbiAgY29uc3QgY3VycmVudE5hbWVzID0gbmV3IFNldCh0YXJnZXQuZ2V0QXR0cmlidXRlTmFtZXMoKSk7XG4gIGNvbnN0IGluY29taW5nTmFtZXMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKGF0dHJzKSk7XG4gIGNvbnN0IGF0dHJpYnV0ZXNUb1JlbW92ZSA9IGN1cnJlbnROYW1lcy5kaWZmZXJlbmNlKGluY29taW5nTmFtZXMpO1xuXG4gIGZvciAoY29uc3QgYXR0ciBvZiBhdHRyaWJ1dGVzVG9SZW1vdmUpIHtcbiAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKGF0dHIpO1xuICB9XG5cbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhhdHRycykpIHtcbiAgICBhcHBseUF0dHJpYnV0ZSh0YXJnZXQsIG5hbWUsIHNlcmlhbGl6ZUF0dHJpYnV0ZSh2YWwpKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0QXR0cmlidXRlUmVjb3JkKFxuICByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD4ge1xuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+ID0ge307XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKHJlY29yZCkpIHtcbiAgICBvdXRba2V5XSA9IHNlcmlhbGl6ZUF0dHJpYnV0ZSh2YWwpO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG50eXBlIE1ldHJpY3MgPSB7XG4gIGhpdHM6IG51bWJlcjtcbiAgbWlzc2VzOiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBMUlVDYWNoZU1ldHJpY3MgPSB7XG4gIGxvb2t1cHM6IG51bWJlcjtcbiAgaGl0czogbnVtYmVyO1xuICBtaXNzZXM6IG51bWJlcjtcbiAgY2FwYWNpdHk6IG51bWJlcjtcbiAgZW50cmllczogbnVtYmVyO1xuICBoaXRSYXRlOiBudW1iZXI7XG59O1xuXG4vKipcbiAqIEEgc2ltcGxlIGluLW1lbW9yeSBMUlUgQ2FjaGUgdXNpbmcgSmF2YVNjcmlwdCBtYXBzLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogQ2FjaGVkIG5ldHdvcmsgcmVxdWVzdFxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEEgY2FjaGUgb2YgQVBJIFVSTHMgdG8gdGhlaXIgcmV0dXJuZWQgcGF5bG9hZHNcbiAqIGNvbnN0IGNhY2hlID0gbmV3IExSVUNhY2hlPHN0cmluZywgQVBJUGF5bG9hZD4oKTtcbiAqXG4gKiBhc3luYyBmdW5jdGlvbiBtYWtlUmVxdWVzdCh1cmw6IHN0cmluZykge1xuICogICBsZXQgY2FjaGVkID0gY2FjaGUuZ2V0KHVybCk7XG4gKiAgIGlmIChjYWNoZWQpIHtcbiAqICAgICByZXR1cm4gY2FjaGVkO1xuICogICB9XG4gKlxuICogICAvLyAuLi4gTWFrZSB0aGUgcmVxdWVzdCBhbmQgY2FjaGUuc2V0KCkgdGhlIHJlc3BvbnNlXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIExSVUNhY2hlPEssIFY+IHtcbiAgcHJpdmF0ZSBfbWF4U2l6ZTogbnVtYmVyO1xuICBwcml2YXRlIF9kYXRhOiBNYXA8SywgVj47XG4gIHByaXZhdGUgX21ldHJpY3M6IE1ldHJpY3MgPSB7IGhpdHM6IDAsIG1pc3NlczogMCB9O1xuXG4gIGNvbnN0cnVjdG9yKG1heFNpemU6IG51bWJlciA9IDUwMCkge1xuICAgIGlmIChtYXhTaXplIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkxSVSBDYWNoZSBjYXBhY2l0eSBtdXN0IGJlID49IDFcIik7XG4gICAgfVxuXG4gICAgaWYgKF9fREVWX18pIHtcbiAgICAgIHRoaXMuX21ldHJpY3MgPSB7IGhpdHM6IDAsIG1pc3NlczogMCB9O1xuICAgIH1cblxuICAgIHRoaXMuX21heFNpemUgPSBtYXhTaXplO1xuICAgIHRoaXMuX2RhdGEgPSBuZXcgTWFwPEssIFY+KCk7XG4gIH1cblxuICBwcml2YXRlIF90cmltID0gKCkgPT4ge1xuICAgIHdoaWxlICh0aGlzLl9kYXRhLnNpemUgPiB0aGlzLl9tYXhTaXplKSB7XG4gICAgICBjb25zdCBmaXJzdEtleSA9IHRoaXMuX2RhdGEua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICAgIGlmIChmaXJzdEtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFic3VyZFwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2RhdGEuZGVsZXRlKGZpcnN0S2V5KTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBjYWNoZSBwZXJmb3JtYW5jZSBtZXRyaWNzIGZyb20gdGhpcyBMUlUgQ2FjaGUgaW5zdGFuY2UuXG4gICAqXG4gICAqIEluIGRldmVsb3BtZW50IG1vZGUsIHRoaXMgcmV0dXJucyBpbnNpZ2h0cyBpbnRvIGhpdHMvbWlzc2VzIG9mIHRoZSBjYWNoZSxcbiAgICogYXMgd2VsbCBhcyB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIGFuZCBlbnRyeSBjb3VudC5cbiAgICpcbiAgICogSW4gcHJvZHVjdGlvbiBtb2RlLCB0aGlzIHJldHVybnMgYSBwbGFjZWhvbGRlciBvYmplY3QsIGFzIG1ldHJpYyBjb2xsZWN0aW9uXG4gICAqIGlzIG5vdCBhY3RpdmUgaW4gcHJvZHVjdGlvbi5cbiAgICovXG4gIGdldE1ldHJpY3MoKTogTFJVQ2FjaGVNZXRyaWNzIHwgdm9pZCB7XG4gICAgaWYgKF9fREVWX18pIHtcbiAgICAgIGNvbnN0IHsgaGl0cyA9IDAsIG1pc3NlcyA9IDAgfSA9IHRoaXMuX21ldHJpY3MgPz8ge307XG4gICAgICBjb25zdCBsb29rdXBzID0gaGl0cyArIG1pc3NlcztcbiAgICAgIGNvbnN0IGhpdFJhdGUgPSBsb29rdXBzID09PSAwID8gMCA6IGhpdHMgLyBsb29rdXBzO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBsb29rdXBzLFxuICAgICAgICBoaXRzOiBoaXRzLFxuICAgICAgICBtaXNzZXM6IG1pc3NlcyxcbiAgICAgICAgY2FwYWNpdHk6IHRoaXMuX21heFNpemUsXG4gICAgICAgIGVudHJpZXM6IHRoaXMuX2RhdGEuc2l6ZSxcbiAgICAgICAgaGl0UmF0ZSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgbWF4aW11bSBjYWNoZSBzaXplIGZvciB0aGlzIGluc3RhbmNlLiBJbW1lZGlhdGVseSB0cmlnZ2VycyBhXG4gICAqIHB1cmdlIG9mIGNhY2hlZCBjb250ZW50cyBpZiB0aGUgbmV3IGNhcGFjaXR5IGlzIGxlc3MgdGhhbiB0aGUgY3VycmVudFxuICAgKiBudW1iZXIgb2YgY2FjaGVkIGVudHJpZXMuXG4gICAqL1xuICBzZXRDYXBhY2l0eSA9IChtYXhTaXplOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICBpZiAobWF4U2l6ZSA8PSAwICYmIF9fREVWX18pIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJbUGFsZXR0ZSBMUlUgQ2FjaGVdIENhY2hlIHNpemUgaXMgPD0gMC4gQ2FjaGUgaXMgZGlzYWJsZWQuXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuX21heFNpemUgPSBtYXhTaXplO1xuICAgIHRoaXMuX3RyaW0oKTtcbiAgfTtcblxuICAvKipcbiAgICogRmV0Y2ggYSB2YWx1ZSBmcm9tIHRoZSBjYWNoZSwgcmV0dXJuaW5nIGB1bmRlZmluZWRgIGlmIG5vIHZhbHVlIHdhcyBmb3VuZFxuICAgKi9cbiAgZ2V0KGtleTogSyk6IFYgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fZGF0YS5nZXQoa2V5KTtcblxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoX19ERVZfXykge1xuICAgICAgICB0aGlzLl9tZXRyaWNzLm1pc3NlcyArPSAxO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBEZWxldGUgYW5kIHJlLXNldCB0aGUgdmFsdWUgdG8gbW92ZSB0aGUga2V5IHRvIHRoZSBlbmQgb2YgdGhlIGtleSBsaXN0XG4gICAgdGhpcy5fZGF0YS5kZWxldGUoa2V5KTtcbiAgICB0aGlzLl9kYXRhLnNldChrZXksIHZhbHVlKTtcblxuICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICB0aGlzLl9tZXRyaWNzLmhpdHMgKz0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgdmFsdWUgaW4gdGhlIGNhY2hlLiBUaGlzIGFsc28gbW92ZXMgdGhlIHZhbHVlIHRvIHRoZSBiYWNrIG9mIHRoZSBsaXN0XG4gICAqIG9mIHZhbHVlcyB0byBjb25zaWRlciBldmljdGluZyB3aGVuIHRoZSBjYWNoZSBpcyBmdWxsLlxuICAgKi9cbiAgc2V0KGtleTogSywgdmFsdWU6IFYpOiB2b2lkIHtcbiAgICAvLyBSZW1vdmUgaWYgZXhpc3RzIHRvIHVwZGF0ZSBwb3NpdGlvblxuICAgIGlmICh0aGlzLl9kYXRhLmhhcyhrZXkpKSB7XG4gICAgICB0aGlzLl9kYXRhLmRlbGV0ZShrZXkpO1xuICAgIH1cblxuICAgIHRoaXMuX2RhdGEuc2V0KGtleSwgdmFsdWUpO1xuXG4gICAgaWYgKHRoaXMuX2RhdGEuc2l6ZSA+IHRoaXMuX21heFNpemUpIHtcbiAgICAgIHRoaXMuX3RyaW0oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIGNvbnRlbnRzIG9mIHRoaXMgY2FjaGUgaW5zdGFuY2VcbiAgICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuX2RhdGEuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoaXMgY2FjaGUgaW5zdGFuY2VcbiAgICovXG4gIGdldCBzaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEuc2l6ZTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBMUlVDYWNoZTtcbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5pbXBvcnQgTFJVQ2FjaGUgZnJvbSBcIi4vbHJ1LWNhY2hlXCI7XG5cbmV4cG9ydCBjb25zdCBmcmFnbWVudENhY2hlID0gbmV3IExSVUNhY2hlPHN0cmluZywgRG9jdW1lbnRGcmFnbWVudD4oKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGh0bWxUb0ZyYWdtZW50KGh0bWw6IHN0cmluZyk6IERvY3VtZW50RnJhZ21lbnQge1xuICBjb25zdCBsb29rdXAgPSBmcmFnbWVudENhY2hlLmdldChodG1sKTtcblxuICBpZiAobG9va3VwICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbG9va3VwLmNsb25lTm9kZSh0cnVlKSBhcyBEb2N1bWVudEZyYWdtZW50O1xuICB9XG5cbiAgY29uc3QgdGVtcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAgdGVtcC5pbm5lckhUTUwgPSBodG1sO1xuICBmcmFnbWVudENhY2hlLnNldChodG1sLCB0ZW1wLmNvbnRlbnQpO1xuICByZXR1cm4gdGVtcC5jb250ZW50LmNsb25lTm9kZSh0cnVlKSBhcyBEb2N1bWVudEZyYWdtZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2F2ZUZyYWdtZW50KGh0bWw6IHN0cmluZywgZnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQpOiB2b2lkIHtcbiAgZnJhZ21lbnRDYWNoZS5zZXQoaHRtbCwgZnJhZ21lbnQpO1xufVxuIiwKICAgICIvKlxuICogQ29weXJpZ2h0IMKpIFJ1c3RpYyBBcmNhZGUsIExMQyAyMDI2XG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuXG4vKipcbiAqIFJldHVybnMgYSByYW5kb20gdGFnIG5hbWUgZm9yIHVzZSBpbiBhIHRlc3QgZWxlbWVudFxuICovXG5leHBvcnQgY29uc3QgcmFuZG9tVGFnTmFtZSA9ICgpID0+IHtcbiAgY29uc3QgaWQgPSBjcnlwdG8ucmFuZG9tVVVJRCgpLnJlcGxhY2VBbGwoXCItXCIsIFwiXCIpLnNsaWNlKDAsIDEwKTtcbiAgcmV0dXJuIGB0ZXN0LWVsZW1lbnQtJHtpZH1gO1xufTtcbiIsCiAgICAiLypcbiAqIENvcHlyaWdodCDCqSBSdXN0aWMgQXJjYWRlLCBMTEMgMjAyNlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDb21wb25lbnQgfSBmcm9tIFwiI2NvbXBvbmVudFwiO1xuaW1wb3J0IHsgYXBwbHlFbGVtZW50QXR0cmlidXRlcyB9IGZyb20gXCIjdXRpbFwiO1xuaW1wb3J0IHsgcmFuZG9tVGFnTmFtZSB9IGZyb20gXCIuL3RhZ3NcIjtcblxuLyoqXG4gKiBSZW5kZXIgYSBQYWxldHRlIENvbXBvbmVudCBjbGFzcyBhcyBhIHRlc3QgZWxlbWVudFxuICpcbiAqIElmIHRoZSBjbGFzcyBpcyBub3QgeWV0IHJlZ2lzdGVyZWQsIGl0IGlzIGF1dG8tcmVnaXN0ZXJlZCBiZWZvcmUgY3JlYXRpb24uXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiB0ZXN0KFwiY29tcG9uZW50IGRvZXMgc29tZXRoaW5nXCIsIGFzeW5jICgpID0+IHtcbiAqICAgbGV0IHNvbWV0aGluZ01vY2sgPSBtb2NrKCk7XG4gKlxuICogICBjbGFzcyBNeVRlc3RDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnQge1xuICogICAgIHNjcmlwdCgpIHtcbiAqICAgICAgIHNvbWV0aGluZ01vY2soKTtcbiAqICAgICB9XG4gKiAgIH1cbiAqXG4gKiAgIGF3YWl0IHJlbmRlclRlc3RDb21wb25lbnQoTXlUZXN0Q29tcG9uZW50KTtcbiAqICAgZXhwZWN0KHNvbWV0aGluZ01vY2spLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGNvbXBvbmVudCBUaGUgY29tcG9uZW50IGNsYXNzIHRvIHJlZ2lzdGVyIGFuZCBjcmVhdGVcbiAqIEBwYXJhbSBhdHRyaWJ1dGVzIEEgcmVjb3JkIG9mIGF0dHJpYnV0ZXMgdG8gYXBwbHlcbiAqIEByZXR1cm5zIEEgcmVmZXJlbmNlIHRvIHRoZSByZW5kZXJlZCBDb21wb25lbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmRlclRlc3RDb21wb25lbnQ8RSBleHRlbmRzIHR5cGVvZiBDb21wb25lbnQ8YW55Pj4oXG4gIGNvbXBvbmVudDogRSxcbiAgYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+LFxuKTogUHJvbWlzZTxJbnN0YW5jZVR5cGU8RT4+IHtcbiAgLy8gRXJyb3IgZWFybHkgaWYgbWlzY29uZmlndXJlZFxuICBpZiAoXG4gICAgdHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgIHR5cGVvZiB3aW5kb3cuY3VzdG9tRWxlbWVudHMgPT09IFwidW5kZWZpbmVkXCJcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJGYWlsZWQgdG8gcmVuZGVyIHRlc3QgY29tcG9uZW50OiBcIiArXG4gICAgICAgIFwid2luZG93LmN1c3RvbUVsZW1lbnRzIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhpcyBlbnZpcm9ubWVudC5cIixcbiAgICApO1xuICB9XG5cbiAgY29uc3QgdXNlVGFnbmFtZSA9XG4gICAgY29tcG9uZW50LnRhZ05hbWUgPT09IFwiXCIgPyByYW5kb21UYWdOYW1lKCkgOiBjb21wb25lbnQudGFnTmFtZTtcblxuICAvLyBSZWFzc2lnbiB0aGUgdGFnbmFtZSBiYWNrIHRvIHRoZSBjb21wb25lbnQgdG8gZW5zdXJlIGl0IGlzIHNldCBiZWZvcmUgcmVnaXN0cmF0aW9uXG4gIGNvbXBvbmVudC50YWdOYW1lID0gdXNlVGFnbmFtZTtcblxuICAvLyBSZWdpc3RlciB0aGUgY29tcG9uZW50IGlmIG5lZWQgYmVcbiAgaWYgKCFjdXN0b21FbGVtZW50cy5nZXQodXNlVGFnbmFtZSkpIHtcbiAgICBjdXN0b21FbGVtZW50cy5kZWZpbmUoXG4gICAgICB1c2VUYWduYW1lLFxuICAgICAgY29tcG9uZW50IGFzIHVua25vd24gYXMgQ3VzdG9tRWxlbWVudENvbnN0cnVjdG9yLFxuICAgICk7XG4gIH1cblxuICAvLyBDb25zdHJ1Y3QgYSB0ZXN0IGluc3RhbmNlXG4gIGNvbnN0ICRjb21wb25lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGNvbXBvbmVudC50YWdOYW1lKTtcblxuICAvLyBBcHBseSBhdHRyaWJ1dGVzIGJlZm9yZSByZW5kZXJpbmdcbiAgYXBwbHlFbGVtZW50QXR0cmlidXRlcygkY29tcG9uZW50LCBhdHRyaWJ1dGVzID8/IHt9KTtcblxuICAvLyBSZW5kZXIgYW5kIGF3YWl0IHRvIGFsbG93IG1pY3JvdGFza3MgdG8gc2V0dGxlXG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kKCRjb21wb25lbnQpO1xuICBhd2FpdCBCdW4uc2xlZXAoMSk7XG5cbiAgLy8gUmV0dXJuIHRoZSByZW5kZXJlZCBpbnN0YW5jZVxuICByZXR1cm4gJGNvbXBvbmVudCBhcyBJbnN0YW5jZVR5cGU8RT47XG59XG5cbi8qKlxuICogRm9yY2UgYSByZW5kZXIgb24gdGhlIHRhcmdldCBlbGVtZW50XG4gKlxuICogUmV0dXJucyBhIHByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgd2hlbiB0aGUgcmVuZGVyIGhhcyBjb21wbGV0ZWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcmVuZGVyVGVzdENvbXBvbmVudChlbGVtZW50OiBDb21wb25lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgZWxlbWVudC5yZW5kZXIoKTtcbiAgYXdhaXQgQnVuLnNsZWVwKDEpO1xufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7QUFPQTtBQUtBLGVBQXNCLG9CQUFvQixHQUFrQjtBQUFBLEVBQzFELE1BQU0scUJBQXFCO0FBQUEsRUFDM0Isa0JBQWtCLFNBQVM7QUFBQTtBQU03QixlQUFzQixvQkFBb0IsR0FBa0I7QUFBQSxFQUMxRCxJQUFJLE9BQU8sYUFBYSxhQUFhO0FBQUEsSUFDbkMsT0FBTyxTQUFTLFlBQVk7QUFBQSxNQUMxQixTQUFTLFlBQVksU0FBUyxVQUFVO0FBQUEsSUFDMUM7QUFBQSxFQUNGO0FBQUEsRUFFQSxNQUFNLElBQUksTUFBTSxDQUFDO0FBQUEsRUFFakIsSUFBSSxrQkFBa0IsY0FBYztBQUFBLElBQ2xDLGtCQUFrQixXQUFXO0FBQUEsRUFDL0I7QUFBQTs7QUN6QkssU0FBUyxrQkFBa0IsQ0FBQyxPQUErQjtBQUFBLEVBQ2hFLElBQUksT0FBTyxVQUFVLFlBQVksT0FBTyxVQUFVLFVBQVU7QUFBQSxJQUMxRCxPQUFPLEdBQUc7QUFBQSxFQUNaO0FBQUEsRUFFQSxJQUFJLFVBQVUsTUFBTTtBQUFBLElBQ2xCLE9BQU87QUFBQSxFQUNUO0FBQUEsRUFFQSxJQUFJLFVBQVUsUUFBUSxVQUFVLFNBQVMsVUFBVSxXQUFXO0FBQUEsSUFDNUQsT0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUVBLE9BQU8sTUFBTSxTQUFTO0FBQUE7QUFHakIsU0FBUyxjQUFjLENBQzVCLFNBQ0EsTUFDQSxPQUNNO0FBQUEsRUFDTixJQUFJLFVBQVUsTUFBTTtBQUFBLElBQ2xCLFFBQVEsZ0JBQWdCLElBQUk7QUFBQSxFQUM5QixFQUFPO0FBQUEsSUFDTCxRQUFRLGFBQWEsTUFBTSxLQUFLO0FBQUE7QUFBQTtBQWdCN0IsU0FBUyxzQkFBc0IsQ0FDcEMsUUFDQSxPQUNNO0FBQUEsRUFDTixNQUFNLGVBQWUsSUFBSSxJQUFJLE9BQU8sa0JBQWtCLENBQUM7QUFBQSxFQUN2RCxNQUFNLGdCQUFnQixJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssQ0FBQztBQUFBLEVBQ2hELE1BQU0scUJBQXFCLGFBQWEsV0FBVyxhQUFhO0FBQUEsRUFFaEUsV0FBVyxRQUFRLG9CQUFvQjtBQUFBLElBQ3JDLE9BQU8sZ0JBQWdCLElBQUk7QUFBQSxFQUM3QjtBQUFBLEVBRUEsWUFBWSxNQUFNLFFBQVEsT0FBTyxRQUFRLEtBQUssR0FBRztBQUFBLElBQy9DLGVBQWUsUUFBUSxNQUFNLG1CQUFtQixHQUFHLENBQUM7QUFBQSxFQUN0RDtBQUFBOztBQ3BCSyxNQUFNLFNBQWU7QUFBQSxFQUNsQjtBQUFBLEVBQ0E7QUFBQSxFQUNBLFdBQW9CLEVBQUUsTUFBTSxHQUFHLFFBQVEsRUFBRTtBQUFBLEVBRWpELFdBQVcsQ0FBQyxVQUFrQixLQUFLO0FBQUEsSUFDakMsSUFBSSxXQUFXLEdBQUc7QUFBQSxNQUNoQixNQUFNLElBQUksTUFBTSxpQ0FBaUM7QUFBQSxJQUNuRDtBQUFBLElBRUEsSUFBSSxNQUFTO0FBQUEsTUFDWCxLQUFLLFdBQVcsRUFBRSxNQUFNLEdBQUcsUUFBUSxFQUFFO0FBQUEsSUFDdkM7QUFBQSxJQUVBLEtBQUssV0FBVztBQUFBLElBQ2hCLEtBQUssUUFBUSxJQUFJO0FBQUE7QUFBQSxFQUdYLFFBQVEsTUFBTTtBQUFBLElBQ3BCLE9BQU8sS0FBSyxNQUFNLE9BQU8sS0FBSyxVQUFVO0FBQUEsTUFDdEMsTUFBTSxXQUFXLEtBQUssTUFBTSxLQUFLLEVBQUUsS0FBSyxFQUFFO0FBQUEsTUFDMUMsSUFBSSxhQUFhLFdBQVc7QUFBQSxRQUMxQixNQUFNLElBQUksTUFBTSxRQUFRO0FBQUEsTUFDMUI7QUFBQSxNQUNBLEtBQUssTUFBTSxPQUFPLFFBQVE7QUFBQSxJQUM1QjtBQUFBO0FBQUEsRUFZRixVQUFVLEdBQTJCO0FBQUEsSUFDbkMsSUFBSSxNQUFTO0FBQUEsTUFDWCxRQUFRLE9BQU8sR0FBRyxTQUFTLE1BQU0sS0FBSyxZQUFZLENBQUM7QUFBQSxNQUNuRCxNQUFNLFVBQVUsT0FBTztBQUFBLE1BQ3ZCLE1BQU0sVUFBVSxZQUFZLElBQUksSUFBSSxPQUFPO0FBQUEsTUFFM0MsT0FBTztBQUFBLFFBQ0w7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0EsVUFBVSxLQUFLO0FBQUEsUUFDZixTQUFTLEtBQUssTUFBTTtBQUFBLFFBQ3BCO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQTtBQUFBLEVBUUYsY0FBYyxDQUFDLFlBQTBCO0FBQUEsSUFDdkMsSUFBSSxXQUFXLEtBQUssTUFBUztBQUFBLE1BQzNCLFFBQVEsS0FDTiw0REFDRjtBQUFBLElBQ0Y7QUFBQSxJQUVBLEtBQUssV0FBVztBQUFBLElBQ2hCLEtBQUssTUFBTTtBQUFBO0FBQUEsRUFNYixHQUFHLENBQUMsS0FBdUI7QUFBQSxJQUN6QixNQUFNLFFBQVEsS0FBSyxNQUFNLElBQUksR0FBRztBQUFBLElBRWhDLElBQUksVUFBVSxXQUFXO0FBQUEsTUFDdkIsSUFBSSxNQUFTO0FBQUEsUUFDWCxLQUFLLFNBQVMsVUFBVTtBQUFBLE1BQzFCO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFBQSxJQUdBLEtBQUssTUFBTSxPQUFPLEdBQUc7QUFBQSxJQUNyQixLQUFLLE1BQU0sSUFBSSxLQUFLLEtBQUs7QUFBQSxJQUV6QixJQUFJLE1BQVM7QUFBQSxNQUNYLEtBQUssU0FBUyxRQUFRO0FBQUEsSUFDeEI7QUFBQSxJQUVBLE9BQU87QUFBQTtBQUFBLEVBT1QsR0FBRyxDQUFDLEtBQVEsT0FBZ0I7QUFBQSxJQUUxQixJQUFJLEtBQUssTUFBTSxJQUFJLEdBQUcsR0FBRztBQUFBLE1BQ3ZCLEtBQUssTUFBTSxPQUFPLEdBQUc7QUFBQSxJQUN2QjtBQUFBLElBRUEsS0FBSyxNQUFNLElBQUksS0FBSyxLQUFLO0FBQUEsSUFFekIsSUFBSSxLQUFLLE1BQU0sT0FBTyxLQUFLLFVBQVU7QUFBQSxNQUNuQyxLQUFLLE1BQU07QUFBQSxJQUNiO0FBQUE7QUFBQSxFQU1GLEtBQUssR0FBUztBQUFBLElBQ1osS0FBSyxNQUFNLE1BQU07QUFBQTtBQUFBLE1BTWYsSUFBSSxHQUFXO0FBQUEsSUFDakIsT0FBTyxLQUFLLE1BQU07QUFBQTtBQUV0QjtBQUVBLElBQWU7OztBQy9KUixJQUFNLGdCQUFnQixJQUFJOztBQ0cxQixJQUFNLGdCQUFnQixNQUFNO0FBQUEsRUFDakMsTUFBTSxLQUFLLE9BQU8sV0FBVyxFQUFFLFdBQVcsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEVBQUU7QUFBQSxFQUM5RCxPQUFPLGdCQUFnQjtBQUFBOzs7QUN5QnpCLGVBQXNCLG1CQUFvRCxDQUN4RSxXQUNBLGFBQzBCO0FBQUEsRUFFMUIsSUFDRSxPQUFPLFdBQVcsZUFDbEIsT0FBTyxPQUFPLG1CQUFtQixhQUNqQztBQUFBLElBQ0EsTUFBTSxJQUFJLE1BQ1Isc0NBQ0UsNkRBQ0o7QUFBQSxFQUNGO0FBQUEsRUFFQSxNQUFNLGFBQ0osVUFBVSxZQUFZLEtBQUssY0FBYyxJQUFJLFVBQVU7QUFBQSxFQUd6RCxVQUFVLFVBQVU7QUFBQSxFQUdwQixJQUFJLENBQUMsZUFBZSxJQUFJLFVBQVUsR0FBRztBQUFBLElBQ25DLGVBQWUsT0FDYixZQUNBLFNBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFHQSxNQUFNLGFBQWEsU0FBUyxjQUFjLFVBQVUsT0FBTztBQUFBLEVBRzNELHVCQUF1QixZQUFZLGVBQWMsQ0FBQyxDQUFDO0FBQUEsRUFHbkQsU0FBUyxLQUFLLE9BQU8sVUFBVTtBQUFBLEVBQy9CLE1BQU0sSUFBSSxNQUFNLENBQUM7QUFBQSxFQUdqQixPQUFPO0FBQUE7QUFRVCxlQUFzQixxQkFBcUIsQ0FBQyxTQUFtQztBQUFBLEVBQzdFLFFBQVEsT0FBTztBQUFBLEVBQ2YsTUFBTSxJQUFJLE1BQU0sQ0FBQztBQUFBOyIsCiAgImRlYnVnSWQiOiAiNjU1MDA3MERDRkMyQUEyODY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
|