bry-biometric-collector 2.2.13 → 2.2.14-RC01

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,133 @@
1
+ import { u as m, $ as D, n as C, g as b, i as y, s as l, a as w, F as U, b as M, c as E, v as x, d as B, A as P, e as u, h as g, f as v, j as W, k as R, l as k, m as V, o as F, p as $ } from "./main_fb7d1b28_2.2.14-RC01.js";
2
+ const f = m(D);
3
+ var X = /* @__PURE__ */ ((n) => (n.EXTENSION_MISSING = "EXTENSION_MISSING", n.USER_CANCELLED = "USER_CANCELLED", n.UNAUTHORIZED_EXTENSION = "UNAUTHORIZED_EXTENSION", n.SCANNER_NOT_FOUND = "SCANNER_NOT_FOUND", n.EXTENSION_MODULE_NOT_INSTALLED = "EXTENSION_MODULE_NOT_INSTALLED", n.FINGER_NOT_REMOVED = "FINGER_NOT_REMOVED", n.UNKNOWN_ERROR = "UNKNOWN_ERROR", n.EVALUATE_BIOMETRICS_TIMEOUT = "EVALUATE_BIOMETRICS_TIMEOUT", n.EVALUATE_BIOMETRICS_NETWORK_ISSUE = "EVALUATE_BIOMETRICS_NETWORK_ISSUE", n))(X || {});
4
+ class s extends Error {
5
+ constructor(a, d) {
6
+ super(a), this.status = d;
7
+ }
8
+ }
9
+ async function Q(n, a) {
10
+ const d = C([n])[0], T = b();
11
+ if (y(T))
12
+ throw new s(
13
+ "Attempting to capture finger but the extension apparently hasn't been properly injected. Received: " + T,
14
+ "EXTENSION_MISSING"
15
+ /* EXTENSION_MISSING */
16
+ );
17
+ if (l(!0), w())
18
+ throw l(!1), F(!1), new s(
19
+ "User cancelled",
20
+ "USER_CANCELLED"
21
+ /* USER_CANCELLED */
22
+ );
23
+ let c = null;
24
+ try {
25
+ c = await T.getFingerprint(
26
+ // @ts-ignore TODO: Alex has to fix this functions signature to accept pojo
27
+ JSON.stringify(
28
+ a ?? { outputFormat: "BASE64", imageFormat: "BMP", nonce: "webCollector", timeout: 3 }
29
+ )
30
+ );
31
+ } catch (e) {
32
+ console.error(e);
33
+ const t = e;
34
+ throw l(!1), t.key === "fingerprint.scanner.timeout" ? new s(
35
+ "Fingerprint scan timed out (didn't read a finger.)",
36
+ "USER_CANCELLED"
37
+ /* USER_CANCELLED */
38
+ ) : t.key === "extension.authorization.canceled" ? new s(
39
+ "Extension wasn't given authorization.",
40
+ "UNAUTHORIZED_EXTENSION"
41
+ /* UNAUTHORIZED_EXTENSION */
42
+ ) : t.key === "fingerprint.scanner.not.found" ? new s(
43
+ "Couldn't find fingerprint scanner.",
44
+ "SCANNER_NOT_FOUND"
45
+ /* SCANNER_NOT_FOUND */
46
+ ) : t.key === "signer.not.installed" ? new s(
47
+ "The extension module isn't installed.",
48
+ "EXTENSION_MODULE_NOT_INSTALLED"
49
+ /* EXTENSION_MODULE_NOT_INSTALLED */
50
+ ) : new s(
51
+ "Unknown error while capturing fingerprint.",
52
+ "UNKNOWN_ERROR"
53
+ /* UNKNOWN_ERROR */
54
+ );
55
+ }
56
+ if (w())
57
+ throw l(!1), F(!1), new s(
58
+ "User cancelled",
59
+ "USER_CANCELLED"
60
+ /* USER_CANCELLED */
61
+ );
62
+ const i = q(d);
63
+ i.image = c?.content.image?.data, i.base64WSQ = c?.content.fingerprint.data, i.nfiqRating = (c?.content.score || 0) + 98, i.status = U.AVAILABLE;
64
+ const L = M(E());
65
+ let r, _ = !1;
66
+ try {
67
+ r = await x(L, i);
68
+ } catch (e) {
69
+ if (i.nfiqRating = -1, i.base64WSQ = "", i.image = "", console.log("caught while validating fingerprint: ", e), B(e) && "message" in e && e.message === "error.template.extraction")
70
+ _ = !0;
71
+ else if (e instanceof XMLHttpRequest) {
72
+ const t = e;
73
+ "response" in t && "data" in t.response.data && t.response.data.message === "error.template.extraction" && (_ = !0);
74
+ } else
75
+ throw e instanceof P ? e.code === "ECONNABORTED" ? (console.log("The evaluate biometrics request took too long to answer!"), new s(
76
+ "Evaluate biometrics took too long to reply",
77
+ "EVALUATE_BIOMETRICS_TIMEOUT"
78
+ /* EVALUATE_BIOMETRICS_TIMEOUT */
79
+ )) : (console.error("Error evaluating biometrics!", e), u(E()), l(!1), new s(
80
+ "Network issue while validating biometrics, check logs",
81
+ "EVALUATE_BIOMETRICS_NETWORK_ISSUE"
82
+ /* EVALUATE_BIOMETRICS_NETWORK_ISSUE */
83
+ )) : (u(E()), l(!1), new s(
84
+ "Network issue while validating biometrics, check logs",
85
+ "EVALUATE_BIOMETRICS_NETWORK_ISSUE"
86
+ /* EVALUATE_BIOMETRICS_NETWORK_ISSUE */
87
+ ));
88
+ }
89
+ let S, N, O, A, I, o = g.LOW_QUALITY;
90
+ if (r) {
91
+ const e = r.bodyParts.find(
92
+ (t) => t.bodyPart === i.bodyPart
93
+ );
94
+ i.nfiqRating = e.quality, (e.quality > v() || e.status === "LOW_QUALITY") && (S = !0, o = g.LOW_QUALITY), r.bodyParts.find((t) => t.status === "DUPLICATE") && (N = !0, o = g.DUPLICATE), r.bodyParts.find((t) => t.status === "FORBIDDEN") && (O = !0, o = g.FORBIDDEN), r.bodyParts.find((t) => t.status === "AGR") && (A = !0, o = g.AGR_DETECTED), r.bodyParts.find((t) => t.status === "AGR_NOT_MATCH") && (I = !0, o = g.AGR_NO_MATCH);
95
+ }
96
+ if (N || S || O || I || A || _) {
97
+ i.nfiqRating = -1, i.base64WSQ = "", i.image = "", i.status = U.AVAILABLE;
98
+ let e = "badFingerQualitySwal";
99
+ N ? e = "unknownDuplicateFingerSwal" : O ? e = "forbiddenFingerSwal" : A ? e = "agrFinger" : I && (e = "agrFingerNotMatched");
100
+ let t = f(`${e}.text`);
101
+ if (W($) && N) {
102
+ e = "duplicateFingerSwal", t = f(`${e}.text`, {
103
+ values: {
104
+ finger1: f(`${e}.${r.matchingFingers?.[0]}`),
105
+ finger2: f(`${e}.${r.matchingFingers?.[1]}`)
106
+ }
107
+ });
108
+ const p = R();
109
+ return {
110
+ returnCode: o,
111
+ bodyParts: p,
112
+ matchingFingers: r.matchingFingers,
113
+ message: t
114
+ };
115
+ }
116
+ const h = R();
117
+ return { returnCode: o, bodyParts: h, message: t };
118
+ }
119
+ return u(E()), l(!1), k(), { returnCode: g.CAPTURED, bodyParts: R() };
120
+ }
121
+ function q(n) {
122
+ V();
123
+ for (const a of E())
124
+ if (a.index === n)
125
+ return a.selected = !0, a;
126
+ throw new Error(`Finger ${n} not found`);
127
+ }
128
+ export {
129
+ s as CaptureApiError,
130
+ X as CaptureErrorStatusEnum,
131
+ Q as captureSingleFinger
132
+ };
133
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmluZ2Vyc0FwaV83MDVlOTI4Zl8yLjIuMTQtUkMwMS5qcyIsInNvdXJjZXMiOlsiLi4vc3JjL2FwaS9maW5nZXJzQXBpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEF4aW9zRXJyb3IgfSBmcm9tICdheGlvcyc7XG5pbXBvcnQgdHlwZSB7IENhcHR1cmVQYXJhbXMsIEZpbmdlcnByaW50U2NhbiB9IGZyb20gJy4uL2luY2x1ZGUvRXh0ZW5zaW9uJztcbmltcG9ydCB7IGlzQ2FuY2VsbGluZywgc2V0Q2FuY2VsbGluZywgc2V0Q2FwdHVyaW5nIH0gZnJvbSAnLi4vbGliL2ZpbmdlcnNUYWIvYnV0dG9ucy9jYXB0dXJlL2NhcHR1cmVTdG9yZSc7XG5pbXBvcnQgeyBnZXRFeHRlbnNpb24sIGhhc0Zpbmdlck9uQW5kT2ZmLCBpc0V2ZXJ5dGhpbmdJbnN0YWxsZWQgfSBmcm9tICcuLi9saWIvZmluZ2Vyc1RhYi9leHRlbnNpb24vZXh0ZW5zaW9uJztcbmltcG9ydCB7XG4gIEJvZHlQYXJ0TmFtZXMsXG4gIEZpbmdlcixcbiAgZ2V0U2VsZWN0ZWRGaW5nZXIsXG4gIG5vcm1hbGl6ZUZpbmdlck5hbWVzQW5kSW5kZXhlc1RvSW5kZXhlcyxcbiAgdHlwZSBGaW5nZXJJbmRleCxcbiAgZ2V0RmluZ2VycyxcbiAgc2VsZWN0Tm90aGluZyxcbiAgRmluZ2VyU3RhdHVzLFxuICBnZXRDb2xsZWN0ZWRGaW5nZXJzLFxuICBzZXRGaW5nZXJzLFxuICBnZXRNaW5OZmlxQWNjZXB0YWJsZSxcbn0gZnJvbSAnLi4vbGliL2ZpbmdlcnNUYWIvaGFuZC9oYW5kUGFydHMvZmluZ2Vyc1N0b3JlJztcbmltcG9ydCB7IGlzT2JqZWN0LCBpc09iamVjdEVtcHR5IH0gZnJvbSAnLi4vbGliL3V0aWwvdXRpbCc7XG5pbXBvcnQge1xuICB2YWxpZGF0ZUZpbmdlckJpb21ldHJpY3MsXG4gIHR5cGUgQm9keVBhcnRSZXR1cm5UeXBlLFxuICB1c2VXYXNtLFxuICB0eXBlIEJvZHlQYXJ0LFxufSBmcm9tICcuLi9saWIvdmFsaWRhdG9ycy9iaW9tZXRyaWNzVmFsaWRhdG9yJztcbmltcG9ydCB7XG4gIGNvbGxlY3RGaW5nZXJzLFxuICBoYW5kbGVDYXB0dXJlUmV0dXJuU3RhdHVzLFxuICBub3RpZnlGaW5nZXJDb2xsZWN0ZWQsXG59IGZyb20gJy4uL2xpYi9maW5nZXJzVGFiL2J1dHRvbnMvYnV0dG9uSGFuZGxlcnMnO1xuaW1wb3J0IHsgZm9ybWF0LCB1bndyYXBGdW5jdGlvblN0b3JlIH0gZnJvbSAnc3ZlbHRlLWkxOG4nO1xuaW1wb3J0IHsgZ2V0IH0gZnJvbSAnc3ZlbHRlL3N0b3JlJztcbmNvbnN0ICRmb3JtYXQgPSB1bndyYXBGdW5jdGlvblN0b3JlKGZvcm1hdCk7XG5cbmV4cG9ydCB7IGNhcHR1cmVTaW5nbGVGaW5nZXIgfTtcblxuZXhwb3J0IGNvbnN0IGVudW0gQ2FwdHVyZUVycm9yU3RhdHVzRW51bSB7XG4gIEVYVEVOU0lPTl9NSVNTSU5HID0gJ0VYVEVOU0lPTl9NSVNTSU5HJyxcbiAgVVNFUl9DQU5DRUxMRUQgPSAnVVNFUl9DQU5DRUxMRUQnLFxuICBVTkFVVEhPUklaRURfRVhURU5TSU9OID0gJ1VOQVVUSE9SSVpFRF9FWFRFTlNJT04nLFxuICBTQ0FOTkVSX05PVF9GT1VORCA9ICdTQ0FOTkVSX05PVF9GT1VORCcsXG4gIEVYVEVOU0lPTl9NT0RVTEVfTk9UX0lOU1RBTExFRCA9ICdFWFRFTlNJT05fTU9EVUxFX05PVF9JTlNUQUxMRUQnLFxuICBGSU5HRVJfTk9UX1JFTU9WRUQgPSAnRklOR0VSX05PVF9SRU1PVkVEJyxcbiAgVU5LTk9XTl9FUlJPUiA9ICdVTktOT1dOX0VSUk9SJyxcbiAgRVZBTFVBVEVfQklPTUVUUklDU19USU1FT1VUID0gJ0VWQUxVQVRFX0JJT01FVFJJQ1NfVElNRU9VVCcsXG4gIEVWQUxVQVRFX0JJT01FVFJJQ1NfTkVUV09SS19JU1NVRSA9ICdFVkFMVUFURV9CSU9NRVRSSUNTX05FVFdPUktfSVNTVUUnLFxufVxuXG5leHBvcnQgY2xhc3MgQ2FwdHVyZUFwaUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIHB1YmxpYyBzdGF0dXM6IENhcHR1cmVFcnJvclN0YXR1c0VudW0pIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxufVxuXG4vKipcbiAqIFByb2dyYW1tYXRpY2FsbHkgY2FwdHVyZSBzaW5nbGUgZmluZ2VyXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNhcHR1cmVTaW5nbGVGaW5nZXIoXG4gIGZpbmdlck5hbWVPckluZGV4OiBudW1iZXIgfCBCb2R5UGFydE5hbWVzLFxuICBnZXRGaW5nZXJwcmludFBhcmFtczogQ2FwdHVyZVBhcmFtc1xuKTogUHJvbWlzZTx7XG4gIHJldHVybkNvZGU6IGhhbmRsZUNhcHR1cmVSZXR1cm5TdGF0dXM7XG4gIGJvZHlQYXJ0czogQm9keVBhcnRbXTtcbiAgbWF0Y2hpbmdGaW5nZXJzPzogQm9keVBhcnROYW1lc1tdO1xuICBtZXNzYWdlPzogc3RyaW5nO1xufT4ge1xuICBjb25zdCBmaW5nZXJJbmRleCA9IG5vcm1hbGl6ZUZpbmdlck5hbWVzQW5kSW5kZXhlc1RvSW5kZXhlcyhbZmluZ2VyTmFtZU9ySW5kZXhdKVswXTtcbiAgLy8gdHJ5IHtcbiAgY29uc3QgZXh0ZW5zaW9uID0gZ2V0RXh0ZW5zaW9uKCk7XG4gIC8vIGNoZWNrIHRoYXQgdGhlIGV4dGVuc2lvbiBpcyBhdmFpbGFibGVcbiAgaWYgKGlzT2JqZWN0RW1wdHkoZXh0ZW5zaW9uKSkge1xuICAgIHRocm93IG5ldyBDYXB0dXJlQXBpRXJyb3IoXG4gICAgICBcIkF0dGVtcHRpbmcgdG8gY2FwdHVyZSBmaW5nZXIgYnV0IHRoZSBleHRlbnNpb24gYXBwYXJlbnRseSBoYXNuJ3QgYmVlbiBwcm9wZXJseSBpbmplY3RlZC4gUmVjZWl2ZWQ6IFwiICsgZXh0ZW5zaW9uLFxuICAgICAgQ2FwdHVyZUVycm9yU3RhdHVzRW51bS5FWFRFTlNJT05fTUlTU0lOR1xuICAgICk7XG4gIH1cblxuICAvLyBjaGVjayB0aGF0IHRoZSBleHRlbnNpb24gaXMgaW5zdGFsbGVkXG4gIC8vIGlmIChnZXRFeHRlbnNpb24oKSkge1xuICAvLyAgIGlmICgnaXNFeHRlbnNpb25JbnN0YWxsZWQnIGluIGdldEV4dGVuc2lvbigpICYmICEoYXdhaXQgZ2V0RXh0ZW5zaW9uKCkuaXNFeHRlbnNpb25JbnN0YWxsZWQoKSkpIHtcbiAgLy8gICAgIGNvbnNvbGUuZXJyb3IoYFRoZSBleHRlbnNpb24gaXNuJ3QgaW5zdGFsbGVkIWApO1xuICAvLyAgICAgdGhyb3cgbmV3IENhcHR1cmVBcGlFcnJvcihcIlRoZSBleHRlbnNpb24gaXNuJ3QgaW5zdGFsbGVkIVwiLCBDYXB0dXJlRXJyb3JTdGF0dXNFbnVtLkVYVEVOU0lPTl9NSVNTSU5HKTtcbiAgLy8gICB9XG5cbiAgLy8gICAvLyBjaGVjayB0aGF0IHRoZSBtb2R1bGUgYW5kIGNvbXBsZW1lbnQgYXJlIGFsbCBpbnN0YWxsZWRcbiAgLy8gICBpZiAoIWlzRXZlcnl0aGluZ0luc3RhbGxlZCgpKSB7XG4gIC8vICAgICBhd2FpdCBnZXRFeHRlbnNpb24oKS5pbnN0YWxsQ29tcG9uZW50cz8uKFt7IHR5cGU6ICdmaW5nZXJQcmludCcgfV0pO1xuICAvLyAgIH1cbiAgLy8gfSBlbHNlIHtcbiAgLy8gICB0aHJvdyBuZXcgQ2FwdHVyZUFwaUVycm9yKFxuICAvLyAgICAgYFRoZSBleHRlbnNpb24gdmFyaWFibGUgcmVjZWl2ZWQgaXMgZW1wdHk6ICR7Z2V0RXh0ZW5zaW9uKCl9IWAsXG4gIC8vICAgICBDYXB0dXJlRXJyb3JTdGF0dXNFbnVtLkVYVEVOU0lPTl9NSVNTSU5HXG4gIC8vICAgKTtcbiAgLy8gfVxuXG4gIHNldENhcHR1cmluZyh0cnVlKTtcblxuICAvLyBpZiBzb21laG93IHRoZXkgbWFuYWdlZCB0byBhc2sgZm9yIGNhbmNlbGxhdGlvbiByaWdodCBiZWZvcmUgdGhlIHNjYW4sIHRoaXMgY2F0Y2hlcyB0aGF0XG4gIGlmIChpc0NhbmNlbGxpbmcoKSkge1xuICAgIHNldENhcHR1cmluZyhmYWxzZSk7XG4gICAgc2V0Q2FuY2VsbGluZyhmYWxzZSk7XG4gICAgdGhyb3cgbmV3IENhcHR1cmVBcGlFcnJvcignVXNlciBjYW5jZWxsZWQnLCBDYXB0dXJlRXJyb3JTdGF0dXNFbnVtLlVTRVJfQ0FOQ0VMTEVEKTtcbiAgfVxuXG4gIC8vIHByb21wdCB1c2VyIHRvIGNvbGxlY3QgdGhlIGZpbmdlclxuICBsZXQgY2FwdHVyZTogRmluZ2VycHJpbnRTY2FuIHwgbnVsbCA9IG51bGw7XG4gIHRyeSB7XG4gICAgLy8gY2FwdHVyZSB0aGUgZmluZ2VyXG4gICAgLy8gKmltcGxlbWVudGF0aW9uIGNvbnNpZGVyaW5nIHdlIG9ubHkgaGF2ZSB0aGUgZ2V0RmluZ2VycHJpbnQgbWV0aG9kIGF2YWlsYWJsZVxuICAgIGNhcHR1cmUgPSBhd2FpdCBleHRlbnNpb24uZ2V0RmluZ2VycHJpbnQoXG4gICAgICAvLyBAdHMtaWdub3JlIFRPRE86IEFsZXggaGFzIHRvIGZpeCB0aGlzIGZ1bmN0aW9ucyBzaWduYXR1cmUgdG8gYWNjZXB0IHBvam9cbiAgICAgIEpTT04uc3RyaW5naWZ5KFxuICAgICAgICBnZXRGaW5nZXJwcmludFBhcmFtcyA/PyB7IG91dHB1dEZvcm1hdDogJ0JBU0U2NCcsIGltYWdlRm9ybWF0OiAnQk1QJywgbm9uY2U6ICd3ZWJDb2xsZWN0b3InLCB0aW1lb3V0OiAzIH1cbiAgICAgIClcbiAgICApO1xuXG4gICAgLy8gLy8gaWYgd2UgaGF2ZSB0aGlzIGZ1bmN0aW9uYWxpdHkgYXZhaWxhYmxlLCBhc2sgdGhlIHVzZXIgdG8gcmVtb3ZlIGhpcyBmaW5nZXIgZnJvbSB0aGUgc2Nhbm5lclxuICAgIC8vIGNvbnNvbGUubG9nKCdoYXNGaW5nZXJPbkFuZE9mZicsIGhhc0Zpbmdlck9uQW5kT2ZmKCkpO1xuICAgIC8vIGlmIChoYXNGaW5nZXJPbkFuZE9mZigpKSB7XG4gICAgLy8gICAvLyBwcm9tcHQgdXNlciB0byByZW1vdmUgaGlzIGZpbmdlclxuICAgIC8vICAgLy8gaW5pdGlhdGUgdGltZXIsIGlmIGFmdGVyIHNvbWUgdGltZSB0aGUgZmluZ2VyIHN0aWxsIGhhc24ndCBiZWVuIGxpZnRlZCwgYXNrIHRoZSB1c2VyIHRvIGNsZWFuIHRoZSBzY2FubmVyXG4gICAgLy8gICBsZXQgc2Nhbm5lckRpcnR5ID0gZmFsc2U7XG4gICAgLy8gICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAvLyAgICAgc2Nhbm5lckRpcnR5ID0gdHJ1ZTtcbiAgICAvLyAgIH0sIDgwMDApO1xuICAgIC8vICAgd2hpbGUgKHRydWUpIHtcbiAgICAvLyAgICAgaWYgKChhd2FpdCBleHRlbnNpb24uaXNGaW5nZXJPZmY/LigpKT8uaXNGaW5nZXJPZmYgfHwgc2Nhbm5lckRpcnR5IHx8IGlzQ2FuY2VsbGluZygpKSB7XG4gICAgLy8gICAgICAgYnJlYWs7XG4gICAgLy8gICAgIH1cbiAgICAvLyAgIH1cbiAgICAvLyAgIC8vIGluZm9ybSB1c2VyIHRoZXkgc2hvdWxkIGNsZWFuIHRoZSBzY2FubmVyXG4gICAgLy8gICAgICAgaWYgKHNjYW5uZXJEaXJ0eSkge1xuXG4gICAgLy8gICAgICAgfVxuICAgIC8vIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgIGNvbnN0IGUgPSBlcnIgYXMgeyBrZXk6IHN0cmluZzsgZGVzY3JpcHRpb246IHN0cmluZyB9O1xuICAgIHNldENhcHR1cmluZyhmYWxzZSk7XG4gICAgLy8gVE9ETzogdHlwZSB0aGlzIGFuZCBjcmVhdGUgZW51bSBmb3IgZXJyb3JzXG4gICAgaWYgKGUua2V5ID09PSAnZmluZ2VycHJpbnQuc2Nhbm5lci50aW1lb3V0Jykge1xuICAgICAgLy8gaWYgdGltZWRvdXQganVzdCB0cnkgYWdhaW4sIHVubGVzcyB0cnlpbmcgdG8gY2FuY2VsXG4gICAgICAvLyBUT0RPOiBtYXliZSBzdG9wIGFmdGVyIHNvIG1hbnkgdHJpZXNcbiAgICAgIHRocm93IG5ldyBDYXB0dXJlQXBpRXJyb3IoXG4gICAgICAgIFwiRmluZ2VycHJpbnQgc2NhbiB0aW1lZCBvdXQgKGRpZG4ndCByZWFkIGEgZmluZ2VyLilcIixcbiAgICAgICAgQ2FwdHVyZUVycm9yU3RhdHVzRW51bS5VU0VSX0NBTkNFTExFRFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnZXh0ZW5zaW9uLmF1dGhvcml6YXRpb24uY2FuY2VsZWQnKSB7XG4gICAgICAvLyB1c2VyIGRpZG4ndCBhdXRob3JpemUgdGhlIGRvbWFpbiwgdGhlcmUgaXMgbm90aGluZyB3ZSBjYW4gZG8gc28gc3RvcC5cbiAgICAgIHRocm93IG5ldyBDYXB0dXJlQXBpRXJyb3IoXCJFeHRlbnNpb24gd2Fzbid0IGdpdmVuIGF1dGhvcml6YXRpb24uXCIsIENhcHR1cmVFcnJvclN0YXR1c0VudW0uVU5BVVRIT1JJWkVEX0VYVEVOU0lPTik7XG4gICAgfSBlbHNlIGlmIChlLmtleSA9PT0gJ2ZpbmdlcnByaW50LnNjYW5uZXIubm90LmZvdW5kJykge1xuICAgICAgLy8gdXNlciBkb2Vzbid0IGhhdmUgYSBzY2FubmVyIGNvbm5lY3RlZCwgdGhlcmUgaXMgbm90aGluZyB3ZSBjYW4gZG8gc28gc3RvcC5cbiAgICAgIHRocm93IG5ldyBDYXB0dXJlQXBpRXJyb3IoXCJDb3VsZG4ndCBmaW5kIGZpbmdlcnByaW50IHNjYW5uZXIuXCIsIENhcHR1cmVFcnJvclN0YXR1c0VudW0uU0NBTk5FUl9OT1RfRk9VTkQpO1xuICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdzaWduZXIubm90Lmluc3RhbGxlZCcpIHtcbiAgICAgIHRocm93IG5ldyBDYXB0dXJlQXBpRXJyb3IoXG4gICAgICAgIFwiVGhlIGV4dGVuc2lvbiBtb2R1bGUgaXNuJ3QgaW5zdGFsbGVkLlwiLFxuICAgICAgICBDYXB0dXJlRXJyb3JTdGF0dXNFbnVtLkVYVEVOU0lPTl9NT0RVTEVfTk9UX0lOU1RBTExFRFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IENhcHR1cmVBcGlFcnJvcignVW5rbm93biBlcnJvciB3aGlsZSBjYXB0dXJpbmcgZmluZ2VycHJpbnQuJywgQ2FwdHVyZUVycm9yU3RhdHVzRW51bS5VTktOT1dOX0VSUk9SKTtcbiAgICB9XG4gIH1cbiAgLy8gaWYgc29tZWhvdyB0aGV5IG1hbmFnZWQgdG8gYXNrIGZvciBjYW5jZWxsYXRpb24gcmlnaHQgYmVmb3JlIHRoZSBzY2FuLCB0aGlzIGNhdGNoZXMgdGhhdFxuICBpZiAoaXNDYW5jZWxsaW5nKCkpIHtcbiAgICBzZXRDYXB0dXJpbmcoZmFsc2UpO1xuICAgIHNldENhbmNlbGxpbmcoZmFsc2UpO1xuICAgIHRocm93IG5ldyBDYXB0dXJlQXBpRXJyb3IoJ1VzZXIgY2FuY2VsbGVkJywgQ2FwdHVyZUVycm9yU3RhdHVzRW51bS5VU0VSX0NBTkNFTExFRCk7XG4gIH1cblxuICAvLyBzZWxlY3QgYW5kIGdldCBmaW5nZXJcbiAgY29uc3QgZmluZ2VyID0gc2VsZWN0RmluZ2VyQXBpKGZpbmdlckluZGV4KTtcbiAgLy8gc2V0IHRoaXMgZmluZ2VycyBhdHRyaWJ1dGVzIHRvIHRoZSByZWNlbnRseSBjb2xsZWN0ZWQgZmluZ2VyXG4gIGZpbmdlci5pbWFnZSA9IGNhcHR1cmU/LmNvbnRlbnQuaW1hZ2U/LmRhdGEgYXMgc3RyaW5nO1xuICBmaW5nZXIuYmFzZTY0V1NRID0gY2FwdHVyZT8uY29udGVudC5maW5nZXJwcmludC5kYXRhIGFzIHN0cmluZztcbiAgZmluZ2VyLm5maXFSYXRpbmcgPSAoY2FwdHVyZT8uY29udGVudC5zY29yZSB8fCAwKSArIDk4O1xuICBmaW5nZXIuc3RhdHVzID0gRmluZ2VyU3RhdHVzLkFWQUlMQUJMRTtcbiAgLy8gR2V0IEFMTCB0aGUgY29sbGVjdGVkIGZpbmdlcnNcbiAgY29uc3QgY29sbGVjdGVkRmluZ2VycyA9IGdldENvbGxlY3RlZEZpbmdlcnMoZ2V0RmluZ2VycygpKTtcblxuICAvLyBzZW5kIHRvIHJlbW90ZVxuICBsZXQgcmVzcG9uc2UsXG4gICAgZXJyb3JUZW1wbGF0ZUV4dHJhY3Rpb24gPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICByZXNwb25zZSA9IGF3YWl0IHZhbGlkYXRlRmluZ2VyQmlvbWV0cmljcyhjb2xsZWN0ZWRGaW5nZXJzLCBmaW5nZXIpO1xuICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgLy8gY2xlYXIgdGhlIGZpbmdlclxuICAgIGZpbmdlci5uZmlxUmF0aW5nID0gLTE7XG4gICAgZmluZ2VyLmJhc2U2NFdTUSA9ICcnO1xuICAgIGZpbmdlci5pbWFnZSA9ICcnO1xuICAgIC8vIHdhcm4gZXJyb3JcbiAgICBjb25zb2xlLmxvZygnY2F1Z2h0IHdoaWxlIHZhbGlkYXRpbmcgZmluZ2VycHJpbnQ6ICcsIGVycm9yKTtcbiAgICAvLyBlcnJvciB3aGlsZSBleHRyYWN0aW5nLCBzaG93IGEgbG93IHF1YWxpdHkgc3dhbFxuICAgIGlmIChpc09iamVjdChlcnJvcikgJiYgJ21lc3NhZ2UnIGluIGVycm9yICYmIGVycm9yLm1lc3NhZ2UgPT09ICdlcnJvci50ZW1wbGF0ZS5leHRyYWN0aW9uJykge1xuICAgICAgZXJyb3JUZW1wbGF0ZUV4dHJhY3Rpb24gPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoZXJyb3IgaW5zdGFuY2VvZiBYTUxIdHRwUmVxdWVzdCkge1xuICAgICAgY29uc3QgZSA9IGVycm9yO1xuICAgICAgaWYgKCdyZXNwb25zZScgaW4gZSAmJiAnZGF0YScgaW4gZS5yZXNwb25zZS5kYXRhICYmIGUucmVzcG9uc2UuZGF0YS5tZXNzYWdlID09PSAnZXJyb3IudGVtcGxhdGUuZXh0cmFjdGlvbicpIHtcbiAgICAgICAgZXJyb3JUZW1wbGF0ZUV4dHJhY3Rpb24gPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBeGlvc0Vycm9yKSB7XG4gICAgICBpZiAoZXJyb3IuY29kZSA9PT0gJ0VDT05OQUJPUlRFRCcpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1RoZSBldmFsdWF0ZSBiaW9tZXRyaWNzIHJlcXVlc3QgdG9vayB0b28gbG9uZyB0byBhbnN3ZXIhJyk7XG4gICAgICAgIHRocm93IG5ldyBDYXB0dXJlQXBpRXJyb3IoXG4gICAgICAgICAgJ0V2YWx1YXRlIGJpb21ldHJpY3MgdG9vayB0b28gbG9uZyB0byByZXBseScsXG4gICAgICAgICAgQ2FwdHVyZUVycm9yU3RhdHVzRW51bS5FVkFMVUFURV9CSU9NRVRSSUNTX1RJTUVPVVRcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGV2YWx1YXRpbmcgYmlvbWV0cmljcyEnLCBlcnJvcik7XG4gICAgICB9XG4gICAgICAvLyB0aGlzIHVwZGF0ZXMgdGhlIHN0YXVzIGluIGNhc2UgdGhlIGZpbmdlciBoYWQgYSBzdGF0dXNcbiAgICAgIHNldEZpbmdlcnMoZ2V0RmluZ2VycygpKTtcbiAgICAgIC8vIG5vIGxvbmdlciBjYXB0dXJpbmdcbiAgICAgIHNldENhcHR1cmluZyhmYWxzZSk7XG4gICAgICB0aHJvdyBuZXcgQ2FwdHVyZUFwaUVycm9yKFxuICAgICAgICAnTmV0d29yayBpc3N1ZSB3aGlsZSB2YWxpZGF0aW5nIGJpb21ldHJpY3MsIGNoZWNrIGxvZ3MnLFxuICAgICAgICBDYXB0dXJlRXJyb3JTdGF0dXNFbnVtLkVWQUxVQVRFX0JJT01FVFJJQ1NfTkVUV09SS19JU1NVRVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdGhpcyBjaGFuZ2VzIHVwZGF0ZXMgdGhlIHN0YXVzIGluIGNhc2UgdGhlIGZpbmdlciBoYWQgYSBzdGF0dXNcbiAgICAgIHNldEZpbmdlcnMoZ2V0RmluZ2VycygpKTtcbiAgICAgIC8vIG5vIGxvbmdlciBjYXB0dXJpbmdcbiAgICAgIHNldENhcHR1cmluZyhmYWxzZSk7XG4gICAgICB0aHJvdyBuZXcgQ2FwdHVyZUFwaUVycm9yKFxuICAgICAgICAnTmV0d29yayBpc3N1ZSB3aGlsZSB2YWxpZGF0aW5nIGJpb21ldHJpY3MsIGNoZWNrIGxvZ3MnLFxuICAgICAgICBDYXB0dXJlRXJyb3JTdGF0dXNFbnVtLkVWQUxVQVRFX0JJT01FVFJJQ1NfTkVUV09SS19JU1NVRVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgbGV0IGlzRmluZ2VyTG93UXVhbGl0eSxcbiAgICBpc0R1cGxpY2F0ZUZpbmdlcixcbiAgICBpc0ZvcmJpZGRlbkZpbmdlcixcbiAgICBpc0FnckZpbmdlckRldGVjdGVkLFxuICAgIGlzQWdyTm90TWF0Y2hlZEZpbmdlcixcbiAgICByZXR1cm5Db2RlID0gaGFuZGxlQ2FwdHVyZVJldHVyblN0YXR1cy5MT1dfUVVBTElUWTtcbiAgaWYgKHJlc3BvbnNlKSB7XG4gICAgLy8gZ2V0IHRoZSBjdXJyZW50IGZpbmdlciBmcm9tIHRoZSByZXR1cm4gbGlzdFxuICAgIGNvbnN0IHZhbGlkYXRlZEZpbmdlciA9IHJlc3BvbnNlLmJvZHlQYXJ0cy5maW5kKFxuICAgICAgKHZhbGlkYXRlZEZpbmdlcikgPT4gdmFsaWRhdGVkRmluZ2VyLmJvZHlQYXJ0ID09PSBmaW5nZXIuYm9keVBhcnRcbiAgICApIGFzIEJvZHlQYXJ0UmV0dXJuVHlwZTtcbiAgICAvLyBzZXQgdGhpcyBmaW5nZXIncyBxdWFsaXR5IGFuZCBpbWFnZVxuICAgIGZpbmdlci5uZmlxUmF0aW5nID0gdmFsaWRhdGVkRmluZ2VyLnF1YWxpdHk7XG4gICAgLy8gY2hlY2sgZm9yIGR1cGxpY2F0ZSBhbmQgbG93IHF1YWxpdHlcbiAgICBpZiAodmFsaWRhdGVkRmluZ2VyLnF1YWxpdHkgPiBnZXRNaW5OZmlxQWNjZXB0YWJsZSgpIHx8IHZhbGlkYXRlZEZpbmdlci5zdGF0dXMgPT09ICdMT1dfUVVBTElUWScpIHtcbiAgICAgIGlzRmluZ2VyTG93UXVhbGl0eSA9IHRydWU7XG4gICAgICByZXR1cm5Db2RlID0gaGFuZGxlQ2FwdHVyZVJldHVyblN0YXR1cy5MT1dfUVVBTElUWTtcbiAgICB9XG4gICAgaWYgKHJlc3BvbnNlLmJvZHlQYXJ0cy5maW5kKCh2YWxpZGF0ZWRGaW5nZXIpID0+IHZhbGlkYXRlZEZpbmdlci5zdGF0dXMgPT09ICdEVVBMSUNBVEUnKSkge1xuICAgICAgaXNEdXBsaWNhdGVGaW5nZXIgPSB0cnVlO1xuICAgICAgcmV0dXJuQ29kZSA9IGhhbmRsZUNhcHR1cmVSZXR1cm5TdGF0dXMuRFVQTElDQVRFO1xuICAgIH1cbiAgICBpZiAocmVzcG9uc2UuYm9keVBhcnRzLmZpbmQoKHZhbGlkYXRlZEZpbmdlcikgPT4gdmFsaWRhdGVkRmluZ2VyLnN0YXR1cyA9PT0gJ0ZPUkJJRERFTicpKSB7XG4gICAgICBpc0ZvcmJpZGRlbkZpbmdlciA9IHRydWU7XG4gICAgICByZXR1cm5Db2RlID0gaGFuZGxlQ2FwdHVyZVJldHVyblN0YXR1cy5GT1JCSURERU47XG4gICAgfVxuICAgIGlmIChyZXNwb25zZS5ib2R5UGFydHMuZmluZCgodmFsaWRhdGVkRmluZ2VyKSA9PiB2YWxpZGF0ZWRGaW5nZXIuc3RhdHVzID09PSAnQUdSJykpIHtcbiAgICAgIGlzQWdyRmluZ2VyRGV0ZWN0ZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuQ29kZSA9IGhhbmRsZUNhcHR1cmVSZXR1cm5TdGF0dXMuQUdSX0RFVEVDVEVEO1xuICAgIH1cbiAgICBpZiAocmVzcG9uc2UuYm9keVBhcnRzLmZpbmQoKHZhbGlkYXRlZEZpbmdlcikgPT4gdmFsaWRhdGVkRmluZ2VyLnN0YXR1cyA9PT0gJ0FHUl9OT1RfTUFUQ0gnKSkge1xuICAgICAgaXNBZ3JOb3RNYXRjaGVkRmluZ2VyID0gdHJ1ZTtcbiAgICAgIHJldHVybkNvZGUgPSBoYW5kbGVDYXB0dXJlUmV0dXJuU3RhdHVzLkFHUl9OT19NQVRDSDtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGlzIGZpbmdlciBpcyBsb3cgcXVhbGl0eSBvciBkdXBsaWNhdGVcbiAgLy8gKGlmIHRoZXJlIGlzIGEgZHVwbGljYXRlLCBpdCBoYXMgdG8gYmUgdGhpcyBmaW5nZXIpXG4gIGlmIChcbiAgICBpc0R1cGxpY2F0ZUZpbmdlciB8fFxuICAgIGlzRmluZ2VyTG93UXVhbGl0eSB8fFxuICAgIGlzRm9yYmlkZGVuRmluZ2VyIHx8XG4gICAgaXNBZ3JOb3RNYXRjaGVkRmluZ2VyIHx8XG4gICAgaXNBZ3JGaW5nZXJEZXRlY3RlZCB8fFxuICAgIGVycm9yVGVtcGxhdGVFeHRyYWN0aW9uXG4gICkge1xuICAgIC8vIGNsZWFyIHRoaXMgZmluZ2VyXG4gICAgZmluZ2VyLm5maXFSYXRpbmcgPSAtMTtcbiAgICBmaW5nZXIuYmFzZTY0V1NRID0gJyc7XG4gICAgZmluZ2VyLmltYWdlID0gJyc7XG4gICAgZmluZ2VyLnN0YXR1cyA9IEZpbmdlclN0YXR1cy5BVkFJTEFCTEU7XG4gICAgLy8gc2V0IHRoZSBhcHByb3ByaWF0ZSBzd2FsIHByZWZpeFxuICAgIGxldCBzd2FsVHJhbnNsYXRlUHJlZml4ID0gJ2JhZEZpbmdlclF1YWxpdHlTd2FsJztcbiAgICBpZiAoaXNEdXBsaWNhdGVGaW5nZXIpIHtcbiAgICAgIHN3YWxUcmFuc2xhdGVQcmVmaXggPSAndW5rbm93bkR1cGxpY2F0ZUZpbmdlclN3YWwnO1xuICAgIH0gZWxzZSBpZiAoaXNGb3JiaWRkZW5GaW5nZXIpIHtcbiAgICAgIHN3YWxUcmFuc2xhdGVQcmVmaXggPSAnZm9yYmlkZGVuRmluZ2VyU3dhbCc7XG4gICAgfSBlbHNlIGlmIChpc0FnckZpbmdlckRldGVjdGVkKSB7XG4gICAgICBzd2FsVHJhbnNsYXRlUHJlZml4ID0gJ2FnckZpbmdlcic7XG4gICAgfSBlbHNlIGlmIChpc0Fnck5vdE1hdGNoZWRGaW5nZXIpIHtcbiAgICAgIHN3YWxUcmFuc2xhdGVQcmVmaXggPSAnYWdyRmluZ2VyTm90TWF0Y2hlZCc7XG4gICAgfVxuICAgIGxldCBodG1sID0gJGZvcm1hdChgJHtzd2FsVHJhbnNsYXRlUHJlZml4fS50ZXh0YCk7XG4gICAgLy8gaWYgd2UgYXJlIHVzaW5nIHdhc20sIHdlIGtub3cgZXhhY3RseSB3aGljaCBmaW5nZXJzIHdlcmUgdGhlIGlzc3VlXG4gICAgaWYgKGdldCh1c2VXYXNtKSAmJiBpc0R1cGxpY2F0ZUZpbmdlcikge1xuICAgICAgc3dhbFRyYW5zbGF0ZVByZWZpeCA9ICdkdXBsaWNhdGVGaW5nZXJTd2FsJztcbiAgICAgIGh0bWwgPSAkZm9ybWF0KGAke3N3YWxUcmFuc2xhdGVQcmVmaXh9LnRleHRgLCB7XG4gICAgICAgIHZhbHVlczoge1xuICAgICAgICAgIGZpbmdlcjE6ICRmb3JtYXQoYCR7c3dhbFRyYW5zbGF0ZVByZWZpeH0uJHsocmVzcG9uc2UgYXMgYW55KS5tYXRjaGluZ0ZpbmdlcnM/LlswXX1gKSxcbiAgICAgICAgICBmaW5nZXIyOiAkZm9ybWF0KGAke3N3YWxUcmFuc2xhdGVQcmVmaXh9LiR7KHJlc3BvbnNlIGFzIGFueSkubWF0Y2hpbmdGaW5nZXJzPy5bMV19YCksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG91dHB1dCA9IGNvbGxlY3RGaW5nZXJzKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZXR1cm5Db2RlLFxuICAgICAgICBib2R5UGFydHM6IG91dHB1dCxcbiAgICAgICAgbWF0Y2hpbmdGaW5nZXJzOiAocmVzcG9uc2UgYXMgYW55KS5tYXRjaGluZ0ZpbmdlcnMgYXMgQm9keVBhcnROYW1lc1tdLFxuICAgICAgICBtZXNzYWdlOiBodG1sLFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3Qgb3V0cHV0ID0gY29sbGVjdEZpbmdlcnMoKTtcbiAgICByZXR1cm4geyByZXR1cm5Db2RlLCBib2R5UGFydHM6IG91dHB1dCwgbWVzc2FnZTogaHRtbCB9O1xuICAgIC8vIC8vIGZpcmUgYSBzd2FsIHRvIHdhcm4gdXNlciBhbmQgZ2V0IGNob2ljZVxuICAgIC8vIGNvbnN0IGNob2ljZSA9IGF3YWl0IG15U3dhbC5maXJlKHtcbiAgICAvLyAgIHRpdGxlOiAkZm9ybWF0KGAke3N3YWxUcmFuc2xhdGVQcmVmaXh9LnRpdGxlYCksXG4gICAgLy8gICBodG1sLFxuICAgIC8vICAgY29uZmlybUJ1dHRvblRleHQ6ICRmb3JtYXQoYCR7c3dhbFRyYW5zbGF0ZVByZWZpeH0ucmV0cnlgKSxcbiAgICAvLyAgIGNhbmNlbEJ1dHRvblRleHQ6ICRmb3JtYXQoYCR7c3dhbFRyYW5zbGF0ZVByZWZpeH0uY2FuY2VsYCksXG4gICAgLy8gICAvLyBpZiB0aGUgZmluZ2VyIGlzIGxvdyBxdWFsaXR5LCBzaG93IGFsc28gZGVueSBidXR0b25cbiAgICAvLyAgIC4uLihpc0Zpbmdlckxvd1F1YWxpdHkgJiYgeyBzaG93RGVueUJ1dHRvbjogdHJ1ZSwgZGVueUJ1dHRvblRleHQ6ICRmb3JtYXQoYCR7c3dhbFRyYW5zbGF0ZVByZWZpeH0uZGVueWApIH0pLFxuICAgIC8vICAgc2hvd0NhbmNlbEJ1dHRvbjogdHJ1ZSxcbiAgICAvLyAgIGljb246ICdlcnJvcicsXG4gICAgLy8gfSk7XG5cbiAgICAvLyBpZiB0aGUgdXNlciBjaG9zZSB0byB0cnkgYW5vdGhlciBmaW5nZXIsIHRoaXMgZmluZ2VyIHdpbGwgYmUgc2V0IGFzIHVuYXZhaWxhYmxlXG4gICAgLy8gaWYgKGNob2ljZS5pc0RlbmllZCkge1xuICAgIC8vICAgdXBkYXRlQ3VycmVudERpc3BsYXkoRmluZ2VyRGlzcGxheUFyZWFUeXBlLnVuY29sbGVjdGVkRmluZ2VyKTtcbiAgICAvLyAgIGF3YWl0IGhhbmRsZU1pc3NpbmdPclVuYXZhaWxhYmxlKEZpbmdlclN0YXR1cy5VTkFWQUlMQUJMRSk7XG4gICAgLy8gICAvLyB0aGlzIGNoYW5nZXMgdXBkYXRlcyB0aGUgc3RhdHVzIGluIGNhc2UgdGhlIGZpbmdlciBoYWQgYSBzdGF0dXNcbiAgICAvLyAgIHNldEZpbmdlcnMoZ2V0RmluZ2VycygpKTtcbiAgICAvLyAgIC8vIG5vIGxvbmdlciBjYXB0dXJpbmdcbiAgICAvLyAgIGlmICghaXNBdXRvbWF0aWMpIHNldENhcHR1cmluZyhmYWxzZSk7XG4gICAgLy8gICByZXR1cm4gaGFuZGxlQ2FwdHVyZVJldHVyblN0YXR1cy5UUllJTkdfT1RIRVJfRklOR0VSO1xuICAgIC8vIH1cbiAgICAvLyAvLyBpZiB0aGUgdXNlciBjYW5jZWxsZWQsIGp1c3QgcmV0dXJuXG4gICAgLy8gaWYgKGNob2ljZS5pc0Rpc21pc3NlZCkge1xuICAgIC8vICAgdXBkYXRlQ3VycmVudERpc3BsYXkoRmluZ2VyRGlzcGxheUFyZWFUeXBlLnVuY29sbGVjdGVkRmluZ2VyKTtcbiAgICAvLyAgIC8vIHRoaXMgY2hhbmdlcyB1cGRhdGVzIHRoZSBzdGF0dXMgaW4gY2FzZSB0aGUgZmluZ2VyIGhhZCBhIHN0YXR1c1xuICAgIC8vICAgc2V0RmluZ2VycyhnZXRGaW5nZXJzKCkpO1xuICAgIC8vICAgLy8gbm8gbG9uZ2VyIGNhcHR1cmluZ1xuICAgIC8vICAgc2V0Q2FwdHVyaW5nKGZhbHNlKTtcbiAgICAvLyAgIHJldHVybiByZXR1cm5Db2RlO1xuICAgIC8vIH1cbiAgICAvLyAvLyBpZiB0aGUgdXNlciB3YW50cyB0byB0cnkgYWdhaW4sIHRoZSBmaW5nZXJzIHdpbGwgZ2V0IHVwZGF0ZWQgb25seSB3aGVuIGEgZ29vZCBmaW5nZXIgaXMgY2FwdHVyZWRcbiAgICAvLyAvLyBvciB3aGVuIHRoZSB1c2VyIGdldHMgdGlyZWQgb2YgdHJ5aW5nXG4gICAgLy8gaWYgKGNob2ljZS5pc0NvbmZpcm1lZCkge1xuICAgIC8vICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlQ2FwdHVyZShpc0F1dG9tYXRpYyk7XG4gICAgLy8gICBpZiAocmVzdWx0ICE9PSBoYW5kbGVDYXB0dXJlUmV0dXJuU3RhdHVzLkNBUFRVUkVEKSB7XG4gICAgLy8gICAgIHJldHVybiByZXN1bHQ7XG4gICAgLy8gICB9XG4gICAgLy8gfVxuICB9XG4gIC8vIHNob3cgdGhlIGNvbGxlY3RlZCBmaW5nZXJcbiAgc2V0RmluZ2VycyhnZXRGaW5nZXJzKCkpO1xuXG4gIHNldENhcHR1cmluZyhmYWxzZSk7XG4gIC8vIHNlbmQgY29sbGVjdGVkIGZpbmdlciBtZXNzYWdlXG4gIG5vdGlmeUZpbmdlckNvbGxlY3RlZCgpO1xuXG4gIHJldHVybiB7IHJldHVybkNvZGU6IGhhbmRsZUNhcHR1cmVSZXR1cm5TdGF0dXMuQ0FQVFVSRUQsIGJvZHlQYXJ0czogY29sbGVjdEZpbmdlcnMoKSB9O1xufVxuXG4vKipcbiAqIFNlbGVjdCBmaW5nZXIgcHJvZ3JhbW1hdGljYWxseSAod2l0aG91dCB1c2VyIGNsaWNrKVxuICovXG5mdW5jdGlvbiBzZWxlY3RGaW5nZXJBcGkoaW5kZXg6IEZpbmdlckluZGV4KTogRmluZ2VyIHtcbiAgLy8gdW5zZWxlY3QgZXZlcnl0aGluZ1xuICBzZWxlY3ROb3RoaW5nKCk7XG4gIGZvciAoY29uc3QgZmluZ2VyIG9mIGdldEZpbmdlcnMoKSkge1xuICAgIGlmIChmaW5nZXIuaW5kZXggPT09IGluZGV4KSB7XG4gICAgICBmaW5nZXIuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIGZpbmdlcjtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBGaW5nZXIgJHtpbmRleH0gbm90IGZvdW5kYCk7XG59XG4iXSwibmFtZXMiOlsiJGZvcm1hdCIsInVud3JhcEZ1bmN0aW9uU3RvcmUiLCJmb3JtYXQiLCJDYXB0dXJlRXJyb3JTdGF0dXNFbnVtIiwiQ2FwdHVyZUFwaUVycm9yIiwibWVzc2FnZSIsInN0YXR1cyIsImNhcHR1cmVTaW5nbGVGaW5nZXIiLCJmaW5nZXJOYW1lT3JJbmRleCIsImdldEZpbmdlcnByaW50UGFyYW1zIiwiZmluZ2VySW5kZXgiLCJub3JtYWxpemVGaW5nZXJOYW1lc0FuZEluZGV4ZXNUb0luZGV4ZXMiLCJleHRlbnNpb24iLCJnZXRFeHRlbnNpb24iLCJpc09iamVjdEVtcHR5Iiwic2V0Q2FwdHVyaW5nIiwiaXNDYW5jZWxsaW5nIiwic2V0Q2FuY2VsbGluZyIsImNhcHR1cmUiLCJlcnIiLCJlIiwiZmluZ2VyIiwic2VsZWN0RmluZ2VyQXBpIiwiRmluZ2VyU3RhdHVzIiwiY29sbGVjdGVkRmluZ2VycyIsImdldENvbGxlY3RlZEZpbmdlcnMiLCJnZXRGaW5nZXJzIiwicmVzcG9uc2UiLCJlcnJvclRlbXBsYXRlRXh0cmFjdGlvbiIsInZhbGlkYXRlRmluZ2VyQmlvbWV0cmljcyIsImVycm9yIiwiaXNPYmplY3QiLCJBeGlvc0Vycm9yIiwic2V0RmluZ2VycyIsImlzRmluZ2VyTG93UXVhbGl0eSIsImlzRHVwbGljYXRlRmluZ2VyIiwiaXNGb3JiaWRkZW5GaW5nZXIiLCJpc0FnckZpbmdlckRldGVjdGVkIiwiaXNBZ3JOb3RNYXRjaGVkRmluZ2VyIiwicmV0dXJuQ29kZSIsImhhbmRsZUNhcHR1cmVSZXR1cm5TdGF0dXMiLCJ2YWxpZGF0ZWRGaW5nZXIiLCJnZXRNaW5OZmlxQWNjZXB0YWJsZSIsInN3YWxUcmFuc2xhdGVQcmVmaXgiLCJodG1sIiwiZ2V0IiwidXNlV2FzbSIsIm91dHB1dCIsImNvbGxlY3RGaW5nZXJzIiwibm90aWZ5RmluZ2VyQ29sbGVjdGVkIiwiaW5kZXgiLCJzZWxlY3ROb3RoaW5nIl0sIm1hcHBpbmdzIjoiO0FBK0JBLE1BQU1BLElBQVVDLEVBQW9CQyxDQUFNO0FBSXhCLElBQUFDLHNCQUFBQSxPQUNoQkEsRUFBQSxvQkFBb0IscUJBQ3BCQSxFQUFBLGlCQUFpQixrQkFDakJBLEVBQUEseUJBQXlCLDBCQUN6QkEsRUFBQSxvQkFBb0IscUJBQ3BCQSxFQUFBLGlDQUFpQyxrQ0FDakNBLEVBQUEscUJBQXFCLHNCQUNyQkEsRUFBQSxnQkFBZ0IsaUJBQ2hCQSxFQUFBLDhCQUE4QiwrQkFDOUJBLEVBQUEsb0NBQW9DLHFDQVRwQkEsSUFBQUEsS0FBQSxDQUFBLENBQUE7QUFZWCxNQUFNQyxVQUF3QixNQUFNO0FBQUEsRUFDekMsWUFBWUMsR0FBd0JDLEdBQWdDO0FBQ2xFLFVBQU1ELENBQU8sR0FEcUIsS0FBQSxTQUFBQztBQUFBLEVBRXBDO0FBQ0Y7QUFLQSxlQUFlQyxFQUNiQyxHQUNBQyxHQU1DO0FBQ0QsUUFBTUMsSUFBY0MsRUFBd0MsQ0FBQ0gsQ0FBaUIsQ0FBQyxFQUFFLENBQUMsR0FFNUVJLElBQVlDO0FBRWQsTUFBQUMsRUFBY0YsQ0FBUztBQUN6QixVQUFNLElBQUlSO0FBQUEsTUFDUix3R0FBd0dRO0FBQUEsTUFDeEc7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