exacturi 1.0.0 → 1.0.1

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 (67) hide show
  1. package/README.md +1 -0
  2. package/dist/cjs/errors.d.ts.map +1 -1
  3. package/dist/cjs/errors.js.map +1 -1
  4. package/dist/cjs/exacturi.d.ts +10 -13
  5. package/dist/cjs/exacturi.d.ts.map +1 -1
  6. package/dist/cjs/exacturi.js +10 -13
  7. package/dist/cjs/exacturi.js.map +1 -1
  8. package/dist/cjs/index.d.ts +6 -4
  9. package/dist/cjs/index.d.ts.map +1 -1
  10. package/dist/cjs/index.js +1 -0
  11. package/dist/cjs/index.js.map +1 -1
  12. package/dist/cjs/package.json +1 -0
  13. package/dist/cjs/parts.d.ts +1 -3
  14. package/dist/cjs/parts.d.ts.map +1 -1
  15. package/dist/cjs/utils.js.map +1 -1
  16. package/dist/esm/errors.d.ts.map +1 -1
  17. package/dist/esm/errors.js.map +1 -1
  18. package/dist/esm/exacturi.d.ts +10 -13
  19. package/dist/esm/exacturi.d.ts.map +1 -1
  20. package/dist/esm/exacturi.js +10 -13
  21. package/dist/esm/exacturi.js.map +1 -1
  22. package/dist/esm/index.d.ts +6 -4
  23. package/dist/esm/index.d.ts.map +1 -1
  24. package/dist/esm/index.js +1 -0
  25. package/dist/esm/index.js.map +1 -1
  26. package/dist/esm/package.json +1 -0
  27. package/dist/esm/parts.d.ts +1 -3
  28. package/dist/esm/parts.d.ts.map +1 -1
  29. package/dist/esm/utils.js.map +1 -1
  30. package/package.json +3 -3
  31. package/src/errors.ts +8 -8
  32. package/src/exacturi.ts +158 -161
  33. package/src/index.ts +15 -13
  34. package/src/parts.ts +10 -12
  35. package/src/utils.ts +16 -16
  36. package/dist/cjs/reuri.d.ts +0 -92
  37. package/dist/cjs/reuri.d.ts.map +0 -1
  38. package/dist/cjs/reuri.js +0 -345
  39. package/dist/cjs/reuri.js.map +0 -1
  40. package/dist/esm/reuri.d.ts +0 -92
  41. package/dist/esm/reuri.d.ts.map +0 -1
  42. package/dist/esm/reuri.js +0 -341
  43. package/dist/esm/reuri.js.map +0 -1
  44. package/dist/lib/errors.d.ts +0 -14
  45. package/dist/lib/errors.d.ts.map +0 -1
  46. package/dist/lib/errors.js +0 -52
  47. package/dist/lib/index.d.ts +0 -31
  48. package/dist/lib/index.d.ts.map +0 -1
  49. package/dist/lib/index.js +0 -20
  50. package/dist/lib/parts.d.ts +0 -18
  51. package/dist/lib/parts.d.ts.map +0 -1
  52. package/dist/lib/parts.js +0 -3
  53. package/dist/lib/payload.d.ts +0 -17
  54. package/dist/lib/payload.d.ts.map +0 -1
  55. package/dist/lib/payload.js +0 -126
  56. package/dist/lib/reuri.d.ts +0 -127
  57. package/dist/lib/reuri.d.ts.map +0 -1
  58. package/dist/lib/reuri.js +0 -457
  59. package/dist/lib/utils.d.ts +0 -2
  60. package/dist/lib/utils.d.ts.map +0 -1
  61. package/dist/lib/utils.js +0 -26
  62. package/dist/test/basic.test.js +0 -319
  63. package/dist/test/basic.test.js.map +0 -1
  64. package/dist/test/extras.test.js +0 -77
  65. package/dist/test/extras.test.js.map +0 -1
  66. package/dist/test/matching.test.js +0 -80
  67. package/dist/test/matching.test.js.map +0 -1
