@kittycad/web-view 1.0.7 → 1.0.11
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/index.js +121 -2617
- package/package.json +2 -2
package/index.js
CHANGED
|
@@ -1,2631 +1,135 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
for (var name in all)
|
|
15
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
16
|
-
};
|
|
17
|
-
var __copyProps = (to, from, except, desc) => {
|
|
18
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
19
|
-
for (let key of __getOwnPropNames(from))
|
|
20
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
21
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
22
|
-
}
|
|
23
|
-
return to;
|
|
24
|
-
};
|
|
25
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
26
|
-
|
|
27
|
-
// src/index.ts
|
|
28
|
-
var index_exports = {};
|
|
29
|
-
__export(index_exports, {
|
|
30
|
-
ZooWebView: () => ZooWebView
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
// node_modules/@kittycad/lib/dist/mjs/index.js
|
|
34
|
-
try {
|
|
35
|
-
if ("undefined" == typeof fetch && "undefined" != typeof process && process.versions?.node) {
|
|
36
|
-
new Function("m", "return import(m)")("cross-fetch/polyfill").catch((() => {
|
|
37
|
-
}));
|
|
38
|
-
}
|
|
39
|
-
} catch {
|
|
40
|
-
}
|
|
41
|
-
function e(t) {
|
|
42
|
-
const e2 = new URLSearchParams();
|
|
43
|
-
for (const [n2, i] of Object.entries(t)) if (void 0 !== i) if (Array.isArray(i)) for (const t2 of i) e2.append(n2, String(t2));
|
|
44
|
-
else e2.append(n2, String(i));
|
|
45
|
-
const n = e2.toString();
|
|
46
|
-
return n ? `?${n}` : "";
|
|
47
|
-
}
|
|
48
|
-
try {
|
|
49
|
-
if ("undefined" != typeof process && process.versions?.node && "win32" === process.platform) {
|
|
50
|
-
new Function("m", "return import(m)")("win-ca");
|
|
51
|
-
}
|
|
52
|
-
} catch {
|
|
53
|
-
}
|
|
54
|
-
var u = (() => {
|
|
55
|
-
const t = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(Uint8Array.prototype), Symbol.toStringTag).get;
|
|
56
|
-
return (e2) => t.call(e2);
|
|
57
|
-
})();
|
|
58
|
-
function r(t) {
|
|
59
|
-
return "Uint8Array" === u(t);
|
|
60
|
-
}
|
|
61
|
-
function p(t) {
|
|
62
|
-
return "object" == typeof t && null != t && Symbol.toStringTag in t && ("ArrayBuffer" === t[Symbol.toStringTag] || "SharedArrayBuffer" === t[Symbol.toStringTag]);
|
|
63
|
-
}
|
|
64
|
-
function h(t) {
|
|
65
|
-
return t instanceof RegExp || "[object RegExp]" === Object.prototype.toString.call(t);
|
|
66
|
-
}
|
|
67
|
-
function y(t) {
|
|
68
|
-
return "object" == typeof t && null != t && Symbol.toStringTag in t && "Map" === t[Symbol.toStringTag];
|
|
69
|
-
}
|
|
70
|
-
function G(t) {
|
|
71
|
-
return t instanceof Date || "[object Date]" === Object.prototype.toString.call(t);
|
|
72
|
-
}
|
|
73
|
-
function X(t, e2) {
|
|
74
|
-
return JSON.stringify(t, ((t2, e3) => "bigint" == typeof e3 ? { $numberLong: `${e3}` } : y(e3) ? Object.fromEntries(e3) : e3));
|
|
75
|
-
}
|
|
76
|
-
var V = 7;
|
|
77
|
-
var W = /* @__PURE__ */ Symbol.for("@@mdb.bson.version");
|
|
78
|
-
var f = 2147483647;
|
|
79
|
-
var g = -2147483648;
|
|
80
|
-
var Y = Math.pow(2, 63) - 1;
|
|
81
|
-
var I = -Math.pow(2, 63);
|
|
82
|
-
var R = Math.pow(2, 53);
|
|
83
|
-
var S = -Math.pow(2, 53);
|
|
84
|
-
var J = 1;
|
|
85
|
-
var K = 2;
|
|
86
|
-
var L = 3;
|
|
87
|
-
var T = 4;
|
|
88
|
-
var U = 5;
|
|
89
|
-
var N = 6;
|
|
90
|
-
var z = 7;
|
|
91
|
-
var x = 8;
|
|
92
|
-
var w = 9;
|
|
93
|
-
var H = 10;
|
|
94
|
-
var k = 11;
|
|
95
|
-
var B = 12;
|
|
96
|
-
var C = 13;
|
|
97
|
-
var v = 14;
|
|
98
|
-
var M = 15;
|
|
99
|
-
var j = 16;
|
|
100
|
-
var P = 17;
|
|
101
|
-
var F = 18;
|
|
102
|
-
var Q = 19;
|
|
103
|
-
var O = 255;
|
|
104
|
-
var E = 127;
|
|
105
|
-
var _ = 0;
|
|
106
|
-
var D = 4;
|
|
107
|
-
var A = Object.freeze({ double: 1, string: 2, object: 3, array: 4, binData: 5, undefined: 6, objectId: 7, bool: 8, date: 9, null: 10, regex: 11, dbPointer: 12, javascript: 13, symbol: 14, javascriptWithScope: 15, int: 16, timestamp: 17, long: 18, decimal: 19, minKey: -1, maxKey: 127 });
|
|
108
|
-
var $ = class extends Error {
|
|
109
|
-
get bsonError() {
|
|
110
|
-
return true;
|
|
111
|
-
}
|
|
112
|
-
get name() {
|
|
113
|
-
return "BSONError";
|
|
114
|
-
}
|
|
115
|
-
constructor(t, e2) {
|
|
116
|
-
super(t, e2);
|
|
117
|
-
}
|
|
118
|
-
static isBSONError(t) {
|
|
119
|
-
return null != t && "object" == typeof t && "bsonError" in t && true === t.bsonError && "name" in t && "message" in t && "stack" in t;
|
|
120
|
-
}
|
|
121
|
-
};
|
|
122
|
-
var q = class extends $ {
|
|
123
|
-
get name() {
|
|
124
|
-
return "BSONVersionError";
|
|
125
|
-
}
|
|
126
|
-
constructor() {
|
|
127
|
-
super(`Unsupported BSON version, bson types must be from bson ${V}.x.x`);
|
|
128
|
-
}
|
|
129
|
-
};
|
|
130
|
-
var tt = class extends $ {
|
|
131
|
-
get name() {
|
|
132
|
-
return "BSONRuntimeError";
|
|
133
|
-
}
|
|
134
|
-
constructor(t) {
|
|
135
|
-
super(t);
|
|
136
|
-
}
|
|
137
|
-
};
|
|
138
|
-
var et = class extends $ {
|
|
139
|
-
get name() {
|
|
140
|
-
return "BSONOffsetError";
|
|
141
|
-
}
|
|
142
|
-
offset;
|
|
143
|
-
constructor(t, e2, n) {
|
|
144
|
-
super(`${t}. offset: ${e2}`, n), this.offset = e2;
|
|
145
|
-
}
|
|
146
|
-
};
|
|
147
|
-
var nt;
|
|
148
|
-
var it;
|
|
149
|
-
function lt(t, e2, n, i) {
|
|
150
|
-
if (i) {
|
|
151
|
-
nt ??= new TextDecoder("utf8", { fatal: true });
|
|
152
|
-
try {
|
|
153
|
-
return nt.decode(t.subarray(e2, n));
|
|
154
|
-
} catch (t2) {
|
|
155
|
-
throw new $("Invalid UTF-8 string in BSON document", { cause: t2 });
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
return it ??= new TextDecoder("utf8", { fatal: false }), it.decode(t.subarray(e2, n));
|
|
159
|
-
}
|
|
160
|
-
function ot(t, e2, n) {
|
|
161
|
-
if (0 === t.length) return "";
|
|
162
|
-
const i = n - e2;
|
|
163
|
-
if (0 === i) return "";
|
|
164
|
-
if (i > 20) return null;
|
|
165
|
-
if (1 === i && t[e2] < 128) return String.fromCharCode(t[e2]);
|
|
166
|
-
if (2 === i && t[e2] < 128 && t[e2 + 1] < 128) return String.fromCharCode(t[e2]) + String.fromCharCode(t[e2 + 1]);
|
|
167
|
-
if (3 === i && t[e2] < 128 && t[e2 + 1] < 128 && t[e2 + 2] < 128) return String.fromCharCode(t[e2]) + String.fromCharCode(t[e2 + 1]) + String.fromCharCode(t[e2 + 2]);
|
|
168
|
-
const l = [];
|
|
169
|
-
for (let i2 = e2; i2 < n; i2++) {
|
|
170
|
-
const e3 = t[i2];
|
|
171
|
-
if (e3 > 127) return null;
|
|
172
|
-
l.push(e3);
|
|
173
|
-
}
|
|
174
|
-
return String.fromCharCode(...l);
|
|
175
|
-
}
|
|
176
|
-
function ct(t) {
|
|
177
|
-
return dt.fromNumberArray(Array.from({ length: t }, (() => Math.floor(256 * Math.random()))));
|
|
178
|
-
}
|
|
179
|
-
function at(t) {
|
|
180
|
-
return crypto.getRandomValues(dt.allocate(t));
|
|
181
|
-
}
|
|
182
|
-
var st = (() => {
|
|
183
|
-
const { crypto: t } = globalThis;
|
|
184
|
-
return null != t && "function" == typeof t.getRandomValues ? at : ct;
|
|
185
|
-
})();
|
|
186
|
-
var dt = { isUint8Array: r, toLocalBufferType(t) {
|
|
187
|
-
if (Buffer.isBuffer(t)) return t;
|
|
188
|
-
if (ArrayBuffer.isView(t)) return Buffer.from(t.buffer, t.byteOffset, t.byteLength);
|
|
189
|
-
const e2 = t?.[Symbol.toStringTag] ?? Object.prototype.toString.call(t);
|
|
190
|
-
if ("ArrayBuffer" === e2 || "SharedArrayBuffer" === e2 || "[object ArrayBuffer]" === e2 || "[object SharedArrayBuffer]" === e2) return Buffer.from(t);
|
|
191
|
-
throw new $("Cannot create Buffer from the passed potentialBuffer.");
|
|
192
|
-
}, allocate: (t) => Buffer.alloc(t), allocateUnsafe: (t) => Buffer.allocUnsafe(t), compare: (t, e2) => dt.toLocalBufferType(t).compare(e2), concat: (t) => Buffer.concat(t), copy: (t, e2, n, i, l) => dt.toLocalBufferType(t).copy(e2, n ?? 0, i ?? 0, l ?? t.length), equals: (t, e2) => dt.toLocalBufferType(t).equals(e2), fromNumberArray: (t) => Buffer.from(t), fromBase64: (t) => Buffer.from(t, "base64"), fromUTF8: (t) => Buffer.from(t, "utf8"), toBase64: (t) => dt.toLocalBufferType(t).toString("base64"), fromISO88591: (t) => Buffer.from(t, "binary"), toISO88591: (t) => dt.toLocalBufferType(t).toString("binary"), fromHex: (t) => Buffer.from(t, "hex"), toHex: (t) => dt.toLocalBufferType(t).toString("hex"), toUTF8(t, e2, n, i) {
|
|
193
|
-
const l = n - e2 <= 20 ? ot(t, e2, n) : null;
|
|
194
|
-
if (null != l) return l;
|
|
195
|
-
const o = dt.toLocalBufferType(t).toString("utf8", e2, n);
|
|
196
|
-
if (i) {
|
|
197
|
-
for (let i2 = 0; i2 < o.length; i2++) if (65533 === o.charCodeAt(i2)) {
|
|
198
|
-
lt(t, e2, n, true);
|
|
199
|
-
break;
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
return o;
|
|
203
|
-
}, utf8ByteLength: (t) => Buffer.byteLength(t, "utf8"), encodeUTF8Into(t, e2, n) {
|
|
204
|
-
const i = (function(t2, e3, n2) {
|
|
205
|
-
if (0 === e3.length) return 0;
|
|
206
|
-
if (e3.length > 25) return null;
|
|
207
|
-
if (t2.length - n2 < e3.length) return null;
|
|
208
|
-
for (let i2 = 0, l = n2; i2 < e3.length; i2++, l++) {
|
|
209
|
-
const n3 = e3.charCodeAt(i2);
|
|
210
|
-
if (n3 > 127) return null;
|
|
211
|
-
t2[l] = n3;
|
|
212
|
-
}
|
|
213
|
-
return e3.length;
|
|
214
|
-
})(t, e2, n);
|
|
215
|
-
return null != i ? i : dt.toLocalBufferType(t).write(e2, n, void 0, "utf8");
|
|
216
|
-
}, randomBytes: st, swap32: (t) => dt.toLocalBufferType(t).swap32() };
|
|
217
|
-
function bt(t) {
|
|
218
|
-
if (t < 0) throw new RangeError(`The argument 'byteLength' is invalid. Received ${t}`);
|
|
219
|
-
return ut.fromNumberArray(Array.from({ length: t }, (() => Math.floor(256 * Math.random()))));
|
|
220
|
-
}
|
|
221
|
-
var Zt = (() => {
|
|
222
|
-
const { crypto: t } = globalThis;
|
|
223
|
-
if (null != t && "function" == typeof t.getRandomValues) return (e2) => t.getRandomValues(ut.allocate(e2));
|
|
224
|
-
if ((function() {
|
|
225
|
-
const { navigator: t2 } = globalThis;
|
|
226
|
-
return "object" == typeof t2 && "ReactNative" === t2.product;
|
|
227
|
-
})()) {
|
|
228
|
-
const { console: t2 } = globalThis;
|
|
229
|
-
t2?.warn?.("BSON: For React Native please polyfill crypto.getRandomValues, e.g. using: https://www.npmjs.com/package/react-native-get-random-values.");
|
|
230
|
-
}
|
|
231
|
-
return bt;
|
|
232
|
-
})();
|
|
233
|
-
var mt = /(\d|[a-f])/i;
|
|
234
|
-
var ut = { isUint8Array: r, toLocalBufferType(t) {
|
|
235
|
-
const e2 = t?.[Symbol.toStringTag] ?? Object.prototype.toString.call(t);
|
|
236
|
-
if ("Uint8Array" === e2) return t;
|
|
237
|
-
if (ArrayBuffer.isView(t)) return new Uint8Array(t.buffer.slice(t.byteOffset, t.byteOffset + t.byteLength));
|
|
238
|
-
if ("ArrayBuffer" === e2 || "SharedArrayBuffer" === e2 || "[object ArrayBuffer]" === e2 || "[object SharedArrayBuffer]" === e2) return new Uint8Array(t);
|
|
239
|
-
throw new $("Cannot make a Uint8Array from passed potentialBuffer.");
|
|
240
|
-
}, allocate(t) {
|
|
241
|
-
if ("number" != typeof t) throw new TypeError(`The "size" argument must be of type number. Received ${String(t)}`);
|
|
242
|
-
return new Uint8Array(t);
|
|
243
|
-
}, allocateUnsafe: (t) => ut.allocate(t), compare(t, e2) {
|
|
244
|
-
if (t === e2) return 0;
|
|
245
|
-
const n = Math.min(t.length, e2.length);
|
|
246
|
-
for (let i = 0; i < n; i++) {
|
|
247
|
-
if (t[i] < e2[i]) return -1;
|
|
248
|
-
if (t[i] > e2[i]) return 1;
|
|
249
|
-
}
|
|
250
|
-
return t.length < e2.length ? -1 : t.length > e2.length ? 1 : 0;
|
|
251
|
-
}, concat(t) {
|
|
252
|
-
if (0 === t.length) return ut.allocate(0);
|
|
253
|
-
let e2 = 0;
|
|
254
|
-
for (const n2 of t) e2 += n2.length;
|
|
255
|
-
const n = ut.allocate(e2);
|
|
256
|
-
let i = 0;
|
|
257
|
-
for (const e3 of t) n.set(e3, i), i += e3.length;
|
|
258
|
-
return n;
|
|
259
|
-
}, copy(t, e2, n, i, l) {
|
|
260
|
-
if (void 0 !== l && l < 0) throw new RangeError(`The value of "sourceEnd" is out of range. It must be >= 0. Received ${l}`);
|
|
261
|
-
if (l = l ?? t.length, void 0 !== i && (i < 0 || i > l)) throw new RangeError(`The value of "sourceStart" is out of range. It must be >= 0 and <= ${l}. Received ${i}`);
|
|
262
|
-
if (i = i ?? 0, void 0 !== n && n < 0) throw new RangeError(`The value of "targetStart" is out of range. It must be >= 0. Received ${n}`);
|
|
263
|
-
n = n ?? 0;
|
|
264
|
-
const o = t.subarray(i, l), c = Math.min(o.length, e2.length - n);
|
|
265
|
-
return c <= 0 ? 0 : (e2.set(o.subarray(0, c), n), c);
|
|
266
|
-
}, equals(t, e2) {
|
|
267
|
-
if (t.byteLength !== e2.byteLength) return false;
|
|
268
|
-
for (let n = 0; n < t.byteLength; n++) if (t[n] !== e2[n]) return false;
|
|
269
|
-
return true;
|
|
270
|
-
}, fromNumberArray: (t) => Uint8Array.from(t), fromBase64: (t) => Uint8Array.from(atob(t), ((t2) => t2.charCodeAt(0))), fromUTF8: (t) => new TextEncoder().encode(t), toBase64: (t) => btoa(ut.toISO88591(t)), fromISO88591: (t) => Uint8Array.from(t, ((t2) => 255 & t2.charCodeAt(0))), toISO88591: (t) => Array.from(Uint16Array.from(t), ((t2) => String.fromCharCode(t2))).join(""), fromHex(t) {
|
|
271
|
-
const e2 = t.length % 2 == 0 ? t : t.slice(0, t.length - 1), n = [];
|
|
272
|
-
for (let t2 = 0; t2 < e2.length; t2 += 2) {
|
|
273
|
-
const i = e2[t2], l = e2[t2 + 1];
|
|
274
|
-
if (!mt.test(i)) break;
|
|
275
|
-
if (!mt.test(l)) break;
|
|
276
|
-
const o = Number.parseInt(`${i}${l}`, 16);
|
|
277
|
-
n.push(o);
|
|
278
|
-
}
|
|
279
|
-
return Uint8Array.from(n);
|
|
280
|
-
}, toHex: (t) => Array.from(t, ((t2) => t2.toString(16).padStart(2, "0"))).join(""), toUTF8(t, e2, n, i) {
|
|
281
|
-
const l = n - e2 <= 20 ? ot(t, e2, n) : null;
|
|
282
|
-
return null != l ? l : lt(t, e2, n, i);
|
|
283
|
-
}, utf8ByteLength: (t) => new TextEncoder().encode(t).byteLength, encodeUTF8Into(t, e2, n) {
|
|
284
|
-
const i = new TextEncoder().encode(e2);
|
|
285
|
-
return t.set(i, n), i.byteLength;
|
|
286
|
-
}, randomBytes: Zt, swap32(t) {
|
|
287
|
-
if (t.length % 4 != 0) throw new RangeError("Buffer size must be a multiple of 32-bits");
|
|
288
|
-
for (let e2 = 0; e2 < t.length; e2 += 4) {
|
|
289
|
-
const n = t[e2], i = t[e2 + 1], l = t[e2 + 2], o = t[e2 + 3];
|
|
290
|
-
t[e2] = o, t[e2 + 1] = l, t[e2 + 2] = i, t[e2 + 3] = n;
|
|
291
|
-
}
|
|
292
|
-
return t;
|
|
293
|
-
} };
|
|
294
|
-
var rt = "function" == typeof Buffer && true !== Buffer.prototype?._isBuffer ? dt : ut;
|
|
295
|
-
var pt = /* @__PURE__ */ Symbol.for("@@mdb.bson.type");
|
|
296
|
-
var ht = class {
|
|
297
|
-
get [pt]() {
|
|
298
|
-
return this._bsontype;
|
|
299
|
-
}
|
|
300
|
-
get [W]() {
|
|
301
|
-
return V;
|
|
302
|
-
}
|
|
303
|
-
[/* @__PURE__ */ Symbol.for("nodejs.util.inspect.custom")](t, e2, n) {
|
|
304
|
-
return this.inspect(t, e2, n);
|
|
305
|
-
}
|
|
306
|
-
};
|
|
307
|
-
var yt = new Float64Array(1);
|
|
308
|
-
var Gt = new Uint8Array(yt.buffer, 0, 8);
|
|
309
|
-
yt[0] = -1;
|
|
310
|
-
var Xt = 0 === Gt[7];
|
|
311
|
-
var Vt = { isBigEndian: Xt, getNonnegativeInt32LE(t, e2) {
|
|
312
|
-
if (t[e2 + 3] > 127) throw new RangeError(`Size cannot be negative at offset: ${e2}`);
|
|
313
|
-
return t[e2] | t[e2 + 1] << 8 | t[e2 + 2] << 16 | t[e2 + 3] << 24;
|
|
314
|
-
}, getInt32LE: (t, e2) => t[e2] | t[e2 + 1] << 8 | t[e2 + 2] << 16 | t[e2 + 3] << 24, getUint32LE: (t, e2) => t[e2] + 256 * t[e2 + 1] + 65536 * t[e2 + 2] + 16777216 * t[e2 + 3], getUint32BE: (t, e2) => t[e2 + 3] + 256 * t[e2 + 2] + 65536 * t[e2 + 1] + 16777216 * t[e2], getBigInt64LE: (t, e2) => (BigInt(t[e2 + 4] + 256 * t[e2 + 5] + 65536 * t[e2 + 6] + (t[e2 + 7] << 24)) << 32n) + BigInt(t[e2] + 256 * t[e2 + 1] + 65536 * t[e2 + 2] + 16777216 * t[e2 + 3]), getFloat64LE: Xt ? (t, e2) => (Gt[7] = t[e2], Gt[6] = t[e2 + 1], Gt[5] = t[e2 + 2], Gt[4] = t[e2 + 3], Gt[3] = t[e2 + 4], Gt[2] = t[e2 + 5], Gt[1] = t[e2 + 6], Gt[0] = t[e2 + 7], yt[0]) : (t, e2) => (Gt[0] = t[e2], Gt[1] = t[e2 + 1], Gt[2] = t[e2 + 2], Gt[3] = t[e2 + 3], Gt[4] = t[e2 + 4], Gt[5] = t[e2 + 5], Gt[6] = t[e2 + 6], Gt[7] = t[e2 + 7], yt[0]), setInt32BE: (t, e2, n) => (t[e2 + 3] = n, n >>>= 8, t[e2 + 2] = n, n >>>= 8, t[e2 + 1] = n, n >>>= 8, t[e2] = n, 4), setInt32LE: (t, e2, n) => (t[e2] = n, n >>>= 8, t[e2 + 1] = n, n >>>= 8, t[e2 + 2] = n, n >>>= 8, t[e2 + 3] = n, 4), setBigInt64LE(t, e2, n) {
|
|
315
|
-
const i = 0xffffffffn;
|
|
316
|
-
let l = Number(n & i);
|
|
317
|
-
t[e2] = l, l >>= 8, t[e2 + 1] = l, l >>= 8, t[e2 + 2] = l, l >>= 8, t[e2 + 3] = l;
|
|
318
|
-
let o = Number(n >> 32n & i);
|
|
319
|
-
return t[e2 + 4] = o, o >>= 8, t[e2 + 5] = o, o >>= 8, t[e2 + 6] = o, o >>= 8, t[e2 + 7] = o, 8;
|
|
320
|
-
}, setFloat64LE: Xt ? (t, e2, n) => (yt[0] = n, t[e2] = Gt[7], t[e2 + 1] = Gt[6], t[e2 + 2] = Gt[5], t[e2 + 3] = Gt[4], t[e2 + 4] = Gt[3], t[e2 + 5] = Gt[2], t[e2 + 6] = Gt[1], t[e2 + 7] = Gt[0], 8) : (t, e2, n) => (yt[0] = n, t[e2] = Gt[0], t[e2 + 1] = Gt[1], t[e2 + 2] = Gt[2], t[e2 + 3] = Gt[3], t[e2 + 4] = Gt[4], t[e2 + 5] = Gt[5], t[e2 + 6] = Gt[6], t[e2 + 7] = Gt[7], 8) };
|
|
321
|
-
var Wt = class _Wt extends ht {
|
|
322
|
-
get _bsontype() {
|
|
323
|
-
return "Binary";
|
|
324
|
-
}
|
|
325
|
-
static BSON_BINARY_SUBTYPE_DEFAULT = 0;
|
|
326
|
-
static BUFFER_SIZE = 256;
|
|
327
|
-
static SUBTYPE_DEFAULT = 0;
|
|
328
|
-
static SUBTYPE_FUNCTION = 1;
|
|
329
|
-
static SUBTYPE_BYTE_ARRAY = 2;
|
|
330
|
-
static SUBTYPE_UUID_OLD = 3;
|
|
331
|
-
static SUBTYPE_UUID = 4;
|
|
332
|
-
static SUBTYPE_MD5 = 5;
|
|
333
|
-
static SUBTYPE_ENCRYPTED = 6;
|
|
334
|
-
static SUBTYPE_COLUMN = 7;
|
|
335
|
-
static SUBTYPE_SENSITIVE = 8;
|
|
336
|
-
static SUBTYPE_VECTOR = 9;
|
|
337
|
-
static SUBTYPE_USER_DEFINED = 128;
|
|
338
|
-
static VECTOR_TYPE = Object.freeze({ Int8: 3, Float32: 39, PackedBit: 16 });
|
|
339
|
-
buffer;
|
|
340
|
-
sub_type;
|
|
341
|
-
position;
|
|
342
|
-
constructor(t, e2) {
|
|
343
|
-
if (super(), null != t && "string" == typeof t && !ArrayBuffer.isView(t) && !p(t) && !Array.isArray(t)) throw new $("Binary can only be constructed from Uint8Array or number[]");
|
|
344
|
-
this.sub_type = e2 ?? _Wt.BSON_BINARY_SUBTYPE_DEFAULT, null == t ? (this.buffer = rt.allocate(_Wt.BUFFER_SIZE), this.position = 0) : (this.buffer = Array.isArray(t) ? rt.fromNumberArray(t) : rt.toLocalBufferType(t), this.position = this.buffer.byteLength);
|
|
345
|
-
}
|
|
346
|
-
put(t) {
|
|
347
|
-
if ("string" == typeof t && 1 !== t.length) throw new $("only accepts single character String");
|
|
348
|
-
if ("number" != typeof t && 1 !== t.length) throw new $("only accepts single character Uint8Array or Array");
|
|
349
|
-
let e2;
|
|
350
|
-
if (e2 = "string" == typeof t ? t.charCodeAt(0) : "number" == typeof t ? t : t[0], e2 < 0 || e2 > 255) throw new $("only accepts number in a valid unsigned byte range 0-255");
|
|
351
|
-
if (this.buffer.byteLength > this.position) this.buffer[this.position++] = e2;
|
|
352
|
-
else {
|
|
353
|
-
const t2 = rt.allocate(_Wt.BUFFER_SIZE + this.buffer.length);
|
|
354
|
-
t2.set(this.buffer, 0), this.buffer = t2, this.buffer[this.position++] = e2;
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
write(t, e2) {
|
|
358
|
-
if (e2 = "number" == typeof e2 ? e2 : this.position, this.buffer.byteLength < e2 + t.length) {
|
|
359
|
-
const e3 = rt.allocate(this.buffer.byteLength + t.length);
|
|
360
|
-
e3.set(this.buffer, 0), this.buffer = e3;
|
|
361
|
-
}
|
|
362
|
-
if (ArrayBuffer.isView(t)) this.buffer.set(rt.toLocalBufferType(t), e2), this.position = e2 + t.byteLength > this.position ? e2 + t.length : this.position;
|
|
363
|
-
else if ("string" == typeof t) throw new $("input cannot be string");
|
|
364
|
-
}
|
|
365
|
-
read(t, e2) {
|
|
366
|
-
const n = t + (e2 = e2 && e2 > 0 ? e2 : this.position);
|
|
367
|
-
return this.buffer.subarray(t, n > this.position ? this.position : n);
|
|
368
|
-
}
|
|
369
|
-
value() {
|
|
370
|
-
return this.buffer.length === this.position ? this.buffer : this.buffer.subarray(0, this.position);
|
|
371
|
-
}
|
|
372
|
-
length() {
|
|
373
|
-
return this.position;
|
|
374
|
-
}
|
|
375
|
-
toJSON() {
|
|
376
|
-
return rt.toBase64(this.buffer.subarray(0, this.position));
|
|
377
|
-
}
|
|
378
|
-
toString(t) {
|
|
379
|
-
return "hex" === t ? rt.toHex(this.buffer.subarray(0, this.position)) : "base64" === t ? rt.toBase64(this.buffer.subarray(0, this.position)) : rt.toUTF8(this.buffer, 0, this.position, false);
|
|
380
|
-
}
|
|
381
|
-
toExtendedJSON(t) {
|
|
382
|
-
t = t || {}, this.sub_type === _Wt.SUBTYPE_VECTOR && ft(this);
|
|
383
|
-
const e2 = rt.toBase64(this.buffer), n = Number(this.sub_type).toString(16);
|
|
384
|
-
return t.legacy ? { $binary: e2, $type: 1 === n.length ? "0" + n : n } : { $binary: { base64: e2, subType: 1 === n.length ? "0" + n : n } };
|
|
385
|
-
}
|
|
386
|
-
toUUID() {
|
|
387
|
-
if (this.sub_type === _Wt.SUBTYPE_UUID) return new It(this.buffer.subarray(0, this.position));
|
|
388
|
-
throw new $(`Binary sub_type "${this.sub_type}" is not supported for converting to UUID. Only "${_Wt.SUBTYPE_UUID}" is currently supported.`);
|
|
389
|
-
}
|
|
390
|
-
static createFromHexString(t, e2) {
|
|
391
|
-
return new _Wt(rt.fromHex(t), e2);
|
|
392
|
-
}
|
|
393
|
-
static createFromBase64(t, e2) {
|
|
394
|
-
return new _Wt(rt.fromBase64(t), e2);
|
|
395
|
-
}
|
|
396
|
-
static fromExtendedJSON(t, e2) {
|
|
397
|
-
let n, i;
|
|
398
|
-
if (e2 = e2 || {}, "$binary" in t ? e2.legacy && "string" == typeof t.$binary && "$type" in t ? (i = t.$type ? parseInt(t.$type, 16) : 0, n = rt.fromBase64(t.$binary)) : "string" != typeof t.$binary && (i = t.$binary.subType ? parseInt(t.$binary.subType, 16) : 0, n = rt.fromBase64(t.$binary.base64)) : "$uuid" in t && (i = 4, n = It.bytesFromString(t.$uuid)), !n) throw new $(`Unexpected Binary Extended JSON format ${JSON.stringify(t)}`);
|
|
399
|
-
return i === D ? new It(n) : new _Wt(n, i);
|
|
400
|
-
}
|
|
401
|
-
inspect(t, e2, n) {
|
|
402
|
-
n ??= X;
|
|
403
|
-
return `Binary.createFromBase64(${n(rt.toBase64(this.buffer.subarray(0, this.position)), e2)}, ${n(this.sub_type, e2)})`;
|
|
404
|
-
}
|
|
405
|
-
toInt8Array() {
|
|
406
|
-
if (this.sub_type !== _Wt.SUBTYPE_VECTOR) throw new $("Binary sub_type is not Vector");
|
|
407
|
-
if (this.buffer[0] !== _Wt.VECTOR_TYPE.Int8) throw new $("Binary datatype field is not Int8");
|
|
408
|
-
return ft(this), new Int8Array(this.buffer.buffer.slice(this.buffer.byteOffset + 2, this.buffer.byteOffset + this.position));
|
|
409
|
-
}
|
|
410
|
-
toFloat32Array() {
|
|
411
|
-
if (this.sub_type !== _Wt.SUBTYPE_VECTOR) throw new $("Binary sub_type is not Vector");
|
|
412
|
-
if (this.buffer[0] !== _Wt.VECTOR_TYPE.Float32) throw new $("Binary datatype field is not Float32");
|
|
413
|
-
ft(this);
|
|
414
|
-
const t = new Uint8Array(this.buffer.buffer.slice(this.buffer.byteOffset + 2, this.buffer.byteOffset + this.position));
|
|
415
|
-
return Vt.isBigEndian && rt.swap32(t), new Float32Array(t.buffer);
|
|
416
|
-
}
|
|
417
|
-
toPackedBits() {
|
|
418
|
-
if (this.sub_type !== _Wt.SUBTYPE_VECTOR) throw new $("Binary sub_type is not Vector");
|
|
419
|
-
if (this.buffer[0] !== _Wt.VECTOR_TYPE.PackedBit) throw new $("Binary datatype field is not packed bit");
|
|
420
|
-
return ft(this), new Uint8Array(this.buffer.buffer.slice(this.buffer.byteOffset + 2, this.buffer.byteOffset + this.position));
|
|
421
|
-
}
|
|
422
|
-
toBits() {
|
|
423
|
-
if (this.sub_type !== _Wt.SUBTYPE_VECTOR) throw new $("Binary sub_type is not Vector");
|
|
424
|
-
if (this.buffer[0] !== _Wt.VECTOR_TYPE.PackedBit) throw new $("Binary datatype field is not packed bit");
|
|
425
|
-
ft(this);
|
|
426
|
-
const t = 8 * (this.length() - 2) - this.buffer[1], e2 = new Int8Array(t);
|
|
427
|
-
for (let t2 = 0; t2 < e2.length; t2++) {
|
|
428
|
-
const n = t2 / 8 | 0, i = this.buffer[n + 2] >> 7 - t2 % 8 & 1;
|
|
429
|
-
e2[t2] = i;
|
|
430
|
-
}
|
|
431
|
-
return e2;
|
|
432
|
-
}
|
|
433
|
-
static fromInt8Array(t) {
|
|
434
|
-
const e2 = rt.allocate(t.byteLength + 2);
|
|
435
|
-
e2[0] = _Wt.VECTOR_TYPE.Int8, e2[1] = 0;
|
|
436
|
-
const n = new Uint8Array(t.buffer, t.byteOffset, t.byteLength);
|
|
437
|
-
e2.set(n, 2);
|
|
438
|
-
const i = new this(e2, this.SUBTYPE_VECTOR);
|
|
439
|
-
return ft(i), i;
|
|
440
|
-
}
|
|
441
|
-
static fromFloat32Array(t) {
|
|
442
|
-
const e2 = rt.allocate(t.byteLength + 2);
|
|
443
|
-
e2[0] = _Wt.VECTOR_TYPE.Float32, e2[1] = 0;
|
|
444
|
-
const n = new Uint8Array(t.buffer, t.byteOffset, t.byteLength);
|
|
445
|
-
e2.set(n, 2), Vt.isBigEndian && rt.swap32(new Uint8Array(e2.buffer, 2));
|
|
446
|
-
const i = new this(e2, this.SUBTYPE_VECTOR);
|
|
447
|
-
return ft(i), i;
|
|
448
|
-
}
|
|
449
|
-
static fromPackedBits(t, e2 = 0) {
|
|
450
|
-
const n = rt.allocate(t.byteLength + 2);
|
|
451
|
-
n[0] = _Wt.VECTOR_TYPE.PackedBit, n[1] = e2, n.set(t, 2);
|
|
452
|
-
const i = new this(n, this.SUBTYPE_VECTOR);
|
|
453
|
-
return ft(i), i;
|
|
454
|
-
}
|
|
455
|
-
static fromBits(t) {
|
|
456
|
-
const e2 = t.length + 7 >>> 3, n = new Uint8Array(e2 + 2);
|
|
457
|
-
n[0] = _Wt.VECTOR_TYPE.PackedBit;
|
|
458
|
-
const i = t.length % 8;
|
|
459
|
-
n[1] = 0 === i ? 0 : 8 - i;
|
|
460
|
-
for (let e3 = 0; e3 < t.length; e3++) {
|
|
461
|
-
const i2 = e3 >>> 3, l = t[e3];
|
|
462
|
-
if (0 !== l && 1 !== l) throw new $(`Invalid bit value at ${e3}: must be 0 or 1, found ${t[e3]}`);
|
|
463
|
-
if (0 === l) continue;
|
|
464
|
-
const o = 7 - e3 % 8;
|
|
465
|
-
n[i2 + 2] |= l << o;
|
|
466
|
-
}
|
|
467
|
-
return new this(n, _Wt.SUBTYPE_VECTOR);
|
|
468
|
-
}
|
|
469
|
-
};
|
|
470
|
-
function ft(t) {
|
|
471
|
-
if (t.sub_type !== Wt.SUBTYPE_VECTOR) return;
|
|
472
|
-
const e2 = t.position, n = t.buffer[0], i = t.buffer[1];
|
|
473
|
-
if ((n === Wt.VECTOR_TYPE.Float32 || n === Wt.VECTOR_TYPE.Int8) && 0 !== i) throw new $("Invalid Vector: padding must be zero for int8 and float32 vectors");
|
|
474
|
-
if (n === Wt.VECTOR_TYPE.Float32 && 0 !== e2 && e2 - 2 != 0 && (e2 - 2) % 4 != 0) throw new $("Invalid Vector: Float32 vector must contain a multiple of 4 bytes");
|
|
475
|
-
if (n === Wt.VECTOR_TYPE.PackedBit && 0 !== i && 2 === e2) throw new $("Invalid Vector: padding must be zero for packed bit vectors that are empty");
|
|
476
|
-
if (n === Wt.VECTOR_TYPE.PackedBit && i > 7) throw new $(`Invalid Vector: padding must be a value between 0 and 7. found: ${i}`);
|
|
477
|
-
}
|
|
478
|
-
var gt = /^[0-9A-F]{32}$/i;
|
|
479
|
-
var Yt = /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i;
|
|
480
|
-
var It = class _It extends Wt {
|
|
481
|
-
constructor(t) {
|
|
482
|
-
let e2;
|
|
483
|
-
if (null == t) e2 = _It.generate();
|
|
484
|
-
else if (t instanceof _It) e2 = rt.toLocalBufferType(new Uint8Array(t.buffer));
|
|
485
|
-
else if (ArrayBuffer.isView(t) && 16 === t.byteLength) e2 = rt.toLocalBufferType(t);
|
|
486
|
-
else {
|
|
487
|
-
if ("string" != typeof t) throw new $("Argument passed in UUID constructor must be a UUID, a 16 byte Buffer or a 32/36 character hex string (dashes excluded/included, format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).");
|
|
488
|
-
e2 = _It.bytesFromString(t);
|
|
489
|
-
}
|
|
490
|
-
super(e2, D);
|
|
491
|
-
}
|
|
492
|
-
get id() {
|
|
493
|
-
return this.buffer;
|
|
494
|
-
}
|
|
495
|
-
set id(t) {
|
|
496
|
-
this.buffer = t;
|
|
497
|
-
}
|
|
498
|
-
toHexString(t = true) {
|
|
499
|
-
return t ? [rt.toHex(this.buffer.subarray(0, 4)), rt.toHex(this.buffer.subarray(4, 6)), rt.toHex(this.buffer.subarray(6, 8)), rt.toHex(this.buffer.subarray(8, 10)), rt.toHex(this.buffer.subarray(10, 16))].join("-") : rt.toHex(this.buffer);
|
|
500
|
-
}
|
|
501
|
-
toString(t) {
|
|
502
|
-
return "hex" === t ? rt.toHex(this.id) : "base64" === t ? rt.toBase64(this.id) : this.toHexString();
|
|
503
|
-
}
|
|
504
|
-
toJSON() {
|
|
505
|
-
return this.toHexString();
|
|
506
|
-
}
|
|
507
|
-
equals(t) {
|
|
508
|
-
if (!t) return false;
|
|
509
|
-
if (t instanceof _It) return rt.equals(t.id, this.id);
|
|
510
|
-
try {
|
|
511
|
-
return rt.equals(new _It(t).id, this.id);
|
|
512
|
-
} catch {
|
|
513
|
-
return false;
|
|
514
|
-
}
|
|
515
|
-
}
|
|
516
|
-
toBinary() {
|
|
517
|
-
return new Wt(this.id, Wt.SUBTYPE_UUID);
|
|
518
|
-
}
|
|
519
|
-
static generate() {
|
|
520
|
-
const t = rt.randomBytes(16);
|
|
521
|
-
return t[6] = 15 & t[6] | 64, t[8] = 63 & t[8] | 128, t;
|
|
522
|
-
}
|
|
523
|
-
static isValid(t) {
|
|
524
|
-
return !!t && ("string" == typeof t ? _It.isValidUUIDString(t) : r(t) ? 16 === t.byteLength : "Binary" === t._bsontype && t.sub_type === this.SUBTYPE_UUID && 16 === t.buffer.byteLength);
|
|
525
|
-
}
|
|
526
|
-
static createFromHexString(t) {
|
|
527
|
-
const e2 = _It.bytesFromString(t);
|
|
528
|
-
return new _It(e2);
|
|
529
|
-
}
|
|
530
|
-
static createFromBase64(t) {
|
|
531
|
-
return new _It(rt.fromBase64(t));
|
|
532
|
-
}
|
|
533
|
-
static bytesFromString(t) {
|
|
534
|
-
if (!_It.isValidUUIDString(t)) throw new $("UUID string representation must be 32 hex digits or canonical hyphenated representation");
|
|
535
|
-
return rt.fromHex(t.replace(/-/g, ""));
|
|
536
|
-
}
|
|
537
|
-
static isValidUUIDString(t) {
|
|
538
|
-
return gt.test(t) || Yt.test(t);
|
|
539
|
-
}
|
|
540
|
-
inspect(t, e2, n) {
|
|
541
|
-
return n ??= X, `new UUID(${n(this.toHexString(), e2)})`;
|
|
542
|
-
}
|
|
543
|
-
};
|
|
544
|
-
var Rt = class _Rt extends ht {
|
|
545
|
-
get _bsontype() {
|
|
546
|
-
return "Code";
|
|
547
|
-
}
|
|
548
|
-
code;
|
|
549
|
-
scope;
|
|
550
|
-
constructor(t, e2) {
|
|
551
|
-
super(), this.code = t.toString(), this.scope = e2 ?? null;
|
|
552
|
-
}
|
|
553
|
-
toJSON() {
|
|
554
|
-
return null != this.scope ? { code: this.code, scope: this.scope } : { code: this.code };
|
|
555
|
-
}
|
|
556
|
-
toExtendedJSON() {
|
|
557
|
-
return this.scope ? { $code: this.code, $scope: this.scope } : { $code: this.code };
|
|
558
|
-
}
|
|
559
|
-
static fromExtendedJSON(t) {
|
|
560
|
-
return new _Rt(t.$code, t.$scope);
|
|
561
|
-
}
|
|
562
|
-
inspect(t, e2, n) {
|
|
563
|
-
n ??= X;
|
|
564
|
-
let i = n(this.code, e2);
|
|
565
|
-
const l = i.includes("\n");
|
|
566
|
-
null != this.scope && (i += `,${l ? "\n" : " "}${n(this.scope, e2)}`);
|
|
567
|
-
return `new Code(${l ? "\n" : ""}${i}${l && null === this.scope ? "\n" : ""})`;
|
|
568
|
-
}
|
|
569
|
-
};
|
|
570
|
-
function St(t) {
|
|
571
|
-
return null != t && "object" == typeof t && "$id" in t && null != t.$id && "$ref" in t && "string" == typeof t.$ref && (!("$db" in t) || "$db" in t && "string" == typeof t.$db);
|
|
572
|
-
}
|
|
573
|
-
var Jt = class _Jt extends ht {
|
|
574
|
-
get _bsontype() {
|
|
575
|
-
return "DBRef";
|
|
576
|
-
}
|
|
577
|
-
collection;
|
|
578
|
-
oid;
|
|
579
|
-
db;
|
|
580
|
-
fields;
|
|
581
|
-
constructor(t, e2, n, i) {
|
|
582
|
-
super();
|
|
583
|
-
const l = t.split(".");
|
|
584
|
-
2 === l.length && (n = l.shift(), t = l.shift()), this.collection = t, this.oid = e2, this.db = n, this.fields = i || {};
|
|
585
|
-
}
|
|
586
|
-
get namespace() {
|
|
587
|
-
return this.collection;
|
|
588
|
-
}
|
|
589
|
-
set namespace(t) {
|
|
590
|
-
this.collection = t;
|
|
591
|
-
}
|
|
592
|
-
toJSON() {
|
|
593
|
-
const t = Object.assign({ $ref: this.collection, $id: this.oid }, this.fields);
|
|
594
|
-
return null != this.db && (t.$db = this.db), t;
|
|
595
|
-
}
|
|
596
|
-
toExtendedJSON(t) {
|
|
597
|
-
t = t || {};
|
|
598
|
-
let e2 = { $ref: this.collection, $id: this.oid };
|
|
599
|
-
return t.legacy || (this.db && (e2.$db = this.db), e2 = Object.assign(e2, this.fields)), e2;
|
|
600
|
-
}
|
|
601
|
-
static fromExtendedJSON(t) {
|
|
602
|
-
const e2 = Object.assign({}, t);
|
|
603
|
-
return delete e2.$ref, delete e2.$id, delete e2.$db, new _Jt(t.$ref, t.$id, t.$db, e2);
|
|
604
|
-
}
|
|
605
|
-
inspect(t, e2, n) {
|
|
606
|
-
n ??= X;
|
|
607
|
-
const i = [n(this.namespace, e2), n(this.oid, e2), ...this.db ? [n(this.db, e2)] : [], ...Object.keys(this.fields).length > 0 ? [n(this.fields, e2)] : []];
|
|
608
|
-
return i[1] = n === X ? `new ObjectId(${i[1]})` : i[1], `new DBRef(${i.join(", ")})`;
|
|
609
|
-
}
|
|
610
|
-
};
|
|
611
|
-
function Kt(t) {
|
|
612
|
-
if ("" === t) return t;
|
|
613
|
-
let e2 = 0;
|
|
614
|
-
const n = "-" === t[e2], i = "+" === t[e2];
|
|
615
|
-
(i || n) && (e2 += 1);
|
|
616
|
-
let l = false;
|
|
617
|
-
for (; e2 < t.length && "0" === t[e2]; ++e2) l = true;
|
|
618
|
-
return l ? `${n ? "-" : ""}${t.length === e2 ? "0" : t.slice(e2)}` : i ? t.slice(1) : t;
|
|
619
|
-
}
|
|
620
|
-
var Lt;
|
|
621
|
-
try {
|
|
622
|
-
Lt = new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([0, 97, 115, 109, 1, 0, 0, 0, 1, 13, 2, 96, 0, 1, 127, 96, 4, 127, 127, 127, 127, 1, 127, 3, 7, 6, 0, 1, 1, 1, 1, 1, 6, 6, 1, 127, 1, 65, 0, 11, 7, 50, 6, 3, 109, 117, 108, 0, 1, 5, 100, 105, 118, 95, 115, 0, 2, 5, 100, 105, 118, 95, 117, 0, 3, 5, 114, 101, 109, 95, 115, 0, 4, 5, 114, 101, 109, 95, 117, 0, 5, 8, 103, 101, 116, 95, 104, 105, 103, 104, 0, 0, 10, 191, 1, 6, 4, 0, 35, 0, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 126, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 127, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 128, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 129, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 130, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11])), {}).exports;
|
|
623
|
-
} catch {
|
|
624
|
-
}
|
|
625
|
-
var Tt = 4294967296;
|
|
626
|
-
var Ut = 18446744073709552e3;
|
|
627
|
-
var Nt = Ut / 2;
|
|
628
|
-
var zt = {};
|
|
629
|
-
var xt = {};
|
|
630
|
-
var wt = /^(\+?0|(\+|-)?[1-9][0-9]*)$/;
|
|
631
|
-
var Ht = class _Ht extends ht {
|
|
632
|
-
get _bsontype() {
|
|
633
|
-
return "Long";
|
|
634
|
-
}
|
|
635
|
-
get __isLong__() {
|
|
636
|
-
return true;
|
|
637
|
-
}
|
|
638
|
-
high;
|
|
639
|
-
low;
|
|
640
|
-
unsigned;
|
|
641
|
-
constructor(t = 0, e2, n) {
|
|
642
|
-
super();
|
|
643
|
-
const i = "boolean" == typeof e2 ? e2 : Boolean(n), l = "number" == typeof e2 ? e2 : 0, o = "string" == typeof t ? _Ht.fromString(t, i) : "bigint" == typeof t ? _Ht.fromBigInt(t, i) : { low: 0 | t, high: 0 | l, unsigned: i };
|
|
644
|
-
this.low = o.low, this.high = o.high, this.unsigned = o.unsigned;
|
|
645
|
-
}
|
|
646
|
-
static TWO_PWR_24 = _Ht.fromInt(16777216);
|
|
647
|
-
static MAX_UNSIGNED_VALUE = _Ht.fromBits(-1, -1, true);
|
|
648
|
-
static ZERO = _Ht.fromInt(0);
|
|
649
|
-
static UZERO = _Ht.fromInt(0, true);
|
|
650
|
-
static ONE = _Ht.fromInt(1);
|
|
651
|
-
static UONE = _Ht.fromInt(1, true);
|
|
652
|
-
static NEG_ONE = _Ht.fromInt(-1);
|
|
653
|
-
static MAX_VALUE = _Ht.fromBits(-1, 2147483647, false);
|
|
654
|
-
static MIN_VALUE = _Ht.fromBits(0, -2147483648, false);
|
|
655
|
-
static fromBits(t, e2, n) {
|
|
656
|
-
return new _Ht(t, e2, n);
|
|
657
|
-
}
|
|
658
|
-
static fromInt(t, e2) {
|
|
659
|
-
let n, i, l;
|
|
660
|
-
return e2 ? (l = 0 <= (t >>>= 0) && t < 256) && (i = xt[t], i) ? i : (n = _Ht.fromBits(t, (0 | t) < 0 ? -1 : 0, true), l && (xt[t] = n), n) : (l = -128 <= (t |= 0) && t < 128) && (i = zt[t], i) ? i : (n = _Ht.fromBits(t, t < 0 ? -1 : 0, false), l && (zt[t] = n), n);
|
|
661
|
-
}
|
|
662
|
-
static fromNumber(t, e2) {
|
|
663
|
-
if (isNaN(t)) return e2 ? _Ht.UZERO : _Ht.ZERO;
|
|
664
|
-
if (e2) {
|
|
665
|
-
if (t < 0) return _Ht.UZERO;
|
|
666
|
-
if (t >= Ut) return _Ht.MAX_UNSIGNED_VALUE;
|
|
667
|
-
} else {
|
|
668
|
-
if (t <= -Nt) return _Ht.MIN_VALUE;
|
|
669
|
-
if (t + 1 >= Nt) return _Ht.MAX_VALUE;
|
|
670
|
-
}
|
|
671
|
-
return t < 0 ? _Ht.fromNumber(-t, e2).neg() : _Ht.fromBits(t % Tt | 0, t / Tt | 0, e2);
|
|
672
|
-
}
|
|
673
|
-
static fromBigInt(t, e2) {
|
|
674
|
-
const n = 0xffffffffn;
|
|
675
|
-
return new _Ht(Number(t & n), Number(t >> 32n & n), e2);
|
|
676
|
-
}
|
|
677
|
-
static _fromString(t, e2, n) {
|
|
678
|
-
if (0 === t.length) throw new $("empty string");
|
|
679
|
-
if (n < 2 || 36 < n) throw new $("radix");
|
|
680
|
-
let i;
|
|
681
|
-
if ((i = t.indexOf("-")) > 0) throw new $("interior hyphen");
|
|
682
|
-
if (0 === i) return _Ht._fromString(t.substring(1), e2, n).neg();
|
|
683
|
-
const l = _Ht.fromNumber(Math.pow(n, 8));
|
|
684
|
-
let o = _Ht.ZERO;
|
|
685
|
-
for (let e3 = 0; e3 < t.length; e3 += 8) {
|
|
686
|
-
const i2 = Math.min(8, t.length - e3), c = parseInt(t.substring(e3, e3 + i2), n);
|
|
687
|
-
if (i2 < 8) {
|
|
688
|
-
const t2 = _Ht.fromNumber(Math.pow(n, i2));
|
|
689
|
-
o = o.mul(t2).add(_Ht.fromNumber(c));
|
|
690
|
-
} else o = o.mul(l), o = o.add(_Ht.fromNumber(c));
|
|
691
|
-
}
|
|
692
|
-
return o.unsigned = e2, o;
|
|
693
|
-
}
|
|
694
|
-
static fromStringStrict(t, e2, n) {
|
|
695
|
-
let i = false;
|
|
696
|
-
if ("number" == typeof e2 ? (n = e2, e2 = false) : i = !!e2, n ??= 10, t.trim() !== t) throw new $(`Input: '${t}' contains leading and/or trailing whitespace`);
|
|
697
|
-
if (!(function(t2, e3) {
|
|
698
|
-
const n2 = "0123456789abcdefghijklmnopqrstuvwxyz".slice(0, e3 = e3 ?? 10);
|
|
699
|
-
return !new RegExp(`[^-+${n2}]`, "i").test(t2) && t2;
|
|
700
|
-
})(t, n)) throw new $(`Input: '${t}' contains invalid characters for radix: ${n}`);
|
|
701
|
-
const l = Kt(t), o = _Ht._fromString(l, i, n);
|
|
702
|
-
if (o.toString(n).toLowerCase() !== l.toLowerCase()) throw new $(`Input: ${t} is not representable as ${o.unsigned ? "an unsigned" : "a signed"} 64-bit Long ${null != n ? `with radix: ${n}` : ""}`);
|
|
703
|
-
return o;
|
|
704
|
-
}
|
|
705
|
-
static fromString(t, e2, n) {
|
|
706
|
-
let i = false;
|
|
707
|
-
return "number" == typeof e2 ? (n = e2, e2 = false) : i = !!e2, n ??= 10, "NaN" === t && n < 24 || ("Infinity" === t || "+Infinity" === t || "-Infinity" === t) && n < 35 ? _Ht.ZERO : _Ht._fromString(t, i, n);
|
|
708
|
-
}
|
|
709
|
-
static fromBytes(t, e2, n) {
|
|
710
|
-
return n ? _Ht.fromBytesLE(t, e2) : _Ht.fromBytesBE(t, e2);
|
|
711
|
-
}
|
|
712
|
-
static fromBytesLE(t, e2) {
|
|
713
|
-
return new _Ht(t[0] | t[1] << 8 | t[2] << 16 | t[3] << 24, t[4] | t[5] << 8 | t[6] << 16 | t[7] << 24, e2);
|
|
714
|
-
}
|
|
715
|
-
static fromBytesBE(t, e2) {
|
|
716
|
-
return new _Ht(t[4] << 24 | t[5] << 16 | t[6] << 8 | t[7], t[0] << 24 | t[1] << 16 | t[2] << 8 | t[3], e2);
|
|
717
|
-
}
|
|
718
|
-
static isLong(t) {
|
|
719
|
-
return null != t && "object" == typeof t && "__isLong__" in t && true === t.__isLong__;
|
|
720
|
-
}
|
|
721
|
-
static fromValue(t, e2) {
|
|
722
|
-
return "number" == typeof t ? _Ht.fromNumber(t, e2) : "string" == typeof t ? _Ht.fromString(t, e2) : _Ht.fromBits(t.low, t.high, "boolean" == typeof e2 ? e2 : t.unsigned);
|
|
723
|
-
}
|
|
724
|
-
add(t) {
|
|
725
|
-
_Ht.isLong(t) || (t = _Ht.fromValue(t));
|
|
726
|
-
const e2 = this.high >>> 16, n = 65535 & this.high, i = this.low >>> 16, l = 65535 & this.low, o = t.high >>> 16, c = 65535 & t.high, a = t.low >>> 16;
|
|
727
|
-
let s = 0, d = 0, b = 0, Z = 0;
|
|
728
|
-
return Z += l + (65535 & t.low), b += Z >>> 16, Z &= 65535, b += i + a, d += b >>> 16, b &= 65535, d += n + c, s += d >>> 16, d &= 65535, s += e2 + o, s &= 65535, _Ht.fromBits(b << 16 | Z, s << 16 | d, this.unsigned);
|
|
729
|
-
}
|
|
730
|
-
and(t) {
|
|
731
|
-
return _Ht.isLong(t) || (t = _Ht.fromValue(t)), _Ht.fromBits(this.low & t.low, this.high & t.high, this.unsigned);
|
|
732
|
-
}
|
|
733
|
-
compare(t) {
|
|
734
|
-
if (_Ht.isLong(t) || (t = _Ht.fromValue(t)), this.eq(t)) return 0;
|
|
735
|
-
const e2 = this.isNegative(), n = t.isNegative();
|
|
736
|
-
return e2 && !n ? -1 : !e2 && n ? 1 : this.unsigned ? t.high >>> 0 > this.high >>> 0 || t.high === this.high && t.low >>> 0 > this.low >>> 0 ? -1 : 1 : this.sub(t).isNegative() ? -1 : 1;
|
|
737
|
-
}
|
|
738
|
-
comp(t) {
|
|
739
|
-
return this.compare(t);
|
|
740
|
-
}
|
|
741
|
-
divide(t) {
|
|
742
|
-
if (_Ht.isLong(t) || (t = _Ht.fromValue(t)), t.isZero()) throw new $("division by zero");
|
|
743
|
-
if (Lt) {
|
|
744
|
-
if (!this.unsigned && -2147483648 === this.high && -1 === t.low && -1 === t.high) return this;
|
|
745
|
-
const e3 = (this.unsigned ? Lt.div_u : Lt.div_s)(this.low, this.high, t.low, t.high);
|
|
746
|
-
return _Ht.fromBits(e3, Lt.get_high(), this.unsigned);
|
|
747
|
-
}
|
|
748
|
-
if (this.isZero()) return this.unsigned ? _Ht.UZERO : _Ht.ZERO;
|
|
749
|
-
let e2, n, i;
|
|
750
|
-
if (this.unsigned) {
|
|
751
|
-
if (t.unsigned || (t = t.toUnsigned()), t.gt(this)) return _Ht.UZERO;
|
|
752
|
-
if (t.gt(this.shru(1))) return _Ht.UONE;
|
|
753
|
-
i = _Ht.UZERO;
|
|
754
|
-
} else {
|
|
755
|
-
if (this.eq(_Ht.MIN_VALUE)) {
|
|
756
|
-
if (t.eq(_Ht.ONE) || t.eq(_Ht.NEG_ONE)) return _Ht.MIN_VALUE;
|
|
757
|
-
if (t.eq(_Ht.MIN_VALUE)) return _Ht.ONE;
|
|
758
|
-
return e2 = this.shr(1).div(t).shl(1), e2.eq(_Ht.ZERO) ? t.isNegative() ? _Ht.ONE : _Ht.NEG_ONE : (n = this.sub(t.mul(e2)), i = e2.add(n.div(t)), i);
|
|
759
|
-
}
|
|
760
|
-
if (t.eq(_Ht.MIN_VALUE)) return this.unsigned ? _Ht.UZERO : _Ht.ZERO;
|
|
761
|
-
if (this.isNegative()) return t.isNegative() ? this.neg().div(t.neg()) : this.neg().div(t).neg();
|
|
762
|
-
if (t.isNegative()) return this.div(t.neg()).neg();
|
|
763
|
-
i = _Ht.ZERO;
|
|
764
|
-
}
|
|
765
|
-
for (n = this; n.gte(t); ) {
|
|
766
|
-
e2 = Math.max(1, Math.floor(n.toNumber() / t.toNumber()));
|
|
767
|
-
const l = Math.ceil(Math.log(e2) / Math.LN2), o = l <= 48 ? 1 : Math.pow(2, l - 48);
|
|
768
|
-
let c = _Ht.fromNumber(e2), a = c.mul(t);
|
|
769
|
-
for (; a.isNegative() || a.gt(n); ) e2 -= o, c = _Ht.fromNumber(e2, this.unsigned), a = c.mul(t);
|
|
770
|
-
c.isZero() && (c = _Ht.ONE), i = i.add(c), n = n.sub(a);
|
|
771
|
-
}
|
|
772
|
-
return i;
|
|
773
|
-
}
|
|
774
|
-
div(t) {
|
|
775
|
-
return this.divide(t);
|
|
776
|
-
}
|
|
777
|
-
equals(t) {
|
|
778
|
-
return _Ht.isLong(t) || (t = _Ht.fromValue(t)), (this.unsigned === t.unsigned || this.high >>> 31 != 1 || t.high >>> 31 != 1) && (this.high === t.high && this.low === t.low);
|
|
779
|
-
}
|
|
780
|
-
eq(t) {
|
|
781
|
-
return this.equals(t);
|
|
782
|
-
}
|
|
783
|
-
getHighBits() {
|
|
784
|
-
return this.high;
|
|
785
|
-
}
|
|
786
|
-
getHighBitsUnsigned() {
|
|
787
|
-
return this.high >>> 0;
|
|
788
|
-
}
|
|
789
|
-
getLowBits() {
|
|
790
|
-
return this.low;
|
|
791
|
-
}
|
|
792
|
-
getLowBitsUnsigned() {
|
|
793
|
-
return this.low >>> 0;
|
|
794
|
-
}
|
|
795
|
-
getNumBitsAbs() {
|
|
796
|
-
if (this.isNegative()) return this.eq(_Ht.MIN_VALUE) ? 64 : this.neg().getNumBitsAbs();
|
|
797
|
-
const t = 0 !== this.high ? this.high : this.low;
|
|
798
|
-
let e2;
|
|
799
|
-
for (e2 = 31; e2 > 0 && !(t & 1 << e2); e2--) ;
|
|
800
|
-
return 0 !== this.high ? e2 + 33 : e2 + 1;
|
|
801
|
-
}
|
|
802
|
-
greaterThan(t) {
|
|
803
|
-
return this.comp(t) > 0;
|
|
804
|
-
}
|
|
805
|
-
gt(t) {
|
|
806
|
-
return this.greaterThan(t);
|
|
807
|
-
}
|
|
808
|
-
greaterThanOrEqual(t) {
|
|
809
|
-
return this.comp(t) >= 0;
|
|
810
|
-
}
|
|
811
|
-
gte(t) {
|
|
812
|
-
return this.greaterThanOrEqual(t);
|
|
813
|
-
}
|
|
814
|
-
ge(t) {
|
|
815
|
-
return this.greaterThanOrEqual(t);
|
|
816
|
-
}
|
|
817
|
-
isEven() {
|
|
818
|
-
return !(1 & this.low);
|
|
819
|
-
}
|
|
820
|
-
isNegative() {
|
|
821
|
-
return !this.unsigned && this.high < 0;
|
|
822
|
-
}
|
|
823
|
-
isOdd() {
|
|
824
|
-
return !(1 & ~this.low);
|
|
825
|
-
}
|
|
826
|
-
isPositive() {
|
|
827
|
-
return this.unsigned || this.high >= 0;
|
|
828
|
-
}
|
|
829
|
-
isZero() {
|
|
830
|
-
return 0 === this.high && 0 === this.low;
|
|
831
|
-
}
|
|
832
|
-
lessThan(t) {
|
|
833
|
-
return this.comp(t) < 0;
|
|
834
|
-
}
|
|
835
|
-
lt(t) {
|
|
836
|
-
return this.lessThan(t);
|
|
837
|
-
}
|
|
838
|
-
lessThanOrEqual(t) {
|
|
839
|
-
return this.comp(t) <= 0;
|
|
840
|
-
}
|
|
841
|
-
lte(t) {
|
|
842
|
-
return this.lessThanOrEqual(t);
|
|
843
|
-
}
|
|
844
|
-
modulo(t) {
|
|
845
|
-
if (_Ht.isLong(t) || (t = _Ht.fromValue(t)), Lt) {
|
|
846
|
-
const e2 = (this.unsigned ? Lt.rem_u : Lt.rem_s)(this.low, this.high, t.low, t.high);
|
|
847
|
-
return _Ht.fromBits(e2, Lt.get_high(), this.unsigned);
|
|
848
|
-
}
|
|
849
|
-
return this.sub(this.div(t).mul(t));
|
|
850
|
-
}
|
|
851
|
-
mod(t) {
|
|
852
|
-
return this.modulo(t);
|
|
853
|
-
}
|
|
854
|
-
rem(t) {
|
|
855
|
-
return this.modulo(t);
|
|
856
|
-
}
|
|
857
|
-
multiply(t) {
|
|
858
|
-
if (this.isZero()) return _Ht.ZERO;
|
|
859
|
-
if (_Ht.isLong(t) || (t = _Ht.fromValue(t)), Lt) {
|
|
860
|
-
const e3 = Lt.mul(this.low, this.high, t.low, t.high);
|
|
861
|
-
return _Ht.fromBits(e3, Lt.get_high(), this.unsigned);
|
|
862
|
-
}
|
|
863
|
-
if (t.isZero()) return _Ht.ZERO;
|
|
864
|
-
if (this.eq(_Ht.MIN_VALUE)) return t.isOdd() ? _Ht.MIN_VALUE : _Ht.ZERO;
|
|
865
|
-
if (t.eq(_Ht.MIN_VALUE)) return this.isOdd() ? _Ht.MIN_VALUE : _Ht.ZERO;
|
|
866
|
-
if (this.isNegative()) return t.isNegative() ? this.neg().mul(t.neg()) : this.neg().mul(t).neg();
|
|
867
|
-
if (t.isNegative()) return this.mul(t.neg()).neg();
|
|
868
|
-
if (this.lt(_Ht.TWO_PWR_24) && t.lt(_Ht.TWO_PWR_24)) return _Ht.fromNumber(this.toNumber() * t.toNumber(), this.unsigned);
|
|
869
|
-
const e2 = this.high >>> 16, n = 65535 & this.high, i = this.low >>> 16, l = 65535 & this.low, o = t.high >>> 16, c = 65535 & t.high, a = t.low >>> 16, s = 65535 & t.low;
|
|
870
|
-
let d = 0, b = 0, Z = 0, m = 0;
|
|
871
|
-
return m += l * s, Z += m >>> 16, m &= 65535, Z += i * s, b += Z >>> 16, Z &= 65535, Z += l * a, b += Z >>> 16, Z &= 65535, b += n * s, d += b >>> 16, b &= 65535, b += i * a, d += b >>> 16, b &= 65535, b += l * c, d += b >>> 16, b &= 65535, d += e2 * s + n * a + i * c + l * o, d &= 65535, _Ht.fromBits(Z << 16 | m, d << 16 | b, this.unsigned);
|
|
872
|
-
}
|
|
873
|
-
mul(t) {
|
|
874
|
-
return this.multiply(t);
|
|
875
|
-
}
|
|
876
|
-
negate() {
|
|
877
|
-
return !this.unsigned && this.eq(_Ht.MIN_VALUE) ? _Ht.MIN_VALUE : this.not().add(_Ht.ONE);
|
|
878
|
-
}
|
|
879
|
-
neg() {
|
|
880
|
-
return this.negate();
|
|
881
|
-
}
|
|
882
|
-
not() {
|
|
883
|
-
return _Ht.fromBits(~this.low, ~this.high, this.unsigned);
|
|
884
|
-
}
|
|
885
|
-
notEquals(t) {
|
|
886
|
-
return !this.equals(t);
|
|
887
|
-
}
|
|
888
|
-
neq(t) {
|
|
889
|
-
return this.notEquals(t);
|
|
890
|
-
}
|
|
891
|
-
ne(t) {
|
|
892
|
-
return this.notEquals(t);
|
|
893
|
-
}
|
|
894
|
-
or(t) {
|
|
895
|
-
return _Ht.isLong(t) || (t = _Ht.fromValue(t)), _Ht.fromBits(this.low | t.low, this.high | t.high, this.unsigned);
|
|
896
|
-
}
|
|
897
|
-
shiftLeft(t) {
|
|
898
|
-
return _Ht.isLong(t) && (t = t.toInt()), 0 == (t &= 63) ? this : t < 32 ? _Ht.fromBits(this.low << t, this.high << t | this.low >>> 32 - t, this.unsigned) : _Ht.fromBits(0, this.low << t - 32, this.unsigned);
|
|
899
|
-
}
|
|
900
|
-
shl(t) {
|
|
901
|
-
return this.shiftLeft(t);
|
|
902
|
-
}
|
|
903
|
-
shiftRight(t) {
|
|
904
|
-
return _Ht.isLong(t) && (t = t.toInt()), 0 == (t &= 63) ? this : t < 32 ? _Ht.fromBits(this.low >>> t | this.high << 32 - t, this.high >> t, this.unsigned) : _Ht.fromBits(this.high >> t - 32, this.high >= 0 ? 0 : -1, this.unsigned);
|
|
905
|
-
}
|
|
906
|
-
shr(t) {
|
|
907
|
-
return this.shiftRight(t);
|
|
908
|
-
}
|
|
909
|
-
shiftRightUnsigned(t) {
|
|
910
|
-
if (_Ht.isLong(t) && (t = t.toInt()), 0 === (t &= 63)) return this;
|
|
911
|
-
{
|
|
912
|
-
const e2 = this.high;
|
|
913
|
-
if (t < 32) {
|
|
914
|
-
const n = this.low;
|
|
915
|
-
return _Ht.fromBits(n >>> t | e2 << 32 - t, e2 >>> t, this.unsigned);
|
|
916
|
-
}
|
|
917
|
-
return 32 === t ? _Ht.fromBits(e2, 0, this.unsigned) : _Ht.fromBits(e2 >>> t - 32, 0, this.unsigned);
|
|
918
|
-
}
|
|
919
|
-
}
|
|
920
|
-
shr_u(t) {
|
|
921
|
-
return this.shiftRightUnsigned(t);
|
|
922
|
-
}
|
|
923
|
-
shru(t) {
|
|
924
|
-
return this.shiftRightUnsigned(t);
|
|
925
|
-
}
|
|
926
|
-
subtract(t) {
|
|
927
|
-
return _Ht.isLong(t) || (t = _Ht.fromValue(t)), this.add(t.neg());
|
|
928
|
-
}
|
|
929
|
-
sub(t) {
|
|
930
|
-
return this.subtract(t);
|
|
931
|
-
}
|
|
932
|
-
toInt() {
|
|
933
|
-
return this.unsigned ? this.low >>> 0 : this.low;
|
|
934
|
-
}
|
|
935
|
-
toNumber() {
|
|
936
|
-
return this.unsigned ? (this.high >>> 0) * Tt + (this.low >>> 0) : this.high * Tt + (this.low >>> 0);
|
|
937
|
-
}
|
|
938
|
-
toBigInt() {
|
|
939
|
-
return BigInt(this.toString());
|
|
940
|
-
}
|
|
941
|
-
toBytes(t) {
|
|
942
|
-
return t ? this.toBytesLE() : this.toBytesBE();
|
|
943
|
-
}
|
|
944
|
-
toBytesLE() {
|
|
945
|
-
const t = this.high, e2 = this.low;
|
|
946
|
-
return [255 & e2, e2 >>> 8 & 255, e2 >>> 16 & 255, e2 >>> 24, 255 & t, t >>> 8 & 255, t >>> 16 & 255, t >>> 24];
|
|
947
|
-
}
|
|
948
|
-
toBytesBE() {
|
|
949
|
-
const t = this.high, e2 = this.low;
|
|
950
|
-
return [t >>> 24, t >>> 16 & 255, t >>> 8 & 255, 255 & t, e2 >>> 24, e2 >>> 16 & 255, e2 >>> 8 & 255, 255 & e2];
|
|
951
|
-
}
|
|
952
|
-
toSigned() {
|
|
953
|
-
return this.unsigned ? _Ht.fromBits(this.low, this.high, false) : this;
|
|
954
|
-
}
|
|
955
|
-
toString(t) {
|
|
956
|
-
if ((t = t || 10) < 2 || 36 < t) throw new $("radix");
|
|
957
|
-
if (this.isZero()) return "0";
|
|
958
|
-
if (this.isNegative()) {
|
|
959
|
-
if (this.eq(_Ht.MIN_VALUE)) {
|
|
960
|
-
const e3 = _Ht.fromNumber(t), n2 = this.div(e3), i2 = n2.mul(e3).sub(this);
|
|
961
|
-
return n2.toString(t) + i2.toInt().toString(t);
|
|
962
|
-
}
|
|
963
|
-
return "-" + this.neg().toString(t);
|
|
964
|
-
}
|
|
965
|
-
const e2 = _Ht.fromNumber(Math.pow(t, 6), this.unsigned);
|
|
966
|
-
let n = this, i = "";
|
|
967
|
-
for (; ; ) {
|
|
968
|
-
const l = n.div(e2);
|
|
969
|
-
let o = (n.sub(l.mul(e2)).toInt() >>> 0).toString(t);
|
|
970
|
-
if (n = l, n.isZero()) return o + i;
|
|
971
|
-
for (; o.length < 6; ) o = "0" + o;
|
|
972
|
-
i = "" + o + i;
|
|
973
|
-
}
|
|
974
|
-
}
|
|
975
|
-
toUnsigned() {
|
|
976
|
-
return this.unsigned ? this : _Ht.fromBits(this.low, this.high, true);
|
|
977
|
-
}
|
|
978
|
-
xor(t) {
|
|
979
|
-
return _Ht.isLong(t) || (t = _Ht.fromValue(t)), _Ht.fromBits(this.low ^ t.low, this.high ^ t.high, this.unsigned);
|
|
980
|
-
}
|
|
981
|
-
eqz() {
|
|
982
|
-
return this.isZero();
|
|
983
|
-
}
|
|
984
|
-
le(t) {
|
|
985
|
-
return this.lessThanOrEqual(t);
|
|
986
|
-
}
|
|
987
|
-
toExtendedJSON(t) {
|
|
988
|
-
return t && t.relaxed ? this.toNumber() : { $numberLong: this.toString() };
|
|
989
|
-
}
|
|
990
|
-
static fromExtendedJSON(t, e2) {
|
|
991
|
-
const { useBigInt64: n = false, relaxed: i = true } = { ...e2 };
|
|
992
|
-
if (t.$numberLong.length > 20) throw new $("$numberLong string is too long");
|
|
993
|
-
if (!wt.test(t.$numberLong)) throw new $(`$numberLong string "${t.$numberLong}" is in an invalid format`);
|
|
994
|
-
if (n) {
|
|
995
|
-
const e3 = BigInt(t.$numberLong);
|
|
996
|
-
return BigInt.asIntN(64, e3);
|
|
997
|
-
}
|
|
998
|
-
const l = _Ht.fromString(t.$numberLong);
|
|
999
|
-
return i ? l.toNumber() : l;
|
|
1000
|
-
}
|
|
1001
|
-
inspect(t, e2, n) {
|
|
1002
|
-
n ??= X;
|
|
1003
|
-
return `new Long(${n(this.toString(), e2)}${this.unsigned ? `, ${n(this.unsigned, e2)}` : ""})`;
|
|
1004
|
-
}
|
|
1005
|
-
};
|
|
1006
|
-
var kt = /^(\+|-)?(\d+|(\d*\.\d*))?(E|e)?([-+])?(\d+)?$/;
|
|
1007
|
-
var Bt = /^(\+|-)?(Infinity|inf)$/i;
|
|
1008
|
-
var Ct = /^(\+|-)?NaN$/i;
|
|
1009
|
-
var vt = 6111;
|
|
1010
|
-
var Mt = -6176;
|
|
1011
|
-
var jt = rt.fromNumberArray([124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0].reverse());
|
|
1012
|
-
var Pt = rt.fromNumberArray([248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0].reverse());
|
|
1013
|
-
var Ft = rt.fromNumberArray([120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0].reverse());
|
|
1014
|
-
var Qt = /^([-+])?(\d+)?$/;
|
|
1015
|
-
function Ot(t) {
|
|
1016
|
-
return !isNaN(parseInt(t, 10));
|
|
1017
|
-
}
|
|
1018
|
-
function Et(t) {
|
|
1019
|
-
const e2 = Ht.fromNumber(1e9);
|
|
1020
|
-
let n = Ht.fromNumber(0);
|
|
1021
|
-
if (!(t.parts[0] || t.parts[1] || t.parts[2] || t.parts[3])) return { quotient: t, rem: n };
|
|
1022
|
-
for (let i = 0; i <= 3; i++) n = n.shiftLeft(32), n = n.add(new Ht(t.parts[i], 0)), t.parts[i] = n.div(e2).low, n = n.modulo(e2);
|
|
1023
|
-
return { quotient: t, rem: n };
|
|
1024
|
-
}
|
|
1025
|
-
function _t(t, e2) {
|
|
1026
|
-
throw new $(`"${t}" is not a valid Decimal128 string - ${e2}`);
|
|
1027
|
-
}
|
|
1028
|
-
var Dt = class _Dt extends ht {
|
|
1029
|
-
get _bsontype() {
|
|
1030
|
-
return "Decimal128";
|
|
1031
|
-
}
|
|
1032
|
-
bytes;
|
|
1033
|
-
constructor(t) {
|
|
1034
|
-
if (super(), "string" == typeof t) this.bytes = _Dt.fromString(t).bytes;
|
|
1035
|
-
else {
|
|
1036
|
-
if (!(t instanceof Uint8Array || r(t))) throw new $("Decimal128 must take a Buffer or string");
|
|
1037
|
-
if (16 !== t.byteLength) throw new $("Decimal128 must take a Buffer of 16 bytes");
|
|
1038
|
-
this.bytes = t;
|
|
1039
|
-
}
|
|
1040
|
-
}
|
|
1041
|
-
static fromString(t) {
|
|
1042
|
-
return _Dt._fromString(t, { allowRounding: false });
|
|
1043
|
-
}
|
|
1044
|
-
static fromStringWithRounding(t) {
|
|
1045
|
-
return _Dt._fromString(t, { allowRounding: true });
|
|
1046
|
-
}
|
|
1047
|
-
static _fromString(t, e2) {
|
|
1048
|
-
let n = false, i = false, l = false, o = false, c = 0, a = 0, s = 0, d = 0, b = 0;
|
|
1049
|
-
const Z = [0];
|
|
1050
|
-
let m = 0, u2 = 0, r2 = 0, p2 = 0, h2 = new Ht(0, 0), y2 = new Ht(0, 0), G2 = 0, X2 = 0;
|
|
1051
|
-
if (t.length >= 7e3) throw new $(t + " not a valid Decimal128 string");
|
|
1052
|
-
const V2 = t.match(kt), W2 = t.match(Bt), f2 = t.match(Ct);
|
|
1053
|
-
if (!V2 && !W2 && !f2 || 0 === t.length) throw new $(t + " not a valid Decimal128 string");
|
|
1054
|
-
if (V2) {
|
|
1055
|
-
const e3 = V2[2], n2 = V2[4], i2 = V2[5], l2 = V2[6];
|
|
1056
|
-
n2 && void 0 === l2 && _t(t, "missing exponent power"), n2 && void 0 === e3 && _t(t, "missing exponent base"), void 0 === n2 && (i2 || l2) && _t(t, "missing e before exponent");
|
|
1057
|
-
}
|
|
1058
|
-
if ("+" !== t[X2] && "-" !== t[X2] || (i = true, n = "-" === t[X2++]), !Ot(t[X2]) && "." !== t[X2]) {
|
|
1059
|
-
if ("i" === t[X2] || "I" === t[X2]) return new _Dt(n ? Pt : Ft);
|
|
1060
|
-
if ("N" === t[X2]) return new _Dt(jt);
|
|
1061
|
-
}
|
|
1062
|
-
for (; Ot(t[X2]) || "." === t[X2]; ) "." !== t[X2] ? (m < 34 && ("0" !== t[X2] || o) && (o || (b = a), o = true, Z[u2++] = parseInt(t[X2], 10), m += 1), o && (s += 1), l && (d += 1), a += 1, X2 += 1) : (l && _t(t, "contains multiple periods"), l = true, X2 += 1);
|
|
1063
|
-
if (l && !a) throw new $(t + " not a valid Decimal128 string");
|
|
1064
|
-
if ("e" === t[X2] || "E" === t[X2]) {
|
|
1065
|
-
const e3 = t.substr(++X2).match(Qt);
|
|
1066
|
-
if (!e3 || !e3[2]) return new _Dt(jt);
|
|
1067
|
-
p2 = parseInt(e3[0], 10), X2 += e3[0].length;
|
|
1068
|
-
}
|
|
1069
|
-
if (t[X2]) return new _Dt(jt);
|
|
1070
|
-
if (m) {
|
|
1071
|
-
if (r2 = m - 1, c = s, 1 !== c) for (; "0" === t[b + c - 1 + Number(i) + Number(l)]; ) c -= 1;
|
|
1072
|
-
} else Z[0] = 0, s = 1, m = 1, c = 0;
|
|
1073
|
-
for (p2 <= d && d > p2 + 16384 ? p2 = Mt : p2 -= d; p2 > vt; ) {
|
|
1074
|
-
if (r2 += 1, r2 >= 34) {
|
|
1075
|
-
if (0 === c) {
|
|
1076
|
-
p2 = vt;
|
|
1077
|
-
break;
|
|
1078
|
-
}
|
|
1079
|
-
_t(t, "overflow");
|
|
1080
|
-
}
|
|
1081
|
-
p2 -= 1;
|
|
1082
|
-
}
|
|
1083
|
-
if (e2.allowRounding) {
|
|
1084
|
-
for (; p2 < Mt || m < s; ) {
|
|
1085
|
-
if (0 === r2 && c < m) {
|
|
1086
|
-
p2 = Mt, c = 0;
|
|
1087
|
-
break;
|
|
1088
|
-
}
|
|
1089
|
-
if (m < s ? s -= 1 : r2 -= 1, p2 < vt) p2 += 1;
|
|
1090
|
-
else {
|
|
1091
|
-
if (Z.join("").match(/^0+$/)) {
|
|
1092
|
-
p2 = vt;
|
|
1093
|
-
break;
|
|
1094
|
-
}
|
|
1095
|
-
_t(t, "overflow");
|
|
1096
|
-
}
|
|
1097
|
-
}
|
|
1098
|
-
if (r2 + 1 < c) {
|
|
1099
|
-
let e3 = a;
|
|
1100
|
-
l && (b += 1, e3 += 1), i && (b += 1, e3 += 1);
|
|
1101
|
-
const o2 = parseInt(t[b + r2 + 1], 10);
|
|
1102
|
-
let c2 = 0;
|
|
1103
|
-
if (o2 >= 5 && (c2 = 1, 5 === o2)) {
|
|
1104
|
-
c2 = Z[r2] % 2 == 1 ? 1 : 0;
|
|
1105
|
-
for (let n2 = b + r2 + 2; n2 < e3; n2++) if (parseInt(t[n2], 10)) {
|
|
1106
|
-
c2 = 1;
|
|
1107
|
-
break;
|
|
1108
|
-
}
|
|
1109
|
-
}
|
|
1110
|
-
if (c2) {
|
|
1111
|
-
let t2 = r2;
|
|
1112
|
-
for (; t2 >= 0 && ++Z[t2] > 9; t2--) if (Z[t2] = 0, 0 === t2) {
|
|
1113
|
-
if (!(p2 < vt)) return new _Dt(n ? Pt : Ft);
|
|
1114
|
-
p2 += 1, Z[t2] = 1;
|
|
1115
|
-
}
|
|
1116
|
-
}
|
|
1117
|
-
}
|
|
1118
|
-
} else {
|
|
1119
|
-
for (; p2 < Mt || m < s; ) {
|
|
1120
|
-
if (0 === r2) {
|
|
1121
|
-
if (0 === c) {
|
|
1122
|
-
p2 = Mt;
|
|
1123
|
-
break;
|
|
1124
|
-
}
|
|
1125
|
-
_t(t, "exponent underflow");
|
|
1126
|
-
}
|
|
1127
|
-
m < s ? ("0" !== t[s - 1 + Number(i) + Number(l)] && 0 !== c && _t(t, "inexact rounding"), s -= 1) : (0 !== Z[r2] && _t(t, "inexact rounding"), r2 -= 1), p2 < vt ? p2 += 1 : _t(t, "overflow");
|
|
1128
|
-
}
|
|
1129
|
-
if (r2 + 1 < c) {
|
|
1130
|
-
l && (b += 1), i && (b += 1);
|
|
1131
|
-
0 !== parseInt(t[b + r2 + 1], 10) && _t(t, "inexact rounding");
|
|
1132
|
-
}
|
|
1133
|
-
}
|
|
1134
|
-
if (h2 = Ht.fromNumber(0), y2 = Ht.fromNumber(0), 0 === c) h2 = Ht.fromNumber(0), y2 = Ht.fromNumber(0);
|
|
1135
|
-
else if (r2 < 17) {
|
|
1136
|
-
let t2 = 0;
|
|
1137
|
-
for (y2 = Ht.fromNumber(Z[t2++]), h2 = new Ht(0, 0); t2 <= r2; t2++) y2 = y2.multiply(Ht.fromNumber(10)), y2 = y2.add(Ht.fromNumber(Z[t2]));
|
|
1138
|
-
} else {
|
|
1139
|
-
let t2 = 0;
|
|
1140
|
-
for (h2 = Ht.fromNumber(Z[t2++]); t2 <= r2 - 17; t2++) h2 = h2.multiply(Ht.fromNumber(10)), h2 = h2.add(Ht.fromNumber(Z[t2]));
|
|
1141
|
-
for (y2 = Ht.fromNumber(Z[t2++]); t2 <= r2; t2++) y2 = y2.multiply(Ht.fromNumber(10)), y2 = y2.add(Ht.fromNumber(Z[t2]));
|
|
1142
|
-
}
|
|
1143
|
-
const g2 = (function(t2, e3) {
|
|
1144
|
-
if (!t2 && !e3) return { high: Ht.fromNumber(0), low: Ht.fromNumber(0) };
|
|
1145
|
-
const n2 = t2.shiftRightUnsigned(32), i2 = new Ht(t2.getLowBits(), 0), l2 = e3.shiftRightUnsigned(32), o2 = new Ht(e3.getLowBits(), 0);
|
|
1146
|
-
let c2 = n2.multiply(l2), a2 = n2.multiply(o2);
|
|
1147
|
-
const s2 = i2.multiply(l2);
|
|
1148
|
-
let d2 = i2.multiply(o2);
|
|
1149
|
-
return c2 = c2.add(a2.shiftRightUnsigned(32)), a2 = new Ht(a2.getLowBits(), 0).add(s2).add(d2.shiftRightUnsigned(32)), c2 = c2.add(a2.shiftRightUnsigned(32)), d2 = a2.shiftLeft(32).add(new Ht(d2.getLowBits(), 0)), { high: c2, low: d2 };
|
|
1150
|
-
})(h2, Ht.fromString("100000000000000000"));
|
|
1151
|
-
g2.low = g2.low.add(y2), (function(t2, e3) {
|
|
1152
|
-
const n2 = t2.high >>> 0, i2 = e3.high >>> 0;
|
|
1153
|
-
if (n2 < i2) return true;
|
|
1154
|
-
if (n2 === i2 && t2.low >>> 0 < e3.low >>> 0) return true;
|
|
1155
|
-
return false;
|
|
1156
|
-
})(g2.low, y2) && (g2.high = g2.high.add(Ht.fromNumber(1))), G2 = p2 + 6176;
|
|
1157
|
-
const Y2 = { low: Ht.fromNumber(0), high: Ht.fromNumber(0) };
|
|
1158
|
-
g2.high.shiftRightUnsigned(49).and(Ht.fromNumber(1)).equals(Ht.fromNumber(1)) ? (Y2.high = Y2.high.or(Ht.fromNumber(3).shiftLeft(61)), Y2.high = Y2.high.or(Ht.fromNumber(G2).and(Ht.fromNumber(16383).shiftLeft(47))), Y2.high = Y2.high.or(g2.high.and(Ht.fromNumber(140737488355327)))) : (Y2.high = Y2.high.or(Ht.fromNumber(16383 & G2).shiftLeft(49)), Y2.high = Y2.high.or(g2.high.and(Ht.fromNumber(562949953421311)))), Y2.low = g2.low, n && (Y2.high = Y2.high.or(Ht.fromString("9223372036854775808")));
|
|
1159
|
-
const I2 = rt.allocateUnsafe(16);
|
|
1160
|
-
return X2 = 0, I2[X2++] = 255 & Y2.low.low, I2[X2++] = Y2.low.low >> 8 & 255, I2[X2++] = Y2.low.low >> 16 & 255, I2[X2++] = Y2.low.low >> 24 & 255, I2[X2++] = 255 & Y2.low.high, I2[X2++] = Y2.low.high >> 8 & 255, I2[X2++] = Y2.low.high >> 16 & 255, I2[X2++] = Y2.low.high >> 24 & 255, I2[X2++] = 255 & Y2.high.low, I2[X2++] = Y2.high.low >> 8 & 255, I2[X2++] = Y2.high.low >> 16 & 255, I2[X2++] = Y2.high.low >> 24 & 255, I2[X2++] = 255 & Y2.high.high, I2[X2++] = Y2.high.high >> 8 & 255, I2[X2++] = Y2.high.high >> 16 & 255, I2[X2++] = Y2.high.high >> 24 & 255, new _Dt(I2);
|
|
1161
|
-
}
|
|
1162
|
-
toString() {
|
|
1163
|
-
let t, e2 = 0;
|
|
1164
|
-
const n = new Array(36);
|
|
1165
|
-
for (let t2 = 0; t2 < n.length; t2++) n[t2] = 0;
|
|
1166
|
-
let i, l, o, c = 0, a = false, s = { parts: [0, 0, 0, 0] };
|
|
1167
|
-
const d = [];
|
|
1168
|
-
c = 0;
|
|
1169
|
-
const b = this.bytes, Z = b[c++] | b[c++] << 8 | b[c++] << 16 | b[c++] << 24, m = b[c++] | b[c++] << 8 | b[c++] << 16 | b[c++] << 24, u2 = b[c++] | b[c++] << 8 | b[c++] << 16 | b[c++] << 24, r2 = b[c++] | b[c++] << 8 | b[c++] << 16 | b[c++] << 24;
|
|
1170
|
-
c = 0;
|
|
1171
|
-
({ low: new Ht(Z, m), high: new Ht(u2, r2) }).high.lessThan(Ht.ZERO) && d.push("-");
|
|
1172
|
-
const p2 = r2 >> 26 & 31;
|
|
1173
|
-
if (p2 >> 3 == 3) {
|
|
1174
|
-
if (30 === p2) return d.join("") + "Infinity";
|
|
1175
|
-
if (31 === p2) return "NaN";
|
|
1176
|
-
t = r2 >> 15 & 16383, i = 8 + (r2 >> 14 & 1);
|
|
1177
|
-
} else i = r2 >> 14 & 7, t = r2 >> 17 & 16383;
|
|
1178
|
-
const h2 = t - 6176;
|
|
1179
|
-
if (s.parts[0] = (16383 & r2) + ((15 & i) << 14), s.parts[1] = u2, s.parts[2] = m, s.parts[3] = Z, 0 === s.parts[0] && 0 === s.parts[1] && 0 === s.parts[2] && 0 === s.parts[3]) a = true;
|
|
1180
|
-
else for (o = 3; o >= 0; o--) {
|
|
1181
|
-
let t2 = 0;
|
|
1182
|
-
const e3 = Et(s);
|
|
1183
|
-
if (s = e3.quotient, t2 = e3.rem.low, t2) for (l = 8; l >= 0; l--) n[9 * o + l] = t2 % 10, t2 = Math.floor(t2 / 10);
|
|
1184
|
-
}
|
|
1185
|
-
if (a) e2 = 1, n[c] = 0;
|
|
1186
|
-
else for (e2 = 36; !n[c]; ) e2 -= 1, c += 1;
|
|
1187
|
-
const y2 = e2 - 1 + h2;
|
|
1188
|
-
if (y2 >= 34 || y2 <= -7 || h2 > 0) {
|
|
1189
|
-
if (e2 > 34) return d.push("0"), h2 > 0 ? d.push(`E+${h2}`) : h2 < 0 && d.push(`E${h2}`), d.join("");
|
|
1190
|
-
d.push(`${n[c++]}`), e2 -= 1, e2 && d.push(".");
|
|
1191
|
-
for (let t2 = 0; t2 < e2; t2++) d.push(`${n[c++]}`);
|
|
1192
|
-
d.push("E"), y2 > 0 ? d.push(`+${y2}`) : d.push(`${y2}`);
|
|
1193
|
-
} else if (h2 >= 0) for (let t2 = 0; t2 < e2; t2++) d.push(`${n[c++]}`);
|
|
1194
|
-
else {
|
|
1195
|
-
let t2 = e2 + h2;
|
|
1196
|
-
if (t2 > 0) for (let e3 = 0; e3 < t2; e3++) d.push(`${n[c++]}`);
|
|
1197
|
-
else d.push("0");
|
|
1198
|
-
for (d.push("."); t2++ < 0; ) d.push("0");
|
|
1199
|
-
for (let i2 = 0; i2 < e2 - Math.max(t2 - 1, 0); i2++) d.push(`${n[c++]}`);
|
|
1200
|
-
}
|
|
1201
|
-
return d.join("");
|
|
1202
|
-
}
|
|
1203
|
-
toJSON() {
|
|
1204
|
-
return { $numberDecimal: this.toString() };
|
|
1205
|
-
}
|
|
1206
|
-
toExtendedJSON() {
|
|
1207
|
-
return { $numberDecimal: this.toString() };
|
|
1208
|
-
}
|
|
1209
|
-
static fromExtendedJSON(t) {
|
|
1210
|
-
return _Dt.fromString(t.$numberDecimal);
|
|
1211
|
-
}
|
|
1212
|
-
inspect(t, e2, n) {
|
|
1213
|
-
n ??= X;
|
|
1214
|
-
return `new Decimal128(${n(this.toString(), e2)})`;
|
|
1215
|
-
}
|
|
1216
|
-
};
|
|
1217
|
-
var At = class _At extends ht {
|
|
1218
|
-
get _bsontype() {
|
|
1219
|
-
return "Double";
|
|
1220
|
-
}
|
|
1221
|
-
value;
|
|
1222
|
-
constructor(t) {
|
|
1223
|
-
super(), t instanceof Number && (t = t.valueOf()), this.value = +t;
|
|
1224
|
-
}
|
|
1225
|
-
static fromString(t) {
|
|
1226
|
-
const e2 = Number(t);
|
|
1227
|
-
if ("NaN" === t) return new _At(NaN);
|
|
1228
|
-
if ("Infinity" === t) return new _At(1 / 0);
|
|
1229
|
-
if ("-Infinity" === t) return new _At(-1 / 0);
|
|
1230
|
-
if (!Number.isFinite(e2)) throw new $(`Input: ${t} is not representable as a Double`);
|
|
1231
|
-
if (t.trim() !== t) throw new $(`Input: '${t}' contains whitespace`);
|
|
1232
|
-
if ("" === t) throw new $("Input is an empty string");
|
|
1233
|
-
if (/[^-0-9.+eE]/.test(t)) throw new $(`Input: '${t}' is not in decimal or exponential notation`);
|
|
1234
|
-
return new _At(e2);
|
|
1235
|
-
}
|
|
1236
|
-
valueOf() {
|
|
1237
|
-
return this.value;
|
|
1238
|
-
}
|
|
1239
|
-
toJSON() {
|
|
1240
|
-
return this.value;
|
|
1241
|
-
}
|
|
1242
|
-
toString(t) {
|
|
1243
|
-
return this.value.toString(t);
|
|
1244
|
-
}
|
|
1245
|
-
toExtendedJSON(t) {
|
|
1246
|
-
return t && (t.legacy || t.relaxed && isFinite(this.value)) ? this.value : Object.is(Math.sign(this.value), -0) ? { $numberDouble: "-0.0" } : { $numberDouble: Number.isInteger(this.value) ? this.value.toFixed(1) : this.value.toString() };
|
|
1247
|
-
}
|
|
1248
|
-
static fromExtendedJSON(t, e2) {
|
|
1249
|
-
const n = parseFloat(t.$numberDouble);
|
|
1250
|
-
return e2 && e2.relaxed ? n : new _At(n);
|
|
1251
|
-
}
|
|
1252
|
-
inspect(t, e2, n) {
|
|
1253
|
-
return n ??= X, `new Double(${n(this.value, e2)})`;
|
|
1254
|
-
}
|
|
1255
|
-
};
|
|
1256
|
-
var $t = class _$t extends ht {
|
|
1257
|
-
get _bsontype() {
|
|
1258
|
-
return "Int32";
|
|
1259
|
-
}
|
|
1260
|
-
value;
|
|
1261
|
-
constructor(t) {
|
|
1262
|
-
super(), t instanceof Number && (t = t.valueOf()), this.value = 0 | +t;
|
|
1263
|
-
}
|
|
1264
|
-
static fromString(t) {
|
|
1265
|
-
const e2 = Kt(t), n = Number(t);
|
|
1266
|
-
if (f < n) throw new $(`Input: '${t}' is larger than the maximum value for Int32`);
|
|
1267
|
-
if (g > n) throw new $(`Input: '${t}' is smaller than the minimum value for Int32`);
|
|
1268
|
-
if (!Number.isSafeInteger(n)) throw new $(`Input: '${t}' is not a safe integer`);
|
|
1269
|
-
if (n.toString() !== e2) throw new $(`Input: '${t}' is not a valid Int32 string`);
|
|
1270
|
-
return new _$t(n);
|
|
1271
|
-
}
|
|
1272
|
-
valueOf() {
|
|
1273
|
-
return this.value;
|
|
1274
|
-
}
|
|
1275
|
-
toString(t) {
|
|
1276
|
-
return this.value.toString(t);
|
|
1277
|
-
}
|
|
1278
|
-
toJSON() {
|
|
1279
|
-
return this.value;
|
|
1280
|
-
}
|
|
1281
|
-
toExtendedJSON(t) {
|
|
1282
|
-
return t && (t.relaxed || t.legacy) ? this.value : { $numberInt: this.value.toString() };
|
|
1283
|
-
}
|
|
1284
|
-
static fromExtendedJSON(t, e2) {
|
|
1285
|
-
return e2 && e2.relaxed ? parseInt(t.$numberInt, 10) : new _$t(t.$numberInt);
|
|
1286
|
-
}
|
|
1287
|
-
inspect(t, e2, n) {
|
|
1288
|
-
return n ??= X, `new Int32(${n(this.value, e2)})`;
|
|
1289
|
-
}
|
|
1290
|
-
};
|
|
1291
|
-
var qt = class _qt extends ht {
|
|
1292
|
-
get _bsontype() {
|
|
1293
|
-
return "MaxKey";
|
|
1294
|
-
}
|
|
1295
|
-
toExtendedJSON() {
|
|
1296
|
-
return { $maxKey: 1 };
|
|
1297
|
-
}
|
|
1298
|
-
static fromExtendedJSON() {
|
|
1299
|
-
return new _qt();
|
|
1300
|
-
}
|
|
1301
|
-
inspect() {
|
|
1302
|
-
return "new MaxKey()";
|
|
1303
|
-
}
|
|
1304
|
-
};
|
|
1305
|
-
var te = class _te extends ht {
|
|
1306
|
-
get _bsontype() {
|
|
1307
|
-
return "MinKey";
|
|
1308
|
-
}
|
|
1309
|
-
toExtendedJSON() {
|
|
1310
|
-
return { $minKey: 1 };
|
|
1311
|
-
}
|
|
1312
|
-
static fromExtendedJSON() {
|
|
1313
|
-
return new _te();
|
|
1314
|
-
}
|
|
1315
|
-
inspect() {
|
|
1316
|
-
return "new MinKey()";
|
|
1317
|
-
}
|
|
1318
|
-
};
|
|
1319
|
-
var ee = null;
|
|
1320
|
-
var ne = /* @__PURE__ */ new WeakMap();
|
|
1321
|
-
var ie = class _ie extends ht {
|
|
1322
|
-
get _bsontype() {
|
|
1323
|
-
return "ObjectId";
|
|
1324
|
-
}
|
|
1325
|
-
static index = Math.floor(16777215 * Math.random());
|
|
1326
|
-
static cacheHexString;
|
|
1327
|
-
buffer;
|
|
1328
|
-
constructor(t) {
|
|
1329
|
-
let e2;
|
|
1330
|
-
if (super(), "object" == typeof t && t && "id" in t) {
|
|
1331
|
-
if ("string" != typeof t.id && !ArrayBuffer.isView(t.id)) throw new $("Argument passed in must have an id that is of type string or Buffer");
|
|
1332
|
-
e2 = "toHexString" in t && "function" == typeof t.toHexString ? rt.fromHex(t.toHexString()) : t.id;
|
|
1333
|
-
} else e2 = t;
|
|
1334
|
-
if (null == e2) this.buffer = _ie.generate();
|
|
1335
|
-
else if (ArrayBuffer.isView(e2) && 12 === e2.byteLength) this.buffer = rt.toLocalBufferType(e2);
|
|
1336
|
-
else {
|
|
1337
|
-
if ("string" != typeof e2) throw new $("Argument passed in does not match the accepted types");
|
|
1338
|
-
if (!_ie.validateHexString(e2)) throw new $("input must be a 24 character hex string, 12 byte Uint8Array, or an integer");
|
|
1339
|
-
this.buffer = rt.fromHex(e2), _ie.cacheHexString && ne.set(this, e2);
|
|
1340
|
-
}
|
|
1341
|
-
}
|
|
1342
|
-
get id() {
|
|
1343
|
-
return this.buffer;
|
|
1344
|
-
}
|
|
1345
|
-
set id(t) {
|
|
1346
|
-
this.buffer = t, _ie.cacheHexString && ne.set(this, rt.toHex(t));
|
|
1347
|
-
}
|
|
1348
|
-
static validateHexString(t) {
|
|
1349
|
-
if (24 !== t?.length) return false;
|
|
1350
|
-
for (let e2 = 0; e2 < 24; e2++) {
|
|
1351
|
-
const n = t.charCodeAt(e2);
|
|
1352
|
-
if (!(n >= 48 && n <= 57 || n >= 97 && n <= 102 || n >= 65 && n <= 70)) return false;
|
|
1353
|
-
}
|
|
1354
|
-
return true;
|
|
1355
|
-
}
|
|
1356
|
-
toHexString() {
|
|
1357
|
-
if (_ie.cacheHexString) {
|
|
1358
|
-
const t2 = ne.get(this);
|
|
1359
|
-
if (t2) return t2;
|
|
1360
|
-
}
|
|
1361
|
-
const t = rt.toHex(this.id);
|
|
1362
|
-
return _ie.cacheHexString && ne.set(this, t), t;
|
|
1363
|
-
}
|
|
1364
|
-
static getInc() {
|
|
1365
|
-
return _ie.index = (_ie.index + 1) % 16777215;
|
|
1366
|
-
}
|
|
1367
|
-
static generate(t) {
|
|
1368
|
-
"number" != typeof t && (t = Math.floor(Date.now() / 1e3));
|
|
1369
|
-
const e2 = _ie.getInc(), n = rt.allocateUnsafe(12);
|
|
1370
|
-
return Vt.setInt32BE(n, 0, t), null === ee && (ee = rt.randomBytes(5)), n[4] = ee[0], n[5] = ee[1], n[6] = ee[2], n[7] = ee[3], n[8] = ee[4], n[11] = 255 & e2, n[10] = e2 >> 8 & 255, n[9] = e2 >> 16 & 255, n;
|
|
1371
|
-
}
|
|
1372
|
-
toString(t) {
|
|
1373
|
-
return "base64" === t ? rt.toBase64(this.id) : this.toHexString();
|
|
1374
|
-
}
|
|
1375
|
-
toJSON() {
|
|
1376
|
-
return this.toHexString();
|
|
1377
|
-
}
|
|
1378
|
-
static is(t) {
|
|
1379
|
-
return null != t && "object" == typeof t && "_bsontype" in t && "ObjectId" === t._bsontype;
|
|
1380
|
-
}
|
|
1381
|
-
equals(t) {
|
|
1382
|
-
if (null == t) return false;
|
|
1383
|
-
if (_ie.is(t)) return this.buffer[11] === t.buffer[11] && rt.equals(this.buffer, t.buffer);
|
|
1384
|
-
if ("string" == typeof t) return t.toLowerCase() === this.toHexString();
|
|
1385
|
-
if ("object" == typeof t && "function" == typeof t.toHexString) {
|
|
1386
|
-
const e2 = t.toHexString(), n = this.toHexString();
|
|
1387
|
-
return "string" == typeof e2 && e2.toLowerCase() === n;
|
|
1388
|
-
}
|
|
1389
|
-
return false;
|
|
1390
|
-
}
|
|
1391
|
-
getTimestamp() {
|
|
1392
|
-
const t = /* @__PURE__ */ new Date(), e2 = Vt.getUint32BE(this.buffer, 0);
|
|
1393
|
-
return t.setTime(1e3 * Math.floor(e2)), t;
|
|
1394
|
-
}
|
|
1395
|
-
static createPk() {
|
|
1396
|
-
return new _ie();
|
|
1397
|
-
}
|
|
1398
|
-
serializeInto(t, e2) {
|
|
1399
|
-
return t[e2] = this.buffer[0], t[e2 + 1] = this.buffer[1], t[e2 + 2] = this.buffer[2], t[e2 + 3] = this.buffer[3], t[e2 + 4] = this.buffer[4], t[e2 + 5] = this.buffer[5], t[e2 + 6] = this.buffer[6], t[e2 + 7] = this.buffer[7], t[e2 + 8] = this.buffer[8], t[e2 + 9] = this.buffer[9], t[e2 + 10] = this.buffer[10], t[e2 + 11] = this.buffer[11], 12;
|
|
1400
|
-
}
|
|
1401
|
-
static createFromTime(t) {
|
|
1402
|
-
const e2 = rt.allocate(12);
|
|
1403
|
-
for (let t2 = 11; t2 >= 4; t2--) e2[t2] = 0;
|
|
1404
|
-
return Vt.setInt32BE(e2, 0, t), new _ie(e2);
|
|
1405
|
-
}
|
|
1406
|
-
static createFromHexString(t) {
|
|
1407
|
-
if (24 !== t?.length) throw new $("hex string must be 24 characters");
|
|
1408
|
-
return new _ie(rt.fromHex(t));
|
|
1409
|
-
}
|
|
1410
|
-
static createFromBase64(t) {
|
|
1411
|
-
if (16 !== t?.length) throw new $("base64 string must be 16 characters");
|
|
1412
|
-
return new _ie(rt.fromBase64(t));
|
|
1413
|
-
}
|
|
1414
|
-
static isValid(t) {
|
|
1415
|
-
if (null == t) return false;
|
|
1416
|
-
if ("string" == typeof t) return _ie.validateHexString(t);
|
|
1417
|
-
try {
|
|
1418
|
-
return new _ie(t), true;
|
|
1419
|
-
} catch {
|
|
1420
|
-
return false;
|
|
1421
|
-
}
|
|
1422
|
-
}
|
|
1423
|
-
toExtendedJSON() {
|
|
1424
|
-
return this.toHexString ? { $oid: this.toHexString() } : { $oid: this.toString("hex") };
|
|
1425
|
-
}
|
|
1426
|
-
static fromExtendedJSON(t) {
|
|
1427
|
-
return new _ie(t.$oid);
|
|
1428
|
-
}
|
|
1429
|
-
isCached() {
|
|
1430
|
-
return _ie.cacheHexString && ne.has(this);
|
|
1431
|
-
}
|
|
1432
|
-
inspect(t, e2, n) {
|
|
1433
|
-
return n ??= X, `new ObjectId(${n(this.toHexString(), e2)})`;
|
|
1434
|
-
}
|
|
1435
|
-
};
|
|
1436
|
-
function le(t, e2, n) {
|
|
1437
|
-
let i = 5;
|
|
1438
|
-
if (Array.isArray(t)) for (let l = 0; l < t.length; l++) i += oe(l.toString(), t[l], e2, true, n);
|
|
1439
|
-
else {
|
|
1440
|
-
"function" == typeof t?.toBSON && (t = t.toBSON());
|
|
1441
|
-
for (const l of Object.keys(t)) i += oe(l, t[l], e2, false, n);
|
|
1442
|
-
}
|
|
1443
|
-
return i;
|
|
1444
|
-
}
|
|
1445
|
-
function oe(t, e2, n = false, i = false, l = false) {
|
|
1446
|
-
switch ("function" == typeof e2?.toBSON && (e2 = e2.toBSON()), typeof e2) {
|
|
1447
|
-
case "string":
|
|
1448
|
-
return 1 + rt.utf8ByteLength(t) + 1 + 4 + rt.utf8ByteLength(e2) + 1;
|
|
1449
|
-
case "number":
|
|
1450
|
-
return Math.floor(e2) === e2 && e2 >= S && e2 <= R && e2 >= g && e2 <= f ? (null != t ? rt.utf8ByteLength(t) + 1 : 0) + 5 : (null != t ? rt.utf8ByteLength(t) + 1 : 0) + 9;
|
|
1451
|
-
case "undefined":
|
|
1452
|
-
return i || !l ? (null != t ? rt.utf8ByteLength(t) + 1 : 0) + 1 : 0;
|
|
1453
|
-
case "boolean":
|
|
1454
|
-
return (null != t ? rt.utf8ByteLength(t) + 1 : 0) + 2;
|
|
1455
|
-
case "object":
|
|
1456
|
-
if (null != e2 && "string" == typeof e2._bsontype && e2[W] !== V) throw new q();
|
|
1457
|
-
if (null == e2 || "MinKey" === e2._bsontype || "MaxKey" === e2._bsontype) return (null != t ? rt.utf8ByteLength(t) + 1 : 0) + 1;
|
|
1458
|
-
if ("ObjectId" === e2._bsontype) return (null != t ? rt.utf8ByteLength(t) + 1 : 0) + 13;
|
|
1459
|
-
if (e2 instanceof Date || G(e2)) return (null != t ? rt.utf8ByteLength(t) + 1 : 0) + 9;
|
|
1460
|
-
if (ArrayBuffer.isView(e2) || e2 instanceof ArrayBuffer || p(e2)) return (null != t ? rt.utf8ByteLength(t) + 1 : 0) + 6 + e2.byteLength;
|
|
1461
|
-
if ("Long" === e2._bsontype || "Double" === e2._bsontype || "Timestamp" === e2._bsontype) return (null != t ? rt.utf8ByteLength(t) + 1 : 0) + 9;
|
|
1462
|
-
if ("Decimal128" === e2._bsontype) return (null != t ? rt.utf8ByteLength(t) + 1 : 0) + 17;
|
|
1463
|
-
if ("Code" === e2._bsontype) return null != e2.scope && Object.keys(e2.scope).length > 0 ? (null != t ? rt.utf8ByteLength(t) + 1 : 0) + 1 + 4 + 4 + rt.utf8ByteLength(e2.code.toString()) + 1 + le(e2.scope, n, l) : (null != t ? rt.utf8ByteLength(t) + 1 : 0) + 1 + 4 + rt.utf8ByteLength(e2.code.toString()) + 1;
|
|
1464
|
-
if ("Binary" === e2._bsontype) {
|
|
1465
|
-
const n2 = e2;
|
|
1466
|
-
return n2.sub_type === Wt.SUBTYPE_BYTE_ARRAY ? (null != t ? rt.utf8ByteLength(t) + 1 : 0) + (n2.position + 1 + 4 + 1 + 4) : (null != t ? rt.utf8ByteLength(t) + 1 : 0) + (n2.position + 1 + 4 + 1);
|
|
1467
|
-
}
|
|
1468
|
-
if ("Symbol" === e2._bsontype) return (null != t ? rt.utf8ByteLength(t) + 1 : 0) + rt.utf8ByteLength(e2.value) + 4 + 1 + 1;
|
|
1469
|
-
if ("DBRef" === e2._bsontype) {
|
|
1470
|
-
const i2 = Object.assign({ $ref: e2.collection, $id: e2.oid }, e2.fields);
|
|
1471
|
-
return null != e2.db && (i2.$db = e2.db), (null != t ? rt.utf8ByteLength(t) + 1 : 0) + 1 + le(i2, n, l);
|
|
1472
|
-
}
|
|
1473
|
-
return e2 instanceof RegExp || h(e2) ? (null != t ? rt.utf8ByteLength(t) + 1 : 0) + 1 + rt.utf8ByteLength(e2.source) + 1 + (e2.global ? 1 : 0) + (e2.ignoreCase ? 1 : 0) + (e2.multiline ? 1 : 0) + 1 : "BSONRegExp" === e2._bsontype ? (null != t ? rt.utf8ByteLength(t) + 1 : 0) + 1 + rt.utf8ByteLength(e2.pattern) + 1 + rt.utf8ByteLength(e2.options) + 1 : (null != t ? rt.utf8ByteLength(t) + 1 : 0) + le(e2, n, l) + 1;
|
|
1474
|
-
case "function":
|
|
1475
|
-
return n ? (null != t ? rt.utf8ByteLength(t) + 1 : 0) + 1 + 4 + rt.utf8ByteLength(e2.toString()) + 1 : 0;
|
|
1476
|
-
case "bigint":
|
|
1477
|
-
return (null != t ? rt.utf8ByteLength(t) + 1 : 0) + 9;
|
|
1478
|
-
case "symbol":
|
|
1479
|
-
return 0;
|
|
1480
|
-
default:
|
|
1481
|
-
throw new $("Unrecognized JS type: " + typeof e2);
|
|
1482
|
-
}
|
|
1483
|
-
}
|
|
1484
|
-
var ce = class _ce extends ht {
|
|
1485
|
-
get _bsontype() {
|
|
1486
|
-
return "BSONRegExp";
|
|
1487
|
-
}
|
|
1488
|
-
pattern;
|
|
1489
|
-
options;
|
|
1490
|
-
constructor(t, e2) {
|
|
1491
|
-
if (super(), this.pattern = t, this.options = (e2 ?? "").split("").sort().join(""), -1 !== this.pattern.indexOf("\0")) throw new $(`BSON Regex patterns cannot contain null bytes, found: ${JSON.stringify(this.pattern)}`);
|
|
1492
|
-
if (-1 !== this.options.indexOf("\0")) throw new $(`BSON Regex options cannot contain null bytes, found: ${JSON.stringify(this.options)}`);
|
|
1493
|
-
for (let t2 = 0; t2 < this.options.length; t2++) if ("i" !== this.options[t2] && "m" !== this.options[t2] && "x" !== this.options[t2] && "l" !== this.options[t2] && "s" !== this.options[t2] && "u" !== this.options[t2]) throw new $(`The regular expression option [${this.options[t2]}] is not supported`);
|
|
1494
|
-
}
|
|
1495
|
-
static parseOptions(t) {
|
|
1496
|
-
return t ? t.split("").sort().join("") : "";
|
|
1497
|
-
}
|
|
1498
|
-
toExtendedJSON(t) {
|
|
1499
|
-
return (t = t || {}).legacy ? { $regex: this.pattern, $options: this.options } : { $regularExpression: { pattern: this.pattern, options: this.options } };
|
|
1500
|
-
}
|
|
1501
|
-
static fromExtendedJSON(t) {
|
|
1502
|
-
if ("$regex" in t) {
|
|
1503
|
-
if ("string" == typeof t.$regex) return new _ce(t.$regex, _ce.parseOptions(t.$options));
|
|
1504
|
-
if ("BSONRegExp" === t.$regex._bsontype) return t;
|
|
1505
|
-
}
|
|
1506
|
-
if ("$regularExpression" in t) return new _ce(t.$regularExpression.pattern, _ce.parseOptions(t.$regularExpression.options));
|
|
1507
|
-
throw new $(`Unexpected BSONRegExp EJSON object form: ${JSON.stringify(t)}`);
|
|
1508
|
-
}
|
|
1509
|
-
inspect(t, e2, n) {
|
|
1510
|
-
const i = (function(t2) {
|
|
1511
|
-
if (null != t2 && "object" == typeof t2 && "stylize" in t2 && "function" == typeof t2.stylize) return t2.stylize;
|
|
1512
|
-
})(e2) ?? ((t2) => t2);
|
|
1513
|
-
n ??= X;
|
|
1514
|
-
return `new BSONRegExp(${i(n(this.pattern), "regexp")}, ${i(n(this.options), "regexp")})`;
|
|
1515
|
-
}
|
|
1516
|
-
};
|
|
1517
|
-
var ae = class _ae extends ht {
|
|
1518
|
-
get _bsontype() {
|
|
1519
|
-
return "BSONSymbol";
|
|
1520
|
-
}
|
|
1521
|
-
value;
|
|
1522
|
-
constructor(t) {
|
|
1523
|
-
super(), this.value = t;
|
|
1524
|
-
}
|
|
1525
|
-
valueOf() {
|
|
1526
|
-
return this.value;
|
|
1527
|
-
}
|
|
1528
|
-
toString() {
|
|
1529
|
-
return this.value;
|
|
1530
|
-
}
|
|
1531
|
-
toJSON() {
|
|
1532
|
-
return this.value;
|
|
1533
|
-
}
|
|
1534
|
-
toExtendedJSON() {
|
|
1535
|
-
return { $symbol: this.value };
|
|
1536
|
-
}
|
|
1537
|
-
static fromExtendedJSON(t) {
|
|
1538
|
-
return new _ae(t.$symbol);
|
|
1539
|
-
}
|
|
1540
|
-
inspect(t, e2, n) {
|
|
1541
|
-
return n ??= X, `new BSONSymbol(${n(this.value, e2)})`;
|
|
1542
|
-
}
|
|
1543
|
-
};
|
|
1544
|
-
var se = Ht;
|
|
1545
|
-
var de = class _de extends se {
|
|
1546
|
-
get _bsontype() {
|
|
1547
|
-
return "Timestamp";
|
|
1548
|
-
}
|
|
1549
|
-
get [pt]() {
|
|
1550
|
-
return "Timestamp";
|
|
1551
|
-
}
|
|
1552
|
-
static MAX_VALUE = Ht.MAX_UNSIGNED_VALUE;
|
|
1553
|
-
get i() {
|
|
1554
|
-
return this.low >>> 0;
|
|
1555
|
-
}
|
|
1556
|
-
get t() {
|
|
1557
|
-
return this.high >>> 0;
|
|
1558
|
-
}
|
|
1559
|
-
constructor(t) {
|
|
1560
|
-
if (null == t) super(0, 0, true);
|
|
1561
|
-
else if ("bigint" == typeof t) super(t, true);
|
|
1562
|
-
else if (Ht.isLong(t)) super(t.low, t.high, true);
|
|
1563
|
-
else {
|
|
1564
|
-
if ("object" != typeof t || !("t" in t) || !("i" in t)) throw new $("A Timestamp can only be constructed with: bigint, Long, or { t: number; i: number }");
|
|
1565
|
-
{
|
|
1566
|
-
if ("number" != typeof t.t && ("object" != typeof t.t || "Int32" !== t.t._bsontype)) throw new $("Timestamp constructed from { t, i } must provide t as a number");
|
|
1567
|
-
if ("number" != typeof t.i && ("object" != typeof t.i || "Int32" !== t.i._bsontype)) throw new $("Timestamp constructed from { t, i } must provide i as a number");
|
|
1568
|
-
const e2 = Number(t.t), n = Number(t.i);
|
|
1569
|
-
if (e2 < 0 || Number.isNaN(e2)) throw new $("Timestamp constructed from { t, i } must provide a positive t");
|
|
1570
|
-
if (n < 0 || Number.isNaN(n)) throw new $("Timestamp constructed from { t, i } must provide a positive i");
|
|
1571
|
-
if (e2 > 4294967295) throw new $("Timestamp constructed from { t, i } must provide t equal or less than uint32 max");
|
|
1572
|
-
if (n > 4294967295) throw new $("Timestamp constructed from { t, i } must provide i equal or less than uint32 max");
|
|
1573
|
-
super(n, e2, true);
|
|
1574
|
-
}
|
|
1575
|
-
}
|
|
1576
|
-
}
|
|
1577
|
-
toJSON() {
|
|
1578
|
-
return { $timestamp: this.toString() };
|
|
1579
|
-
}
|
|
1580
|
-
static fromInt(t) {
|
|
1581
|
-
return new _de(Ht.fromInt(t, true));
|
|
1582
|
-
}
|
|
1583
|
-
static fromNumber(t) {
|
|
1584
|
-
return new _de(Ht.fromNumber(t, true));
|
|
1585
|
-
}
|
|
1586
|
-
static fromBits(t, e2) {
|
|
1587
|
-
return new _de({ i: t, t: e2 });
|
|
1588
|
-
}
|
|
1589
|
-
static fromString(t, e2) {
|
|
1590
|
-
return new _de(Ht.fromString(t, true, e2));
|
|
1591
|
-
}
|
|
1592
|
-
toExtendedJSON() {
|
|
1593
|
-
return { $timestamp: { t: this.t, i: this.i } };
|
|
1594
|
-
}
|
|
1595
|
-
static fromExtendedJSON(t) {
|
|
1596
|
-
const e2 = Ht.isLong(t.$timestamp.i) ? t.$timestamp.i.getLowBitsUnsigned() : t.$timestamp.i, n = Ht.isLong(t.$timestamp.t) ? t.$timestamp.t.getLowBitsUnsigned() : t.$timestamp.t;
|
|
1597
|
-
return new _de({ t: n, i: e2 });
|
|
1598
|
-
}
|
|
1599
|
-
inspect(t, e2, n) {
|
|
1600
|
-
n ??= X;
|
|
1601
|
-
return `new Timestamp({ t: ${n(this.t, e2)}, i: ${n(this.i, e2)} })`;
|
|
1602
|
-
}
|
|
1603
|
-
};
|
|
1604
|
-
var be = Ht.fromNumber(R);
|
|
1605
|
-
var Ze = Ht.fromNumber(S);
|
|
1606
|
-
function me(t, e2, n) {
|
|
1607
|
-
const i = (e2 = null == e2 ? {} : e2) && e2.index ? e2.index : 0, l = Vt.getInt32LE(t, i);
|
|
1608
|
-
if (l < 5) throw new $(`bson size must be >= 5, is ${l}`);
|
|
1609
|
-
if (e2.allowObjectSmallerThanBufferSize && t.length < l) throw new $(`buffer length ${t.length} must be >= bson size ${l}`);
|
|
1610
|
-
if (!e2.allowObjectSmallerThanBufferSize && t.length !== l) throw new $(`buffer length ${t.length} must === bson size ${l}`);
|
|
1611
|
-
if (l + i > t.byteLength) throw new $(`(bson size ${l} + options.index ${i} must be <= buffer length ${t.byteLength})`);
|
|
1612
|
-
if (0 !== t[i + l - 1]) throw new $("One object, sized correctly, with a spot for an EOO, but the EOO isn't 0x00");
|
|
1613
|
-
return re(t, i, e2, n);
|
|
1614
|
-
}
|
|
1615
|
-
var ue = /^\$ref$|^\$id$|^\$db$/;
|
|
1616
|
-
function re(t, e2, n, i = false) {
|
|
1617
|
-
const l = null == n.fieldsAsRaw ? null : n.fieldsAsRaw, o = null != n.raw && n.raw, c = "boolean" == typeof n.bsonRegExp && n.bsonRegExp, a = n.promoteBuffers ?? false, s = n.promoteLongs ?? true, d = n.promoteValues ?? true, b = n.useBigInt64 ?? false;
|
|
1618
|
-
if (b && !d) throw new $("Must either request bigint or Long for int64 deserialization");
|
|
1619
|
-
if (b && !s) throw new $("Must either request bigint or Long for int64 deserialization");
|
|
1620
|
-
let Z, m, u2 = true;
|
|
1621
|
-
const r2 = (null == n.validation ? { utf8: true } : n.validation).utf8;
|
|
1622
|
-
if ("boolean" == typeof r2) Z = r2;
|
|
1623
|
-
else {
|
|
1624
|
-
u2 = false;
|
|
1625
|
-
const t2 = Object.keys(r2).map((function(t3) {
|
|
1626
|
-
return r2[t3];
|
|
1627
|
-
}));
|
|
1628
|
-
if (0 === t2.length) throw new $("UTF-8 validation setting cannot be empty");
|
|
1629
|
-
if ("boolean" != typeof t2[0]) throw new $("Invalid UTF-8 validation option, must specify boolean values");
|
|
1630
|
-
if (Z = t2[0], !t2.every(((t3) => t3 === Z))) throw new $("Invalid UTF-8 validation option - keys must be all true or all false");
|
|
1631
|
-
}
|
|
1632
|
-
if (!u2) {
|
|
1633
|
-
m = /* @__PURE__ */ new Set();
|
|
1634
|
-
for (const t2 of Object.keys(r2)) m.add(t2);
|
|
1635
|
-
}
|
|
1636
|
-
const p2 = e2;
|
|
1637
|
-
if (t.length < 5) throw new $("corrupt bson message < 5 bytes long");
|
|
1638
|
-
const h2 = Vt.getInt32LE(t, e2);
|
|
1639
|
-
if (e2 += 4, h2 < 5 || h2 > t.length) throw new $("corrupt bson message");
|
|
1640
|
-
const y2 = i ? [] : {};
|
|
1641
|
-
let G2 = 0, X2 = !i && null;
|
|
1642
|
-
for (; ; ) {
|
|
1643
|
-
const r3 = t[e2++];
|
|
1644
|
-
if (0 === r3) break;
|
|
1645
|
-
let p3 = e2;
|
|
1646
|
-
for (; 0 !== t[p3] && p3 < t.length; ) p3++;
|
|
1647
|
-
if (p3 >= t.byteLength) throw new $("Bad BSON Document: illegal CString");
|
|
1648
|
-
const h3 = i ? G2++ : rt.toUTF8(t, e2, p3, false);
|
|
1649
|
-
let V2, W2 = true;
|
|
1650
|
-
if (W2 = u2 || m?.has(h3) ? Z : !Z, false !== X2 && "$" === h3[0] && (X2 = ue.test(h3)), e2 = p3 + 1, r3 === K) {
|
|
1651
|
-
const n2 = Vt.getInt32LE(t, e2);
|
|
1652
|
-
if (e2 += 4, n2 <= 0 || n2 > t.length - e2 || 0 !== t[e2 + n2 - 1]) throw new $("bad string length in bson");
|
|
1653
|
-
V2 = rt.toUTF8(t, e2, e2 + n2 - 1, W2), e2 += n2;
|
|
1654
|
-
} else if (r3 === z) {
|
|
1655
|
-
const n2 = rt.allocateUnsafe(12);
|
|
1656
|
-
for (let i2 = 0; i2 < 12; i2++) n2[i2] = t[e2 + i2];
|
|
1657
|
-
V2 = new ie(n2), e2 += 12;
|
|
1658
|
-
} else if (r3 === j && false === d) V2 = new $t(Vt.getInt32LE(t, e2)), e2 += 4;
|
|
1659
|
-
else if (r3 === j) V2 = Vt.getInt32LE(t, e2), e2 += 4;
|
|
1660
|
-
else if (r3 === J) V2 = Vt.getFloat64LE(t, e2), e2 += 8, false === d && (V2 = new At(V2));
|
|
1661
|
-
else if (r3 === w) {
|
|
1662
|
-
const n2 = Vt.getInt32LE(t, e2), i2 = Vt.getInt32LE(t, e2 + 4);
|
|
1663
|
-
e2 += 8, V2 = new Date(new Ht(n2, i2).toNumber());
|
|
1664
|
-
} else if (r3 === x) {
|
|
1665
|
-
if (0 !== t[e2] && 1 !== t[e2]) throw new $("illegal boolean type value");
|
|
1666
|
-
V2 = 1 === t[e2++];
|
|
1667
|
-
} else if (r3 === L) {
|
|
1668
|
-
const i2 = e2, l2 = Vt.getInt32LE(t, e2);
|
|
1669
|
-
if (l2 <= 0 || l2 > t.length - e2) throw new $("bad embedded document length in bson");
|
|
1670
|
-
if (o) V2 = t.subarray(e2, e2 + l2);
|
|
1671
|
-
else {
|
|
1672
|
-
let e3 = n;
|
|
1673
|
-
u2 || (e3 = { ...n, validation: { utf8: W2 } }), V2 = re(t, i2, e3, false);
|
|
1674
|
-
}
|
|
1675
|
-
e2 += l2;
|
|
1676
|
-
} else if (r3 === T) {
|
|
1677
|
-
const i2 = e2, o2 = Vt.getInt32LE(t, e2);
|
|
1678
|
-
let c2 = n;
|
|
1679
|
-
const a2 = e2 + o2;
|
|
1680
|
-
if (l && l[h3] && (c2 = { ...n, raw: true }), u2 || (c2 = { ...c2, validation: { utf8: W2 } }), V2 = re(t, i2, c2, true), 0 !== t[(e2 += o2) - 1]) throw new $("invalid array terminator byte");
|
|
1681
|
-
if (e2 !== a2) throw new $("corrupted array bson");
|
|
1682
|
-
} else if (r3 === N) V2 = void 0;
|
|
1683
|
-
else if (r3 === H) V2 = null;
|
|
1684
|
-
else if (r3 === F) if (b) V2 = Vt.getBigInt64LE(t, e2), e2 += 8;
|
|
1685
|
-
else {
|
|
1686
|
-
const n2 = Vt.getInt32LE(t, e2), i2 = Vt.getInt32LE(t, e2 + 4);
|
|
1687
|
-
e2 += 8;
|
|
1688
|
-
const l2 = new Ht(n2, i2);
|
|
1689
|
-
V2 = s && true === d && l2.lessThanOrEqual(be) && l2.greaterThanOrEqual(Ze) ? l2.toNumber() : l2;
|
|
1690
|
-
}
|
|
1691
|
-
else if (r3 === Q) {
|
|
1692
|
-
const n2 = rt.allocateUnsafe(16);
|
|
1693
|
-
for (let i2 = 0; i2 < 16; i2++) n2[i2] = t[e2 + i2];
|
|
1694
|
-
e2 += 16, V2 = new Dt(n2);
|
|
1695
|
-
} else if (r3 === U) {
|
|
1696
|
-
let n2 = Vt.getInt32LE(t, e2);
|
|
1697
|
-
e2 += 4;
|
|
1698
|
-
const i2 = n2, l2 = t[e2++];
|
|
1699
|
-
if (n2 < 0) throw new $("Negative binary type element size found");
|
|
1700
|
-
if (n2 > t.byteLength) throw new $("Binary type size larger than document size");
|
|
1701
|
-
if (l2 === Wt.SUBTYPE_BYTE_ARRAY) {
|
|
1702
|
-
if (n2 = Vt.getInt32LE(t, e2), e2 += 4, n2 < 0) throw new $("Negative binary type element size found for subtype 0x02");
|
|
1703
|
-
if (n2 > i2 - 4) throw new $("Binary type with subtype 0x02 contains too long binary size");
|
|
1704
|
-
if (n2 < i2 - 4) throw new $("Binary type with subtype 0x02 contains too short binary size");
|
|
1705
|
-
}
|
|
1706
|
-
a && d ? V2 = rt.toLocalBufferType(t.subarray(e2, e2 + n2)) : (V2 = new Wt(t.subarray(e2, e2 + n2), l2), l2 === D && It.isValid(V2) && (V2 = V2.toUUID())), e2 += n2;
|
|
1707
|
-
} else if (r3 === k && false === c) {
|
|
1708
|
-
for (p3 = e2; 0 !== t[p3] && p3 < t.length; ) p3++;
|
|
1709
|
-
if (p3 >= t.length) throw new $("Bad BSON Document: illegal CString");
|
|
1710
|
-
const n2 = rt.toUTF8(t, e2, p3, false);
|
|
1711
|
-
for (p3 = e2 = p3 + 1; 0 !== t[p3] && p3 < t.length; ) p3++;
|
|
1712
|
-
if (p3 >= t.length) throw new $("Bad BSON Document: illegal CString");
|
|
1713
|
-
const i2 = rt.toUTF8(t, e2, p3, false);
|
|
1714
|
-
e2 = p3 + 1;
|
|
1715
|
-
const l2 = new Array(i2.length);
|
|
1716
|
-
for (p3 = 0; p3 < i2.length; p3++) switch (i2[p3]) {
|
|
1717
|
-
case "m":
|
|
1718
|
-
l2[p3] = "m";
|
|
1719
|
-
break;
|
|
1720
|
-
case "s":
|
|
1721
|
-
l2[p3] = "g";
|
|
1722
|
-
break;
|
|
1723
|
-
case "i":
|
|
1724
|
-
l2[p3] = "i";
|
|
1725
|
-
}
|
|
1726
|
-
V2 = new RegExp(n2, l2.join(""));
|
|
1727
|
-
} else if (r3 === k && true === c) {
|
|
1728
|
-
for (p3 = e2; 0 !== t[p3] && p3 < t.length; ) p3++;
|
|
1729
|
-
if (p3 >= t.length) throw new $("Bad BSON Document: illegal CString");
|
|
1730
|
-
const n2 = rt.toUTF8(t, e2, p3, false);
|
|
1731
|
-
for (p3 = e2 = p3 + 1; 0 !== t[p3] && p3 < t.length; ) p3++;
|
|
1732
|
-
if (p3 >= t.length) throw new $("Bad BSON Document: illegal CString");
|
|
1733
|
-
const i2 = rt.toUTF8(t, e2, p3, false);
|
|
1734
|
-
e2 = p3 + 1, V2 = new ce(n2, i2);
|
|
1735
|
-
} else if (r3 === v) {
|
|
1736
|
-
const n2 = Vt.getInt32LE(t, e2);
|
|
1737
|
-
if (e2 += 4, n2 <= 0 || n2 > t.length - e2 || 0 !== t[e2 + n2 - 1]) throw new $("bad string length in bson");
|
|
1738
|
-
const i2 = rt.toUTF8(t, e2, e2 + n2 - 1, W2);
|
|
1739
|
-
V2 = d ? i2 : new ae(i2), e2 += n2;
|
|
1740
|
-
} else if (r3 === P) V2 = new de({ i: Vt.getUint32LE(t, e2), t: Vt.getUint32LE(t, e2 + 4) }), e2 += 8;
|
|
1741
|
-
else if (r3 === O) V2 = new te();
|
|
1742
|
-
else if (r3 === E) V2 = new qt();
|
|
1743
|
-
else if (r3 === C) {
|
|
1744
|
-
const n2 = Vt.getInt32LE(t, e2);
|
|
1745
|
-
if (e2 += 4, n2 <= 0 || n2 > t.length - e2 || 0 !== t[e2 + n2 - 1]) throw new $("bad string length in bson");
|
|
1746
|
-
const i2 = rt.toUTF8(t, e2, e2 + n2 - 1, W2);
|
|
1747
|
-
V2 = new Rt(i2), e2 += n2;
|
|
1748
|
-
} else if (r3 === M) {
|
|
1749
|
-
const i2 = Vt.getInt32LE(t, e2);
|
|
1750
|
-
if (e2 += 4, i2 < 13) throw new $("code_w_scope total size shorter minimum expected length");
|
|
1751
|
-
const l2 = Vt.getInt32LE(t, e2);
|
|
1752
|
-
if (e2 += 4, l2 <= 0 || l2 > t.length - e2 || 0 !== t[e2 + l2 - 1]) throw new $("bad string length in bson");
|
|
1753
|
-
const o2 = rt.toUTF8(t, e2, e2 + l2 - 1, W2), c2 = e2 += l2, a2 = Vt.getInt32LE(t, e2), s2 = re(t, c2, n, false);
|
|
1754
|
-
if (e2 += a2, i2 < 8 + a2 + l2) throw new $("code_w_scope total size is too short, truncating scope");
|
|
1755
|
-
if (i2 > 8 + a2 + l2) throw new $("code_w_scope total size is too long, clips outer document");
|
|
1756
|
-
V2 = new Rt(o2, s2);
|
|
1757
|
-
} else {
|
|
1758
|
-
if (r3 !== B) throw new $(`Detected unknown BSON type ${r3.toString(16)} for fieldname "${h3}"`);
|
|
1759
|
-
{
|
|
1760
|
-
const n2 = Vt.getInt32LE(t, e2);
|
|
1761
|
-
if (e2 += 4, n2 <= 0 || n2 > t.length - e2 || 0 !== t[e2 + n2 - 1]) throw new $("bad string length in bson");
|
|
1762
|
-
const i2 = rt.toUTF8(t, e2, e2 + n2 - 1, W2);
|
|
1763
|
-
e2 += n2;
|
|
1764
|
-
const l2 = rt.allocateUnsafe(12);
|
|
1765
|
-
for (let n3 = 0; n3 < 12; n3++) l2[n3] = t[e2 + n3];
|
|
1766
|
-
const o2 = new ie(l2);
|
|
1767
|
-
e2 += 12, V2 = new Jt(i2, o2);
|
|
1768
|
-
}
|
|
1769
|
-
}
|
|
1770
|
-
"__proto__" === h3 ? Object.defineProperty(y2, h3, { value: V2, writable: true, enumerable: true, configurable: true }) : y2[h3] = V2;
|
|
1771
|
-
}
|
|
1772
|
-
if (h2 !== e2 - p2) {
|
|
1773
|
-
if (i) throw new $("corrupt array bson");
|
|
1774
|
-
throw new $("corrupt object bson");
|
|
1775
|
-
}
|
|
1776
|
-
if (!X2) return y2;
|
|
1777
|
-
if (St(y2)) {
|
|
1778
|
-
const t2 = Object.assign({}, y2);
|
|
1779
|
-
return delete t2.$ref, delete t2.$id, delete t2.$db, new Jt(y2.$ref, y2.$id, y2.$db, t2);
|
|
1780
|
-
}
|
|
1781
|
-
return y2;
|
|
1782
|
-
}
|
|
1783
|
-
var pe = /\x00/;
|
|
1784
|
-
var he = /* @__PURE__ */ new Set(["$db", "$ref", "$id", "$clusterTime"]);
|
|
1785
|
-
function ye(t, e2, n, i) {
|
|
1786
|
-
t[i++] = K;
|
|
1787
|
-
t[(i = i + rt.encodeUTF8Into(t, e2, i) + 1) - 1] = 0;
|
|
1788
|
-
const l = rt.encodeUTF8Into(t, n, i + 4);
|
|
1789
|
-
return Vt.setInt32LE(t, i, l + 1), i = i + 4 + l, t[i++] = 0, i;
|
|
1790
|
-
}
|
|
1791
|
-
function Ge(t, e2, n, i) {
|
|
1792
|
-
const l = !Object.is(n, -0) && Number.isSafeInteger(n) && n <= f && n >= g ? j : J;
|
|
1793
|
-
t[i++] = l;
|
|
1794
|
-
return i += rt.encodeUTF8Into(t, e2, i), t[i++] = 0, i += l === j ? Vt.setInt32LE(t, i, n) : Vt.setFloat64LE(t, i, n);
|
|
1795
|
-
}
|
|
1796
|
-
function Xe(t, e2, n, i) {
|
|
1797
|
-
t[i++] = F;
|
|
1798
|
-
return i += rt.encodeUTF8Into(t, e2, i), t[i++] = 0, i += Vt.setBigInt64LE(t, i, n);
|
|
1799
|
-
}
|
|
1800
|
-
function Ve(t, e2, n, i) {
|
|
1801
|
-
t[i++] = H;
|
|
1802
|
-
return i += rt.encodeUTF8Into(t, e2, i), t[i++] = 0, i;
|
|
1803
|
-
}
|
|
1804
|
-
function We(t, e2, n, i) {
|
|
1805
|
-
t[i++] = x;
|
|
1806
|
-
return i += rt.encodeUTF8Into(t, e2, i), t[i++] = 0, t[i++] = n ? 1 : 0, i;
|
|
1807
|
-
}
|
|
1808
|
-
function fe(t, e2, n, i) {
|
|
1809
|
-
t[i++] = w;
|
|
1810
|
-
i += rt.encodeUTF8Into(t, e2, i), t[i++] = 0;
|
|
1811
|
-
const l = Ht.fromNumber(n.getTime()), o = l.getLowBits(), c = l.getHighBits();
|
|
1812
|
-
return i += Vt.setInt32LE(t, i, o), i += Vt.setInt32LE(t, i, c);
|
|
1813
|
-
}
|
|
1814
|
-
function ge(t, e2, n, i) {
|
|
1815
|
-
t[i++] = k;
|
|
1816
|
-
if (i += rt.encodeUTF8Into(t, e2, i), t[i++] = 0, n.source && null != n.source.match(pe)) throw new $("value " + n.source + " must not contain null bytes");
|
|
1817
|
-
return i += rt.encodeUTF8Into(t, n.source, i), t[i++] = 0, n.ignoreCase && (t[i++] = 105), n.global && (t[i++] = 115), n.multiline && (t[i++] = 109), t[i++] = 0, i;
|
|
1818
|
-
}
|
|
1819
|
-
function Ye(t, e2, n, i) {
|
|
1820
|
-
t[i++] = k;
|
|
1821
|
-
if (i += rt.encodeUTF8Into(t, e2, i), t[i++] = 0, null != n.pattern.match(pe)) throw new $("pattern " + n.pattern + " must not contain null bytes");
|
|
1822
|
-
i += rt.encodeUTF8Into(t, n.pattern, i), t[i++] = 0;
|
|
1823
|
-
const l = n.options.split("").sort().join("");
|
|
1824
|
-
return i += rt.encodeUTF8Into(t, l, i), t[i++] = 0, i;
|
|
1825
|
-
}
|
|
1826
|
-
function Ie(t, e2, n, i) {
|
|
1827
|
-
null === n ? t[i++] = H : "MinKey" === n._bsontype ? t[i++] = O : t[i++] = E;
|
|
1828
|
-
return i += rt.encodeUTF8Into(t, e2, i), t[i++] = 0, i;
|
|
1829
|
-
}
|
|
1830
|
-
function Re(t, e2, n, i) {
|
|
1831
|
-
t[i++] = z;
|
|
1832
|
-
return i += rt.encodeUTF8Into(t, e2, i), t[i++] = 0, i += n.serializeInto(t, i);
|
|
1833
|
-
}
|
|
1834
|
-
function Se(t, e2, n, i) {
|
|
1835
|
-
t[i++] = U;
|
|
1836
|
-
i += rt.encodeUTF8Into(t, e2, i), t[i++] = 0;
|
|
1837
|
-
const l = n.length;
|
|
1838
|
-
if (i += Vt.setInt32LE(t, i, l), t[i++] = _, l <= 16) for (let e3 = 0; e3 < l; e3++) t[i + e3] = n[e3];
|
|
1839
|
-
else t.set(n, i);
|
|
1840
|
-
return i += l;
|
|
1841
|
-
}
|
|
1842
|
-
function Je(t, e2, n, i, l, o, c, a, s) {
|
|
1843
|
-
if (s.has(n)) throw new $("Cannot convert circular structure to BSON");
|
|
1844
|
-
s.add(n), t[i++] = Array.isArray(n) ? T : L;
|
|
1845
|
-
i += rt.encodeUTF8Into(t, e2, i), t[i++] = 0;
|
|
1846
|
-
const d = ke(t, n, l, i, o + 1, c, a, s);
|
|
1847
|
-
return s.delete(n), d;
|
|
1848
|
-
}
|
|
1849
|
-
function Ke(t, e2, n, i) {
|
|
1850
|
-
t[i++] = Q;
|
|
1851
|
-
i += rt.encodeUTF8Into(t, e2, i), t[i++] = 0;
|
|
1852
|
-
for (let e3 = 0; e3 < 16; e3++) t[i + e3] = n.bytes[e3];
|
|
1853
|
-
return i + 16;
|
|
1854
|
-
}
|
|
1855
|
-
function Le(t, e2, n, i) {
|
|
1856
|
-
t[i++] = "Long" === n._bsontype ? F : P;
|
|
1857
|
-
i += rt.encodeUTF8Into(t, e2, i), t[i++] = 0;
|
|
1858
|
-
const l = n.getLowBits(), o = n.getHighBits();
|
|
1859
|
-
return i += Vt.setInt32LE(t, i, l), i += Vt.setInt32LE(t, i, o);
|
|
1860
|
-
}
|
|
1861
|
-
function Te(t, e2, n, i) {
|
|
1862
|
-
n = n.valueOf(), t[i++] = j;
|
|
1863
|
-
return i += rt.encodeUTF8Into(t, e2, i), t[i++] = 0, i += Vt.setInt32LE(t, i, n);
|
|
1864
|
-
}
|
|
1865
|
-
function Ue(t, e2, n, i) {
|
|
1866
|
-
t[i++] = J;
|
|
1867
|
-
return i += rt.encodeUTF8Into(t, e2, i), t[i++] = 0, i += Vt.setFloat64LE(t, i, n.value);
|
|
1868
|
-
}
|
|
1869
|
-
function Ne(t, e2, n, i) {
|
|
1870
|
-
t[i++] = C;
|
|
1871
|
-
i += rt.encodeUTF8Into(t, e2, i), t[i++] = 0;
|
|
1872
|
-
const l = n.toString(), o = rt.encodeUTF8Into(t, l, i + 4) + 1;
|
|
1873
|
-
return Vt.setInt32LE(t, i, o), i = i + 4 + o - 1, t[i++] = 0, i;
|
|
1874
|
-
}
|
|
1875
|
-
function ze(t, e2, n, i, l = false, o = 0, c = false, a = true, s) {
|
|
1876
|
-
if (n.scope && "object" == typeof n.scope) {
|
|
1877
|
-
t[i++] = M;
|
|
1878
|
-
i += rt.encodeUTF8Into(t, e2, i), t[i++] = 0;
|
|
1879
|
-
let d = i;
|
|
1880
|
-
const b = n.code;
|
|
1881
|
-
i += 4;
|
|
1882
|
-
const Z = rt.encodeUTF8Into(t, b, i + 4) + 1;
|
|
1883
|
-
Vt.setInt32LE(t, i, Z), t[i + 4 + Z - 1] = 0, i = i + Z + 4;
|
|
1884
|
-
const m = ke(t, n.scope, l, i, o + 1, c, a, s);
|
|
1885
|
-
i = m - 1;
|
|
1886
|
-
const u2 = m - d;
|
|
1887
|
-
d += Vt.setInt32LE(t, d, u2), t[i++] = 0;
|
|
1888
|
-
} else {
|
|
1889
|
-
t[i++] = C;
|
|
1890
|
-
i += rt.encodeUTF8Into(t, e2, i), t[i++] = 0;
|
|
1891
|
-
const l2 = n.code.toString(), o2 = rt.encodeUTF8Into(t, l2, i + 4) + 1;
|
|
1892
|
-
Vt.setInt32LE(t, i, o2), i = i + 4 + o2 - 1, t[i++] = 0;
|
|
1893
|
-
}
|
|
1894
|
-
return i;
|
|
1895
|
-
}
|
|
1896
|
-
function xe(t, e2, n, i) {
|
|
1897
|
-
t[i++] = U;
|
|
1898
|
-
i += rt.encodeUTF8Into(t, e2, i), t[i++] = 0;
|
|
1899
|
-
const l = n.buffer;
|
|
1900
|
-
let o = n.position;
|
|
1901
|
-
if (n.sub_type === Wt.SUBTYPE_BYTE_ARRAY && (o += 4), i += Vt.setInt32LE(t, i, o), t[i++] = n.sub_type, n.sub_type === Wt.SUBTYPE_BYTE_ARRAY && (o -= 4, i += Vt.setInt32LE(t, i, o)), n.sub_type === Wt.SUBTYPE_VECTOR && ft(n), o <= 16) for (let e3 = 0; e3 < o; e3++) t[i + e3] = l[e3];
|
|
1902
|
-
else t.set(l, i);
|
|
1903
|
-
return i += n.position;
|
|
1904
|
-
}
|
|
1905
|
-
function we(t, e2, n, i) {
|
|
1906
|
-
t[i++] = v;
|
|
1907
|
-
i += rt.encodeUTF8Into(t, e2, i), t[i++] = 0;
|
|
1908
|
-
const l = rt.encodeUTF8Into(t, n.value, i + 4) + 1;
|
|
1909
|
-
return Vt.setInt32LE(t, i, l), i = i + 4 + l - 1, t[i++] = 0, i;
|
|
1910
|
-
}
|
|
1911
|
-
function He(t, e2, n, i, l, o, c) {
|
|
1912
|
-
t[i++] = L;
|
|
1913
|
-
i += rt.encodeUTF8Into(t, e2, i), t[i++] = 0;
|
|
1914
|
-
let a = i, s = { $ref: n.collection || n.namespace, $id: n.oid };
|
|
1915
|
-
null != n.db && (s.$db = n.db), s = Object.assign(s, n.fields);
|
|
1916
|
-
const d = ke(t, s, false, i, l + 1, o, true, c), b = d - a;
|
|
1917
|
-
return a += Vt.setInt32LE(t, i, b), d;
|
|
1918
|
-
}
|
|
1919
|
-
function ke(t, e2, n, i, l, o, c, a) {
|
|
1920
|
-
if (null == a) {
|
|
1921
|
-
if (null == e2) return t[0] = 5, t[1] = 0, t[2] = 0, t[3] = 0, t[4] = 0, 5;
|
|
1922
|
-
if (Array.isArray(e2)) throw new $("serialize does not support an array as the root input");
|
|
1923
|
-
if ("object" != typeof e2) throw new $("serialize does not support non-object as the root input");
|
|
1924
|
-
if ("_bsontype" in e2 && "string" == typeof e2._bsontype) throw new $("BSON types cannot be serialized as a document");
|
|
1925
|
-
if (G(e2) || h(e2) || r(e2) || p(e2)) throw new $("date, regexp, typedarray, and arraybuffer cannot be BSON documents");
|
|
1926
|
-
a = /* @__PURE__ */ new Set();
|
|
1927
|
-
}
|
|
1928
|
-
a.add(e2);
|
|
1929
|
-
let s = i + 4;
|
|
1930
|
-
if (Array.isArray(e2)) for (let i2 = 0; i2 < e2.length; i2++) {
|
|
1931
|
-
const d2 = `${i2}`;
|
|
1932
|
-
let b = e2[i2];
|
|
1933
|
-
"function" == typeof b?.toBSON && (b = b.toBSON());
|
|
1934
|
-
const Z = typeof b;
|
|
1935
|
-
if (void 0 === b) s = Ve(t, d2, 0, s);
|
|
1936
|
-
else if (null === b) s = Ve(t, d2, 0, s);
|
|
1937
|
-
else if ("string" === Z) s = ye(t, d2, b, s);
|
|
1938
|
-
else if ("number" === Z) s = Ge(t, d2, b, s);
|
|
1939
|
-
else if ("bigint" === Z) s = Xe(t, d2, b, s);
|
|
1940
|
-
else if ("boolean" === Z) s = We(t, d2, b, s);
|
|
1941
|
-
else if ("object" === Z && null == b._bsontype) s = b instanceof Date || G(b) ? fe(t, d2, b, s) : b instanceof Uint8Array || r(b) ? Se(t, d2, b, s) : b instanceof RegExp || h(b) ? ge(t, d2, b, s) : Je(t, d2, b, s, n, l, o, c, a);
|
|
1942
|
-
else if ("object" === Z) {
|
|
1943
|
-
if (b[W] !== V) throw new q();
|
|
1944
|
-
if ("ObjectId" === b._bsontype) s = Re(t, d2, b, s);
|
|
1945
|
-
else if ("Decimal128" === b._bsontype) s = Ke(t, d2, b, s);
|
|
1946
|
-
else if ("Long" === b._bsontype || "Timestamp" === b._bsontype) s = Le(t, d2, b, s);
|
|
1947
|
-
else if ("Double" === b._bsontype) s = Ue(t, d2, b, s);
|
|
1948
|
-
else if ("Code" === b._bsontype) s = ze(t, d2, b, s, n, l, o, c, a);
|
|
1949
|
-
else if ("Binary" === b._bsontype) s = xe(t, d2, b, s);
|
|
1950
|
-
else if ("BSONSymbol" === b._bsontype) s = we(t, d2, b, s);
|
|
1951
|
-
else if ("DBRef" === b._bsontype) s = He(t, d2, b, s, l, o, a);
|
|
1952
|
-
else if ("BSONRegExp" === b._bsontype) s = Ye(t, d2, b, s);
|
|
1953
|
-
else if ("Int32" === b._bsontype) s = Te(t, d2, b, s);
|
|
1954
|
-
else if ("MinKey" === b._bsontype || "MaxKey" === b._bsontype) s = Ie(t, d2, b, s);
|
|
1955
|
-
else if (void 0 !== b._bsontype) throw new $(`Unrecognized or invalid _bsontype: ${String(b._bsontype)}`);
|
|
1956
|
-
} else "function" === Z && o && (s = Ne(t, d2, b, s));
|
|
1957
|
-
}
|
|
1958
|
-
else if (e2 instanceof Map || y(e2)) {
|
|
1959
|
-
const i2 = e2.entries();
|
|
1960
|
-
let d2 = false;
|
|
1961
|
-
for (; !d2; ) {
|
|
1962
|
-
const e3 = i2.next();
|
|
1963
|
-
if (d2 = !!e3.done, d2) continue;
|
|
1964
|
-
const b = e3.value ? e3.value[0] : void 0;
|
|
1965
|
-
let Z = e3.value ? e3.value[1] : void 0;
|
|
1966
|
-
"function" == typeof Z?.toBSON && (Z = Z.toBSON());
|
|
1967
|
-
const m = typeof Z;
|
|
1968
|
-
if ("string" == typeof b && !he.has(b)) {
|
|
1969
|
-
if (null != b.match(pe)) throw new $("key " + b + " must not contain null bytes");
|
|
1970
|
-
if (n) {
|
|
1971
|
-
if ("$" === b[0]) throw new $("key " + b + " must not start with '$'");
|
|
1972
|
-
if (b.includes(".")) throw new $("key " + b + " must not contain '.'");
|
|
1973
|
-
}
|
|
1974
|
-
}
|
|
1975
|
-
if (void 0 === Z) false === c && (s = Ve(t, b, 0, s));
|
|
1976
|
-
else if (null === Z) s = Ve(t, b, 0, s);
|
|
1977
|
-
else if ("string" === m) s = ye(t, b, Z, s);
|
|
1978
|
-
else if ("number" === m) s = Ge(t, b, Z, s);
|
|
1979
|
-
else if ("bigint" === m) s = Xe(t, b, Z, s);
|
|
1980
|
-
else if ("boolean" === m) s = We(t, b, Z, s);
|
|
1981
|
-
else if ("object" === m && null == Z._bsontype) s = Z instanceof Date || G(Z) ? fe(t, b, Z, s) : Z instanceof Uint8Array || r(Z) ? Se(t, b, Z, s) : Z instanceof RegExp || h(Z) ? ge(t, b, Z, s) : Je(t, b, Z, s, n, l, o, c, a);
|
|
1982
|
-
else if ("object" === m) {
|
|
1983
|
-
if (Z[W] !== V) throw new q();
|
|
1984
|
-
if ("ObjectId" === Z._bsontype) s = Re(t, b, Z, s);
|
|
1985
|
-
else if ("Decimal128" === Z._bsontype) s = Ke(t, b, Z, s);
|
|
1986
|
-
else if ("Long" === Z._bsontype || "Timestamp" === Z._bsontype) s = Le(t, b, Z, s);
|
|
1987
|
-
else if ("Double" === Z._bsontype) s = Ue(t, b, Z, s);
|
|
1988
|
-
else if ("Code" === Z._bsontype) s = ze(t, b, Z, s, n, l, o, c, a);
|
|
1989
|
-
else if ("Binary" === Z._bsontype) s = xe(t, b, Z, s);
|
|
1990
|
-
else if ("BSONSymbol" === Z._bsontype) s = we(t, b, Z, s);
|
|
1991
|
-
else if ("DBRef" === Z._bsontype) s = He(t, b, Z, s, l, o, a);
|
|
1992
|
-
else if ("BSONRegExp" === Z._bsontype) s = Ye(t, b, Z, s);
|
|
1993
|
-
else if ("Int32" === Z._bsontype) s = Te(t, b, Z, s);
|
|
1994
|
-
else if ("MinKey" === Z._bsontype || "MaxKey" === Z._bsontype) s = Ie(t, b, Z, s);
|
|
1995
|
-
else if (void 0 !== Z._bsontype) throw new $(`Unrecognized or invalid _bsontype: ${String(Z._bsontype)}`);
|
|
1996
|
-
} else "function" === m && o && (s = Ne(t, b, Z, s));
|
|
1997
|
-
}
|
|
1998
|
-
} else {
|
|
1999
|
-
if ("function" == typeof e2?.toBSON && null != (e2 = e2.toBSON()) && "object" != typeof e2) throw new $("toBSON function did not return an object");
|
|
2000
|
-
for (const i2 of Object.keys(e2)) {
|
|
2001
|
-
let d2 = e2[i2];
|
|
2002
|
-
"function" == typeof d2?.toBSON && (d2 = d2.toBSON());
|
|
2003
|
-
const b = typeof d2;
|
|
2004
|
-
if ("string" == typeof i2 && !he.has(i2)) {
|
|
2005
|
-
if (null != i2.match(pe)) throw new $("key " + i2 + " must not contain null bytes");
|
|
2006
|
-
if (n) {
|
|
2007
|
-
if ("$" === i2[0]) throw new $("key " + i2 + " must not start with '$'");
|
|
2008
|
-
if (i2.includes(".")) throw new $("key " + i2 + " must not contain '.'");
|
|
2009
|
-
}
|
|
2010
|
-
}
|
|
2011
|
-
if (void 0 === d2) false === c && (s = Ve(t, i2, 0, s));
|
|
2012
|
-
else if (null === d2) s = Ve(t, i2, 0, s);
|
|
2013
|
-
else if ("string" === b) s = ye(t, i2, d2, s);
|
|
2014
|
-
else if ("number" === b) s = Ge(t, i2, d2, s);
|
|
2015
|
-
else if ("bigint" === b) s = Xe(t, i2, d2, s);
|
|
2016
|
-
else if ("boolean" === b) s = We(t, i2, d2, s);
|
|
2017
|
-
else if ("object" === b && null == d2._bsontype) s = d2 instanceof Date || G(d2) ? fe(t, i2, d2, s) : d2 instanceof Uint8Array || r(d2) ? Se(t, i2, d2, s) : d2 instanceof RegExp || h(d2) ? ge(t, i2, d2, s) : Je(t, i2, d2, s, n, l, o, c, a);
|
|
2018
|
-
else if ("object" === b) {
|
|
2019
|
-
if (d2[W] !== V) throw new q();
|
|
2020
|
-
if ("ObjectId" === d2._bsontype) s = Re(t, i2, d2, s);
|
|
2021
|
-
else if ("Decimal128" === d2._bsontype) s = Ke(t, i2, d2, s);
|
|
2022
|
-
else if ("Long" === d2._bsontype || "Timestamp" === d2._bsontype) s = Le(t, i2, d2, s);
|
|
2023
|
-
else if ("Double" === d2._bsontype) s = Ue(t, i2, d2, s);
|
|
2024
|
-
else if ("Code" === d2._bsontype) s = ze(t, i2, d2, s, n, l, o, c, a);
|
|
2025
|
-
else if ("Binary" === d2._bsontype) s = xe(t, i2, d2, s);
|
|
2026
|
-
else if ("BSONSymbol" === d2._bsontype) s = we(t, i2, d2, s);
|
|
2027
|
-
else if ("DBRef" === d2._bsontype) s = He(t, i2, d2, s, l, o, a);
|
|
2028
|
-
else if ("BSONRegExp" === d2._bsontype) s = Ye(t, i2, d2, s);
|
|
2029
|
-
else if ("Int32" === d2._bsontype) s = Te(t, i2, d2, s);
|
|
2030
|
-
else if ("MinKey" === d2._bsontype || "MaxKey" === d2._bsontype) s = Ie(t, i2, d2, s);
|
|
2031
|
-
else if (void 0 !== d2._bsontype) throw new $(`Unrecognized or invalid _bsontype: ${String(d2._bsontype)}`);
|
|
2032
|
-
} else "function" === b && o && (s = Ne(t, i2, d2, s));
|
|
2033
|
-
}
|
|
2034
|
-
}
|
|
2035
|
-
a.delete(e2), t[s++] = 0;
|
|
2036
|
-
const d = s - i;
|
|
2037
|
-
return i += Vt.setInt32LE(t, i, d), s;
|
|
2038
|
-
}
|
|
2039
|
-
var Be = { $oid: ie, $binary: Wt, $uuid: Wt, $symbol: ae, $numberInt: $t, $numberDecimal: Dt, $numberDouble: At, $numberLong: Ht, $minKey: te, $maxKey: qt, $regex: ce, $regularExpression: ce, $timestamp: de };
|
|
2040
|
-
function Ce(t, e2 = {}) {
|
|
2041
|
-
if ("number" == typeof t) {
|
|
2042
|
-
const n2 = t <= f && t >= g, i = t <= Y && t >= I;
|
|
2043
|
-
if (e2.relaxed || e2.legacy) return t;
|
|
2044
|
-
if (Number.isInteger(t) && !Object.is(t, -0)) {
|
|
2045
|
-
if (n2) return new $t(t);
|
|
2046
|
-
if (i) return e2.useBigInt64 ? BigInt(t) : Ht.fromNumber(t);
|
|
2047
|
-
}
|
|
2048
|
-
return new At(t);
|
|
2049
|
-
}
|
|
2050
|
-
if (null == t || "object" != typeof t) return t;
|
|
2051
|
-
if (t.$undefined) return null;
|
|
2052
|
-
const n = Object.keys(t).filter(((e3) => e3.startsWith("$") && null != t[e3]));
|
|
2053
|
-
for (let i = 0; i < n.length; i++) {
|
|
2054
|
-
const l = Be[n[i]];
|
|
2055
|
-
if (l) return l.fromExtendedJSON(t, e2);
|
|
2056
|
-
}
|
|
2057
|
-
if (null != t.$date) {
|
|
2058
|
-
const n2 = t.$date, i = /* @__PURE__ */ new Date();
|
|
2059
|
-
if (e2.legacy) if ("number" == typeof n2) i.setTime(n2);
|
|
2060
|
-
else if ("string" == typeof n2) i.setTime(Date.parse(n2));
|
|
2061
|
-
else {
|
|
2062
|
-
if ("bigint" != typeof n2) throw new tt("Unrecognized type for EJSON date: " + typeof n2);
|
|
2063
|
-
i.setTime(Number(n2));
|
|
2064
|
-
}
|
|
2065
|
-
else if ("string" == typeof n2) i.setTime(Date.parse(n2));
|
|
2066
|
-
else if (Ht.isLong(n2)) i.setTime(n2.toNumber());
|
|
2067
|
-
else if ("number" == typeof n2 && e2.relaxed) i.setTime(n2);
|
|
2068
|
-
else {
|
|
2069
|
-
if ("bigint" != typeof n2) throw new tt("Unrecognized type for EJSON date: " + typeof n2);
|
|
2070
|
-
i.setTime(Number(n2));
|
|
2071
|
-
}
|
|
2072
|
-
return i;
|
|
2073
|
-
}
|
|
2074
|
-
if (null != t.$code) {
|
|
2075
|
-
const e3 = Object.assign({}, t);
|
|
2076
|
-
return t.$scope && (e3.$scope = Ce(t.$scope)), Rt.fromExtendedJSON(t);
|
|
2077
|
-
}
|
|
2078
|
-
if (St(t) || t.$dbPointer) {
|
|
2079
|
-
const e3 = t.$ref ? t : t.$dbPointer;
|
|
2080
|
-
if (e3 instanceof Jt) return e3;
|
|
2081
|
-
const n2 = Object.keys(e3).filter(((t2) => t2.startsWith("$")));
|
|
2082
|
-
let i = true;
|
|
2083
|
-
if (n2.forEach(((t2) => {
|
|
2084
|
-
-1 === ["$ref", "$id", "$db"].indexOf(t2) && (i = false);
|
|
2085
|
-
})), i) return Jt.fromExtendedJSON(e3);
|
|
2086
|
-
}
|
|
2087
|
-
return t;
|
|
2088
|
-
}
|
|
2089
|
-
function ve(t) {
|
|
2090
|
-
const e2 = t.toISOString();
|
|
2091
|
-
return 0 !== t.getUTCMilliseconds() ? e2 : e2.slice(0, -5) + "Z";
|
|
2092
|
-
}
|
|
2093
|
-
function Me(t, e2) {
|
|
2094
|
-
if (t instanceof Map || y(t)) {
|
|
2095
|
-
const n = /* @__PURE__ */ Object.create(null);
|
|
2096
|
-
for (const [e3, i] of t) {
|
|
2097
|
-
if ("string" != typeof e3) throw new $("Can only serialize maps with string keys");
|
|
2098
|
-
n[e3] = i;
|
|
2099
|
-
}
|
|
2100
|
-
return Me(n, e2);
|
|
2101
|
-
}
|
|
2102
|
-
if (("object" == typeof t || "function" == typeof t) && null !== t) {
|
|
2103
|
-
const n = e2.seenObjects.findIndex(((e3) => e3.obj === t));
|
|
2104
|
-
if (-1 !== n) {
|
|
2105
|
-
const t2 = e2.seenObjects.map(((t3) => t3.propertyName)), i = t2.slice(0, n).map(((t3) => `${t3} -> `)).join(""), l = t2[n], o = " -> " + t2.slice(n + 1, t2.length - 1).map(((t3) => `${t3} -> `)).join(""), c = t2[t2.length - 1], a = " ".repeat(i.length + l.length / 2), s = "-".repeat(o.length + (l.length + c.length) / 2 - 1);
|
|
2106
|
-
throw new $(`Converting circular structure to EJSON:
|
|
2107
|
-
${i}${l}${o}${c}
|
|
2108
|
-
${a}\\${s}/`);
|
|
2109
|
-
}
|
|
2110
|
-
e2.seenObjects[e2.seenObjects.length - 1].obj = t;
|
|
2111
|
-
}
|
|
2112
|
-
if (Array.isArray(t)) return (function(t2, e3) {
|
|
2113
|
-
return t2.map(((t3, n) => {
|
|
2114
|
-
e3.seenObjects.push({ propertyName: `index ${n}`, obj: null });
|
|
2115
|
-
try {
|
|
2116
|
-
return Me(t3, e3);
|
|
2117
|
-
} finally {
|
|
2118
|
-
e3.seenObjects.pop();
|
|
2119
|
-
}
|
|
2120
|
-
}));
|
|
2121
|
-
})(t, e2);
|
|
2122
|
-
if (void 0 === t) return e2.ignoreUndefined ? void 0 : null;
|
|
2123
|
-
if (t instanceof Date || G(t)) {
|
|
2124
|
-
const n = t.getTime(), i = n > -1 && n < 2534023188e5;
|
|
2125
|
-
return e2.legacy ? e2.relaxed && i ? { $date: t.getTime() } : { $date: ve(t) } : e2.relaxed && i ? { $date: ve(t) } : { $date: { $numberLong: t.getTime().toString() } };
|
|
2126
|
-
}
|
|
2127
|
-
if (!("number" != typeof t || e2.relaxed && isFinite(t))) {
|
|
2128
|
-
if (Number.isInteger(t) && !Object.is(t, -0)) {
|
|
2129
|
-
if (t >= g && t <= f) return { $numberInt: t.toString() };
|
|
2130
|
-
if (t >= I && t <= Y) return { $numberLong: t.toString() };
|
|
2131
|
-
}
|
|
2132
|
-
return { $numberDouble: Object.is(t, -0) ? "-0.0" : t.toString() };
|
|
2133
|
-
}
|
|
2134
|
-
if ("bigint" == typeof t) return e2.relaxed ? Number(BigInt.asIntN(64, t)) : { $numberLong: BigInt.asIntN(64, t).toString() };
|
|
2135
|
-
if (t instanceof RegExp || h(t)) {
|
|
2136
|
-
let n = t.flags;
|
|
2137
|
-
if (void 0 === n) {
|
|
2138
|
-
const e3 = t.toString().match(/[gimuy]*$/);
|
|
2139
|
-
e3 && (n = e3[0]);
|
|
2140
|
-
}
|
|
2141
|
-
return new ce(t.source, n).toExtendedJSON(e2);
|
|
2142
|
-
}
|
|
2143
|
-
return null != t && "object" == typeof t ? (function(t2, e3) {
|
|
2144
|
-
if (null == t2 || "object" != typeof t2) throw new $("not an object instance");
|
|
2145
|
-
const n = t2._bsontype;
|
|
2146
|
-
if (void 0 === n) {
|
|
2147
|
-
const n2 = {};
|
|
2148
|
-
for (const i of Object.keys(t2)) {
|
|
2149
|
-
e3.seenObjects.push({ propertyName: i, obj: null });
|
|
2150
|
-
try {
|
|
2151
|
-
const l = Me(t2[i], e3);
|
|
2152
|
-
"__proto__" === i ? Object.defineProperty(n2, i, { value: l, writable: true, enumerable: true, configurable: true }) : n2[i] = l;
|
|
2153
|
-
} finally {
|
|
2154
|
-
e3.seenObjects.pop();
|
|
2155
|
-
}
|
|
2156
|
-
}
|
|
2157
|
-
return n2;
|
|
2158
|
-
}
|
|
2159
|
-
if (null != t2 && "object" == typeof t2 && "string" == typeof t2._bsontype && t2[W] !== V) throw new q();
|
|
2160
|
-
if ((function(t3) {
|
|
2161
|
-
return null != t3 && "object" == typeof t3 && "_bsontype" in t3 && "string" == typeof t3._bsontype;
|
|
2162
|
-
})(t2)) {
|
|
2163
|
-
let i = t2;
|
|
2164
|
-
if ("function" != typeof i.toExtendedJSON) {
|
|
2165
|
-
const e4 = je[t2._bsontype];
|
|
2166
|
-
if (!e4) throw new $("Unrecognized or invalid _bsontype: " + t2._bsontype);
|
|
2167
|
-
i = e4(i);
|
|
2168
|
-
}
|
|
2169
|
-
return "Code" === n && i.scope ? i = new Rt(i.code, Me(i.scope, e3)) : "DBRef" === n && i.oid && (i = new Jt(Me(i.collection, e3), Me(i.oid, e3), Me(i.db, e3), Me(i.fields, e3))), i.toExtendedJSON(e3);
|
|
2170
|
-
}
|
|
2171
|
-
throw new $("_bsontype must be a string, but was: " + typeof n);
|
|
2172
|
-
})(t, e2) : t;
|
|
2173
|
-
}
|
|
2174
|
-
var je = { Binary: (t) => new Wt(t.value(), t.sub_type), Code: (t) => new Rt(t.code, t.scope), DBRef: (t) => new Jt(t.collection || t.namespace, t.oid, t.db, t.fields), Decimal128: (t) => new Dt(t.bytes), Double: (t) => new At(t.value), Int32: (t) => new $t(t.value), Long: (t) => Ht.fromBits(null != t.low ? t.low : t.low_, null != t.low ? t.high : t.high_, null != t.low ? t.unsigned : t.unsigned_), MaxKey: () => new qt(), MinKey: () => new te(), ObjectId: (t) => new ie(t), BSONRegExp: (t) => new ce(t.pattern, t.options), BSONSymbol: (t) => new ae(t.value), Timestamp: (t) => de.fromBits(t.low, t.high) };
|
|
2175
|
-
function Pe(t, e2) {
|
|
2176
|
-
const n = { useBigInt64: e2?.useBigInt64 ?? false, relaxed: e2?.relaxed ?? true, legacy: e2?.legacy ?? false };
|
|
2177
|
-
return JSON.parse(t, ((t2, e3) => {
|
|
2178
|
-
if (-1 !== t2.indexOf("\0")) throw new $(`BSON Document field names cannot contain null bytes, found: ${JSON.stringify(t2)}`);
|
|
2179
|
-
return Ce(e3, n);
|
|
2180
|
-
}));
|
|
2181
|
-
}
|
|
2182
|
-
function Fe(t, e2, n, i) {
|
|
2183
|
-
null != n && "object" == typeof n && (i = n, n = 0), null == e2 || "object" != typeof e2 || Array.isArray(e2) || (i = e2, e2 = void 0, n = 0);
|
|
2184
|
-
const l = Me(t, Object.assign({ relaxed: true, legacy: false }, i, { seenObjects: [{ propertyName: "(root)", obj: null }] }));
|
|
2185
|
-
return JSON.stringify(l, e2, n);
|
|
2186
|
-
}
|
|
2187
|
-
var Qe = /* @__PURE__ */ Object.create(null);
|
|
2188
|
-
Qe.parse = Pe, Qe.stringify = Fe, Qe.serialize = function(t, e2) {
|
|
2189
|
-
return e2 = e2 || {}, JSON.parse(Fe(t, e2));
|
|
2190
|
-
}, Qe.deserialize = function(t, e2) {
|
|
2191
|
-
return e2 = e2 || {}, Pe(JSON.stringify(t), e2);
|
|
2192
|
-
}, Object.freeze(Qe);
|
|
2193
|
-
var Oe = 1;
|
|
2194
|
-
var Ee = 2;
|
|
2195
|
-
var _e = 3;
|
|
2196
|
-
var De = 4;
|
|
2197
|
-
var Ae = 5;
|
|
2198
|
-
var $e = 6;
|
|
2199
|
-
var qe = 7;
|
|
2200
|
-
var tn = 8;
|
|
2201
|
-
var en = 9;
|
|
2202
|
-
var nn = 10;
|
|
2203
|
-
var ln = 11;
|
|
2204
|
-
var on = 12;
|
|
2205
|
-
var cn = 13;
|
|
2206
|
-
var an = 14;
|
|
2207
|
-
var sn = 15;
|
|
2208
|
-
var dn = 16;
|
|
2209
|
-
var bn = 17;
|
|
2210
|
-
var Zn = 18;
|
|
2211
|
-
var mn = 19;
|
|
2212
|
-
var un = 255;
|
|
2213
|
-
var rn = 127;
|
|
2214
|
-
function pn(t, e2) {
|
|
2215
|
-
try {
|
|
2216
|
-
return Vt.getNonnegativeInt32LE(t, e2);
|
|
2217
|
-
} catch (t2) {
|
|
2218
|
-
throw new et("BSON size cannot be negative", e2, { cause: t2 });
|
|
2219
|
-
}
|
|
2220
|
-
}
|
|
2221
|
-
function hn(t, e2) {
|
|
2222
|
-
let n = e2;
|
|
2223
|
-
for (; 0 !== t[n]; n++) ;
|
|
2224
|
-
if (n === t.length - 1) throw new et("Null terminator not found", e2);
|
|
2225
|
-
return n;
|
|
2226
|
-
}
|
|
2227
|
-
var yn = /* @__PURE__ */ Object.create(null);
|
|
2228
|
-
yn.parseToElements = function(t, e2 = 0) {
|
|
2229
|
-
if (e2 ??= 0, t.length < 5) throw new et(`Input must be at least 5 bytes, got ${t.length} bytes`, e2);
|
|
2230
|
-
const n = pn(t, e2);
|
|
2231
|
-
if (n > t.length - e2) throw new et(`Parsed documentSize (${n} bytes) does not match input length (${t.length} bytes)`, e2);
|
|
2232
|
-
if (0 !== t[e2 + n - 1]) throw new et("BSON documents must end in 0x00", e2 + n);
|
|
2233
|
-
const i = [];
|
|
2234
|
-
let l = e2 + 4;
|
|
2235
|
-
for (; l <= n + e2; ) {
|
|
2236
|
-
const o = t[l];
|
|
2237
|
-
if (l += 1, 0 === o) {
|
|
2238
|
-
if (l - e2 !== n) throw new et("Invalid 0x00 type byte", l);
|
|
2239
|
-
break;
|
|
2240
|
-
}
|
|
2241
|
-
const c = l, a = hn(t, l) - c;
|
|
2242
|
-
let s;
|
|
2243
|
-
if (l += a + 1, o === Oe || o === Zn || o === en || o === bn) s = 8;
|
|
2244
|
-
else if (o === dn) s = 4;
|
|
2245
|
-
else if (o === qe) s = 12;
|
|
2246
|
-
else if (o === mn) s = 16;
|
|
2247
|
-
else if (o === tn) s = 1;
|
|
2248
|
-
else if (o === nn || o === $e || o === rn || o === un) s = 0;
|
|
2249
|
-
else if (o === ln) s = hn(t, hn(t, l) + 1) + 1 - l;
|
|
2250
|
-
else if (o === _e || o === De || o === sn) s = pn(t, l);
|
|
2251
|
-
else {
|
|
2252
|
-
if (o !== Ee && o !== Ae && o !== on && o !== cn && o !== an) throw new et(`Invalid 0x${o.toString(16).padStart(2, "0")} type byte`, l);
|
|
2253
|
-
s = pn(t, l) + 4, o === Ae && (s += 1), o === on && (s += 12);
|
|
2254
|
-
}
|
|
2255
|
-
if (s > n) throw new et("value reports length larger than document", l);
|
|
2256
|
-
i.push([o, c, a, l, s]), l += s;
|
|
2257
|
-
}
|
|
2258
|
-
return i;
|
|
2259
|
-
}, yn.ByteUtils = rt, yn.NumberUtils = Vt, Object.freeze(yn);
|
|
2260
|
-
var Gn = 17825792;
|
|
2261
|
-
var Xn = rt.allocate(Gn);
|
|
2262
|
-
var Vn = Object.freeze({ __proto__: null, BSONError: $, BSONOffsetError: et, BSONRegExp: ce, BSONRuntimeError: tt, BSONSymbol: ae, BSONType: A, BSONValue: ht, BSONVersionError: q, Binary: Wt, ByteUtils: rt, Code: Rt, DBRef: Jt, Decimal128: Dt, Double: At, EJSON: Qe, Int32: $t, Long: Ht, MaxKey: qt, MinKey: te, NumberUtils: Vt, ObjectId: ie, Timestamp: de, UUID: It, bsonType: pt, calculateObjectSize: function(t, e2 = {}) {
|
|
2263
|
-
return le(t, "boolean" == typeof (e2 = e2 || {}).serializeFunctions && e2.serializeFunctions, "boolean" != typeof e2.ignoreUndefined || e2.ignoreUndefined);
|
|
2264
|
-
}, deserialize: function(t, e2 = {}) {
|
|
2265
|
-
return me(rt.toLocalBufferType(t), e2);
|
|
2266
|
-
}, deserializeStream: function(t, e2, n, i, l, o) {
|
|
2267
|
-
const c = Object.assign({ allowObjectSmallerThanBufferSize: true, index: 0 }, o), a = rt.toLocalBufferType(t);
|
|
2268
|
-
let s = e2;
|
|
2269
|
-
for (let t2 = 0; t2 < n; t2++) {
|
|
2270
|
-
const e3 = Vt.getInt32LE(a, s);
|
|
2271
|
-
c.index = s, i[l + t2] = me(a, c), s += e3;
|
|
2272
|
-
}
|
|
2273
|
-
return s;
|
|
2274
|
-
}, onDemand: yn, serialize: function(t, e2 = {}) {
|
|
2275
|
-
const n = "boolean" == typeof e2.checkKeys && e2.checkKeys, i = "boolean" == typeof e2.serializeFunctions && e2.serializeFunctions, l = "boolean" != typeof e2.ignoreUndefined || e2.ignoreUndefined, o = "number" == typeof e2.minInternalBufferSize ? e2.minInternalBufferSize : Gn;
|
|
2276
|
-
Xn.length < o && (Xn = rt.allocate(o));
|
|
2277
|
-
const c = ke(Xn, t, n, 0, 0, i, l, null), a = rt.allocateUnsafe(c);
|
|
2278
|
-
return a.set(Xn.subarray(0, c), 0), a;
|
|
2279
|
-
}, serializeWithBufferAndIndex: function(t, e2, n = {}) {
|
|
2280
|
-
const i = "boolean" == typeof n.checkKeys && n.checkKeys, l = "boolean" == typeof n.serializeFunctions && n.serializeFunctions, o = "boolean" != typeof n.ignoreUndefined || n.ignoreUndefined, c = "number" == typeof n.index ? n.index : 0, a = ke(Xn, t, i, 0, 0, l, o, null);
|
|
2281
|
-
return e2.set(Xn.subarray(0, a), c), c + a - 1;
|
|
2282
|
-
}, setInternalBufferSize: function(t) {
|
|
2283
|
-
Xn.length < t && (Xn = rt.allocate(t));
|
|
2284
|
-
} });
|
|
2285
|
-
function Wn(t) {
|
|
2286
|
-
return !!t && "object" == typeof t && "buffer" in t && t.buffer instanceof ArrayBuffer && "number" == typeof t.byteOffset && "number" == typeof t.byteLength;
|
|
2287
|
-
}
|
|
2288
|
-
var In = class {
|
|
2289
|
-
constructor() {
|
|
2290
|
-
}
|
|
2291
|
-
static urlConstructFrom(t) {
|
|
2292
|
-
const n = "/ws/modeling/commands" + e({ video_res_width: t.video_res_width, video_res_height: t.video_res_height, fps: t.fps, unlocked_framerate: t.unlocked_framerate, post_effect: t.post_effect, webrtc: t.webrtc, pool: t.pool, show_grid: t.show_grid, replay: t.replay, api_call_id: t.api_call_id, order_independent_transparency: t.order_independent_transparency, pr: t.pr }), i = ((t.client?.baseUrl || "https://api.zoo.dev") + n).replace(/^http/, "ws");
|
|
2293
|
-
return new URL(i);
|
|
2294
|
-
}
|
|
2295
|
-
static authenticate(t, e2) {
|
|
2296
|
-
const n = t.client && t.client.token || "";
|
|
2297
|
-
if (n) try {
|
|
2298
|
-
const t2 = { type: "headers", headers: { Authorization: `Bearer ${n}` } };
|
|
2299
|
-
e2.send(JSON.stringify(t2));
|
|
2300
|
-
} catch {
|
|
2301
|
-
}
|
|
2302
|
-
}
|
|
2303
|
-
static toBSON(t) {
|
|
2304
|
-
return Vn.serialize(t);
|
|
2305
|
-
}
|
|
2306
|
-
static parseMessage(t) {
|
|
2307
|
-
const e2 = t?.data;
|
|
2308
|
-
if ("string" == typeof e2) return JSON.parse(e2);
|
|
2309
|
-
if ("undefined" != typeof Buffer && Buffer.isBuffer?.(e2)) {
|
|
2310
|
-
const t2 = e2;
|
|
2311
|
-
try {
|
|
2312
|
-
return JSON.parse(t2.toString("utf8"));
|
|
2313
|
-
} catch {
|
|
2314
|
-
}
|
|
2315
|
-
return Vn.deserialize(t2);
|
|
2316
|
-
}
|
|
2317
|
-
if (e2 instanceof ArrayBuffer) {
|
|
2318
|
-
const t2 = new Uint8Array(e2);
|
|
2319
|
-
try {
|
|
2320
|
-
const e3 = new TextDecoder().decode(t2);
|
|
2321
|
-
return JSON.parse(e3);
|
|
2322
|
-
} catch {
|
|
2323
|
-
}
|
|
2324
|
-
return Vn.deserialize(t2);
|
|
2325
|
-
}
|
|
2326
|
-
if (Wn(e2)) {
|
|
2327
|
-
const t2 = new Uint8Array(e2.buffer, e2.byteOffset, e2.byteLength);
|
|
2328
|
-
try {
|
|
2329
|
-
const e3 = new TextDecoder().decode(t2);
|
|
2330
|
-
return JSON.parse(e3);
|
|
2331
|
-
} catch {
|
|
2332
|
-
}
|
|
2333
|
-
return Vn.deserialize(t2);
|
|
2334
|
-
}
|
|
2335
|
-
return e2;
|
|
2336
|
-
}
|
|
2337
|
-
};
|
|
2338
|
-
var Cn = null;
|
|
2339
|
-
try {
|
|
2340
|
-
vn = "undefined" != typeof module && "function" == typeof module.require && module.require("worker_threads") || "function" == typeof __non_webpack_require__ && __non_webpack_require__("worker_threads") || "function" == typeof __require && __require("worker_threads");
|
|
2341
|
-
Cn = vn.Worker;
|
|
2342
|
-
} catch (t) {
|
|
2343
|
-
}
|
|
2344
|
-
var vn;
|
|
2345
|
-
function Mn(t, e2, n) {
|
|
2346
|
-
var i = void 0 === e2 ? null : e2, l = (function(t2, e3) {
|
|
2347
|
-
return Buffer.from(t2, "base64").toString(e3 ? "utf16" : "utf8");
|
|
2348
|
-
})(t, void 0 !== n && n), o = l.indexOf("\n", 10) + 1, c = l.substring(o) + (i ? "//# sourceMappingURL=" + i : "");
|
|
2349
|
-
return function(t2) {
|
|
2350
|
-
return new Cn(c, Object.assign({}, t2, { eval: true }));
|
|
2351
|
-
};
|
|
2352
|
-
}
|
|
2353
|
-
function jn(t, e2, n) {
|
|
2354
|
-
var i = void 0 === e2 ? null : e2, l = (function(t2, e3) {
|
|
2355
|
-
var n2 = atob(t2);
|
|
2356
|
-
if (e3) {
|
|
2357
|
-
for (var i2 = new Uint8Array(n2.length), l2 = 0, o2 = n2.length; l2 < o2; ++l2) i2[l2] = n2.charCodeAt(l2);
|
|
2358
|
-
return new TextDecoder("utf-16le").decode(new Uint16Array(i2.buffer));
|
|
2359
|
-
}
|
|
2360
|
-
return n2;
|
|
2361
|
-
})(t, void 0 !== n && n), o = l.indexOf("\n", 10) + 1, c = l.substring(o) + (i ? "//# sourceMappingURL=" + i : ""), a = new Blob([c], { type: "application/javascript" });
|
|
2362
|
-
return URL.createObjectURL(a);
|
|
2363
|
-
}
|
|
2364
|
-
var Pn = "[object process]" === Object.prototype.toString.call("undefined" != typeof process ? process : 0);
|
|
2365
|
-
function Fn(t, e2, n) {
|
|
2366
|
-
return Pn ? Mn(t, e2, n) : /* @__PURE__ */ (function(t2, e3, n2) {
|
|
2367
|
-
var i;
|
|
2368
|
-
return function(l) {
|
|
2369
|
-
return i = i || jn(t2, e3, n2), new Worker(i, l);
|
|
2370
|
-
};
|
|
2371
|
-
})(t, e2, n);
|
|
2372
|
-
}
|
|
2373
|
-
var Qn = Fn("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwohZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7Y29uc3QgZT1uZXcgVGV4dEVuY29kZXI7ZnVuY3Rpb24gdCh0LG4scil7dC5sZW5ndGg+NTA/ZnVuY3Rpb24odCxuLHIpe2UuZW5jb2RlSW50byh0LG4uc3ViYXJyYXkocikpfSh0LG4scik6ZnVuY3Rpb24oZSx0LG4pe2NvbnN0IHI9ZS5sZW5ndGg7bGV0IGk9bixvPTA7Zm9yKDtvPHI7KXtsZXQgbj1lLmNoYXJDb2RlQXQobysrKTtpZig0Mjk0OTY3MTY4Jm4pe2lmKDQyOTQ5NjUyNDgmbil7aWYobj49NTUyOTYmJm48PTU2MzE5JiZvPHIpe2NvbnN0IHQ9ZS5jaGFyQ29kZUF0KG8pOzU2MzIwPT0oNjQ1MTImdCkmJigrK28sbj0oKDEwMjMmbik8PDEwKSsoMTAyMyZ0KSs2NTUzNil9NDI5NDkwMTc2MCZuPyh0W2krK109bj4+MTgmN3wyNDAsdFtpKytdPW4+PjEyJjYzfDEyOCx0W2krK109bj4+NiY2M3wxMjgpOih0W2krK109bj4+MTImMTV8MjI0LHRbaSsrXT1uPj42JjYzfDEyOCl9ZWxzZSB0W2krK109bj4+NiYzMXwxOTI7dFtpKytdPTYzJm58MTI4fWVsc2UgdFtpKytdPW59fSh0LG4scil9bmV3IFRleHREZWNvZGVyO2NsYXNzIG57dHlwZTtkYXRhO2NvbnN0cnVjdG9yKGUsdCl7dGhpcy50eXBlPWUsdGhpcy5kYXRhPXR9fWNsYXNzIHIgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTtjb25zdCB0PU9iamVjdC5jcmVhdGUoci5wcm90b3R5cGUpO09iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJuYW1lIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsdmFsdWU6ci5uYW1lfSl9fWZ1bmN0aW9uIGkoZSx0LG4pe2NvbnN0IHI9TWF0aC5mbG9vcihuLzQyOTQ5NjcyOTYpLGk9bjtlLnNldFVpbnQzMih0LHIpLGUuc2V0VWludDMyKHQrNCxpKX1jb25zdCBvPTQyOTQ5NjcyOTUscz0xNzE3OTg2OTE4Mztjb25zdCBhPXt0eXBlOi0xLGVuY29kZTpmdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgRGF0ZSl7cmV0dXJuIGZ1bmN0aW9uKHtzZWM6ZSxuc2VjOnR9KXtpZihlPj0wJiZ0Pj0wJiZlPD1zKXtpZigwPT09dCYmZTw9byl7Y29uc3QgdD1uZXcgVWludDhBcnJheSg0KTtyZXR1cm4gbmV3IERhdGFWaWV3KHQuYnVmZmVyKS5zZXRVaW50MzIoMCxlKSx0fXtjb25zdCBuPWUvNDI5NDk2NzI5NixyPTQyOTQ5NjcyOTUmZSxpPW5ldyBVaW50OEFycmF5KDgpLG89bmV3IERhdGFWaWV3KGkuYnVmZmVyKTtyZXR1cm4gby5zZXRVaW50MzIoMCx0PDwyfDMmbiksby5zZXRVaW50MzIoNCxyKSxpfX17Y29uc3Qgbj1uZXcgVWludDhBcnJheSgxMikscj1uZXcgRGF0YVZpZXcobi5idWZmZXIpO3JldHVybiByLnNldFVpbnQzMigwLHQpLGkociw0LGUpLG59fShmdW5jdGlvbihlKXtjb25zdCB0PWUuZ2V0VGltZSgpLG49TWF0aC5mbG9vcih0LzFlMykscj0xZTYqKHQtMWUzKm4pLGk9TWF0aC5mbG9vcihyLzFlOSk7cmV0dXJue3NlYzpuK2ksbnNlYzpyLTFlOSppfX0oZSkpfXJldHVybiBudWxsfSxkZWNvZGU6ZnVuY3Rpb24oZSl7Y29uc3QgdD1mdW5jdGlvbihlKXtjb25zdCB0PW5ldyBEYXRhVmlldyhlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKTtzd2l0Y2goZS5ieXRlTGVuZ3RoKXtjYXNlIDQ6cmV0dXJue3NlYzp0LmdldFVpbnQzMigwKSxuc2VjOjB9O2Nhc2UgODp7Y29uc3QgZT10LmdldFVpbnQzMigwKTtyZXR1cm57c2VjOjQyOTQ5NjcyOTYqKDMmZSkrdC5nZXRVaW50MzIoNCksbnNlYzplPj4+Mn19Y2FzZSAxMjp7Y29uc3QgZT1mdW5jdGlvbihlLHQpe3JldHVybiA0Mjk0OTY3Mjk2KmUuZ2V0SW50MzIodCkrZS5nZXRVaW50MzIodCs0KX0odCw0KTtyZXR1cm57c2VjOmUsbnNlYzp0LmdldFVpbnQzMigwKX19ZGVmYXVsdDp0aHJvdyBuZXcgcihgVW5yZWNvZ25pemVkIGRhdGEgc2l6ZSBmb3IgdGltZXN0YW1wIChleHBlY3RlZCA0LCA4LCBvciAxMik6ICR7ZS5sZW5ndGh9YCl9fShlKTtyZXR1cm4gbmV3IERhdGUoMWUzKnQuc2VjK3QubnNlYy8xZTYpfX07Y2xhc3MgY3tzdGF0aWMgZGVmYXVsdENvZGVjPW5ldyBjO19fYnJhbmQ7YnVpbHRJbkVuY29kZXJzPVtdO2J1aWx0SW5EZWNvZGVycz1bXTtlbmNvZGVycz1bXTtkZWNvZGVycz1bXTtjb25zdHJ1Y3Rvcigpe3RoaXMucmVnaXN0ZXIoYSl9cmVnaXN0ZXIoe3R5cGU6ZSxlbmNvZGU6dCxkZWNvZGU6bn0pe2lmKGU+PTApdGhpcy5lbmNvZGVyc1tlXT10LHRoaXMuZGVjb2RlcnNbZV09bjtlbHNle2NvbnN0IHI9LTEtZTt0aGlzLmJ1aWx0SW5FbmNvZGVyc1tyXT10LHRoaXMuYnVpbHRJbkRlY29kZXJzW3JdPW59fXRyeVRvRW5jb2RlKGUsdCl7Zm9yKGxldCByPTA7cjx0aGlzLmJ1aWx0SW5FbmNvZGVycy5sZW5ndGg7cisrKXtjb25zdCBpPXRoaXMuYnVpbHRJbkVuY29kZXJzW3JdO2lmKG51bGwhPWkpe2NvbnN0IG89aShlLHQpO2lmKG51bGwhPW8pe3JldHVybiBuZXcgbigtMS1yLG8pfX19Zm9yKGxldCByPTA7cjx0aGlzLmVuY29kZXJzLmxlbmd0aDtyKyspe2NvbnN0IGk9dGhpcy5lbmNvZGVyc1tyXTtpZihudWxsIT1pKXtjb25zdCBvPWkoZSx0KTtpZihudWxsIT1vKXtyZXR1cm4gbmV3IG4ocixvKX19fXJldHVybiBlIGluc3RhbmNlb2Ygbj9lOm51bGx9ZGVjb2RlKGUsdCxyKXtjb25zdCBpPXQ8MD90aGlzLmJ1aWx0SW5EZWNvZGVyc1stMS10XTp0aGlzLmRlY29kZXJzW3RdO3JldHVybiBpP2koZSx0LHIpOm5ldyBuKHQsZSl9fWZ1bmN0aW9uIGYoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBVaW50OEFycmF5P2U6QXJyYXlCdWZmZXIuaXNWaWV3KGUpP25ldyBVaW50OEFycmF5KGUuYnVmZmVyLGUuYnl0ZU9mZnNldCxlLmJ5dGVMZW5ndGgpOmZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fCJ1bmRlZmluZWQiIT10eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXImJmUgaW5zdGFuY2VvZiBTaGFyZWRBcnJheUJ1ZmZlcn0oZSk/bmV3IFVpbnQ4QXJyYXkoZSk6VWludDhBcnJheS5mcm9tKGUpfWNsYXNzIGx7ZXh0ZW5zaW9uQ29kZWM7Y29udGV4dDt1c2VCaWdJbnQ2NDttYXhEZXB0aDtpbml0aWFsQnVmZmVyU2l6ZTtzb3J0S2V5cztmb3JjZUZsb2F0MzI7aWdub3JlVW5kZWZpbmVkO2ZvcmNlSW50ZWdlclRvRmxvYXQ7cG9zO3ZpZXc7Ynl0ZXM7ZW50ZXJlZD0hMTtjb25zdHJ1Y3RvcihlKXt0aGlzLmV4dGVuc2lvbkNvZGVjPWU/LmV4dGVuc2lvbkNvZGVjPz9jLmRlZmF1bHRDb2RlYyx0aGlzLmNvbnRleHQ9ZT8uY29udGV4dCx0aGlzLnVzZUJpZ0ludDY0PWU/LnVzZUJpZ0ludDY0Pz8hMSx0aGlzLm1heERlcHRoPWU/Lm1heERlcHRoPz8xMDAsdGhpcy5pbml0aWFsQnVmZmVyU2l6ZT1lPy5pbml0aWFsQnVmZmVyU2l6ZT8/MjA0OCx0aGlzLnNvcnRLZXlzPWU/LnNvcnRLZXlzPz8hMSx0aGlzLmZvcmNlRmxvYXQzMj1lPy5mb3JjZUZsb2F0MzI/PyExLHRoaXMuaWdub3JlVW5kZWZpbmVkPWU/Lmlnbm9yZVVuZGVmaW5lZD8/ITEsdGhpcy5mb3JjZUludGVnZXJUb0Zsb2F0PWU/LmZvcmNlSW50ZWdlclRvRmxvYXQ/PyExLHRoaXMucG9zPTAsdGhpcy52aWV3PW5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIodGhpcy5pbml0aWFsQnVmZmVyU2l6ZSkpLHRoaXMuYnl0ZXM9bmV3IFVpbnQ4QXJyYXkodGhpcy52aWV3LmJ1ZmZlcil9Y2xvbmUoKXtyZXR1cm4gbmV3IGwoe2V4dGVuc2lvbkNvZGVjOnRoaXMuZXh0ZW5zaW9uQ29kZWMsY29udGV4dDp0aGlzLmNvbnRleHQsdXNlQmlnSW50NjQ6dGhpcy51c2VCaWdJbnQ2NCxtYXhEZXB0aDp0aGlzLm1heERlcHRoLGluaXRpYWxCdWZmZXJTaXplOnRoaXMuaW5pdGlhbEJ1ZmZlclNpemUsc29ydEtleXM6dGhpcy5zb3J0S2V5cyxmb3JjZUZsb2F0MzI6dGhpcy5mb3JjZUZsb2F0MzIsaWdub3JlVW5kZWZpbmVkOnRoaXMuaWdub3JlVW5kZWZpbmVkLGZvcmNlSW50ZWdlclRvRmxvYXQ6dGhpcy5mb3JjZUludGVnZXJUb0Zsb2F0fSl9cmVpbml0aWFsaXplU3RhdGUoKXt0aGlzLnBvcz0wfWVuY29kZVNoYXJlZFJlZihlKXtpZih0aGlzLmVudGVyZWQpe3JldHVybiB0aGlzLmNsb25lKCkuZW5jb2RlU2hhcmVkUmVmKGUpfXRyeXtyZXR1cm4gdGhpcy5lbnRlcmVkPSEwLHRoaXMucmVpbml0aWFsaXplU3RhdGUoKSx0aGlzLmRvRW5jb2RlKGUsMSksdGhpcy5ieXRlcy5zdWJhcnJheSgwLHRoaXMucG9zKX1maW5hbGx5e3RoaXMuZW50ZXJlZD0hMX19ZW5jb2RlKGUpe2lmKHRoaXMuZW50ZXJlZCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5lbmNvZGUoZSl9dHJ5e3JldHVybiB0aGlzLmVudGVyZWQ9ITAsdGhpcy5yZWluaXRpYWxpemVTdGF0ZSgpLHRoaXMuZG9FbmNvZGUoZSwxKSx0aGlzLmJ5dGVzLnNsaWNlKDAsdGhpcy5wb3MpfWZpbmFsbHl7dGhpcy5lbnRlcmVkPSExfX1kb0VuY29kZShlLHQpe2lmKHQ+dGhpcy5tYXhEZXB0aCl0aHJvdyBuZXcgRXJyb3IoYFRvbyBkZWVwIG9iamVjdHMgaW4gZGVwdGggJHt0fWApO251bGw9PWU/dGhpcy5lbmNvZGVOaWwoKToiYm9vbGVhbiI9PXR5cGVvZiBlP3RoaXMuZW5jb2RlQm9vbGVhbihlKToibnVtYmVyIj09dHlwZW9mIGU/dGhpcy5mb3JjZUludGVnZXJUb0Zsb2F0P3RoaXMuZW5jb2RlTnVtYmVyQXNGbG9hdChlKTp0aGlzLmVuY29kZU51bWJlcihlKToic3RyaW5nIj09dHlwZW9mIGU/dGhpcy5lbmNvZGVTdHJpbmcoZSk6dGhpcy51c2VCaWdJbnQ2NCYmImJpZ2ludCI9PXR5cGVvZiBlP3RoaXMuZW5jb2RlQmlnSW50NjQoZSk6dGhpcy5lbmNvZGVPYmplY3QoZSx0KX1lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZShlKXtjb25zdCB0PXRoaXMucG9zK2U7dGhpcy52aWV3LmJ5dGVMZW5ndGg8dCYmdGhpcy5yZXNpemVCdWZmZXIoMip0KX1yZXNpemVCdWZmZXIoZSl7Y29uc3QgdD1uZXcgQXJyYXlCdWZmZXIoZSksbj1uZXcgVWludDhBcnJheSh0KSxyPW5ldyBEYXRhVmlldyh0KTtuLnNldCh0aGlzLmJ5dGVzKSx0aGlzLnZpZXc9cix0aGlzLmJ5dGVzPW59ZW5jb2RlTmlsKCl7dGhpcy53cml0ZVU4KDE5Mil9ZW5jb2RlQm9vbGVhbihlKXshMT09PWU/dGhpcy53cml0ZVU4KDE5NCk6dGhpcy53cml0ZVU4KDE5NSl9ZW5jb2RlTnVtYmVyKGUpeyF0aGlzLmZvcmNlSW50ZWdlclRvRmxvYXQmJk51bWJlci5pc1NhZmVJbnRlZ2VyKGUpP2U+PTA/ZTwxMjg/dGhpcy53cml0ZVU4KGUpOmU8MjU2Pyh0aGlzLndyaXRlVTgoMjA0KSx0aGlzLndyaXRlVTgoZSkpOmU8NjU1MzY/KHRoaXMud3JpdGVVOCgyMDUpLHRoaXMud3JpdGVVMTYoZSkpOmU8NDI5NDk2NzI5Nj8odGhpcy53cml0ZVU4KDIwNiksdGhpcy53cml0ZVUzMihlKSk6dGhpcy51c2VCaWdJbnQ2ND90aGlzLmVuY29kZU51bWJlckFzRmxvYXQoZSk6KHRoaXMud3JpdGVVOCgyMDcpLHRoaXMud3JpdGVVNjQoZSkpOmU+PS0zMj90aGlzLndyaXRlVTgoMjI0fGUrMzIpOmU+PS0xMjg/KHRoaXMud3JpdGVVOCgyMDgpLHRoaXMud3JpdGVJOChlKSk6ZT49LTMyNzY4Pyh0aGlzLndyaXRlVTgoMjA5KSx0aGlzLndyaXRlSTE2KGUpKTplPj0tMjE0NzQ4MzY0OD8odGhpcy53cml0ZVU4KDIxMCksdGhpcy53cml0ZUkzMihlKSk6dGhpcy51c2VCaWdJbnQ2ND90aGlzLmVuY29kZU51bWJlckFzRmxvYXQoZSk6KHRoaXMud3JpdGVVOCgyMTEpLHRoaXMud3JpdGVJNjQoZSkpOnRoaXMuZW5jb2RlTnVtYmVyQXNGbG9hdChlKX1lbmNvZGVOdW1iZXJBc0Zsb2F0KGUpe3RoaXMuZm9yY2VGbG9hdDMyPyh0aGlzLndyaXRlVTgoMjAyKSx0aGlzLndyaXRlRjMyKGUpKToodGhpcy53cml0ZVU4KDIwMyksdGhpcy53cml0ZUY2NChlKSl9ZW5jb2RlQmlnSW50NjQoZSl7ZT49QmlnSW50KDApPyh0aGlzLndyaXRlVTgoMjA3KSx0aGlzLndyaXRlQmlnVWludDY0KGUpKToodGhpcy53cml0ZVU4KDIxMSksdGhpcy53cml0ZUJpZ0ludDY0KGUpKX13cml0ZVN0cmluZ0hlYWRlcihlKXtpZihlPDMyKXRoaXMud3JpdGVVOCgxNjArZSk7ZWxzZSBpZihlPDI1Nil0aGlzLndyaXRlVTgoMjE3KSx0aGlzLndyaXRlVTgoZSk7ZWxzZSBpZihlPDY1NTM2KXRoaXMud3JpdGVVOCgyMTgpLHRoaXMud3JpdGVVMTYoZSk7ZWxzZXtpZighKGU8NDI5NDk2NzI5NikpdGhyb3cgbmV3IEVycm9yKGBUb28gbG9uZyBzdHJpbmc6ICR7ZX0gYnl0ZXMgaW4gVVRGLThgKTt0aGlzLndyaXRlVTgoMjE5KSx0aGlzLndyaXRlVTMyKGUpfX1lbmNvZGVTdHJpbmcoZSl7Y29uc3Qgbj1mdW5jdGlvbihlKXtjb25zdCB0PWUubGVuZ3RoO2xldCBuPTAscj0wO2Zvcig7cjx0Oyl7bGV0IGk9ZS5jaGFyQ29kZUF0KHIrKyk7aWYoNDI5NDk2NzE2OCZpKWlmKDQyOTQ5NjUyNDgmaSl7aWYoaT49NTUyOTYmJmk8PTU2MzE5JiZyPHQpe2NvbnN0IHQ9ZS5jaGFyQ29kZUF0KHIpOzU2MzIwPT0oNjQ1MTImdCkmJigrK3IsaT0oKDEwMjMmaSk8PDEwKSsoMTAyMyZ0KSs2NTUzNil9bis9NDI5NDkwMTc2MCZpPzQ6M31lbHNlIG4rPTI7ZWxzZSBuKyt9cmV0dXJuIG59KGUpO3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoNStuKSx0aGlzLndyaXRlU3RyaW5nSGVhZGVyKG4pLHQoZSx0aGlzLmJ5dGVzLHRoaXMucG9zKSx0aGlzLnBvcys9bn1lbmNvZGVPYmplY3QoZSx0KXtjb25zdCBuPXRoaXMuZXh0ZW5zaW9uQ29kZWMudHJ5VG9FbmNvZGUoZSx0aGlzLmNvbnRleHQpO2lmKG51bGwhPW4pdGhpcy5lbmNvZGVFeHRlbnNpb24obik7ZWxzZSBpZihBcnJheS5pc0FycmF5KGUpKXRoaXMuZW5jb2RlQXJyYXkoZSx0KTtlbHNlIGlmKEFycmF5QnVmZmVyLmlzVmlldyhlKSl0aGlzLmVuY29kZUJpbmFyeShlKTtlbHNle2lmKCJvYmplY3QiIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCBvYmplY3Q6ICR7T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShlKX1gKTt0aGlzLmVuY29kZU1hcChlLHQpfX1lbmNvZGVCaW5hcnkoZSl7Y29uc3QgdD1lLmJ5dGVMZW5ndGg7aWYodDwyNTYpdGhpcy53cml0ZVU4KDE5NiksdGhpcy53cml0ZVU4KHQpO2Vsc2UgaWYodDw2NTUzNil0aGlzLndyaXRlVTgoMTk3KSx0aGlzLndyaXRlVTE2KHQpO2Vsc2V7aWYoISh0PDQyOTQ5NjcyOTYpKXRocm93IG5ldyBFcnJvcihgVG9vIGxhcmdlIGJpbmFyeTogJHt0fWApO3RoaXMud3JpdGVVOCgxOTgpLHRoaXMud3JpdGVVMzIodCl9Y29uc3Qgbj1mKGUpO3RoaXMud3JpdGVVOGEobil9ZW5jb2RlQXJyYXkoZSx0KXtjb25zdCBuPWUubGVuZ3RoO2lmKG48MTYpdGhpcy53cml0ZVU4KDE0NCtuKTtlbHNlIGlmKG48NjU1MzYpdGhpcy53cml0ZVU4KDIyMCksdGhpcy53cml0ZVUxNihuKTtlbHNle2lmKCEobjw0Mjk0OTY3Mjk2KSl0aHJvdyBuZXcgRXJyb3IoYFRvbyBsYXJnZSBhcnJheTogJHtufWApO3RoaXMud3JpdGVVOCgyMjEpLHRoaXMud3JpdGVVMzIobil9Zm9yKGNvbnN0IG4gb2YgZSl0aGlzLmRvRW5jb2RlKG4sdCsxKX1jb3VudFdpdGhvdXRVbmRlZmluZWQoZSx0KXtsZXQgbj0wO2Zvcihjb25zdCByIG9mIHQpdm9pZCAwIT09ZVtyXSYmbisrO3JldHVybiBufWVuY29kZU1hcChlLHQpe2NvbnN0IG49T2JqZWN0LmtleXMoZSk7dGhpcy5zb3J0S2V5cyYmbi5zb3J0KCk7Y29uc3Qgcj10aGlzLmlnbm9yZVVuZGVmaW5lZD90aGlzLmNvdW50V2l0aG91dFVuZGVmaW5lZChlLG4pOm4ubGVuZ3RoO2lmKHI8MTYpdGhpcy53cml0ZVU4KDEyOCtyKTtlbHNlIGlmKHI8NjU1MzYpdGhpcy53cml0ZVU4KDIyMiksdGhpcy53cml0ZVUxNihyKTtlbHNle2lmKCEocjw0Mjk0OTY3Mjk2KSl0aHJvdyBuZXcgRXJyb3IoYFRvbyBsYXJnZSBtYXAgb2JqZWN0OiAke3J9YCk7dGhpcy53cml0ZVU4KDIyMyksdGhpcy53cml0ZVUzMihyKX1mb3IoY29uc3QgciBvZiBuKXtjb25zdCBuPWVbcl07dGhpcy5pZ25vcmVVbmRlZmluZWQmJnZvaWQgMD09PW58fCh0aGlzLmVuY29kZVN0cmluZyhyKSx0aGlzLmRvRW5jb2RlKG4sdCsxKSl9fWVuY29kZUV4dGVuc2lvbihlKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgZS5kYXRhKXtjb25zdCB0PWUuZGF0YSh0aGlzLnBvcys2KSxuPXQubGVuZ3RoO2lmKG4+PTQyOTQ5NjcyOTYpdGhyb3cgbmV3IEVycm9yKGBUb28gbGFyZ2UgZXh0ZW5zaW9uIG9iamVjdDogJHtufWApO3JldHVybiB0aGlzLndyaXRlVTgoMjAxKSx0aGlzLndyaXRlVTMyKG4pLHRoaXMud3JpdGVJOChlLnR5cGUpLHZvaWQgdGhpcy53cml0ZVU4YSh0KX1jb25zdCB0PWUuZGF0YS5sZW5ndGg7aWYoMT09PXQpdGhpcy53cml0ZVU4KDIxMik7ZWxzZSBpZigyPT09dCl0aGlzLndyaXRlVTgoMjEzKTtlbHNlIGlmKDQ9PT10KXRoaXMud3JpdGVVOCgyMTQpO2Vsc2UgaWYoOD09PXQpdGhpcy53cml0ZVU4KDIxNSk7ZWxzZSBpZigxNj09PXQpdGhpcy53cml0ZVU4KDIxNik7ZWxzZSBpZih0PDI1Nil0aGlzLndyaXRlVTgoMTk5KSx0aGlzLndyaXRlVTgodCk7ZWxzZSBpZih0PDY1NTM2KXRoaXMud3JpdGVVOCgyMDApLHRoaXMud3JpdGVVMTYodCk7ZWxzZXtpZighKHQ8NDI5NDk2NzI5NikpdGhyb3cgbmV3IEVycm9yKGBUb28gbGFyZ2UgZXh0ZW5zaW9uIG9iamVjdDogJHt0fWApO3RoaXMud3JpdGVVOCgyMDEpLHRoaXMud3JpdGVVMzIodCl9dGhpcy53cml0ZUk4KGUudHlwZSksdGhpcy53cml0ZVU4YShlLmRhdGEpfXdyaXRlVTgoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSgxKSx0aGlzLnZpZXcuc2V0VWludDgodGhpcy5wb3MsZSksdGhpcy5wb3MrK313cml0ZVU4YShlKXtjb25zdCB0PWUubGVuZ3RoO3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUodCksdGhpcy5ieXRlcy5zZXQoZSx0aGlzLnBvcyksdGhpcy5wb3MrPXR9d3JpdGVJOChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDEpLHRoaXMudmlldy5zZXRJbnQ4KHRoaXMucG9zLGUpLHRoaXMucG9zKyt9d3JpdGVVMTYoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSgyKSx0aGlzLnZpZXcuc2V0VWludDE2KHRoaXMucG9zLGUpLHRoaXMucG9zKz0yfXdyaXRlSTE2KGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoMiksdGhpcy52aWV3LnNldEludDE2KHRoaXMucG9zLGUpLHRoaXMucG9zKz0yfXdyaXRlVTMyKGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoNCksdGhpcy52aWV3LnNldFVpbnQzMih0aGlzLnBvcyxlKSx0aGlzLnBvcys9NH13cml0ZUkzMihlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDQpLHRoaXMudmlldy5zZXRJbnQzMih0aGlzLnBvcyxlKSx0aGlzLnBvcys9NH13cml0ZUYzMihlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDQpLHRoaXMudmlldy5zZXRGbG9hdDMyKHRoaXMucG9zLGUpLHRoaXMucG9zKz00fXdyaXRlRjY0KGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoOCksdGhpcy52aWV3LnNldEZsb2F0NjQodGhpcy5wb3MsZSksdGhpcy5wb3MrPTh9d3JpdGVVNjQoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSg4KSxmdW5jdGlvbihlLHQsbil7Y29uc3Qgcj1uLzQyOTQ5NjcyOTYsaT1uO2Uuc2V0VWludDMyKHQsciksZS5zZXRVaW50MzIodCs0LGkpfSh0aGlzLnZpZXcsdGhpcy5wb3MsZSksdGhpcy5wb3MrPTh9d3JpdGVJNjQoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSg4KSxpKHRoaXMudmlldyx0aGlzLnBvcyxlKSx0aGlzLnBvcys9OH13cml0ZUJpZ1VpbnQ2NChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpLHRoaXMudmlldy5zZXRCaWdVaW50NjQodGhpcy5wb3MsZSksdGhpcy5wb3MrPTh9d3JpdGVCaWdJbnQ2NChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpLHRoaXMudmlldy5zZXRCaWdJbnQ2NCh0aGlzLnBvcyxlKSx0aGlzLnBvcys9OH19dHJ5e2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgZmV0Y2gmJiJ1bmRlZmluZWQiIT10eXBlb2YgcHJvY2VzcyYmcHJvY2Vzcy52ZXJzaW9ucz8ubm9kZSl7bmV3IEZ1bmN0aW9uKCJtIiwicmV0dXJuIGltcG9ydChtKSIpKCJjcm9zcy1mZXRjaC9wb2x5ZmlsbCIpLmNhdGNoKCgoKT0+e30pKX19Y2F0Y2h7fXRyeXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHByb2Nlc3MmJnByb2Nlc3MudmVyc2lvbnM/Lm5vZGUmJiJ3aW4zMiI9PT1wcm9jZXNzLnBsYXRmb3JtKXtuZXcgRnVuY3Rpb24oIm0iLCJyZXR1cm4gaW1wb3J0KG0pIikoIndpbi1jYSIpfX1jYXRjaHt9Y29uc3QgdT0oKCk9Pntjb25zdCBlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LmdldFByb3RvdHlwZU9mKFVpbnQ4QXJyYXkucHJvdG90eXBlKSxTeW1ib2wudG9TdHJpbmdUYWcpLmdldDtyZXR1cm4gdD0+ZS5jYWxsKHQpfSkoKTtmdW5jdGlvbiBfKGUpe3JldHVybiJVaW50OEFycmF5Ij09PXUoZSl9ZnVuY3Rpb24gZyhlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPWUmJlN5bWJvbC50b1N0cmluZ1RhZyBpbiBlJiYoIkFycmF5QnVmZmVyIj09PWVbU3ltYm9sLnRvU3RyaW5nVGFnXXx8IlNoYXJlZEFycmF5QnVmZmVyIj09PWVbU3ltYm9sLnRvU3RyaW5nVGFnXSl9ZnVuY3Rpb24gaChlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIFJlZ0V4cHx8IltvYmplY3QgUmVnRXhwXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9ZnVuY3Rpb24gYihlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPWUmJlN5bWJvbC50b1N0cmluZ1RhZyBpbiBlJiYiTWFwIj09PWVbU3ltYm9sLnRvU3RyaW5nVGFnXX1mdW5jdGlvbiBkKGUpe3JldHVybiBlIGluc3RhbmNlb2YgRGF0ZXx8IltvYmplY3QgRGF0ZV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfWZ1bmN0aW9uIHcoZSx0KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZSwoKGUsdCk9PiJiaWdpbnQiPT10eXBlb2YgdD97JG51bWJlckxvbmc6YCR7dH1gfTpiKHQpP09iamVjdC5mcm9tRW50cmllcyh0KTp0KSl9Y29uc3QgcD03LHk9U3ltYm9sLmZvcigiQEBtZGIuYnNvbi52ZXJzaW9uIiksbT0yMTQ3NDgzNjQ3LFM9LTIxNDc0ODM2NDgsQj1NYXRoLnBvdygyLDYzKS0xLHg9LU1hdGgucG93KDIsNjMpLEU9TWF0aC5wb3coMiw1MyksVT0tTWF0aC5wb3coMiw1MyksTz0xLEk9MixOPTMsdj00LFQ9NSwkPTYsTD03LEE9OCxSPTksaj0xMCxGPTExLGs9MTIsej0xMyxEPTE0LEM9MTUsTT0xNixWPTE3LFA9MTgsSj0xOSxXPTI1NSxZPTEyNyxxPTAsSD00LEs9T2JqZWN0LmZyZWV6ZSh7ZG91YmxlOjEsc3RyaW5nOjIsb2JqZWN0OjMsYXJyYXk6NCxiaW5EYXRhOjUsdW5kZWZpbmVkOjYsb2JqZWN0SWQ6Nyxib29sOjgsZGF0ZTo5LG51bGw6MTAscmVnZXg6MTEsZGJQb2ludGVyOjEyLGphdmFzY3JpcHQ6MTMsc3ltYm9sOjE0LGphdmFzY3JpcHRXaXRoU2NvcGU6MTUsaW50OjE2LHRpbWVzdGFtcDoxNyxsb25nOjE4LGRlY2ltYWw6MTksbWluS2V5Oi0xLG1heEtleToxMjd9KTtjbGFzcyBaIGV4dGVuZHMgRXJyb3J7Z2V0IGJzb25FcnJvcigpe3JldHVybiEwfWdldCBuYW1lKCl7cmV0dXJuIkJTT05FcnJvciJ9Y29uc3RydWN0b3IoZSx0KXtzdXBlcihlLHQpfXN0YXRpYyBpc0JTT05FcnJvcihlKXtyZXR1cm4gbnVsbCE9ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYiYnNvbkVycm9yImluIGUmJiEwPT09ZS5ic29uRXJyb3ImJiJuYW1lImluIGUmJiJtZXNzYWdlImluIGUmJiJzdGFjayJpbiBlfX1jbGFzcyBHIGV4dGVuZHMgWntnZXQgbmFtZSgpe3JldHVybiJCU09OVmVyc2lvbkVycm9yIn1jb25zdHJ1Y3Rvcigpe3N1cGVyKGBVbnN1cHBvcnRlZCBCU09OIHZlcnNpb24sIGJzb24gdHlwZXMgbXVzdCBiZSBmcm9tIGJzb24gJHtwfS54LnhgKX19Y2xhc3MgWCBleHRlbmRzIFp7Z2V0IG5hbWUoKXtyZXR1cm4iQlNPTlJ1bnRpbWVFcnJvciJ9Y29uc3RydWN0b3IoZSl7c3VwZXIoZSl9fWNsYXNzIFEgZXh0ZW5kcyBae2dldCBuYW1lKCl7cmV0dXJuIkJTT05PZmZzZXRFcnJvciJ9b2Zmc2V0O2NvbnN0cnVjdG9yKGUsdCxuKXtzdXBlcihgJHtlfS4gb2Zmc2V0OiAke3R9YCxuKSx0aGlzLm9mZnNldD10fX1sZXQgZWUsdGU7ZnVuY3Rpb24gbmUoZSx0LG4scil7aWYocil7ZWU/Pz1uZXcgVGV4dERlY29kZXIoInV0ZjgiLHtmYXRhbDohMH0pO3RyeXtyZXR1cm4gZWUuZGVjb2RlKGUuc3ViYXJyYXkodCxuKSl9Y2F0Y2goZSl7dGhyb3cgbmV3IFooIkludmFsaWQgVVRGLTggc3RyaW5nIGluIEJTT04gZG9jdW1lbnQiLHtjYXVzZTplfSl9fXJldHVybiB0ZT8/PW5ldyBUZXh0RGVjb2RlcigidXRmOCIse2ZhdGFsOiExfSksdGUuZGVjb2RlKGUuc3ViYXJyYXkodCxuKSl9ZnVuY3Rpb24gcmUoZSx0LG4pe2lmKDA9PT1lLmxlbmd0aClyZXR1cm4iIjtjb25zdCByPW4tdDtpZigwPT09cilyZXR1cm4iIjtpZihyPjIwKXJldHVybiBudWxsO2lmKDE9PT1yJiZlW3RdPDEyOClyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShlW3RdKTtpZigyPT09ciYmZVt0XTwxMjgmJmVbdCsxXTwxMjgpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoZVt0XSkrU3RyaW5nLmZyb21DaGFyQ29kZShlW3QrMV0pO2lmKDM9PT1yJiZlW3RdPDEyOCYmZVt0KzFdPDEyOCYmZVt0KzJdPDEyOClyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShlW3RdKStTdHJpbmcuZnJvbUNoYXJDb2RlKGVbdCsxXSkrU3RyaW5nLmZyb21DaGFyQ29kZShlW3QrMl0pO2NvbnN0IGk9W107Zm9yKGxldCByPXQ7cjxuO3IrKyl7Y29uc3QgdD1lW3JdO2lmKHQ+MTI3KXJldHVybiBudWxsO2kucHVzaCh0KX1yZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSguLi5pKX1mdW5jdGlvbiBpZShlKXtyZXR1cm4gYWUuZnJvbU51bWJlckFycmF5KEFycmF5LmZyb20oe2xlbmd0aDplfSwoKCk9Pk1hdGguZmxvb3IoMjU2Kk1hdGgucmFuZG9tKCkpKSkpfWZ1bmN0aW9uIG9lKGUpe3JldHVybiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFlLmFsbG9jYXRlKGUpKX1jb25zdCBzZT0oKCk9Pntjb25zdHtjcnlwdG86ZX09Z2xvYmFsVGhpcztyZXR1cm4gbnVsbCE9ZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0UmFuZG9tVmFsdWVzP29lOmllfSkoKSxhZT17aXNVaW50OEFycmF5Ol8sdG9Mb2NhbEJ1ZmZlclR5cGUoZSl7aWYoQnVmZmVyLmlzQnVmZmVyKGUpKXJldHVybiBlO2lmKEFycmF5QnVmZmVyLmlzVmlldyhlKSlyZXR1cm4gQnVmZmVyLmZyb20oZS5idWZmZXIsZS5ieXRlT2Zmc2V0LGUuYnl0ZUxlbmd0aCk7Y29uc3QgdD1lPy5bU3ltYm9sLnRvU3RyaW5nVGFnXT8/T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpO2lmKCJBcnJheUJ1ZmZlciI9PT10fHwiU2hhcmVkQXJyYXlCdWZmZXIiPT09dHx8IltvYmplY3QgQXJyYXlCdWZmZXJdIj09PXR8fCJbb2JqZWN0IFNoYXJlZEFycmF5QnVmZmVyXSI9PT10KXJldHVybiBCdWZmZXIuZnJvbShlKTt0aHJvdyBuZXcgWigiQ2Fubm90IGNyZWF0ZSBCdWZmZXIgZnJvbSB0aGUgcGFzc2VkIHBvdGVudGlhbEJ1ZmZlci4iKX0sYWxsb2NhdGU6ZT0+QnVmZmVyLmFsbG9jKGUpLGFsbG9jYXRlVW5zYWZlOmU9PkJ1ZmZlci5hbGxvY1Vuc2FmZShlKSxjb21wYXJlOihlLHQpPT5hZS50b0xvY2FsQnVmZmVyVHlwZShlKS5jb21wYXJlKHQpLGNvbmNhdDplPT5CdWZmZXIuY29uY2F0KGUpLGNvcHk6KGUsdCxuLHIsaSk9PmFlLnRvTG9jYWxCdWZmZXJUeXBlKGUpLmNvcHkodCxuPz8wLHI/PzAsaT8/ZS5sZW5ndGgpLGVxdWFsczooZSx0KT0+YWUudG9Mb2NhbEJ1ZmZlclR5cGUoZSkuZXF1YWxzKHQpLGZyb21OdW1iZXJBcnJheTplPT5CdWZmZXIuZnJvbShlKSxmcm9tQmFzZTY0OmU9PkJ1ZmZlci5mcm9tKGUsImJhc2U2NCIpLGZyb21VVEY4OmU9PkJ1ZmZlci5mcm9tKGUsInV0ZjgiKSx0b0Jhc2U2NDplPT5hZS50b0xvY2FsQnVmZmVyVHlwZShlKS50b1N0cmluZygiYmFzZTY0IiksZnJvbUlTTzg4NTkxOmU9PkJ1ZmZlci5mcm9tKGUsImJpbmFyeSIpLHRvSVNPODg1OTE6ZT0+YWUudG9Mb2NhbEJ1ZmZlclR5cGUoZSkudG9TdHJpbmcoImJpbmFyeSIpLGZyb21IZXg6ZT0+QnVmZmVyLmZyb20oZSwiaGV4IiksdG9IZXg6ZT0+YWUudG9Mb2NhbEJ1ZmZlclR5cGUoZSkudG9TdHJpbmcoImhleCIpLHRvVVRGOChlLHQsbixyKXtjb25zdCBpPW4tdDw9MjA/cmUoZSx0LG4pOm51bGw7aWYobnVsbCE9aSlyZXR1cm4gaTtjb25zdCBvPWFlLnRvTG9jYWxCdWZmZXJUeXBlKGUpLnRvU3RyaW5nKCJ1dGY4Iix0LG4pO2lmKHIpZm9yKGxldCByPTA7cjxvLmxlbmd0aDtyKyspaWYoNjU1MzM9PT1vLmNoYXJDb2RlQXQocikpe25lKGUsdCxuLCEwKTticmVha31yZXR1cm4gb30sdXRmOEJ5dGVMZW5ndGg6ZT0+QnVmZmVyLmJ5dGVMZW5ndGgoZSwidXRmOCIpLGVuY29kZVVURjhJbnRvKGUsdCxuKXtjb25zdCByPWZ1bmN0aW9uKGUsdCxuKXtpZigwPT09dC5sZW5ndGgpcmV0dXJuIDA7aWYodC5sZW5ndGg+MjUpcmV0dXJuIG51bGw7aWYoZS5sZW5ndGgtbjx0Lmxlbmd0aClyZXR1cm4gbnVsbDtmb3IobGV0IHI9MCxpPW47cjx0Lmxlbmd0aDtyKyssaSsrKXtjb25zdCBuPXQuY2hhckNvZGVBdChyKTtpZihuPjEyNylyZXR1cm4gbnVsbDtlW2ldPW59cmV0dXJuIHQubGVuZ3RofShlLHQsbik7cmV0dXJuIG51bGwhPXI/cjphZS50b0xvY2FsQnVmZmVyVHlwZShlKS53cml0ZSh0LG4sdm9pZCAwLCJ1dGY4Iil9LHJhbmRvbUJ5dGVzOnNlLHN3YXAzMjplPT5hZS50b0xvY2FsQnVmZmVyVHlwZShlKS5zd2FwMzIoKX07ZnVuY3Rpb24gY2UoZSl7aWYoZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKGBUaGUgYXJndW1lbnQgJ2J5dGVMZW5ndGgnIGlzIGludmFsaWQuIFJlY2VpdmVkICR7ZX1gKTtyZXR1cm4gdWUuZnJvbU51bWJlckFycmF5KEFycmF5LmZyb20oe2xlbmd0aDplfSwoKCk9Pk1hdGguZmxvb3IoMjU2Kk1hdGgucmFuZG9tKCkpKSkpfWNvbnN0IGZlPSgoKT0+e2NvbnN0e2NyeXB0bzplfT1nbG9iYWxUaGlzO2lmKG51bGwhPWUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldFJhbmRvbVZhbHVlcylyZXR1cm4gdD0+ZS5nZXRSYW5kb21WYWx1ZXModWUuYWxsb2NhdGUodCkpO2lmKGZ1bmN0aW9uKCl7Y29uc3R7bmF2aWdhdG9yOmV9PWdsb2JhbFRoaXM7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlJiYiUmVhY3ROYXRpdmUiPT09ZS5wcm9kdWN0fSgpKXtjb25zdHtjb25zb2xlOmV9PWdsb2JhbFRoaXM7ZT8ud2Fybj8uKCJCU09OOiBGb3IgUmVhY3QgTmF0aXZlIHBsZWFzZSBwb2x5ZmlsbCBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLCBlLmcuIHVzaW5nOiBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9yZWFjdC1uYXRpdmUtZ2V0LXJhbmRvbS12YWx1ZXMuIil9cmV0dXJuIGNlfSkoKSxsZT0vKFxkfFthLWZdKS9pLHVlPXtpc1VpbnQ4QXJyYXk6Xyx0b0xvY2FsQnVmZmVyVHlwZShlKXtjb25zdCB0PWU/LltTeW1ib2wudG9TdHJpbmdUYWddPz9PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSk7aWYoIlVpbnQ4QXJyYXkiPT09dClyZXR1cm4gZTtpZihBcnJheUJ1ZmZlci5pc1ZpZXcoZSkpcmV0dXJuIG5ldyBVaW50OEFycmF5KGUuYnVmZmVyLnNsaWNlKGUuYnl0ZU9mZnNldCxlLmJ5dGVPZmZzZXQrZS5ieXRlTGVuZ3RoKSk7aWYoIkFycmF5QnVmZmVyIj09PXR8fCJTaGFyZWRBcnJheUJ1ZmZlciI9PT10fHwiW29iamVjdCBBcnJheUJ1ZmZlcl0iPT09dHx8IltvYmplY3QgU2hhcmVkQXJyYXlCdWZmZXJdIj09PXQpcmV0dXJuIG5ldyBVaW50OEFycmF5KGUpO3Rocm93IG5ldyBaKCJDYW5ub3QgbWFrZSBhIFVpbnQ4QXJyYXkgZnJvbSBwYXNzZWQgcG90ZW50aWFsQnVmZmVyLiIpfSxhbGxvY2F0ZShlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcihgVGhlICJzaXplIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyLiBSZWNlaXZlZCAke1N0cmluZyhlKX1gKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZSl9LGFsbG9jYXRlVW5zYWZlOmU9PnVlLmFsbG9jYXRlKGUpLGNvbXBhcmUoZSx0KXtpZihlPT09dClyZXR1cm4gMDtjb25zdCBuPU1hdGgubWluKGUubGVuZ3RoLHQubGVuZ3RoKTtmb3IobGV0IHI9MDtyPG47cisrKXtpZihlW3JdPHRbcl0pcmV0dXJuLTE7aWYoZVtyXT50W3JdKXJldHVybiAxfXJldHVybiBlLmxlbmd0aDx0Lmxlbmd0aD8tMTplLmxlbmd0aD50Lmxlbmd0aD8xOjB9LGNvbmNhdChlKXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIHVlLmFsbG9jYXRlKDApO2xldCB0PTA7Zm9yKGNvbnN0IG4gb2YgZSl0Kz1uLmxlbmd0aDtjb25zdCBuPXVlLmFsbG9jYXRlKHQpO2xldCByPTA7Zm9yKGNvbnN0IHQgb2YgZSluLnNldCh0LHIpLHIrPXQubGVuZ3RoO3JldHVybiBufSxjb3B5KGUsdCxuLHIsaSl7aWYodm9pZCAwIT09aSYmaTwwKXRocm93IG5ldyBSYW5nZUVycm9yKGBUaGUgdmFsdWUgb2YgInNvdXJjZUVuZCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlID49IDAuIFJlY2VpdmVkICR7aX1gKTtpZihpPWk/P2UubGVuZ3RoLHZvaWQgMCE9PXImJihyPDB8fHI+aSkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFRoZSB2YWx1ZSBvZiAic291cmNlU3RhcnQiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSA+PSAwIGFuZCA8PSAke2l9LiBSZWNlaXZlZCAke3J9YCk7aWYocj1yPz8wLHZvaWQgMCE9PW4mJm48MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVGhlIHZhbHVlIG9mICJ0YXJnZXRTdGFydCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlID49IDAuIFJlY2VpdmVkICR7bn1gKTtuPW4/PzA7Y29uc3Qgbz1lLnN1YmFycmF5KHIsaSkscz1NYXRoLm1pbihvLmxlbmd0aCx0Lmxlbmd0aC1uKTtyZXR1cm4gczw9MD8wOih0LnNldChvLnN1YmFycmF5KDAscyksbikscyl9LGVxdWFscyhlLHQpe2lmKGUuYnl0ZUxlbmd0aCE9PXQuYnl0ZUxlbmd0aClyZXR1cm4hMTtmb3IobGV0IG49MDtuPGUuYnl0ZUxlbmd0aDtuKyspaWYoZVtuXSE9PXRbbl0pcmV0dXJuITE7cmV0dXJuITB9LGZyb21OdW1iZXJBcnJheTplPT5VaW50OEFycmF5LmZyb20oZSksZnJvbUJhc2U2NDplPT5VaW50OEFycmF5LmZyb20oYXRvYihlKSwoZT0+ZS5jaGFyQ29kZUF0KDApKSksZnJvbVVURjg6ZT0+KG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKGUpLHRvQmFzZTY0OmU9PmJ0b2EodWUudG9JU084ODU5MShlKSksZnJvbUlTTzg4NTkxOmU9PlVpbnQ4QXJyYXkuZnJvbShlLChlPT4yNTUmZS5jaGFyQ29kZUF0KDApKSksdG9JU084ODU5MTplPT5BcnJheS5mcm9tKFVpbnQxNkFycmF5LmZyb20oZSksKGU9PlN0cmluZy5mcm9tQ2hhckNvZGUoZSkpKS5qb2luKCIiKSxmcm9tSGV4KGUpe2NvbnN0IHQ9ZS5sZW5ndGglMj09MD9lOmUuc2xpY2UoMCxlLmxlbmd0aC0xKSxuPVtdO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSs9Mil7Y29uc3Qgcj10W2VdLGk9dFtlKzFdO2lmKCFsZS50ZXN0KHIpKWJyZWFrO2lmKCFsZS50ZXN0KGkpKWJyZWFrO2NvbnN0IG89TnVtYmVyLnBhcnNlSW50KGAke3J9JHtpfWAsMTYpO24ucHVzaChvKX1yZXR1cm4gVWludDhBcnJheS5mcm9tKG4pfSx0b0hleDplPT5BcnJheS5mcm9tKGUsKGU9PmUudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKSkpLmpvaW4oIiIpLHRvVVRGOChlLHQsbixyKXtjb25zdCBpPW4tdDw9MjA/cmUoZSx0LG4pOm51bGw7cmV0dXJuIG51bGwhPWk/aTpuZShlLHQsbixyKX0sdXRmOEJ5dGVMZW5ndGg6ZT0+KG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKGUpLmJ5dGVMZW5ndGgsZW5jb2RlVVRGOEludG8oZSx0LG4pe2NvbnN0IHI9KG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKHQpO3JldHVybiBlLnNldChyLG4pLHIuYnl0ZUxlbmd0aH0scmFuZG9tQnl0ZXM6ZmUsc3dhcDMyKGUpe2lmKGUubGVuZ3RoJTQhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzIik7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kz00KXtjb25zdCBuPWVbdF0scj1lW3QrMV0saT1lW3QrMl0sbz1lW3QrM107ZVt0XT1vLGVbdCsxXT1pLGVbdCsyXT1yLGVbdCszXT1ufXJldHVybiBlfX0sX2U9ImZ1bmN0aW9uIj09dHlwZW9mIEJ1ZmZlciYmITAhPT1CdWZmZXIucHJvdG90eXBlPy5faXNCdWZmZXI/YWU6dWUsZ2U9U3ltYm9sLmZvcigiQEBtZGIuYnNvbi50eXBlIik7Y2xhc3MgaGV7Z2V0W2dlXSgpe3JldHVybiB0aGlzLl9ic29udHlwZX1nZXRbeV0oKXtyZXR1cm4gcH1bU3ltYm9sLmZvcigibm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20iKV0oZSx0LG4pe3JldHVybiB0aGlzLmluc3BlY3QoZSx0LG4pfX1jb25zdCBiZT1uZXcgRmxvYXQ2NEFycmF5KDEpLGRlPW5ldyBVaW50OEFycmF5KGJlLmJ1ZmZlciwwLDgpO2JlWzBdPS0xO2NvbnN0IHdlPTA9PT1kZVs3XSxwZT17aXNCaWdFbmRpYW46d2UsZ2V0Tm9ubmVnYXRpdmVJbnQzMkxFKGUsdCl7aWYoZVt0KzNdPjEyNyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgU2l6ZSBjYW5ub3QgYmUgbmVnYXRpdmUgYXQgb2Zmc2V0OiAke3R9YCk7cmV0dXJuIGVbdF18ZVt0KzFdPDw4fGVbdCsyXTw8MTZ8ZVt0KzNdPDwyNH0sZ2V0SW50MzJMRTooZSx0KT0+ZVt0XXxlW3QrMV08PDh8ZVt0KzJdPDwxNnxlW3QrM108PDI0LGdldFVpbnQzMkxFOihlLHQpPT5lW3RdKzI1NiplW3QrMV0rNjU1MzYqZVt0KzJdKzE2Nzc3MjE2KmVbdCszXSxnZXRVaW50MzJCRTooZSx0KT0+ZVt0KzNdKzI1NiplW3QrMl0rNjU1MzYqZVt0KzFdKzE2Nzc3MjE2KmVbdF0sZ2V0QmlnSW50NjRMRTooZSx0KT0+KEJpZ0ludChlW3QrNF0rMjU2KmVbdCs1XSs2NTUzNiplW3QrNl0rKGVbdCs3XTw8MjQpKTw8MzJuKStCaWdJbnQoZVt0XSsyNTYqZVt0KzFdKzY1NTM2KmVbdCsyXSsxNjc3NzIxNiplW3QrM10pLGdldEZsb2F0NjRMRTp3ZT8oZSx0KT0+KGRlWzddPWVbdF0sZGVbNl09ZVt0KzFdLGRlWzVdPWVbdCsyXSxkZVs0XT1lW3QrM10sZGVbM109ZVt0KzRdLGRlWzJdPWVbdCs1XSxkZVsxXT1lW3QrNl0sZGVbMF09ZVt0KzddLGJlWzBdKTooZSx0KT0+KGRlWzBdPWVbdF0sZGVbMV09ZVt0KzFdLGRlWzJdPWVbdCsyXSxkZVszXT1lW3QrM10sZGVbNF09ZVt0KzRdLGRlWzVdPWVbdCs1XSxkZVs2XT1lW3QrNl0sZGVbN109ZVt0KzddLGJlWzBdKSxzZXRJbnQzMkJFOihlLHQsbik9PihlW3QrM109bixuPj4+PTgsZVt0KzJdPW4sbj4+Pj04LGVbdCsxXT1uLG4+Pj49OCxlW3RdPW4sNCksc2V0SW50MzJMRTooZSx0LG4pPT4oZVt0XT1uLG4+Pj49OCxlW3QrMV09bixuPj4+PTgsZVt0KzJdPW4sbj4+Pj04LGVbdCszXT1uLDQpLHNldEJpZ0ludDY0TEUoZSx0LG4pe2NvbnN0IHI9MHhmZmZmZmZmZm47bGV0IGk9TnVtYmVyKG4mcik7ZVt0XT1pLGk+Pj04LGVbdCsxXT1pLGk+Pj04LGVbdCsyXT1pLGk+Pj04LGVbdCszXT1pO2xldCBvPU51bWJlcihuPj4zMm4mcik7cmV0dXJuIGVbdCs0XT1vLG8+Pj04LGVbdCs1XT1vLG8+Pj04LGVbdCs2XT1vLG8+Pj04LGVbdCs3XT1vLDh9LHNldEZsb2F0NjRMRTp3ZT8oZSx0LG4pPT4oYmVbMF09bixlW3RdPWRlWzddLGVbdCsxXT1kZVs2XSxlW3QrMl09ZGVbNV0sZVt0KzNdPWRlWzRdLGVbdCs0XT1kZVszXSxlW3QrNV09ZGVbMl0sZVt0KzZdPWRlWzFdLGVbdCs3XT1kZVswXSw4KTooZSx0LG4pPT4oYmVbMF09bixlW3RdPWRlWzBdLGVbdCsxXT1kZVsxXSxlW3QrMl09ZGVbMl0sZVt0KzNdPWRlWzNdLGVbdCs0XT1kZVs0XSxlW3QrNV09ZGVbNV0sZVt0KzZdPWRlWzZdLGVbdCs3XT1kZVs3XSw4KX07Y2xhc3MgeWUgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkJpbmFyeSJ9c3RhdGljIEJTT05fQklOQVJZX1NVQlRZUEVfREVGQVVMVD0wO3N0YXRpYyBCVUZGRVJfU0laRT0yNTY7c3RhdGljIFNVQlRZUEVfREVGQVVMVD0wO3N0YXRpYyBTVUJUWVBFX0ZVTkNUSU9OPTE7c3RhdGljIFNVQlRZUEVfQllURV9BUlJBWT0yO3N0YXRpYyBTVUJUWVBFX1VVSURfT0xEPTM7c3RhdGljIFNVQlRZUEVfVVVJRD00O3N0YXRpYyBTVUJUWVBFX01ENT01O3N0YXRpYyBTVUJUWVBFX0VOQ1JZUFRFRD02O3N0YXRpYyBTVUJUWVBFX0NPTFVNTj03O3N0YXRpYyBTVUJUWVBFX1NFTlNJVElWRT04O3N0YXRpYyBTVUJUWVBFX1ZFQ1RPUj05O3N0YXRpYyBTVUJUWVBFX1VTRVJfREVGSU5FRD0xMjg7c3RhdGljIFZFQ1RPUl9UWVBFPU9iamVjdC5mcmVlemUoe0ludDg6MyxGbG9hdDMyOjM5LFBhY2tlZEJpdDoxNn0pO2J1ZmZlcjtzdWJfdHlwZTtwb3NpdGlvbjtjb25zdHJ1Y3RvcihlLHQpe2lmKHN1cGVyKCksbnVsbCE9ZSYmInN0cmluZyI9PXR5cGVvZiBlJiYhQXJyYXlCdWZmZXIuaXNWaWV3KGUpJiYhZyhlKSYmIUFycmF5LmlzQXJyYXkoZSkpdGhyb3cgbmV3IFooIkJpbmFyeSBjYW4gb25seSBiZSBjb25zdHJ1Y3RlZCBmcm9tIFVpbnQ4QXJyYXkgb3IgbnVtYmVyW10iKTt0aGlzLnN1Yl90eXBlPXQ/P3llLkJTT05fQklOQVJZX1NVQlRZUEVfREVGQVVMVCxudWxsPT1lPyh0aGlzLmJ1ZmZlcj1fZS5hbGxvY2F0ZSh5ZS5CVUZGRVJfU0laRSksdGhpcy5wb3NpdGlvbj0wKToodGhpcy5idWZmZXI9QXJyYXkuaXNBcnJheShlKT9fZS5mcm9tTnVtYmVyQXJyYXkoZSk6X2UudG9Mb2NhbEJ1ZmZlclR5cGUoZSksdGhpcy5wb3NpdGlvbj10aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKX1wdXQoZSl7aWYoInN0cmluZyI9PXR5cGVvZiBlJiYxIT09ZS5sZW5ndGgpdGhyb3cgbmV3IFooIm9ubHkgYWNjZXB0cyBzaW5nbGUgY2hhcmFjdGVyIFN0cmluZyIpO2lmKCJudW1iZXIiIT10eXBlb2YgZSYmMSE9PWUubGVuZ3RoKXRocm93IG5ldyBaKCJvbmx5IGFjY2VwdHMgc2luZ2xlIGNoYXJhY3RlciBVaW50OEFycmF5IG9yIEFycmF5Iik7bGV0IHQ7aWYodD0ic3RyaW5nIj09dHlwZW9mIGU/ZS5jaGFyQ29kZUF0KDApOiJudW1iZXIiPT10eXBlb2YgZT9lOmVbMF0sdDwwfHx0PjI1NSl0aHJvdyBuZXcgWigib25seSBhY2NlcHRzIG51bWJlciBpbiBhIHZhbGlkIHVuc2lnbmVkIGJ5dGUgcmFuZ2UgMC0yNTUiKTtpZih0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoPnRoaXMucG9zaXRpb24pdGhpcy5idWZmZXJbdGhpcy5wb3NpdGlvbisrXT10O2Vsc2V7Y29uc3QgZT1fZS5hbGxvY2F0ZSh5ZS5CVUZGRVJfU0laRSt0aGlzLmJ1ZmZlci5sZW5ndGgpO2Uuc2V0KHRoaXMuYnVmZmVyLDApLHRoaXMuYnVmZmVyPWUsdGhpcy5idWZmZXJbdGhpcy5wb3NpdGlvbisrXT10fX13cml0ZShlLHQpe2lmKHQ9Im51bWJlciI9PXR5cGVvZiB0P3Q6dGhpcy5wb3NpdGlvbix0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoPHQrZS5sZW5ndGgpe2NvbnN0IHQ9X2UuYWxsb2NhdGUodGhpcy5idWZmZXIuYnl0ZUxlbmd0aCtlLmxlbmd0aCk7dC5zZXQodGhpcy5idWZmZXIsMCksdGhpcy5idWZmZXI9dH1pZihBcnJheUJ1ZmZlci5pc1ZpZXcoZSkpdGhpcy5idWZmZXIuc2V0KF9lLnRvTG9jYWxCdWZmZXJUeXBlKGUpLHQpLHRoaXMucG9zaXRpb249dCtlLmJ5dGVMZW5ndGg+dGhpcy5wb3NpdGlvbj90K2UubGVuZ3RoOnRoaXMucG9zaXRpb247ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIGUpdGhyb3cgbmV3IFooImlucHV0IGNhbm5vdCBiZSBzdHJpbmciKX1yZWFkKGUsdCl7Y29uc3Qgbj1lKyh0PXQmJnQ+MD90OnRoaXMucG9zaXRpb24pO3JldHVybiB0aGlzLmJ1ZmZlci5zdWJhcnJheShlLG4+dGhpcy5wb3NpdGlvbj90aGlzLnBvc2l0aW9uOm4pfXZhbHVlKCl7cmV0dXJuIHRoaXMuYnVmZmVyLmxlbmd0aD09PXRoaXMucG9zaXRpb24/dGhpcy5idWZmZXI6dGhpcy5idWZmZXIuc3ViYXJyYXkoMCx0aGlzLnBvc2l0aW9uKX1sZW5ndGgoKXtyZXR1cm4gdGhpcy5wb3NpdGlvbn10b0pTT04oKXtyZXR1cm4gX2UudG9CYXNlNjQodGhpcy5idWZmZXIuc3ViYXJyYXkoMCx0aGlzLnBvc2l0aW9uKSl9dG9TdHJpbmcoZSl7cmV0dXJuImhleCI9PT1lP19lLnRvSGV4KHRoaXMuYnVmZmVyLnN1YmFycmF5KDAsdGhpcy5wb3NpdGlvbikpOiJiYXNlNjQiPT09ZT9fZS50b0Jhc2U2NCh0aGlzLmJ1ZmZlci5zdWJhcnJheSgwLHRoaXMucG9zaXRpb24pKTpfZS50b1VURjgodGhpcy5idWZmZXIsMCx0aGlzLnBvc2l0aW9uLCExKX10b0V4dGVuZGVkSlNPTihlKXtlPWV8fHt9LHRoaXMuc3ViX3R5cGU9PT15ZS5TVUJUWVBFX1ZFQ1RPUiYmbWUodGhpcyk7Y29uc3QgdD1fZS50b0Jhc2U2NCh0aGlzLmJ1ZmZlciksbj1OdW1iZXIodGhpcy5zdWJfdHlwZSkudG9TdHJpbmcoMTYpO3JldHVybiBlLmxlZ2FjeT97JGJpbmFyeTp0LCR0eXBlOjE9PT1uLmxlbmd0aD8iMCIrbjpufTp7JGJpbmFyeTp7YmFzZTY0OnQsc3ViVHlwZToxPT09bi5sZW5ndGg/IjAiK246bn19fXRvVVVJRCgpe2lmKHRoaXMuc3ViX3R5cGU9PT15ZS5TVUJUWVBFX1VVSUQpcmV0dXJuIG5ldyB4ZSh0aGlzLmJ1ZmZlci5zdWJhcnJheSgwLHRoaXMucG9zaXRpb24pKTt0aHJvdyBuZXcgWihgQmluYXJ5IHN1Yl90eXBlICIke3RoaXMuc3ViX3R5cGV9IiBpcyBub3Qgc3VwcG9ydGVkIGZvciBjb252ZXJ0aW5nIHRvIFVVSUQuIE9ubHkgIiR7eWUuU1VCVFlQRV9VVUlEfSIgaXMgY3VycmVudGx5IHN1cHBvcnRlZC5gKX1zdGF0aWMgY3JlYXRlRnJvbUhleFN0cmluZyhlLHQpe3JldHVybiBuZXcgeWUoX2UuZnJvbUhleChlKSx0KX1zdGF0aWMgY3JlYXRlRnJvbUJhc2U2NChlLHQpe3JldHVybiBuZXcgeWUoX2UuZnJvbUJhc2U2NChlKSx0KX1zdGF0aWMgZnJvbUV4dGVuZGVkSlNPTihlLHQpe2xldCBuLHI7aWYodD10fHx7fSwiJGJpbmFyeSJpbiBlP3QubGVnYWN5JiYic3RyaW5nIj09dHlwZW9mIGUuJGJpbmFyeSYmIiR0eXBlImluIGU/KHI9ZS4kdHlwZT9wYXJzZUludChlLiR0eXBlLDE2KTowLG49X2UuZnJvbUJhc2U2NChlLiRiaW5hcnkpKToic3RyaW5nIiE9dHlwZW9mIGUuJGJpbmFyeSYmKHI9ZS4kYmluYXJ5LnN1YlR5cGU/cGFyc2VJbnQoZS4kYmluYXJ5LnN1YlR5cGUsMTYpOjAsbj1fZS5mcm9tQmFzZTY0KGUuJGJpbmFyeS5iYXNlNjQpKToiJHV1aWQiaW4gZSYmKHI9NCxuPXhlLmJ5dGVzRnJvbVN0cmluZyhlLiR1dWlkKSksIW4pdGhyb3cgbmV3IFooYFVuZXhwZWN0ZWQgQmluYXJ5IEV4dGVuZGVkIEpTT04gZm9ybWF0ICR7SlNPTi5zdHJpbmdpZnkoZSl9YCk7cmV0dXJuIHI9PT1IP25ldyB4ZShuKTpuZXcgeWUobixyKX1pbnNwZWN0KGUsdCxuKXtuPz89dztyZXR1cm5gQmluYXJ5LmNyZWF0ZUZyb21CYXNlNjQoJHtuKF9lLnRvQmFzZTY0KHRoaXMuYnVmZmVyLnN1YmFycmF5KDAsdGhpcy5wb3NpdGlvbikpLHQpfSwgJHtuKHRoaXMuc3ViX3R5cGUsdCl9KWB9dG9JbnQ4QXJyYXkoKXtpZih0aGlzLnN1Yl90eXBlIT09eWUuU1VCVFlQRV9WRUNUT1IpdGhyb3cgbmV3IFooIkJpbmFyeSBzdWJfdHlwZSBpcyBub3QgVmVjdG9yIik7aWYodGhpcy5idWZmZXJbMF0hPT15ZS5WRUNUT1JfVFlQRS5JbnQ4KXRocm93IG5ldyBaKCJCaW5hcnkgZGF0YXR5cGUgZmllbGQgaXMgbm90IEludDgiKTtyZXR1cm4gbWUodGhpcyksbmV3IEludDhBcnJheSh0aGlzLmJ1ZmZlci5idWZmZXIuc2xpY2UodGhpcy5idWZmZXIuYnl0ZU9mZnNldCsyLHRoaXMuYnVmZmVyLmJ5dGVPZmZzZXQrdGhpcy5wb3NpdGlvbikpfXRvRmxvYXQzMkFycmF5KCl7aWYodGhpcy5zdWJfdHlwZSE9PXllLlNVQlRZUEVfVkVDVE9SKXRocm93IG5ldyBaKCJCaW5hcnkgc3ViX3R5cGUgaXMgbm90IFZlY3RvciIpO2lmKHRoaXMuYnVmZmVyWzBdIT09eWUuVkVDVE9SX1RZUEUuRmxvYXQzMil0aHJvdyBuZXcgWigiQmluYXJ5IGRhdGF0eXBlIGZpZWxkIGlzIG5vdCBGbG9hdDMyIik7bWUodGhpcyk7Y29uc3QgZT1uZXcgVWludDhBcnJheSh0aGlzLmJ1ZmZlci5idWZmZXIuc2xpY2UodGhpcy5idWZmZXIuYnl0ZU9mZnNldCsyLHRoaXMuYnVmZmVyLmJ5dGVPZmZzZXQrdGhpcy5wb3NpdGlvbikpO3JldHVybiBwZS5pc0JpZ0VuZGlhbiYmX2Uuc3dhcDMyKGUpLG5ldyBGbG9hdDMyQXJyYXkoZS5idWZmZXIpfXRvUGFja2VkQml0cygpe2lmKHRoaXMuc3ViX3R5cGUhPT15ZS5TVUJUWVBFX1ZFQ1RPUil0aHJvdyBuZXcgWigiQmluYXJ5IHN1Yl90eXBlIGlzIG5vdCBWZWN0b3IiKTtpZih0aGlzLmJ1ZmZlclswXSE9PXllLlZFQ1RPUl9UWVBFLlBhY2tlZEJpdCl0aHJvdyBuZXcgWigiQmluYXJ5IGRhdGF0eXBlIGZpZWxkIGlzIG5vdCBwYWNrZWQgYml0Iik7cmV0dXJuIG1lKHRoaXMpLG5ldyBVaW50OEFycmF5KHRoaXMuYnVmZmVyLmJ1ZmZlci5zbGljZSh0aGlzLmJ1ZmZlci5ieXRlT2Zmc2V0KzIsdGhpcy5idWZmZXIuYnl0ZU9mZnNldCt0aGlzLnBvc2l0aW9uKSl9dG9CaXRzKCl7aWYodGhpcy5zdWJfdHlwZSE9PXllLlNVQlRZUEVfVkVDVE9SKXRocm93IG5ldyBaKCJCaW5hcnkgc3ViX3R5cGUgaXMgbm90IFZlY3RvciIpO2lmKHRoaXMuYnVmZmVyWzBdIT09eWUuVkVDVE9SX1RZUEUuUGFja2VkQml0KXRocm93IG5ldyBaKCJCaW5hcnkgZGF0YXR5cGUgZmllbGQgaXMgbm90IHBhY2tlZCBiaXQiKTttZSh0aGlzKTtjb25zdCBlPTgqKHRoaXMubGVuZ3RoKCktMiktdGhpcy5idWZmZXJbMV0sdD1uZXcgSW50OEFycmF5KGUpO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXtjb25zdCBuPWUvOHwwLHI9dGhpcy5idWZmZXJbbisyXT4+Ny1lJTgmMTt0W2VdPXJ9cmV0dXJuIHR9c3RhdGljIGZyb21JbnQ4QXJyYXkoZSl7Y29uc3QgdD1fZS5hbGxvY2F0ZShlLmJ5dGVMZW5ndGgrMik7dFswXT15ZS5WRUNUT1JfVFlQRS5JbnQ4LHRbMV09MDtjb25zdCBuPW5ldyBVaW50OEFycmF5KGUuYnVmZmVyLGUuYnl0ZU9mZnNldCxlLmJ5dGVMZW5ndGgpO3Quc2V0KG4sMik7Y29uc3Qgcj1uZXcgdGhpcyh0LHRoaXMuU1VCVFlQRV9WRUNUT1IpO3JldHVybiBtZShyKSxyfXN0YXRpYyBmcm9tRmxvYXQzMkFycmF5KGUpe2NvbnN0IHQ9X2UuYWxsb2NhdGUoZS5ieXRlTGVuZ3RoKzIpO3RbMF09eWUuVkVDVE9SX1RZUEUuRmxvYXQzMix0WzFdPTA7Y29uc3Qgbj1uZXcgVWludDhBcnJheShlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKTt0LnNldChuLDIpLHBlLmlzQmlnRW5kaWFuJiZfZS5zd2FwMzIobmV3IFVpbnQ4QXJyYXkodC5idWZmZXIsMikpO2NvbnN0IHI9bmV3IHRoaXModCx0aGlzLlNVQlRZUEVfVkVDVE9SKTtyZXR1cm4gbWUocikscn1zdGF0aWMgZnJvbVBhY2tlZEJpdHMoZSx0PTApe2NvbnN0IG49X2UuYWxsb2NhdGUoZS5ieXRlTGVuZ3RoKzIpO25bMF09eWUuVkVDVE9SX1RZUEUuUGFja2VkQml0LG5bMV09dCxuLnNldChlLDIpO2NvbnN0IHI9bmV3IHRoaXMobix0aGlzLlNVQlRZUEVfVkVDVE9SKTtyZXR1cm4gbWUocikscn1zdGF0aWMgZnJvbUJpdHMoZSl7Y29uc3QgdD1lLmxlbmd0aCs3Pj4+MyxuPW5ldyBVaW50OEFycmF5KHQrMik7blswXT15ZS5WRUNUT1JfVFlQRS5QYWNrZWRCaXQ7Y29uc3Qgcj1lLmxlbmd0aCU4O25bMV09MD09PXI/MDo4LXI7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2NvbnN0IHI9dD4+PjMsaT1lW3RdO2lmKDAhPT1pJiYxIT09aSl0aHJvdyBuZXcgWihgSW52YWxpZCBiaXQgdmFsdWUgYXQgJHt0fTogbXVzdCBiZSAwIG9yIDEsIGZvdW5kICR7ZVt0XX1gKTtpZigwPT09aSljb250aW51ZTtjb25zdCBvPTctdCU4O25bcisyXXw9aTw8b31yZXR1cm4gbmV3IHRoaXMobix5ZS5TVUJUWVBFX1ZFQ1RPUil9fWZ1bmN0aW9uIG1lKGUpe2lmKGUuc3ViX3R5cGUhPT15ZS5TVUJUWVBFX1ZFQ1RPUilyZXR1cm47Y29uc3QgdD1lLnBvc2l0aW9uLG49ZS5idWZmZXJbMF0scj1lLmJ1ZmZlclsxXTtpZigobj09PXllLlZFQ1RPUl9UWVBFLkZsb2F0MzJ8fG49PT15ZS5WRUNUT1JfVFlQRS5JbnQ4KSYmMCE9PXIpdGhyb3cgbmV3IFooIkludmFsaWQgVmVjdG9yOiBwYWRkaW5nIG11c3QgYmUgemVybyBmb3IgaW50OCBhbmQgZmxvYXQzMiB2ZWN0b3JzIik7aWYobj09PXllLlZFQ1RPUl9UWVBFLkZsb2F0MzImJjAhPT10JiZ0LTIhPTAmJih0LTIpJTQhPTApdGhyb3cgbmV3IFooIkludmFsaWQgVmVjdG9yOiBGbG9hdDMyIHZlY3RvciBtdXN0IGNvbnRhaW4gYSBtdWx0aXBsZSBvZiA0IGJ5dGVzIik7aWYobj09PXllLlZFQ1RPUl9UWVBFLlBhY2tlZEJpdCYmMCE9PXImJjI9PT10KXRocm93IG5ldyBaKCJJbnZhbGlkIFZlY3RvcjogcGFkZGluZyBtdXN0IGJlIHplcm8gZm9yIHBhY2tlZCBiaXQgdmVjdG9ycyB0aGF0IGFyZSBlbXB0eSIpO2lmKG49PT15ZS5WRUNUT1JfVFlQRS5QYWNrZWRCaXQmJnI+Nyl0aHJvdyBuZXcgWihgSW52YWxpZCBWZWN0b3I6IHBhZGRpbmcgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgNy4gZm91bmQ6ICR7cn1gKX1jb25zdCBTZT0vXlswLTlBLUZdezMyfSQvaSxCZT0vXlswLTlBLUZdezh9LVswLTlBLUZdezR9LVswLTlBLUZdezR9LVswLTlBLUZdezR9LVswLTlBLUZdezEyfSQvaTtjbGFzcyB4ZSBleHRlbmRzIHlle2NvbnN0cnVjdG9yKGUpe2xldCB0O2lmKG51bGw9PWUpdD14ZS5nZW5lcmF0ZSgpO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIHhlKXQ9X2UudG9Mb2NhbEJ1ZmZlclR5cGUobmV3IFVpbnQ4QXJyYXkoZS5idWZmZXIpKTtlbHNlIGlmKEFycmF5QnVmZmVyLmlzVmlldyhlKSYmMTY9PT1lLmJ5dGVMZW5ndGgpdD1fZS50b0xvY2FsQnVmZmVyVHlwZShlKTtlbHNle2lmKCJzdHJpbmciIT10eXBlb2YgZSl0aHJvdyBuZXcgWigiQXJndW1lbnQgcGFzc2VkIGluIFVVSUQgY29uc3RydWN0b3IgbXVzdCBiZSBhIFVVSUQsIGEgMTYgYnl0ZSBCdWZmZXIgb3IgYSAzMi8zNiBjaGFyYWN0ZXIgaGV4IHN0cmluZyAoZGFzaGVzIGV4Y2x1ZGVkL2luY2x1ZGVkLCBmb3JtYXQ6IHh4eHh4eHh4LXh4eHgteHh4eC14eHh4LXh4eHh4eHh4eHh4eCkuIik7dD14ZS5ieXRlc0Zyb21TdHJpbmcoZSl9c3VwZXIodCxIKX1nZXQgaWQoKXtyZXR1cm4gdGhpcy5idWZmZXJ9c2V0IGlkKGUpe3RoaXMuYnVmZmVyPWV9dG9IZXhTdHJpbmcoZT0hMCl7cmV0dXJuIGU/W19lLnRvSGV4KHRoaXMuYnVmZmVyLnN1YmFycmF5KDAsNCkpLF9lLnRvSGV4KHRoaXMuYnVmZmVyLnN1YmFycmF5KDQsNikpLF9lLnRvSGV4KHRoaXMuYnVmZmVyLnN1YmFycmF5KDYsOCkpLF9lLnRvSGV4KHRoaXMuYnVmZmVyLnN1YmFycmF5KDgsMTApKSxfZS50b0hleCh0aGlzLmJ1ZmZlci5zdWJhcnJheSgxMCwxNikpXS5qb2luKCItIik6X2UudG9IZXgodGhpcy5idWZmZXIpfXRvU3RyaW5nKGUpe3JldHVybiJoZXgiPT09ZT9fZS50b0hleCh0aGlzLmlkKToiYmFzZTY0Ij09PWU/X2UudG9CYXNlNjQodGhpcy5pZCk6dGhpcy50b0hleFN0cmluZygpfXRvSlNPTigpe3JldHVybiB0aGlzLnRvSGV4U3RyaW5nKCl9ZXF1YWxzKGUpe2lmKCFlKXJldHVybiExO2lmKGUgaW5zdGFuY2VvZiB4ZSlyZXR1cm4gX2UuZXF1YWxzKGUuaWQsdGhpcy5pZCk7dHJ5e3JldHVybiBfZS5lcXVhbHMobmV3IHhlKGUpLmlkLHRoaXMuaWQpfWNhdGNoe3JldHVybiExfX10b0JpbmFyeSgpe3JldHVybiBuZXcgeWUodGhpcy5pZCx5ZS5TVUJUWVBFX1VVSUQpfXN0YXRpYyBnZW5lcmF0ZSgpe2NvbnN0IGU9X2UucmFuZG9tQnl0ZXMoMTYpO3JldHVybiBlWzZdPTE1JmVbNl18NjQsZVs4XT02MyZlWzhdfDEyOCxlfXN0YXRpYyBpc1ZhbGlkKGUpe3JldHVybiEhZSYmKCJzdHJpbmciPT10eXBlb2YgZT94ZS5pc1ZhbGlkVVVJRFN0cmluZyhlKTpfKGUpPzE2PT09ZS5ieXRlTGVuZ3RoOiJCaW5hcnkiPT09ZS5fYnNvbnR5cGUmJmUuc3ViX3R5cGU9PT10aGlzLlNVQlRZUEVfVVVJRCYmMTY9PT1lLmJ1ZmZlci5ieXRlTGVuZ3RoKX1zdGF0aWMgY3JlYXRlRnJvbUhleFN0cmluZyhlKXtjb25zdCB0PXhlLmJ5dGVzRnJvbVN0cmluZyhlKTtyZXR1cm4gbmV3IHhlKHQpfXN0YXRpYyBjcmVhdGVGcm9tQmFzZTY0KGUpe3JldHVybiBuZXcgeGUoX2UuZnJvbUJhc2U2NChlKSl9c3RhdGljIGJ5dGVzRnJvbVN0cmluZyhlKXtpZigheGUuaXNWYWxpZFVVSURTdHJpbmcoZSkpdGhyb3cgbmV3IFooIlVVSUQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG11c3QgYmUgMzIgaGV4IGRpZ2l0cyBvciBjYW5vbmljYWwgaHlwaGVuYXRlZCByZXByZXNlbnRhdGlvbiIpO3JldHVybiBfZS5mcm9tSGV4KGUucmVwbGFjZSgvLS9nLCIiKSl9c3RhdGljIGlzVmFsaWRVVUlEU3RyaW5nKGUpe3JldHVybiBTZS50ZXN0KGUpfHxCZS50ZXN0KGUpfWluc3BlY3QoZSx0LG4pe3JldHVybiBuPz89dyxgbmV3IFVVSUQoJHtuKHRoaXMudG9IZXhTdHJpbmcoKSx0KX0pYH19Y2xhc3MgRWUgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkNvZGUifWNvZGU7c2NvcGU7Y29uc3RydWN0b3IoZSx0KXtzdXBlcigpLHRoaXMuY29kZT1lLnRvU3RyaW5nKCksdGhpcy5zY29wZT10Pz9udWxsfXRvSlNPTigpe3JldHVybiBudWxsIT10aGlzLnNjb3BlP3tjb2RlOnRoaXMuY29kZSxzY29wZTp0aGlzLnNjb3BlfTp7Y29kZTp0aGlzLmNvZGV9fXRvRXh0ZW5kZWRKU09OKCl7cmV0dXJuIHRoaXMuc2NvcGU/eyRjb2RlOnRoaXMuY29kZSwkc2NvcGU6dGhpcy5zY29wZX06eyRjb2RlOnRoaXMuY29kZX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oZSl7cmV0dXJuIG5ldyBFZShlLiRjb2RlLGUuJHNjb3BlKX1pbnNwZWN0KGUsdCxuKXtuPz89dztsZXQgcj1uKHRoaXMuY29kZSx0KTtjb25zdCBpPXIuaW5jbHVkZXMoIlxuIik7bnVsbCE9dGhpcy5zY29wZSYmKHIrPWAsJHtpPyJcbiI6IiAifSR7bih0aGlzLnNjb3BlLHQpfWApO3JldHVybmBuZXcgQ29kZSgke2k/IlxuIjoiIn0ke3J9JHtpJiZudWxsPT09dGhpcy5zY29wZT8iXG4iOiIifSlgfX1mdW5jdGlvbiBVZShlKXtyZXR1cm4gbnVsbCE9ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYiJGlkImluIGUmJm51bGwhPWUuJGlkJiYiJHJlZiJpbiBlJiYic3RyaW5nIj09dHlwZW9mIGUuJHJlZiYmKCEoIiRkYiJpbiBlKXx8IiRkYiJpbiBlJiYic3RyaW5nIj09dHlwZW9mIGUuJGRiKX1jbGFzcyBPZSBleHRlbmRzIGhle2dldCBfYnNvbnR5cGUoKXtyZXR1cm4iREJSZWYifWNvbGxlY3Rpb247b2lkO2RiO2ZpZWxkcztjb25zdHJ1Y3RvcihlLHQsbixyKXtzdXBlcigpO2NvbnN0IGk9ZS5zcGxpdCgiLiIpOzI9PT1pLmxlbmd0aCYmKG49aS5zaGlmdCgpLGU9aS5zaGlmdCgpKSx0aGlzLmNvbGxlY3Rpb249ZSx0aGlzLm9pZD10LHRoaXMuZGI9bix0aGlzLmZpZWxkcz1yfHx7fX1nZXQgbmFtZXNwYWNlKCl7cmV0dXJuIHRoaXMuY29sbGVjdGlvbn1zZXQgbmFtZXNwYWNlKGUpe3RoaXMuY29sbGVjdGlvbj1lfXRvSlNPTigpe2NvbnN0IGU9T2JqZWN0LmFzc2lnbih7JHJlZjp0aGlzLmNvbGxlY3Rpb24sJGlkOnRoaXMub2lkfSx0aGlzLmZpZWxkcyk7cmV0dXJuIG51bGwhPXRoaXMuZGImJihlLiRkYj10aGlzLmRiKSxlfXRvRXh0ZW5kZWRKU09OKGUpe2U9ZXx8e307bGV0IHQ9eyRyZWY6dGhpcy5jb2xsZWN0aW9uLCRpZDp0aGlzLm9pZH07cmV0dXJuIGUubGVnYWN5fHwodGhpcy5kYiYmKHQuJGRiPXRoaXMuZGIpLHQ9T2JqZWN0LmFzc2lnbih0LHRoaXMuZmllbGRzKSksdH1zdGF0aWMgZnJvbUV4dGVuZGVkSlNPTihlKXtjb25zdCB0PU9iamVjdC5hc3NpZ24oe30sZSk7cmV0dXJuIGRlbGV0ZSB0LiRyZWYsZGVsZXRlIHQuJGlkLGRlbGV0ZSB0LiRkYixuZXcgT2UoZS4kcmVmLGUuJGlkLGUuJGRiLHQpfWluc3BlY3QoZSx0LG4pe24/Pz13O2NvbnN0IHI9W24odGhpcy5uYW1lc3BhY2UsdCksbih0aGlzLm9pZCx0KSwuLi50aGlzLmRiP1tuKHRoaXMuZGIsdCldOltdLC4uLk9iamVjdC5rZXlzKHRoaXMuZmllbGRzKS5sZW5ndGg+MD9bbih0aGlzLmZpZWxkcyx0KV06W11dO3JldHVybiByWzFdPW49PT13P2BuZXcgT2JqZWN0SWQoJHtyWzFdfSlgOnJbMV0sYG5ldyBEQlJlZigke3Iuam9pbigiLCAiKX0pYH19ZnVuY3Rpb24gSWUoZSl7aWYoIiI9PT1lKXJldHVybiBlO2xldCB0PTA7Y29uc3Qgbj0iLSI9PT1lW3RdLHI9IisiPT09ZVt0XTsocnx8bikmJih0Kz0xKTtsZXQgaT0hMTtmb3IoO3Q8ZS5sZW5ndGgmJiIwIj09PWVbdF07Kyt0KWk9ITA7cmV0dXJuIGk/YCR7bj8iLSI6IiJ9JHtlLmxlbmd0aD09PXQ/IjAiOmUuc2xpY2UodCl9YDpyP2Uuc2xpY2UoMSk6ZX1sZXQgTmU7dHJ5e05lPW5ldyBXZWJBc3NlbWJseS5JbnN0YW5jZShuZXcgV2ViQXNzZW1ibHkuTW9kdWxlKG5ldyBVaW50OEFycmF5KFswLDk3LDExNSwxMDksMSwwLDAsMCwxLDEzLDIsOTYsMCwxLDEyNyw5Niw0LDEyNywxMjcsMTI3LDEyNywxLDEyNywzLDcsNiwwLDEsMSwxLDEsMSw2LDYsMSwxMjcsMSw2NSwwLDExLDcsNTAsNiwzLDEwOSwxMTcsMTA4LDAsMSw1LDEwMCwxMDUsMTE4LDk1LDExNSwwLDIsNSwxMDAsMTA1LDExOCw5NSwxMTcsMCwzLDUsMTE0LDEwMSwxMDksOTUsMTE1LDAsNCw1LDExNCwxMDEsMTA5LDk1LDExNywwLDUsOCwxMDMsMTAxLDExNiw5NSwxMDQsMTA1LDEwMywxMDQsMCwwLDEwLDE5MSwxLDYsNCwwLDM1LDAsMTEsMzYsMSwxLDEyNiwzMiwwLDE3MywzMiwxLDE3Myw2NiwzMiwxMzQsMTMyLDMyLDIsMTczLDMyLDMsMTczLDY2LDMyLDEzNCwxMzIsMTI2LDM0LDQsNjYsMzIsMTM1LDE2NywzNiwwLDMyLDQsMTY3LDExLDM2LDEsMSwxMjYsMzIsMCwxNzMsMzIsMSwxNzMsNjYsMzIsMTM0LDEzMiwzMiwyLDE3MywzMiwzLDE3Myw2NiwzMiwxMzQsMTMyLDEyNywzNCw0LDY2LDMyLDEzNSwxNjcsMzYsMCwzMiw0LDE2NywxMSwzNiwxLDEsMTI2LDMyLDAsMTczLDMyLDEsMTczLDY2LDMyLDEzNCwxMzIsMzIsMiwxNzMsMzIsMywxNzMsNjYsMzIsMTM0LDEzMiwxMjgsMzQsNCw2NiwzMiwxMzUsMTY3LDM2LDAsMzIsNCwxNjcsMTEsMzYsMSwxLDEyNiwzMiwwLDE3MywzMiwxLDE3Myw2NiwzMiwxMzQsMTMyLDMyLDIsMTczLDMyLDMsMTczLDY2LDMyLDEzNCwxMzIsMTI5LDM0LDQsNjYsMzIsMTM1LDE2NywzNiwwLDMyLDQsMTY3LDExLDM2LDEsMSwxMjYsMzIsMCwxNzMsMzIsMSwxNzMsNjYsMzIsMTM0LDEzMiwzMiwyLDE3MywzMiwzLDE3Myw2NiwzMiwxMzQsMTMyLDEzMCwzNCw0LDY2LDMyLDEzNSwxNjcsMzYsMCwzMiw0LDE2NywxMV0pKSx7fSkuZXhwb3J0c31jYXRjaHt9Y29uc3QgdmU9NDI5NDk2NzI5NixUZT0weDEwMDAwMDAwMDAwMDAwMDAwLCRlPVRlLzIsTGU9e30sQWU9e30sUmU9L14oXCs/MHwoXCt8LSk/WzEtOV1bMC05XSopJC87Y2xhc3MgamUgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkxvbmcifWdldCBfX2lzTG9uZ19fKCl7cmV0dXJuITB9aGlnaDtsb3c7dW5zaWduZWQ7Y29uc3RydWN0b3IoZT0wLHQsbil7c3VwZXIoKTtjb25zdCByPSJib29sZWFuIj09dHlwZW9mIHQ/dDpCb29sZWFuKG4pLGk9Im51bWJlciI9PXR5cGVvZiB0P3Q6MCxvPSJzdHJpbmciPT10eXBlb2YgZT9qZS5mcm9tU3RyaW5nKGUscik6ImJpZ2ludCI9PXR5cGVvZiBlP2plLmZyb21CaWdJbnQoZSxyKTp7bG93OjB8ZSxoaWdoOjB8aSx1bnNpZ25lZDpyfTt0aGlzLmxvdz1vLmxvdyx0aGlzLmhpZ2g9by5oaWdoLHRoaXMudW5zaWduZWQ9by51bnNpZ25lZH1zdGF0aWMgVFdPX1BXUl8yND1qZS5mcm9tSW50KDE2Nzc3MjE2KTtzdGF0aWMgTUFYX1VOU0lHTkVEX1ZBTFVFPWplLmZyb21CaXRzKC0xLC0xLCEwKTtzdGF0aWMgWkVSTz1qZS5mcm9tSW50KDApO3N0YXRpYyBVWkVSTz1qZS5mcm9tSW50KDAsITApO3N0YXRpYyBPTkU9amUuZnJvbUludCgxKTtzdGF0aWMgVU9ORT1qZS5mcm9tSW50KDEsITApO3N0YXRpYyBORUdfT05FPWplLmZyb21JbnQoLTEpO3N0YXRpYyBNQVhfVkFMVUU9amUuZnJvbUJpdHMoLTEsMjE0NzQ4MzY0NywhMSk7c3RhdGljIE1JTl9WQUxVRT1qZS5mcm9tQml0cygwLC0yMTQ3NDgzNjQ4LCExKTtzdGF0aWMgZnJvbUJpdHMoZSx0LG4pe3JldHVybiBuZXcgamUoZSx0LG4pfXN0YXRpYyBmcm9tSW50KGUsdCl7bGV0IG4scixpO3JldHVybiB0PyhpPTA8PShlPj4+PTApJiZlPDI1NikmJihyPUFlW2VdLHIpP3I6KG49amUuZnJvbUJpdHMoZSwoMHxlKTwwPy0xOjAsITApLGkmJihBZVtlXT1uKSxuKTooaT0tMTI4PD0oZXw9MCkmJmU8MTI4KSYmKHI9TGVbZV0scik/cjoobj1qZS5mcm9tQml0cyhlLGU8MD8tMTowLCExKSxpJiYoTGVbZV09biksbil9c3RhdGljIGZyb21OdW1iZXIoZSx0KXtpZihpc05hTihlKSlyZXR1cm4gdD9qZS5VWkVSTzpqZS5aRVJPO2lmKHQpe2lmKGU8MClyZXR1cm4gamUuVVpFUk87aWYoZT49VGUpcmV0dXJuIGplLk1BWF9VTlNJR05FRF9WQUxVRX1lbHNle2lmKGU8PS0kZSlyZXR1cm4gamUuTUlOX1ZBTFVFO2lmKGUrMT49JGUpcmV0dXJuIGplLk1BWF9WQUxVRX1yZXR1cm4gZTwwP2plLmZyb21OdW1iZXIoLWUsdCkubmVnKCk6amUuZnJvbUJpdHMoZSV2ZXwwLGUvdmV8MCx0KX1zdGF0aWMgZnJvbUJpZ0ludChlLHQpe2NvbnN0IG49MHhmZmZmZmZmZm47cmV0dXJuIG5ldyBqZShOdW1iZXIoZSZuKSxOdW1iZXIoZT4+MzJuJm4pLHQpfXN0YXRpYyBfZnJvbVN0cmluZyhlLHQsbil7aWYoMD09PWUubGVuZ3RoKXRocm93IG5ldyBaKCJlbXB0eSBzdHJpbmciKTtpZihuPDJ8fDM2PG4pdGhyb3cgbmV3IFooInJhZGl4Iik7bGV0IHI7aWYoKHI9ZS5pbmRleE9mKCItIikpPjApdGhyb3cgbmV3IFooImludGVyaW9yIGh5cGhlbiIpO2lmKDA9PT1yKXJldHVybiBqZS5fZnJvbVN0cmluZyhlLnN1YnN0cmluZygxKSx0LG4pLm5lZygpO2NvbnN0IGk9amUuZnJvbU51bWJlcihNYXRoLnBvdyhuLDgpKTtsZXQgbz1qZS5aRVJPO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCs9OCl7Y29uc3Qgcj1NYXRoLm1pbig4LGUubGVuZ3RoLXQpLHM9cGFyc2VJbnQoZS5zdWJzdHJpbmcodCx0K3IpLG4pO2lmKHI8OCl7Y29uc3QgZT1qZS5mcm9tTnVtYmVyKE1hdGgucG93KG4scikpO289by5tdWwoZSkuYWRkKGplLmZyb21OdW1iZXIocykpfWVsc2Ugbz1vLm11bChpKSxvPW8uYWRkKGplLmZyb21OdW1iZXIocykpfXJldHVybiBvLnVuc2lnbmVkPXQsb31zdGF0aWMgZnJvbVN0cmluZ1N0cmljdChlLHQsbil7bGV0IHI9ITE7aWYoIm51bWJlciI9PXR5cGVvZiB0PyhuPXQsdD0hMSk6cj0hIXQsbj8/PTEwLGUudHJpbSgpIT09ZSl0aHJvdyBuZXcgWihgSW5wdXQ6ICcke2V9JyBjb250YWlucyBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyB3aGl0ZXNwYWNlYCk7aWYoIWZ1bmN0aW9uKGUsdCl7Y29uc3Qgbj0iMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Ii5zbGljZSgwLHQ9dD8/MTApO3JldHVybiFuZXcgUmVnRXhwKGBbXi0rJHtufV1gLCJpIikudGVzdChlKSYmZX0oZSxuKSl0aHJvdyBuZXcgWihgSW5wdXQ6ICcke2V9JyBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgZm9yIHJhZGl4OiAke259YCk7Y29uc3QgaT1JZShlKSxvPWplLl9mcm9tU3RyaW5nKGkscixuKTtpZihvLnRvU3RyaW5nKG4pLnRvTG93ZXJDYXNlKCkhPT1pLnRvTG93ZXJDYXNlKCkpdGhyb3cgbmV3IFooYElucHV0OiAke2V9IGlzIG5vdCByZXByZXNlbnRhYmxlIGFzICR7by51bnNpZ25lZD8iYW4gdW5zaWduZWQiOiJhIHNpZ25lZCJ9IDY0LWJpdCBMb25nICR7bnVsbCE9bj9gd2l0aCByYWRpeDogJHtufWA6IiJ9YCk7cmV0dXJuIG99c3RhdGljIGZyb21TdHJpbmcoZSx0LG4pe2xldCByPSExO3JldHVybiJudW1iZXIiPT10eXBlb2YgdD8obj10LHQ9ITEpOnI9ISF0LG4/Pz0xMCwiTmFOIj09PWUmJm48MjR8fCgiSW5maW5pdHkiPT09ZXx8IitJbmZpbml0eSI9PT1lfHwiLUluZmluaXR5Ij09PWUpJiZuPDM1P2plLlpFUk86amUuX2Zyb21TdHJpbmcoZSxyLG4pfXN0YXRpYyBmcm9tQnl0ZXMoZSx0LG4pe3JldHVybiBuP2plLmZyb21CeXRlc0xFKGUsdCk6amUuZnJvbUJ5dGVzQkUoZSx0KX1zdGF0aWMgZnJvbUJ5dGVzTEUoZSx0KXtyZXR1cm4gbmV3IGplKGVbMF18ZVsxXTw8OHxlWzJdPDwxNnxlWzNdPDwyNCxlWzRdfGVbNV08PDh8ZVs2XTw8MTZ8ZVs3XTw8MjQsdCl9c3RhdGljIGZyb21CeXRlc0JFKGUsdCl7cmV0dXJuIG5ldyBqZShlWzRdPDwyNHxlWzVdPDwxNnxlWzZdPDw4fGVbN10sZVswXTw8MjR8ZVsxXTw8MTZ8ZVsyXTw8OHxlWzNdLHQpfXN0YXRpYyBpc0xvbmcoZSl7cmV0dXJuIG51bGwhPWUmJiJvYmplY3QiPT10eXBlb2YgZSYmIl9faXNMb25nX18iaW4gZSYmITA9PT1lLl9faXNMb25nX199c3RhdGljIGZyb21WYWx1ZShlLHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZT9qZS5mcm9tTnVtYmVyKGUsdCk6InN0cmluZyI9PXR5cGVvZiBlP2plLmZyb21TdHJpbmcoZSx0KTpqZS5mcm9tQml0cyhlLmxvdyxlLmhpZ2gsImJvb2xlYW4iPT10eXBlb2YgdD90OmUudW5zaWduZWQpfWFkZChlKXtqZS5pc0xvbmcoZSl8fChlPWplLmZyb21WYWx1ZShlKSk7Y29uc3QgdD10aGlzLmhpZ2g+Pj4xNixuPTY1NTM1JnRoaXMuaGlnaCxyPXRoaXMubG93Pj4+MTYsaT02NTUzNSZ0aGlzLmxvdyxvPWUuaGlnaD4+PjE2LHM9NjU1MzUmZS5oaWdoLGE9ZS5sb3c+Pj4xNjtsZXQgYz0wLGY9MCxsPTAsdT0wO3JldHVybiB1Kz1pKyg2NTUzNSZlLmxvdyksbCs9dT4+PjE2LHUmPTY1NTM1LGwrPXIrYSxmKz1sPj4+MTYsbCY9NjU1MzUsZis9bitzLGMrPWY+Pj4xNixmJj02NTUzNSxjKz10K28sYyY9NjU1MzUsamUuZnJvbUJpdHMobDw8MTZ8dSxjPDwxNnxmLHRoaXMudW5zaWduZWQpfWFuZChlKXtyZXR1cm4gamUuaXNMb25nKGUpfHwoZT1qZS5mcm9tVmFsdWUoZSkpLGplLmZyb21CaXRzKHRoaXMubG93JmUubG93LHRoaXMuaGlnaCZlLmhpZ2gsdGhpcy51bnNpZ25lZCl9Y29tcGFyZShlKXtpZihqZS5pc0xvbmcoZSl8fChlPWplLmZyb21WYWx1ZShlKSksdGhpcy5lcShlKSlyZXR1cm4gMDtjb25zdCB0PXRoaXMuaXNOZWdhdGl2ZSgpLG49ZS5pc05lZ2F0aXZlKCk7cmV0dXJuIHQmJiFuPy0xOiF0JiZuPzE6dGhpcy51bnNpZ25lZD9lLmhpZ2g+Pj4wPnRoaXMuaGlnaD4+PjB8fGUuaGlnaD09PXRoaXMuaGlnaCYmZS5sb3c+Pj4wPnRoaXMubG93Pj4+MD8tMToxOnRoaXMuc3ViKGUpLmlzTmVnYXRpdmUoKT8tMToxfWNvbXAoZSl7cmV0dXJuIHRoaXMuY29tcGFyZShlKX1kaXZpZGUoZSl7aWYoamUuaXNMb25nKGUpfHwoZT1qZS5mcm9tVmFsdWUoZSkpLGUuaXNaZXJvKCkpdGhyb3cgbmV3IFooImRpdmlzaW9uIGJ5IHplcm8iKTtpZihOZSl7aWYoIXRoaXMudW5zaWduZWQmJi0yMTQ3NDgzNjQ4PT09dGhpcy5oaWdoJiYtMT09PWUubG93JiYtMT09PWUuaGlnaClyZXR1cm4gdGhpcztjb25zdCB0PSh0aGlzLnVuc2lnbmVkP05lLmRpdl91Ok5lLmRpdl9zKSh0aGlzLmxvdyx0aGlzLmhpZ2gsZS5sb3csZS5oaWdoKTtyZXR1cm4gamUuZnJvbUJpdHModCxOZS5nZXRfaGlnaCgpLHRoaXMudW5zaWduZWQpfWlmKHRoaXMuaXNaZXJvKCkpcmV0dXJuIHRoaXMudW5zaWduZWQ/amUuVVpFUk86amUuWkVSTztsZXQgdCxuLHI7aWYodGhpcy51bnNpZ25lZCl7aWYoZS51bnNpZ25lZHx8KGU9ZS50b1Vuc2lnbmVkKCkpLGUuZ3QodGhpcykpcmV0dXJuIGplLlVaRVJPO2lmKGUuZ3QodGhpcy5zaHJ1KDEpKSlyZXR1cm4gamUuVU9ORTtyPWplLlVaRVJPfWVsc2V7aWYodGhpcy5lcShqZS5NSU5fVkFMVUUpKXtpZihlLmVxKGplLk9ORSl8fGUuZXEoamUuTkVHX09ORSkpcmV0dXJuIGplLk1JTl9WQUxVRTtpZihlLmVxKGplLk1JTl9WQUxVRSkpcmV0dXJuIGplLk9ORTtyZXR1cm4gdD10aGlzLnNocigxKS5kaXYoZSkuc2hsKDEpLHQuZXEoamUuWkVSTyk/ZS5pc05lZ2F0aXZlKCk/amUuT05FOmplLk5FR19PTkU6KG49dGhpcy5zdWIoZS5tdWwodCkpLHI9dC5hZGQobi5kaXYoZSkpLHIpfWlmKGUuZXEoamUuTUlOX1ZBTFVFKSlyZXR1cm4gdGhpcy51bnNpZ25lZD9qZS5VWkVSTzpqZS5aRVJPO2lmKHRoaXMuaXNOZWdhdGl2ZSgpKXJldHVybiBlLmlzTmVnYXRpdmUoKT90aGlzLm5lZygpLmRpdihlLm5lZygpKTp0aGlzLm5lZygpLmRpdihlKS5uZWcoKTtpZihlLmlzTmVnYXRpdmUoKSlyZXR1cm4gdGhpcy5kaXYoZS5uZWcoKSkubmVnKCk7cj1qZS5aRVJPfWZvcihuPXRoaXM7bi5ndGUoZSk7KXt0PU1hdGgubWF4KDEsTWF0aC5mbG9vcihuLnRvTnVtYmVyKCkvZS50b051bWJlcigpKSk7Y29uc3QgaT1NYXRoLmNlaWwoTWF0aC5sb2codCkvTWF0aC5MTjIpLG89aTw9NDg/MTpNYXRoLnBvdygyLGktNDgpO2xldCBzPWplLmZyb21OdW1iZXIodCksYT1zLm11bChlKTtmb3IoO2EuaXNOZWdhdGl2ZSgpfHxhLmd0KG4pOyl0LT1vLHM9amUuZnJvbU51bWJlcih0LHRoaXMudW5zaWduZWQpLGE9cy5tdWwoZSk7cy5pc1plcm8oKSYmKHM9amUuT05FKSxyPXIuYWRkKHMpLG49bi5zdWIoYSl9cmV0dXJuIHJ9ZGl2KGUpe3JldHVybiB0aGlzLmRpdmlkZShlKX1lcXVhbHMoZSl7cmV0dXJuIGplLmlzTG9uZyhlKXx8KGU9amUuZnJvbVZhbHVlKGUpKSwodGhpcy51bnNpZ25lZD09PWUudW5zaWduZWR8fHRoaXMuaGlnaD4+PjMxIT0xfHxlLmhpZ2g+Pj4zMSE9MSkmJih0aGlzLmhpZ2g9PT1lLmhpZ2gmJnRoaXMubG93PT09ZS5sb3cpfWVxKGUpe3JldHVybiB0aGlzLmVxdWFscyhlKX1nZXRIaWdoQml0cygpe3JldHVybiB0aGlzLmhpZ2h9Z2V0SGlnaEJpdHNVbnNpZ25lZCgpe3JldHVybiB0aGlzLmhpZ2g+Pj4wfWdldExvd0JpdHMoKXtyZXR1cm4gdGhpcy5sb3d9Z2V0TG93Qml0c1Vuc2lnbmVkKCl7cmV0dXJuIHRoaXMubG93Pj4+MH1nZXROdW1CaXRzQWJzKCl7aWYodGhpcy5pc05lZ2F0aXZlKCkpcmV0dXJuIHRoaXMuZXEoamUuTUlOX1ZBTFVFKT82NDp0aGlzLm5lZygpLmdldE51bUJpdHNBYnMoKTtjb25zdCBlPTAhPT10aGlzLmhpZ2g/dGhpcy5oaWdoOnRoaXMubG93O2xldCB0O2Zvcih0PTMxO3Q+MCYmIShlJjE8PHQpO3QtLSk7cmV0dXJuIDAhPT10aGlzLmhpZ2g/dCszMzp0KzF9Z3JlYXRlclRoYW4oZSl7cmV0dXJuIHRoaXMuY29tcChlKT4wfWd0KGUpe3JldHVybiB0aGlzLmdyZWF0ZXJUaGFuKGUpfWdyZWF0ZXJUaGFuT3JFcXVhbChlKXtyZXR1cm4gdGhpcy5jb21wKGUpPj0wfWd0ZShlKXtyZXR1cm4gdGhpcy5ncmVhdGVyVGhhbk9yRXF1YWwoZSl9Z2UoZSl7cmV0dXJuIHRoaXMuZ3JlYXRlclRoYW5PckVxdWFsKGUpfWlzRXZlbigpe3JldHVybiEoMSZ0aGlzLmxvdyl9aXNOZWdhdGl2ZSgpe3JldHVybiF0aGlzLnVuc2lnbmVkJiZ0aGlzLmhpZ2g8MH1pc09kZCgpe3JldHVybiEoMSZ+dGhpcy5sb3cpfWlzUG9zaXRpdmUoKXtyZXR1cm4gdGhpcy51bnNpZ25lZHx8dGhpcy5oaWdoPj0wfWlzWmVybygpe3JldHVybiAwPT09dGhpcy5oaWdoJiYwPT09dGhpcy5sb3d9bGVzc1RoYW4oZSl7cmV0dXJuIHRoaXMuY29tcChlKTwwfWx0KGUpe3JldHVybiB0aGlzLmxlc3NUaGFuKGUpfWxlc3NUaGFuT3JFcXVhbChlKXtyZXR1cm4gdGhpcy5jb21wKGUpPD0wfWx0ZShlKXtyZXR1cm4gdGhpcy5sZXNzVGhhbk9yRXF1YWwoZSl9bW9kdWxvKGUpe2lmKGplLmlzTG9uZyhlKXx8KGU9amUuZnJvbVZhbHVlKGUpKSxOZSl7Y29uc3QgdD0odGhpcy51bnNpZ25lZD9OZS5yZW1fdTpOZS5yZW1fcykodGhpcy5sb3csdGhpcy5oaWdoLGUubG93LGUuaGlnaCk7cmV0dXJuIGplLmZyb21CaXRzKHQsTmUuZ2V0X2hpZ2goKSx0aGlzLnVuc2lnbmVkKX1yZXR1cm4gdGhpcy5zdWIodGhpcy5kaXYoZSkubXVsKGUpKX1tb2QoZSl7cmV0dXJuIHRoaXMubW9kdWxvKGUpfXJlbShlKXtyZXR1cm4gdGhpcy5tb2R1bG8oZSl9bXVsdGlwbHkoZSl7aWYodGhpcy5pc1plcm8oKSlyZXR1cm4gamUuWkVSTztpZihqZS5pc0xvbmcoZSl8fChlPWplLmZyb21WYWx1ZShlKSksTmUpe2NvbnN0IHQ9TmUubXVsKHRoaXMubG93LHRoaXMuaGlnaCxlLmxvdyxlLmhpZ2gpO3JldHVybiBqZS5mcm9tQml0cyh0LE5lLmdldF9oaWdoKCksdGhpcy51bnNpZ25lZCl9aWYoZS5pc1plcm8oKSlyZXR1cm4gamUuWkVSTztpZih0aGlzLmVxKGplLk1JTl9WQUxVRSkpcmV0dXJuIGUuaXNPZGQoKT9qZS5NSU5fVkFMVUU6amUuWkVSTztpZihlLmVxKGplLk1JTl9WQUxVRSkpcmV0dXJuIHRoaXMuaXNPZGQoKT9qZS5NSU5fVkFMVUU6amUuWkVSTztpZih0aGlzLmlzTmVnYXRpdmUoKSlyZXR1cm4gZS5pc05lZ2F0aXZlKCk/dGhpcy5uZWcoKS5tdWwoZS5uZWcoKSk6dGhpcy5uZWcoKS5tdWwoZSkubmVnKCk7aWYoZS5pc05lZ2F0aXZlKCkpcmV0dXJuIHRoaXMubXVsKGUubmVnKCkpLm5lZygpO2lmKHRoaXMubHQoamUuVFdPX1BXUl8yNCkmJmUubHQoamUuVFdPX1BXUl8yNCkpcmV0dXJuIGplLmZyb21OdW1iZXIodGhpcy50b051bWJlcigpKmUudG9OdW1iZXIoKSx0aGlzLnVuc2lnbmVkKTtjb25zdCB0PXRoaXMuaGlnaD4+PjE2LG49NjU1MzUmdGhpcy5oaWdoLHI9dGhpcy5sb3c+Pj4xNixpPTY1NTM1JnRoaXMubG93LG89ZS5oaWdoPj4+MTYscz02NTUzNSZlLmhpZ2gsYT1lLmxvdz4+PjE2LGM9NjU1MzUmZS5sb3c7bGV0IGY9MCxsPTAsdT0wLF89MDtyZXR1cm4gXys9aSpjLHUrPV8+Pj4xNixfJj02NTUzNSx1Kz1yKmMsbCs9dT4+PjE2LHUmPTY1NTM1LHUrPWkqYSxsKz11Pj4+MTYsdSY9NjU1MzUsbCs9bipjLGYrPWw+Pj4xNixsJj02NTUzNSxsKz1yKmEsZis9bD4+PjE2LGwmPTY1NTM1LGwrPWkqcyxmKz1sPj4+MTYsbCY9NjU1MzUsZis9dCpjK24qYStyKnMraSpvLGYmPTY1NTM1LGplLmZyb21CaXRzKHU8PDE2fF8sZjw8MTZ8bCx0aGlzLnVuc2lnbmVkKX1tdWwoZSl7cmV0dXJuIHRoaXMubXVsdGlwbHkoZSl9bmVnYXRlKCl7cmV0dXJuIXRoaXMudW5zaWduZWQmJnRoaXMuZXEoamUuTUlOX1ZBTFVFKT9qZS5NSU5fVkFMVUU6dGhpcy5ub3QoKS5hZGQoamUuT05FKX1uZWcoKXtyZXR1cm4gdGhpcy5uZWdhdGUoKX1ub3QoKXtyZXR1cm4gamUuZnJvbUJpdHMofnRoaXMubG93LH50aGlzLmhpZ2gsdGhpcy51bnNpZ25lZCl9bm90RXF1YWxzKGUpe3JldHVybiF0aGlzLmVxdWFscyhlKX1uZXEoZSl7cmV0dXJuIHRoaXMubm90RXF1YWxzKGUpfW5lKGUpe3JldHVybiB0aGlzLm5vdEVxdWFscyhlKX1vcihlKXtyZXR1cm4gamUuaXNMb25nKGUpfHwoZT1qZS5mcm9tVmFsdWUoZSkpLGplLmZyb21CaXRzKHRoaXMubG93fGUubG93LHRoaXMuaGlnaHxlLmhpZ2gsdGhpcy51bnNpZ25lZCl9c2hpZnRMZWZ0KGUpe3JldHVybiBqZS5pc0xvbmcoZSkmJihlPWUudG9JbnQoKSksMD09KGUmPTYzKT90aGlzOmU8MzI/amUuZnJvbUJpdHModGhpcy5sb3c8PGUsdGhpcy5oaWdoPDxlfHRoaXMubG93Pj4+MzItZSx0aGlzLnVuc2lnbmVkKTpqZS5mcm9tQml0cygwLHRoaXMubG93PDxlLTMyLHRoaXMudW5zaWduZWQpfXNobChlKXtyZXR1cm4gdGhpcy5zaGlmdExlZnQoZSl9c2hpZnRSaWdodChlKXtyZXR1cm4gamUuaXNMb25nKGUpJiYoZT1lLnRvSW50KCkpLDA9PShlJj02Myk/dGhpczplPDMyP2plLmZyb21CaXRzKHRoaXMubG93Pj4+ZXx0aGlzLmhpZ2g8PDMyLWUsdGhpcy5oaWdoPj5lLHRoaXMudW5zaWduZWQpOmplLmZyb21CaXRzKHRoaXMuaGlnaD4+ZS0zMix0aGlzLmhpZ2g+PTA/MDotMSx0aGlzLnVuc2lnbmVkKX1zaHIoZSl7cmV0dXJuIHRoaXMuc2hpZnRSaWdodChlKX1zaGlmdFJpZ2h0VW5zaWduZWQoZSl7aWYoamUuaXNMb25nKGUpJiYoZT1lLnRvSW50KCkpLDA9PT0oZSY9NjMpKXJldHVybiB0aGlzO3tjb25zdCB0PXRoaXMuaGlnaDtpZihlPDMyKXtjb25zdCBuPXRoaXMubG93O3JldHVybiBqZS5mcm9tQml0cyhuPj4+ZXx0PDwzMi1lLHQ+Pj5lLHRoaXMudW5zaWduZWQpfXJldHVybiAzMj09PWU/amUuZnJvbUJpdHModCwwLHRoaXMudW5zaWduZWQpOmplLmZyb21CaXRzKHQ+Pj5lLTMyLDAsdGhpcy51bnNpZ25lZCl9fXNocl91KGUpe3JldHVybiB0aGlzLnNoaWZ0UmlnaHRVbnNpZ25lZChlKX1zaHJ1KGUpe3JldHVybiB0aGlzLnNoaWZ0UmlnaHRVbnNpZ25lZChlKX1zdWJ0cmFjdChlKXtyZXR1cm4gamUuaXNMb25nKGUpfHwoZT1qZS5mcm9tVmFsdWUoZSkpLHRoaXMuYWRkKGUubmVnKCkpfXN1YihlKXtyZXR1cm4gdGhpcy5zdWJ0cmFjdChlKX10b0ludCgpe3JldHVybiB0aGlzLnVuc2lnbmVkP3RoaXMubG93Pj4+MDp0aGlzLmxvd310b051bWJlcigpe3JldHVybiB0aGlzLnVuc2lnbmVkPyh0aGlzLmhpZ2g+Pj4wKSp2ZSsodGhpcy5sb3c+Pj4wKTp0aGlzLmhpZ2gqdmUrKHRoaXMubG93Pj4+MCl9dG9CaWdJbnQoKXtyZXR1cm4gQmlnSW50KHRoaXMudG9TdHJpbmcoKSl9dG9CeXRlcyhlKXtyZXR1cm4gZT90aGlzLnRvQnl0ZXNMRSgpOnRoaXMudG9CeXRlc0JFKCl9dG9CeXRlc0xFKCl7Y29uc3QgZT10aGlzLmhpZ2gsdD10aGlzLmxvdztyZXR1cm5bMjU1JnQsdD4+PjgmMjU1LHQ+Pj4xNiYyNTUsdD4+PjI0LDI1NSZlLGU+Pj44JjI1NSxlPj4+MTYmMjU1LGU+Pj4yNF19dG9CeXRlc0JFKCl7Y29uc3QgZT10aGlzLmhpZ2gsdD10aGlzLmxvdztyZXR1cm5bZT4+PjI0LGU+Pj4xNiYyNTUsZT4+PjgmMjU1LDI1NSZlLHQ+Pj4yNCx0Pj4+MTYmMjU1LHQ+Pj44JjI1NSwyNTUmdF19dG9TaWduZWQoKXtyZXR1cm4gdGhpcy51bnNpZ25lZD9qZS5mcm9tQml0cyh0aGlzLmxvdyx0aGlzLmhpZ2gsITEpOnRoaXN9dG9TdHJpbmcoZSl7aWYoKGU9ZXx8MTApPDJ8fDM2PGUpdGhyb3cgbmV3IFooInJhZGl4Iik7aWYodGhpcy5pc1plcm8oKSlyZXR1cm4iMCI7aWYodGhpcy5pc05lZ2F0aXZlKCkpe2lmKHRoaXMuZXEoamUuTUlOX1ZBTFVFKSl7Y29uc3QgdD1qZS5mcm9tTnVtYmVyKGUpLG49dGhpcy5kaXYodCkscj1uLm11bCh0KS5zdWIodGhpcyk7cmV0dXJuIG4udG9TdHJpbmcoZSkrci50b0ludCgpLnRvU3RyaW5nKGUpfXJldHVybiItIit0aGlzLm5lZygpLnRvU3RyaW5nKGUpfWNvbnN0IHQ9amUuZnJvbU51bWJlcihNYXRoLnBvdyhlLDYpLHRoaXMudW5zaWduZWQpO2xldCBuPXRoaXMscj0iIjtmb3IoOzspe2NvbnN0IGk9bi5kaXYodCk7bGV0IG89KG4uc3ViKGkubXVsKHQpKS50b0ludCgpPj4+MCkudG9TdHJpbmcoZSk7aWYobj1pLG4uaXNaZXJvKCkpcmV0dXJuIG8rcjtmb3IoO28ubGVuZ3RoPDY7KW89IjAiK287cj0iIitvK3J9fXRvVW5zaWduZWQoKXtyZXR1cm4gdGhpcy51bnNpZ25lZD90aGlzOmplLmZyb21CaXRzKHRoaXMubG93LHRoaXMuaGlnaCwhMCl9eG9yKGUpe3JldHVybiBqZS5pc0xvbmcoZSl8fChlPWplLmZyb21WYWx1ZShlKSksamUuZnJvbUJpdHModGhpcy5sb3deZS5sb3csdGhpcy5oaWdoXmUuaGlnaCx0aGlzLnVuc2lnbmVkKX1lcXooKXtyZXR1cm4gdGhpcy5pc1plcm8oKX1sZShlKXtyZXR1cm4gdGhpcy5sZXNzVGhhbk9yRXF1YWwoZSl9dG9FeHRlbmRlZEpTT04oZSl7cmV0dXJuIGUmJmUucmVsYXhlZD90aGlzLnRvTnVtYmVyKCk6eyRudW1iZXJMb25nOnRoaXMudG9TdHJpbmcoKX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oZSx0KXtjb25zdHt1c2VCaWdJbnQ2NDpuPSExLHJlbGF4ZWQ6cj0hMH09ey4uLnR9O2lmKGUuJG51bWJlckxvbmcubGVuZ3RoPjIwKXRocm93IG5ldyBaKCIkbnVtYmVyTG9uZyBzdHJpbmcgaXMgdG9vIGxvbmciKTtpZighUmUudGVzdChlLiRudW1iZXJMb25nKSl0aHJvdyBuZXcgWihgJG51bWJlckxvbmcgc3RyaW5nICIke2UuJG51bWJlckxvbmd9IiBpcyBpbiBhbiBpbnZhbGlkIGZvcm1hdGApO2lmKG4pe2NvbnN0IHQ9QmlnSW50KGUuJG51bWJlckxvbmcpO3JldHVybiBCaWdJbnQuYXNJbnROKDY0LHQpfWNvbnN0IGk9amUuZnJvbVN0cmluZyhlLiRudW1iZXJMb25nKTtyZXR1cm4gcj9pLnRvTnVtYmVyKCk6aX1pbnNwZWN0KGUsdCxuKXtuPz89dztyZXR1cm5gbmV3IExvbmcoJHtuKHRoaXMudG9TdHJpbmcoKSx0KX0ke3RoaXMudW5zaWduZWQ/YCwgJHtuKHRoaXMudW5zaWduZWQsdCl9YDoiIn0pYH19Y29uc3QgRmU9L14oXCt8LSk/KFxkK3woXGQqXC5cZCopKT8oRXxlKT8oWy0rXSk/KFxkKyk/JC8sa2U9L14oXCt8LSk/KEluZmluaXR5fGluZikkL2ksemU9L14oXCt8LSk/TmFOJC9pLERlPTYxMTEsQ2U9LTYxNzYsTWU9X2UuZnJvbU51bWJlckFycmF5KFsxMjQsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDBdLnJldmVyc2UoKSksVmU9X2UuZnJvbU51bWJlckFycmF5KFsyNDgsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDBdLnJldmVyc2UoKSksUGU9X2UuZnJvbU51bWJlckFycmF5KFsxMjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDBdLnJldmVyc2UoKSksSmU9L14oWy0rXSk/KFxkKyk/JC87ZnVuY3Rpb24gV2UoZSl7cmV0dXJuIWlzTmFOKHBhcnNlSW50KGUsMTApKX1mdW5jdGlvbiBZZShlKXtjb25zdCB0PWplLmZyb21OdW1iZXIoMWU5KTtsZXQgbj1qZS5mcm9tTnVtYmVyKDApO2lmKCEoZS5wYXJ0c1swXXx8ZS5wYXJ0c1sxXXx8ZS5wYXJ0c1syXXx8ZS5wYXJ0c1szXSkpcmV0dXJue3F1b3RpZW50OmUscmVtOm59O2ZvcihsZXQgcj0wO3I8PTM7cisrKW49bi5zaGlmdExlZnQoMzIpLG49bi5hZGQobmV3IGplKGUucGFydHNbcl0sMCkpLGUucGFydHNbcl09bi5kaXYodCkubG93LG49bi5tb2R1bG8odCk7cmV0dXJue3F1b3RpZW50OmUscmVtOm59fWZ1bmN0aW9uIHFlKGUsdCl7dGhyb3cgbmV3IFooYCIke2V9IiBpcyBub3QgYSB2YWxpZCBEZWNpbWFsMTI4IHN0cmluZyAtICR7dH1gKX1jbGFzcyBIZSBleHRlbmRzIGhle2dldCBfYnNvbnR5cGUoKXtyZXR1cm4iRGVjaW1hbDEyOCJ9Ynl0ZXM7Y29uc3RydWN0b3IoZSl7aWYoc3VwZXIoKSwic3RyaW5nIj09dHlwZW9mIGUpdGhpcy5ieXRlcz1IZS5mcm9tU3RyaW5nKGUpLmJ5dGVzO2Vsc2V7aWYoIShlIGluc3RhbmNlb2YgVWludDhBcnJheXx8XyhlKSkpdGhyb3cgbmV3IFooIkRlY2ltYWwxMjggbXVzdCB0YWtlIGEgQnVmZmVyIG9yIHN0cmluZyIpO2lmKDE2IT09ZS5ieXRlTGVuZ3RoKXRocm93IG5ldyBaKCJEZWNpbWFsMTI4IG11c3QgdGFrZSBhIEJ1ZmZlciBvZiAxNiBieXRlcyIpO3RoaXMuYnl0ZXM9ZX19c3RhdGljIGZyb21TdHJpbmcoZSl7cmV0dXJuIEhlLl9mcm9tU3RyaW5nKGUse2FsbG93Um91bmRpbmc6ITF9KX1zdGF0aWMgZnJvbVN0cmluZ1dpdGhSb3VuZGluZyhlKXtyZXR1cm4gSGUuX2Zyb21TdHJpbmcoZSx7YWxsb3dSb3VuZGluZzohMH0pfXN0YXRpYyBfZnJvbVN0cmluZyhlLHQpe2xldCBuPSExLHI9ITEsaT0hMSxvPSExLHM9MCxhPTAsYz0wLGY9MCxsPTA7Y29uc3QgdT1bMF07bGV0IF89MCxnPTAsaD0wLGI9MCxkPW5ldyBqZSgwLDApLHc9bmV3IGplKDAsMCkscD0wLHk9MDtpZihlLmxlbmd0aD49N2UzKXRocm93IG5ldyBaKGUrIiBub3QgYSB2YWxpZCBEZWNpbWFsMTI4IHN0cmluZyIpO2NvbnN0IG09ZS5tYXRjaChGZSksUz1lLm1hdGNoKGtlKSxCPWUubWF0Y2goemUpO2lmKCFtJiYhUyYmIUJ8fDA9PT1lLmxlbmd0aCl0aHJvdyBuZXcgWihlKyIgbm90IGEgdmFsaWQgRGVjaW1hbDEyOCBzdHJpbmciKTtpZihtKXtjb25zdCB0PW1bMl0sbj1tWzRdLHI9bVs1XSxpPW1bNl07biYmdm9pZCAwPT09aSYmcWUoZSwibWlzc2luZyBleHBvbmVudCBwb3dlciIpLG4mJnZvaWQgMD09PXQmJnFlKGUsIm1pc3NpbmcgZXhwb25lbnQgYmFzZSIpLHZvaWQgMD09PW4mJihyfHxpKSYmcWUoZSwibWlzc2luZyBlIGJlZm9yZSBleHBvbmVudCIpfWlmKCIrIiE9PWVbeV0mJiItIiE9PWVbeV18fChyPSEwLG49Ii0iPT09ZVt5KytdKSwhV2UoZVt5XSkmJiIuIiE9PWVbeV0pe2lmKCJpIj09PWVbeV18fCJJIj09PWVbeV0pcmV0dXJuIG5ldyBIZShuP1ZlOlBlKTtpZigiTiI9PT1lW3ldKXJldHVybiBuZXcgSGUoTWUpfWZvcig7V2UoZVt5XSl8fCIuIj09PWVbeV07KSIuIiE9PWVbeV0/KF88MzQmJigiMCIhPT1lW3ldfHxvKSYmKG98fChsPWEpLG89ITAsdVtnKytdPXBhcnNlSW50KGVbeV0sMTApLF8rPTEpLG8mJihjKz0xKSxpJiYoZis9MSksYSs9MSx5Kz0xKTooaSYmcWUoZSwiY29udGFpbnMgbXVsdGlwbGUgcGVyaW9kcyIpLGk9ITAseSs9MSk7aWYoaSYmIWEpdGhyb3cgbmV3IFooZSsiIG5vdCBhIHZhbGlkIERlY2ltYWwxMjggc3RyaW5nIik7aWYoImUiPT09ZVt5XXx8IkUiPT09ZVt5XSl7Y29uc3QgdD1lLnN1YnN0cigrK3kpLm1hdGNoKEplKTtpZighdHx8IXRbMl0pcmV0dXJuIG5ldyBIZShNZSk7Yj1wYXJzZUludCh0WzBdLDEwKSx5Kz10WzBdLmxlbmd0aH1pZihlW3ldKXJldHVybiBuZXcgSGUoTWUpO2lmKF8pe2lmKGg9Xy0xLHM9YywxIT09cylmb3IoOyIwIj09PWVbbCtzLTErTnVtYmVyKHIpK051bWJlcihpKV07KXMtPTF9ZWxzZSB1WzBdPTAsYz0xLF89MSxzPTA7Zm9yKGI8PWYmJmY+YisxNjM4ND9iPUNlOmItPWY7Yj5EZTspe2lmKGgrPTEsaD49MzQpe2lmKDA9PT1zKXtiPURlO2JyZWFrfXFlKGUsIm92ZXJmbG93Iil9Yi09MX1pZih0LmFsbG93Um91bmRpbmcpe2Zvcig7YjxDZXx8XzxjOyl7aWYoMD09PWgmJnM8Xyl7Yj1DZSxzPTA7YnJlYWt9aWYoXzxjP2MtPTE6aC09MSxiPERlKWIrPTE7ZWxzZXtpZih1LmpvaW4oIiIpLm1hdGNoKC9eMCskLykpe2I9RGU7YnJlYWt9cWUoZSwib3ZlcmZsb3ciKX19aWYoaCsxPHMpe2xldCB0PWE7aSYmKGwrPTEsdCs9MSksciYmKGwrPTEsdCs9MSk7Y29uc3Qgbz1wYXJzZUludChlW2wraCsxXSwxMCk7bGV0IHM9MDtpZihvPj01JiYocz0xLDU9PT1vKSl7cz11W2hdJTI9PTE/MTowO2ZvcihsZXQgbj1sK2grMjtuPHQ7bisrKWlmKHBhcnNlSW50KGVbbl0sMTApKXtzPTE7YnJlYWt9fWlmKHMpe2xldCBlPWg7Zm9yKDtlPj0wJiYrK3VbZV0+OTtlLS0paWYodVtlXT0wLDA9PT1lKXtpZighKGI8RGUpKXJldHVybiBuZXcgSGUobj9WZTpQZSk7Yis9MSx1W2VdPTF9fX19ZWxzZXtmb3IoO2I8Q2V8fF88Yzspe2lmKDA9PT1oKXtpZigwPT09cyl7Yj1DZTticmVha31xZShlLCJleHBvbmVudCB1bmRlcmZsb3ciKX1fPGM/KCIwIiE9PWVbYy0xK051bWJlcihyKStOdW1iZXIoaSldJiYwIT09cyYmcWUoZSwiaW5leGFjdCByb3VuZGluZyIpLGMtPTEpOigwIT09dVtoXSYmcWUoZSwiaW5leGFjdCByb3VuZGluZyIpLGgtPTEpLGI8RGU/Yis9MTpxZShlLCJvdmVyZmxvdyIpfWlmKGgrMTxzKXtpJiYobCs9MSksciYmKGwrPTEpOzAhPT1wYXJzZUludChlW2wraCsxXSwxMCkmJnFlKGUsImluZXhhY3Qgcm91bmRpbmciKX19aWYoZD1qZS5mcm9tTnVtYmVyKDApLHc9amUuZnJvbU51bWJlcigwKSwwPT09cylkPWplLmZyb21OdW1iZXIoMCksdz1qZS5mcm9tTnVtYmVyKDApO2Vsc2UgaWYoaDwxNyl7bGV0IGU9MDtmb3Iodz1qZS5mcm9tTnVtYmVyKHVbZSsrXSksZD1uZXcgamUoMCwwKTtlPD1oO2UrKyl3PXcubXVsdGlwbHkoamUuZnJvbU51bWJlcigxMCkpLHc9dy5hZGQoamUuZnJvbU51bWJlcih1W2VdKSl9ZWxzZXtsZXQgZT0wO2ZvcihkPWplLmZyb21OdW1iZXIodVtlKytdKTtlPD1oLTE3O2UrKylkPWQubXVsdGlwbHkoamUuZnJvbU51bWJlcigxMCkpLGQ9ZC5hZGQoamUuZnJvbU51bWJlcih1W2VdKSk7Zm9yKHc9amUuZnJvbU51bWJlcih1W2UrK10pO2U8PWg7ZSsrKXc9dy5tdWx0aXBseShqZS5mcm9tTnVtYmVyKDEwKSksdz13LmFkZChqZS5mcm9tTnVtYmVyKHVbZV0pKX1jb25zdCB4PWZ1bmN0aW9uKGUsdCl7aWYoIWUmJiF0KXJldHVybntoaWdoOmplLmZyb21OdW1iZXIoMCksbG93OmplLmZyb21OdW1iZXIoMCl9O2NvbnN0IG49ZS5zaGlmdFJpZ2h0VW5zaWduZWQoMzIpLHI9bmV3IGplKGUuZ2V0TG93Qml0cygpLDApLGk9dC5zaGlmdFJpZ2h0VW5zaWduZWQoMzIpLG89bmV3IGplKHQuZ2V0TG93Qml0cygpLDApO2xldCBzPW4ubXVsdGlwbHkoaSksYT1uLm11bHRpcGx5KG8pO2NvbnN0IGM9ci5tdWx0aXBseShpKTtsZXQgZj1yLm11bHRpcGx5KG8pO3JldHVybiBzPXMuYWRkKGEuc2hpZnRSaWdodFVuc2lnbmVkKDMyKSksYT1uZXcgamUoYS5nZXRMb3dCaXRzKCksMCkuYWRkKGMpLmFkZChmLnNoaWZ0UmlnaHRVbnNpZ25lZCgzMikpLHM9cy5hZGQoYS5zaGlmdFJpZ2h0VW5zaWduZWQoMzIpKSxmPWEuc2hpZnRMZWZ0KDMyKS5hZGQobmV3IGplKGYuZ2V0TG93Qml0cygpLDApKSx7aGlnaDpzLGxvdzpmfX0oZCxqZS5mcm9tU3RyaW5nKCIxMDAwMDAwMDAwMDAwMDAwMDAiKSk7eC5sb3c9eC5sb3cuYWRkKHcpLGZ1bmN0aW9uKGUsdCl7Y29uc3Qgbj1lLmhpZ2g+Pj4wLHI9dC5oaWdoPj4+MDtpZihuPHIpcmV0dXJuITA7aWYobj09PXImJmUubG93Pj4+MDx0Lmxvdz4+PjApcmV0dXJuITA7cmV0dXJuITF9KHgubG93LHcpJiYoeC5oaWdoPXguaGlnaC5hZGQoamUuZnJvbU51bWJlcigxKSkpLHA9Yis2MTc2O2NvbnN0IEU9e2xvdzpqZS5mcm9tTnVtYmVyKDApLGhpZ2g6amUuZnJvbU51bWJlcigwKX07eC5oaWdoLnNoaWZ0UmlnaHRVbnNpZ25lZCg0OSkuYW5kKGplLmZyb21OdW1iZXIoMSkpLmVxdWFscyhqZS5mcm9tTnVtYmVyKDEpKT8oRS5oaWdoPUUuaGlnaC5vcihqZS5mcm9tTnVtYmVyKDMpLnNoaWZ0TGVmdCg2MSkpLEUuaGlnaD1FLmhpZ2gub3IoamUuZnJvbU51bWJlcihwKS5hbmQoamUuZnJvbU51bWJlcigxNjM4Mykuc2hpZnRMZWZ0KDQ3KSkpLEUuaGlnaD1FLmhpZ2gub3IoeC5oaWdoLmFuZChqZS5mcm9tTnVtYmVyKDB4N2ZmZmZmZmZmZmZmKSkpKTooRS5oaWdoPUUuaGlnaC5vcihqZS5mcm9tTnVtYmVyKDE2MzgzJnApLnNoaWZ0TGVmdCg0OSkpLEUuaGlnaD1FLmhpZ2gub3IoeC5oaWdoLmFuZChqZS5mcm9tTnVtYmVyKDU2Mjk0OTk1MzQyMTMxMSkpKSksRS5sb3c9eC5sb3csbiYmKEUuaGlnaD1FLmhpZ2gub3IoamUuZnJvbVN0cmluZygiOTIyMzM3MjAzNjg1NDc3NTgwOCIpKSk7Y29uc3QgVT1fZS5hbGxvY2F0ZVVuc2FmZSgxNik7cmV0dXJuIHk9MCxVW3krK109MjU1JkUubG93LmxvdyxVW3krK109RS5sb3cubG93Pj44JjI1NSxVW3krK109RS5sb3cubG93Pj4xNiYyNTUsVVt5KytdPUUubG93Lmxvdz4+MjQmMjU1LFVbeSsrXT0yNTUmRS5sb3cuaGlnaCxVW3krK109RS5sb3cuaGlnaD4+OCYyNTUsVVt5KytdPUUubG93LmhpZ2g+PjE2JjI1NSxVW3krK109RS5sb3cuaGlnaD4+MjQmMjU1LFVbeSsrXT0yNTUmRS5oaWdoLmxvdyxVW3krK109RS5oaWdoLmxvdz4+OCYyNTUsVVt5KytdPUUuaGlnaC5sb3c+PjE2JjI1NSxVW3krK109RS5oaWdoLmxvdz4+MjQmMjU1LFVbeSsrXT0yNTUmRS5oaWdoLmhpZ2gsVVt5KytdPUUuaGlnaC5oaWdoPj44JjI1NSxVW3krK109RS5oaWdoLmhpZ2g+PjE2JjI1NSxVW3krK109RS5oaWdoLmhpZ2g+PjI0JjI1NSxuZXcgSGUoVSl9dG9TdHJpbmcoKXtsZXQgZSx0PTA7Y29uc3Qgbj1uZXcgQXJyYXkoMzYpO2ZvcihsZXQgZT0wO2U8bi5sZW5ndGg7ZSsrKW5bZV09MDtsZXQgcixpLG8scz0wLGE9ITEsYz17cGFydHM6WzAsMCwwLDBdfTtjb25zdCBmPVtdO3M9MDtjb25zdCBsPXRoaXMuYnl0ZXMsdT1sW3MrK118bFtzKytdPDw4fGxbcysrXTw8MTZ8bFtzKytdPDwyNCxfPWxbcysrXXxsW3MrK108PDh8bFtzKytdPDwxNnxsW3MrK108PDI0LGc9bFtzKytdfGxbcysrXTw8OHxsW3MrK108PDE2fGxbcysrXTw8MjQsaD1sW3MrK118bFtzKytdPDw4fGxbcysrXTw8MTZ8bFtzKytdPDwyNDtzPTA7KHtsb3c6bmV3IGplKHUsXyksaGlnaDpuZXcgamUoZyxoKX0pLmhpZ2gubGVzc1RoYW4oamUuWkVSTykmJmYucHVzaCgiLSIpO2NvbnN0IGI9aD4+MjYmMzE7aWYoYj4+Mz09Myl7aWYoMzA9PT1iKXJldHVybiBmLmpvaW4oIiIpKyJJbmZpbml0eSI7aWYoMzE9PT1iKXJldHVybiJOYU4iO2U9aD4+MTUmMTYzODMscj04KyhoPj4xNCYxKX1lbHNlIHI9aD4+MTQmNyxlPWg+PjE3JjE2MzgzO2NvbnN0IGQ9ZS02MTc2O2lmKGMucGFydHNbMF09KDE2MzgzJmgpKygoMTUmcik8PDE0KSxjLnBhcnRzWzFdPWcsYy5wYXJ0c1syXT1fLGMucGFydHNbM109dSwwPT09Yy5wYXJ0c1swXSYmMD09PWMucGFydHNbMV0mJjA9PT1jLnBhcnRzWzJdJiYwPT09Yy5wYXJ0c1szXSlhPSEwO2Vsc2UgZm9yKG89MztvPj0wO28tLSl7bGV0IGU9MDtjb25zdCB0PVllKGMpO2lmKGM9dC5xdW90aWVudCxlPXQucmVtLmxvdyxlKWZvcihpPTg7aT49MDtpLS0pbls5Km8raV09ZSUxMCxlPU1hdGguZmxvb3IoZS8xMCl9aWYoYSl0PTEsbltzXT0wO2Vsc2UgZm9yKHQ9MzY7IW5bc107KXQtPTEscys9MTtjb25zdCB3PXQtMStkO2lmKHc+PTM0fHx3PD0tN3x8ZD4wKXtpZih0PjM0KXJldHVybiBmLnB1c2goIjAiKSxkPjA/Zi5wdXNoKGBFKyR7ZH1gKTpkPDAmJmYucHVzaChgRSR7ZH1gKSxmLmpvaW4oIiIpO2YucHVzaChgJHtuW3MrK119YCksdC09MSx0JiZmLnB1c2goIi4iKTtmb3IobGV0IGU9MDtlPHQ7ZSsrKWYucHVzaChgJHtuW3MrK119YCk7Zi5wdXNoKCJFIiksdz4wP2YucHVzaChgKyR7d31gKTpmLnB1c2goYCR7d31gKX1lbHNlIGlmKGQ+PTApZm9yKGxldCBlPTA7ZTx0O2UrKylmLnB1c2goYCR7bltzKytdfWApO2Vsc2V7bGV0IGU9dCtkO2lmKGU+MClmb3IobGV0IHQ9MDt0PGU7dCsrKWYucHVzaChgJHtuW3MrK119YCk7ZWxzZSBmLnB1c2goIjAiKTtmb3IoZi5wdXNoKCIuIik7ZSsrPDA7KWYucHVzaCgiMCIpO2ZvcihsZXQgcj0wO3I8dC1NYXRoLm1heChlLTEsMCk7cisrKWYucHVzaChgJHtuW3MrK119YCl9cmV0dXJuIGYuam9pbigiIil9dG9KU09OKCl7cmV0dXJueyRudW1iZXJEZWNpbWFsOnRoaXMudG9TdHJpbmcoKX19dG9FeHRlbmRlZEpTT04oKXtyZXR1cm57JG51bWJlckRlY2ltYWw6dGhpcy50b1N0cmluZygpfX1zdGF0aWMgZnJvbUV4dGVuZGVkSlNPTihlKXtyZXR1cm4gSGUuZnJvbVN0cmluZyhlLiRudW1iZXJEZWNpbWFsKX1pbnNwZWN0KGUsdCxuKXtuPz89dztyZXR1cm5gbmV3IERlY2ltYWwxMjgoJHtuKHRoaXMudG9TdHJpbmcoKSx0KX0pYH19Y2xhc3MgS2UgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkRvdWJsZSJ9dmFsdWU7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSxlIGluc3RhbmNlb2YgTnVtYmVyJiYoZT1lLnZhbHVlT2YoKSksdGhpcy52YWx1ZT0rZX1zdGF0aWMgZnJvbVN0cmluZyhlKXtjb25zdCB0PU51bWJlcihlKTtpZigiTmFOIj09PWUpcmV0dXJuIG5ldyBLZShOYU4pO2lmKCJJbmZpbml0eSI9PT1lKXJldHVybiBuZXcgS2UoMS8wKTtpZigiLUluZmluaXR5Ij09PWUpcmV0dXJuIG5ldyBLZSgtMS8wKTtpZighTnVtYmVyLmlzRmluaXRlKHQpKXRocm93IG5ldyBaKGBJbnB1dDogJHtlfSBpcyBub3QgcmVwcmVzZW50YWJsZSBhcyBhIERvdWJsZWApO2lmKGUudHJpbSgpIT09ZSl0aHJvdyBuZXcgWihgSW5wdXQ6ICcke2V9JyBjb250YWlucyB3aGl0ZXNwYWNlYCk7aWYoIiI9PT1lKXRocm93IG5ldyBaKCJJbnB1dCBpcyBhbiBlbXB0eSBzdHJpbmciKTtpZigvW14tMC05LitlRV0vLnRlc3QoZSkpdGhyb3cgbmV3IFooYElucHV0OiAnJHtlfScgaXMgbm90IGluIGRlY2ltYWwgb3IgZXhwb25lbnRpYWwgbm90YXRpb25gKTtyZXR1cm4gbmV3IEtlKHQpfXZhbHVlT2YoKXtyZXR1cm4gdGhpcy52YWx1ZX10b0pTT04oKXtyZXR1cm4gdGhpcy52YWx1ZX10b1N0cmluZyhlKXtyZXR1cm4gdGhpcy52YWx1ZS50b1N0cmluZyhlKX10b0V4dGVuZGVkSlNPTihlKXtyZXR1cm4gZSYmKGUubGVnYWN5fHxlLnJlbGF4ZWQmJmlzRmluaXRlKHRoaXMudmFsdWUpKT90aGlzLnZhbHVlOk9iamVjdC5pcyhNYXRoLnNpZ24odGhpcy52YWx1ZSksLTApP3skbnVtYmVyRG91YmxlOiItMC4wIn06eyRudW1iZXJEb3VibGU6TnVtYmVyLmlzSW50ZWdlcih0aGlzLnZhbHVlKT90aGlzLnZhbHVlLnRvRml4ZWQoMSk6dGhpcy52YWx1ZS50b1N0cmluZygpfX1zdGF0aWMgZnJvbUV4dGVuZGVkSlNPTihlLHQpe2NvbnN0IG49cGFyc2VGbG9hdChlLiRudW1iZXJEb3VibGUpO3JldHVybiB0JiZ0LnJlbGF4ZWQ/bjpuZXcgS2Uobil9aW5zcGVjdChlLHQsbil7cmV0dXJuIG4/Pz13LGBuZXcgRG91YmxlKCR7bih0aGlzLnZhbHVlLHQpfSlgfX1jbGFzcyBaZSBleHRlbmRzIGhle2dldCBfYnNvbnR5cGUoKXtyZXR1cm4iSW50MzIifXZhbHVlO2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksZSBpbnN0YW5jZW9mIE51bWJlciYmKGU9ZS52YWx1ZU9mKCkpLHRoaXMudmFsdWU9MHwrZX1zdGF0aWMgZnJvbVN0cmluZyhlKXtjb25zdCB0PUllKGUpLG49TnVtYmVyKGUpO2lmKG08bil0aHJvdyBuZXcgWihgSW5wdXQ6ICcke2V9JyBpcyBsYXJnZXIgdGhhbiB0aGUgbWF4aW11bSB2YWx1ZSBmb3IgSW50MzJgKTtpZihTPm4pdGhyb3cgbmV3IFooYElucHV0OiAnJHtlfScgaXMgc21hbGxlciB0aGFuIHRoZSBtaW5pbXVtIHZhbHVlIGZvciBJbnQzMmApO2lmKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihuKSl0aHJvdyBuZXcgWihgSW5wdXQ6ICcke2V9JyBpcyBub3QgYSBzYWZlIGludGVnZXJgKTtpZihuLnRvU3RyaW5nKCkhPT10KXRocm93IG5ldyBaKGBJbnB1dDogJyR7ZX0nIGlzIG5vdCBhIHZhbGlkIEludDMyIHN0cmluZ2ApO3JldHVybiBuZXcgWmUobil9dmFsdWVPZigpe3JldHVybiB0aGlzLnZhbHVlfXRvU3RyaW5nKGUpe3JldHVybiB0aGlzLnZhbHVlLnRvU3RyaW5nKGUpfXRvSlNPTigpe3JldHVybiB0aGlzLnZhbHVlfXRvRXh0ZW5kZWRKU09OKGUpe3JldHVybiBlJiYoZS5yZWxheGVkfHxlLmxlZ2FjeSk/dGhpcy52YWx1ZTp7JG51bWJlckludDp0aGlzLnZhbHVlLnRvU3RyaW5nKCl9fXN0YXRpYyBmcm9tRXh0ZW5kZWRKU09OKGUsdCl7cmV0dXJuIHQmJnQucmVsYXhlZD9wYXJzZUludChlLiRudW1iZXJJbnQsMTApOm5ldyBaZShlLiRudW1iZXJJbnQpfWluc3BlY3QoZSx0LG4pe3JldHVybiBuPz89dyxgbmV3IEludDMyKCR7bih0aGlzLnZhbHVlLHQpfSlgfX1jbGFzcyBHZSBleHRlbmRzIGhle2dldCBfYnNvbnR5cGUoKXtyZXR1cm4iTWF4S2V5In10b0V4dGVuZGVkSlNPTigpe3JldHVybnskbWF4S2V5OjF9fXN0YXRpYyBmcm9tRXh0ZW5kZWRKU09OKCl7cmV0dXJuIG5ldyBHZX1pbnNwZWN0KCl7cmV0dXJuIm5ldyBNYXhLZXkoKSJ9fWNsYXNzIFhlIGV4dGVuZHMgaGV7Z2V0IF9ic29udHlwZSgpe3JldHVybiJNaW5LZXkifXRvRXh0ZW5kZWRKU09OKCl7cmV0dXJueyRtaW5LZXk6MX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oKXtyZXR1cm4gbmV3IFhlfWluc3BlY3QoKXtyZXR1cm4ibmV3IE1pbktleSgpIn19bGV0IFFlPW51bGw7Y29uc3QgZXQ9bmV3IFdlYWtNYXA7Y2xhc3MgdHQgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIk9iamVjdElkIn1zdGF0aWMgaW5kZXg9TWF0aC5mbG9vcigxNjc3NzIxNSpNYXRoLnJhbmRvbSgpKTtzdGF0aWMgY2FjaGVIZXhTdHJpbmc7YnVmZmVyO2NvbnN0cnVjdG9yKGUpe2xldCB0O2lmKHN1cGVyKCksIm9iamVjdCI9PXR5cGVvZiBlJiZlJiYiaWQiaW4gZSl7aWYoInN0cmluZyIhPXR5cGVvZiBlLmlkJiYhQXJyYXlCdWZmZXIuaXNWaWV3KGUuaWQpKXRocm93IG5ldyBaKCJBcmd1bWVudCBwYXNzZWQgaW4gbXVzdCBoYXZlIGFuIGlkIHRoYXQgaXMgb2YgdHlwZSBzdHJpbmcgb3IgQnVmZmVyIik7dD0idG9IZXhTdHJpbmciaW4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudG9IZXhTdHJpbmc/X2UuZnJvbUhleChlLnRvSGV4U3RyaW5nKCkpOmUuaWR9ZWxzZSB0PWU7aWYobnVsbD09dCl0aGlzLmJ1ZmZlcj10dC5nZW5lcmF0ZSgpO2Vsc2UgaWYoQXJyYXlCdWZmZXIuaXNWaWV3KHQpJiYxMj09PXQuYnl0ZUxlbmd0aCl0aGlzLmJ1ZmZlcj1fZS50b0xvY2FsQnVmZmVyVHlwZSh0KTtlbHNle2lmKCJzdHJpbmciIT10eXBlb2YgdCl0aHJvdyBuZXcgWigiQXJndW1lbnQgcGFzc2VkIGluIGRvZXMgbm90IG1hdGNoIHRoZSBhY2NlcHRlZCB0eXBlcyIpO2lmKCF0dC52YWxpZGF0ZUhleFN0cmluZyh0KSl0aHJvdyBuZXcgWigiaW5wdXQgbXVzdCBiZSBhIDI0IGNoYXJhY3RlciBoZXggc3RyaW5nLCAxMiBieXRlIFVpbnQ4QXJyYXksIG9yIGFuIGludGVnZXIiKTt0aGlzLmJ1ZmZlcj1fZS5mcm9tSGV4KHQpLHR0LmNhY2hlSGV4U3RyaW5nJiZldC5zZXQodGhpcyx0KX19Z2V0IGlkKCl7cmV0dXJuIHRoaXMuYnVmZmVyfXNldCBpZChlKXt0aGlzLmJ1ZmZlcj1lLHR0LmNhY2hlSGV4U3RyaW5nJiZldC5zZXQodGhpcyxfZS50b0hleChlKSl9c3RhdGljIHZhbGlkYXRlSGV4U3RyaW5nKGUpe2lmKDI0IT09ZT8ubGVuZ3RoKXJldHVybiExO2ZvcihsZXQgdD0wO3Q8MjQ7dCsrKXtjb25zdCBuPWUuY2hhckNvZGVBdCh0KTtpZighKG4+PTQ4JiZuPD01N3x8bj49OTcmJm48PTEwMnx8bj49NjUmJm48PTcwKSlyZXR1cm4hMX1yZXR1cm4hMH10b0hleFN0cmluZygpe2lmKHR0LmNhY2hlSGV4U3RyaW5nKXtjb25zdCBlPWV0LmdldCh0aGlzKTtpZihlKXJldHVybiBlfWNvbnN0IGU9X2UudG9IZXgodGhpcy5pZCk7cmV0dXJuIHR0LmNhY2hlSGV4U3RyaW5nJiZldC5zZXQodGhpcyxlKSxlfXN0YXRpYyBnZXRJbmMoKXtyZXR1cm4gdHQuaW5kZXg9KHR0LmluZGV4KzEpJTE2Nzc3MjE1fXN0YXRpYyBnZW5lcmF0ZShlKXsibnVtYmVyIiE9dHlwZW9mIGUmJihlPU1hdGguZmxvb3IoRGF0ZS5ub3coKS8xZTMpKTtjb25zdCB0PXR0LmdldEluYygpLG49X2UuYWxsb2NhdGVVbnNhZmUoMTIpO3JldHVybiBwZS5zZXRJbnQzMkJFKG4sMCxlKSxudWxsPT09UWUmJihRZT1fZS5yYW5kb21CeXRlcyg1KSksbls0XT1RZVswXSxuWzVdPVFlWzFdLG5bNl09UWVbMl0sbls3XT1RZVszXSxuWzhdPVFlWzRdLG5bMTFdPTI1NSZ0LG5bMTBdPXQ+PjgmMjU1LG5bOV09dD4+MTYmMjU1LG59dG9TdHJpbmcoZSl7cmV0dXJuImJhc2U2NCI9PT1lP19lLnRvQmFzZTY0KHRoaXMuaWQpOnRoaXMudG9IZXhTdHJpbmcoKX10b0pTT04oKXtyZXR1cm4gdGhpcy50b0hleFN0cmluZygpfXN0YXRpYyBpcyhlKXtyZXR1cm4gbnVsbCE9ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYiX2Jzb250eXBlImluIGUmJiJPYmplY3RJZCI9PT1lLl9ic29udHlwZX1lcXVhbHMoZSl7aWYobnVsbD09ZSlyZXR1cm4hMTtpZih0dC5pcyhlKSlyZXR1cm4gdGhpcy5idWZmZXJbMTFdPT09ZS5idWZmZXJbMTFdJiZfZS5lcXVhbHModGhpcy5idWZmZXIsZS5idWZmZXIpO2lmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gZS50b0xvd2VyQ2FzZSgpPT09dGhpcy50b0hleFN0cmluZygpO2lmKCJvYmplY3QiPT10eXBlb2YgZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudG9IZXhTdHJpbmcpe2NvbnN0IHQ9ZS50b0hleFN0cmluZygpLG49dGhpcy50b0hleFN0cmluZygpO3JldHVybiJzdHJpbmciPT10eXBlb2YgdCYmdC50b0xvd2VyQ2FzZSgpPT09bn1yZXR1cm4hMX1nZXRUaW1lc3RhbXAoKXtjb25zdCBlPW5ldyBEYXRlLHQ9cGUuZ2V0VWludDMyQkUodGhpcy5idWZmZXIsMCk7cmV0dXJuIGUuc2V0VGltZSgxZTMqTWF0aC5mbG9vcih0KSksZX1zdGF0aWMgY3JlYXRlUGsoKXtyZXR1cm4gbmV3IHR0fXNlcmlhbGl6ZUludG8oZSx0KXtyZXR1cm4gZVt0XT10aGlzLmJ1ZmZlclswXSxlW3QrMV09dGhpcy5idWZmZXJbMV0sZVt0KzJdPXRoaXMuYnVmZmVyWzJdLGVbdCszXT10aGlzLmJ1ZmZlclszXSxlW3QrNF09dGhpcy5idWZmZXJbNF0sZVt0KzVdPXRoaXMuYnVmZmVyWzVdLGVbdCs2XT10aGlzLmJ1ZmZlcls2XSxlW3QrN109dGhpcy5idWZmZXJbN10sZVt0KzhdPXRoaXMuYnVmZmVyWzhdLGVbdCs5XT10aGlzLmJ1ZmZlcls5XSxlW3QrMTBdPXRoaXMuYnVmZmVyWzEwXSxlW3QrMTFdPXRoaXMuYnVmZmVyWzExXSwxMn1zdGF0aWMgY3JlYXRlRnJvbVRpbWUoZSl7Y29uc3QgdD1fZS5hbGxvY2F0ZSgxMik7Zm9yKGxldCBlPTExO2U+PTQ7ZS0tKXRbZV09MDtyZXR1cm4gcGUuc2V0SW50MzJCRSh0LDAsZSksbmV3IHR0KHQpfXN0YXRpYyBjcmVhdGVGcm9tSGV4U3RyaW5nKGUpe2lmKDI0IT09ZT8ubGVuZ3RoKXRocm93IG5ldyBaKCJoZXggc3RyaW5nIG11c3QgYmUgMjQgY2hhcmFjdGVycyIpO3JldHVybiBuZXcgdHQoX2UuZnJvbUhleChlKSl9c3RhdGljIGNyZWF0ZUZyb21CYXNlNjQoZSl7aWYoMTYhPT1lPy5sZW5ndGgpdGhyb3cgbmV3IFooImJhc2U2NCBzdHJpbmcgbXVzdCBiZSAxNiBjaGFyYWN0ZXJzIik7cmV0dXJuIG5ldyB0dChfZS5mcm9tQmFzZTY0KGUpKX1zdGF0aWMgaXNWYWxpZChlKXtpZihudWxsPT1lKXJldHVybiExO2lmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gdHQudmFsaWRhdGVIZXhTdHJpbmcoZSk7dHJ5e3JldHVybiBuZXcgdHQoZSksITB9Y2F0Y2h7cmV0dXJuITF9fXRvRXh0ZW5kZWRKU09OKCl7cmV0dXJuIHRoaXMudG9IZXhTdHJpbmc/eyRvaWQ6dGhpcy50b0hleFN0cmluZygpfTp7JG9pZDp0aGlzLnRvU3RyaW5nKCJoZXgiKX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oZSl7cmV0dXJuIG5ldyB0dChlLiRvaWQpfWlzQ2FjaGVkKCl7cmV0dXJuIHR0LmNhY2hlSGV4U3RyaW5nJiZldC5oYXModGhpcyl9aW5zcGVjdChlLHQsbil7cmV0dXJuIG4/Pz13LGBuZXcgT2JqZWN0SWQoJHtuKHRoaXMudG9IZXhTdHJpbmcoKSx0KX0pYH19ZnVuY3Rpb24gbnQoZSx0LG4pe2xldCByPTU7aWYoQXJyYXkuaXNBcnJheShlKSlmb3IobGV0IGk9MDtpPGUubGVuZ3RoO2krKylyKz1ydChpLnRvU3RyaW5nKCksZVtpXSx0LCEwLG4pO2Vsc2V7ImZ1bmN0aW9uIj09dHlwZW9mIGU/LnRvQlNPTiYmKGU9ZS50b0JTT04oKSk7Zm9yKGNvbnN0IGkgb2YgT2JqZWN0LmtleXMoZSkpcis9cnQoaSxlW2ldLHQsITEsbil9cmV0dXJuIHJ9ZnVuY3Rpb24gcnQoZSx0LG49ITEscj0hMSxpPSExKXtzd2l0Y2goImZ1bmN0aW9uIj09dHlwZW9mIHQ/LnRvQlNPTiYmKHQ9dC50b0JTT04oKSksdHlwZW9mIHQpe2Nhc2Uic3RyaW5nIjpyZXR1cm4gMStfZS51dGY4Qnl0ZUxlbmd0aChlKSsxKzQrX2UudXRmOEJ5dGVMZW5ndGgodCkrMTtjYXNlIm51bWJlciI6cmV0dXJuIE1hdGguZmxvb3IodCk9PT10JiZ0Pj1VJiZ0PD1FJiZ0Pj1TJiZ0PD1tPyhudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrNToobnVsbCE9ZT9fZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKzk7Y2FzZSJ1bmRlZmluZWQiOnJldHVybiByfHwhaT8obnVsbCE9ZT9fZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKzE6MDtjYXNlImJvb2xlYW4iOnJldHVybihudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMjtjYXNlIm9iamVjdCI6aWYobnVsbCE9dCYmInN0cmluZyI9PXR5cGVvZiB0Ll9ic29udHlwZSYmdFt5XSE9PXApdGhyb3cgbmV3IEc7aWYobnVsbD09dHx8Ik1pbktleSI9PT10Ll9ic29udHlwZXx8Ik1heEtleSI9PT10Ll9ic29udHlwZSlyZXR1cm4obnVsbCE9ZT9fZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKzE7aWYoIk9iamVjdElkIj09PXQuX2Jzb250eXBlKXJldHVybihudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMTM7aWYodCBpbnN0YW5jZW9mIERhdGV8fGQodCkpcmV0dXJuKG51bGwhPWU/X2UudXRmOEJ5dGVMZW5ndGgoZSkrMTowKSs5O2lmKEFycmF5QnVmZmVyLmlzVmlldyh0KXx8dCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHxnKHQpKXJldHVybihudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrNit0LmJ5dGVMZW5ndGg7aWYoIkxvbmciPT09dC5fYnNvbnR5cGV8fCJEb3VibGUiPT09dC5fYnNvbnR5cGV8fCJUaW1lc3RhbXAiPT09dC5fYnNvbnR5cGUpcmV0dXJuKG51bGwhPWU/X2UudXRmOEJ5dGVMZW5ndGgoZSkrMTowKSs5O2lmKCJEZWNpbWFsMTI4Ij09PXQuX2Jzb250eXBlKXJldHVybihudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMTc7aWYoIkNvZGUiPT09dC5fYnNvbnR5cGUpcmV0dXJuIG51bGwhPXQuc2NvcGUmJk9iamVjdC5rZXlzKHQuc2NvcGUpLmxlbmd0aD4wPyhudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMSs0KzQrX2UudXRmOEJ5dGVMZW5ndGgodC5jb2RlLnRvU3RyaW5nKCkpKzErbnQodC5zY29wZSxuLGkpOihudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMSs0K19lLnV0ZjhCeXRlTGVuZ3RoKHQuY29kZS50b1N0cmluZygpKSsxO2lmKCJCaW5hcnkiPT09dC5fYnNvbnR5cGUpe2NvbnN0IG49dDtyZXR1cm4gbi5zdWJfdHlwZT09PXllLlNVQlRZUEVfQllURV9BUlJBWT8obnVsbCE9ZT9fZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKyhuLnBvc2l0aW9uKzErNCsxKzQpOihudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrKG4ucG9zaXRpb24rMSs0KzEpfWlmKCJTeW1ib2wiPT09dC5fYnNvbnR5cGUpcmV0dXJuKG51bGwhPWU/X2UudXRmOEJ5dGVMZW5ndGgoZSkrMTowKStfZS51dGY4Qnl0ZUxlbmd0aCh0LnZhbHVlKSs0KzErMTtpZigiREJSZWYiPT09dC5fYnNvbnR5cGUpe2NvbnN0IHI9T2JqZWN0LmFzc2lnbih7JHJlZjp0LmNvbGxlY3Rpb24sJGlkOnQub2lkfSx0LmZpZWxkcyk7cmV0dXJuIG51bGwhPXQuZGImJihyLiRkYj10LmRiKSwobnVsbCE9ZT9fZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKzErbnQocixuLGkpfXJldHVybiB0IGluc3RhbmNlb2YgUmVnRXhwfHxoKHQpPyhudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMStfZS51dGY4Qnl0ZUxlbmd0aCh0LnNvdXJjZSkrMSsodC5nbG9iYWw/MTowKSsodC5pZ25vcmVDYXNlPzE6MCkrKHQubXVsdGlsaW5lPzE6MCkrMToiQlNPTlJlZ0V4cCI9PT10Ll9ic29udHlwZT8obnVsbCE9ZT9fZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKzErX2UudXRmOEJ5dGVMZW5ndGgodC5wYXR0ZXJuKSsxK19lLnV0ZjhCeXRlTGVuZ3RoKHQub3B0aW9ucykrMToobnVsbCE9ZT9fZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApK250KHQsbixpKSsxO2Nhc2UiZnVuY3Rpb24iOnJldHVybiBuPyhudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMSs0K19lLnV0ZjhCeXRlTGVuZ3RoKHQudG9TdHJpbmcoKSkrMTowO2Nhc2UiYmlnaW50IjpyZXR1cm4obnVsbCE9ZT9fZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKzk7Y2FzZSJzeW1ib2wiOnJldHVybiAwO2RlZmF1bHQ6dGhyb3cgbmV3IFooIlVucmVjb2duaXplZCBKUyB0eXBlOiAiK3R5cGVvZiB0KX19Y2xhc3MgaXQgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkJTT05SZWdFeHAifXBhdHRlcm47b3B0aW9ucztjb25zdHJ1Y3RvcihlLHQpe2lmKHN1cGVyKCksdGhpcy5wYXR0ZXJuPWUsdGhpcy5vcHRpb25zPSh0Pz8iIikuc3BsaXQoIiIpLnNvcnQoKS5qb2luKCIiKSwtMSE9PXRoaXMucGF0dGVybi5pbmRleE9mKCJcMCIpKXRocm93IG5ldyBaKGBCU09OIFJlZ2V4IHBhdHRlcm5zIGNhbm5vdCBjb250YWluIG51bGwgYnl0ZXMsIGZvdW5kOiAke0pTT04uc3RyaW5naWZ5KHRoaXMucGF0dGVybil9YCk7aWYoLTEhPT10aGlzLm9wdGlvbnMuaW5kZXhPZigiXDAiKSl0aHJvdyBuZXcgWihgQlNPTiBSZWdleCBvcHRpb25zIGNhbm5vdCBjb250YWluIG51bGwgYnl0ZXMsIGZvdW5kOiAke0pTT04uc3RyaW5naWZ5KHRoaXMub3B0aW9ucyl9YCk7Zm9yKGxldCBlPTA7ZTx0aGlzLm9wdGlvbnMubGVuZ3RoO2UrKylpZigiaSIhPT10aGlzLm9wdGlvbnNbZV0mJiJtIiE9PXRoaXMub3B0aW9uc1tlXSYmIngiIT09dGhpcy5vcHRpb25zW2VdJiYibCIhPT10aGlzLm9wdGlvbnNbZV0mJiJzIiE9PXRoaXMub3B0aW9uc1tlXSYmInUiIT09dGhpcy5vcHRpb25zW2VdKXRocm93IG5ldyBaKGBUaGUgcmVndWxhciBleHByZXNzaW9uIG9wdGlvbiBbJHt0aGlzLm9wdGlvbnNbZV19XSBpcyBub3Qgc3VwcG9ydGVkYCl9c3RhdGljIHBhcnNlT3B0aW9ucyhlKXtyZXR1cm4gZT9lLnNwbGl0KCIiKS5zb3J0KCkuam9pbigiIik6IiJ9dG9FeHRlbmRlZEpTT04oZSl7cmV0dXJuKGU9ZXx8e30pLmxlZ2FjeT97JHJlZ2V4OnRoaXMucGF0dGVybiwkb3B0aW9uczp0aGlzLm9wdGlvbnN9OnskcmVndWxhckV4cHJlc3Npb246e3BhdHRlcm46dGhpcy5wYXR0ZXJuLG9wdGlvbnM6dGhpcy5vcHRpb25zfX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oZSl7aWYoIiRyZWdleCJpbiBlKXtpZigic3RyaW5nIj09dHlwZW9mIGUuJHJlZ2V4KXJldHVybiBuZXcgaXQoZS4kcmVnZXgsaXQucGFyc2VPcHRpb25zKGUuJG9wdGlvbnMpKTtpZigiQlNPTlJlZ0V4cCI9PT1lLiRyZWdleC5fYnNvbnR5cGUpcmV0dXJuIGV9aWYoIiRyZWd1bGFyRXhwcmVzc2lvbiJpbiBlKXJldHVybiBuZXcgaXQoZS4kcmVndWxhckV4cHJlc3Npb24ucGF0dGVybixpdC5wYXJzZU9wdGlvbnMoZS4kcmVndWxhckV4cHJlc3Npb24ub3B0aW9ucykpO3Rocm93IG5ldyBaKGBVbmV4cGVjdGVkIEJTT05SZWdFeHAgRUpTT04gb2JqZWN0IGZvcm06ICR7SlNPTi5zdHJpbmdpZnkoZSl9YCl9aW5zcGVjdChlLHQsbil7Y29uc3Qgcj1mdW5jdGlvbihlKXtpZihudWxsIT1lJiYib2JqZWN0Ij09dHlwZW9mIGUmJiJzdHlsaXplImluIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnN0eWxpemUpcmV0dXJuIGUuc3R5bGl6ZX0odCk/PyhlPT5lKTtuPz89dztyZXR1cm5gbmV3IEJTT05SZWdFeHAoJHtyKG4odGhpcy5wYXR0ZXJuKSwicmVnZXhwIil9LCAke3Iobih0aGlzLm9wdGlvbnMpLCJyZWdleHAiKX0pYH19Y2xhc3Mgb3QgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkJTT05TeW1ib2wifXZhbHVlO2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy52YWx1ZT1lfXZhbHVlT2YoKXtyZXR1cm4gdGhpcy52YWx1ZX10b1N0cmluZygpe3JldHVybiB0aGlzLnZhbHVlfXRvSlNPTigpe3JldHVybiB0aGlzLnZhbHVlfXRvRXh0ZW5kZWRKU09OKCl7cmV0dXJueyRzeW1ib2w6dGhpcy52YWx1ZX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oZSl7cmV0dXJuIG5ldyBvdChlLiRzeW1ib2wpfWluc3BlY3QoZSx0LG4pe3JldHVybiBuPz89dyxgbmV3IEJTT05TeW1ib2woJHtuKHRoaXMudmFsdWUsdCl9KWB9fWNvbnN0IHN0PWplO2NsYXNzIGF0IGV4dGVuZHMgc3R7Z2V0IF9ic29udHlwZSgpe3JldHVybiJUaW1lc3RhbXAifWdldFtnZV0oKXtyZXR1cm4iVGltZXN0YW1wIn1zdGF0aWMgTUFYX1ZBTFVFPWplLk1BWF9VTlNJR05FRF9WQUxVRTtnZXQgaSgpe3JldHVybiB0aGlzLmxvdz4+PjB9Z2V0IHQoKXtyZXR1cm4gdGhpcy5oaWdoPj4+MH1jb25zdHJ1Y3RvcihlKXtpZihudWxsPT1lKXN1cGVyKDAsMCwhMCk7ZWxzZSBpZigiYmlnaW50Ij09dHlwZW9mIGUpc3VwZXIoZSwhMCk7ZWxzZSBpZihqZS5pc0xvbmcoZSkpc3VwZXIoZS5sb3csZS5oaWdoLCEwKTtlbHNle2lmKCJvYmplY3QiIT10eXBlb2YgZXx8ISgidCJpbiBlKXx8ISgiaSJpbiBlKSl0aHJvdyBuZXcgWigiQSBUaW1lc3RhbXAgY2FuIG9ubHkgYmUgY29uc3RydWN0ZWQgd2l0aDogYmlnaW50LCBMb25nLCBvciB7IHQ6IG51bWJlcjsgaTogbnVtYmVyIH0iKTt7aWYoIm51bWJlciIhPXR5cGVvZiBlLnQmJigib2JqZWN0IiE9dHlwZW9mIGUudHx8IkludDMyIiE9PWUudC5fYnNvbnR5cGUpKXRocm93IG5ldyBaKCJUaW1lc3RhbXAgY29uc3RydWN0ZWQgZnJvbSB7IHQsIGkgfSBtdXN0IHByb3ZpZGUgdCBhcyBhIG51bWJlciIpO2lmKCJudW1iZXIiIT10eXBlb2YgZS5pJiYoIm9iamVjdCIhPXR5cGVvZiBlLml8fCJJbnQzMiIhPT1lLmkuX2Jzb250eXBlKSl0aHJvdyBuZXcgWigiVGltZXN0YW1wIGNvbnN0cnVjdGVkIGZyb20geyB0LCBpIH0gbXVzdCBwcm92aWRlIGkgYXMgYSBudW1iZXIiKTtjb25zdCB0PU51bWJlcihlLnQpLG49TnVtYmVyKGUuaSk7aWYodDwwfHxOdW1iZXIuaXNOYU4odCkpdGhyb3cgbmV3IFooIlRpbWVzdGFtcCBjb25zdHJ1Y3RlZCBmcm9tIHsgdCwgaSB9IG11c3QgcHJvdmlkZSBhIHBvc2l0aXZlIHQiKTtpZihuPDB8fE51bWJlci5pc05hTihuKSl0aHJvdyBuZXcgWigiVGltZXN0YW1wIGNvbnN0cnVjdGVkIGZyb20geyB0LCBpIH0gbXVzdCBwcm92aWRlIGEgcG9zaXRpdmUgaSIpO2lmKHQ+NDI5NDk2NzI5NSl0aHJvdyBuZXcgWigiVGltZXN0YW1wIGNvbnN0cnVjdGVkIGZyb20geyB0LCBpIH0gbXVzdCBwcm92aWRlIHQgZXF1YWwgb3IgbGVzcyB0aGFuIHVpbnQzMiBtYXgiKTtpZihuPjQyOTQ5NjcyOTUpdGhyb3cgbmV3IFooIlRpbWVzdGFtcCBjb25zdHJ1Y3RlZCBmcm9tIHsgdCwgaSB9IG11c3QgcHJvdmlkZSBpIGVxdWFsIG9yIGxlc3MgdGhhbiB1aW50MzIgbWF4Iik7c3VwZXIobix0LCEwKX19fXRvSlNPTigpe3JldHVybnskdGltZXN0YW1wOnRoaXMudG9TdHJpbmcoKX19c3RhdGljIGZyb21JbnQoZSl7cmV0dXJuIG5ldyBhdChqZS5mcm9tSW50KGUsITApKX1zdGF0aWMgZnJvbU51bWJlcihlKXtyZXR1cm4gbmV3IGF0KGplLmZyb21OdW1iZXIoZSwhMCkpfXN0YXRpYyBmcm9tQml0cyhlLHQpe3JldHVybiBuZXcgYXQoe2k6ZSx0OnR9KX1zdGF0aWMgZnJvbVN0cmluZyhlLHQpe3JldHVybiBuZXcgYXQoamUuZnJvbVN0cmluZyhlLCEwLHQpKX10b0V4dGVuZGVkSlNPTigpe3JldHVybnskdGltZXN0YW1wOnt0OnRoaXMudCxpOnRoaXMuaX19fXN0YXRpYyBmcm9tRXh0ZW5kZWRKU09OKGUpe2NvbnN0IHQ9amUuaXNMb25nKGUuJHRpbWVzdGFtcC5pKT9lLiR0aW1lc3RhbXAuaS5nZXRMb3dCaXRzVW5zaWduZWQoKTplLiR0aW1lc3RhbXAuaSxuPWplLmlzTG9uZyhlLiR0aW1lc3RhbXAudCk/ZS4kdGltZXN0YW1wLnQuZ2V0TG93Qml0c1Vuc2lnbmVkKCk6ZS4kdGltZXN0YW1wLnQ7cmV0dXJuIG5ldyBhdCh7dDpuLGk6dH0pfWluc3BlY3QoZSx0LG4pe24/Pz13O3JldHVybmBuZXcgVGltZXN0YW1wKHsgdDogJHtuKHRoaXMudCx0KX0sIGk6ICR7bih0aGlzLmksdCl9IH0pYH19Y29uc3QgY3Q9amUuZnJvbU51bWJlcihFKSxmdD1qZS5mcm9tTnVtYmVyKFUpO2Z1bmN0aW9uIGx0KGUsdCxuKXtjb25zdCByPSh0PW51bGw9PXQ/e306dCkmJnQuaW5kZXg/dC5pbmRleDowLGk9cGUuZ2V0SW50MzJMRShlLHIpO2lmKGk8NSl0aHJvdyBuZXcgWihgYnNvbiBzaXplIG11c3QgYmUgPj0gNSwgaXMgJHtpfWApO2lmKHQuYWxsb3dPYmplY3RTbWFsbGVyVGhhbkJ1ZmZlclNpemUmJmUubGVuZ3RoPGkpdGhyb3cgbmV3IFooYGJ1ZmZlciBsZW5ndGggJHtlLmxlbmd0aH0gbXVzdCBiZSA+PSBic29uIHNpemUgJHtpfWApO2lmKCF0LmFsbG93T2JqZWN0U21hbGxlclRoYW5CdWZmZXJTaXplJiZlLmxlbmd0aCE9PWkpdGhyb3cgbmV3IFooYGJ1ZmZlciBsZW5ndGggJHtlLmxlbmd0aH0gbXVzdCA9PT0gYnNvbiBzaXplICR7aX1gKTtpZihpK3I+ZS5ieXRlTGVuZ3RoKXRocm93IG5ldyBaKGAoYnNvbiBzaXplICR7aX0gKyBvcHRpb25zLmluZGV4ICR7cn0gbXVzdCBiZSA8PSBidWZmZXIgbGVuZ3RoICR7ZS5ieXRlTGVuZ3RofSlgKTtpZigwIT09ZVtyK2ktMV0pdGhyb3cgbmV3IFooIk9uZSBvYmplY3QsIHNpemVkIGNvcnJlY3RseSwgd2l0aCBhIHNwb3QgZm9yIGFuIEVPTywgYnV0IHRoZSBFT08gaXNuJ3QgMHgwMCIpO3JldHVybiBfdChlLHIsdCxuKX1jb25zdCB1dD0vXlwkcmVmJHxeXCRpZCR8XlwkZGIkLztmdW5jdGlvbiBfdChlLHQsbixyPSExKXtjb25zdCBpPW51bGw9PW4uZmllbGRzQXNSYXc/bnVsbDpuLmZpZWxkc0FzUmF3LG89bnVsbCE9bi5yYXcmJm4ucmF3LHM9ImJvb2xlYW4iPT10eXBlb2Ygbi5ic29uUmVnRXhwJiZuLmJzb25SZWdFeHAsYT1uLnByb21vdGVCdWZmZXJzPz8hMSxjPW4ucHJvbW90ZUxvbmdzPz8hMCxmPW4ucHJvbW90ZVZhbHVlcz8/ITAsbD1uLnVzZUJpZ0ludDY0Pz8hMTtpZihsJiYhZil0aHJvdyBuZXcgWigiTXVzdCBlaXRoZXIgcmVxdWVzdCBiaWdpbnQgb3IgTG9uZyBmb3IgaW50NjQgZGVzZXJpYWxpemF0aW9uIik7aWYobCYmIWMpdGhyb3cgbmV3IFooIk11c3QgZWl0aGVyIHJlcXVlc3QgYmlnaW50IG9yIExvbmcgZm9yIGludDY0IGRlc2VyaWFsaXphdGlvbiIpO2xldCB1LF8sZz0hMDtjb25zdCBoPShudWxsPT1uLnZhbGlkYXRpb24/e3V0Zjg6ITB9Om4udmFsaWRhdGlvbikudXRmODtpZigiYm9vbGVhbiI9PXR5cGVvZiBoKXU9aDtlbHNle2c9ITE7Y29uc3QgZT1PYmplY3Qua2V5cyhoKS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBoW2VdfSkpO2lmKDA9PT1lLmxlbmd0aCl0aHJvdyBuZXcgWigiVVRGLTggdmFsaWRhdGlvbiBzZXR0aW5nIGNhbm5vdCBiZSBlbXB0eSIpO2lmKCJib29sZWFuIiE9dHlwZW9mIGVbMF0pdGhyb3cgbmV3IFooIkludmFsaWQgVVRGLTggdmFsaWRhdGlvbiBvcHRpb24sIG11c3Qgc3BlY2lmeSBib29sZWFuIHZhbHVlcyIpO2lmKHU9ZVswXSwhZS5ldmVyeSgoZT0+ZT09PXUpKSl0aHJvdyBuZXcgWigiSW52YWxpZCBVVEYtOCB2YWxpZGF0aW9uIG9wdGlvbiAtIGtleXMgbXVzdCBiZSBhbGwgdHJ1ZSBvciBhbGwgZmFsc2UiKX1pZighZyl7Xz1uZXcgU2V0O2Zvcihjb25zdCBlIG9mIE9iamVjdC5rZXlzKGgpKV8uYWRkKGUpfWNvbnN0IGI9dDtpZihlLmxlbmd0aDw1KXRocm93IG5ldyBaKCJjb3JydXB0IGJzb24gbWVzc2FnZSA8IDUgYnl0ZXMgbG9uZyIpO2NvbnN0IGQ9cGUuZ2V0SW50MzJMRShlLHQpO2lmKHQrPTQsZDw1fHxkPmUubGVuZ3RoKXRocm93IG5ldyBaKCJjb3JydXB0IGJzb24gbWVzc2FnZSIpO2NvbnN0IHc9cj9bXTp7fTtsZXQgcD0wLHk9IXImJm51bGw7Zm9yKDs7KXtjb25zdCBoPWVbdCsrXTtpZigwPT09aClicmVhaztsZXQgYj10O2Zvcig7MCE9PWVbYl0mJmI8ZS5sZW5ndGg7KWIrKztpZihiPj1lLmJ5dGVMZW5ndGgpdGhyb3cgbmV3IFooIkJhZCBCU09OIERvY3VtZW50OiBpbGxlZ2FsIENTdHJpbmciKTtjb25zdCBkPXI/cCsrOl9lLnRvVVRGOChlLHQsYiwhMSk7bGV0IG0sUz0hMDtpZihTPWd8fF8/LmhhcyhkKT91OiF1LCExIT09eSYmIiQiPT09ZFswXSYmKHk9dXQudGVzdChkKSksdD1iKzEsaD09PUkpe2NvbnN0IG49cGUuZ2V0SW50MzJMRShlLHQpO2lmKHQrPTQsbjw9MHx8bj5lLmxlbmd0aC10fHwwIT09ZVt0K24tMV0pdGhyb3cgbmV3IFooImJhZCBzdHJpbmcgbGVuZ3RoIGluIGJzb24iKTttPV9lLnRvVVRGOChlLHQsdCtuLTEsUyksdCs9bn1lbHNlIGlmKGg9PT1MKXtjb25zdCBuPV9lLmFsbG9jYXRlVW5zYWZlKDEyKTtmb3IobGV0IHI9MDtyPDEyO3IrKyluW3JdPWVbdCtyXTttPW5ldyB0dChuKSx0Kz0xMn1lbHNlIGlmKGg9PT1NJiYhMT09PWYpbT1uZXcgWmUocGUuZ2V0SW50MzJMRShlLHQpKSx0Kz00O2Vsc2UgaWYoaD09PU0pbT1wZS5nZXRJbnQzMkxFKGUsdCksdCs9NDtlbHNlIGlmKGg9PT1PKW09cGUuZ2V0RmxvYXQ2NExFKGUsdCksdCs9OCwhMT09PWYmJihtPW5ldyBLZShtKSk7ZWxzZSBpZihoPT09Uil7Y29uc3Qgbj1wZS5nZXRJbnQzMkxFKGUsdCkscj1wZS5nZXRJbnQzMkxFKGUsdCs0KTt0Kz04LG09bmV3IERhdGUobmV3IGplKG4scikudG9OdW1iZXIoKSl9ZWxzZSBpZihoPT09QSl7aWYoMCE9PWVbdF0mJjEhPT1lW3RdKXRocm93IG5ldyBaKCJpbGxlZ2FsIGJvb2xlYW4gdHlwZSB2YWx1ZSIpO209MT09PWVbdCsrXX1lbHNlIGlmKGg9PT1OKXtjb25zdCByPXQsaT1wZS5nZXRJbnQzMkxFKGUsdCk7aWYoaTw9MHx8aT5lLmxlbmd0aC10KXRocm93IG5ldyBaKCJiYWQgZW1iZWRkZWQgZG9jdW1lbnQgbGVuZ3RoIGluIGJzb24iKTtpZihvKW09ZS5zdWJhcnJheSh0LHQraSk7ZWxzZXtsZXQgdD1uO2d8fCh0PXsuLi5uLHZhbGlkYXRpb246e3V0Zjg6U319KSxtPV90KGUscix0LCExKX10Kz1pfWVsc2UgaWYoaD09PXYpe2NvbnN0IHI9dCxvPXBlLmdldEludDMyTEUoZSx0KTtsZXQgcz1uO2NvbnN0IGE9dCtvO2lmKGkmJmlbZF0mJihzPXsuLi5uLHJhdzohMH0pLGd8fChzPXsuLi5zLHZhbGlkYXRpb246e3V0Zjg6U319KSxtPV90KGUscixzLCEwKSwwIT09ZVsodCs9byktMV0pdGhyb3cgbmV3IFooImludmFsaWQgYXJyYXkgdGVybWluYXRvciBieXRlIik7aWYodCE9PWEpdGhyb3cgbmV3IFooImNvcnJ1cHRlZCBhcnJheSBic29uIil9ZWxzZSBpZihoPT09JCltPXZvaWQgMDtlbHNlIGlmKGg9PT1qKW09bnVsbDtlbHNlIGlmKGg9PT1QKWlmKGwpbT1wZS5nZXRCaWdJbnQ2NExFKGUsdCksdCs9ODtlbHNle2NvbnN0IG49cGUuZ2V0SW50MzJMRShlLHQpLHI9cGUuZ2V0SW50MzJMRShlLHQrNCk7dCs9ODtjb25zdCBpPW5ldyBqZShuLHIpO209YyYmITA9PT1mJiZpLmxlc3NUaGFuT3JFcXVhbChjdCkmJmkuZ3JlYXRlclRoYW5PckVxdWFsKGZ0KT9pLnRvTnVtYmVyKCk6aX1lbHNlIGlmKGg9PT1KKXtjb25zdCBuPV9lLmFsbG9jYXRlVW5zYWZlKDE2KTtmb3IobGV0IHI9MDtyPDE2O3IrKyluW3JdPWVbdCtyXTt0Kz0xNixtPW5ldyBIZShuKX1lbHNlIGlmKGg9PT1UKXtsZXQgbj1wZS5nZXRJbnQzMkxFKGUsdCk7dCs9NDtjb25zdCByPW4saT1lW3QrK107aWYobjwwKXRocm93IG5ldyBaKCJOZWdhdGl2ZSBiaW5hcnkgdHlwZSBlbGVtZW50IHNpemUgZm91bmQiKTtpZihuPmUuYnl0ZUxlbmd0aCl0aHJvdyBuZXcgWigiQmluYXJ5IHR5cGUgc2l6ZSBsYXJnZXIgdGhhbiBkb2N1bWVudCBzaXplIik7aWYoaT09PXllLlNVQlRZUEVfQllURV9BUlJBWSl7aWYobj1wZS5nZXRJbnQzMkxFKGUsdCksdCs9NCxuPDApdGhyb3cgbmV3IFooIk5lZ2F0aXZlIGJpbmFyeSB0eXBlIGVsZW1lbnQgc2l6ZSBmb3VuZCBmb3Igc3VidHlwZSAweDAyIik7aWYobj5yLTQpdGhyb3cgbmV3IFooIkJpbmFyeSB0eXBlIHdpdGggc3VidHlwZSAweDAyIGNvbnRhaW5zIHRvbyBsb25nIGJpbmFyeSBzaXplIik7aWYobjxyLTQpdGhyb3cgbmV3IFooIkJpbmFyeSB0eXBlIHdpdGggc3VidHlwZSAweDAyIGNvbnRhaW5zIHRvbyBzaG9ydCBiaW5hcnkgc2l6ZSIpfWEmJmY/bT1fZS50b0xvY2FsQnVmZmVyVHlwZShlLnN1YmFycmF5KHQsdCtuKSk6KG09bmV3IHllKGUuc3ViYXJyYXkodCx0K24pLGkpLGk9PT1IJiZ4ZS5pc1ZhbGlkKG0pJiYobT1tLnRvVVVJRCgpKSksdCs9bn1lbHNlIGlmKGg9PT1GJiYhMT09PXMpe2ZvcihiPXQ7MCE9PWVbYl0mJmI8ZS5sZW5ndGg7KWIrKztpZihiPj1lLmxlbmd0aCl0aHJvdyBuZXcgWigiQmFkIEJTT04gRG9jdW1lbnQ6IGlsbGVnYWwgQ1N0cmluZyIpO2NvbnN0IG49X2UudG9VVEY4KGUsdCxiLCExKTtmb3IoYj10PWIrMTswIT09ZVtiXSYmYjxlLmxlbmd0aDspYisrO2lmKGI+PWUubGVuZ3RoKXRocm93IG5ldyBaKCJCYWQgQlNPTiBEb2N1bWVudDogaWxsZWdhbCBDU3RyaW5nIik7Y29uc3Qgcj1fZS50b1VURjgoZSx0LGIsITEpO3Q9YisxO2NvbnN0IGk9bmV3IEFycmF5KHIubGVuZ3RoKTtmb3IoYj0wO2I8ci5sZW5ndGg7YisrKXN3aXRjaChyW2JdKXtjYXNlIm0iOmlbYl09Im0iO2JyZWFrO2Nhc2UicyI6aVtiXT0iZyI7YnJlYWs7Y2FzZSJpIjppW2JdPSJpIn1tPW5ldyBSZWdFeHAobixpLmpvaW4oIiIpKX1lbHNlIGlmKGg9PT1GJiYhMD09PXMpe2ZvcihiPXQ7MCE9PWVbYl0mJmI8ZS5sZW5ndGg7KWIrKztpZihiPj1lLmxlbmd0aCl0aHJvdyBuZXcgWigiQmFkIEJTT04gRG9jdW1lbnQ6IGlsbGVnYWwgQ1N0cmluZyIpO2NvbnN0IG49X2UudG9VVEY4KGUsdCxiLCExKTtmb3IoYj10PWIrMTswIT09ZVtiXSYmYjxlLmxlbmd0aDspYisrO2lmKGI+PWUubGVuZ3RoKXRocm93IG5ldyBaKCJCYWQgQlNPTiBEb2N1bWVudDogaWxsZWdhbCBDU3RyaW5nIik7Y29uc3Qgcj1fZS50b1VURjgoZSx0LGIsITEpO3Q9YisxLG09bmV3IGl0KG4scil9ZWxzZSBpZihoPT09RCl7Y29uc3Qgbj1wZS5nZXRJbnQzMkxFKGUsdCk7aWYodCs9NCxuPD0wfHxuPmUubGVuZ3RoLXR8fDAhPT1lW3Qrbi0xXSl0aHJvdyBuZXcgWigiYmFkIHN0cmluZyBsZW5ndGggaW4gYnNvbiIpO2NvbnN0IHI9X2UudG9VVEY4KGUsdCx0K24tMSxTKTttPWY/cjpuZXcgb3QociksdCs9bn1lbHNlIGlmKGg9PT1WKW09bmV3IGF0KHtpOnBlLmdldFVpbnQzMkxFKGUsdCksdDpwZS5nZXRVaW50MzJMRShlLHQrNCl9KSx0Kz04O2Vsc2UgaWYoaD09PVcpbT1uZXcgWGU7ZWxzZSBpZihoPT09WSltPW5ldyBHZTtlbHNlIGlmKGg9PT16KXtjb25zdCBuPXBlLmdldEludDMyTEUoZSx0KTtpZih0Kz00LG48PTB8fG4+ZS5sZW5ndGgtdHx8MCE9PWVbdCtuLTFdKXRocm93IG5ldyBaKCJiYWQgc3RyaW5nIGxlbmd0aCBpbiBic29uIik7Y29uc3Qgcj1fZS50b1VURjgoZSx0LHQrbi0xLFMpO209bmV3IEVlKHIpLHQrPW59ZWxzZSBpZihoPT09Qyl7Y29uc3Qgcj1wZS5nZXRJbnQzMkxFKGUsdCk7aWYodCs9NCxyPDEzKXRocm93IG5ldyBaKCJjb2RlX3dfc2NvcGUgdG90YWwgc2l6ZSBzaG9ydGVyIG1pbmltdW0gZXhwZWN0ZWQgbGVuZ3RoIik7Y29uc3QgaT1wZS5nZXRJbnQzMkxFKGUsdCk7aWYodCs9NCxpPD0wfHxpPmUubGVuZ3RoLXR8fDAhPT1lW3QraS0xXSl0aHJvdyBuZXcgWigiYmFkIHN0cmluZyBsZW5ndGggaW4gYnNvbiIpO2NvbnN0IG89X2UudG9VVEY4KGUsdCx0K2ktMSxTKSxzPXQrPWksYT1wZS5nZXRJbnQzMkxFKGUsdCksYz1fdChlLHMsbiwhMSk7aWYodCs9YSxyPDgrYStpKXRocm93IG5ldyBaKCJjb2RlX3dfc2NvcGUgdG90YWwgc2l6ZSBpcyB0b28gc2hvcnQsIHRydW5jYXRpbmcgc2NvcGUiKTtpZihyPjgrYStpKXRocm93IG5ldyBaKCJjb2RlX3dfc2NvcGUgdG90YWwgc2l6ZSBpcyB0b28gbG9uZywgY2xpcHMgb3V0ZXIgZG9jdW1lbnQiKTttPW5ldyBFZShvLGMpfWVsc2V7aWYoaCE9PWspdGhyb3cgbmV3IFooYERldGVjdGVkIHVua25vd24gQlNPTiB0eXBlICR7aC50b1N0cmluZygxNil9IGZvciBmaWVsZG5hbWUgIiR7ZH0iYCk7e2NvbnN0IG49cGUuZ2V0SW50MzJMRShlLHQpO2lmKHQrPTQsbjw9MHx8bj5lLmxlbmd0aC10fHwwIT09ZVt0K24tMV0pdGhyb3cgbmV3IFooImJhZCBzdHJpbmcgbGVuZ3RoIGluIGJzb24iKTtjb25zdCByPV9lLnRvVVRGOChlLHQsdCtuLTEsUyk7dCs9bjtjb25zdCBpPV9lLmFsbG9jYXRlVW5zYWZlKDEyKTtmb3IobGV0IG49MDtuPDEyO24rKylpW25dPWVbdCtuXTtjb25zdCBvPW5ldyB0dChpKTt0Kz0xMixtPW5ldyBPZShyLG8pfX0iX19wcm90b19fIj09PWQ/T2JqZWN0LmRlZmluZVByb3BlcnR5KHcsZCx7dmFsdWU6bSx3cml0YWJsZTohMCxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pOndbZF09bX1pZihkIT09dC1iKXtpZihyKXRocm93IG5ldyBaKCJjb3JydXB0IGFycmF5IGJzb24iKTt0aHJvdyBuZXcgWigiY29ycnVwdCBvYmplY3QgYnNvbiIpfWlmKCF5KXJldHVybiB3O2lmKFVlKHcpKXtjb25zdCBlPU9iamVjdC5hc3NpZ24oe30sdyk7cmV0dXJuIGRlbGV0ZSBlLiRyZWYsZGVsZXRlIGUuJGlkLGRlbGV0ZSBlLiRkYixuZXcgT2Uody4kcmVmLHcuJGlkLHcuJGRiLGUpfXJldHVybiB3fWNvbnN0IGd0PS9ceDAwLyxodD1uZXcgU2V0KFsiJGRiIiwiJHJlZiIsIiRpZCIsIiRjbHVzdGVyVGltZSJdKTtmdW5jdGlvbiBidChlLHQsbixyKXtlW3IrK109STtlWyhyPXIrX2UuZW5jb2RlVVRGOEludG8oZSx0LHIpKzEpLTFdPTA7Y29uc3QgaT1fZS5lbmNvZGVVVEY4SW50byhlLG4scis0KTtyZXR1cm4gcGUuc2V0SW50MzJMRShlLHIsaSsxKSxyPXIrNCtpLGVbcisrXT0wLHJ9ZnVuY3Rpb24gZHQoZSx0LG4scil7Y29uc3QgaT0hT2JqZWN0LmlzKG4sLTApJiZOdW1iZXIuaXNTYWZlSW50ZWdlcihuKSYmbjw9bSYmbj49Uz9NOk87ZVtyKytdPWk7cmV0dXJuIHIrPV9lLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MCxyKz1pPT09TT9wZS5zZXRJbnQzMkxFKGUscixuKTpwZS5zZXRGbG9hdDY0TEUoZSxyLG4pfWZ1bmN0aW9uIHd0KGUsdCxuLHIpe2VbcisrXT1QO3JldHVybiByKz1fZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTAscis9cGUuc2V0QmlnSW50NjRMRShlLHIsbil9ZnVuY3Rpb24gcHQoZSx0LG4scil7ZVtyKytdPWo7cmV0dXJuIHIrPV9lLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MCxyfWZ1bmN0aW9uIHl0KGUsdCxuLHIpe2VbcisrXT1BO3JldHVybiByKz1fZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTAsZVtyKytdPW4/MTowLHJ9ZnVuY3Rpb24gbXQoZSx0LG4scil7ZVtyKytdPVI7cis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9amUuZnJvbU51bWJlcihuLmdldFRpbWUoKSksbz1pLmdldExvd0JpdHMoKSxzPWkuZ2V0SGlnaEJpdHMoKTtyZXR1cm4gcis9cGUuc2V0SW50MzJMRShlLHIsbykscis9cGUuc2V0SW50MzJMRShlLHIscyl9ZnVuY3Rpb24gU3QoZSx0LG4scil7ZVtyKytdPUY7aWYocis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wLG4uc291cmNlJiZudWxsIT1uLnNvdXJjZS5tYXRjaChndCkpdGhyb3cgbmV3IFooInZhbHVlICIrbi5zb3VyY2UrIiBtdXN0IG5vdCBjb250YWluIG51bGwgYnl0ZXMiKTtyZXR1cm4gcis9X2UuZW5jb2RlVVRGOEludG8oZSxuLnNvdXJjZSxyKSxlW3IrK109MCxuLmlnbm9yZUNhc2UmJihlW3IrK109MTA1KSxuLmdsb2JhbCYmKGVbcisrXT0xMTUpLG4ubXVsdGlsaW5lJiYoZVtyKytdPTEwOSksZVtyKytdPTAscn1mdW5jdGlvbiBCdChlLHQsbixyKXtlW3IrK109RjtpZihyKz1fZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTAsbnVsbCE9bi5wYXR0ZXJuLm1hdGNoKGd0KSl0aHJvdyBuZXcgWigicGF0dGVybiAiK24ucGF0dGVybisiIG11c3Qgbm90IGNvbnRhaW4gbnVsbCBieXRlcyIpO3IrPV9lLmVuY29kZVVURjhJbnRvKGUsbi5wYXR0ZXJuLHIpLGVbcisrXT0wO2NvbnN0IGk9bi5vcHRpb25zLnNwbGl0KCIiKS5zb3J0KCkuam9pbigiIik7cmV0dXJuIHIrPV9lLmVuY29kZVVURjhJbnRvKGUsaSxyKSxlW3IrK109MCxyfWZ1bmN0aW9uIHh0KGUsdCxuLHIpe251bGw9PT1uP2VbcisrXT1qOiJNaW5LZXkiPT09bi5fYnNvbnR5cGU/ZVtyKytdPVc6ZVtyKytdPVk7cmV0dXJuIHIrPV9lLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MCxyfWZ1bmN0aW9uIEV0KGUsdCxuLHIpe2VbcisrXT1MO3JldHVybiByKz1fZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTAscis9bi5zZXJpYWxpemVJbnRvKGUscil9ZnVuY3Rpb24gVXQoZSx0LG4scil7ZVtyKytdPVQ7cis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9bi5sZW5ndGg7aWYocis9cGUuc2V0SW50MzJMRShlLHIsaSksZVtyKytdPXEsaTw9MTYpZm9yKGxldCB0PTA7dDxpO3QrKyllW3IrdF09blt0XTtlbHNlIGUuc2V0KG4scik7cmV0dXJuIHIrPWl9ZnVuY3Rpb24gT3QoZSx0LG4scixpLG8scyxhLGMpe2lmKGMuaGFzKG4pKXRocm93IG5ldyBaKCJDYW5ub3QgY29udmVydCBjaXJjdWxhciBzdHJ1Y3R1cmUgdG8gQlNPTiIpO2MuYWRkKG4pLGVbcisrXT1BcnJheS5pc0FycmF5KG4pP3Y6TjtyKz1fZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTA7Y29uc3QgZj1GdChlLG4saSxyLG8rMSxzLGEsYyk7cmV0dXJuIGMuZGVsZXRlKG4pLGZ9ZnVuY3Rpb24gSXQoZSx0LG4scil7ZVtyKytdPUo7cis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2ZvcihsZXQgdD0wO3Q8MTY7dCsrKWVbcit0XT1uLmJ5dGVzW3RdO3JldHVybiByKzE2fWZ1bmN0aW9uIE50KGUsdCxuLHIpe2VbcisrXT0iTG9uZyI9PT1uLl9ic29udHlwZT9QOlY7cis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9bi5nZXRMb3dCaXRzKCksbz1uLmdldEhpZ2hCaXRzKCk7cmV0dXJuIHIrPXBlLnNldEludDMyTEUoZSxyLGkpLHIrPXBlLnNldEludDMyTEUoZSxyLG8pfWZ1bmN0aW9uIHZ0KGUsdCxuLHIpe249bi52YWx1ZU9mKCksZVtyKytdPU07cmV0dXJuIHIrPV9lLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MCxyKz1wZS5zZXRJbnQzMkxFKGUscixuKX1mdW5jdGlvbiBUdChlLHQsbixyKXtlW3IrK109TztyZXR1cm4gcis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wLHIrPXBlLnNldEZsb2F0NjRMRShlLHIsbi52YWx1ZSl9ZnVuY3Rpb24gJHQoZSx0LG4scil7ZVtyKytdPXo7cis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9bi50b1N0cmluZygpLG89X2UuZW5jb2RlVVRGOEludG8oZSxpLHIrNCkrMTtyZXR1cm4gcGUuc2V0SW50MzJMRShlLHIsbykscj1yKzQrby0xLGVbcisrXT0wLHJ9ZnVuY3Rpb24gTHQoZSx0LG4scixpPSExLG89MCxzPSExLGE9ITAsYyl7aWYobi5zY29wZSYmIm9iamVjdCI9PXR5cGVvZiBuLnNjb3BlKXtlW3IrK109QztyKz1fZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTA7bGV0IGY9cjtjb25zdCBsPW4uY29kZTtyKz00O2NvbnN0IHU9X2UuZW5jb2RlVVRGOEludG8oZSxsLHIrNCkrMTtwZS5zZXRJbnQzMkxFKGUscix1KSxlW3IrNCt1LTFdPTAscj1yK3UrNDtjb25zdCBfPUZ0KGUsbi5zY29wZSxpLHIsbysxLHMsYSxjKTtyPV8tMTtjb25zdCBnPV8tZjtmKz1wZS5zZXRJbnQzMkxFKGUsZixnKSxlW3IrK109MH1lbHNle2VbcisrXT16O3IrPV9lLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MDtjb25zdCBpPW4uY29kZS50b1N0cmluZygpLG89X2UuZW5jb2RlVVRGOEludG8oZSxpLHIrNCkrMTtwZS5zZXRJbnQzMkxFKGUscixvKSxyPXIrNCtvLTEsZVtyKytdPTB9cmV0dXJuIHJ9ZnVuY3Rpb24gQXQoZSx0LG4scil7ZVtyKytdPVQ7cis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9bi5idWZmZXI7bGV0IG89bi5wb3NpdGlvbjtpZihuLnN1Yl90eXBlPT09eWUuU1VCVFlQRV9CWVRFX0FSUkFZJiYobys9NCkscis9cGUuc2V0SW50MzJMRShlLHIsbyksZVtyKytdPW4uc3ViX3R5cGUsbi5zdWJfdHlwZT09PXllLlNVQlRZUEVfQllURV9BUlJBWSYmKG8tPTQscis9cGUuc2V0SW50MzJMRShlLHIsbykpLG4uc3ViX3R5cGU9PT15ZS5TVUJUWVBFX1ZFQ1RPUiYmbWUobiksbzw9MTYpZm9yKGxldCB0PTA7dDxvO3QrKyllW3IrdF09aVt0XTtlbHNlIGUuc2V0KGkscik7cmV0dXJuIHIrPW4ucG9zaXRpb259ZnVuY3Rpb24gUnQoZSx0LG4scil7ZVtyKytdPUQ7cis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9X2UuZW5jb2RlVVRGOEludG8oZSxuLnZhbHVlLHIrNCkrMTtyZXR1cm4gcGUuc2V0SW50MzJMRShlLHIsaSkscj1yKzQraS0xLGVbcisrXT0wLHJ9ZnVuY3Rpb24ganQoZSx0LG4scixpLG8scyl7ZVtyKytdPU47cis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2xldCBhPXIsYz17JHJlZjpuLmNvbGxlY3Rpb258fG4ubmFtZXNwYWNlLCRpZDpuLm9pZH07bnVsbCE9bi5kYiYmKGMuJGRiPW4uZGIpLGM9T2JqZWN0LmFzc2lnbihjLG4uZmllbGRzKTtjb25zdCBmPUZ0KGUsYywhMSxyLGkrMSxvLCEwLHMpLGw9Zi1hO3JldHVybiBhKz1wZS5zZXRJbnQzMkxFKGUscixsKSxmfWZ1bmN0aW9uIEZ0KGUsdCxuLHIsaSxvLHMsYSl7aWYobnVsbD09YSl7aWYobnVsbD09dClyZXR1cm4gZVswXT01LGVbMV09MCxlWzJdPTAsZVszXT0wLGVbNF09MCw1O2lmKEFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IFooInNlcmlhbGl6ZSBkb2VzIG5vdCBzdXBwb3J0IGFuIGFycmF5IGFzIHRoZSByb290IGlucHV0Iik7aWYoIm9iamVjdCIhPXR5cGVvZiB0KXRocm93IG5ldyBaKCJzZXJpYWxpemUgZG9lcyBub3Qgc3VwcG9ydCBub24tb2JqZWN0IGFzIHRoZSByb290IGlucHV0Iik7aWYoIl9ic29udHlwZSJpbiB0JiYic3RyaW5nIj09dHlwZW9mIHQuX2Jzb250eXBlKXRocm93IG5ldyBaKCJCU09OIHR5cGVzIGNhbm5vdCBiZSBzZXJpYWxpemVkIGFzIGEgZG9jdW1lbnQiKTtpZihkKHQpfHxoKHQpfHxfKHQpfHxnKHQpKXRocm93IG5ldyBaKCJkYXRlLCByZWdleHAsIHR5cGVkYXJyYXksIGFuZCBhcnJheWJ1ZmZlciBjYW5ub3QgYmUgQlNPTiBkb2N1bWVudHMiKTthPW5ldyBTZXR9YS5hZGQodCk7bGV0IGM9cis0O2lmKEFycmF5LmlzQXJyYXkodCkpZm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspe2NvbnN0IGY9YCR7cn1gO2xldCBsPXRbcl07ImZ1bmN0aW9uIj09dHlwZW9mIGw/LnRvQlNPTiYmKGw9bC50b0JTT04oKSk7Y29uc3QgdT10eXBlb2YgbDtpZih2b2lkIDA9PT1sKWM9cHQoZSxmLDAsYyk7ZWxzZSBpZihudWxsPT09bCljPXB0KGUsZiwwLGMpO2Vsc2UgaWYoInN0cmluZyI9PT11KWM9YnQoZSxmLGwsYyk7ZWxzZSBpZigibnVtYmVyIj09PXUpYz1kdChlLGYsbCxjKTtlbHNlIGlmKCJiaWdpbnQiPT09dSljPXd0KGUsZixsLGMpO2Vsc2UgaWYoImJvb2xlYW4iPT09dSljPXl0KGUsZixsLGMpO2Vsc2UgaWYoIm9iamVjdCI9PT11JiZudWxsPT1sLl9ic29udHlwZSljPWwgaW5zdGFuY2VvZiBEYXRlfHxkKGwpP210KGUsZixsLGMpOmwgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxfKGwpP1V0KGUsZixsLGMpOmwgaW5zdGFuY2VvZiBSZWdFeHB8fGgobCk/U3QoZSxmLGwsYyk6T3QoZSxmLGwsYyxuLGksbyxzLGEpO2Vsc2UgaWYoIm9iamVjdCI9PT11KXtpZihsW3ldIT09cCl0aHJvdyBuZXcgRztpZigiT2JqZWN0SWQiPT09bC5fYnNvbnR5cGUpYz1FdChlLGYsbCxjKTtlbHNlIGlmKCJEZWNpbWFsMTI4Ij09PWwuX2Jzb250eXBlKWM9SXQoZSxmLGwsYyk7ZWxzZSBpZigiTG9uZyI9PT1sLl9ic29udHlwZXx8IlRpbWVzdGFtcCI9PT1sLl9ic29udHlwZSljPU50KGUsZixsLGMpO2Vsc2UgaWYoIkRvdWJsZSI9PT1sLl9ic29udHlwZSljPVR0KGUsZixsLGMpO2Vsc2UgaWYoIkNvZGUiPT09bC5fYnNvbnR5cGUpYz1MdChlLGYsbCxjLG4saSxvLHMsYSk7ZWxzZSBpZigiQmluYXJ5Ij09PWwuX2Jzb250eXBlKWM9QXQoZSxmLGwsYyk7ZWxzZSBpZigiQlNPTlN5bWJvbCI9PT1sLl9ic29udHlwZSljPVJ0KGUsZixsLGMpO2Vsc2UgaWYoIkRCUmVmIj09PWwuX2Jzb250eXBlKWM9anQoZSxmLGwsYyxpLG8sYSk7ZWxzZSBpZigiQlNPTlJlZ0V4cCI9PT1sLl9ic29udHlwZSljPUJ0KGUsZixsLGMpO2Vsc2UgaWYoIkludDMyIj09PWwuX2Jzb250eXBlKWM9dnQoZSxmLGwsYyk7ZWxzZSBpZigiTWluS2V5Ij09PWwuX2Jzb250eXBlfHwiTWF4S2V5Ij09PWwuX2Jzb250eXBlKWM9eHQoZSxmLGwsYyk7ZWxzZSBpZih2b2lkIDAhPT1sLl9ic29udHlwZSl0aHJvdyBuZXcgWihgVW5yZWNvZ25pemVkIG9yIGludmFsaWQgX2Jzb250eXBlOiAke1N0cmluZyhsLl9ic29udHlwZSl9YCl9ZWxzZSJmdW5jdGlvbiI9PT11JiZvJiYoYz0kdChlLGYsbCxjKSl9ZWxzZSBpZih0IGluc3RhbmNlb2YgTWFwfHxiKHQpKXtjb25zdCByPXQuZW50cmllcygpO2xldCBmPSExO2Zvcig7IWY7KXtjb25zdCB0PXIubmV4dCgpO2lmKGY9ISF0LmRvbmUsZiljb250aW51ZTtjb25zdCBsPXQudmFsdWU/dC52YWx1ZVswXTp2b2lkIDA7bGV0IHU9dC52YWx1ZT90LnZhbHVlWzFdOnZvaWQgMDsiZnVuY3Rpb24iPT10eXBlb2YgdT8udG9CU09OJiYodT11LnRvQlNPTigpKTtjb25zdCBnPXR5cGVvZiB1O2lmKCJzdHJpbmciPT10eXBlb2YgbCYmIWh0LmhhcyhsKSl7aWYobnVsbCE9bC5tYXRjaChndCkpdGhyb3cgbmV3IFooImtleSAiK2wrIiBtdXN0IG5vdCBjb250YWluIG51bGwgYnl0ZXMiKTtpZihuKXtpZigiJCI9PT1sWzBdKXRocm93IG5ldyBaKCJrZXkgIitsKyIgbXVzdCBub3Qgc3RhcnQgd2l0aCAnJCciKTtpZihsLmluY2x1ZGVzKCIuIikpdGhyb3cgbmV3IFooImtleSAiK2wrIiBtdXN0IG5vdCBjb250YWluICcuJyIpfX1pZih2b2lkIDA9PT11KSExPT09cyYmKGM9cHQoZSxsLDAsYykpO2Vsc2UgaWYobnVsbD09PXUpYz1wdChlLGwsMCxjKTtlbHNlIGlmKCJzdHJpbmciPT09ZyljPWJ0KGUsbCx1LGMpO2Vsc2UgaWYoIm51bWJlciI9PT1nKWM9ZHQoZSxsLHUsYyk7ZWxzZSBpZigiYmlnaW50Ij09PWcpYz13dChlLGwsdSxjKTtlbHNlIGlmKCJib29sZWFuIj09PWcpYz15dChlLGwsdSxjKTtlbHNlIGlmKCJvYmplY3QiPT09ZyYmbnVsbD09dS5fYnNvbnR5cGUpYz11IGluc3RhbmNlb2YgRGF0ZXx8ZCh1KT9tdChlLGwsdSxjKTp1IGluc3RhbmNlb2YgVWludDhBcnJheXx8Xyh1KT9VdChlLGwsdSxjKTp1IGluc3RhbmNlb2YgUmVnRXhwfHxoKHUpP1N0KGUsbCx1LGMpOk90KGUsbCx1LGMsbixpLG8scyxhKTtlbHNlIGlmKCJvYmplY3QiPT09Zyl7aWYodVt5XSE9PXApdGhyb3cgbmV3IEc7aWYoIk9iamVjdElkIj09PXUuX2Jzb250eXBlKWM9RXQoZSxsLHUsYyk7ZWxzZSBpZigiRGVjaW1hbDEyOCI9PT11Ll9ic29udHlwZSljPUl0KGUsbCx1LGMpO2Vsc2UgaWYoIkxvbmciPT09dS5fYnNvbnR5cGV8fCJUaW1lc3RhbXAiPT09dS5fYnNvbnR5cGUpYz1OdChlLGwsdSxjKTtlbHNlIGlmKCJEb3VibGUiPT09dS5fYnNvbnR5cGUpYz1UdChlLGwsdSxjKTtlbHNlIGlmKCJDb2RlIj09PXUuX2Jzb250eXBlKWM9THQoZSxsLHUsYyxuLGksbyxzLGEpO2Vsc2UgaWYoIkJpbmFyeSI9PT11Ll9ic29udHlwZSljPUF0KGUsbCx1LGMpO2Vsc2UgaWYoIkJTT05TeW1ib2wiPT09dS5fYnNvbnR5cGUpYz1SdChlLGwsdSxjKTtlbHNlIGlmKCJEQlJlZiI9PT11Ll9ic29udHlwZSljPWp0KGUsbCx1LGMsaSxvLGEpO2Vsc2UgaWYoIkJTT05SZWdFeHAiPT09dS5fYnNvbnR5cGUpYz1CdChlLGwsdSxjKTtlbHNlIGlmKCJJbnQzMiI9PT11Ll9ic29udHlwZSljPXZ0KGUsbCx1LGMpO2Vsc2UgaWYoIk1pbktleSI9PT11Ll9ic29udHlwZXx8Ik1heEtleSI9PT11Ll9ic29udHlwZSljPXh0KGUsbCx1LGMpO2Vsc2UgaWYodm9pZCAwIT09dS5fYnNvbnR5cGUpdGhyb3cgbmV3IFooYFVucmVjb2duaXplZCBvciBpbnZhbGlkIF9ic29udHlwZTogJHtTdHJpbmcodS5fYnNvbnR5cGUpfWApfWVsc2UiZnVuY3Rpb24iPT09ZyYmbyYmKGM9JHQoZSxsLHUsYykpfX1lbHNle2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0Py50b0JTT04mJm51bGwhPSh0PXQudG9CU09OKCkpJiYib2JqZWN0IiE9dHlwZW9mIHQpdGhyb3cgbmV3IFooInRvQlNPTiBmdW5jdGlvbiBkaWQgbm90IHJldHVybiBhbiBvYmplY3QiKTtmb3IoY29uc3QgciBvZiBPYmplY3Qua2V5cyh0KSl7bGV0IGY9dFtyXTsiZnVuY3Rpb24iPT10eXBlb2YgZj8udG9CU09OJiYoZj1mLnRvQlNPTigpKTtjb25zdCBsPXR5cGVvZiBmO2lmKCJzdHJpbmciPT10eXBlb2YgciYmIWh0LmhhcyhyKSl7aWYobnVsbCE9ci5tYXRjaChndCkpdGhyb3cgbmV3IFooImtleSAiK3IrIiBtdXN0IG5vdCBjb250YWluIG51bGwgYnl0ZXMiKTtpZihuKXtpZigiJCI9PT1yWzBdKXRocm93IG5ldyBaKCJrZXkgIityKyIgbXVzdCBub3Qgc3RhcnQgd2l0aCAnJCciKTtpZihyLmluY2x1ZGVzKCIuIikpdGhyb3cgbmV3IFooImtleSAiK3IrIiBtdXN0IG5vdCBjb250YWluICcuJyIpfX1pZih2b2lkIDA9PT1mKSExPT09cyYmKGM9cHQoZSxyLDAsYykpO2Vsc2UgaWYobnVsbD09PWYpYz1wdChlLHIsMCxjKTtlbHNlIGlmKCJzdHJpbmciPT09bCljPWJ0KGUscixmLGMpO2Vsc2UgaWYoIm51bWJlciI9PT1sKWM9ZHQoZSxyLGYsYyk7ZWxzZSBpZigiYmlnaW50Ij09PWwpYz13dChlLHIsZixjKTtlbHNlIGlmKCJib29sZWFuIj09PWwpYz15dChlLHIsZixjKTtlbHNlIGlmKCJvYmplY3QiPT09bCYmbnVsbD09Zi5fYnNvbnR5cGUpYz1mIGluc3RhbmNlb2YgRGF0ZXx8ZChmKT9tdChlLHIsZixjKTpmIGluc3RhbmNlb2YgVWludDhBcnJheXx8XyhmKT9VdChlLHIsZixjKTpmIGluc3RhbmNlb2YgUmVnRXhwfHxoKGYpP1N0KGUscixmLGMpOk90KGUscixmLGMsbixpLG8scyxhKTtlbHNlIGlmKCJvYmplY3QiPT09bCl7aWYoZlt5XSE9PXApdGhyb3cgbmV3IEc7aWYoIk9iamVjdElkIj09PWYuX2Jzb250eXBlKWM9RXQoZSxyLGYsYyk7ZWxzZSBpZigiRGVjaW1hbDEyOCI9PT1mLl9ic29udHlwZSljPUl0KGUscixmLGMpO2Vsc2UgaWYoIkxvbmciPT09Zi5fYnNvbnR5cGV8fCJUaW1lc3RhbXAiPT09Zi5fYnNvbnR5cGUpYz1OdChlLHIsZixjKTtlbHNlIGlmKCJEb3VibGUiPT09Zi5fYnNvbnR5cGUpYz1UdChlLHIsZixjKTtlbHNlIGlmKCJDb2RlIj09PWYuX2Jzb250eXBlKWM9THQoZSxyLGYsYyxuLGksbyxzLGEpO2Vsc2UgaWYoIkJpbmFyeSI9PT1mLl9ic29udHlwZSljPUF0KGUscixmLGMpO2Vsc2UgaWYoIkJTT05TeW1ib2wiPT09Zi5fYnNvbnR5cGUpYz1SdChlLHIsZixjKTtlbHNlIGlmKCJEQlJlZiI9PT1mLl9ic29udHlwZSljPWp0KGUscixmLGMsaSxvLGEpO2Vsc2UgaWYoIkJTT05SZWdFeHAiPT09Zi5fYnNvbnR5cGUpYz1CdChlLHIsZixjKTtlbHNlIGlmKCJJbnQzMiI9PT1mLl9ic29udHlwZSljPXZ0KGUscixmLGMpO2Vsc2UgaWYoIk1pbktleSI9PT1mLl9ic29udHlwZXx8Ik1heEtleSI9PT1mLl9ic29udHlwZSljPXh0KGUscixmLGMpO2Vsc2UgaWYodm9pZCAwIT09Zi5fYnNvbnR5cGUpdGhyb3cgbmV3IFooYFVucmVjb2duaXplZCBvciBpbnZhbGlkIF9ic29udHlwZTogJHtTdHJpbmcoZi5fYnNvbnR5cGUpfWApfWVsc2UiZnVuY3Rpb24iPT09bCYmbyYmKGM9JHQoZSxyLGYsYykpfX1hLmRlbGV0ZSh0KSxlW2MrK109MDtjb25zdCBmPWMtcjtyZXR1cm4gcis9cGUuc2V0SW50MzJMRShlLHIsZiksY31jb25zdCBrdD17JG9pZDp0dCwkYmluYXJ5OnllLCR1dWlkOnllLCRzeW1ib2w6b3QsJG51bWJlckludDpaZSwkbnVtYmVyRGVjaW1hbDpIZSwkbnVtYmVyRG91YmxlOktlLCRudW1iZXJMb25nOmplLCRtaW5LZXk6WGUsJG1heEtleTpHZSwkcmVnZXg6aXQsJHJlZ3VsYXJFeHByZXNzaW9uOml0LCR0aW1lc3RhbXA6YXR9O2Z1bmN0aW9uIHp0KGUsdD17fSl7aWYoIm51bWJlciI9PXR5cGVvZiBlKXtjb25zdCBuPWU8PW0mJmU+PVMscj1lPD1CJiZlPj14O2lmKHQucmVsYXhlZHx8dC5sZWdhY3kpcmV0dXJuIGU7aWYoTnVtYmVyLmlzSW50ZWdlcihlKSYmIU9iamVjdC5pcyhlLC0wKSl7aWYobilyZXR1cm4gbmV3IFplKGUpO2lmKHIpcmV0dXJuIHQudXNlQmlnSW50NjQ/QmlnSW50KGUpOmplLmZyb21OdW1iZXIoZSl9cmV0dXJuIG5ldyBLZShlKX1pZihudWxsPT1lfHwib2JqZWN0IiE9dHlwZW9mIGUpcmV0dXJuIGU7aWYoZS4kdW5kZWZpbmVkKXJldHVybiBudWxsO2NvbnN0IG49T2JqZWN0LmtleXMoZSkuZmlsdGVyKCh0PT50LnN0YXJ0c1dpdGgoIiQiKSYmbnVsbCE9ZVt0XSkpO2ZvcihsZXQgcj0wO3I8bi5sZW5ndGg7cisrKXtjb25zdCBpPWt0W25bcl1dO2lmKGkpcmV0dXJuIGkuZnJvbUV4dGVuZGVkSlNPTihlLHQpfWlmKG51bGwhPWUuJGRhdGUpe2NvbnN0IG49ZS4kZGF0ZSxyPW5ldyBEYXRlO2lmKHQubGVnYWN5KWlmKCJudW1iZXIiPT10eXBlb2YgbilyLnNldFRpbWUobik7ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIG4pci5zZXRUaW1lKERhdGUucGFyc2UobikpO2Vsc2V7aWYoImJpZ2ludCIhPXR5cGVvZiBuKXRocm93IG5ldyBYKCJVbnJlY29nbml6ZWQgdHlwZSBmb3IgRUpTT04gZGF0ZTogIit0eXBlb2Ygbik7ci5zZXRUaW1lKE51bWJlcihuKSl9ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIG4pci5zZXRUaW1lKERhdGUucGFyc2UobikpO2Vsc2UgaWYoamUuaXNMb25nKG4pKXIuc2V0VGltZShuLnRvTnVtYmVyKCkpO2Vsc2UgaWYoIm51bWJlciI9PXR5cGVvZiBuJiZ0LnJlbGF4ZWQpci5zZXRUaW1lKG4pO2Vsc2V7aWYoImJpZ2ludCIhPXR5cGVvZiBuKXRocm93IG5ldyBYKCJVbnJlY29nbml6ZWQgdHlwZSBmb3IgRUpTT04gZGF0ZTogIit0eXBlb2Ygbik7ci5zZXRUaW1lKE51bWJlcihuKSl9cmV0dXJuIHJ9aWYobnVsbCE9ZS4kY29kZSl7Y29uc3QgdD1PYmplY3QuYXNzaWduKHt9LGUpO3JldHVybiBlLiRzY29wZSYmKHQuJHNjb3BlPXp0KGUuJHNjb3BlKSksRWUuZnJvbUV4dGVuZGVkSlNPTihlKX1pZihVZShlKXx8ZS4kZGJQb2ludGVyKXtjb25zdCB0PWUuJHJlZj9lOmUuJGRiUG9pbnRlcjtpZih0IGluc3RhbmNlb2YgT2UpcmV0dXJuIHQ7Y29uc3Qgbj1PYmplY3Qua2V5cyh0KS5maWx0ZXIoKGU9PmUuc3RhcnRzV2l0aCgiJCIpKSk7bGV0IHI9ITA7aWYobi5mb3JFYWNoKChlPT57LTE9PT1bIiRyZWYiLCIkaWQiLCIkZGIiXS5pbmRleE9mKGUpJiYocj0hMSl9KSkscilyZXR1cm4gT2UuZnJvbUV4dGVuZGVkSlNPTih0KX1yZXR1cm4gZX1mdW5jdGlvbiBEdChlKXtjb25zdCB0PWUudG9JU09TdHJpbmcoKTtyZXR1cm4gMCE9PWUuZ2V0VVRDTWlsbGlzZWNvbmRzKCk/dDp0LnNsaWNlKDAsLTUpKyJaIn1mdW5jdGlvbiBDdChlLHQpe2lmKGUgaW5zdGFuY2VvZiBNYXB8fGIoZSkpe2NvbnN0IG49T2JqZWN0LmNyZWF0ZShudWxsKTtmb3IoY29uc3RbdCxyXW9mIGUpe2lmKCJzdHJpbmciIT10eXBlb2YgdCl0aHJvdyBuZXcgWigiQ2FuIG9ubHkgc2VyaWFsaXplIG1hcHMgd2l0aCBzdHJpbmcga2V5cyIpO25bdF09cn1yZXR1cm4gQ3Qobix0KX1pZigoIm9iamVjdCI9PXR5cGVvZiBlfHwiZnVuY3Rpb24iPT10eXBlb2YgZSkmJm51bGwhPT1lKXtjb25zdCBuPXQuc2Vlbk9iamVjdHMuZmluZEluZGV4KCh0PT50Lm9iaj09PWUpKTtpZigtMSE9PW4pe2NvbnN0IGU9dC5zZWVuT2JqZWN0cy5tYXAoKGU9PmUucHJvcGVydHlOYW1lKSkscj1lLnNsaWNlKDAsbikubWFwKChlPT5gJHtlfSAtPiBgKSkuam9pbigiIiksaT1lW25dLG89IiAtPiAiK2Uuc2xpY2UobisxLGUubGVuZ3RoLTEpLm1hcCgoZT0+YCR7ZX0gLT4gYCkpLmpvaW4oIiIpLHM9ZVtlLmxlbmd0aC0xXSxhPSIgIi5yZXBlYXQoci5sZW5ndGgraS5sZW5ndGgvMiksYz0iLSIucmVwZWF0KG8ubGVuZ3RoKyhpLmxlbmd0aCtzLmxlbmd0aCkvMi0xKTt0aHJvdyBuZXcgWihgQ29udmVydGluZyBjaXJjdWxhciBzdHJ1Y3R1cmUgdG8gRUpTT046XG4gICAgJHtyfSR7aX0ke299JHtzfVxuICAgICR7YX1cXCR7Y30vYCl9dC5zZWVuT2JqZWN0c1t0LnNlZW5PYmplY3RzLmxlbmd0aC0xXS5vYmo9ZX1pZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBmdW5jdGlvbihlLHQpe3JldHVybiBlLm1hcCgoKGUsbik9Pnt0LnNlZW5PYmplY3RzLnB1c2goe3Byb3BlcnR5TmFtZTpgaW5kZXggJHtufWAsb2JqOm51bGx9KTt0cnl7cmV0dXJuIEN0KGUsdCl9ZmluYWxseXt0LnNlZW5PYmplY3RzLnBvcCgpfX0pKX0oZSx0KTtpZih2b2lkIDA9PT1lKXJldHVybiB0Lmlnbm9yZVVuZGVmaW5lZD92b2lkIDA6bnVsbDtpZihlIGluc3RhbmNlb2YgRGF0ZXx8ZChlKSl7Y29uc3Qgbj1lLmdldFRpbWUoKSxyPW4+LTEmJm48MjUzNDAyMzE4OGU1O3JldHVybiB0LmxlZ2FjeT90LnJlbGF4ZWQmJnI/eyRkYXRlOmUuZ2V0VGltZSgpfTp7JGRhdGU6RHQoZSl9OnQucmVsYXhlZCYmcj97JGRhdGU6RHQoZSl9OnskZGF0ZTp7JG51bWJlckxvbmc6ZS5nZXRUaW1lKCkudG9TdHJpbmcoKX19fWlmKCEoIm51bWJlciIhPXR5cGVvZiBlfHx0LnJlbGF4ZWQmJmlzRmluaXRlKGUpKSl7aWYoTnVtYmVyLmlzSW50ZWdlcihlKSYmIU9iamVjdC5pcyhlLC0wKSl7aWYoZT49UyYmZTw9bSlyZXR1cm57JG51bWJlckludDplLnRvU3RyaW5nKCl9O2lmKGU+PXgmJmU8PUIpcmV0dXJueyRudW1iZXJMb25nOmUudG9TdHJpbmcoKX19cmV0dXJueyRudW1iZXJEb3VibGU6T2JqZWN0LmlzKGUsLTApPyItMC4wIjplLnRvU3RyaW5nKCl9fWlmKCJiaWdpbnQiPT10eXBlb2YgZSlyZXR1cm4gdC5yZWxheGVkP051bWJlcihCaWdJbnQuYXNJbnROKDY0LGUpKTp7JG51bWJlckxvbmc6QmlnSW50LmFzSW50Tig2NCxlKS50b1N0cmluZygpfTtpZihlIGluc3RhbmNlb2YgUmVnRXhwfHxoKGUpKXtsZXQgbj1lLmZsYWdzO2lmKHZvaWQgMD09PW4pe2NvbnN0IHQ9ZS50b1N0cmluZygpLm1hdGNoKC9bZ2ltdXldKiQvKTt0JiYobj10WzBdKX1yZXR1cm4gbmV3IGl0KGUuc291cmNlLG4pLnRvRXh0ZW5kZWRKU09OKHQpfXJldHVybiBudWxsIT1lJiYib2JqZWN0Ij09dHlwZW9mIGU/ZnVuY3Rpb24oZSx0KXtpZihudWxsPT1lfHwib2JqZWN0IiE9dHlwZW9mIGUpdGhyb3cgbmV3IFooIm5vdCBhbiBvYmplY3QgaW5zdGFuY2UiKTtjb25zdCBuPWUuX2Jzb250eXBlO2lmKHZvaWQgMD09PW4pe2NvbnN0IG49e307Zm9yKGNvbnN0IHIgb2YgT2JqZWN0LmtleXMoZSkpe3Quc2Vlbk9iamVjdHMucHVzaCh7cHJvcGVydHlOYW1lOnIsb2JqOm51bGx9KTt0cnl7Y29uc3QgaT1DdChlW3JdLHQpOyJfX3Byb3RvX18iPT09cj9PYmplY3QuZGVmaW5lUHJvcGVydHkobixyLHt2YWx1ZTppLHdyaXRhYmxlOiEwLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSk6bltyXT1pfWZpbmFsbHl7dC5zZWVuT2JqZWN0cy5wb3AoKX19cmV0dXJuIG59aWYobnVsbCE9ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYic3RyaW5nIj09dHlwZW9mIGUuX2Jzb250eXBlJiZlW3ldIT09cCl0aHJvdyBuZXcgRztpZihmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYiX2Jzb250eXBlImluIGUmJiJzdHJpbmciPT10eXBlb2YgZS5fYnNvbnR5cGV9KGUpKXtsZXQgcj1lO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiByLnRvRXh0ZW5kZWRKU09OKXtjb25zdCB0PU10W2UuX2Jzb250eXBlXTtpZighdCl0aHJvdyBuZXcgWigiVW5yZWNvZ25pemVkIG9yIGludmFsaWQgX2Jzb250eXBlOiAiK2UuX2Jzb250eXBlKTtyPXQocil9cmV0dXJuIkNvZGUiPT09biYmci5zY29wZT9yPW5ldyBFZShyLmNvZGUsQ3Qoci5zY29wZSx0KSk6IkRCUmVmIj09PW4mJnIub2lkJiYocj1uZXcgT2UoQ3Qoci5jb2xsZWN0aW9uLHQpLEN0KHIub2lkLHQpLEN0KHIuZGIsdCksQ3Qoci5maWVsZHMsdCkpKSxyLnRvRXh0ZW5kZWRKU09OKHQpfXRocm93IG5ldyBaKCJfYnNvbnR5cGUgbXVzdCBiZSBhIHN0cmluZywgYnV0IHdhczogIit0eXBlb2Ygbil9KGUsdCk6ZX1jb25zdCBNdD17QmluYXJ5OmU9Pm5ldyB5ZShlLnZhbHVlKCksZS5zdWJfdHlwZSksQ29kZTplPT5uZXcgRWUoZS5jb2RlLGUuc2NvcGUpLERCUmVmOmU9Pm5ldyBPZShlLmNvbGxlY3Rpb258fGUubmFtZXNwYWNlLGUub2lkLGUuZGIsZS5maWVsZHMpLERlY2ltYWwxMjg6ZT0+bmV3IEhlKGUuYnl0ZXMpLERvdWJsZTplPT5uZXcgS2UoZS52YWx1ZSksSW50MzI6ZT0+bmV3IFplKGUudmFsdWUpLExvbmc6ZT0+amUuZnJvbUJpdHMobnVsbCE9ZS5sb3c/ZS5sb3c6ZS5sb3dfLG51bGwhPWUubG93P2UuaGlnaDplLmhpZ2hfLG51bGwhPWUubG93P2UudW5zaWduZWQ6ZS51bnNpZ25lZF8pLE1heEtleTooKT0+bmV3IEdlLE1pbktleTooKT0+bmV3IFhlLE9iamVjdElkOmU9Pm5ldyB0dChlKSxCU09OUmVnRXhwOmU9Pm5ldyBpdChlLnBhdHRlcm4sZS5vcHRpb25zKSxCU09OU3ltYm9sOmU9Pm5ldyBvdChlLnZhbHVlKSxUaW1lc3RhbXA6ZT0+YXQuZnJvbUJpdHMoZS5sb3csZS5oaWdoKX07ZnVuY3Rpb24gVnQoZSx0KXtjb25zdCBuPXt1c2VCaWdJbnQ2NDp0Py51c2VCaWdJbnQ2ND8/ITEscmVsYXhlZDp0Py5yZWxheGVkPz8hMCxsZWdhY3k6dD8ubGVnYWN5Pz8hMX07cmV0dXJuIEpTT04ucGFyc2UoZSwoKGUsdCk9PntpZigtMSE9PWUuaW5kZXhPZigiXDAiKSl0aHJvdyBuZXcgWihgQlNPTiBEb2N1bWVudCBmaWVsZCBuYW1lcyBjYW5ub3QgY29udGFpbiBudWxsIGJ5dGVzLCBmb3VuZDogJHtKU09OLnN0cmluZ2lmeShlKX1gKTtyZXR1cm4genQodCxuKX0pKX1mdW5jdGlvbiBQdChlLHQsbixyKXtudWxsIT1uJiYib2JqZWN0Ij09dHlwZW9mIG4mJihyPW4sbj0wKSxudWxsPT10fHwib2JqZWN0IiE9dHlwZW9mIHR8fEFycmF5LmlzQXJyYXkodCl8fChyPXQsdD12b2lkIDAsbj0wKTtjb25zdCBpPUN0KGUsT2JqZWN0LmFzc2lnbih7cmVsYXhlZDohMCxsZWdhY3k6ITF9LHIse3NlZW5PYmplY3RzOlt7cHJvcGVydHlOYW1lOiIocm9vdCkiLG9iajpudWxsfV19KSk7cmV0dXJuIEpTT04uc3RyaW5naWZ5KGksdCxuKX1jb25zdCBKdD1PYmplY3QuY3JlYXRlKG51bGwpO0p0LnBhcnNlPVZ0LEp0LnN0cmluZ2lmeT1QdCxKdC5zZXJpYWxpemU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD10fHx7fSxKU09OLnBhcnNlKFB0KGUsdCkpfSxKdC5kZXNlcmlhbGl6ZT1mdW5jdGlvbihlLHQpe3JldHVybiB0PXR8fHt9LFZ0KEpTT04uc3RyaW5naWZ5KGUpLHQpfSxPYmplY3QuZnJlZXplKEp0KTtjb25zdCBXdD0xLFl0PTIscXQ9MyxIdD00LEt0PTUsWnQ9NixHdD03LFh0PTgsUXQ9OSxlbj0xMCx0bj0xMSxubj0xMixybj0xMyxvbj0xNCxzbj0xNSxhbj0xNixjbj0xNyxmbj0xOCxsbj0xOSx1bj0yNTUsX249MTI3O2Z1bmN0aW9uIGduKGUsdCl7dHJ5e3JldHVybiBwZS5nZXROb25uZWdhdGl2ZUludDMyTEUoZSx0KX1jYXRjaChlKXt0aHJvdyBuZXcgUSgiQlNPTiBzaXplIGNhbm5vdCBiZSBuZWdhdGl2ZSIsdCx7Y2F1c2U6ZX0pfX1mdW5jdGlvbiBobihlLHQpe2xldCBuPXQ7Zm9yKDswIT09ZVtuXTtuKyspO2lmKG49PT1lLmxlbmd0aC0xKXRocm93IG5ldyBRKCJOdWxsIHRlcm1pbmF0b3Igbm90IGZvdW5kIix0KTtyZXR1cm4gbn1jb25zdCBibj1PYmplY3QuY3JlYXRlKG51bGwpO2JuLnBhcnNlVG9FbGVtZW50cz1mdW5jdGlvbihlLHQ9MCl7aWYodD8/PTAsZS5sZW5ndGg8NSl0aHJvdyBuZXcgUShgSW5wdXQgbXVzdCBiZSBhdCBsZWFzdCA1IGJ5dGVzLCBnb3QgJHtlLmxlbmd0aH0gYnl0ZXNgLHQpO2NvbnN0IG49Z24oZSx0KTtpZihuPmUubGVuZ3RoLXQpdGhyb3cgbmV3IFEoYFBhcnNlZCBkb2N1bWVudFNpemUgKCR7bn0gYnl0ZXMpIGRvZXMgbm90IG1hdGNoIGlucHV0IGxlbmd0aCAoJHtlLmxlbmd0aH0gYnl0ZXMpYCx0KTtpZigwIT09ZVt0K24tMV0pdGhyb3cgbmV3IFEoIkJTT04gZG9jdW1lbnRzIG11c3QgZW5kIGluIDB4MDAiLHQrbik7Y29uc3Qgcj1bXTtsZXQgaT10KzQ7Zm9yKDtpPD1uK3Q7KXtjb25zdCBvPWVbaV07aWYoaSs9MSwwPT09byl7aWYoaS10IT09bil0aHJvdyBuZXcgUSgiSW52YWxpZCAweDAwIHR5cGUgYnl0ZSIsaSk7YnJlYWt9Y29uc3Qgcz1pLGE9aG4oZSxpKS1zO2xldCBjO2lmKGkrPWErMSxvPT09V3R8fG89PT1mbnx8bz09PVF0fHxvPT09Y24pYz04O2Vsc2UgaWYobz09PWFuKWM9NDtlbHNlIGlmKG89PT1HdCljPTEyO2Vsc2UgaWYobz09PWxuKWM9MTY7ZWxzZSBpZihvPT09WHQpYz0xO2Vsc2UgaWYobz09PWVufHxvPT09WnR8fG89PT1fbnx8bz09PXVuKWM9MDtlbHNlIGlmKG89PT10biljPWhuKGUsaG4oZSxpKSsxKSsxLWk7ZWxzZSBpZihvPT09cXR8fG89PT1IdHx8bz09PXNuKWM9Z24oZSxpKTtlbHNle2lmKG8hPT1ZdCYmbyE9PUt0JiZvIT09bm4mJm8hPT1ybiYmbyE9PW9uKXRocm93IG5ldyBRKGBJbnZhbGlkIDB4JHtvLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCIwIil9IHR5cGUgYnl0ZWAsaSk7Yz1nbihlLGkpKzQsbz09PUt0JiYoYys9MSksbz09PW5uJiYoYys9MTIpfWlmKGM+bil0aHJvdyBuZXcgUSgidmFsdWUgcmVwb3J0cyBsZW5ndGggbGFyZ2VyIHRoYW4gZG9jdW1lbnQiLGkpO3IucHVzaChbbyxzLGEsaSxjXSksaSs9Y31yZXR1cm4gcn0sYm4uQnl0ZVV0aWxzPV9lLGJuLk51bWJlclV0aWxzPXBlLE9iamVjdC5mcmVlemUoYm4pO2NvbnN0IGRuPTE3ODI1NzkyO2xldCB3bj1fZS5hbGxvY2F0ZShkbik7dmFyIHBuPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLEJTT05FcnJvcjpaLEJTT05PZmZzZXRFcnJvcjpRLEJTT05SZWdFeHA6aXQsQlNPTlJ1bnRpbWVFcnJvcjpYLEJTT05TeW1ib2w6b3QsQlNPTlR5cGU6SyxCU09OVmFsdWU6aGUsQlNPTlZlcnNpb25FcnJvcjpHLEJpbmFyeTp5ZSxCeXRlVXRpbHM6X2UsQ29kZTpFZSxEQlJlZjpPZSxEZWNpbWFsMTI4OkhlLERvdWJsZTpLZSxFSlNPTjpKdCxJbnQzMjpaZSxMb25nOmplLE1heEtleTpHZSxNaW5LZXk6WGUsTnVtYmVyVXRpbHM6cGUsT2JqZWN0SWQ6dHQsVGltZXN0YW1wOmF0LFVVSUQ6eGUsYnNvblR5cGU6Z2UsY2FsY3VsYXRlT2JqZWN0U2l6ZTpmdW5jdGlvbihlLHQ9e30pe3JldHVybiBudChlLCJib29sZWFuIj09dHlwZW9mKHQ9dHx8e30pLnNlcmlhbGl6ZUZ1bmN0aW9ucyYmdC5zZXJpYWxpemVGdW5jdGlvbnMsImJvb2xlYW4iIT10eXBlb2YgdC5pZ25vcmVVbmRlZmluZWR8fHQuaWdub3JlVW5kZWZpbmVkKX0sZGVzZXJpYWxpemU6ZnVuY3Rpb24oZSx0PXt9KXtyZXR1cm4gbHQoX2UudG9Mb2NhbEJ1ZmZlclR5cGUoZSksdCl9LGRlc2VyaWFsaXplU3RyZWFtOmZ1bmN0aW9uKGUsdCxuLHIsaSxvKXtjb25zdCBzPU9iamVjdC5hc3NpZ24oe2FsbG93T2JqZWN0U21hbGxlclRoYW5CdWZmZXJTaXplOiEwLGluZGV4OjB9LG8pLGE9X2UudG9Mb2NhbEJ1ZmZlclR5cGUoZSk7bGV0IGM9dDtmb3IobGV0IGU9MDtlPG47ZSsrKXtjb25zdCB0PXBlLmdldEludDMyTEUoYSxjKTtzLmluZGV4PWMscltpK2VdPWx0KGEscyksYys9dH1yZXR1cm4gY30sb25EZW1hbmQ6Ym4sc2VyaWFsaXplOmZ1bmN0aW9uKGUsdD17fSl7Y29uc3Qgbj0iYm9vbGVhbiI9PXR5cGVvZiB0LmNoZWNrS2V5cyYmdC5jaGVja0tleXMscj0iYm9vbGVhbiI9PXR5cGVvZiB0LnNlcmlhbGl6ZUZ1bmN0aW9ucyYmdC5zZXJpYWxpemVGdW5jdGlvbnMsaT0iYm9vbGVhbiIhPXR5cGVvZiB0Lmlnbm9yZVVuZGVmaW5lZHx8dC5pZ25vcmVVbmRlZmluZWQsbz0ibnVtYmVyIj09dHlwZW9mIHQubWluSW50ZXJuYWxCdWZmZXJTaXplP3QubWluSW50ZXJuYWxCdWZmZXJTaXplOmRuO3duLmxlbmd0aDxvJiYod249X2UuYWxsb2NhdGUobykpO2NvbnN0IHM9RnQod24sZSxuLDAsMCxyLGksbnVsbCksYT1fZS5hbGxvY2F0ZVVuc2FmZShzKTtyZXR1cm4gYS5zZXQod24uc3ViYXJyYXkoMCxzKSwwKSxhfSxzZXJpYWxpemVXaXRoQnVmZmVyQW5kSW5kZXg6ZnVuY3Rpb24oZSx0LG49e30pe2NvbnN0IHI9ImJvb2xlYW4iPT10eXBlb2Ygbi5jaGVja0tleXMmJm4uY2hlY2tLZXlzLGk9ImJvb2xlYW4iPT10eXBlb2Ygbi5zZXJpYWxpemVGdW5jdGlvbnMmJm4uc2VyaWFsaXplRnVuY3Rpb25zLG89ImJvb2xlYW4iIT10eXBlb2Ygbi5pZ25vcmVVbmRlZmluZWR8fG4uaWdub3JlVW5kZWZpbmVkLHM9Im51bWJlciI9PXR5cGVvZiBuLmluZGV4P24uaW5kZXg6MCxhPUZ0KHduLGUsciwwLDAsaSxvLG51bGwpO3JldHVybiB0LnNldCh3bi5zdWJhcnJheSgwLGEpLHMpLHMrYS0xfSxzZXRJbnRlcm5hbEJ1ZmZlclNpemU6ZnVuY3Rpb24oZSl7d24ubGVuZ3RoPGUmJih3bj1fZS5hbGxvY2F0ZShlKSl9fSk7Y2xhc3MgeW57Y29uc3RydWN0b3IoKXt9c3RhdGljIHVybENvbnN0cnVjdEZyb20oZSl7Y29uc3QgdD0iL3dzL21vZGVsaW5nL2NvbW1hbmRzIitmdW5jdGlvbihlKXtjb25zdCB0PW5ldyBVUkxTZWFyY2hQYXJhbXM7Zm9yKGNvbnN0W24scl1vZiBPYmplY3QuZW50cmllcyhlKSlpZih2b2lkIDAhPT1yKWlmKEFycmF5LmlzQXJyYXkocikpZm9yKGNvbnN0IGUgb2Ygcil0LmFwcGVuZChuLFN0cmluZyhlKSk7ZWxzZSB0LmFwcGVuZChuLFN0cmluZyhyKSk7Y29uc3Qgbj10LnRvU3RyaW5nKCk7cmV0dXJuIG4/YD8ke259YDoiIn0oe3ZpZGVvX3Jlc193aWR0aDplLnZpZGVvX3Jlc193aWR0aCx2aWRlb19yZXNfaGVpZ2h0OmUudmlkZW9fcmVzX2hlaWdodCxmcHM6ZS5mcHMsdW5sb2NrZWRfZnJhbWVyYXRlOmUudW5sb2NrZWRfZnJhbWVyYXRlLHBvc3RfZWZmZWN0OmUucG9zdF9lZmZlY3Qsd2VicnRjOmUud2VicnRjLHBvb2w6ZS5wb29sLHNob3dfZ3JpZDplLnNob3dfZ3JpZCxyZXBsYXk6ZS5yZXBsYXksYXBpX2NhbGxfaWQ6ZS5hcGlfY2FsbF9pZCxvcmRlcl9pbmRlcGVuZGVudF90cmFuc3BhcmVuY3k6ZS5vcmRlcl9pbmRlcGVuZGVudF90cmFuc3BhcmVuY3kscHI6ZS5wcn0pLG49KChlLmNsaWVudD8uYmFzZVVybHx8Imh0dHBzOi8vYXBpLnpvby5kZXYiKSt0KS5yZXBsYWNlKC9eaHR0cC8sIndzIik7cmV0dXJuIG5ldyBVUkwobil9c3RhdGljIGF1dGhlbnRpY2F0ZShlLHQpe2NvbnN0IG49ZS5jbGllbnQmJmUuY2xpZW50LnRva2VufHwiIjtpZihuKXRyeXtjb25zdCBlPXt0eXBlOiJoZWFkZXJzIixoZWFkZXJzOntBdXRob3JpemF0aW9uOmBCZWFyZXIgJHtufWB9fTt0LnNlbmQoSlNPTi5zdHJpbmdpZnkoZSkpfWNhdGNoe319c3RhdGljIHRvQlNPTihlKXtyZXR1cm4gcG4uc2VyaWFsaXplKGUpfXN0YXRpYyBwYXJzZU1lc3NhZ2UoZSl7Y29uc3QgdD1lPy5kYXRhO2lmKCJzdHJpbmciPT10eXBlb2YgdClyZXR1cm4gSlNPTi5wYXJzZSh0KTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEJ1ZmZlciYmQnVmZmVyLmlzQnVmZmVyPy4odCkpe2NvbnN0IGU9dDt0cnl7cmV0dXJuIEpTT04ucGFyc2UoZS50b1N0cmluZygidXRmOCIpKX1jYXRjaHt9cmV0dXJuIHBuLmRlc2VyaWFsaXplKGUpfWlmKHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcil7Y29uc3QgZT1uZXcgVWludDhBcnJheSh0KTt0cnl7Y29uc3QgdD0obmV3IFRleHREZWNvZGVyKS5kZWNvZGUoZSk7cmV0dXJuIEpTT04ucGFyc2UodCl9Y2F0Y2h7fXJldHVybiBwbi5kZXNlcmlhbGl6ZShlKX1pZigobj10KSYmIm9iamVjdCI9PXR5cGVvZiBuJiYiYnVmZmVyImluIG4mJm4uYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXImJiJudW1iZXIiPT10eXBlb2Ygbi5ieXRlT2Zmc2V0JiYibnVtYmVyIj09dHlwZW9mIG4uYnl0ZUxlbmd0aCl7Y29uc3QgZT1uZXcgVWludDhBcnJheSh0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQsdC5ieXRlTGVuZ3RoKTt0cnl7Y29uc3QgdD0obmV3IFRleHREZWNvZGVyKS5kZWNvZGUoZSk7cmV0dXJuIEpTT04ucGFyc2UodCl9Y2F0Y2h7fXJldHVybiBwbi5kZXNlcmlhbGl6ZShlKX12YXIgbjtyZXR1cm4gdH19Y2xhc3MgbW57X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgZT10aGlzLl9fd2JnX3B0cjtyZXR1cm4gdGhpcy5fX3diZ19wdHI9MCxSbi51bnJlZ2lzdGVyKHRoaXMpLGV9ZnJlZSgpe2NvbnN0IGU9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt1ci5fX3diZ19jb250ZXh0X2ZyZWUoZSwwKX1hZGRfY29uc3RyYWludChlLHQsbixyLGkpe2NvbnN0IG89b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHM9X3IsYT1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYz1fcixmPW9yKG4sdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxsPV9yLHU9b3Iocix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLF89X3I7cmV0dXJuIHVyLmNvbnRleHRfYWRkX2NvbnN0cmFpbnQodGhpcy5fX3diZ19wdHIsbyxzLGEsYyxmLGwsdSxfLGkpfWFkZF9maWxlKGUsdCl7Y29uc3Qgbj1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYykscj1fcjtyZXR1cm4gdXIuY29udGV4dF9hZGRfZmlsZSh0aGlzLl9fd2JnX3B0cixlLG4scil9YWRkX3NlZ21lbnQoZSx0LG4scixpLG8pe2NvbnN0IHM9b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGE9X3IsYz1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksZj1fcixsPW9yKG4sdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSx1PV9yO3ZhciBfPW5yKHIpPzA6b3Iocix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGc9X3I7Y29uc3QgaD1vcihpLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYj1fcjtyZXR1cm4gdXIuY29udGV4dF9hZGRfc2VnbWVudCh0aGlzLl9fd2JnX3B0cixzLGEsYyxmLGwsdSxfLGcsaCxiLG8pfWJ1c3RDYWNoZUFuZFJlc2V0U2NlbmUoZSx0KXtjb25zdCBuPW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxyPV9yO3ZhciBpPW5yKHQpPzA6b3IodCx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLG89X3I7cmV0dXJuIHVyLmNvbnRleHRfYnVzdENhY2hlQW5kUmVzZXRTY2VuZSh0aGlzLl9fd2JnX3B0cixuLHIsaSxvKX1jaGFpbl9zZWdtZW50KGUsdCxuLHIsaSxvLHMpe2NvbnN0IGE9b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGM9X3IsZj1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbD1fcix1PW9yKG4sdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxfPV9yLGc9b3Iocix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGg9X3I7dmFyIGI9bnIoaSk/MDpvcihpLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksZD1fcjtjb25zdCB3PW9yKG8sdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxwPV9yO3JldHVybiB1ci5jb250ZXh0X2NoYWluX3NlZ21lbnQodGhpcy5fX3diZ19wdHIsYSxjLGYsbCx1LF8sZyxoLGIsZCx3LHAscyl9Y2xlYXJfc2tldGNoX2NoZWNrcG9pbnRzKCl7cmV0dXJuIHVyLmNvbnRleHRfY2xlYXJfc2tldGNoX2NoZWNrcG9pbnRzKHRoaXMuX193YmdfcHRyKX1kZWxldGVfb2JqZWN0cyhlLHQsbixyLGksbyl7Y29uc3Qgcz1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYT1fcixjPW9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxmPV9yLGw9b3Iobix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHU9X3IsXz1vcihyLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksZz1fcixoPW9yKGksdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxiPV9yO3JldHVybiB1ci5jb250ZXh0X2RlbGV0ZV9vYmplY3RzKHRoaXMuX193YmdfcHRyLHMsYSxjLGYsbCx1LF8sZyxoLGIsbyl9ZGVsZXRlX3NrZXRjaChlLHQsbil7Y29uc3Qgcj1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksaT1fcixvPW9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxzPV9yLGE9b3Iobix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGM9X3I7cmV0dXJuIHVyLmNvbnRleHRfZGVsZXRlX3NrZXRjaCh0aGlzLl9fd2JnX3B0cixyLGksbyxzLGEsYyl9ZWRpdF9jb25zdHJhaW50KGUsdCxuLHIsaSxvKXtjb25zdCBzPW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxhPV9yLGM9b3IodCx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGY9X3IsbD1vcihuLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksdT1fcixfPW9yKHIsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxnPV9yLGg9b3IoaSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGI9X3I7cmV0dXJuIHVyLmNvbnRleHRfZWRpdF9jb25zdHJhaW50KHRoaXMuX193YmdfcHRyLHMsYSxjLGYsbCx1LF8sZyxoLGIsbyl9ZWRpdF9zZWdtZW50cyhlLHQsbixyLGkpe2NvbnN0IG89b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHM9X3IsYT1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYz1fcixmPW9yKG4sdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxsPV9yLHU9b3Iocix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLF89X3I7cmV0dXJuIHVyLmNvbnRleHRfZWRpdF9zZWdtZW50cyh0aGlzLl9fd2JnX3B0cixvLHMsYSxjLGYsbCx1LF8saSl9ZWRpdF9za2V0Y2goZSx0LG4scixpKXtjb25zdCBvPW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxzPV9yLGE9b3IodCx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGM9X3IsZj1vcihuLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbD1fcix1PW9yKHIsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxfPV9yLGc9b3IoaSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGg9X3I7cmV0dXJuIHVyLmNvbnRleHRfZWRpdF9za2V0Y2godGhpcy5fX3diZ19wdHIsbyxzLGEsYyxmLGwsdSxfLGcsaCl9ZXhlY3V0ZShlLHQsbil7Y29uc3Qgcj1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksaT1fcjt2YXIgbz1ucih0KT8wOm9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxzPV9yO2NvbnN0IGE9b3Iobix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGM9X3I7cmV0dXJuIHVyLmNvbnRleHRfZXhlY3V0ZSh0aGlzLl9fd2JnX3B0cixyLGksbyxzLGEsYyl9ZXhlY3V0ZU1vY2soZSx0LG4scil7Y29uc3QgaT1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbz1fcjt2YXIgcz1ucih0KT8wOm9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxhPV9yO2NvbnN0IGM9b3Iobix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGY9X3I7cmV0dXJuIHVyLmNvbnRleHRfZXhlY3V0ZU1vY2sodGhpcy5fX3diZ19wdHIsaSxvLHMsYSxjLGYscil9ZXhlY3V0ZV90cmltKGUsdCxuLHIpe2NvbnN0IGk9b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLG89X3Iscz1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYT1fcixjPWlyKG4sdXIuX193YmluZGdlbl9tYWxsb2MpLGY9X3IsbD1vcihyLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksdT1fcjtyZXR1cm4gdXIuY29udGV4dF9leGVjdXRlX3RyaW0odGhpcy5fX3diZ19wdHIsaSxvLHMsYSxjLGYsbCx1KX1leGl0X3NrZXRjaChlLHQsbil7Y29uc3Qgcj1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksaT1fcixvPW9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxzPV9yLGE9b3Iobix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGM9X3I7cmV0dXJuIHVyLmNvbnRleHRfZXhpdF9za2V0Y2godGhpcy5fX3diZ19wdHIscixpLG8scyxhLGMpfWV4cG9ydChlLHQpe2NvbnN0IG49b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHI9X3IsaT1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbz1fcjtyZXR1cm4gdXIuY29udGV4dF9leHBvcnQodGhpcy5fX3diZ19wdHIsbixyLGksbyl9Z2V0X2ZpbGUoZSx0KXtyZXR1cm4gdXIuY29udGV4dF9nZXRfZmlsZSh0aGlzLl9fd2JnX3B0cixlLHQpfWdldF9wcm9qZWN0KGUpe3JldHVybiB1ci5jb250ZXh0X2dldF9wcm9qZWN0KHRoaXMuX193YmdfcHRyLGUpfWhhY2tfc2V0X3Byb2dyYW0oZSx0KXtjb25zdCBuPW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxyPV9yLGk9b3IodCx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLG89X3I7cmV0dXJuIHVyLmNvbnRleHRfaGFja19zZXRfcHJvZ3JhbSh0aGlzLl9fd2JnX3B0cixuLHIsaSxvKX1jb25zdHJ1Y3RvcihlLHQpe2NvbnN0IG49dXIuY29udGV4dF9uZXcoZSx0KTtpZihuWzJdKXRocm93IHNyKG5bMV0pO3JldHVybiB0aGlzLl9fd2JnX3B0cj1uWzBdPj4+MCxSbi5yZWdpc3Rlcih0aGlzLHRoaXMuX193YmdfcHRyLHRoaXMpLHRoaXN9bmV3X3NrZXRjaChlLHQsbixyLGkpe2NvbnN0IG89b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHM9X3IsYT1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYz1fcixmPW9yKG4sdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxsPV9yLHU9b3Iocix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLF89X3IsZz1vcihpLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksaD1fcjtyZXR1cm4gdXIuY29udGV4dF9uZXdfc2tldGNoKHRoaXMuX193YmdfcHRyLG8scyxhLGMsZixsLHUsXyxnLGgpfW9wZW5fcHJvamVjdChlLHQsbil7Y29uc3Qgcj1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksaT1fcjtyZXR1cm4gdXIuY29udGV4dF9vcGVuX3Byb2plY3QodGhpcy5fX3diZ19wdHIsZSxyLGksbil9cmVmcmVzaChlKXtyZXR1cm4gdXIuY29udGV4dF9yZWZyZXNoKHRoaXMuX193YmdfcHRyLGUpfXJlbW92ZV9maWxlKGUsdCl7cmV0dXJuIHVyLmNvbnRleHRfcmVtb3ZlX2ZpbGUodGhpcy5fX3diZ19wdHIsZSx0KX1yZXN0b3JlX3NrZXRjaF9jaGVja3BvaW50KGUpe2NvbnN0IHQ9b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLG49X3I7cmV0dXJuIHVyLmNvbnRleHRfcmVzdG9yZV9za2V0Y2hfY2hlY2twb2ludCh0aGlzLl9fd2JnX3B0cix0LG4pfXNlbmRSZXNwb25zZShlKXtyZXR1cm4gdXIuY29udGV4dF9zZW5kUmVzcG9uc2UodGhpcy5fX3diZ19wdHIsZSl9c2tldGNoX2V4ZWN1dGVfbW9jayhlLHQsbil7Y29uc3Qgcj1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksaT1fcixvPW9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxzPV9yLGE9b3Iobix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGM9X3I7cmV0dXJuIHVyLmNvbnRleHRfc2tldGNoX2V4ZWN1dGVfbW9jayh0aGlzLl9fd2JnX3B0cixyLGksbyxzLGEsYyl9c3dpdGNoX2ZpbGUoZSx0KXtyZXR1cm4gdXIuY29udGV4dF9zd2l0Y2hfZmlsZSh0aGlzLl9fd2JnX3B0cixlLHQpfXRyYW5zcGlsZV9vbGRfc2tldGNoKGUsdCxuLHIpe2NvbnN0IGk9b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLG89X3Iscz1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYT1fcjt2YXIgYz1ucihuKT8wOm9yKG4sdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxmPV9yO2NvbnN0IGw9b3Iocix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHU9X3I7cmV0dXJuIHVyLmNvbnRleHRfdHJhbnNwaWxlX29sZF9za2V0Y2godGhpcy5fX3diZ19wdHIsaSxvLHMsYSxjLGYsbCx1KX11cGRhdGVfZmlsZShlLHQsbil7Y29uc3Qgcj1vcihuLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksaT1fcjtyZXR1cm4gdXIuY29udGV4dF91cGRhdGVfZmlsZSh0aGlzLl9fd2JnX3B0cixlLHQscixpKX19U3ltYm9sLmRpc3Bvc2UmJihtbi5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPW1uLnByb3RvdHlwZS5mcmVlKTtjbGFzcyBTbntfX2Rlc3Ryb3lfaW50b19yYXcoKXtjb25zdCBlPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLGpuLnVucmVnaXN0ZXIodGhpcyksZX1mcmVlKCl7Y29uc3QgZT10aGlzLl9fZGVzdHJveV9pbnRvX3JhdygpO3VyLl9fd2JnX2ludG91bmRlcmx5aW5nYnl0ZXNvdXJjZV9mcmVlKGUsMCl9Z2V0IGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSgpe3JldHVybiB1ci5pbnRvdW5kZXJseWluZ2J5dGVzb3VyY2VfYXV0b0FsbG9jYXRlQ2h1bmtTaXplKHRoaXMuX193YmdfcHRyKT4+PjB9Y2FuY2VsKCl7Y29uc3QgZT10aGlzLl9fZGVzdHJveV9pbnRvX3JhdygpO3VyLmludG91bmRlcmx5aW5nYnl0ZXNvdXJjZV9jYW5jZWwoZSl9cHVsbChlKXtyZXR1cm4gdXIuaW50b3VuZGVybHlpbmdieXRlc291cmNlX3B1bGwodGhpcy5fX3diZ19wdHIsZSl9c3RhcnQoZSl7dXIuaW50b3VuZGVybHlpbmdieXRlc291cmNlX3N0YXJ0KHRoaXMuX193YmdfcHRyLGUpfWdldCB0eXBlKCl7Y29uc3QgZT11ci5pbnRvdW5kZXJseWluZ2J5dGVzb3VyY2VfdHlwZSh0aGlzLl9fd2JnX3B0cik7cmV0dXJuIEFuW2VdfX1TeW1ib2wuZGlzcG9zZSYmKFNuLnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09U24ucHJvdG90eXBlLmZyZWUpO2NsYXNzIEJue19fZGVzdHJveV9pbnRvX3Jhdygpe2NvbnN0IGU9dGhpcy5fX3diZ19wdHI7cmV0dXJuIHRoaXMuX193YmdfcHRyPTAsRm4udW5yZWdpc3Rlcih0aGlzKSxlfWZyZWUoKXtjb25zdCBlPXRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7dXIuX193YmdfaW50b3VuZGVybHlpbmdzaW5rX2ZyZWUoZSwwKX1hYm9ydChlKXtjb25zdCB0PXRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7cmV0dXJuIHVyLmludG91bmRlcmx5aW5nc2lua19hYm9ydCh0LGUpfWNsb3NlKCl7Y29uc3QgZT10aGlzLl9fZGVzdHJveV9pbnRvX3JhdygpO3JldHVybiB1ci5pbnRvdW5kZXJseWluZ3NpbmtfY2xvc2UoZSl9d3JpdGUoZSl7cmV0dXJuIHVyLmludG91bmRlcmx5aW5nc2lua193cml0ZSh0aGlzLl9fd2JnX3B0cixlKX19U3ltYm9sLmRpc3Bvc2UmJihCbi5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPUJuLnByb3RvdHlwZS5mcmVlKTtjbGFzcyB4bntfX2Rlc3Ryb3lfaW50b19yYXcoKXtjb25zdCBlPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLGtuLnVucmVnaXN0ZXIodGhpcyksZX1mcmVlKCl7Y29uc3QgZT10aGlzLl9fZGVzdHJveV9pbnRvX3JhdygpO3VyLl9fd2JnX2ludG91bmRlcmx5aW5nc291cmNlX2ZyZWUoZSwwKX1jYW5jZWwoKXtjb25zdCBlPXRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7dXIuaW50b3VuZGVybHlpbmdzb3VyY2VfY2FuY2VsKGUpfXB1bGwoZSl7cmV0dXJuIHVyLmludG91bmRlcmx5aW5nc291cmNlX3B1bGwodGhpcy5fX3diZ19wdHIsZSl9fVN5bWJvbC5kaXNwb3NlJiYoeG4ucHJvdG90eXBlW1N5bWJvbC5kaXNwb3NlXT14bi5wcm90b3R5cGUuZnJlZSk7Y2xhc3MgRW57X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgZT10aGlzLl9fd2JnX3B0cjtyZXR1cm4gdGhpcy5fX3diZ19wdHI9MCx6bi51bnJlZ2lzdGVyKHRoaXMpLGV9ZnJlZSgpe2NvbnN0IGU9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt1ci5fX3diZ19sc3BzZXJ2ZXJjb25maWdfZnJlZShlLDApfWNvbnN0cnVjdG9yKGUsdCxuKXtjb25zdCByPXVyLmxzcHNlcnZlcmNvbmZpZ19uZXcoZSx0LG4pO3JldHVybiB0aGlzLl9fd2JnX3B0cj1yPj4+MCx6bi5yZWdpc3Rlcih0aGlzLHRoaXMuX193YmdfcHRyLHRoaXMpLHRoaXN9fVN5bWJvbC5kaXNwb3NlJiYoRW4ucHJvdG90eXBlW1N5bWJvbC5kaXNwb3NlXT1Fbi5wcm90b3R5cGUuZnJlZSk7Y2xhc3MgVW57X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgZT10aGlzLl9fd2JnX3B0cjtyZXR1cm4gdGhpcy5fX3diZ19wdHI9MCxEbi51bnJlZ2lzdGVyKHRoaXMpLGV9ZnJlZSgpe2NvbnN0IGU9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt1ci5fX3diZ19yZXNwb25zZWNvbnRleHRfZnJlZShlLDApfWNvbnN0cnVjdG9yKCl7Y29uc3QgZT11ci5yZXNwb25zZWNvbnRleHRfbmV3KCk7cmV0dXJuIHRoaXMuX193YmdfcHRyPWU+Pj4wLERuLnJlZ2lzdGVyKHRoaXMsdGhpcy5fX3diZ19wdHIsdGhpcyksdGhpc31zZW5kX3Jlc3BvbnNlKGUpe3JldHVybiB1ci5yZXNwb25zZWNvbnRleHRfc2VuZF9yZXNwb25zZSh0aGlzLl9fd2JnX3B0cixlKX19U3ltYm9sLmRpc3Bvc2UmJihVbi5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPVVuLnByb3RvdHlwZS5mcmVlKTtjbGFzcyBPbntzdGF0aWMgX193cmFwKGUpe2U+Pj49MDtjb25zdCB0PU9iamVjdC5jcmVhdGUoT24ucHJvdG90eXBlKTtyZXR1cm4gdC5fX3diZ19wdHI9ZSxDbi5yZWdpc3Rlcih0LHQuX193YmdfcHRyLHQpLHR9X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgZT10aGlzLl9fd2JnX3B0cjtyZXR1cm4gdGhpcy5fX3diZ19wdHI9MCxDbi51bnJlZ2lzdGVyKHRoaXMpLGV9ZnJlZSgpe2NvbnN0IGU9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt1ci5fX3diZ190YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fZnJlZShlLDApfWdldCBhcmNfbGVuZ3RoKCl7cmV0dXJuIHVyLl9fd2JnX2dldF90YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fYXJjX2xlbmd0aCh0aGlzLl9fd2JnX3B0cil9Z2V0IGFyY19taWRfcG9pbnRfeCgpe3JldHVybiB1ci5fX3diZ19nZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX2FyY19taWRfcG9pbnRfeCh0aGlzLl9fd2JnX3B0cil9Z2V0IGFyY19taWRfcG9pbnRfeSgpe3JldHVybiB1ci5fX3diZ19nZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX2FyY19taWRfcG9pbnRfeSh0aGlzLl9fd2JnX3B0cil9Z2V0IGNjdygpe3JldHVybiB1ci5fX3diZ19nZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX2Njdyh0aGlzLl9fd2JnX3B0cil9Z2V0IGNlbnRlcl94KCl7cmV0dXJuIHVyLl9fd2JnX2dldF90YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fY2VudGVyX3godGhpcy5fX3diZ19wdHIpfWdldCBjZW50ZXJfeSgpe3JldHVybiB1ci5fX3diZ19nZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX2NlbnRlcl95KHRoaXMuX193YmdfcHRyKX1nZXQgZW5kX2FuZ2xlKCl7cmV0dXJuIHVyLl9fd2JnX2dldF90YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fZW5kX2FuZ2xlKHRoaXMuX193YmdfcHRyKX1nZXQgcmFkaXVzKCl7cmV0dXJuIHVyLl9fd2JnX2dldF90YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fcmFkaXVzKHRoaXMuX193YmdfcHRyKX1nZXQgc3RhcnRfYW5nbGUoKXtyZXR1cm4gdXIuX193YmdfZ2V0X3RhbmdlbnRpYWxhcmNpbmZvb3V0cHV0d2FzbV9zdGFydF9hbmdsZSh0aGlzLl9fd2JnX3B0cil9c2V0IGFyY19sZW5ndGgoZSl7dXIuX193Ymdfc2V0X3RhbmdlbnRpYWxhcmNpbmZvb3V0cHV0d2FzbV9hcmNfbGVuZ3RoKHRoaXMuX193YmdfcHRyLGUpfXNldCBhcmNfbWlkX3BvaW50X3goZSl7dXIuX193Ymdfc2V0X3RhbmdlbnRpYWxhcmNpbmZvb3V0cHV0d2FzbV9hcmNfbWlkX3BvaW50X3godGhpcy5fX3diZ19wdHIsZSl9c2V0IGFyY19taWRfcG9pbnRfeShlKXt1ci5fX3diZ19zZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX2FyY19taWRfcG9pbnRfeSh0aGlzLl9fd2JnX3B0cixlKX1zZXQgY2N3KGUpe3VyLl9fd2JnX3NldF90YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fY2N3KHRoaXMuX193YmdfcHRyLGUpfXNldCBjZW50ZXJfeChlKXt1ci5fX3diZ19zZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX2NlbnRlcl94KHRoaXMuX193YmdfcHRyLGUpfXNldCBjZW50ZXJfeShlKXt1ci5fX3diZ19zZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX2NlbnRlcl95KHRoaXMuX193YmdfcHRyLGUpfXNldCBlbmRfYW5nbGUoZSl7dXIuX193Ymdfc2V0X3RhbmdlbnRpYWxhcmNpbmZvb3V0cHV0d2FzbV9lbmRfYW5nbGUodGhpcy5fX3diZ19wdHIsZSl9c2V0IHJhZGl1cyhlKXt1ci5fX3diZ19zZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX3JhZGl1cyh0aGlzLl9fd2JnX3B0cixlKX1zZXQgc3RhcnRfYW5nbGUoZSl7dXIuX193Ymdfc2V0X3RhbmdlbnRpYWxhcmNpbmZvb3V0cHV0d2FzbV9zdGFydF9hbmdsZSh0aGlzLl9fd2JnX3B0cixlKX19U3ltYm9sLmRpc3Bvc2UmJihPbi5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPU9uLnByb3RvdHlwZS5mcmVlKTtjbGFzcyBJbntzdGF0aWMgX193cmFwKGUpe2U+Pj49MDtjb25zdCB0PU9iamVjdC5jcmVhdGUoSW4ucHJvdG90eXBlKTtyZXR1cm4gdC5fX3diZ19wdHI9ZSxNbi5yZWdpc3Rlcih0LHQuX193YmdfcHRyLHQpLHR9X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgZT10aGlzLl9fd2JnX3B0cjtyZXR1cm4gdGhpcy5fX3diZ19wdHI9MCxNbi51bnJlZ2lzdGVyKHRoaXMpLGV9ZnJlZSgpe2NvbnN0IGU9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt1ci5fX3diZ193YXNtY2lyY2xlcGFyYW1zX2ZyZWUoZSwwKX1nZXQgY2VudGVyX3goKXtyZXR1cm4gdXIuX193YmdfZ2V0X3dhc21jaXJjbGVwYXJhbXNfY2VudGVyX3godGhpcy5fX3diZ19wdHIpfWdldCBjZW50ZXJfeSgpe3JldHVybiB1ci5fX3diZ19nZXRfd2FzbWNpcmNsZXBhcmFtc19jZW50ZXJfeSh0aGlzLl9fd2JnX3B0cil9Z2V0IHJhZGl1cygpe3JldHVybiB1ci5fX3diZ19nZXRfd2FzbWNpcmNsZXBhcmFtc19yYWRpdXModGhpcy5fX3diZ19wdHIpfXNldCBjZW50ZXJfeChlKXt1ci5fX3diZ19zZXRfd2FzbWNpcmNsZXBhcmFtc19jZW50ZXJfeCh0aGlzLl9fd2JnX3B0cixlKX1zZXQgY2VudGVyX3koZSl7dXIuX193Ymdfc2V0X3dhc21jaXJjbGVwYXJhbXNfY2VudGVyX3kodGhpcy5fX3diZ19wdHIsZSl9c2V0IHJhZGl1cyhlKXt1ci5fX3diZ19zZXRfd2FzbWNpcmNsZXBhcmFtc19yYWRpdXModGhpcy5fX3diZ19wdHIsZSl9fWZ1bmN0aW9uIE5uKGUpe2NvbnN0IHQ9b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLG49X3Iscj11ci5wYXJzZV93YXNtKHQsbik7aWYoclsyXSl0aHJvdyBzcihyWzFdKTtyZXR1cm4gc3IoclswXSl9ZnVuY3Rpb24gdm4oKXtjb25zdCBlPXtfX3Byb3RvX186bnVsbCxfX3diZ19FcnJvcl81NTUzODQ4M2RlNmUzYWJlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIEVycm9yKFhuKGUsdCkpfSxfX3diZ19fX3diaW5kZ2VuX2Jvb2xlYW5fZ2V0X2ZlMmEyNGZkZmRiNDA2NGY6ZnVuY3Rpb24oZSl7Y29uc3QgdD0iYm9vbGVhbiI9PXR5cGVvZiBlP2U6dm9pZCAwO3JldHVybiBucih0KT8xNjc3NzIxNTp0PzE6MH0sX193YmdfX193YmluZGdlbl9kZWJ1Z19zdHJpbmdfZDg5NjI3MjAyZDAxNTViNzpmdW5jdGlvbihlLHQpe2NvbnN0IG49b3IoV24odCksdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxyPV9yO0tuKCkuc2V0SW50MzIoZSs0LHIsITApLEtuKCkuc2V0SW50MzIoZSswLG4sITApfSxfX3diZ19fX3diaW5kZ2VuX2lzX2Z1bmN0aW9uXzJhOTU0MDY0MjNlYTg2MjY6ZnVuY3Rpb24oZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGV9LF9fd2JnX19fd2JpbmRnZW5faXNfbnVsbF84ZDkwNTI0YzllMGFmMTgzOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT09ZX0sX193YmdfX193YmluZGdlbl9pc19vYmplY3RfNTlhMDAyZTc2YjA1OTMxMjpmdW5jdGlvbihlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPT1lfSxfX3diZ19fX3diaW5kZ2VuX2lzX3VuZGVmaW5lZF84N2EzYTgzN2YzMzFmZWY1OmZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lfSxfX3diZ19fX3diaW5kZ2VuX3N0cmluZ19nZXRfZjExNjEzOTA0MTRmOWI1OTpmdW5jdGlvbihlLHQpe2NvbnN0IG49InN0cmluZyI9PXR5cGVvZiB0P3Q6dm9pZCAwO3ZhciByPW5yKG4pPzA6b3Iobix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGk9X3I7S24oKS5zZXRJbnQzMihlKzQsaSwhMCksS24oKS5zZXRJbnQzMihlKzAsciwhMCl9LF9fd2JnX19fd2JpbmRnZW5fdGhyb3dfNTU0OTQ5MmRhZWRhZDEzOTpmdW5jdGlvbihlLHQpe3Rocm93IG5ldyBFcnJvcihYbihlLHQpKX0sX193YmdfX3diZ19jYl91bnJlZl9mYmU2OWJiMDc2YzE2YmFkOmZ1bmN0aW9uKGUpe2UuX3diZ19jYl91bnJlZigpfSxfX3diZ19idWZmZXJfMGE1Nzc4OGNkZmNlMjFiYTpmdW5jdGlvbihlKXtyZXR1cm4gZS5idWZmZXJ9LF9fd2JnX2J5b2JSZXF1ZXN0X2FiMGU1N2Y1NWJmNzc0ZjI6ZnVuY3Rpb24oZSl7Y29uc3QgdD1lLmJ5b2JSZXF1ZXN0O3JldHVybiBucih0KT8wOlZuKHQpfSxfX3diZ19ieXRlTGVuZ3RoXzk5MzFkYjAwZTU4NjFiZjk6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuYnl0ZUxlbmd0aH0sX193YmdfYnl0ZU9mZnNldF8wYTk4NWE5OGY4ZmZiOGQ3OmZ1bmN0aW9uKGUpe3JldHVybiBlLmJ5dGVPZmZzZXR9LF9fd2JnX2NhbGxfOGY1ZDdiYjA3MDI4MzUwODpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLmNhbGwodCxuKX0pLGFyZ3VtZW50cyl9LF9fd2JnX2Nsb3NlXzYyZjZhNGVhZGM5NDU2NWY6ZnVuY3Rpb24oKXtyZXR1cm4gdHIoKGZ1bmN0aW9uKGUpe2UuY2xvc2UoKX0pLGFyZ3VtZW50cyl9LF9fd2JnX2Nsb3NlXzg3MWU1MTZhMjczZDE1Zjg6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2xvc2UoKX0sX193YmdfY2xvc2VfZjI4NzA1ODcxNjA4OGE1MDpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSl7ZS5jbG9zZSgpfSksYXJndW1lbnRzKX0sX193YmdfZG9uZV8xOWY5MmNiMWY4NzM4YWJhOmZ1bmN0aW9uKGUpe3JldHVybiBlLmRvbmV9LF9fd2JnX2VucXVldWVfZWUwNTkzY2VhOWJlOTNiZDpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSx0KXtlLmVucXVldWUodCl9KSxhcmd1bWVudHMpfSxfX3diZ19lcnJvcl9hNmZhMjAyYjU4YWExY2QzOmZ1bmN0aW9uKGUsdCl7bGV0IG4scjt0cnl7bj1lLHI9dCxjb25zb2xlLmVycm9yKFhuKGUsdCkpfWZpbmFsbHl7dXIuX193YmluZGdlbl9mcmVlKG4sciwxKX19LF9fd2JnX2Vycm9yX2RlNmI4NmU1OTg1MDUyNDY6ZnVuY3Rpb24oZSl7Y29uc29sZS5lcnJvcihlKX0sX193YmdfZXhpc3RzXzc0ZTJkMzk1NjU3NWI3YzE6ZnVuY3Rpb24oKXtyZXR1cm4gdHIoKGZ1bmN0aW9uKGUsdCxuKXtsZXQgcixpO3RyeXtyPXQsaT1uO3JldHVybiBlLmV4aXN0cyhYbih0LG4pKX1maW5hbGx5e3VyLl9fd2JpbmRnZW5fZnJlZShyLGksMSl9fSksYXJndW1lbnRzKX0sX193YmdfZmlyZU1vZGVsaW5nQ29tbWFuZEZyb21XYXNtXzM5MGExYmNlM2E1NjIyMzQ6ZnVuY3Rpb24oKXtyZXR1cm4gdHIoKGZ1bmN0aW9uKGUsdCxuLHIsaSxvLHMsYSxjKXtsZXQgZixsLHUsXyxnLGgsYixkO3RyeXtmPXQsbD1uLHU9cixfPWksZz1vLGg9cyxiPWEsZD1jLGUuZmlyZU1vZGVsaW5nQ29tbWFuZEZyb21XYXNtKFhuKHQsbiksWG4ocixpKSxYbihvLHMpLFhuKGEsYykpfWZpbmFsbHl7dXIuX193YmluZGdlbl9mcmVlKGYsbCwxKSx1ci5fX3diaW5kZ2VuX2ZyZWUodSxfLDEpLHVyLl9fd2JpbmRnZW5fZnJlZShnLGgsMSksdXIuX193YmluZGdlbl9mcmVlKGIsZCwxKX19KSxhcmd1bWVudHMpfSxfX3diZ19nZXRBbGxGaWxlc18xY2M1MGJlYjBjZjdmYjU3OmZ1bmN0aW9uKCl7cmV0dXJuIHRyKChmdW5jdGlvbihlLHQsbil7bGV0IHIsaTt0cnl7cj10LGk9bjtyZXR1cm4gZS5nZXRBbGxGaWxlcyhYbih0LG4pKX1maW5hbGx5e3VyLl9fd2JpbmRnZW5fZnJlZShyLGksMSl9fSksYXJndW1lbnRzKX0sX193YmdfZ2V0Q2xpZW50U3RhdGVfNmMxYTI5NzhjNGVlNjcwOTpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0Q2xpZW50U3RhdGUoKX0pLGFyZ3VtZW50cyl9LF9fd2JnX2dldE9zSW5mb180NTI3YjE4MDRlZmEzNGViOmZ1bmN0aW9uKCl7cmV0dXJuIHRyKChmdW5jdGlvbihlLHQpe2NvbnN0IG49b3IodC5nZXRPc0luZm8oKSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHI9X3I7S24oKS5zZXRJbnQzMihlKzQsciwhMCksS24oKS5zZXRJbnQzMihlKzAsbiwhMCl9KSxhcmd1bWVudHMpfSxfX3diZ19nZXRSYW5kb21WYWx1ZXNfM2Y0NGI3MDAzOTUwNjJlNTpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSx0KXtnbG9iYWxUaGlzLmNyeXB0by5nZXRSYW5kb21WYWx1ZXMocW4oZSx0KSl9KSxhcmd1bWVudHMpfSxfX3diZ19nZXRSYW5kb21WYWx1ZXNfZDQ5MzI5ZmY4OWEwN2FmMTpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSx0KXtnbG9iYWxUaGlzLmNyeXB0by5nZXRSYW5kb21WYWx1ZXMocW4oZSx0KSl9KSxhcmd1bWVudHMpfSxfX3diZ19nZXRUaW1lX2MzYWYzNTU5NGUyODMzNTY6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0VGltZSgpfSxfX3diZ19nZXRXZWJydGNTdGF0c19lNDU3NGY3ZGRiYjQ3NjAwOmZ1bmN0aW9uKCl7cmV0dXJuIHRyKChmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRXZWJydGNTdGF0cygpfSksYXJndW1lbnRzKX0sX193YmdfZ2V0V3JpdGVyXzdjOTUzMTQ5YWYyNzNjMjk6ZnVuY3Rpb24oKXtyZXR1cm4gdHIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldFdyaXRlcigpfSksYXJndW1lbnRzKX0sX193YmdfZ2V0X2ZmNWYxZmIyMjAyMzM0Nzc6ZnVuY3Rpb24oKXtyZXR1cm4gdHIoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIFJlZmxlY3QuZ2V0KGUsdCl9KSxhcmd1bWVudHMpfSxfX3diZ19pbnN0YW5jZW9mX1VpbnQ4QXJyYXlfY2UyNGQ1OGE1ZjRiZGNjMzpmdW5jdGlvbihlKXtsZXQgdDt0cnl7dD1lIGluc3RhbmNlb2YgVWludDhBcnJheX1jYXRjaChlKXt0PSExfXJldHVybiB0fSxfX3diZ19pbnN0YW5jZW9mX1dpbmRvd18yZmE4ZDljMmQ1YjYxMDRhOmZ1bmN0aW9uKGUpe2xldCB0O3RyeXt0PWUgaW5zdGFuY2VvZiBXaW5kb3d9Y2F0Y2goZSl7dD0hMX1yZXR1cm4gdH0sX193YmdfaW5zdGFuY2VvZl9Xb3JrZXJHbG9iYWxTY29wZV9hNDMwN2M4NWY3M2Q4M2MzOmZ1bmN0aW9uKGUpe2xldCB0O3RyeXt0PWUgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZX1jYXRjaChlKXt0PSExfXJldHVybiB0fSxfX3diZ19pc0Rlc2t0b3BfMmM2ODM0MDc2OWE3ODU2MTpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaXNEZXNrdG9wKCl9KSxhcmd1bWVudHMpfSxfX3diZ19rY2xDb2RlXzAzYzcxM2ZkMjFhMDRkOTk6ZnVuY3Rpb24oKXtyZXR1cm4gdHIoKGZ1bmN0aW9uKGUsdCl7Y29uc3Qgbj1vcih0LmtjbENvZGUoKSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHI9X3I7S24oKS5zZXRJbnQzMihlKzQsciwhMCksS24oKS5zZXRJbnQzMihlKzAsbiwhMCl9KSxhcmd1bWVudHMpfSxfX3diZ19sZW5ndGhfZTZlMTYzM2ZiZWE2Y2ZhOTpmdW5jdGlvbihlKXtyZXR1cm4gZS5sZW5ndGh9LF9fd2JnX2xvZ182YTc1YjcxZDYzMTZlOTM1OmZ1bmN0aW9uKGUpe2NvbnNvbGUubG9nKGUpfSxfX3diZ19uZXdfMF9lNjQ5Yzk5ZTczODIzMTNmOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBEYXRlfSxfX3diZ19uZXdfMWQ5NjY3OGFhYWNjYTMyZTpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZSl9LF9fd2JnX25ld18yMjdkN2MwNTQxNGViODYxOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBFcnJvcn0sX193YmdfbmV3XzRhODQzZmUyZWU0MDgyYTk6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IEVycm9yKFhuKGUsdCkpfSxfX3diZ19uZXdfZnJvbV9zbGljZV8wYmM1OGUzNmY4MmExYjUwOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBVaW50OEFycmF5KHFuKGUsdCkpfSxfX3diZ19uZXdfdHlwZWRfMjVkZGEyMzg4ZDdlNWU5ZjpmdW5jdGlvbihlLHQpe3RyeXt2YXIgbj17YTplLGI6dH07Y29uc3Qgcj1uZXcgUHJvbWlzZSgoKGUsdCk9Pntjb25zdCByPW4uYTtuLmE9MDt0cnl7cmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIpe3VyLndhc21fYmluZGdlbl9fY29udmVydF9fY2xvc3VyZXNfX19fX2ludm9rZV9faDliY2QxN2YwOWRjODM2OTEoZSx0LG4scil9KHIsbi5iLGUsdCl9ZmluYWxseXtuLmE9cn19KSk7cmV0dXJuIHJ9ZmluYWxseXtuLmE9MH19LF9fd2JnX25ld193aXRoX2J5dGVfb2Zmc2V0X2FuZF9sZW5ndGhfYWIxZTEwMDJkN2E2OTRlNDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIG5ldyBVaW50OEFycmF5KGUsdD4+PjAsbj4+PjApfSxfX3diZ19uZXh0XzFiN2I1YzAwNzk2NjU2MGY6ZnVuY3Rpb24oKXtyZXR1cm4gdHIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLm5leHQoKX0pLGFyZ3VtZW50cyl9LF9fd2JnX25vd19hOWFmNDU1NGVkYjdhYzc4OmZ1bmN0aW9uKGUpe3JldHVybiBlLm5vdygpfSxfX3diZ19ub3dfZTdjNjc5NWE3ZjgxZTEwZjpmdW5jdGlvbihlKXtyZXR1cm4gZS5ub3coKX0sX193YmdfcGFyc2VfZTU3MDNmZDUyMjExZTY4ODpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSx0KXtyZXR1cm4gSlNPTi5wYXJzZShYbihlLHQpKX0pLGFyZ3VtZW50cyl9LF9fd2JnX3BlcmZvcm1hbmNlXzNmY2Y2ZTMyYTdlMWVkMGE6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGVyZm9ybWFuY2V9LF9fd2JnX3Byb3RvdHlwZXNldGNhbGxfMzg3NWQ1NGQxMmVmMmVlYzpmdW5jdGlvbihlLHQsbil7VWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwocW4oZSx0KSxuKX0sX193YmdfcXVldWVNaWNyb3Rhc2tfODg2ODM2NTExNGZlMjNiNTpmdW5jdGlvbihlKXtxdWV1ZU1pY3JvdGFzayhlKX0sX193YmdfcXVldWVNaWNyb3Rhc2tfY2ZjNWEwZTYyZjllYmRiZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5xdWV1ZU1pY3JvdGFza30sX193YmdfcmVhZEZpbGVfMzUwNGY0Y2UxMTg4YmQ2ZTpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSx0LG4pe2xldCByLGk7dHJ5e3I9dCxpPW47cmV0dXJuIGUucmVhZEZpbGUoWG4odCxuKSl9ZmluYWxseXt1ci5fX3diaW5kZ2VuX2ZyZWUocixpLDEpfX0pLGFyZ3VtZW50cyl9LF9fd2JnX3JlYWR5XzU4NTZkYjZmMDBlM2UyMGE6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVhZHl9LF9fd2JnX3JlbGVhc2VMb2NrXzk1YmJjN2NmN2I4Nzk3N2Q6ZnVuY3Rpb24oZSl7ZS5yZWxlYXNlTG9jaygpfSxfX3diZ19yZXNvbHZlX2Q4MDU5YmMxMTNlMjE1YmY6ZnVuY3Rpb24oZSl7cmV0dXJuIFByb21pc2UucmVzb2x2ZShlKX0sX193YmdfcmVzcG9uZF8xZWMyOTM5NWVkYmU3ZmNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRyKChmdW5jdGlvbihlLHQpe2UucmVzcG9uZCh0Pj4+MCl9KSxhcmd1bWVudHMpfSxfX3diZ19zZW5kTW9kZWxpbmdDb21tYW5kRnJvbVdhc21fOWJhZTlkYmNlZGFjYWFlMzpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSx0LG4scixpLG8scyxhLGMpe2xldCBmLGwsdSxfLGcsaCxiLGQ7dHJ5e2Y9dCxsPW4sdT1yLF89aSxnPW8saD1zLGI9YSxkPWM7cmV0dXJuIGUuc2VuZE1vZGVsaW5nQ29tbWFuZEZyb21XYXNtKFhuKHQsbiksWG4ocixpKSxYbihvLHMpLFhuKGEsYykpfWZpbmFsbHl7dXIuX193YmluZGdlbl9mcmVlKGYsbCwxKSx1ci5fX3diaW5kZ2VuX2ZyZWUodSxfLDEpLHVyLl9fd2JpbmRnZW5fZnJlZShnLGgsMSksdXIuX193YmluZGdlbl9mcmVlKGIsZCwxKX19KSxhcmd1bWVudHMpfSxfX3diZ19zZXRUaW1lb3V0XzQ2NmQ1MGYzNTEyMjQ1Y2I6ZnVuY3Rpb24oKXtyZXR1cm4gdHIoKGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZS5zZXRUaW1lb3V0KHQsbil9KSxhcmd1bWVudHMpfSxfX3diZ19zZXRUaW1lb3V0X2MxYzlhMThiNjM0M2ViZDM6ZnVuY3Rpb24oKXtyZXR1cm4gdHIoKGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZS5zZXRUaW1lb3V0KHQsbil9KSxhcmd1bWVudHMpfSxfX3diZ19zZXRfMjk1YmFkM2I1ZWFkNGU5OTpmdW5jdGlvbihlLHQsbil7ZS5zZXQocW4odCxuKSl9LF9fd2JnX3N0YWNrXzNiMGQ5NzRiYmYzMWU0NGY6ZnVuY3Rpb24oZSx0KXtjb25zdCBuPW9yKHQuc3RhY2ssdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxyPV9yO0tuKCkuc2V0SW50MzIoZSs0LHIsITApLEtuKCkuc2V0SW50MzIoZSswLG4sITApfSxfX3diZ19zdGFydE5ld1Nlc3Npb25fYjlkMWYyNmFjYmNmNzU5ZDpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuc3RhcnROZXdTZXNzaW9uKCl9KSxhcmd1bWVudHMpfSxfX3diZ19zdGF0aWNfYWNjZXNzb3JfR0xPQkFMXzhkZmI3ZjVlMjZlYmU1MjM6ZnVuY3Rpb24oKXtjb25zdCBlPSJ1bmRlZmluZWQiPT10eXBlb2YgZ2xvYmFsP251bGw6Z2xvYmFsO3JldHVybiBucihlKT8wOlZuKGUpfSxfX3diZ19zdGF0aWNfYWNjZXNzb3JfR0xPQkFMX1RISVNfOTQxMTU0ZWZjODM5NWNkZDpmdW5jdGlvbigpe2NvbnN0IGU9InVuZGVmaW5lZCI9PXR5cGVvZiBnbG9iYWxUaGlzP251bGw6Z2xvYmFsVGhpcztyZXR1cm4gbnIoZSk/MDpWbihlKX0sX193Ymdfc3RhdGljX2FjY2Vzc29yX1NFTEZfNThkYWM5YWY4MjJmNTYxZjpmdW5jdGlvbigpe2NvbnN0IGU9InVuZGVmaW5lZCI9PXR5cGVvZiBzZWxmP251bGw6c2VsZjtyZXR1cm4gbnIoZSk/MDpWbihlKX0sX193Ymdfc3RhdGljX2FjY2Vzc29yX1dJTkRPV19lZTY0ZjBiM2Q4MzU0YzBiOmZ1bmN0aW9uKCl7Y29uc3QgZT0idW5kZWZpbmVkIj09dHlwZW9mIHdpbmRvdz9udWxsOndpbmRvdztyZXR1cm4gbnIoZSk/MDpWbihlKX0sX193Ymdfc3RyaW5naWZ5X2I2N2UyYzhjNjBiOTNmNjk6ZnVuY3Rpb24oKXtyZXR1cm4gdHIoKGZ1bmN0aW9uKGUpe3JldHVybiBKU09OLnN0cmluZ2lmeShlKX0pLGFyZ3VtZW50cyl9LF9fd2JnX3RoZW5fMDE1MDM1MmU0YWQyMDM0NDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGUudGhlbih0LG4pfSxfX3diZ190aGVuXzUxNjA0ODZjNjdkZGI5OGE6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS50aGVuKHQpfSxfX3diZ190b1N0cmluZ181NTNiNWY2ZTk1ZTNlNDFiOmZ1bmN0aW9uKGUpe3JldHVybiBlLnRvU3RyaW5nKCl9LF9fd2JnX3RvU3RyaW5nXzllNzM1M2E3N2NiNDE1YTI6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudG9TdHJpbmcoKX0sX193YmdfdmFsdWVfZDViMjQ4Y2U4NDE5YmQxYjpmdW5jdGlvbihlKXtyZXR1cm4gZS52YWx1ZX0sX193YmdfdmVyc2lvbl8xNTRjOTg4MjkwNjQzMTY3OmZ1bmN0aW9uKCl7cmV0dXJuIHRyKChmdW5jdGlvbihlLHQpe2NvbnN0IG49b3IodC52ZXJzaW9uKCksdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxyPV9yO0tuKCkuc2V0SW50MzIoZSs0LHIsITApLEtuKCkuc2V0SW50MzIoZSswLG4sITApfSksYXJndW1lbnRzKX0sX193Ymdfdmlld18zOGE5MzA4NDRjOTY0MTAzOmZ1bmN0aW9uKGUpe2NvbnN0IHQ9ZS52aWV3O3JldHVybiBucih0KT8wOlZuKHQpfSxfX3diZ193YXJuXzg2ZWYwM2RiOGNmYjRkZDQ6ZnVuY3Rpb24oZSl7Y29uc29sZS53YXJuKGUpfSxfX3diZ193cml0ZV9mZjNhM2RlNDkwMmFhOGJmOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUud3JpdGUodCl9LF9fd2JpbmRnZW5fY2FzdF8wMDAwMDAwMDAwMDAwMDAxOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHJyKGUsdCwkbil9LF9fd2JpbmRnZW5fY2FzdF8wMDAwMDAwMDAwMDAwMDAyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHJyKGUsdCxMbil9LF9fd2JpbmRnZW5fY2FzdF8wMDAwMDAwMDAwMDAwMDAzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHJyKGUsdCxUbil9LF9fd2JpbmRnZW5fY2FzdF8wMDAwMDAwMDAwMDAwMDA0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIFhuKGUsdCl9LF9fd2JpbmRnZW5faW5pdF9leHRlcm5yZWZfdGFibGU6ZnVuY3Rpb24oKXtjb25zdCBlPXVyLl9fd2JpbmRnZW5fZXh0ZXJucmVmcyx0PWUuZ3Jvdyg0KTtlLnNldCgwLHZvaWQgMCksZS5zZXQodCswLHZvaWQgMCksZS5zZXQodCsxLG51bGwpLGUuc2V0KHQrMiwhMCksZS5zZXQodCszLCExKX19O3JldHVybntfX3Byb3RvX186bnVsbCwiLi9rY2xfd2FzbV9saWJfYmcuanMiOmV9fWZ1bmN0aW9uIFRuKGUsdCl7dXIud2FzbV9iaW5kZ2VuX19jb252ZXJ0X19jbG9zdXJlc19fX19faW52b2tlX19oYzg1ZGIwODA5Y2QzZDcwNShlLHQpfWZ1bmN0aW9uICRuKGUsdCxuKXtjb25zdCByPXVyLndhc21fYmluZGdlbl9fY29udmVydF9fY2xvc3VyZXNfX19fX2ludm9rZV9faGQ0MWZjZTIyN2JlYjkxOWQoZSx0LG4pO2lmKHJbMV0pdGhyb3cgc3IoclswXSl9ZnVuY3Rpb24gTG4oZSx0LG4pe2NvbnN0IHI9dXIud2FzbV9iaW5kZ2VuX19jb252ZXJ0X19jbG9zdXJlc19fX19faW52b2tlX19oZDFjYWQxZDY1YTU4MDMzYyhlLHQsbik7aWYoclsxXSl0aHJvdyBzcihyWzBdKX1TeW1ib2wuZGlzcG9zZSYmKEluLnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09SW4ucHJvdG90eXBlLmZyZWUpO2NvbnN0IEFuPVsiYnl0ZXMiXSxSbj0idW5kZWZpbmVkIj09dHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5P3tyZWdpc3RlcjooKT0+e30sdW5yZWdpc3RlcjooKT0+e319Om5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeSgoZT0+dXIuX193YmdfY29udGV4dF9mcmVlKGU+Pj4wLDEpKSksam49InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoKGU9PnVyLl9fd2JnX2ludG91bmRlcmx5aW5nYnl0ZXNvdXJjZV9mcmVlKGU+Pj4wLDEpKSksRm49InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoKGU9PnVyLl9fd2JnX2ludG91bmRlcmx5aW5nc2lua19mcmVlKGU+Pj4wLDEpKSksa249InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoKGU9PnVyLl9fd2JnX2ludG91bmRlcmx5aW5nc291cmNlX2ZyZWUoZT4+PjAsMSkpKSx6bj0idW5kZWZpbmVkIj09dHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5P3tyZWdpc3RlcjooKT0+e30sdW5yZWdpc3RlcjooKT0+e319Om5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeSgoZT0+dXIuX193YmdfbHNwc2VydmVyY29uZmlnX2ZyZWUoZT4+PjAsMSkpKSxEbj0idW5kZWZpbmVkIj09dHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5P3tyZWdpc3RlcjooKT0+e30sdW5yZWdpc3RlcjooKT0+e319Om5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeSgoZT0+dXIuX193YmdfcmVzcG9uc2Vjb250ZXh0X2ZyZWUoZT4+PjAsMSkpKSxDbj0idW5kZWZpbmVkIj09dHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5P3tyZWdpc3RlcjooKT0+e30sdW5yZWdpc3RlcjooKT0+e319Om5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeSgoZT0+dXIuX193YmdfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX2ZyZWUoZT4+PjAsMSkpKSxNbj0idW5kZWZpbmVkIj09dHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5P3tyZWdpc3RlcjooKT0+e30sdW5yZWdpc3RlcjooKT0+e319Om5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeSgoZT0+dXIuX193Ymdfd2FzbWNpcmNsZXBhcmFtc19mcmVlKGU+Pj4wLDEpKSk7ZnVuY3Rpb24gVm4oZSl7Y29uc3QgdD11ci5fX2V4dGVybnJlZl90YWJsZV9hbGxvYygpO3JldHVybiB1ci5fX3diaW5kZ2VuX2V4dGVybnJlZnMuc2V0KHQsZSksdH1mdW5jdGlvbiBQbihlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBFcnJvcihgZXhwZWN0ZWQgaW5zdGFuY2Ugb2YgJHt0Lm5hbWV9YCl9Y29uc3QgSm49InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoKGU9PnVyLl9fd2JpbmRnZW5fZGVzdHJveV9jbG9zdXJlKGUuYSxlLmIpKSk7ZnVuY3Rpb24gV24oZSl7Y29uc3QgdD10eXBlb2YgZTtpZigibnVtYmVyIj09dHx8ImJvb2xlYW4iPT10fHxudWxsPT1lKXJldHVybmAke2V9YDtpZigic3RyaW5nIj09dClyZXR1cm5gIiR7ZX0iYDtpZigic3ltYm9sIj09dCl7Y29uc3QgdD1lLmRlc2NyaXB0aW9uO3JldHVybiBudWxsPT10PyJTeW1ib2wiOmBTeW1ib2woJHt0fSlgfWlmKCJmdW5jdGlvbiI9PXQpe2NvbnN0IHQ9ZS5uYW1lO3JldHVybiJzdHJpbmciPT10eXBlb2YgdCYmdC5sZW5ndGg+MD9gRnVuY3Rpb24oJHt0fSlgOiJGdW5jdGlvbiJ9aWYoQXJyYXkuaXNBcnJheShlKSl7Y29uc3QgdD1lLmxlbmd0aDtsZXQgbj0iWyI7dD4wJiYobis9V24oZVswXSkpO2ZvcihsZXQgcj0xO3I8dDtyKyspbis9IiwgIitXbihlW3JdKTtyZXR1cm4gbis9Il0iLG59Y29uc3Qgbj0vXFtvYmplY3QgKFteXF1dKylcXS8uZXhlYyh0b1N0cmluZy5jYWxsKGUpKTtsZXQgcjtpZighKG4mJm4ubGVuZ3RoPjEpKXJldHVybiB0b1N0cmluZy5jYWxsKGUpO2lmKHI9blsxXSwiT2JqZWN0Ij09cil0cnl7cmV0dXJuIk9iamVjdCgiK0pTT04uc3RyaW5naWZ5KGUpKyIpIn1jYXRjaChlKXtyZXR1cm4iT2JqZWN0In1yZXR1cm4gZSBpbnN0YW5jZW9mIEVycm9yP2Ake2UubmFtZX06ICR7ZS5tZXNzYWdlfVxuJHtlLnN0YWNrfWA6cn1mdW5jdGlvbiBZbihlLHQpe2U+Pj49MDtjb25zdCBuPUtuKCkscj1bXTtmb3IobGV0IGk9ZTtpPGUrNCp0O2krPTQpci5wdXNoKHVyLl9fd2JpbmRnZW5fZXh0ZXJucmVmcy5nZXQobi5nZXRVaW50MzIoaSwhMCkpKTtyZXR1cm4gdXIuX19leHRlcm5yZWZfZHJvcF9zbGljZShlLHQpLHJ9ZnVuY3Rpb24gcW4oZSx0KXtyZXR1cm4gZT4+Pj0wLGVyKCkuc3ViYXJyYXkoZS8xLGUvMSt0KX1sZXQgSG49bnVsbDtmdW5jdGlvbiBLbigpe3JldHVybihudWxsPT09SG58fCEwPT09SG4uYnVmZmVyLmRldGFjaGVkfHx2b2lkIDA9PT1Ibi5idWZmZXIuZGV0YWNoZWQmJkhuLmJ1ZmZlciE9PXVyLm1lbW9yeS5idWZmZXIpJiYoSG49bmV3IERhdGFWaWV3KHVyLm1lbW9yeS5idWZmZXIpKSxIbn1sZXQgWm49bnVsbDtmdW5jdGlvbiBHbigpe3JldHVybiBudWxsIT09Wm4mJjAhPT1abi5ieXRlTGVuZ3RofHwoWm49bmV3IEZsb2F0NjRBcnJheSh1ci5tZW1vcnkuYnVmZmVyKSksWm59ZnVuY3Rpb24gWG4oZSx0KXtyZXR1cm4gZnVuY3Rpb24oZSx0KXtmcis9dCxmcj49Y3ImJihhcj1uZXcgVGV4dERlY29kZXIoInV0Zi04Iix7aWdub3JlQk9NOiEwLGZhdGFsOiEwfSksYXIuZGVjb2RlKCksZnI9dCk7cmV0dXJuIGFyLmRlY29kZShlcigpLnN1YmFycmF5KGUsZSt0KSl9KGU+Pj49MCx0KX1sZXQgUW49bnVsbDtmdW5jdGlvbiBlcigpe3JldHVybiBudWxsIT09UW4mJjAhPT1Rbi5ieXRlTGVuZ3RofHwoUW49bmV3IFVpbnQ4QXJyYXkodXIubWVtb3J5LmJ1ZmZlcikpLFFufWZ1bmN0aW9uIHRyKGUsdCl7dHJ5e3JldHVybiBlLmFwcGx5KHRoaXMsdCl9Y2F0Y2goZSl7Y29uc3QgdD1WbihlKTt1ci5fX3diaW5kZ2VuX2V4bl9zdG9yZSh0KX19ZnVuY3Rpb24gbnIoZSl7cmV0dXJuIG51bGw9PWV9ZnVuY3Rpb24gcnIoZSx0LG4pe2NvbnN0IHI9e2E6ZSxiOnQsY250OjF9LGk9KC4uLmUpPT57ci5jbnQrKztjb25zdCB0PXIuYTtyLmE9MDt0cnl7cmV0dXJuIG4odCxyLmIsLi4uZSl9ZmluYWxseXtyLmE9dCxpLl93YmdfY2JfdW5yZWYoKX19O3JldHVybiBpLl93YmdfY2JfdW5yZWY9KCk9PnswPT0tLXIuY250JiYodXIuX193YmluZGdlbl9kZXN0cm95X2Nsb3N1cmUoci5hLHIuYiksci5hPTAsSm4udW5yZWdpc3RlcihyKSl9LEpuLnJlZ2lzdGVyKGkscixyKSxpfWZ1bmN0aW9uIGlyKGUsdCl7Y29uc3Qgbj10KDgqZS5sZW5ndGgsOCk+Pj4wO3JldHVybiBHbigpLnNldChlLG4vOCksX3I9ZS5sZW5ndGgsbn1mdW5jdGlvbiBvcihlLHQsbil7aWYodm9pZCAwPT09bil7Y29uc3Qgbj1sci5lbmNvZGUoZSkscj10KG4ubGVuZ3RoLDEpPj4+MDtyZXR1cm4gZXIoKS5zdWJhcnJheShyLHIrbi5sZW5ndGgpLnNldChuKSxfcj1uLmxlbmd0aCxyfWxldCByPWUubGVuZ3RoLGk9dChyLDEpPj4+MDtjb25zdCBvPWVyKCk7bGV0IHM9MDtmb3IoO3M8cjtzKyspe2NvbnN0IHQ9ZS5jaGFyQ29kZUF0KHMpO2lmKHQ+MTI3KWJyZWFrO29baStzXT10fWlmKHMhPT1yKXswIT09cyYmKGU9ZS5zbGljZShzKSksaT1uKGkscixyPXMrMyplLmxlbmd0aCwxKT4+PjA7Y29uc3QgdD1lcigpLnN1YmFycmF5KGkrcyxpK3IpO3MrPWxyLmVuY29kZUludG8oZSx0KS53cml0dGVuLGk9bihpLHIscywxKT4+PjB9cmV0dXJuIF9yPXMsaX1mdW5jdGlvbiBzcihlKXtjb25zdCB0PXVyLl9fd2JpbmRnZW5fZXh0ZXJucmVmcy5nZXQoZSk7cmV0dXJuIHVyLl9fZXh0ZXJucmVmX3RhYmxlX2RlYWxsb2MoZSksdH1sZXQgYXI9bmV3IFRleHREZWNvZGVyKCJ1dGYtOCIse2lnbm9yZUJPTTohMCxmYXRhbDohMH0pO2FyLmRlY29kZSgpO2NvbnN0IGNyPTIxNDY0MzUwNzI7bGV0IGZyPTA7Y29uc3QgbHI9bmV3IFRleHRFbmNvZGVyOyJlbmNvZGVJbnRvImluIGxyfHwobHIuZW5jb2RlSW50bz1mdW5jdGlvbihlLHQpe2NvbnN0IG49bHIuZW5jb2RlKGUpO3JldHVybiB0LnNldChuKSx7cmVhZDplLmxlbmd0aCx3cml0dGVuOm4ubGVuZ3RofX0pO2xldCB1cixfcj0wO2Z1bmN0aW9uIGdyKGUsdCl7cmV0dXJuIHVyPWUuZXhwb3J0cyxIbj1udWxsLFpuPW51bGwsUW49bnVsbCx1ci5fX3diaW5kZ2VuX3N0YXJ0KCksdXJ9YXN5bmMgZnVuY3Rpb24gaHIoZSl7aWYodm9pZCAwIT09dXIpcmV0dXJuIHVyO3ZvaWQgMCE9PWUmJihPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk9PT1PYmplY3QucHJvdG90eXBlPyh7bW9kdWxlX29yX3BhdGg6ZX09ZSk6Y29uc29sZS53YXJuKCJ1c2luZyBkZXByZWNhdGVkIHBhcmFtZXRlcnMgZm9yIHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbjsgcGFzcyBhIHNpbmdsZSBvYmplY3QgaW5zdGVhZCIpKSx2b2lkIDA9PT1lJiYoZT1uZXcgVVJMKCJrY2xfd2FzbV9saWJfYmcud2FzbSIsZG9jdW1lbnQuY3VycmVudFNjcmlwdCYmIlNDUklQVCI9PT1kb2N1bWVudC5jdXJyZW50U2NyaXB0LnRhZ05hbWUudG9VcHBlckNhc2UoKSYmZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmN8fG5ldyBVUkwoIndvcmtlci13ZWJydGMuanMiLGRvY3VtZW50LmJhc2VVUkkpLmhyZWYpKTtjb25zdCB0PXZuKCk7KCJzdHJpbmciPT10eXBlb2YgZXx8ImZ1bmN0aW9uIj09dHlwZW9mIFJlcXVlc3QmJmUgaW5zdGFuY2VvZiBSZXF1ZXN0fHwiZnVuY3Rpb24iPT10eXBlb2YgVVJMJiZlIGluc3RhbmNlb2YgVVJMKSYmKGU9ZmV0Y2goZSkpO2NvbnN0e2luc3RhbmNlOm4sbW9kdWxlOnJ9PWF3YWl0IGFzeW5jIGZ1bmN0aW9uKGUsdCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFJlc3BvbnNlJiZlIGluc3RhbmNlb2YgUmVzcG9uc2Upe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyl0cnl7cmV0dXJuIGF3YWl0IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKGUsdCl9Y2F0Y2godCl7aWYoIWUub2t8fCFmdW5jdGlvbihlKXtzd2l0Y2goZSl7Y2FzZSJiYXNpYyI6Y2FzZSJjb3JzIjpjYXNlImRlZmF1bHQiOnJldHVybiEwfXJldHVybiExfShlLnR5cGUpfHwiYXBwbGljYXRpb24vd2FzbSI9PT1lLmhlYWRlcnMuZ2V0KCJDb250ZW50LVR5cGUiKSl0aHJvdyB0O2NvbnNvbGUud2FybigiYFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nYCBmYWlsZWQgYmVjYXVzZSB5b3VyIHNlcnZlciBkb2VzIG5vdCBzZXJ2ZSBXYXNtIHdpdGggYGFwcGxpY2F0aW9uL3dhc21gIE1JTUUgdHlwZS4gRmFsbGluZyBiYWNrIHRvIGBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZWAgd2hpY2ggaXMgc2xvd2VyLiBPcmlnaW5hbCBlcnJvcjpcbiIsdCl9Y29uc3Qgbj1hd2FpdCBlLmFycmF5QnVmZmVyKCk7cmV0dXJuIGF3YWl0IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKG4sdCl9e2NvbnN0IG49YXdhaXQgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoZSx0KTtyZXR1cm4gbiBpbnN0YW5jZW9mIFdlYkFzc2VtYmx5Lkluc3RhbmNlP3tpbnN0YW5jZTpuLG1vZHVsZTplfTpufX0oYXdhaXQgZSx0KTtyZXR1cm4gZ3Iobil9dmFyIGJyPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLENvbnRleHQ6bW4sSW50b1VuZGVybHlpbmdCeXRlU291cmNlOlNuLEludG9VbmRlcmx5aW5nU2luazpCbixJbnRvVW5kZXJseWluZ1NvdXJjZTp4bixMc3BTZXJ2ZXJDb25maWc6RW4sUmVzcG9uc2VDb250ZXh0OlVuLFRhbmdlbnRpYWxBcmNJbmZvT3V0cHV0V2FzbTpPbixXYXNtQ2lyY2xlUGFyYW1zOkluLGJhc2U2NF9kZWNvZGU6ZnVuY3Rpb24oZSl7Y29uc3QgdD1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbj1fcixyPXVyLmJhc2U2NF9kZWNvZGUodCxuKTtpZihyWzNdKXRocm93IHNyKHJbMl0pO3ZhciBpPXFuKHJbMF0sclsxXSkuc2xpY2UoKTtyZXR1cm4gdXIuX193YmluZGdlbl9mcmVlKHJbMF0sMSpyWzFdLDEpLGl9LGNhbGN1bGF0ZV9jaXJjbGVfZnJvbV8zX3BvaW50czpmdW5jdGlvbihlLHQsbixyLGksbyl7Y29uc3Qgcz11ci5jYWxjdWxhdGVfY2lyY2xlX2Zyb21fM19wb2ludHMoZSx0LG4scixpLG8pO3JldHVybiBJbi5fX3dyYXAocyl9LGNoYW5nZV9kZWZhdWx0X3VuaXRzOmZ1bmN0aW9uKGUsdCl7bGV0IG4scjt0cnl7Y29uc3Qgcz1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYT1fcixjPW9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxmPV9yLGw9dXIuY2hhbmdlX2RlZmF1bHRfdW5pdHMocyxhLGMsZik7dmFyIGk9bFswXSxvPWxbMV07aWYobFszXSl0aHJvdyBpPTAsbz0wLHNyKGxbMl0pO3JldHVybiBuPWkscj1vLFhuKGksbyl9ZmluYWxseXt1ci5fX3diaW5kZ2VuX2ZyZWUobixyLDEpfX0sY2hhbmdlX2V4cGVyaW1lbnRhbF9mZWF0dXJlczpmdW5jdGlvbihlLHQpe2xldCBuLHI7dHJ5e2NvbnN0IHM9b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGE9X3IsYz1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksZj1fcixsPXVyLmNoYW5nZV9leHBlcmltZW50YWxfZmVhdHVyZXMocyxhLGMsZik7dmFyIGk9bFswXSxvPWxbMV07aWYobFszXSl0aHJvdyBpPTAsbz0wLHNyKGxbMl0pO3JldHVybiBuPWkscj1vLFhuKGksbyl9ZmluYWxseXt1ci5fX3diaW5kZ2VuX2ZyZWUobixyLDEpfX0sY29yZWR1bXA6ZnVuY3Rpb24oZSl7cmV0dXJuIHVyLmNvcmVkdW1wKGUpfSxkZWZhdWx0X2FwcF9zZXR0aW5nczpmdW5jdGlvbigpe2NvbnN0IGU9dXIuZGVmYXVsdF9hcHBfc2V0dGluZ3MoKTtpZihlWzJdKXRocm93IHNyKGVbMV0pO3JldHVybiBzcihlWzBdKX0sZGVmYXVsdF9wcm9qZWN0X3NldHRpbmdzOmZ1bmN0aW9uKCl7Y29uc3QgZT11ci5kZWZhdWx0X3Byb2plY3Rfc2V0dGluZ3MoKTtpZihlWzJdKXRocm93IHNyKGVbMV0pO3JldHVybiBzcihlWzBdKX0sZm9ybWF0X251bWJlcl9saXRlcmFsOmZ1bmN0aW9uKGUsdCxuKXtsZXQgcixpO3RyeXtjb25zdCBhPW9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxjPV9yLGY9dXIuZm9ybWF0X251bWJlcl9saXRlcmFsKGUsYSxjLG5yKG4pPzQyOTQ5NjcyOTc6bj4+PjApO3ZhciBvPWZbMF0scz1mWzFdO2lmKGZbM10pdGhyb3cgbz0wLHM9MCxzcihmWzJdKTtyZXR1cm4gcj1vLGk9cyxYbihvLHMpfWZpbmFsbHl7dXIuX193YmluZGdlbl9mcmVlKHIsaSwxKX19LGZvcm1hdF9udW1iZXJfdmFsdWU6ZnVuY3Rpb24oZSx0KXtsZXQgbixyO3RyeXtjb25zdCBzPW9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxhPV9yLGM9dXIuZm9ybWF0X251bWJlcl92YWx1ZShlLHMsYSk7dmFyIGk9Y1swXSxvPWNbMV07aWYoY1szXSl0aHJvdyBpPTAsbz0wLHNyKGNbMl0pO3JldHVybiBuPWkscj1vLFhuKGksbyl9ZmluYWxseXt1ci5fX3diaW5kZ2VuX2ZyZWUobixyLDEpfX0sZ2V0X2tjbF92ZXJzaW9uOmZ1bmN0aW9uKCl7bGV0IGUsdDt0cnl7Y29uc3Qgbj11ci5nZXRfa2NsX3ZlcnNpb24oKTtyZXR1cm4gZT1uWzBdLHQ9blsxXSxYbihuWzBdLG5bMV0pfWZpbmFsbHl7dXIuX193YmluZGdlbl9mcmVlKGUsdCwxKX19LGdldF90YW5nZW50aWFsX2FyY190b19pbmZvOmZ1bmN0aW9uKGUsdCxuLHIsaSxvLHMpe2NvbnN0IGE9dXIuZ2V0X3RhbmdlbnRpYWxfYXJjX3RvX2luZm8oZSx0LG4scixpLG8scyk7cmV0dXJuIE9uLl9fd3JhcChhKX0saHVtYW5fZGlzcGxheV9udW1iZXI6ZnVuY3Rpb24oZSx0KXtsZXQgbixyO3RyeXtjb25zdCBzPW9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxhPV9yLGM9dXIuaHVtYW5fZGlzcGxheV9udW1iZXIoZSxzLGEpO3ZhciBpPWNbMF0sbz1jWzFdO2lmKGNbM10pdGhyb3cgaT0wLG89MCxzcihjWzJdKTtyZXR1cm4gbj1pLHI9byxYbihpLG8pfWZpbmFsbHl7dXIuX193YmluZGdlbl9mcmVlKG4sciwxKX19LGltcG9ydF9maWxlX2V4dGVuc2lvbnM6ZnVuY3Rpb24oKXtjb25zdCBlPXVyLmltcG9ydF9maWxlX2V4dGVuc2lvbnMoKTtpZihlWzNdKXRocm93IHNyKGVbMl0pO3ZhciB0PVluKGVbMF0sZVsxXSkuc2xpY2UoKTtyZXR1cm4gdXIuX193YmluZGdlbl9mcmVlKGVbMF0sNCplWzFdLDQpLHR9LGlzX2tjbF9lbXB0eV9vcl9vbmx5X3NldHRpbmdzOmZ1bmN0aW9uKGUpe2NvbnN0IHQ9b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLG49X3Iscj11ci5pc19rY2xfZW1wdHlfb3Jfb25seV9zZXR0aW5ncyh0LG4pO2lmKHJbMl0pdGhyb3cgc3IoclsxXSk7cmV0dXJuIHNyKHJbMF0pfSxpc19wb2ludHNfY2N3OmZ1bmN0aW9uKGUpe2NvbnN0IHQ9aXIoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyksbj1fcjtyZXR1cm4gdXIuaXNfcG9pbnRzX2Njdyh0LG4pfSxrY2xfbGludDpmdW5jdGlvbihlKXtjb25zdCB0PW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxuPV9yO3JldHVybiB1ci5rY2xfbGludCh0LG4pfSxrY2xfc2V0dGluZ3M6ZnVuY3Rpb24oZSl7Y29uc3QgdD1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbj1fcixyPXVyLmtjbF9zZXR0aW5ncyh0LG4pO2lmKHJbMl0pdGhyb3cgc3IoclsxXSk7cmV0dXJuIHNyKHJbMF0pfSxsc3BfcnVuX2NvcGlsb3Q6ZnVuY3Rpb24oZSx0LG4pe1BuKGUsRW4pO3ZhciByPWUuX19kZXN0cm95X2ludG9fcmF3KCk7Y29uc3QgaT1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbz1fcixzPW9yKG4sdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxhPV9yO3JldHVybiB1ci5sc3BfcnVuX2NvcGlsb3QocixpLG8scyxhKX0sbHNwX3J1bl9rY2w6ZnVuY3Rpb24oZSx0LG4pe1BuKGUsRW4pO3ZhciByPWUuX19kZXN0cm95X2ludG9fcmF3KCk7Y29uc3QgaT1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbz1fcixzPW9yKG4sdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxhPV9yO3JldHVybiB1ci5sc3BfcnVuX2tjbChyLGksbyxzLGEpfSxub2RlX3BhdGhfZnJvbV9yYW5nZTpmdW5jdGlvbihlLHQpe2NvbnN0IG49b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHI9X3IsaT1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbz1fcjtyZXR1cm4gdXIubm9kZV9wYXRoX2Zyb21fcmFuZ2UobixyLGksbyl9LHBhcnNlX2FwcF9zZXR0aW5nczpmdW5jdGlvbihlKXtjb25zdCB0PW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxuPV9yLHI9dXIucGFyc2VfYXBwX3NldHRpbmdzKHQsbik7aWYoclsyXSl0aHJvdyBzcihyWzFdKTtyZXR1cm4gc3IoclswXSl9LHBhcnNlX3Byb2plY3Rfc2V0dGluZ3M6ZnVuY3Rpb24oZSl7Y29uc3QgdD1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbj1fcixyPXVyLnBhcnNlX3Byb2plY3Rfc2V0dGluZ3ModCxuKTtpZihyWzJdKXRocm93IHNyKHJbMV0pO3JldHVybiBzcihyWzBdKX0scGFyc2Vfd2FzbTpObixwb2ludF90b191bml0OmZ1bmN0aW9uKGUsdCxuKXtjb25zdCByPW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxpPV9yLG89b3IodCx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHM9X3IsYT1vcihuLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYz1fcixmPXVyLnBvaW50X3RvX3VuaXQocixpLG8scyxhLGMpO2lmKGZbM10pdGhyb3cgc3IoZlsyXSk7dmFyIGwsdSxfPShsPWZbMF0sdT1mWzFdLGw+Pj49MCxHbigpLnN1YmFycmF5KGwvOCxsLzgrdSkpLnNsaWNlKCk7cmV0dXJuIHVyLl9fd2JpbmRnZW5fZnJlZShmWzBdLDgqZlsxXSw4KSxffSxyZWNhc3Rfd2FzbTpmdW5jdGlvbihlKXtjb25zdCB0PW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxuPV9yLHI9dXIucmVjYXN0X3dhc20odCxuKTtpZihyWzJdKXRocm93IHNyKHJbMV0pO3JldHVybiBzcihyWzBdKX0scmVsZXZhbnRfZmlsZV9leHRlbnNpb25zOmZ1bmN0aW9uKCl7Y29uc3QgZT11ci5yZWxldmFudF9maWxlX2V4dGVuc2lvbnMoKTtpZihlWzNdKXRocm93IHNyKGVbMl0pO3ZhciB0PVluKGVbMF0sZVsxXSkuc2xpY2UoKTtyZXR1cm4gdXIuX193YmluZGdlbl9mcmVlKGVbMF0sNCplWzFdLDQpLHR9LHNlcmlhbGl6ZV9jb25maWd1cmF0aW9uOmZ1bmN0aW9uKGUpe2NvbnN0IHQ9dXIuc2VyaWFsaXplX2NvbmZpZ3VyYXRpb24oZSk7aWYodFsyXSl0aHJvdyBzcih0WzFdKTtyZXR1cm4gc3IodFswXSl9LHNlcmlhbGl6ZV9wcm9qZWN0X2NvbmZpZ3VyYXRpb246ZnVuY3Rpb24oZSl7Y29uc3QgdD11ci5zZXJpYWxpemVfcHJvamVjdF9jb25maWd1cmF0aW9uKGUpO2lmKHRbMl0pdGhyb3cgc3IodFsxXSk7cmV0dXJuIHNyKHRbMF0pfSxza2V0Y2hfY2hlY2twb2ludF9saW1pdDpmdW5jdGlvbigpe3JldHVybiB1ci5za2V0Y2hfY2hlY2twb2ludF9saW1pdCgpPj4+MH0saW5pdFN5bmM6ZnVuY3Rpb24oZSl7aWYodm9pZCAwIT09dXIpcmV0dXJuIHVyO3ZvaWQgMCE9PWUmJihPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk9PT1PYmplY3QucHJvdG90eXBlPyh7bW9kdWxlOmV9PWUpOmNvbnNvbGUud2FybigidXNpbmcgZGVwcmVjYXRlZCBwYXJhbWV0ZXJzIGZvciBgaW5pdFN5bmMoKWA7IHBhc3MgYSBzaW5nbGUgb2JqZWN0IGluc3RlYWQiKSk7Y29uc3QgdD12bigpO3JldHVybiBlIGluc3RhbmNlb2YgV2ViQXNzZW1ibHkuTW9kdWxlfHwoZT1uZXcgV2ViQXNzZW1ibHkuTW9kdWxlKGUpKSxncihuZXcgV2ViQXNzZW1ibHkuSW5zdGFuY2UoZSx0KSl9LGRlZmF1bHQ6aHJ9KTtsZXQgZHI7Y29uc3Qgd3I9e2ZpcmVNb2RlbGluZ0NvbW1hbmRGcm9tV2FzbShlLHQsbixyKXt9LHNlbmRNb2RlbGluZ0NvbW1hbmRGcm9tV2FzbTphc3luYyhlLHQsbixyKT0+KHBvc3RNZXNzYWdlKHtmcm9tOiJ3ZWJzb2NrZXQiLHBheWxvYWQ6e3R5cGU6Im1lc3NhZ2UiLGRhdGE6bn19KSxkcj8uc2VuZChuKSxuZXcgUHJvbWlzZSgodD0+e2NvbnN0IG49cj0+e2lmKHIuZGF0YS5pbmRleE9mKGUpPDApcmV0dXJuO2NvbnN0IGk9KG89SlNPTi5wYXJzZShyLmRhdGEpLG5ldyBsKHMpLmVuY29kZVNoYXJlZFJlZihvKSk7dmFyIG8sczt0KGkpLGRyLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLG4pfTtkci5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixuKX0pKSksYXN5bmMgc3RhcnROZXdTZXNzaW9uKCl7fX07c2VsZi5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwoZT0+e2NvbnN0IHQ9ZS5kYXRhO3N3aXRjaCh0LnRvKXtjYXNlIndvcmtlciI6cmV0dXJuIHZvaWQoInN0YXJ0Ij09PXQucGF5bG9hZC50eXBlJiYoYXN5bmMgZT0+e2F3YWl0IGZldGNoKG5ldyBVUkwoIi9rY2xfd2FzbV9saWJfYmcud2FzbSIsbG9jYXRpb24ub3JpZ2luKSkudGhlbigoZT0+ZS5hcnJheUJ1ZmZlcigpKSkudGhlbigoZT0+aHIoe21vZHVsZV9vcl9wYXRoOmV9KSkpLGRyPW5ldyBXZWJTb2NrZXQoeW4udXJsQ29uc3RydWN0RnJvbSh7d2VicnRjOiEwLC4uLmV9KSksZHIuYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsKCgpPT57eW4uYXV0aGVudGljYXRlKHtjbGllbnQ6ZS5jbGllbnR9LGRyKX0pLHtvbmNlOiEwfSksZHIuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsKGU9Pntwb3N0TWVzc2FnZSh7ZnJvbToid2Vic29ja2V0IixwYXlsb2FkOnt0eXBlOiJtZXNzYWdlIixkYXRhOmUuZGF0YX19KX0pKSxzZXRJbnRlcnZhbCgoKCk9Pntkci5yZWFkeVN0YXRlPT09V2ViU29ja2V0Lk9QRU4mJmRyLnNlbmQoSlNPTi5zdHJpbmdpZnkoe3R5cGU6InBpbmcifSkpfSksNGUzKX0pKHQucGF5bG9hZC5kYXRhWzBdKSk7Y2FzZSJ3ZWJzb2NrZXQiOnJldHVybiB2b2lkIGRyPy5bdC5wYXlsb2FkLnR5cGVdKC4uLnQucGF5bG9hZC5kYXRhKTtjYXNlIndhc20iOnJldHVybiB2b2lkKCJleGVjdXRlIj09PXQucGF5bG9hZC50eXBlPygoZSx0PSJtYWluLmtjbCIpPT57Y29uc3Qgbj0ic3RyaW5nIj09dHlwZW9mIGU/KGk9ZSx7cmVhZEZpbGU6YXN5bmMgZT0+KG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKGkpLGV4aXN0czphc3luYyBlPT4hMSxnZXRBbGxGaWxlczphc3luYyBlPT5baV19KToocj1lLHthc3luYyByZWFkRmlsZShlKXtjb25zdCB0PXIuZ2V0KGUpPz8iIjtyZXR1cm4obmV3IFRleHRFbmNvZGVyKS5lbmNvZGUodCl9LGV4aXN0czphc3luYyBlPT5yLmhhcyhlKSxnZXRBbGxGaWxlczphc3luYyBlPT5BcnJheS5mcm9tKHIudmFsdWVzKCkpfSk7dmFyIHIsaTtjb25zdCBvPSJzdHJpbmciPT10eXBlb2YgZT9lOmUuZ2V0KHQpLHM9bmV3IG1uKHdyLG4pLGE9Tm4obylbMF07cmV0dXJuIHMuZXhlY3V0ZShKU09OLnN0cmluZ2lmeShhKSx0LCJ7fSIpfSkodC5wYXlsb2FkLmRhdGFbMF0pLnRoZW4oKCgpPT57cG9zdE1lc3NhZ2Uoe2Zyb206Indhc20iLHBheWxvYWQ6e3R5cGU6ImV4ZWN1dGUiLGRhdGE6ImRvbmUifX0pfSkpOnBvc3RNZXNzYWdlKGJyW3QucGF5bG9hZC50eXBlXSguLi50LnBheWxvYWQuZGF0YSkpKX19KSl9KCk7Cgo=", null, false);
|
|
2374
|
-
var On = (t, e2) => {
|
|
2375
|
-
let n;
|
|
2376
|
-
return { fn: (...t2) => {
|
|
2377
|
-
n = t2;
|
|
2378
|
-
}, intervalId: setInterval((() => {
|
|
2379
|
-
if (void 0 === n) return;
|
|
2380
|
-
const e3 = n;
|
|
2381
|
-
n = void 0, window.requestAnimationFrame((() => {
|
|
2382
|
-
t(...e3);
|
|
2383
|
-
}));
|
|
2384
|
-
}), e2) };
|
|
2385
|
-
};
|
|
2386
|
-
var En = (function(t) {
|
|
2387
|
-
return t[t.DOWN = 0] = "DOWN", t[t.UP = 1] = "UP", t;
|
|
2388
|
-
})(En || {});
|
|
2389
|
-
var _n = (function(t) {
|
|
2390
|
-
return t[t.MIDDLE = 1] = "MIDDLE", t[t.RIGHT = 2] = "RIGHT", t;
|
|
2391
|
-
})(_n || {});
|
|
2392
|
-
var Dn = { [En.DOWN]: "camera_drag_start", [En.UP]: "camera_drag_end" };
|
|
2393
|
-
var An = { [_n.MIDDLE]: "pan", [_n.RIGHT]: "rotatetrackball" };
|
|
2394
|
-
var $n = class extends EventTarget {
|
|
2395
|
-
removeMouseEvents = () => {
|
|
2396
|
-
};
|
|
2397
|
-
removeResizeObserver = () => {
|
|
2398
|
-
};
|
|
2399
|
-
constructor(t) {
|
|
2400
|
-
super(), this.zooClientArgs = t, this.workerWebRTC = new Qn(), this.rtcPeerConnection = new RTCPeerConnection({ bundlePolicy: "max-bundle" }), this.rtcPeerConnection.addTransceiver("video", { direction: "recvonly" }), this.rtcPeerConnection.createDataChannel("unreliable_modeling_cmds"), this.ice(), this.rtcPeerConnection.addEventListener("track", this.webRTCOnTrack.bind(this)), this.rtcPeerConnection.addEventListener("datachannel", this.webRTCOnDataChannel.bind(this)), this.rtcPeerConnection.addEventListener("connectionstatechange", this.webRTCOnConnectionStateChange.bind(this));
|
|
2401
|
-
}
|
|
2402
|
-
deconstructor() {
|
|
2403
|
-
this.removeMouseEvents(), this.removeResizeObserver(), this.deice(), this.rtcPeerConnection.removeEventListener("track", this.webRTCOnTrack.bind(this)), this.rtcPeerConnection.removeEventListener("datachannel", this.webRTCOnDataChannel.bind(this)), this.rtcPeerConnection.removeEventListener("connectionstatechange", this.webRTCOnConnectionStateChange.bind(this)), this.workerWebRTC.terminate(), this.rtcPeerConnection.close();
|
|
2404
|
-
}
|
|
2405
|
-
start() {
|
|
2406
|
-
this.workerWebRTC.postMessage({ to: "worker", payload: { type: "start", data: [this.zooClientArgs] } });
|
|
2407
|
-
}
|
|
2408
|
-
wasm(t, ...e2) {
|
|
2409
|
-
return new Promise(((n) => {
|
|
2410
|
-
const i = (t2) => {
|
|
2411
|
-
const e3 = t2.data;
|
|
2412
|
-
"wasm" === e3.from && (this.workerWebRTC.removeEventListener("message", i), n(e3.payload.data));
|
|
2413
|
-
};
|
|
2414
|
-
this.workerWebRTC.addEventListener("message", i), this.workerWebRTC.postMessage({ to: "wasm", payload: { type: t, data: e2 ?? [] } });
|
|
2415
|
-
}));
|
|
2416
|
-
}
|
|
2417
|
-
executor() {
|
|
2418
|
-
return { addEventListener: this.workerWebRTC.addEventListener.bind(this.workerWebRTC, "message"), removeEventListener: this.workerWebRTC.removeEventListener.bind(this.workerWebRTC, "message"), submit: (t) => new Promise(((e2) => {
|
|
2419
|
-
const n = (t2) => {
|
|
2420
|
-
const i = t2.data;
|
|
2421
|
-
"wasm" === i.from && "execute" === i.payload.type && "done" === i.payload.data && (this.workerWebRTC.removeEventListener("message", n), e2(void 0));
|
|
2422
|
-
};
|
|
2423
|
-
this.workerWebRTC.addEventListener("message", n), this.workerWebRTC.postMessage({ to: "wasm", payload: { type: "execute", data: [t] } });
|
|
2424
|
-
})) };
|
|
2425
|
-
}
|
|
2426
|
-
webRTCOnConnectionStateChange() {
|
|
2427
|
-
if ("disconnected" === this.rtcPeerConnection.connectionState) this.dispatchEvent(new Event("close"));
|
|
2428
|
-
}
|
|
2429
|
-
webRTCOnTrack(t) {
|
|
2430
|
-
this.track = t, this.dispatchEvent(new Event("track"));
|
|
2431
|
-
}
|
|
2432
|
-
webRTCOnDataChannel(t) {
|
|
2433
|
-
this.channel = t.channel, this.dispatchEvent(new Event("datachannel")), this.dispatchEvent(new Event("connected"));
|
|
2434
|
-
}
|
|
2435
|
-
async iceOnIceServerInfo(t) {
|
|
2436
|
-
if (0 == t.data.ice_servers.length) return;
|
|
2437
|
-
this.rtcPeerConnection.setConfiguration({ bundlePolicy: "max-bundle", iceServers: t.data.ice_servers, iceTransportPolicy: "relay" });
|
|
2438
|
-
const e2 = await this.rtcPeerConnection.createOffer();
|
|
2439
|
-
await this.rtcPeerConnection.setLocalDescription(e2), this.workerWebRTC.postMessage({ to: "websocket", payload: { type: "send", data: [JSON.stringify({ type: "sdp_offer", offer: e2 })] } });
|
|
2440
|
-
}
|
|
2441
|
-
async iceOnSdpAnswer(t) {
|
|
2442
|
-
await this.rtcPeerConnection.setRemoteDescription(t.data.answer);
|
|
2443
|
-
}
|
|
2444
|
-
async iceOnTrickleIce(t) {
|
|
2445
|
-
await this.rtcPeerConnection.addIceCandidate(t.data.candidate);
|
|
2446
|
-
}
|
|
2447
|
-
iceOnIceCandidate(t) {
|
|
2448
|
-
null !== t.candidate && this.workerWebRTC.postMessage({ to: "websocket", payload: { type: "send", data: [JSON.stringify({ type: "trickle_ice", candidate: { candidate: t.candidate.candidate, sdpMid: t.candidate.sdpMid || void 0, sdpMLineIndex: t.candidate.sdpMLineIndex || void 0, usernameFragment: t.candidate.usernameFragment || void 0 } })] } });
|
|
2449
|
-
}
|
|
2450
|
-
iceOnMessage(t) {
|
|
2451
|
-
const e2 = In.parseMessage(t);
|
|
2452
|
-
if ("resp" in e2) switch (e2.resp.type) {
|
|
2453
|
-
case "ice_server_info":
|
|
2454
|
-
this.iceOnIceServerInfo(e2.resp);
|
|
2455
|
-
break;
|
|
2456
|
-
case "sdp_answer":
|
|
2457
|
-
this.iceOnSdpAnswer(e2.resp);
|
|
2458
|
-
break;
|
|
2459
|
-
case "trickle_ice":
|
|
2460
|
-
this.iceOnTrickleIce(e2.resp);
|
|
2461
|
-
}
|
|
2462
|
-
}
|
|
2463
|
-
workerWebRTCOnMessage(t) {
|
|
2464
|
-
const e2 = t.data;
|
|
2465
|
-
"websocket" === e2.from && "message" === e2.payload.type && this.iceOnMessage(e2.payload);
|
|
2466
|
-
}
|
|
2467
|
-
ice() {
|
|
2468
|
-
this.workerWebRTC.addEventListener("message", this.workerWebRTCOnMessage.bind(this)), this.rtcPeerConnection.addEventListener("icecandidate", this.iceOnIceCandidate.bind(this));
|
|
2469
|
-
}
|
|
2470
|
-
deice() {
|
|
2471
|
-
this.workerWebRTC.removeEventListener("message", this.workerWebRTCOnMessage.bind(this)), this.rtcPeerConnection.removeEventListener("icecandidate", this.iceOnIceCandidate);
|
|
2472
|
-
}
|
|
2473
|
-
addMouseEvents(t) {
|
|
2474
|
-
let e2, n = En.UP;
|
|
2475
|
-
const i = (t2) => (i2) => {
|
|
2476
|
-
const l2 = An[i2.button];
|
|
2477
|
-
void 0 !== l2 && (this.workerWebRTC.postMessage({ to: "websocket", payload: { type: "send", data: [JSON.stringify({ type: "modeling_cmd_req", cmd_id: "00000000-0000-0000-0000-000000000000", cmd: { type: Dn[t2], interaction: l2, window: { x: i2.offsetX, y: i2.offsetY } } })] } }), e2 = i2.button, n = t2);
|
|
2478
|
-
}, l = i(En.DOWN), o = i(En.UP), c = (t2) => {
|
|
2479
|
-
const i2 = An[e2];
|
|
2480
|
-
void 0 !== i2 && (n = En.UP, this.workerWebRTC.postMessage({ to: "websocket", payload: { type: "send", data: [JSON.stringify({ type: "modeling_cmd_req", cmd_id: "00000000-0000-0000-0000-000000000000", cmd: { type: Dn[n], interaction: i2, window: { x: t2.offsetX, y: t2.offsetY } } })] } }));
|
|
2481
|
-
};
|
|
2482
|
-
let a = 0;
|
|
2483
|
-
const s = On(((t2) => {
|
|
2484
|
-
n === En.DOWN && this.channel?.send(JSON.stringify({ type: "modeling_cmd_req", cmd_id: "00000000-0000-0000-0000-000000000000", cmd: { type: "camera_drag_move", interaction: An[e2], window: { x: t2.offsetX, y: t2.offsetY } } })), a += 1, this.channel?.send(JSON.stringify({ type: "modeling_cmd_req", cmd_id: "00000000-0000-0000-0000-000000000000", cmd: { type: "mouse_move", sequence: a, window: { x: t2.offsetX, y: t2.offsetY } } }));
|
|
2485
|
-
}), 1e3 / 30), d = On(((t2) => {
|
|
2486
|
-
t2.preventDefault(), this.channel?.send(JSON.stringify({ type: "modeling_cmd_req", cmd_id: "00000000-0000-0000-0000-000000000000", cmd: { type: "default_camera_zoom", magnitude: -1 * Math.sign(t2.deltaY) * window.devicePixelRatio * 50 } }));
|
|
2487
|
-
}), 1e3 / 30), b = (e3) => {
|
|
2488
|
-
this.channel = e3.channel, t.addEventListener("pointerdown", l), t.addEventListener("pointermove", s.fn), t.addEventListener("pointerup", o), t.addEventListener("pointerleave", c), t.addEventListener("wheel", d.fn, { passive: false });
|
|
2489
|
-
};
|
|
2490
|
-
this.rtcPeerConnection.addEventListener("datachannel", b), this.removeMouseEvents = () => {
|
|
2491
|
-
this.rtcPeerConnection.removeEventListener("datachannel", b), t.removeEventListener("pointerdown", l), t.removeEventListener("pointermove", s.fn), clearInterval(s.intervalId), t.removeEventListener("pointerup", o), t.removeEventListener("pointerleave", c), t.removeEventListener("wheel", d.fn), clearInterval(d.intervalId);
|
|
2492
|
-
};
|
|
2493
|
-
}
|
|
2494
|
-
resize(t) {
|
|
2495
|
-
window.requestAnimationFrame((() => {
|
|
2496
|
-
this.send(JSON.stringify({ type: "modeling_cmd_req", cmd_id: "00000000-0000-0000-0000-000000000000", cmd: { type: "reconfigure_stream", ...t, fps: 30 } }));
|
|
2497
|
-
}));
|
|
2498
|
-
}
|
|
2499
|
-
addResizeObserver(t) {
|
|
2500
|
-
const e2 = t.querySelector("video"), n = On(((t2) => {
|
|
2501
|
-
for (const n2 of t2) {
|
|
2502
|
-
const t3 = n2.contentRect.width - n2.contentRect.width % 4, i2 = n2.contentRect.height - n2.contentRect.height % 4;
|
|
2503
|
-
e2.width = t3, e2.height = i2, this.resize({ width: t3, height: i2 });
|
|
2504
|
-
}
|
|
2505
|
-
}), 62.5), i = new ResizeObserver(n.fn);
|
|
2506
|
-
i.observe(t), this.removeResizeObserver = () => {
|
|
2507
|
-
clearInterval(n.intervalId), i.disconnect();
|
|
2508
|
-
};
|
|
2509
|
-
}
|
|
2510
|
-
send(...t) {
|
|
2511
|
-
this.workerWebRTC.postMessage({ to: "websocket", payload: { type: "send", data: t } });
|
|
2512
|
-
}
|
|
2513
|
-
};
|
|
2514
|
-
|
|
2515
|
-
// src/svg-zoo.ts
|
|
2516
|
-
var svg_zoo_default = '<svg viewBox="0 -2 245 84" fill="none" xmlns="http://www.w3.org/2000/svg"><g><path fill="currentcolor" d="M49.1899 14.2024V1.75536H0.0079789V19.3089H44.4824L0.0159578 67.5334H0.0079789V67.5414L0 67.5493L0.0079789 67.5573V79.3501H11.4018L22.8755 66.903V79.3501H72.0574V61.7965H27.591L72.0574 13.5641V1.75536L60.6556 1.77131L49.1899 14.2024Z"></path><path fill="currentcolor" fill-rule="evenodd" clip-rule="evenodd" d="M116.723 17.5536C103.981 17.5536 93.6164 27.9182 93.6164 40.6605C93.6164 45.751 95.276 50.4665 98.0846 54.2884L86.0205 67.2781C79.8129 60.1369 76.0628 50.8256 76.0628 40.6605C76.0628 18.2398 94.3026 0 116.723 0C125.819 0 134.221 3.00007 141.003 8.06666L128.939 21.0563C125.396 18.8382 121.207 17.5536 116.723 17.5536ZM139.83 40.6605C139.83 35.5699 138.171 30.8544 135.37 27.0245L147.426 14.0349C153.634 21.176 157.384 30.4874 157.384 40.6605C157.384 63.0732 139.144 81.3129 116.723 81.3129C107.627 81.3129 99.2256 78.3129 92.4435 73.2542L104.516 60.2566C108.058 62.4748 112.239 63.7594 116.723 63.7594C129.466 63.7594 139.83 53.3948 139.83 40.6605Z"></path><path fill="currentcolor" fill-rule="evenodd" clip-rule="evenodd" d="M204.34 17.5536C191.597 17.5536 181.233 27.9182 181.233 40.6605C181.233 45.751 182.892 50.4665 185.701 54.2884L173.637 67.2781C167.429 60.1369 163.679 50.8256 163.679 40.6605C163.679 18.2398 181.919 0 204.34 0C213.435 0 221.837 3.00007 228.619 8.06666L216.555 21.0563C213.013 18.8382 208.824 17.5536 204.34 17.5536ZM222.986 27.0245L235.042 14.0349C241.25 21.176 245 30.4874 245 40.6605C245 63.0732 226.76 81.3129 204.34 81.3129C195.244 81.3129 186.842 78.3129 180.06 73.2542L192.132 60.2566C195.674 62.4748 199.855 63.7594 204.34 63.7594C217.082 63.7594 227.446 53.3948 227.446 40.6605C227.446 35.5699 225.787 30.8544 222.986 27.0245Z"></path></g></svg>';
|
|
2517
|
-
|
|
2518
|
-
// src/index.ts
|
|
2519
|
-
window.zoo ??= {};
|
|
2520
|
-
window.zoo.kittycadWebViews ??= [];
|
|
2521
|
-
var preventDefault = (e2) => e2.preventDefault();
|
|
2522
|
-
var ZooWebView = class _ZooWebView extends EventTarget {
|
|
1
|
+
import * as zoo from '@kittycad/lib';
|
|
2
|
+
import svgZoo from './svg-zoo';
|
|
3
|
+
window.zoo ??= {};
|
|
4
|
+
window.zoo.kittycadWebViews ??= [];
|
|
5
|
+
const preventDefault = (e) => e.preventDefault();
|
|
6
|
+
var ZooWebViewState;
|
|
7
|
+
(function (ZooWebViewState) {
|
|
8
|
+
ZooWebViewState["Fresh"] = "fresh";
|
|
9
|
+
ZooWebViewState["Starting"] = "starting";
|
|
10
|
+
ZooWebViewState["Running"] = "running";
|
|
11
|
+
ZooWebViewState["Killed"] = "killed";
|
|
12
|
+
})(ZooWebViewState || (ZooWebViewState = {}));
|
|
13
|
+
export class ZooWebView extends EventTarget {
|
|
2523
14
|
el;
|
|
2524
|
-
rtc =
|
|
15
|
+
rtc = undefined;
|
|
2525
16
|
size;
|
|
2526
|
-
state =
|
|
17
|
+
state = ZooWebViewState.Fresh;
|
|
2527
18
|
constructor(args) {
|
|
2528
|
-
|
|
2529
|
-
|
|
2530
|
-
|
|
2531
|
-
|
|
2532
|
-
|
|
2533
|
-
};
|
|
2534
|
-
this.el = _ZooWebView.createElements({ size: sizeAdjusted });
|
|
2535
|
-
const elVideo = this.el.querySelector("video");
|
|
2536
|
-
if (elVideo === null) return;
|
|
2537
|
-
elVideo.addEventListener("contextmenu", preventDefault);
|
|
2538
|
-
const elStart = this.el.querySelector("div.start");
|
|
2539
|
-
if (elStart === null) return;
|
|
2540
|
-
const zooWebRTC = new $n({
|
|
2541
|
-
client: args.zooClient,
|
|
2542
|
-
video_res_width: sizeAdjusted.width,
|
|
2543
|
-
video_res_height: sizeAdjusted.height,
|
|
2544
|
-
order_independent_transparency: true,
|
|
2545
|
-
show_grid: true,
|
|
2546
|
-
post_effect: "ssao",
|
|
2547
|
-
fps: 30
|
|
2548
|
-
});
|
|
2549
|
-
zooWebRTC.addResizeObserver(this.el);
|
|
2550
|
-
const startZooWebRTC = () => {
|
|
2551
|
-
window.zoo?.kittycadWebViews?.filter((v2) => ["running" /* Running */, "starting" /* Starting */].indexOf(v2.state) >= 0).forEach((v2) => v2.deconstructor());
|
|
2552
|
-
this.state = "starting" /* Starting */;
|
|
2553
|
-
const onClose = () => {
|
|
2554
|
-
this.deconstructor();
|
|
19
|
+
super();
|
|
20
|
+
this.size = args.size;
|
|
21
|
+
const sizeAdjusted = {
|
|
22
|
+
width: args.size.width - args.size.width % 4,
|
|
23
|
+
height: args.size.height - args.size.height % 4,
|
|
2555
24
|
};
|
|
2556
|
-
|
|
2557
|
-
const
|
|
2558
|
-
|
|
2559
|
-
|
|
25
|
+
this.el = ZooWebView.createElements({ size: sizeAdjusted });
|
|
26
|
+
const elVideo = this.el.querySelector('video');
|
|
27
|
+
if (elVideo === null)
|
|
28
|
+
return;
|
|
29
|
+
elVideo.addEventListener('contextmenu', preventDefault);
|
|
30
|
+
const elStart = this.el.querySelector('div.start');
|
|
31
|
+
if (elStart === null)
|
|
32
|
+
return;
|
|
33
|
+
// Owns setting up the WebSocket. Because the WebSocket is only good for a
|
|
34
|
+
// single WebRTC handshake, and it's to be used as the ICE information
|
|
35
|
+
// exchange, any other usage by an application is unexpected.
|
|
36
|
+
const zooWebRTC = new zoo.WebRTC({
|
|
37
|
+
client: args.zooClient,
|
|
38
|
+
video_res_width: sizeAdjusted.width,
|
|
39
|
+
video_res_height: sizeAdjusted.height,
|
|
40
|
+
order_independent_transparency: true,
|
|
41
|
+
show_grid: true,
|
|
42
|
+
post_effect: 'ssao',
|
|
43
|
+
fps: 30,
|
|
44
|
+
});
|
|
45
|
+
zooWebRTC.addResizeObserver(this.el);
|
|
46
|
+
const startZooWebRTC = () => {
|
|
47
|
+
// Make sure no other web view components are running. In the future we
|
|
48
|
+
// may allow it.
|
|
49
|
+
window.zoo?.kittycadWebViews
|
|
50
|
+
?.filter(v => [ZooWebViewState.Running, ZooWebViewState.Starting].indexOf(v.state) >= 0)
|
|
51
|
+
.forEach(v => v.deconstructor());
|
|
52
|
+
this.state = ZooWebViewState.Starting;
|
|
53
|
+
const onClose = () => {
|
|
54
|
+
this.deconstructor();
|
|
55
|
+
};
|
|
56
|
+
zooWebRTC.addEventListener('close', onClose, { once: true });
|
|
57
|
+
const onTrack = (event) => {
|
|
58
|
+
if (!(event.target instanceof zoo.WebRTC))
|
|
59
|
+
return;
|
|
60
|
+
elVideo.srcObject = event.target.track?.streams[0] ?? null;
|
|
61
|
+
};
|
|
62
|
+
zooWebRTC.addEventListener('track', onTrack, { once: true });
|
|
63
|
+
const onConnected = (_event) => {
|
|
64
|
+
void elVideo.play().catch(console.warn);
|
|
65
|
+
this.rtc = zooWebRTC;
|
|
66
|
+
this.state = ZooWebViewState.Running;
|
|
67
|
+
this.dispatchEvent(new Event('ready'));
|
|
68
|
+
};
|
|
69
|
+
zooWebRTC.addMouseEvents(elVideo);
|
|
70
|
+
zooWebRTC.addEventListener('connected', onConnected, { once: true });
|
|
71
|
+
zooWebRTC.start();
|
|
2560
72
|
};
|
|
2561
|
-
|
|
2562
|
-
|
|
2563
|
-
|
|
2564
|
-
|
|
2565
|
-
|
|
2566
|
-
this.dispatchEvent(new Event("ready"));
|
|
73
|
+
this.state = ZooWebViewState.Fresh;
|
|
74
|
+
window.zoo?.kittycadWebViews?.push(this);
|
|
75
|
+
const elStartClick = () => {
|
|
76
|
+
ZooWebView.decoOn(sizeAdjusted, this.el, elStart);
|
|
77
|
+
startZooWebRTC();
|
|
2567
78
|
};
|
|
2568
|
-
|
|
2569
|
-
zooWebRTC.addEventListener("connected", onConnected, { once: true });
|
|
2570
|
-
zooWebRTC.start();
|
|
2571
|
-
};
|
|
2572
|
-
this.state = "fresh" /* Fresh */;
|
|
2573
|
-
window.zoo?.kittycadWebViews?.push(this);
|
|
2574
|
-
const elStartClick = () => {
|
|
2575
|
-
_ZooWebView.decoOn(sizeAdjusted, this.el, elStart);
|
|
2576
|
-
startZooWebRTC();
|
|
2577
|
-
};
|
|
2578
|
-
elStart.addEventListener("click", elStartClick);
|
|
79
|
+
elStart.addEventListener('click', elStartClick);
|
|
2579
80
|
}
|
|
2580
81
|
deconstructor() {
|
|
2581
|
-
|
|
2582
|
-
|
|
2583
|
-
|
|
2584
|
-
|
|
2585
|
-
|
|
2586
|
-
|
|
2587
|
-
|
|
2588
|
-
|
|
2589
|
-
|
|
2590
|
-
|
|
82
|
+
this.state = ZooWebViewState.Killed;
|
|
83
|
+
// Never remove this event listener.
|
|
84
|
+
// elStart.removeEventListener('click', elStartClick)
|
|
85
|
+
const elVideo = this.el.querySelector('video');
|
|
86
|
+
if (elVideo === null)
|
|
87
|
+
return;
|
|
88
|
+
elVideo.pause();
|
|
89
|
+
const elStart = this.el.querySelector('div.start');
|
|
90
|
+
if (elStart === null)
|
|
91
|
+
return;
|
|
92
|
+
ZooWebView.decoOff(this.size, this.el, elStart);
|
|
93
|
+
return Promise.allSettled([
|
|
94
|
+
this.rtc?.deconstructor()
|
|
95
|
+
]);
|
|
2591
96
|
}
|
|
2592
97
|
static decoOff(size, elZooWebView, elStart) {
|
|
2593
|
-
|
|
2594
|
-
|
|
2595
|
-
|
|
2596
|
-
|
|
2597
|
-
|
|
2598
|
-
|
|
2599
|
-
|
|
2600
|
-
|
|
2601
|
-
|
|
2602
|
-
|
|
2603
|
-
|
|
98
|
+
elZooWebView.style.width = size.width.toString();
|
|
99
|
+
elZooWebView.style.height = size.height.toString();
|
|
100
|
+
elZooWebView.style.justifyContent = 'center';
|
|
101
|
+
elZooWebView.style.alignItems = 'center';
|
|
102
|
+
elZooWebView.style.cursor = 'pointer';
|
|
103
|
+
elZooWebView.style.backgroundColor = '#1c1c1c';
|
|
104
|
+
elStart.style.paddingTop = '';
|
|
105
|
+
elStart.style.paddingRight = '';
|
|
106
|
+
elStart.style.width = (size.width / 2).toString();
|
|
107
|
+
elStart.style.position = 'absolute';
|
|
108
|
+
elStart.style.color = 'hsl(154deg 100% 25%)';
|
|
2604
109
|
}
|
|
2605
110
|
static decoOn(size, elZooWebView, elStart) {
|
|
2606
|
-
|
|
2607
|
-
|
|
2608
|
-
|
|
2609
|
-
|
|
2610
|
-
|
|
2611
|
-
|
|
111
|
+
elZooWebView.style.justifyContent = 'right';
|
|
112
|
+
elZooWebView.style.alignItems = 'flex-start';
|
|
113
|
+
elStart.style.width = (size.width / 4).toString();
|
|
114
|
+
elStart.style.color = 'hsl(154deg 100% 58%)';
|
|
115
|
+
elStart.style.paddingTop = '2px';
|
|
116
|
+
elStart.style.paddingRight = '2px';
|
|
2612
117
|
}
|
|
2613
118
|
static createElements(args) {
|
|
2614
|
-
|
|
2615
|
-
|
|
2616
|
-
|
|
2617
|
-
|
|
2618
|
-
|
|
2619
|
-
|
|
2620
|
-
|
|
2621
|
-
|
|
2622
|
-
|
|
2623
|
-
|
|
2624
|
-
|
|
2625
|
-
|
|
2626
|
-
|
|
2627
|
-
|
|
2628
|
-
}
|
|
2629
|
-
|
|
2630
|
-
|
|
2631
|
-
})();
|
|
119
|
+
const elZooWebView = document.createElement('div');
|
|
120
|
+
const elVideo = document.createElement('video');
|
|
121
|
+
const elStart = document.createElement('div');
|
|
122
|
+
elStart.classList.add('start');
|
|
123
|
+
elStart.innerHTML = svgZoo;
|
|
124
|
+
elVideo.width = args.size.width - args.size.width % 4;
|
|
125
|
+
elVideo.height = args.size.height - args.size.height % 4;
|
|
126
|
+
elZooWebView.style.display = 'flex';
|
|
127
|
+
elZooWebView.style.overflow = 'auto';
|
|
128
|
+
elZooWebView.style.overscrollBehavior = 'contain';
|
|
129
|
+
ZooWebView.decoOff(args.size, elZooWebView, elStart);
|
|
130
|
+
elZooWebView.appendChild(elVideo);
|
|
131
|
+
elZooWebView.appendChild(elStart);
|
|
132
|
+
return elZooWebView;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=index.js.map
|