package/dist/lib/reuri.js DELETED
@@ -1,457 +0,0 @@
1
- "use strict";
2
- var _a;
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.ReUri = exports.DEBUG = void 0;
5
- const errors_js_1 = require("./errors.js");
6
- const utils_js_1 = require("./utils.js");
7
- const types_1 = require("@reflectiz/types");
8
- const payload_1 = require("./payload");
9
- exports.DEBUG = Symbol("debug");
10
- /**
11
- * Represents a URI and allows performing operations and inspecting it.
12
- *
13
- * This class is immutable.
14
- */
15
- class ReUri {
16
- // Lots of params needed here
17
- // eslint-disable-next-line max-params
18
- constructor(_protocol, _hostname, _path, _query, _hash, _payload, _trace, _parsed, _port) {
19
- this._protocol = _protocol;
20
- this._hostname = _hostname;
21
- this._path = _path;
22
- this._query = _query;
23
- this._hash = _hash;
24
- this._payload = _payload;
25
- this._trace = _trace;
26
- this._parsed = _parsed;
27
- this._port = _port;
28
- if (_hostname) {
29
- this._hostname = _hostname.replace("_", ".");
30
- if (this._hostname.includes("_")) {
31
- console.warn(`The hostname contains multiple underscores, which might not be intended. Current hostname: ${this._hostname}`);
32
- }
33
- }
34
- this[0] = this._print(false);
35
- }
36
- static isReuri(other) {
37
- return !!(other &&
38
- typeof other === "object" &&
39
- other.constructor &&
40
- "__isReuri" in other.constructor);
41
- }
42
- segments(overwrite) {
43
- if (arguments.length === 0) {
44
- return this._path.split("/");
45
- }
46
- const clone = this._noCopyClone();
47
- clone._path = overwrite.join("/");
48
- return clone;
49
- }
50
- merge(other) {
51
- if (typeof other === "string") {
52
- return this.merge(ReUri.parse(other));
53
- }
54
- const mergedParts = {
55
- hash: other._hash || this._hash,
56
- hostname: other._hostname || this._hostname,
57
- path: other._path || this._path,
58
- port: other._port || this._port,
59
- protocol: other._protocol || this._protocol,
60
- query: other._query || this._query,
61
- trace: other._trace || this._trace
62
- };
63
- return this.parts(mergedParts).payloadMerge(other.payload()).trace(other.trace());
64
- }
65
- pick(...keys) {
66
- let result = ReUri.empty();
67
- for (const key of keys) {
68
- result = result.part(key, this.part(key));
69
- }
70
- return result;
71
- }
72
- parts(overwrite) {
73
- if (arguments.length === 0) {
74
- return {
75
- protocol: this._protocol,
76
- hostname: this._hostname,
77
- port: this._port,
78
- path: this._path,
79
- query: this._query,
80
- hash: this._hash,
81
- payload: this._payload,
82
- trace: this._trace
83
- };
84
- }
85
- if (!overwrite) {
86
- return this;
87
- }
88
- const clone = this._noCopyClone();
89
- clone._protocol = "protocol" in overwrite ? overwrite.protocol : clone._protocol;
90
- clone._hostname = "hostname" in overwrite ? overwrite.hostname : clone._hostname;
91
- clone._port = "port" in overwrite ? overwrite.port : clone._port;
92
- clone._path = "path" in overwrite ? overwrite.path : clone._path;
93
- clone._query = "query" in overwrite ? overwrite.query : clone._query;
94
- clone._hash = "hash" in overwrite ? overwrite.hash : clone._hash;
95
- clone._payload = "payload" in overwrite ? overwrite.payload : clone._payload;
96
- clone._trace = "trace" in overwrite ? overwrite.trace : clone._trace;
97
- return clone;
98
- }
99
- part(key, value) {
100
- if (arguments.length === 1) {
101
- const result = this[key]();
102
- return typeof result === "object" ? result : (0, types_1.str)(result);
103
- }
104
- return this[key](value);
105
- }
106
- address(address) {
107
- if (arguments.length === 1) {
108
- const parsed = ReUri.parse(address);
109
- return parsed.parts({
110
- protocol: this._protocol
111
- });
112
- }
113
- return this.parts({
114
- protocol: undefined
115
- }).href;
116
- }
117
- resource(resource) {
118
- if (arguments.length === 1) {
119
- const parsed = ReUri.parse(resource);
120
- return parsed.parts({
121
- protocol: this._protocol,
122
- hostname: this._hostname,
123
- port: this._port
124
- });
125
- }
126
- return this.parts({
127
- protocol: undefined,
128
- hostname: undefined,
129
- port: undefined
130
- }).href;
131
- }
132
- origin(origin) {
133
- if (arguments.length === 1) {
134
- const parsed = ReUri.parse(origin);
135
- return this.parts({
136
- protocol: parsed._protocol,
137
- hostname: parsed._hostname,
138
- port: parsed._port
139
- });
140
- }
141
- const parts = this.parts();
142
- return (ReUri.empty().parts({
143
- protocol: parts.protocol,
144
- hostname: parts.hostname,
145
- port: parts.port
146
- }).href || undefined);
147
- }
148
- segment(index, value) {
149
- if (arguments.length === 0) {
150
- throw new errors_js_1.ReUriError(`You must provide an index.`);
151
- }
152
- if (arguments.length === 1) {
153
- return this._path.split("/")[index];
154
- }
155
- const segments = this.segments();
156
- segments[index] = value;
157
- return this.segments(segments);
158
- }
159
- path(path) {
160
- if (arguments.length === 0) {
161
- return this._path;
162
- }
163
- const clone = this._noCopyClone();
164
- clone._path = path ?? "";
165
- return clone;
166
- }
167
- port(port) {
168
- if (arguments.length === 0) {
169
- return (0, types_1.int)(this._port);
170
- }
171
- if (port === true) {
172
- return this._port;
173
- }
174
- const clone = this._noCopyClone();
175
- clone._port = (0, types_1.str)(port) ?? undefined;
176
- return clone;
177
- }
178
- protocol(proto) {
179
- if (arguments.length === 0) {
180
- return this._protocol;
181
- }
182
- const clone = this._noCopyClone();
183
- clone._protocol = proto ?? undefined;
184
- return clone;
185
- }
186
- host(host) {
187
- if (arguments.length === 0) {
188
- return (ReUri.empty().hostname(this._hostname).port(this._port).href.slice(2) || undefined);
189
- }
190
- if (host == null) {
191
- return this.hostname(null).port(null);
192
- }
193
- const parsed = ReUri.parse(`//${host}`);
194
- return this.hostname(parsed._hostname).port(parsed._port);
195
- }
196
- hostname(hostname) {
197
- if (arguments.length === 0) {
198
- return this._hostname;
199
- }
200
- const clone = this._noCopyClone();
201
- clone._hostname = hostname ?? undefined;
202
- return clone;
203
- }
204
- query(query) {
205
- if (arguments.length === 0) {
206
- return this._query;
207
- }
208
- const clone = this._noCopyClone();
209
- clone._query = query ?? undefined;
210
- return clone;
211
- }
212
- hash(hash) {
213
- if (arguments.length === 0) {
214
- return this._hash;
215
- }
216
- const clone = this._noCopyClone();
217
- clone._hash = hash ?? undefined;
218
- return clone;
219
- }
220
- _getEncodedPath(skipPayload = false) {
221
- if (skipPayload) {
222
- return this._path;
223
- }
224
- return (0, payload_1.getEncodedPath)(this._path, this._payload, this._trace);
225
- }
226
- _noCopyClone() {
227
- return new ReUri(this._protocol, this._hostname, this._path, this._query, this._hash, this._payload, this._trace, this._parsed, this._port);
228
- }
229
- // Does this URL have a web protocol?
230
- get isWeb() {
231
- return !!this._protocol && webProtocols.has(this._protocol);
232
- }
233
- /**
234
- * Gets a clone of this instance. The payload is also cloned.
235
- */
236
- clone() {
237
- return new ReUri(this._protocol, this._hostname, this._path, this._query, this._hash, this._payload && { ...this._payload }, this._trace && { ...this._trace }, this._parsed, this._port);
238
- }
239
- static empty(payload) {
240
- return new ReUri(undefined, undefined, "", undefined, undefined, payload, undefined, undefined, undefined);
241
- }
242
- static parse(input) {
243
- if (input == null) {
244
- return ReUri.empty();
245
- }
246
- if (input instanceof ReUri) {
247
- return input;
248
- }
249
- if (typeof input === "object") {
250
- return ReUri.empty().parts(input);
251
- }
252
- if (typeof input !== "string") {
253
- throw (0, errors_js_1.inputMustBeString)(input);
254
- }
255
- const r = urlRegexp.exec(input);
256
- if (!r) {
257
- throw (0, errors_js_1.inputMustBeUrl)(input);
258
- }
259
- let [, proto, hostname, port, pathWithPayload, query, fragment] = r;
260
- if (port != null && (Number.isNaN(+port) || port === "")) {
261
- throw (0, errors_js_1.portMustBeNumeric)(input);
262
- }
263
- let { payload, tracePayload, path } = (0, payload_1.extractPayload)(pathWithPayload);
264
- const somePayload = payload || tracePayload;
265
- if (somePayload?.__trim) {
266
- // This will only be set if the path is fake and only created for the payload
267
- path = "";
268
- delete somePayload.__trim;
269
- }
270
- if (somePayload) {
271
- hostname = hostname?.replace(/_([^.]*)$/, ".$1");
272
- }
273
- return new ReUri(proto?.trim(), hostname?.trim(), path?.trim(), query?.trim(), fragment?.trim(), payload, tracePayload, input, port);
274
- }
275
- payloadMerge(more) {
276
- const payload = Object.assign({}, this._payload, more);
277
- return this.payload(payload);
278
- }
279
- trace(something) {
280
- if (arguments.length === 0) {
281
- return (this._trace && {
282
- ...this._trace
283
- });
284
- }
285
- if (something == null) {
286
- return this;
287
- }
288
- (0, errors_js_1.payloadMustBeObject)(something);
289
- const tracePayload = something instanceof ReUri ? something.trace() : something;
290
- (0, payload_1.mustValidatePayload)(tracePayload);
291
- const clone = this._noCopyClone();
292
- clone._trace = {
293
- ...this._trace,
294
- ...tracePayload
295
- };
296
- return clone;
297
- }
298
- /**
299
- * Checks if this URI (CHILD) matches another URI (PARENT). The parent can be a string,
300
- * a {@link ReUri} or, or an object describing the parts of a URI -- a {@link ReUriParts}.
301
- *
302
- * CHILD is considered to be a child of PARENT if:
303
- * 1. If PARENT has a protocol, it must equal CHILD protocol.
304
- * 2. If PARENT has a hostname, it must be a parent of CHILD's hostname.
305
- * 3. If PARENT has a port, it must equal CHILD's port.
306
- * 4. If PARENT has a path, it must be a parent of CHILD's path.
307
- * 5. If PARENT has a query, it must equal CHILD's query.
308
- * 6. If PARENT has a hash, it must equal CHILD's hash.
309
- * 7. If PARENT has a payload, its properties must match CHILD's payload.
310
- * 8. The trace payload is ignored.
311
- * @param parent The parent URI to check against.
312
- *
313
- */
314
- matches(parent) {
315
- parent = ReUri.parse(parent);
316
- if (parent._protocol && parent._protocol !== this._protocol) {
317
- return false;
318
- }
319
- if (parent._hostname && !(0, payload_1.hostnameContains)(this._hostname, parent._hostname)) {
320
- return false;
321
- }
322
- if (parent._port && parent._port !== this._port) {
323
- return false;
324
- }
325
- if (parent._query && parent._query !== this._query) {
326
- return false;
327
- }
328
- if (parent._hash && parent._hash !== this._hash) {
329
- return false;
330
- }
331
- if (parent._payload && !(0, payload_1.payloadContains)(this._payload, parent._payload)) {
332
- return false;
333
- }
334
- const parentSegments = parent.segments();
335
- const childSegments = this.segments();
336
- for (let i = 0; i < parentSegments.length; i++) {
337
- if (parentSegments[i] !== childSegments[i]) {
338
- return false;
339
- }
340
- }
341
- return true;
342
- }
343
- /**
344
- * Checks if this URI equals another URI, which can be given as a string, a {@link ReUri} or, or an object describing the parts of a URI -- a
345
- * {@link ReUriParts}.
346
- * @param other The other URI to check against.
347
- * @param skipPayload If true, the payload is ignored.
348
- */
349
- equal(other, skipPayload = false) {
350
- if (this === other) {
351
- return true;
352
- }
353
- other = ReUri.parse(other);
354
- const myParts = this.parts();
355
- const otherParts = other.parts();
356
- for (const key of ["protocol", "hostname", "port", "path", "query", "hash"]) {
357
- if (myParts[key] !== otherParts[key]) {
358
- return false;
359
- }
360
- }
361
- if (skipPayload) {
362
- return true;
363
- }
364
- if (!this._payload || !other._payload) {
365
- return this._payload === other._payload;
366
- }
367
- return (0, utils_js_1.equal)(this._payload, other._payload);
368
- }
369
- // An artificial URI is one that can't have been parsed from a string due to an invalid combination of components. For example,
370
- // 1. A URL with a port but no hostname.
371
- // 2. A URL with a hostname but no protocol.
372
- // 3. A URL with
373
- get isArtificial() {
374
- return !ReUri.parse(this._print(true)).equal(this, true);
375
- }
376
- payload(something) {
377
- if (arguments.length === 0) {
378
- return (this._payload && {
379
- ...this._payload
380
- });
381
- }
382
- if (this._protocol === "data") {
383
- return this;
384
- }
385
- let payload;
386
- payload = something instanceof ReUri ? something.payload() : something;
387
- if (payload == null) {
388
- payload = undefined;
389
- }
390
- else {
391
- (0, errors_js_1.payloadMustBeObject)(something);
392
- (0, payload_1.mustValidatePayload)(payload);
393
- }
394
- const clone = this._noCopyClone();
395
- clone._payload = payload && {
396
- ...payload
397
- };
398
- return clone;
399
- }
400
- _print(skipPayload = false) {
401
- let { _protocol, _hostname, _query, _hash, _port } = this;
402
- const somePayload = this._payload || this._trace;
403
- skipPayload = skipPayload || ReUri[exports.DEBUG].dontEncodePayloads || false;
404
- // If we have a payload, we need to mangle the hostname so payloaded requests don't get sent out to servers.
405
- if (somePayload && _hostname != null && !skipPayload && !ReUri[exports.DEBUG].dontEncodePayloads) {
406
- _hostname = _hostname.replace(/\.([^.]*)$/, "_$1");
407
- }
408
- _protocol = _protocol != null ? `${_protocol}:` : _protocol;
409
- _hostname = _hostname != null ? `//${_hostname}` : "";
410
- _query = _query != null ? `?${_query}` : "";
411
- _hash = _hash != null ? `#${_hash}` : "";
412
- const strPort = _port != null ? `:${_port}` : "";
413
- const path = this._getEncodedPath(skipPayload);
414
- return [_protocol, _hostname, strPort, path, _query, _hash].join("");
415
- }
416
- /**
417
- * Is this a fake URL generated by reflectiz?
418
- */
419
- get isReflectiz() {
420
- return !!this._protocol && riProtocols.has(this._protocol);
421
- }
422
- /**
423
- * Does this URL have a non-web protocol?
424
- */
425
- get isNonWeb() {
426
- return !!this._protocol && !webProtocols.has(this._protocol);
427
- }
428
- /**
429
- * Gets the full URI, including the payload.
430
- */
431
- get href() {
432
- return this._print(false);
433
- }
434
- /**
435
- * Gets the full URI, minus the payload.
436
- */
437
- get canonical() {
438
- return this._print(true);
439
- }
440
- get [(_a = exports.DEBUG, Symbol.toStringTag)]() {
441
- return this.href;
442
- }
443
- toString() {
444
- return this.href;
445
- }
446
- }
447
- exports.ReUri = ReUri;
448
- ReUri[_a] = {
449
- dontEncodePayloads: false
450
- };
451
- const urlRegexp = /^(?:([a-zA-Z][A-Za-z\d+-.]*):)?(?:\/\/([^/?#:]*)(?::([^/?#]*))?)?([^?#]*)?(?:\?([^#]*))?(?:#(.*))?$/;
452
- const webProtocols = new Set(["http", "ws", "https", "wss"]);
453
- const riProtocols = new Set(["inline", "dynamic", "reflectiz"]);
454
- Object.defineProperty(ReUri, "__isReuri", {
455
- value: true
456
- });
457
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV1cmkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL3JldXJpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSwyQ0FNcUI7QUFDckIseUNBQW1DO0FBQ25DLDRDQUE0QztBQUM1Qyx1Q0FRbUI7QUFPTixRQUFBLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7QUFFckM7Ozs7R0FJRztBQUNILE1BQWEsS0FBSztJQUtkLDZCQUE2QjtJQUM3QixzQ0FBc0M7SUFDdEMsWUFDWSxTQUErQixFQUMvQixTQUE2QixFQUM3QixLQUFhLEVBQ2IsTUFBMEIsRUFDMUIsS0FBeUIsRUFDekIsUUFBYyxFQUNkLE1BQTJCLEVBQzNCLE9BQTJCLEVBQzNCLEtBQXlCO1FBUnpCLGNBQVMsR0FBVCxTQUFTLENBQXNCO1FBQy9CLGNBQVMsR0FBVCxTQUFTLENBQW9CO1FBQzdCLFVBQUssR0FBTCxLQUFLLENBQVE7UUFDYixXQUFNLEdBQU4sTUFBTSxDQUFvQjtRQUMxQixVQUFLLEdBQUwsS0FBSyxDQUFvQjtRQUN6QixhQUFRLEdBQVIsUUFBUSxDQUFNO1FBQ2QsV0FBTSxHQUFOLE1BQU0sQ0FBcUI7UUFDM0IsWUFBTyxHQUFQLE9BQU8sQ0FBb0I7UUFDM0IsVUFBSyxHQUFMLEtBQUssQ0FBb0I7UUFFakMsSUFBSSxTQUFTLEVBQUU7WUFDWCxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzdDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzlCLE9BQU8sQ0FBQyxJQUFJLENBQ1IsOEZBQThGLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FDakgsQ0FBQzthQUNMO1NBQ0o7UUFFRCxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFjO1FBQ3pCLE9BQU8sQ0FBQyxDQUFDLENBQ0wsS0FBSztZQUNMLE9BQU8sS0FBSyxLQUFLLFFBQVE7WUFDekIsS0FBSyxDQUFDLFdBQVc7WUFDakIsV0FBVyxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQ25DLENBQUM7SUFDTixDQUFDO0lBSUQsUUFBUSxDQUFDLFNBQW9CO1FBQ3pCLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDeEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNoQztRQUNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNsQyxLQUFLLENBQUMsS0FBSyxHQUFHLFNBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkMsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUlELEtBQUssQ0FBQyxLQUEwQjtRQUM1QixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtZQUMzQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQ3pDO1FBQ0QsTUFBTSxXQUFXLEdBQWU7WUFDNUIsSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUs7WUFDL0IsUUFBUSxFQUFFLEtBQUssQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVM7WUFDM0MsSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUs7WUFDL0IsSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUs7WUFDL0IsUUFBUSxFQUFFLEtBQUssQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVM7WUFDM0MsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU07WUFDbEMsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU07U0FDckMsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUFFRCxJQUFJLENBQUMsR0FBRyxJQUFvQjtRQUN4QixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFpQixDQUFDO1FBQzFDLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFO1lBQ3BCLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQXlCLENBQUMsQ0FBQyxDQUFDO1NBQ25FO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQU1ELEtBQUssQ0FBQyxTQUF3QztRQUMxQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3hCLE9BQU87Z0JBQ0gsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTO2dCQUN4QixRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVM7Z0JBQ3hCLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSztnQkFDaEIsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUNoQixLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU07Z0JBQ2xCLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSztnQkFDaEIsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRO2dCQUN0QixLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU07YUFDckIsQ0FBQztTQUNMO1FBQ0QsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNaLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbEMsS0FBSyxDQUFDLFNBQVMsR0FBRyxVQUFVLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDO1FBQ2pGLEtBQUssQ0FBQyxTQUFTLEdBQUcsVUFBVSxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUNqRixLQUFLLENBQUMsS0FBSyxHQUFHLE1BQU0sSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDakUsS0FBSyxDQUFDLEtBQUssR0FBRyxNQUFNLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBRSxTQUFTLENBQUMsSUFBWSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQzFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsT0FBTyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUNyRSxLQUFLLENBQUMsS0FBSyxHQUFHLE1BQU0sSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDakUsS0FBSyxDQUFDLFFBQVEsR0FBRyxTQUFTLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBRSxTQUFTLENBQUMsT0FBZSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQ3RGLEtBQUssQ0FBQyxNQUFNLEdBQUcsT0FBTyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUNyRSxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBUUQsSUFBSSxDQUFDLEdBQWlCLEVBQUUsS0FBK0I7UUFDbkQsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN4QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMzQixPQUFPLE9BQU8sTUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFBLFdBQUcsRUFBQyxNQUFNLENBQUMsQ0FBQztTQUM1RDtRQUNELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQVksQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFJRCxPQUFPLENBQUMsT0FBZ0I7UUFDcEIsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN4QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQVEsQ0FBQyxDQUFDO1lBQ3JDLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQztnQkFDaEIsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTO2FBQzNCLENBQUMsQ0FBQztTQUNOO1FBQ0QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ2QsUUFBUSxFQUFFLFNBQVM7U0FDdEIsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNaLENBQUM7SUFJRCxRQUFRLENBQUMsUUFBaUI7UUFDdEIsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN4QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVMsQ0FBQyxDQUFDO1lBQ3RDLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQztnQkFDaEIsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTO2dCQUN4QixRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVM7Z0JBQ3hCLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSzthQUNuQixDQUFDLENBQUM7U0FDTjtRQUNELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztZQUNkLFFBQVEsRUFBRSxTQUFTO1lBQ25CLFFBQVEsRUFBRSxTQUFTO1lBQ25CLElBQUksRUFBRSxTQUFTO1NBQ2xCLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDWixDQUFDO0lBSUQsTUFBTSxDQUFDLE1BQWU7UUFDbEIsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN4QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU8sQ0FBQyxDQUFDO1lBQ3BDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztnQkFDZCxRQUFRLEVBQUUsTUFBTSxDQUFDLFNBQVM7Z0JBQzFCLFFBQVEsRUFBRSxNQUFNLENBQUMsU0FBUztnQkFDMUIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxLQUFLO2FBQ3JCLENBQUMsQ0FBQztTQUNOO1FBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzNCLE9BQU8sQ0FDSCxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2hCLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtZQUN4QixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7WUFDeEIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO1NBQ25CLENBQUMsQ0FBQyxJQUFJLElBQUksU0FBUyxDQUN2QixDQUFDO0lBQ04sQ0FBQztJQUlELE9BQU8sQ0FBQyxLQUFhLEVBQUUsS0FBYztRQUNqQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3hCLE1BQU0sSUFBSSxzQkFBVSxDQUFDLDRCQUE0QixDQUFDLENBQUM7U0FDdEQ7UUFDRCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3hCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDdkM7UUFDRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDakMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQU0sQ0FBQztRQUN6QixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQU1ELElBQUksQ0FBQyxJQUFhO1FBQ2QsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN4QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7U0FDckI7UUFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbEMsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3pCLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFLRCxJQUFJLENBQUMsSUFBb0M7UUFDckMsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN4QixPQUFPLElBQUEsV0FBRyxFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMxQjtRQUNELElBQUksSUFBSSxLQUFLLElBQUksRUFBRTtZQUNmLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztTQUNyQjtRQUNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNsQyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUEsV0FBRyxFQUFDLElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FBQztRQUNyQyxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBTUQsUUFBUSxDQUFDLEtBQW1DO1FBQ3hDLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDeEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO1NBQ3pCO1FBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2xDLEtBQUssQ0FBQyxTQUFTLEdBQUcsS0FBSyxJQUFJLFNBQVMsQ0FBQztRQUNyQyxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBTUQsSUFBSSxDQUFDLElBQWE7UUFDZCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3hCLE9BQU8sQ0FDSCxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUNyRixDQUFDO1NBQ0w7UUFDRCxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7WUFDZCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3pDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7UUFDeEMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFNRCxRQUFRLENBQUMsUUFBaUI7UUFDdEIsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN4QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7U0FDekI7UUFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbEMsS0FBSyxDQUFDLFNBQVMsR0FBRyxRQUFRLElBQUksU0FBUyxDQUFDO1FBQ3hDLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFNRCxLQUFLLENBQUMsS0FBYztRQUNoQixJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztTQUN0QjtRQUNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNsQyxLQUFLLENBQUMsTUFBTSxHQUFHLEtBQUssSUFBSSxTQUFTLENBQUM7UUFDbEMsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQU1ELElBQUksQ0FBQyxJQUFhO1FBQ2QsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN4QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7U0FDckI7UUFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbEMsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLElBQUksU0FBUyxDQUFDO1FBQ2hDLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFTyxlQUFlLENBQUMsV0FBVyxHQUFHLEtBQUs7UUFDdkMsSUFBSSxXQUFXLEVBQUU7WUFDYixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7U0FDckI7UUFDRCxPQUFPLElBQUEsd0JBQWMsRUFBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFTyxZQUFZO1FBQ2hCLE9BQU8sSUFBSSxLQUFLLENBQ1osSUFBSSxDQUFDLFNBQVMsRUFDZCxJQUFJLENBQUMsU0FBUyxFQUNkLElBQUksQ0FBQyxLQUFLLEVBQ1YsSUFBSSxDQUFDLE1BQU0sRUFDWCxJQUFJLENBQUMsS0FBSyxFQUNWLElBQUksQ0FBQyxRQUFRLEVBQ2IsSUFBSSxDQUFDLE1BQU0sRUFDWCxJQUFJLENBQUMsT0FBTyxFQUNaLElBQUksQ0FBQyxLQUFLLENBQ2IsQ0FBQztJQUNOLENBQUM7SUFFRCxxQ0FBcUM7SUFDckMsSUFBSSxLQUFLO1FBQ0wsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLO1FBQ0QsT0FBTyxJQUFJLEtBQUssQ0FDWixJQUFJLENBQUMsU0FBUyxFQUNkLElBQUksQ0FBQyxTQUFTLEVBQ2QsSUFBSSxDQUFDLEtBQUssRUFDVixJQUFJLENBQUMsTUFBTSxFQUNYLElBQUksQ0FBQyxLQUFLLEVBQ1YsSUFBSSxDQUFDLFFBQVEsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUNyQyxJQUFJLENBQUMsTUFBTSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQ2pDLElBQUksQ0FBQyxPQUFPLEVBQ1osSUFBSSxDQUFDLEtBQUssQ0FDYixDQUFDO0lBQ04sQ0FBQztJQUlELE1BQU0sQ0FBQyxLQUFLLENBQXVCLE9BQWM7UUFDN0MsT0FBTyxJQUFJLEtBQUssQ0FDWixTQUFTLEVBQ1QsU0FBUyxFQUNULEVBQUUsRUFDRixTQUFTLEVBQ1QsU0FBUyxFQUNULE9BQVEsRUFDUixTQUFTLEVBQ1QsU0FBUyxFQUNULFNBQVMsQ0FDWixDQUFDO0lBQ04sQ0FBQztJQU9ELE1BQU0sQ0FBQyxLQUFLLENBQW1DLEtBQVU7UUFDckQsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO1lBQ2YsT0FBTyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDeEI7UUFDRCxJQUFJLEtBQUssWUFBWSxLQUFLLEVBQUU7WUFDeEIsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFDRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtZQUMzQixPQUFPLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDckM7UUFDRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtZQUMzQixNQUFNLElBQUEsNkJBQWlCLEVBQUMsS0FBSyxDQUFDLENBQUM7U0FDbEM7UUFDRCxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxDQUFDLEVBQUU7WUFDSixNQUFNLElBQUEsMEJBQWMsRUFBQyxLQUFLLENBQUMsQ0FBQztTQUMvQjtRQUVELElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BFLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDLEVBQUU7WUFDdEQsTUFBTSxJQUFBLDZCQUFpQixFQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2xDO1FBQ0QsSUFBSSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBQSx3QkFBYyxFQUFPLGVBQWUsQ0FBQyxDQUFDO1FBQzVFLE1BQU0sV0FBVyxHQUFHLE9BQU8sSUFBSSxZQUFZLENBQUM7UUFDNUMsSUFBSSxXQUFXLEVBQUUsTUFBTSxFQUFFO1lBQ3JCLDZFQUE2RTtZQUM3RSxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ1YsT0FBTyxXQUFXLENBQUMsTUFBTSxDQUFDO1NBQzdCO1FBQ0QsSUFBSSxXQUFXLEVBQUU7WUFDYixRQUFRLEdBQUcsUUFBUSxFQUFFLE9BQU8sQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDcEQ7UUFDRCxPQUFPLElBQUksS0FBSyxDQUNaLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFDYixRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQ2hCLElBQUksRUFBRSxJQUFJLEVBQUUsRUFDWixLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQ2IsUUFBUSxFQUFFLElBQUksRUFBRSxFQUNoQixPQUFRLEVBQ1IsWUFBWSxFQUNaLEtBQUssRUFDTCxJQUFJLENBQ1AsQ0FBQztJQUNOLENBQUM7SUFJRCxZQUFZLENBQWlELElBQVc7UUFDcEUsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN2RCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUtELEtBQUssQ0FBQyxTQUFnQztRQUNsQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3hCLE9BQU8sQ0FDSCxJQUFJLENBQUMsTUFBTSxJQUFJO2dCQUNYLEdBQUcsSUFBSSxDQUFDLE1BQU07YUFDakIsQ0FDSixDQUFDO1NBQ0w7UUFDRCxJQUFJLFNBQVMsSUFBSSxJQUFJLEVBQUU7WUFDbkIsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUNELElBQUEsK0JBQW1CLEVBQUMsU0FBUyxDQUFDLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQUcsU0FBUyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDaEYsSUFBQSw2QkFBbUIsRUFBQyxZQUFZLENBQUMsQ0FBQztRQUNsQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbEMsS0FBSyxDQUFDLE1BQU0sR0FBRztZQUNYLEdBQUcsSUFBSSxDQUFDLE1BQU07WUFDZCxHQUFHLFlBQVk7U0FDbEIsQ0FBQztRQUNGLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7O09BZUc7SUFDSCxPQUFPLENBQ0gsTUFBc0Y7UUFFdEYsTUFBTSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0IsSUFBSSxNQUFNLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUN6RCxPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUNELElBQUksTUFBTSxDQUFDLFNBQVMsSUFBSSxDQUFDLElBQUEsMEJBQWdCLEVBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDekUsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFFRCxJQUFJLE1BQU0sQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQzdDLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBQ0QsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNoRCxPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUNELElBQUksTUFBTSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDN0MsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFBLHlCQUFlLEVBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDckUsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFFRCxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDekMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3RDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzVDLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxLQUFLLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDeEMsT0FBTyxLQUFLLENBQUM7YUFDaEI7U0FDSjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FDRCxLQUFxRixFQUNyRixXQUFXLEdBQUcsS0FBSztRQUVuQixJQUFJLElBQUksS0FBSyxLQUFLLEVBQUU7WUFDaEIsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUNELEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3QixNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakMsS0FBSyxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFVLEVBQUU7WUFDbEYsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNsQyxPQUFPLEtBQUssQ0FBQzthQUNoQjtTQUNKO1FBQ0QsSUFBSSxXQUFXLEVBQUU7WUFDYixPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFO1lBQ25DLE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxLQUFLLENBQUMsUUFBUSxDQUFDO1NBQzNDO1FBQ0QsT0FBTyxJQUFBLGdCQUFLLEVBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELCtIQUErSDtJQUMvSCx3Q0FBd0M7SUFDeEMsNENBQTRDO0lBQzVDLGdCQUFnQjtJQUNoQixJQUFJLFlBQVk7UUFDWixPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBYUQsT0FBTyxDQUFDLFNBQXlFO1FBQzdFLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDeEIsT0FBTyxDQUNILElBQUksQ0FBQyxRQUFRLElBQUk7Z0JBQ2IsR0FBRyxJQUFJLENBQUMsUUFBUTthQUNuQixDQUNKLENBQUM7U0FDTDtRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxNQUFNLEVBQUU7WUFDM0IsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUNELElBQUksT0FBd0IsQ0FBQztRQUM3QixPQUFPLEdBQUcsU0FBUyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDdkUsSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFO1lBQ2pCLE9BQU8sR0FBRyxTQUFTLENBQUM7U0FDdkI7YUFBTTtZQUNILElBQUEsK0JBQW1CLEVBQUMsU0FBUyxDQUFDLENBQUM7WUFDL0IsSUFBQSw2QkFBbUIsRUFBQyxPQUFPLENBQUMsQ0FBQztTQUNoQztRQUNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNsQyxLQUFLLENBQUMsUUFBUSxHQUFHLE9BQU8sSUFBSTtZQUN4QixHQUFHLE9BQU87U0FDYixDQUFDO1FBQ0YsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVPLE1BQU0sQ0FBQyxXQUFXLEdBQUcsS0FBSztRQUM5QixJQUFJLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQztRQUMxRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDakQsV0FBVyxHQUFHLFdBQVcsSUFBSSxLQUFLLENBQUMsYUFBSyxDQUFDLENBQUMsa0JBQWtCLElBQUksS0FBSyxDQUFDO1FBQ3RFLDRHQUE0RztRQUM1RyxJQUFJLFdBQVcsSUFBSSxTQUFTLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQUssQ0FBQyxDQUFDLGtCQUFrQixFQUFFO1lBQ3RGLFNBQVMsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztTQUN0RDtRQUNELFNBQVMsR0FBRyxTQUFTLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDNUQsU0FBUyxHQUFHLFNBQVMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN0RCxNQUFNLEdBQUcsTUFBTSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzVDLEtBQUssR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDekMsTUFBTSxPQUFPLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRWpELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFL0MsT0FBTyxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksV0FBVztRQUNYLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxRQUFRO1FBQ1IsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksSUFBSTtRQUNKLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLFNBQVM7UUFDVCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELElBQUksT0F0bEJhLGFBQUssRUFzbEJqQixNQUFNLENBQUMsV0FBVyxFQUFDO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNyQixDQUFDO0lBRUQsUUFBUTtRQUNKLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNyQixDQUFDOztBQTdsQkwsc0JBOGxCQztBQTdsQm1CLFNBQU8sR0FBc0I7SUFDekMsa0JBQWtCLEVBQUUsS0FBSztDQUM1QixDQUFDO0FBNmxCTixNQUFNLFNBQVMsR0FDWCxxR0FBcUcsQ0FBQztBQUUxRyxNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFFN0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7QUFFaEUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFO0lBQ3RDLEtBQUssRUFBRSxJQUFJO0NBQ2QsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBpbnB1dE11c3RCZVN0cmluZyxcbiAgICBpbnB1dE11c3RCZVVybCxcbiAgICBwYXlsb2FkTXVzdEJlT2JqZWN0LFxuICAgIHBvcnRNdXN0QmVOdW1lcmljLFxuICAgIFJlVXJpRXJyb3Jcbn0gZnJvbSBcIi4vZXJyb3JzLmpzXCI7XG5pbXBvcnQgeyBlcXVhbCB9IGZyb20gXCIuL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBpbnQsIHN0ciB9IGZyb20gXCJAcmVmbGVjdGl6L3R5cGVzXCI7XG5pbXBvcnQge1xuICAgIGV4dHJhY3RQYXlsb2FkLFxuICAgIGdldEVuY29kZWRQYXRoLFxuICAgIGhvc3RuYW1lQ29udGFpbnMsXG4gICAgbXVzdFZhbGlkYXRlUGF5bG9hZCxcbiAgICBQYXlsb2FkLFxuICAgIHBheWxvYWRDb250YWlucyxcbiAgICBQYXlsb2FkT3JEZWZhdWx0XG59IGZyb20gXCIuL3BheWxvYWRcIjtcbmltcG9ydCB7IFByb3RvY29sLCBSZVVyaUNvbXBvdW5kTmFtZXMsIFJlVXJpUGFydHMsIFJlVXJpUGF0aEtleSB9IGZyb20gXCIuL3BhcnRzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVVcmlEZWJ1Z09wdGlvbnMge1xuICAgIGRvbnRFbmNvZGVQYXlsb2Fkcz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBERUJVRyA9IFN5bWJvbChcImRlYnVnXCIpO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBVUkkgYW5kIGFsbG93cyBwZXJmb3JtaW5nIG9wZXJhdGlvbnMgYW5kIGluc3BlY3RpbmcgaXQuXG4gKlxuICogVGhpcyBjbGFzcyBpcyBpbW11dGFibGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZVVyaTxUUGF5IGV4dGVuZHMgUGF5bG9hZCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZD4ge1xuICAgIHN0YXRpYyByZWFkb25seSBbREVCVUddOiBSZVVyaURlYnVnT3B0aW9ucyA9IHtcbiAgICAgICAgZG9udEVuY29kZVBheWxvYWRzOiBmYWxzZVxuICAgIH07XG4gICAgcHJpdmF0ZSAwOiBzdHJpbmc7XG4gICAgLy8gTG90cyBvZiBwYXJhbXMgbmVlZGVkIGhlcmVcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXBhcmFtc1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIF9wcm90b2NvbDogUHJvdG9jb2wgfCB1bmRlZmluZWQsXG4gICAgICAgIHByaXZhdGUgX2hvc3RuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgIHByaXZhdGUgX3BhdGg6IHN0cmluZyxcbiAgICAgICAgcHJpdmF0ZSBfcXVlcnk6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgcHJpdmF0ZSBfaGFzaDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICBwcml2YXRlIF9wYXlsb2FkOiBUUGF5LFxuICAgICAgICBwcml2YXRlIF90cmFjZTogUGF5bG9hZCB8IHVuZGVmaW5lZCxcbiAgICAgICAgcHJpdmF0ZSBfcGFyc2VkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgIHByaXZhdGUgX3BvcnQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgICBpZiAoX2hvc3RuYW1lKSB7XG4gICAgICAgICAgICB0aGlzLl9ob3N0bmFtZSA9IF9ob3N0bmFtZS5yZXBsYWNlKFwiX1wiLCBcIi5cIik7XG4gICAgICAgICAgICBpZiAodGhpcy5faG9zdG5hbWUuaW5jbHVkZXMoXCJfXCIpKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgICBgVGhlIGhvc3RuYW1lIGNvbnRhaW5zIG11bHRpcGxlIHVuZGVyc2NvcmVzLCB3aGljaCBtaWdodCBub3QgYmUgaW50ZW5kZWQuIEN1cnJlbnQgaG9zdG5hbWU6ICR7dGhpcy5faG9zdG5hbWV9YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzWzBdID0gdGhpcy5fcHJpbnQoZmFsc2UpO1xuICAgIH1cblxuICAgIHN0YXRpYyBpc1JldXJpKG90aGVyOiB1bmtub3duKSB7XG4gICAgICAgIHJldHVybiAhIShcbiAgICAgICAgICAgIG90aGVyICYmXG4gICAgICAgICAgICB0eXBlb2Ygb3RoZXIgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIG90aGVyLmNvbnN0cnVjdG9yICYmXG4gICAgICAgICAgICBcIl9faXNSZXVyaVwiIGluIG90aGVyLmNvbnN0cnVjdG9yXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc2VnbWVudHMoKTogc3RyaW5nW107XG4gICAgc2VnbWVudHMob3ZlcndyaXRlOiBzdHJpbmdbXSk6IFJlVXJpPFRQYXk+O1xuICAgIHNlZ21lbnRzKG92ZXJ3cml0ZT86IHN0cmluZ1tdKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcGF0aC5zcGxpdChcIi9cIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2xvbmUgPSB0aGlzLl9ub0NvcHlDbG9uZSgpO1xuICAgICAgICBjbG9uZS5fcGF0aCA9IG92ZXJ3cml0ZSEuam9pbihcIi9cIik7XG4gICAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9XG5cbiAgICBtZXJnZShvdGhlcjogc3RyaW5nKTogUmVVcmk8VFBheT47XG4gICAgbWVyZ2Uob3RoZXI6IFJlVXJpPGFueT4pOiBSZVVyaTxUUGF5PjtcbiAgICBtZXJnZShvdGhlcjogUmVVcmk8YW55PiB8IHN0cmluZyk6IFJlVXJpPFRQYXk+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBvdGhlciA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWVyZ2UoUmVVcmkucGFyc2Uob3RoZXIpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXJnZWRQYXJ0czogUmVVcmlQYXJ0cyA9IHtcbiAgICAgICAgICAgIGhhc2g6IG90aGVyLl9oYXNoIHx8IHRoaXMuX2hhc2gsXG4gICAgICAgICAgICBob3N0bmFtZTogb3RoZXIuX2hvc3RuYW1lIHx8IHRoaXMuX2hvc3RuYW1lLFxuICAgICAgICAgICAgcGF0aDogb3RoZXIuX3BhdGggfHwgdGhpcy5fcGF0aCxcbiAgICAgICAgICAgIHBvcnQ6IG90aGVyLl9wb3J0IHx8IHRoaXMuX3BvcnQsXG4gICAgICAgICAgICBwcm90b2NvbDogb3RoZXIuX3Byb3RvY29sIHx8IHRoaXMuX3Byb3RvY29sLFxuICAgICAgICAgICAgcXVlcnk6IG90aGVyLl9xdWVyeSB8fCB0aGlzLl9xdWVyeSxcbiAgICAgICAgICAgIHRyYWNlOiBvdGhlci5fdHJhY2UgfHwgdGhpcy5fdHJhY2VcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFydHMobWVyZ2VkUGFydHMpLnBheWxvYWRNZXJnZShvdGhlci5wYXlsb2FkKCkpLnRyYWNlKG90aGVyLnRyYWNlKCkpO1xuICAgIH1cblxuICAgIHBpY2soLi4ua2V5czogUmVVcmlQYXRoS2V5W10pOiBSZVVyaTxUUGF5PiB7XG4gICAgICAgIGxldCByZXN1bHQgPSBSZVVyaS5lbXB0eSgpIGFzIFJlVXJpPFRQYXk+O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucGFydChrZXksIHRoaXMucGFydChrZXkgYXMgUmVVcmlDb21wb3VuZE5hbWVzKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwYXJ0cygpOiBSZVVyaVBhcnRzPFRQYXk+O1xuICAgIHBhcnRzPFRQYXkyIGV4dGVuZHMgUGF5bG9hZCB8IHVuZGVmaW5lZCA9IFRQYXk+KFxuICAgICAgICBvdmVyd3JpdGU6IFBhcnRpYWw8UmVVcmlQYXJ0czxQYXlsb2FkPj5cbiAgICApOiBSZVVyaTxUUGF5Mj47XG4gICAgcGFydHMob3ZlcndyaXRlPzogUGFydGlhbDxSZVVyaVBhcnRzPFBheWxvYWQ+Pik6IGFueSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHByb3RvY29sOiB0aGlzLl9wcm90b2NvbCxcbiAgICAgICAgICAgICAgICBob3N0bmFtZTogdGhpcy5faG9zdG5hbWUsXG4gICAgICAgICAgICAgICAgcG9ydDogdGhpcy5fcG9ydCxcbiAgICAgICAgICAgICAgICBwYXRoOiB0aGlzLl9wYXRoLFxuICAgICAgICAgICAgICAgIHF1ZXJ5OiB0aGlzLl9xdWVyeSxcbiAgICAgICAgICAgICAgICBoYXNoOiB0aGlzLl9oYXNoLFxuICAgICAgICAgICAgICAgIHBheWxvYWQ6IHRoaXMuX3BheWxvYWQsXG4gICAgICAgICAgICAgICAgdHJhY2U6IHRoaXMuX3RyYWNlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICghb3ZlcndyaXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjbG9uZSA9IHRoaXMuX25vQ29weUNsb25lKCk7XG4gICAgICAgIGNsb25lLl9wcm90b2NvbCA9IFwicHJvdG9jb2xcIiBpbiBvdmVyd3JpdGUgPyBvdmVyd3JpdGUucHJvdG9jb2wgOiBjbG9uZS5fcHJvdG9jb2w7XG4gICAgICAgIGNsb25lLl9ob3N0bmFtZSA9IFwiaG9zdG5hbWVcIiBpbiBvdmVyd3JpdGUgPyBvdmVyd3JpdGUuaG9zdG5hbWUgOiBjbG9uZS5faG9zdG5hbWU7XG4gICAgICAgIGNsb25lLl9wb3J0ID0gXCJwb3J0XCIgaW4gb3ZlcndyaXRlID8gb3ZlcndyaXRlLnBvcnQgOiBjbG9uZS5fcG9ydDtcbiAgICAgICAgY2xvbmUuX3BhdGggPSBcInBhdGhcIiBpbiBvdmVyd3JpdGUgPyAob3ZlcndyaXRlLnBhdGggYXMgYW55KSA6IGNsb25lLl9wYXRoO1xuICAgICAgICBjbG9uZS5fcXVlcnkgPSBcInF1ZXJ5XCIgaW4gb3ZlcndyaXRlID8gb3ZlcndyaXRlLnF1ZXJ5IDogY2xvbmUuX3F1ZXJ5O1xuICAgICAgICBjbG9uZS5faGFzaCA9IFwiaGFzaFwiIGluIG92ZXJ3cml0ZSA/IG92ZXJ3cml0ZS5oYXNoIDogY2xvbmUuX2hhc2g7XG4gICAgICAgIGNsb25lLl9wYXlsb2FkID0gXCJwYXlsb2FkXCIgaW4gb3ZlcndyaXRlID8gKG92ZXJ3cml0ZS5wYXlsb2FkIGFzIGFueSkgOiBjbG9uZS5fcGF5bG9hZDtcbiAgICAgICAgY2xvbmUuX3RyYWNlID0gXCJ0cmFjZVwiIGluIG92ZXJ3cml0ZSA/IG92ZXJ3cml0ZS50cmFjZSA6IGNsb25lLl90cmFjZTtcbiAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cblxuICAgIHBhcnQoa2V5OiBcInBheWxvYWRcIik6IFRQYXk7XG4gICAgcGFydChrZXk6IFwicGF5bG9hZFwiLCB2YWx1ZTogVFBheSk6IFJlVXJpPFRQYXk+O1xuICAgIHBhcnQoa2V5OiBcInRyYWNlXCIsIHZhbHVlOiBQYXlsb2FkKTogUmVVcmk8VFBheT47XG4gICAgcGFydChrZXk6IFwidHJhY2VcIik6IFBheWxvYWQ7XG4gICAgcGFydChrZXk6IEV4Y2x1ZGU8UmVVcmlQYXRoS2V5LCBcInBheWxvYWRcIiB8IFwidHJhY2VcIj4pOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgcGFydChrZXk6IFJlVXJpUGF0aEtleSwgdmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFJlVXJpPFRQYXk+O1xuICAgIHBhcnQoa2V5OiBSZVVyaVBhdGhLZXksIHZhbHVlPzogc3RyaW5nIHwgVFBheSB8IFBheWxvYWQpOiBhbnkge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpc1trZXldKCk7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIHJlc3VsdCA9PT0gXCJvYmplY3RcIiA/IHJlc3VsdCA6IHN0cihyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzW2tleV0odmFsdWUgYXMgYW55KTtcbiAgICB9XG5cbiAgICBhZGRyZXNzKGFkZHJlc3M6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwpOiBSZVVyaTxUUGF5PjtcbiAgICBhZGRyZXNzKCk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBhZGRyZXNzKGFkZHJlc3M/OiBzdHJpbmcpOiBzdHJpbmcgfCBSZVVyaTxUUGF5PiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBSZVVyaS5wYXJzZShhZGRyZXNzISk7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VkLnBhcnRzKHtcbiAgICAgICAgICAgICAgICBwcm90b2NvbDogdGhpcy5fcHJvdG9jb2xcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnRzKHtcbiAgICAgICAgICAgIHByb3RvY29sOiB1bmRlZmluZWRcbiAgICAgICAgfSkuaHJlZjtcbiAgICB9XG5cbiAgICByZXNvdXJjZShyZXNvdXJjZTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCk6IFJlVXJpPFRQYXk+O1xuICAgIHJlc291cmNlKCk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICByZXNvdXJjZShyZXNvdXJjZT86IHN0cmluZyk6IHN0cmluZyB8IFJlVXJpPFRQYXk+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IFJlVXJpLnBhcnNlKHJlc291cmNlISk7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VkLnBhcnRzKHtcbiAgICAgICAgICAgICAgICBwcm90b2NvbDogdGhpcy5fcHJvdG9jb2wsXG4gICAgICAgICAgICAgICAgaG9zdG5hbWU6IHRoaXMuX2hvc3RuYW1lLFxuICAgICAgICAgICAgICAgIHBvcnQ6IHRoaXMuX3BvcnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnRzKHtcbiAgICAgICAgICAgIHByb3RvY29sOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBob3N0bmFtZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcG9ydDogdW5kZWZpbmVkXG4gICAgICAgIH0pLmhyZWY7XG4gICAgfVxuXG4gICAgb3JpZ2luKG9yaWdpbjogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCk6IFJlVXJpPFRQYXk+O1xuICAgIG9yaWdpbigpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgb3JpZ2luKG9yaWdpbj86IHN0cmluZyk6IHN0cmluZyB8IFJlVXJpPFRQYXk+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IFJlVXJpLnBhcnNlKG9yaWdpbiEpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFydHMoe1xuICAgICAgICAgICAgICAgIHByb3RvY29sOiBwYXJzZWQuX3Byb3RvY29sLFxuICAgICAgICAgICAgICAgIGhvc3RuYW1lOiBwYXJzZWQuX2hvc3RuYW1lLFxuICAgICAgICAgICAgICAgIHBvcnQ6IHBhcnNlZC5fcG9ydFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFydHMgPSB0aGlzLnBhcnRzKCk7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBSZVVyaS5lbXB0eSgpLnBhcnRzKHtcbiAgICAgICAgICAgICAgICBwcm90b2NvbDogcGFydHMucHJvdG9jb2wsXG4gICAgICAgICAgICAgICAgaG9zdG5hbWU6IHBhcnRzLmhvc3RuYW1lLFxuICAgICAgICAgICAgICAgIHBvcnQ6IHBhcnRzLnBvcnRcbiAgICAgICAgICAgIH0pLmhyZWYgfHwgdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc2VnbWVudChpbmRleDogbnVtYmVyKTogc3RyaW5nO1xuICAgIHNlZ21lbnQoaW5kZXg6IG51bWJlciwgdmFsdWU6IHN0cmluZyk6IFJlVXJpPFRQYXk+O1xuICAgIHNlZ21lbnQoaW5kZXg6IG51bWJlciwgdmFsdWU/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSZVVyaUVycm9yKGBZb3UgbXVzdCBwcm92aWRlIGFuIGluZGV4LmApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcGF0aC5zcGxpdChcIi9cIilbaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlZ21lbnRzID0gdGhpcy5zZWdtZW50cygpO1xuICAgICAgICBzZWdtZW50c1tpbmRleF0gPSB2YWx1ZSE7XG4gICAgICAgIHJldHVybiB0aGlzLnNlZ21lbnRzKHNlZ21lbnRzKTtcbiAgICB9XG5cbiAgICAvLyBHZXRzIHRoZSBwYXRoLiBJdCBjYW4ndCBiZSBudWxsaXNoLlxuICAgIHBhdGgoKTogc3RyaW5nO1xuICAgIC8vIFNldHMgdGhlIHBhdGggdG8gYHBhdGhgLiBOdWxsIGlzIGNvbnZlcnRlZCB0byBgXCJcImAuXG4gICAgcGF0aChwYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsKTogUmVVcmk8VFBheT47XG4gICAgcGF0aChwYXRoPzogc3RyaW5nKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcGF0aDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjbG9uZSA9IHRoaXMuX25vQ29weUNsb25lKCk7XG4gICAgICAgIGNsb25lLl9wYXRoID0gcGF0aCA/PyBcIlwiO1xuICAgICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuXG4gICAgcG9ydCgpOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgcG9ydChyYXc6IHRydWUpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgcG9ydChwb3J0OiBudW1iZXIgfCB1bmRlZmluZWQgfCBzdHJpbmcgfCBudWxsKTogUmVVcmk8VFBheT47XG4gICAgcG9ydChwb3J0PzogbnVtYmVyIHwgdHJ1ZSB8IHN0cmluZyB8IG51bGwpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBpbnQodGhpcy5fcG9ydCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvcnQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wb3J0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNsb25lID0gdGhpcy5fbm9Db3B5Q2xvbmUoKTtcbiAgICAgICAgY2xvbmUuX3BvcnQgPSBzdHIocG9ydCkgPz8gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuXG4gICAgLy8gR2V0cyB0aGUgcHJvdG9jb2wuXG4gICAgcHJvdG9jb2woKTogUHJvdG9jb2wgfCB1bmRlZmluZWQ7XG4gICAgLy8gU2V0cyB0aGUgcHJvdG9jb2wgdG8gYHByb3RvYC5cbiAgICBwcm90b2NvbChwcm90bzogUHJvdG9jb2wgfCBudWxsIHwgdW5kZWZpbmVkKTogUmVVcmk8VFBheT47XG4gICAgcHJvdG9jb2wocHJvdG8/OiBQcm90b2NvbCB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm90b2NvbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjbG9uZSA9IHRoaXMuX25vQ29weUNsb25lKCk7XG4gICAgICAgIGNsb25lLl9wcm90b2NvbCA9IHByb3RvID8/IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cblxuICAgIC8vIEdldHMgdGhlIGhvc3RuYW1lIGFuZCBwb3J0LlxuICAgIGhvc3QoKTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIC8vIFNldHMgdGhlIGhvc3RuYW1lIGFuZCBwb3J0LlxuICAgIGhvc3QoaG9zdDogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCk6IFJlVXJpPFRQYXk+O1xuICAgIGhvc3QoaG9zdD86IHN0cmluZyk6IGFueSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIFJlVXJpLmVtcHR5KCkuaG9zdG5hbWUodGhpcy5faG9zdG5hbWUpLnBvcnQodGhpcy5fcG9ydCkuaHJlZi5zbGljZSgyKSB8fCB1bmRlZmluZWRcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhvc3QgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaG9zdG5hbWUobnVsbCkucG9ydChudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJzZWQgPSBSZVVyaS5wYXJzZShgLy8ke2hvc3R9YCk7XG4gICAgICAgIHJldHVybiB0aGlzLmhvc3RuYW1lKHBhcnNlZC5faG9zdG5hbWUpLnBvcnQocGFyc2VkLl9wb3J0KTtcbiAgICB9XG5cbiAgICAvLyBHZXRzIHRoZSBob3N0bmFtZSwgd2hpY2ggaXMgdGhlIGRvbWFpbiB3aXRob3V0IHRoZSBwb3J0LlxuICAgIGhvc3RuYW1lKCk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAvLyBTZXRzIHRoZSBob3N0bmFtZSB0byBgaG9zdG5hbWVgLlxuICAgIGhvc3RuYW1lKGhvc3RuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsKTogUmVVcmk8VFBheT47XG4gICAgaG9zdG5hbWUoaG9zdG5hbWU/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ob3N0bmFtZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjbG9uZSA9IHRoaXMuX25vQ29weUNsb25lKCk7XG4gICAgICAgIGNsb25lLl9ob3N0bmFtZSA9IGhvc3RuYW1lID8/IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cblxuICAgIC8vIEdldHMgdGhlIHF1ZXJ5IHN0cmluZy5cbiAgICBxdWVyeSgpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgLy8gU2V0cyB0aGUgcXVlcnkgc3RyaW5nIHRvIGBxdWVyeWAuXG4gICAgcXVlcnkocXVlcnk6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBSZVVyaTxUUGF5PjtcbiAgICBxdWVyeShxdWVyeT86IHN0cmluZykge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3F1ZXJ5O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNsb25lID0gdGhpcy5fbm9Db3B5Q2xvbmUoKTtcbiAgICAgICAgY2xvbmUuX3F1ZXJ5ID0gcXVlcnkgPz8gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuXG4gICAgLy8gR2V0cyB0aGUgaGFzaCwgYWthIHRoZSBmcmFnbWVudCwgd2l0aG91dCB0aGUgIy5cbiAgICBoYXNoKCk6IHN0cmluZztcbiAgICAvLyBTZXRzIHRoZSBoYXNoIG9mIHRoaXMgdG8gYGhhc2hgLCBhbmQgcmV0dXJucyBgdGhpc2AuXG4gICAgaGFzaChoYXNoOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogUmVVcmk8VFBheT47XG4gICAgaGFzaChoYXNoPzogc3RyaW5nKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faGFzaDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjbG9uZSA9IHRoaXMuX25vQ29weUNsb25lKCk7XG4gICAgICAgIGNsb25lLl9oYXNoID0gaGFzaCA/PyB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRFbmNvZGVkUGF0aChza2lwUGF5bG9hZCA9IGZhbHNlKSB7XG4gICAgICAgIGlmIChza2lwUGF5bG9hZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BhdGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdldEVuY29kZWRQYXRoKHRoaXMuX3BhdGgsIHRoaXMuX3BheWxvYWQsIHRoaXMuX3RyYWNlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9ub0NvcHlDbG9uZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZVVyaTxUUGF5PihcbiAgICAgICAgICAgIHRoaXMuX3Byb3RvY29sLFxuICAgICAgICAgICAgdGhpcy5faG9zdG5hbWUsXG4gICAgICAgICAgICB0aGlzLl9wYXRoLFxuICAgICAgICAgICAgdGhpcy5fcXVlcnksXG4gICAgICAgICAgICB0aGlzLl9oYXNoLFxuICAgICAgICAgICAgdGhpcy5fcGF5bG9hZCxcbiAgICAgICAgICAgIHRoaXMuX3RyYWNlLFxuICAgICAgICAgICAgdGhpcy5fcGFyc2VkLFxuICAgICAgICAgICAgdGhpcy5fcG9ydFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIERvZXMgdGhpcyBVUkwgaGF2ZSBhIHdlYiBwcm90b2NvbD9cbiAgICBnZXQgaXNXZWIoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX3Byb3RvY29sICYmIHdlYlByb3RvY29scy5oYXModGhpcy5fcHJvdG9jb2wpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLiBUaGUgcGF5bG9hZCBpcyBhbHNvIGNsb25lZC5cbiAgICAgKi9cbiAgICBjbG9uZSgpOiBSZVVyaTxUUGF5PiB7XG4gICAgICAgIHJldHVybiBuZXcgUmVVcmk8VFBheT4oXG4gICAgICAgICAgICB0aGlzLl9wcm90b2NvbCxcbiAgICAgICAgICAgIHRoaXMuX2hvc3RuYW1lLFxuICAgICAgICAgICAgdGhpcy5fcGF0aCxcbiAgICAgICAgICAgIHRoaXMuX3F1ZXJ5LFxuICAgICAgICAgICAgdGhpcy5faGFzaCxcbiAgICAgICAgICAgIHRoaXMuX3BheWxvYWQgJiYgeyAuLi50aGlzLl9wYXlsb2FkIH0sXG4gICAgICAgICAgICB0aGlzLl90cmFjZSAmJiB7IC4uLnRoaXMuX3RyYWNlIH0sXG4gICAgICAgICAgICB0aGlzLl9wYXJzZWQsXG4gICAgICAgICAgICB0aGlzLl9wb3J0XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc3RhdGljIGVtcHR5KCk6IFJlVXJpPHVuZGVmaW5lZD47XG4gICAgc3RhdGljIGVtcHR5PFRQYXkgZXh0ZW5kcyBQYXlsb2FkPihwYXlsb2FkOiBUUGF5KTogUmVVcmk8VFBheT47XG4gICAgc3RhdGljIGVtcHR5PFRQYXkgZXh0ZW5kcyBQYXlsb2FkPihwYXlsb2FkPzogVFBheSkge1xuICAgICAgICByZXR1cm4gbmV3IFJlVXJpPFRQYXk+KFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgXCJcIixcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHBheWxvYWQhLFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gUGFyc2VzIGBpbnB1dGAgYXMgYSBVUkkuIEVycm9ycyBvbiBiYWQgaW5wdXQuXG4gICAgc3RhdGljIHBhcnNlKGlucHV0OiBudWxsIHwgdW5kZWZpbmVkKTogUmVVcmk8dW5kZWZpbmVkPjtcbiAgICBzdGF0aWMgcGFyc2U8VFBheSBleHRlbmRzIFBheWxvYWQgfCB1bmRlZmluZWQ+KFxuICAgICAgICBpbnB1dDogc3RyaW5nIHwgUmVVcmk8VFBheT4gfCBQYXJ0aWFsPFJlVXJpUGFydHM8UGF5bG9hZD4+XG4gICAgKTogUmVVcmk8VFBheT47XG4gICAgc3RhdGljIHBhcnNlPFRQYXkgZXh0ZW5kcyBQYXlsb2FkIHwgdW5kZWZpbmVkPihpbnB1dDogYW55KSB7XG4gICAgICAgIGlmIChpbnB1dCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gUmVVcmkuZW1wdHkoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBSZVVyaSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHJldHVybiBSZVVyaS5lbXB0eSgpLnBhcnRzKGlucHV0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGlucHV0ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICB0aHJvdyBpbnB1dE11c3RCZVN0cmluZyhpbnB1dCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgciA9IHVybFJlZ2V4cC5leGVjKGlucHV0KTtcbiAgICAgICAgaWYgKCFyKSB7XG4gICAgICAgICAgICB0aHJvdyBpbnB1dE11c3RCZVVybChpbnB1dCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgWywgcHJvdG8sIGhvc3RuYW1lLCBwb3J0LCBwYXRoV2l0aFBheWxvYWQsIHF1ZXJ5LCBmcmFnbWVudF0gPSByO1xuICAgICAgICBpZiAocG9ydCAhPSBudWxsICYmIChOdW1iZXIuaXNOYU4oK3BvcnQpIHx8IHBvcnQgPT09IFwiXCIpKSB7XG4gICAgICAgICAgICB0aHJvdyBwb3J0TXVzdEJlTnVtZXJpYyhpbnB1dCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHsgcGF5bG9hZCwgdHJhY2VQYXlsb2FkLCBwYXRoIH0gPSBleHRyYWN0UGF5bG9hZDxUUGF5PihwYXRoV2l0aFBheWxvYWQpO1xuICAgICAgICBjb25zdCBzb21lUGF5bG9hZCA9IHBheWxvYWQgfHwgdHJhY2VQYXlsb2FkO1xuICAgICAgICBpZiAoc29tZVBheWxvYWQ/Ll9fdHJpbSkge1xuICAgICAgICAgICAgLy8gVGhpcyB3aWxsIG9ubHkgYmUgc2V0IGlmIHRoZSBwYXRoIGlzIGZha2UgYW5kIG9ubHkgY3JlYXRlZCBmb3IgdGhlIHBheWxvYWRcbiAgICAgICAgICAgIHBhdGggPSBcIlwiO1xuICAgICAgICAgICAgZGVsZXRlIHNvbWVQYXlsb2FkLl9fdHJpbTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc29tZVBheWxvYWQpIHtcbiAgICAgICAgICAgIGhvc3RuYW1lID0gaG9zdG5hbWU/LnJlcGxhY2UoL18oW14uXSopJC8sIFwiLiQxXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUmVVcmkoXG4gICAgICAgICAgICBwcm90bz8udHJpbSgpLFxuICAgICAgICAgICAgaG9zdG5hbWU/LnRyaW0oKSxcbiAgICAgICAgICAgIHBhdGg/LnRyaW0oKSxcbiAgICAgICAgICAgIHF1ZXJ5Py50cmltKCksXG4gICAgICAgICAgICBmcmFnbWVudD8udHJpbSgpLFxuICAgICAgICAgICAgcGF5bG9hZCEsXG4gICAgICAgICAgICB0cmFjZVBheWxvYWQsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIHBvcnRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwYXlsb2FkTWVyZ2U8VE1vcmUgZXh0ZW5kcyBQYXlsb2FkPih0aGlzOiBSZVVyaTx1bmRlZmluZWQ+LCBtb3JlOiBUTW9yZSk6IFJlVXJpPFRNb3JlPjtcbiAgICBwYXlsb2FkTWVyZ2U8VE1vcmUgZXh0ZW5kcyBQYXlsb2FkPih0aGlzOiBSZVVyaTxUUGF5PiwgbW9yZTogVE1vcmUpOiBSZVVyaTxUTW9yZSAmIFRQYXk+O1xuICAgIHBheWxvYWRNZXJnZTxUTW9yZSBleHRlbmRzIFBheWxvYWQgPSBQYXlsb2FkT3JEZWZhdWx0PFRQYXk+Pihtb3JlOiBUTW9yZSk6IFJlVXJpPFRQYXkgJiBUTW9yZT4ge1xuICAgICAgICBjb25zdCBwYXlsb2FkID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fcGF5bG9hZCwgbW9yZSk7XG4gICAgICAgIHJldHVybiB0aGlzLnBheWxvYWQocGF5bG9hZCk7XG4gICAgfVxuXG4gICAgdHJhY2UoKTogUGF5bG9hZDtcbiAgICB0cmFjZShwYXlsb2FkT3duZXI6IFJlVXJpPGFueT4pOiBSZVVyaTxUUGF5PjtcbiAgICB0cmFjZSh0cmFjZVBheWxvYWQ6IFBheWxvYWQpOiBSZVVyaTxUUGF5PjtcbiAgICB0cmFjZShzb21ldGhpbmc/OiBQYXlsb2FkIHwgUmVVcmk8YW55Pikge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICB0aGlzLl90cmFjZSAmJiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuX3RyYWNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc29tZXRoaW5nID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHBheWxvYWRNdXN0QmVPYmplY3Qoc29tZXRoaW5nKTtcbiAgICAgICAgY29uc3QgdHJhY2VQYXlsb2FkID0gc29tZXRoaW5nIGluc3RhbmNlb2YgUmVVcmkgPyBzb21ldGhpbmcudHJhY2UoKSA6IHNvbWV0aGluZztcbiAgICAgICAgbXVzdFZhbGlkYXRlUGF5bG9hZCh0cmFjZVBheWxvYWQpO1xuICAgICAgICBjb25zdCBjbG9uZSA9IHRoaXMuX25vQ29weUNsb25lKCk7XG4gICAgICAgIGNsb25lLl90cmFjZSA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMuX3RyYWNlLFxuICAgICAgICAgICAgLi4udHJhY2VQYXlsb2FkXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhpcyBVUkkgKENISUxEKSBtYXRjaGVzIGFub3RoZXIgVVJJIChQQVJFTlQpLiBUaGUgcGFyZW50IGNhbiBiZSBhIHN0cmluZyxcbiAgICAgKiBhIHtAbGluayBSZVVyaX0gb3IsIG9yIGFuIG9iamVjdCBkZXNjcmliaW5nIHRoZSBwYXJ0cyBvZiBhIFVSSSAtLSBhIHtAbGluayBSZVVyaVBhcnRzfS5cbiAgICAgKlxuICAgICAqIENISUxEIGlzIGNvbnNpZGVyZWQgdG8gYmUgYSBjaGlsZCBvZiBQQVJFTlQgaWY6XG4gICAgICogMS4gSWYgUEFSRU5UIGhhcyBhIHByb3RvY29sLCBpdCBtdXN0IGVxdWFsIENISUxEIHByb3RvY29sLlxuICAgICAqIDIuIElmIFBBUkVOVCBoYXMgYSBob3N0bmFtZSwgaXQgbXVzdCBiZSBhIHBhcmVudCBvZiBDSElMRCdzIGhvc3RuYW1lLlxuICAgICAqIDMuIElmIFBBUkVOVCBoYXMgYSBwb3J0LCBpdCBtdXN0IGVxdWFsIENISUxEJ3MgcG9ydC5cbiAgICAgKiA0LiBJZiBQQVJFTlQgaGFzIGEgcGF0aCwgaXQgbXVzdCBiZSBhIHBhcmVudCBvZiBDSElMRCdzIHBhdGguXG4gICAgICogNS4gSWYgUEFSRU5UIGhhcyBhIHF1ZXJ5LCBpdCBtdXN0IGVxdWFsIENISUxEJ3MgcXVlcnkuXG4gICAgICogNi4gSWYgUEFSRU5UIGhhcyBhIGhhc2gsIGl0IG11c3QgZXF1YWwgQ0hJTEQncyBoYXNoLlxuICAgICAqIDcuIElmIFBBUkVOVCBoYXMgYSBwYXlsb2FkLCBpdHMgcHJvcGVydGllcyBtdXN0IG1hdGNoIENISUxEJ3MgcGF5bG9hZC5cbiAgICAgKiA4LiBUaGUgdHJhY2UgcGF5bG9hZCBpcyBpZ25vcmVkLlxuICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBVUkkgdG8gY2hlY2sgYWdhaW5zdC5cbiAgICAgKlxuICAgICAqL1xuICAgIG1hdGNoZXMoXG4gICAgICAgIHBhcmVudDogUGFydGlhbDxSZVVyaVBhcnRzPFBheWxvYWQgfCB1bmRlZmluZWQ+PiB8IFJlVXJpPFBheWxvYWQgfCB1bmRlZmluZWQ+IHwgc3RyaW5nXG4gICAgKTogYm9vbGVhbiB7XG4gICAgICAgIHBhcmVudCA9IFJlVXJpLnBhcnNlKHBhcmVudCk7XG4gICAgICAgIGlmIChwYXJlbnQuX3Byb3RvY29sICYmIHBhcmVudC5fcHJvdG9jb2wgIT09IHRoaXMuX3Byb3RvY29sKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmVudC5faG9zdG5hbWUgJiYgIWhvc3RuYW1lQ29udGFpbnModGhpcy5faG9zdG5hbWUsIHBhcmVudC5faG9zdG5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFyZW50Ll9wb3J0ICYmIHBhcmVudC5fcG9ydCAhPT0gdGhpcy5fcG9ydCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJlbnQuX3F1ZXJ5ICYmIHBhcmVudC5fcXVlcnkgIT09IHRoaXMuX3F1ZXJ5KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmVudC5faGFzaCAmJiBwYXJlbnQuX2hhc2ggIT09IHRoaXMuX2hhc2gpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyZW50Ll9wYXlsb2FkICYmICFwYXlsb2FkQ29udGFpbnModGhpcy5fcGF5bG9hZCwgcGFyZW50Ll9wYXlsb2FkKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyZW50U2VnbWVudHMgPSBwYXJlbnQuc2VnbWVudHMoKTtcbiAgICAgICAgY29uc3QgY2hpbGRTZWdtZW50cyA9IHRoaXMuc2VnbWVudHMoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJlbnRTZWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHBhcmVudFNlZ21lbnRzW2ldICE9PSBjaGlsZFNlZ21lbnRzW2ldKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGlzIFVSSSBlcXVhbHMgYW5vdGhlciBVUkksIHdoaWNoIGNhbiBiZSBnaXZlbiBhcyBhIHN0cmluZywgYSB7QGxpbmsgUmVVcml9IG9yLCBvciBhbiBvYmplY3QgZGVzY3JpYmluZyB0aGUgcGFydHMgb2YgYSBVUkkgLS0gYVxuICAgICAqIHtAbGluayBSZVVyaVBhcnRzfS5cbiAgICAgKiBAcGFyYW0gb3RoZXIgVGhlIG90aGVyIFVSSSB0byBjaGVjayBhZ2FpbnN0LlxuICAgICAqIEBwYXJhbSBza2lwUGF5bG9hZCBJZiB0cnVlLCB0aGUgcGF5bG9hZCBpcyBpZ25vcmVkLlxuICAgICAqL1xuICAgIGVxdWFsKFxuICAgICAgICBvdGhlcjogc3RyaW5nIHwgUmVVcmk8UGF5bG9hZCB8IHVuZGVmaW5lZD4gfCBQYXJ0aWFsPFJlVXJpUGFydHM8UGF5bG9hZCB8IHVuZGVmaW5lZD4+LFxuICAgICAgICBza2lwUGF5bG9hZCA9IGZhbHNlXG4gICAgKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzID09PSBvdGhlcikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgb3RoZXIgPSBSZVVyaS5wYXJzZShvdGhlcik7XG4gICAgICAgIGNvbnN0IG15UGFydHMgPSB0aGlzLnBhcnRzKCk7XG4gICAgICAgIGNvbnN0IG90aGVyUGFydHMgPSBvdGhlci5wYXJ0cygpO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBbXCJwcm90b2NvbFwiLCBcImhvc3RuYW1lXCIsIFwicG9ydFwiLCBcInBhdGhcIiwgXCJxdWVyeVwiLCBcImhhc2hcIl0gYXMgY29uc3QpIHtcbiAgICAgICAgICAgIGlmIChteVBhcnRzW2tleV0gIT09IG90aGVyUGFydHNba2V5XSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc2tpcFBheWxvYWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fcGF5bG9hZCB8fCAhb3RoZXIuX3BheWxvYWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wYXlsb2FkID09PSBvdGhlci5fcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXF1YWwodGhpcy5fcGF5bG9hZCwgb3RoZXIuX3BheWxvYWQpO1xuICAgIH1cblxuICAgIC8vIEFuIGFydGlmaWNpYWwgVVJJIGlzIG9uZSB0aGF0IGNhbid0IGhhdmUgYmVlbiBwYXJzZWQgZnJvbSBhIHN0cmluZyBkdWUgdG8gYW4gaW52YWxpZCBjb21iaW5hdGlvbiBvZiBjb21wb25lbnRzLiBGb3IgZXhhbXBsZSxcbiAgICAvLyAxLiBBIFVSTCB3aXRoIGEgcG9ydCBidXQgbm8gaG9zdG5hbWUuXG4gICAgLy8gMi4gQSBVUkwgd2l0aCBhIGhvc3RuYW1lIGJ1dCBubyBwcm90b2NvbC5cbiAgICAvLyAzLiBBIFVSTCB3aXRoXG4gICAgZ2V0IGlzQXJ0aWZpY2lhbCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICFSZVVyaS5wYXJzZSh0aGlzLl9wcmludCh0cnVlKSkuZXF1YWwodGhpcywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLy8gR2V0cyB0aGUgcGF5bG9hZC5cbiAgICBwYXlsb2FkKCk6IFRQYXk7XG4gICAgcGF5bG9hZChwYXlsb2FkOiBudWxsIHwgdW5kZWZpbmVkKTogUmVVcmk8dW5kZWZpbmVkPjtcbiAgICAvLyBTZXRzIHRoZSBwYXlsb2FkIHRvIGEgY2xvbmUgb2YgYHBheWxvYWRgLiBEaXNhYmxlZCBmb3Igbm9uLWh0dHAgVVJMcy5cbiAgICBwYXlsb2FkPFRPdGhlciBleHRlbmRzIFBheWxvYWQgfCB1bmRlZmluZWQgPSBQYXlsb2FkT3JEZWZhdWx0PFRQYXk+PihcbiAgICAgICAgcGF5bG9hZDogVE90aGVyXG4gICAgKTogUmVVcmk8VE90aGVyPjtcbiAgICAvLyBTZXRzIHRoZSBwYXlsb2FkIHRvIHRoZSBwYXlsb2FkIG9mIGBvdGhlclJldXJpYC4gRGlzYWJsZWQgZm9yIG5vbi1odHRwIFVSTHMuXG4gICAgcGF5bG9hZDxUT3RoZXIgZXh0ZW5kcyBQYXlsb2FkIHwgdW5kZWZpbmVkID0gUGF5bG9hZE9yRGVmYXVsdDxUUGF5Pj4oXG4gICAgICAgIG90aGVyUmV1cmk6IFJlVXJpPFRPdGhlcj5cbiAgICApOiBSZVVyaTxUT3RoZXI+O1xuICAgIHBheWxvYWQoc29tZXRoaW5nPzogb2JqZWN0IHwgUmVVcmk8UGF5bG9hZD4gfCBSZVVyaTx1bmRlZmluZWQ+IHwgbnVsbCB8IHVuZGVmaW5lZCk6IGFueSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHRoaXMuX3BheWxvYWQgJiYge1xuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLl9wYXlsb2FkXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fcHJvdG9jb2wgPT09IFwiZGF0YVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBsZXQgcGF5bG9hZDogYW55IHwgdW5kZWZpbmVkO1xuICAgICAgICBwYXlsb2FkID0gc29tZXRoaW5nIGluc3RhbmNlb2YgUmVVcmkgPyBzb21ldGhpbmcucGF5bG9hZCgpIDogc29tZXRoaW5nO1xuICAgICAgICBpZiAocGF5bG9hZCA9PSBudWxsKSB7XG4gICAgICAgICAgICBwYXlsb2FkID0gdW5kZWZpbmVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGF5bG9hZE11c3RCZU9iamVjdChzb21ldGhpbmcpO1xuICAgICAgICAgICAgbXVzdFZhbGlkYXRlUGF5bG9hZChwYXlsb2FkKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjbG9uZSA9IHRoaXMuX25vQ29weUNsb25lKCk7XG4gICAgICAgIGNsb25lLl9wYXlsb2FkID0gcGF5bG9hZCAmJiB7XG4gICAgICAgICAgICAuLi5wYXlsb2FkXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wcmludChza2lwUGF5bG9hZCA9IGZhbHNlKSB7XG4gICAgICAgIGxldCB7IF9wcm90b2NvbCwgX2hvc3RuYW1lLCBfcXVlcnksIF9oYXNoLCBfcG9ydCB9ID0gdGhpcztcbiAgICAgICAgY29uc3Qgc29tZVBheWxvYWQgPSB0aGlzLl9wYXlsb2FkIHx8IHRoaXMuX3RyYWNlO1xuICAgICAgICBza2lwUGF5bG9hZCA9IHNraXBQYXlsb2FkIHx8IFJlVXJpW0RFQlVHXS5kb250RW5jb2RlUGF5bG9hZHMgfHwgZmFsc2U7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgYSBwYXlsb2FkLCB3ZSBuZWVkIHRvIG1hbmdsZSB0aGUgaG9zdG5hbWUgc28gcGF5bG9hZGVkIHJlcXVlc3RzIGRvbid0IGdldCBzZW50IG91dCB0byBzZXJ2ZXJzLlxuICAgICAgICBpZiAoc29tZVBheWxvYWQgJiYgX2hvc3RuYW1lICE9IG51bGwgJiYgIXNraXBQYXlsb2FkICYmICFSZVVyaVtERUJVR10uZG9udEVuY29kZVBheWxvYWRzKSB7XG4gICAgICAgICAgICBfaG9zdG5hbWUgPSBfaG9zdG5hbWUucmVwbGFjZSgvXFwuKFteLl0qKSQvLCBcIl8kMVwiKTtcbiAgICAgICAgfVxuICAgICAgICBfcHJvdG9jb2wgPSBfcHJvdG9jb2wgIT0gbnVsbCA/IGAke19wcm90b2NvbH06YCA6IF9wcm90b2NvbDtcbiAgICAgICAgX2hvc3RuYW1lID0gX2hvc3RuYW1lICE9IG51bGwgPyBgLy8ke19ob3N0bmFtZX1gIDogXCJcIjtcbiAgICAgICAgX3F1ZXJ5ID0gX3F1ZXJ5ICE9IG51bGwgPyBgPyR7X3F1ZXJ5fWAgOiBcIlwiO1xuICAgICAgICBfaGFzaCA9IF9oYXNoICE9IG51bGwgPyBgIyR7X2hhc2h9YCA6IFwiXCI7XG4gICAgICAgIGNvbnN0IHN0clBvcnQgPSBfcG9ydCAhPSBudWxsID8gYDoke19wb3J0fWAgOiBcIlwiO1xuXG4gICAgICAgIGNvbnN0IHBhdGggPSB0aGlzLl9nZXRFbmNvZGVkUGF0aChza2lwUGF5bG9hZCk7XG5cbiAgICAgICAgcmV0dXJuIFtfcHJvdG9jb2wsIF9ob3N0bmFtZSwgc3RyUG9ydCwgcGF0aCwgX3F1ZXJ5LCBfaGFzaF0uam9pbihcIlwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJcyB0aGlzIGEgZmFrZSBVUkwgZ2VuZXJhdGVkIGJ5IHJlZmxlY3Rpej9cbiAgICAgKi9cbiAgICBnZXQgaXNSZWZsZWN0aXooKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX3Byb3RvY29sICYmIHJpUHJvdG9jb2xzLmhhcyh0aGlzLl9wcm90b2NvbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRG9lcyB0aGlzIFVSTCBoYXZlIGEgbm9uLXdlYiBwcm90b2NvbD9cbiAgICAgKi9cbiAgICBnZXQgaXNOb25XZWIoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX3Byb3RvY29sICYmICF3ZWJQcm90b2NvbHMuaGFzKHRoaXMuX3Byb3RvY29sKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBmdWxsIFVSSSwgaW5jbHVkaW5nIHRoZSBwYXlsb2FkLlxuICAgICAqL1xuICAgIGdldCBocmVmKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJpbnQoZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGZ1bGwgVVJJLCBtaW51cyB0aGUgcGF5bG9hZC5cbiAgICAgKi9cbiAgICBnZXQgY2Fub25pY2FsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJpbnQodHJ1ZSk7XG4gICAgfVxuXG4gICAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ocmVmO1xuICAgIH1cblxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ocmVmO1xuICAgIH1cbn1cblxuY29uc3QgdXJsUmVnZXhwID1cbiAgICAvXig/OihbYS16QS1aXVtBLVphLXpcXGQrLS5dKik6KT8oPzpcXC9cXC8oW14vPyM6XSopKD86OihbXi8/I10qKSk/KT8oW14/I10qKT8oPzpcXD8oW14jXSopKT8oPzojKC4qKSk/JC87XG5cbmNvbnN0IHdlYlByb3RvY29scyA9IG5ldyBTZXQoW1wiaHR0cFwiLCBcIndzXCIsIFwiaHR0cHNcIiwgXCJ3c3NcIl0pO1xuXG5jb25zdCByaVByb3RvY29scyA9IG5ldyBTZXQoW1wiaW5saW5lXCIsIFwiZHluYW1pY1wiLCBcInJlZmxlY3RpelwiXSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZVVyaSwgXCJfX2lzUmV1cmlcIiwge1xuICAgIHZhbHVlOiB0cnVlXG59KTtcbiJdfQ==
@@ -1,2 +0,0 @@
1
- export declare function equal(a: any, b: any): boolean;
2
- //# sourceMappingURL=utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,GAAG,OAAO,CAoB7C"}
package/dist/lib/utils.js DELETED
@@ -1,26 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.equal = void 0;
4
- function equal(a, b) {
5
- if (!a || typeof a !== "object" || !b || typeof b !== "object") {
6
- return a === b;
7
- }
8
- const aProto = Object.getPrototypeOf(a);
9
- const bProto = Object.getPrototypeOf(b);
10
- if (aProto !== bProto) {
11
- return false;
12
- }
13
- const aKeys = Object.keys(a);
14
- const bKeys = Object.keys(b);
15
- if (aKeys.length !== bKeys.length) {
16
- return false;
17
- }
18
- for (const key of aKeys) {
19
- if (a[key] !== b[key]) {
20
- return false;
21
- }
22
- }
23
- return true;
24
- }
25
- exports.equal = equal;
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLFNBQWdCLEtBQUssQ0FBQyxDQUFNLEVBQUUsQ0FBTTtJQUNoQyxJQUFJLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUU7UUFDNUQsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ2xCO0lBQ0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLElBQUksTUFBTSxLQUFLLE1BQU0sRUFBRTtRQUNuQixPQUFPLEtBQUssQ0FBQztLQUNoQjtJQUNELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0IsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLE1BQU0sRUFBRTtRQUMvQixPQUFPLEtBQUssQ0FBQztLQUNoQjtJQUNELEtBQUssTUFBTSxHQUFHLElBQUksS0FBSyxFQUFFO1FBQ3JCLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNuQixPQUFPLEtBQUssQ0FBQztTQUNoQjtLQUNKO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDaEIsQ0FBQztBQXBCRCxzQkFvQkMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gZXF1YWwoYTogYW55LCBiOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoIWEgfHwgdHlwZW9mIGEgIT09IFwib2JqZWN0XCIgfHwgIWIgfHwgdHlwZW9mIGIgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgcmV0dXJuIGEgPT09IGI7XG4gICAgfVxuICAgIGNvbnN0IGFQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihhKTtcbiAgICBjb25zdCBiUHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoYik7XG4gICAgaWYgKGFQcm90byAhPT0gYlByb3RvKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgYUtleXMgPSBPYmplY3Qua2V5cyhhKTtcbiAgICBjb25zdCBiS2V5cyA9IE9iamVjdC5rZXlzKGIpO1xuICAgIGlmIChhS2V5cy5sZW5ndGggIT09IGJLZXlzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IG9mIGFLZXlzKSB7XG4gICAgICAgIGlmIChhW2tleV0gIT09IGJba2V5XSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuIl19