typekro 0.38.1 → 0.38.2
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/dist/.tsbuildinfo +1 -1
- package/dist/factories/clickstack/hyperdx-oidc/index.d.ts +8 -0
- package/dist/factories/clickstack/hyperdx-oidc/index.d.ts.map +1 -1
- package/dist/factories/clickstack/hyperdx-oidc/index.js +13 -0
- package/dist/factories/clickstack/hyperdx-oidc/index.js.map +1 -1
- package/dist/factories/clickstack/hyperdx-oidc/plugin-bundle.generated.d.ts.map +1 -1
- package/dist/factories/clickstack/hyperdx-oidc/plugin-bundle.generated.js +4 -4
- package/dist/factories/clickstack/hyperdx-oidc/plugin-bundle.generated.js.map +1 -1
- package/package.json +1 -1
|
@@ -53,6 +53,13 @@ export interface ClickStackHyperdxOidcOptions {
|
|
|
53
53
|
};
|
|
54
54
|
/** How often the plugin re-reads the configuration, in seconds. Default 15. */
|
|
55
55
|
reloadSeconds?: number;
|
|
56
|
+
/**
|
|
57
|
+
* Where the provider chooser links HyperDX's password form. Default
|
|
58
|
+
* `/login`; set e.g. `/login?password` when a reverse proxy sends a bare
|
|
59
|
+
* `/login` to SSO. The configuration document's `passwordLoginPath`, when
|
|
60
|
+
* set, takes precedence.
|
|
61
|
+
*/
|
|
62
|
+
passwordLoginPath?: string;
|
|
56
63
|
/**
|
|
57
64
|
* The plugin hooks HyperDX internals (its Passport instance, root router and
|
|
58
65
|
* user/team models), so it is enabled only on audited chart versions (see
|
|
@@ -87,6 +94,7 @@ export interface ResolvedClickStackHyperdxOidc {
|
|
|
87
94
|
readonly configSecretName: string;
|
|
88
95
|
readonly configSecretKey: string;
|
|
89
96
|
readonly reloadSeconds: number;
|
|
97
|
+
readonly passwordLoginPath?: string;
|
|
90
98
|
readonly allowUnvalidatedChartVersion: boolean;
|
|
91
99
|
}
|
|
92
100
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/factories/clickstack/hyperdx-oidc/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAEL,yBAAyB,EACzB,0BAA0B,EAC3B,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,CAAC;AAEjE,mDAAmD;AACnD,MAAM,WAAW,4BAA4B;IAC3C;;;;;OAKG;IACH,eAAe,EAAE;QACf,IAAI,EAAE,MAAM,CAAC;QACb,kDAAkD;QAClD,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;IACF,+EAA+E;IAC/E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;;OAMG;IACH,4BAA4B,CAAC,EAAE,OAAO,CAAC;CACxC;AAED,wEAAwE;AACxE,eAAO,MAAM,gDAAgD,oBAAqB,CAAC;AAEnF,gDAAgD;AAChD,eAAO,MAAM,6CAA6C,WAAW,CAAC;AAEtE,wEAAwE;AACxE,eAAO,MAAM,+BAA+B,cAAc,CAAC;AAE3D,oDAAoD;AACpD,eAAO,MAAM,uBAAuB,8BAA8B,CAAC;AACnE,wDAAwD;AACxD,eAAO,MAAM,uBAAuB,8BAA8B,CAAC;AACnE,gDAAgD;AAChD,eAAO,MAAM,wBAAwB,cAAc,CAAC;AACpD,uDAAuD;AACvD,eAAO,MAAM,wBAAwB,gBAAgB,CAAC;AACtD,qEAAqE;AACrE,eAAO,MAAM,0BAA0B,mCAAmC,CAAC;AAC3E,gEAAgE;AAChE,eAAO,MAAM,oCAAoC,aAAa,CAAC;AAE/D,mFAAmF;AACnF,eAAO,MAAM,mCAAmC,0CAA0C,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/factories/clickstack/hyperdx-oidc/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAEL,yBAAyB,EACzB,0BAA0B,EAC3B,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,CAAC;AAEjE,mDAAmD;AACnD,MAAM,WAAW,4BAA4B;IAC3C;;;;;OAKG;IACH,eAAe,EAAE;QACf,IAAI,EAAE,MAAM,CAAC;QACb,kDAAkD;QAClD,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;IACF,+EAA+E;IAC/E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;OAMG;IACH,4BAA4B,CAAC,EAAE,OAAO,CAAC;CACxC;AAED,wEAAwE;AACxE,eAAO,MAAM,gDAAgD,oBAAqB,CAAC;AAEnF,gDAAgD;AAChD,eAAO,MAAM,6CAA6C,WAAW,CAAC;AAEtE,wEAAwE;AACxE,eAAO,MAAM,+BAA+B,cAAc,CAAC;AAE3D,oDAAoD;AACpD,eAAO,MAAM,uBAAuB,8BAA8B,CAAC;AACnE,wDAAwD;AACxD,eAAO,MAAM,uBAAuB,8BAA8B,CAAC;AACnE,gDAAgD;AAChD,eAAO,MAAM,wBAAwB,cAAc,CAAC;AACpD,uDAAuD;AACvD,eAAO,MAAM,wBAAwB,gBAAgB,CAAC;AACtD,qEAAqE;AACrE,eAAO,MAAM,0BAA0B,mCAAmC,CAAC;AAC3E,gEAAgE;AAChE,eAAO,MAAM,oCAAoC,aAAa,CAAC;AAE/D,mFAAmF;AACnF,eAAO,MAAM,mCAAmC,0CAA0C,CAAC;AA0B3F,sDAAsD;AACtD,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,4BAA4B,EAAE,OAAO,CAAC;CAChD;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,4BAA4B,GAAG,SAAS,GAChD,6BAA6B,GAAG,SAAS,CAkC3C;AAED,oEAAoE;AACpE,wBAAgB,4CAA4C,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAErF;AAED,+DAA+D;AAC/D,wBAAgB,8BAA8B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED,mEAAmE;AACnE,wBAAgB,8BAA8B,IAAI;IAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAEvF;AAED,KAAK,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AA4BtC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,IAAI,EAAE,6BAA6B,EACnC,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,IAAI,CAAC,6BAA6B,EAAE,OAAO,GAAG,oBAAoB,GAAG,mBAAmB,CAAC,GACtG,MAAM,CA0FR"}
|
|
@@ -68,6 +68,7 @@ const OWNED_ENV = [
|
|
|
68
68
|
'TYPEKRO_HDX_OIDC_CONFIG',
|
|
69
69
|
'TYPEKRO_HDX_OIDC_RELOAD_SECONDS',
|
|
70
70
|
'TYPEKRO_HDX_OIDC_CREATE_TEAM',
|
|
71
|
+
'TYPEKRO_HDX_OIDC_PASSWORD_LOGIN_PATH',
|
|
71
72
|
'TYPEKRO_HDX_OIDC_BOOTSTRAP_EMAIL',
|
|
72
73
|
'TYPEKRO_HDX_OIDC_BOOTSTRAP_PASSWORD_FILE',
|
|
73
74
|
];
|
|
@@ -75,6 +76,9 @@ const OWNED_ENV = [
|
|
|
75
76
|
const SECRET_NAME = /^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$/;
|
|
76
77
|
/** A Secret data key. */
|
|
77
78
|
const SECRET_KEY = /^[-._a-zA-Z0-9]+$/;
|
|
79
|
+
/** A same-origin path, as the plugin accepts one (see its redirects.ts). */
|
|
80
|
+
// biome-ignore lint/suspicious/noControlCharactersInRegex: control characters are what it refuses
|
|
81
|
+
const SAME_ORIGIN_PATH = /^\/(?!\/)[^\\\x00-\x20\x7f]*$/;
|
|
78
82
|
/**
|
|
79
83
|
* Validate the build option and apply defaults.
|
|
80
84
|
*
|
|
@@ -96,10 +100,16 @@ export function resolveClickStackHyperdxOidc(context, options) {
|
|
|
96
100
|
if (!Number.isInteger(reloadSeconds) || reloadSeconds < 1 || reloadSeconds > 3600) {
|
|
97
101
|
throw new Error(`${context}: hyperdxOidc.reloadSeconds must be an integer between 1 and 3600 (got ${String(reloadSeconds)}).`);
|
|
98
102
|
}
|
|
103
|
+
const passwordLoginPath = options.passwordLoginPath;
|
|
104
|
+
if (passwordLoginPath !== undefined && (typeof passwordLoginPath !== 'string' || !SAME_ORIGIN_PATH.test(passwordLoginPath))) {
|
|
105
|
+
throw new Error(`${context}: hyperdxOidc.passwordLoginPath ${JSON.stringify(passwordLoginPath)} must be a path on ` +
|
|
106
|
+
'HyperDX\'s own origin, starting with a single "/" (no "//", backslash, whitespace or control character).');
|
|
107
|
+
}
|
|
99
108
|
return {
|
|
100
109
|
configSecretName: name,
|
|
101
110
|
configSecretKey: key,
|
|
102
111
|
reloadSeconds,
|
|
112
|
+
...(passwordLoginPath !== undefined && { passwordLoginPath }),
|
|
103
113
|
allowUnvalidatedChartVersion: options.allowUnvalidatedChartVersion === true,
|
|
104
114
|
};
|
|
105
115
|
}
|
|
@@ -176,6 +186,9 @@ export function applyHyperdxOidcValues(context, values, oidc, releaseName, initi
|
|
|
176
186
|
{ name: 'TYPEKRO_HDX_OIDC_CONFIG', value: `${HYPERDX_OIDC_CONFIG_DIR}/${HYPERDX_OIDC_CONFIG_FILE}` },
|
|
177
187
|
{ name: 'TYPEKRO_HDX_OIDC_RELOAD_SECONDS', value: String(oidc.reloadSeconds) },
|
|
178
188
|
{ name: 'TYPEKRO_HDX_OIDC_CREATE_TEAM', value: String(initialUser === undefined) },
|
|
189
|
+
...(oidc.passwordLoginPath === undefined
|
|
190
|
+
? []
|
|
191
|
+
: [{ name: 'TYPEKRO_HDX_OIDC_PASSWORD_LOGIN_PATH', value: oidc.passwordLoginPath }]),
|
|
179
192
|
...(initialUser === undefined
|
|
180
193
|
? []
|
|
181
194
|
: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/factories/clickstack/hyperdx-oidc/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAGH,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,EACzB,0BAA0B,GAC3B,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/factories/clickstack/hyperdx-oidc/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAGH,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,EACzB,0BAA0B,GAC3B,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,CAAC;AAkCjE,wEAAwE;AACxE,MAAM,CAAC,MAAM,gDAAgD,GAAG,CAAC,OAAO,CAAU,CAAC;AAEnF,gDAAgD;AAChD,MAAM,CAAC,MAAM,6CAA6C,GAAG,QAAQ,CAAC;AAEtE,wEAAwE;AACxE,MAAM,CAAC,MAAM,+BAA+B,GAAG,WAAW,CAAC;AAE3D,oDAAoD;AACpD,MAAM,CAAC,MAAM,uBAAuB,GAAG,2BAA2B,CAAC;AACnE,wDAAwD;AACxD,MAAM,CAAC,MAAM,uBAAuB,GAAG,2BAA2B,CAAC;AACnE,gDAAgD;AAChD,MAAM,CAAC,MAAM,wBAAwB,GAAG,WAAW,CAAC;AACpD,uDAAuD;AACvD,MAAM,CAAC,MAAM,wBAAwB,GAAG,aAAa,CAAC;AACtD,qEAAqE;AACrE,MAAM,CAAC,MAAM,0BAA0B,GAAG,gCAAgC,CAAC;AAC3E,gEAAgE;AAChE,MAAM,CAAC,MAAM,oCAAoC,GAAG,UAAU,CAAC;AAE/D,mFAAmF;AACnF,MAAM,CAAC,MAAM,mCAAmC,GAAG,uCAAuC,CAAC;AAE3F,MAAM,aAAa,GAAG,6BAA6B,CAAC;AACpD,MAAM,aAAa,GAAG,6BAA6B,CAAC;AACpD,MAAM,gBAAgB,GAAG,gCAAgC,CAAC;AAC1D,8FAA8F;AAC9F,MAAM,aAAa,GAAG,CAAC,aAAa,EAAE,aAAa,EAAE,gBAAgB,CAAU,CAAC;AAChF,iFAAiF;AACjF,MAAM,SAAS,GAAG;IAChB,cAAc;IACd,yBAAyB;IACzB,iCAAiC;IACjC,8BAA8B;IAC9B,sCAAsC;IACtC,kCAAkC;IAClC,0CAA0C;CAClC,CAAC;AAEX,2CAA2C;AAC3C,MAAM,WAAW,GAAG,mEAAmE,CAAC;AACxF,yBAAyB;AACzB,MAAM,UAAU,GAAG,mBAAmB,CAAC;AACvC,4EAA4E;AAC5E,kGAAkG;AAClG,MAAM,gBAAgB,GAAG,+BAA+B,CAAC;AAWzD;;;;;GAKG;AACH,MAAM,UAAU,4BAA4B,CAC1C,OAAe,EACf,OAAiD;IAEjD,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC;IAC3C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7E,MAAM,IAAI,KAAK,CACb,GAAG,OAAO,sCAAsC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,8BAA8B,CACnG,CAAC;IACJ,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI,+BAA+B,CAAC;IAC3E,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACzE,MAAM,IAAI,KAAK,CACb,GAAG,OAAO,qCAAqC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,6BAA6B,CAChG,CAAC;IACJ,CAAC;IACD,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;IAClD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,aAAa,GAAG,CAAC,IAAI,aAAa,GAAG,IAAI,EAAE,CAAC;QAClF,MAAM,IAAI,KAAK,CACb,GAAG,OAAO,0EAA0E,MAAM,CAAC,aAAa,CAAC,IAAI,CAC9G,CAAC;IACJ,CAAC;IACD,MAAM,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IACpD,IAAI,iBAAiB,KAAK,SAAS,IAAI,CAAC,OAAO,iBAAiB,KAAK,QAAQ,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC;QAC5H,MAAM,IAAI,KAAK,CACb,GAAG,OAAO,mCAAmC,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,qBAAqB;YACjG,0GAA0G,CAC7G,CAAC;IACJ,CAAC;IACD,OAAO;QACL,gBAAgB,EAAE,IAAI;QACtB,eAAe,EAAE,GAAG;QACpB,aAAa;QACb,GAAG,CAAC,iBAAiB,KAAK,SAAS,IAAI,EAAE,iBAAiB,EAAE,CAAC;QAC7D,4BAA4B,EAAE,OAAO,CAAC,4BAA4B,KAAK,IAAI;KAC5E,CAAC;AACJ,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,4CAA4C,CAAC,OAAe;IAC1E,OAAQ,gDAAsE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACnG,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,8BAA8B,CAAC,WAAmB;IAChE,OAAO,GAAG,WAAW,sBAAsB,CAAC;AAC9C,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,8BAA8B;IAC5C,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,wBAAwB,CAAC,EAAE,0BAA0B,EAAE,EAAE,CAAC;AACpF,CAAC;AAID,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc,EAAE,GAAW,EAAE,IAAY;IACzD,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAW,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;QACtB,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,UAAU,IAAI,gDAAgD,CAAC,CAAC;IACzG,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,MAAM,CAAC,MAAc,EAAE,GAAW,EAAE,IAAY;IACvD,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACtC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,UAAU,IAAI,6CAA6C,CAAC,CAAC;IAC3G,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,OAAO,CAAC,IAAe;IAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACtG,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAAe,EACf,MAA0B,EAC1B,IAAmC,EACnC,WAAmB,EACnB,WAAuG;IAEvG,MAAM,MAAM,GAAW,eAAe,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IACrD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QACvD,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,EAAE,YAAY,EAAE,oBAAoB,CAAC,CAAC;QAEzE,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,wBAAwB,CAAC,CAAC;QAChE,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAE,SAA+B,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QACnG,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CACb,8CAA8C,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAC/F,CAAC;QACJ,CAAC;QACD,UAAU,CAAC,GAAG,GAAG;YACf,GAAG,GAAG;YACN,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,aAAa,uBAAuB,IAAI,wBAAwB,EAAE,EAAE;YACnG,EAAE,IAAI,EAAE,yBAAyB,EAAE,KAAK,EAAE,GAAG,uBAAuB,IAAI,wBAAwB,EAAE,EAAE;YACpG,EAAE,IAAI,EAAE,iCAAiC,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;YAC9E,EAAE,IAAI,EAAE,8BAA8B,EAAE,KAAK,EAAE,MAAM,CAAC,WAAW,KAAK,SAAS,CAAC,EAAE;YAClF,GAAG,CAAC,IAAI,CAAC,iBAAiB,KAAK,SAAS;gBACtC,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,sCAAsC,EAAE,KAAK,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC;YACtF,GAAG,CAAC,WAAW,KAAK,SAAS;gBAC3B,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC;oBACE,EAAE,IAAI,EAAE,kCAAkC,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE;oBACtE;wBACE,IAAI,EAAE,0CAA0C;wBAChD,KAAK,EAAE,GAAG,0BAA0B,IAAI,oCAAoC,EAAE;qBAC/E;iBACF,CAAC;SACP,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,SAAS,EAAE,4BAA4B,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,EAAE,cAAc,EAAE,iCAAiC,CAAC,CAAC;QACrF,MAAM,eAAe,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAC/E,aAAmC,CAAC,QAAQ,CAAC,IAAI,CAAC,CACpD,CAAC;QACF,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,yDAAyD,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzG,CAAC;QACD,UAAU,CAAC,OAAO,GAAG;YACnB,GAAG,OAAO;YACV,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,8BAA8B,CAAC,WAAW,CAAC,EAAE,EAAE;YACzF;gBACE,IAAI,EAAE,aAAa;gBACnB,MAAM,EAAE;oBACN,UAAU,EAAE,IAAI,CAAC,gBAAgB;oBACjC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC;iBACvE;aACF;YACD,GAAG,CAAC,WAAW,KAAK,SAAS;gBAC3B,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC;oBACE;wBACE,IAAI,EAAE,gBAAgB;wBACtB,MAAM,EAAE;4BACN,yDAAyD;4BACzD,UAAU,EAAE,WAAW,CAAC,kBAAkB;4BAC1C,4DAA4D;4BAC5D,6DAA6D;4BAC7D,wDAAwD;4BACxD,2DAA2D;4BAC3D,oBAAoB;4BACpB,QAAQ,EAAE,IAAI;4BACd,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,iBAAiB,EAAE,IAAI,EAAE,oCAAoC,EAAE,CAAC;yBAC5F;qBACF;iBACF,CAAC;SACP,CAAC;QACF,UAAU,CAAC,YAAY,GAAG;YACxB,GAAG,MAAM;YACT,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,uBAAuB,EAAE,QAAQ,EAAE,IAAI,EAAE;YAC3E,wEAAwE;YACxE,iCAAiC;YACjC,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,uBAAuB,EAAE,QAAQ,EAAE,IAAI,EAAE;YAC3E,gEAAgE;YAChE,wEAAwE;YACxE,sCAAsC;YACtC,GAAG,CAAC,WAAW,KAAK,SAAS;gBAC3B,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,0BAA0B,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;SACzF,CAAC;QAEF,MAAM,WAAW,GAAG,QAAQ,CAAC,UAAU,EAAE,gBAAgB,EAAE,mCAAmC,CAAC,CAAC;QAChG,WAAW,CAAC,mCAAmC,CAAC,GAAG,0BAA0B,CAAC;IAChF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,KAAM,KAAe,CAAC,OAAO,GAAG,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-bundle.generated.d.ts","sourceRoot":"","sources":["../../../../src/factories/clickstack/hyperdx-oidc/plugin-bundle.generated.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,eAAO,MAAM,0BAA0B,EAAE,
|
|
1
|
+
{"version":3,"file":"plugin-bundle.generated.d.ts","sourceRoot":"","sources":["../../../../src/factories/clickstack/hyperdx-oidc/plugin-bundle.generated.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,eAAO,MAAM,0BAA0B,EAAE,MAC2uzE,CAAC;AAErxzE,uEAAuE;AACvE,eAAO,MAAM,0BAA0B,EAAE,MAA2E,CAAC;AAErH,2CAA2C;AAC3C,eAAO,MAAM,yBAAyB,EAAE,MAAc,CAAC;AAEvD,+FAA+F;AAC/F,eAAO,MAAM,iCAAiC,EAAE,MAA2E,CAAC"}
|
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
* The bundled HyperDX OIDC plugin (CommonJS), base64-encoded. Typed `string`
|
|
5
5
|
* on purpose: a literal type would copy the whole bundle into the `.d.ts`.
|
|
6
6
|
*/
|
|
7
|
-
export const HYPERDX_OIDC_PLUGIN_BASE64 = 'LyohIFR5cGVLcm8gSHlwZXJEWCBPSURDIHBsdWdpbiDigJQgaHR0cHM6Ly9naXRodWIuY29tL3llaHVkYWNvaGVuL3R5cGVrcm8gKEFwYWNoZS0yLjApCiAqIEJ1bmRsZXMgb2F1dGg0d2ViYXBpIChodHRwczovL2dpdGh1Yi5jb20vcGFudmEvb2F1dGg0d2ViYXBpKToKICogVGhlIE1JVCBMaWNlbnNlIChNSVQpCiAqIAogKiBDb3B5cmlnaHQgKGMpIDIwMjIgRmlsaXAgU2tva2FuCiAqIAogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAogKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICogCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAogKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgogKiAKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQogKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCiAqIFNPRlRXQVJFLgogKi8KdmFyIG9YPU9iamVjdC5jcmVhdGU7dmFye2dldFByb3RvdHlwZU9mOnRYLGRlZmluZVByb3BlcnR5OnUxLGdldE93blByb3BlcnR5TmFtZXM6c1h9PU9iamVjdDt2YXIgclg9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBlWChYKXtyZXR1cm4gdGhpc1tYXX12YXIgWCQsJCQsUSQ9KFgsJCxRKT0+e3ZhciBaPVghPW51bGwmJnR5cGVvZiBYPT09Im9iamVjdCI7aWYoWil7dmFyIEg9JD9YJD8/PW5ldyBXZWFrTWFwOiQkPz89bmV3IFdlYWtNYXAsSj1ILmdldChYKTtpZihKKXJldHVybiBKfVE9WCE9bnVsbD9vWCh0WChYKSk6e307bGV0IHo9JHx8IVh8fCFYLl9fZXNNb2R1bGU/dTEoUSwiZGVmYXVsdCIse3ZhbHVlOlgsZW51bWVyYWJsZTohMH0pOlE7Zm9yKGxldCBZIG9mIHNYKFgpKWlmKCFyWC5jYWxsKHosWSkpdTEoeixZLHtnZXQ6ZVguYmluZChYLFkpLGVudW1lcmFibGU6ITB9KTtpZihaKUguc2V0KFgseik7cmV0dXJuIHp9O3ZhciB1WD1yZXF1aXJlKCJub2RlOmZzIiksZFg9USQocmVxdWlyZSgibm9kZTptb2R1bGUiKSksTTE9cmVxdWlyZSgibm9kZTpwYXRoIik7dmFyIHQ9cmVxdWlyZSgibm9kZTpjcnlwdG8iKSxkMT1yZXF1aXJlKCJub2RlOmZzIiksWiQ9IlRZUEVLUk9fSERYX09JRENfQk9PVFNUUkFQX0VNQUlMIixIJD0iVFlQRUtST19IRFhfT0lEQ19CT09UU1RSQVBfUEFTU1dPUkRfRklMRSI7ZnVuY3Rpb24gYzEoWCl7bGV0ICQ9WFtaJF0/LnRyaW0oKT8/IiIsUT1YW0gkXT8udHJpbSgpPz8iIjtpZigkLmxlbmd0aD09PTB8fFEubGVuZ3RoPT09MClyZXR1cm47cmV0dXJue2VtYWlsOiQscGFzc3dvcmRGaWxlOlF9fWZ1bmN0aW9uIFUxKFgpe2xldCAkO3RyeXskPWQxLnJlYWRGaWxlU3luYyhYLCJ1dGY4Iil9Y2F0Y2h7cmV0dXJufXJldHVybiAkLmxlbmd0aD09PTA/dm9pZCAwOiR9ZnVuY3Rpb24gTjEoWCl7cmV0dXJuIFgudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cLyskLywiIil9ZnVuY3Rpb24geiQoWCwkKXtsZXQgUT0oWik9PnQuY3JlYXRlSGFzaCgic2hhMjU2IikudXBkYXRlKFosInV0ZjgiKS5kaWdlc3QoKTtyZXR1cm4gdC50aW1pbmdTYWZlRXF1YWwoUShYKSxRKCQpKX1mdW5jdGlvbiBXJChYLCQsUT1VMSl7aWYodHlwZW9mIFghPT0ib2JqZWN0Inx8WD09PW51bGwpcmV0dXJuITE7bGV0e2VtYWlsOloscGFzc3dvcmQ6SH09WDtpZih0eXBlb2YgWiE9PSJzdHJpbmcifHx0eXBlb2YgSCE9PSJzdHJpbmciKXJldHVybiExO2xldCBKPVEoJC5wYXNzd29yZEZpbGUpO2lmKEo9PT12b2lkIDApcmV0dXJuITE7bGV0IHo9eiQoSCxKKTtyZXR1cm4gWi50b0xvd2VyQ2FzZSgpPT09JC5lbWFpbC50b0xvd2VyQ2FzZSgpJiZ6fWFzeW5jIGZ1bmN0aW9uIGwxKFgsJCxRKXtsZXQgWj0kLmJvb3RzdHJhcDtpZigkLmNyZWF0ZVRlYW18fFo9PT12b2lkIDApcmV0dXJuITE7aWYoWC5tZXRob2QhPT0iUE9TVCJ8fE4xKFgucGF0aCkhPT0iL3JlZ2lzdGVyL3Bhc3N3b3JkIilyZXR1cm4hMTtpZihhd2FpdCBRLnRlYW1FeGlzdHMoKSlyZXR1cm4hMTtyZXR1cm4gVyQoWC5ib2R5LFosUS5yZWFkUGFzc3dvcmQpfXZhciBqWD1yZXF1aXJlKCJub2RlOmNyeXB0byIpLHlYPXJlcXVpcmUoIm5vZGU6ZnMiKSx3WD1yZXF1aXJlKCJub2RlOm1vZHVsZSIpLGdYPXJlcXVpcmUoIm5vZGU6cGF0aCIpO2NsYXNzIFMgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihYKXtzdXBlcihYKTt0aGlzLm5hbWU9Ik9pZGNDb25maWdFcnJvciJ9fXZhciBKJD0vXlthLXowLTldW2EtejAtOS1dezAsNjJ9JC8sWSQ9L14oXGQrKVxzKihtc3xzfG18aHxkKSQvLEIkPXttczoxLHM6MTAwMCxtOjYwMDAwLGg6MzYwMDAwMCxkOjg2NDAwMDAwfTtmdW5jdGlvbiBEJChYLCQpe2lmKHR5cGVvZiBYPT09Im51bWJlciImJk51bWJlci5pc0Zpbml0ZShYKSYmWD49MClyZXR1cm4gWCoxMDAwO2lmKHR5cGVvZiBYPT09InN0cmluZyIpe2xldCBRPVkkLmV4ZWMoWC50cmltKCkpO2lmKFEpcmV0dXJuIE51bWJlcihRWzFdKSpCJFtRWzJdXX10aHJvdyBuZXcgUyhgJHskfSBtdXN0IGJlIGEgZHVyYXRpb24gbGlrZSAiMTJoIiwgIjMwbSIgb3IgIjdkIiwgb3IgYSBudW1iZXIgb2Ygc2Vjb25kcyAoZ290ICR7SlNPTi5zdHJpbmdpZnkoWCl9KWApfWZ1bmN0aW9uIHMoWCl7cmV0dXJuIHR5cGVvZiBYPT09Im9iamVjdCImJlghPT1udWxsJiYhQXJyYXkuaXNBcnJheShYKX1mdW5jdGlvbiBtKFgsJCxRKXtsZXQgWj1YWyRdO2lmKHR5cGVvZiBaIT09InN0cmluZyJ8fFoudHJpbSgpLmxlbmd0aD09PTApdGhyb3cgbmV3IFMoYCR7UX0uJHskfSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZ2ApO3JldHVybiBafWZ1bmN0aW9uIGkoWCwkLFEsWil7bGV0IEg9WFskXTtpZihIPT09dm9pZCAwKXJldHVybiBaO2lmKHR5cGVvZiBIIT09InN0cmluZyJ8fEgudHJpbSgpLmxlbmd0aD09PTApdGhyb3cgbmV3IFMoYCR7UX0uJHskfSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZyB3aGVuIHNldGApO3JldHVybiBIfWZ1bmN0aW9uIG4oWCwkLFEsWil7bGV0IEg9WFskXTtpZihIPT09dm9pZCAwKXJldHVybiBaO2lmKHR5cGVvZiBIIT09ImJvb2xlYW4iKXRocm93IG5ldyBTKGAke1F9LiR7JH0gbXVzdCBiZSBhIGJvb2xlYW5gKTtyZXR1cm4gSH1mdW5jdGlvbiBQMShYLCQpe2lmKFg9PT12b2lkIDApcmV0dXJuW107aWYoIUFycmF5LmlzQXJyYXkoWCl8fFguc29tZSgoUSk9PnR5cGVvZiBRIT09InN0cmluZyJ8fFEubGVuZ3RoPT09MCkpdGhyb3cgbmV3IFMoYCR7JH0gbXVzdCBiZSBhbiBhcnJheSBvZiBub24tZW1wdHkgc3RyaW5nc2ApO3JldHVybiBYfWZ1bmN0aW9uIHIoWCwkLFEpe2xldCBaPU9iamVjdC5rZXlzKFgpLmZpbHRlcigoSCk9PiEkLmluY2x1ZGVzKEgpKTtpZihaLmxlbmd0aD4wKXRocm93IG5ldyBTKGAke1F9IGhhcyB1bmtub3duIGtleShzKSAke1oubWFwKChIKT0+SlNPTi5zdHJpbmdpZnkoSCkpLmpvaW4oIiwgIil9OyBhbGxvd2VkOiAkeyQuam9pbigiLCAiKX1gKX1mdW5jdGlvbiBwMShYLCQsUSl7bGV0IFo7dHJ5e1o9bmV3IFVSTChYKX1jYXRjaHt0aHJvdyBuZXcgUyhgJHskfSBtdXN0IGJlIGFuIGFic29sdXRlIFVSTCAoZ290ICR7SlNPTi5zdHJpbmdpZnkoWCl9KWApfWlmKFoucHJvdG9jb2whPT0iaHR0cHM6IiYmIShRJiZaLnByb3RvY29sPT09Imh0dHA6IikpdGhyb3cgbmV3IFMoYCR7JH0gbXVzdCB1c2UgaHR0cHMgKGdvdCAke0pTT04uc3RyaW5naWZ5KFgpfSlgKTtyZXR1cm4gWC5yZXBsYWNlKC9cLyskLywiIil9dmFyIEckPVsiaWQiLCJkaXNwbGF5TmFtZSIsImlzc3VlciIsImNsaWVudElkIiwiY2xpZW50U2VjcmV0IiwidG9rZW5FbmRwb2ludEF1dGhNZXRob2QiLCJzY29wZXMiLCJjbGFpbXMiLCJhbGxvdyIsInJlcXVpcmVWZXJpZmllZEVtYWlsIiwibGlua0V4aXN0aW5nVXNlcnNCeUVtYWlsIiwiY3JlYXRlVXNlcnMiXTtmdW5jdGlvbiBLJChYLCQsUSl7bGV0IFo9YHByb3ZpZGVyc1skeyR9XWA7aWYoIXMoWCkpdGhyb3cgbmV3IFMoYCR7Wn0gbXVzdCBiZSBhbiBvYmplY3RgKTtyKFgsRyQsWik7bGV0IEg9bShYLCJpZCIsWik7aWYoIUokLnRlc3QoSCkpdGhyb3cgbmV3IFMoYCR7Wn0uaWQgbXVzdCBiZSBsb3dlcmNhc2UgbGV0dGVycywgZGlnaXRzIGFuZCBkYXNoZXMsIHN0YXJ0aW5nIHdpdGggYSBsZXR0ZXIgb3IgZGlnaXQgKGdvdCAke0pTT04uc3RyaW5naWZ5KEgpfSlgKTtsZXQgSj1YLnRva2VuRW5kcG9pbnRBdXRoTWV0aG9kPz8iY2xpZW50X3NlY3JldF9iYXNpYyI7aWYoSiE9PSJjbGllbnRfc2VjcmV0X2Jhc2ljIiYmSiE9PSJjbGllbnRfc2VjcmV0X3Bvc3QiKXRocm93IG5ldyBTKGAke1p9LnRva2VuRW5kcG9pbnRBdXRoTWV0aG9kIG11c3QgYmUgImNsaWVudF9zZWNyZXRfYmFzaWMiIG9yICJjbGllbnRfc2VjcmV0X3Bvc3QiYCk7bGV0IHo9WC5zY29wZXM9PT12b2lkIDA/WyJvcGVuaWQiLCJlbWFpbCIsInByb2ZpbGUiXTpQMShYLnNjb3BlcyxgJHtafS5zY29wZXNgKTtpZighei5pbmNsdWRlcygib3BlbmlkIikpdGhyb3cgbmV3IFMoYCR7Wn0uc2NvcGVzIG11c3QgaW5jbHVkZSAib3BlbmlkImApO2xldCBZPVguY2xhaW1zPz97fTtpZighcyhZKSl0aHJvdyBuZXcgUyhgJHtafS5jbGFpbXMgbXVzdCBiZSBhbiBvYmplY3RgKTtyKFksWyJlbWFpbCIsImdyb3VwcyIsIm5hbWUiXSxgJHtafS5jbGFpbXNgKTtsZXQgQj17ZW1haWw6aShZLCJlbWFpbCIsYCR7Wn0uY2xhaW1zYCwiZW1haWwiKSxncm91cHM6aShZLCJncm91cHMiLGAke1p9LmNsYWltc2AsImdyb3VwcyIpLG5hbWU6aShZLCJuYW1lIixgJHtafS5jbGFpbXNgLCJuYW1lIil9O2lmKCFzKFguYWxsb3cpKXRocm93IG5ldyBTKGAke1p9LmFsbG93IGlzIHJlcXVpcmVkOiBzZXQgYWxsb3cuZ3JvdXBzIGFuZC9vciBhbGxvdy5lbWFpbERvbWFpbnMuIFdpdGhvdXQgYSBydWxlLCBldmVyeSBhY2NvdW50IHRoZSBwcm92aWRlciBjYW4gYXV0aGVudGljYXRlIHdvdWxkIGdldCBpbnRvIEh5cGVyRFguYCk7cihYLmFsbG93LFsiZ3JvdXBzIiwiZW1haWxEb21haW5zIl0sYCR7Wn0uYWxsb3dgKTtsZXQgVz17Z3JvdXBzOlAxKFguYWxsb3cuZ3JvdXBzLGAke1p9LmFsbG93Lmdyb3Vwc2ApLGVtYWlsRG9tYWluczpQMShYLmFsbG93LmVtYWlsRG9tYWlucyxgJHtafS5hbGxvdy5lbWFpbERvbWFpbnNgKS5tYXAoKE4pPT5OLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXkAvLCIiKSl9O2lmKFcuZ3JvdXBzLmxlbmd0aD09PTAmJlcuZW1haWxEb21haW5zLmxlbmd0aD09PTApdGhyb3cgbmV3IFMoYCR7Wn0uYWxsb3cgbXVzdCBzZXQgYXQgbGVhc3Qgb25lIG9mIGdyb3VwcyBvciBlbWFpbERvbWFpbnM7IGFuIGVtcHR5IHJ1bGUgd291bGQgYWRtaXQgZXZlcnkgYWNjb3VudCB0aGUgcHJvdmlkZXIgY2FuIGF1dGhlbnRpY2F0ZS5gKTtsZXQgSz1uKFgsInJlcXVpcmVWZXJpZmllZEVtYWlsIixaLCEwKSxMPW4oWCwibGlua0V4aXN0aW5nVXNlcnNCeUVtYWlsIixaLEspO2lmKEwmJiFLKXRocm93IG5ldyBTKGAke1p9LmxpbmtFeGlzdGluZ1VzZXJzQnlFbWFpbCBjYW5ub3QgYmUgdHJ1ZSB3aGVuIHJlcXVpcmVWZXJpZmllZEVtYWlsIGlzIGZhbHNlOiBhbiB1bnZlcmlmaWVkIGVtYWlsIGlzIG9ubHkgYSBjbGFpbSwgc28gbGlua2luZyBieSBpdCB3b3VsZCBsZXQgYW55b25lIHdobyBjYW4gc2V0IHRoZWlyIGVtYWlsIGF0IHRoZSBwcm92aWRlciB0YWtlIG92ZXIgdGhlIEh5cGVyRFggYWNjb3VudCB0aGF0IGhhcyBpdC5gKTtyZXR1cm57aWQ6SCxkaXNwbGF5TmFtZTppKFgsImRpc3BsYXlOYW1lIixaLEgpLGlzc3VlcjpwMShtKFgsImlzc3VlciIsWiksYCR7Wn0uaXNzdWVyYCxRKSxjbGllbnRJZDptKFgsImNsaWVudElkIixaKSxjbGllbnRTZWNyZXQ6bShYLCJjbGllbnRTZWNyZXQiLFopLHRva2VuRW5kcG9pbnRBdXRoTWV0aG9kOkosc2NvcGVzOnosY2xhaW1zOkIsYWxsb3c6VyxyZXF1aXJlVmVyaWZpZWRFbWFpbDpLLGxpbmtFeGlzdGluZ1VzZXJzQnlFbWFpbDpMLGNyZWF0ZVVzZXJzOm4oWCwiY3JlYXRlVXNlcnMiLFosITApfX1mdW5jdGlvbiBGJChYLCQpe2xldCBRPW0oWCwicmVkaXJlY3RCYXNlVXJsIiwiY29uZmlndXJhdGlvbiIpO3AxKFEsImNvbmZpZ3VyYXRpb24ucmVkaXJlY3RCYXNlVXJsIiwkKTtsZXQgWj1uZXcgVVJMKFEpO2lmKFoudXNlcm5hbWUhPT0iInx8Wi5wYXNzd29yZCE9PSIifHxRLmluY2x1ZGVzKCI/Iil8fFEuaW5jbHVkZXMoIiMiKSl0aHJvdyBuZXcgUygiY29uZmlndXJhdGlvbi5yZWRpcmVjdEJhc2VVcmwgbXVzdCBub3QgY29udGFpbiBjcmVkZW50aWFscywgYSBxdWVyeSBvciBhIGZyYWdtZW50Iik7cmV0dXJuYCR7Wi5vcmlnaW59JHtaLnBhdGhuYW1lLnJlcGxhY2UoL1wvKyQvLCIiKX1gfXZhciBWJD1bInByb3ZpZGVycyIsInBhc3N3b3JkTG9naW4iLCJtYXhTZXNzaW9uQWdlIiwicmVkaXJlY3RCYXNlVXJsIiwiYXBpUGF0aFByZWZpeCIsInRlYW1JZCIsImFsbG93SW5zZWN1cmVIdHRwIl07ZnVuY3Rpb24gYjEoWCl7bGV0ICQ7dHJ5eyQ9SlNPTi5wYXJzZShYKX1jYXRjaChCKXtsZXQgVz0vcG9zaXRpb24gKFxkKykvLmV4ZWMoQi5tZXNzYWdlKT8uWzFdO3Rocm93IG5ldyBTKGBjb25maWd1cmF0aW9uIGlzIG5vdCB2YWxpZCBKU09OJHtXPT09dm9pZCAwPyIiOmAgKG5lYXIgY2hhcmFjdGVyICR7V30pYH1gKX1pZighcygkKSl0aHJvdyBuZXcgUygiY29uZmlndXJhdGlvbiBtdXN0IGJlIGEgSlNPTiBvYmplY3QiKTtyKCQsViQsImNvbmZpZ3VyYXRpb24iKTtsZXQgUT1uKCQsImFsbG93SW5zZWN1cmVIdHRwIiwiY29uZmlndXJhdGlvbiIsITEpO2lmKCFBcnJheS5pc0FycmF5KCQucHJvdmlkZXJzKSl0aHJvdyBuZXcgUygiY29uZmlndXJhdGlvbi5wcm92aWRlcnMgbXVzdCBiZSBhbiBhcnJheSIpO2xldCBaPSQucHJvdmlkZXJzLm1hcCgoQixXKT0+SyQoQixXLFEpKSxIPW5ldyBTZXQ7Zm9yKGxldCBCIG9mIFope2lmKEguaGFzKEIuaWQpKXRocm93IG5ldyBTKGBwcm92aWRlciBpZCAke0pTT04uc3RyaW5naWZ5KEIuaWQpfSBpcyB1c2VkIHR3aWNlYCk7SC5hZGQoQi5pZCl9bGV0IEo9aSgkLCJhcGlQYXRoUHJlZml4IiwiY29uZmlndXJhdGlvbiIsIi9hcGkiKTtpZighSi5zdGFydHNXaXRoKCIvIikpdGhyb3cgbmV3IFMoJ2NvbmZpZ3VyYXRpb24uYXBpUGF0aFByZWZpeCBtdXN0IHN0YXJ0IHdpdGggIi8iJyk7bGV0IHo9JC50ZWFtSWQ9PT12b2lkIDA/dm9pZCAwOm0oJCwidGVhbUlkIiwiY29uZmlndXJhdGlvbiIpO2lmKHohPT12b2lkIDAmJiEvXlswLTlhLWZdezI0fSQvLnRlc3QoeikpdGhyb3cgbmV3IFMoImNvbmZpZ3VyYXRpb24udGVhbUlkIG11c3QgYmUgYSBIeXBlckRYIHRlYW0gaWQgKDI0IGhleGFkZWNpbWFsIGNoYXJhY3RlcnMpIik7bGV0IFk9JC5yZWRpcmVjdEJhc2VVcmw9PT12b2lkIDA/dm9pZCAwOkYkKCQsUSk7cmV0dXJue3Byb3ZpZGVyczpaLHBhc3N3b3JkTG9naW46bigkLCJwYXNzd29yZExvZ2luIiwiY29uZmlndXJhdGlvbiIsITApLG1heFNlc3Npb25BZ2VNczokLm1heFNlc3Npb25BZ2U9PT12b2lkIDA/NDMyMDAwMDA6RCQoJC5tYXhTZXNzaW9uQWdlLCJjb25maWd1cmF0aW9uLm1heFNlc3Npb25BZ2UiKSxhcGlQYXRoUHJlZml4OkoucmVwbGFjZSgvXC8rJC8sIiIpLC4uLlkhPT12b2lkIDAmJntyZWRpcmVjdEJhc2VVcmw6WX0sLi4ueiE9PXZvaWQgMCYme3RlYW1JZDp6fSxhbGxvd0luc2VjdXJlSHR0cDpRfX1mdW5jdGlvbiBNJChYKXtpZihBcnJheS5pc0FycmF5KFgpKXJldHVybiBYLmZpbHRlcigoJCk9PnR5cGVvZiAkPT09InN0cmluZyIpO2lmKHR5cGVvZiBYPT09InN0cmluZyImJlgubGVuZ3RoPjApcmV0dXJuW1hdO3JldHVybltdfWZ1bmN0aW9uIEwkKFgpe3JldHVybiBYPT09ITB8fFg9PT0idHJ1ZSJ9ZnVuY3Rpb24gbjEoWCwkKXtsZXQgUT0kLnN1YjtpZih0eXBlb2YgUSE9PSJzdHJpbmcifHxRLmxlbmd0aD09PTApcmV0dXJue2FsbG93ZWQ6ITEscmVhc29uOiJzdWJqZWN0TWlzc2luZyJ9O2xldCBaPSRbWC5jbGFpbXMuZW1haWxdO2lmKHR5cGVvZiBaIT09InN0cmluZyJ8fFoudHJpbSgpLmxlbmd0aD09PTApcmV0dXJue2FsbG93ZWQ6ITEscmVhc29uOiJlbWFpbE1pc3NpbmcifTtpZighL15bXHgyMS1ceDdlXSskLy50ZXN0KFoudHJpbSgpKSlyZXR1cm57YWxsb3dlZDohMSxyZWFzb246ImVtYWlsSW52YWxpZCJ9O2xldCBIPVoudHJpbSgpLnRvTG93ZXJDYXNlKCksSj1ILmxhc3RJbmRleE9mKCJAIik7aWYoSjw9MHx8Sj09PUgubGVuZ3RoLTEpcmV0dXJue2FsbG93ZWQ6ITEscmVhc29uOiJlbWFpbE1pc3NpbmcifTtpZihYLnJlcXVpcmVWZXJpZmllZEVtYWlsJiYhTCQoJC5lbWFpbF92ZXJpZmllZCkpcmV0dXJue2FsbG93ZWQ6ITEscmVhc29uOiJlbWFpbE5vdFZlcmlmaWVkIn07bGV0IHo9TSQoJFtYLmNsYWltcy5ncm91cHNdKTtpZihYLmFsbG93Lmdyb3Vwcy5sZW5ndGg+MCYmIXouc29tZSgoVyk9PlguYWxsb3cuZ3JvdXBzLmluY2x1ZGVzKFcpKSlyZXR1cm57YWxsb3dlZDohMSxyZWFzb246Imdyb3VwTm90QWxsb3dlZCJ9O2xldCBZPUguc2xpY2UoSisxKTtpZihYLmFsbG93LmVtYWlsRG9tYWlucy5sZW5ndGg+MCYmIVguYWxsb3cuZW1haWxEb21haW5zLmluY2x1ZGVzKFkpKXJldHVybnthbGxvd2VkOiExLHJlYXNvbjoiZW1haWxEb21haW5Ob3RBbGxvd2VkIn07bGV0IEI9JFtYLmNsYWltcy5uYW1lXTtyZXR1cm57YWxsb3dlZDohMCxpZGVudGl0eTp7cHJvdmlkZXI6WC5pZCxzdWJqZWN0OlEsZW1haWw6SCxuYW1lOnR5cGVvZiBCPT09InN0cmluZyImJkIudHJpbSgpLmxlbmd0aD4wP0IudHJpbSgpOkgsZ3JvdXBzOnp9fX1jbGFzcyB1IGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoKXtzdXBlcigidGhlIGFjY291bnQgaXMgYWxyZWFkeSBsaW5rZWQgdG8gYW5vdGhlciBzaWduLWluIik7dGhpcy5uYW1lPSJMaW5rQ29uZmxpY3RFcnJvciJ9fWFzeW5jIGZ1bmN0aW9uIGExKFgsJCxRKXt0cnl7cmV0dXJuIGF3YWl0IGkxKFgsJCxRKX1jYXRjaChaKXtpZighKFogaW5zdGFuY2VvZiB1KSl0aHJvdyBaO3RyeXtyZXR1cm4gYXdhaXQgaTEoWCwkLFEpfWNhdGNoKEgpe2lmKEggaW5zdGFuY2VvZiB1KXJldHVybntkZW5pZWQ6ImVtYWlsSW5Vc2UifTt0aHJvdyBIfX19YXN5bmMgZnVuY3Rpb24gaTEoWCwkLFEpe2xldCBaPWF3YWl0IFguZmluZExpbmtlZFVzZXJJZChRLnByb3ZpZGVyLFEuc3ViamVjdCk7aWYoWiE9PW51bGwpe2lmKGF3YWl0IFgudXNlckV4aXN0cyhaKSlyZXR1cm4gYXdhaXQgWC50b3VjaChRLnByb3ZpZGVyLFEuc3ViamVjdCkse3VzZXJJZDpaLG91dGNvbWU6ImxpbmtlZCJ9O2F3YWl0IFgudW5saW5rKFEucHJvdmlkZXIsUS5zdWJqZWN0KX1sZXQgSD1hd2FpdCBYLmZpbmRVc2VySWRCeUVtYWlsKFEuZW1haWwpO2lmKEghPT1udWxsKXtpZigkLmxpbmtFeGlzdGluZ1VzZXJzQnlFbWFpbCYmIWF3YWl0IFgudXNlckhhc0FueUxpbmsoSCkpcmV0dXJuIGF3YWl0IFgubGluayhRLEgpLHt1c2VySWQ6SCxvdXRjb21lOiJsaW5rZWRCeUVtYWlsIn07cmV0dXJue2RlbmllZDoiZW1haWxJblVzZSJ9fWlmKCEkLmNyZWF0ZVVzZXJzKXJldHVybntkZW5pZWQ6Im5vQWNjb3VudCJ9O2xldCBKPWF3YWl0IFguY3JlYXRlVXNlcihRLmVtYWlsLFEubmFtZSk7cmV0dXJuIGF3YWl0IFgubGluayhRLEopLHt1c2VySWQ6SixvdXRjb21lOiJjcmVhdGVkIn19dmFyIEMxO2lmKHR5cGVvZiBuYXZpZ2F0b3I+InUifHwhbmF2aWdhdG9yLnVzZXJBZ2VudD8uc3RhcnRzV2l0aD8uKCJNb3ppbGxhLzUuMCAiKSlDMT0ib2F1dGg0d2ViYXBpL3YzLjguOCI7ZnVuY3Rpb24gSDEoWCwkKXtpZihYPT1udWxsKXJldHVybiExO3RyeXtyZXR1cm4gWCBpbnN0YW5jZW9mICR8fE9iamVjdC5nZXRQcm90b3R5cGVPZihYKVtTeW1ib2wudG9TdHJpbmdUYWddPT09JC5wcm90b3R5cGVbU3ltYm9sLnRvU3RyaW5nVGFnXX1jYXRjaHtyZXR1cm4hMX19dmFyIHE9IkVSUl9JTlZBTElEX0FSR19WQUxVRSIsQT0iRVJSX0lOVkFMSURfQVJHX1RZUEUiO2Z1bmN0aW9uIGIoWCwkLFEpe2xldCBaPVR5cGVFcnJvcihYLHtjYXVzZTpRfSk7cmV0dXJuIE9iamVjdC5hc3NpZ24oWix7Y29kZTokfSksWn12YXIgejE9U3ltYm9sKCksVSQ9U3ltYm9sKCksTiQ9U3ltYm9sKCksWFg9U3ltYm9sKCksUCQ9U3ltYm9sKCksbzE9U3ltYm9sKCksWDg9U3ltYm9sKCksYiQ9bmV3IFRleHRFbmNvZGVyLEMkPW5ldyBUZXh0RGVjb2RlcjtmdW5jdGlvbiB5KFgpe2lmKHR5cGVvZiBYPT09InN0cmluZyIpcmV0dXJuIGIkLmVuY29kZShYKTtyZXR1cm4gQyQuZGVjb2RlKFgpfXZhciBTMTtpZihVaW50OEFycmF5LnByb3RvdHlwZS50b0Jhc2U2NClTMT0oWCk9PntpZihYIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpWD1uZXcgVWludDhBcnJheShYKTtyZXR1cm4gWC50b0Jhc2U2NCh7YWxwaGFiZXQ6ImJhc2U2NHVybCIsb21pdFBhZGRpbmc6ITB9KX07ZWxzZSBTMT0oJCk9PntpZigkIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpJD1uZXcgVWludDhBcnJheSgkKTtsZXQgUT1bXTtmb3IobGV0IFo9MDtaPCQuYnl0ZUxlbmd0aDtaKz0zMjc2OClRLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCQuc3ViYXJyYXkoWixaKzMyNzY4KSkpO3JldHVybiBidG9hKFEuam9pbigiIikpLnJlcGxhY2UoLz0vZywiIikucmVwbGFjZSgvXCsvZywiLSIpLnJlcGxhY2UoL1wvL2csIl8iKX07dmFyIF8xO2lmKFVpbnQ4QXJyYXkuZnJvbUJhc2U2NClfMT0oWCk9Pnt0cnl7cmV0dXJuIFVpbnQ4QXJyYXkuZnJvbUJhc2U2NChYLHthbHBoYWJldDoiYmFzZTY0dXJsIn0pfWNhdGNoKCQpe3Rocm93IGIoIlRoZSBpbnB1dCB0byBiZSBkZWNvZGVkIGlzIG5vdCBjb3JyZWN0bHkgZW5jb2RlZC4iLHEsJCl9fTtlbHNlIF8xPShYKT0+e3RyeXtsZXQgJD1hdG9iKFgucmVwbGFjZSgvLS9nLCIrIikucmVwbGFjZSgvXy9nLCIvIikucmVwbGFjZSgvXHMvZywiIikpLFE9bmV3IFVpbnQ4QXJyYXkoJC5sZW5ndGgpO2ZvcihsZXQgWj0wO1o8JC5sZW5ndGg7WisrKVFbWl09JC5jaGFyQ29kZUF0KFopO3JldHVybiBRfWNhdGNoKCQpe3Rocm93IGIoIlRoZSBpbnB1dCB0byBiZSBkZWNvZGVkIGlzIG5vdCBjb3JyZWN0bHkgZW5jb2RlZC4iLHEsJCl9fTtmdW5jdGlvbiBqKFgpe2lmKHR5cGVvZiBYPT09InN0cmluZyIpcmV0dXJuIF8xKFgpO3JldHVybiBTMShYKX1jbGFzcyBSIGV4dGVuZHMgRXJyb3J7Y29kZTtjb25zdHJ1Y3RvcihYLCQpe3N1cGVyKFgsJCk7dGhpcy5uYW1lPXRoaXMuY29uc3RydWN0b3IubmFtZSx0aGlzLmNvZGU9TDAsRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2U/Lih0aGlzLHRoaXMuY29uc3RydWN0b3IpfX1jbGFzcyAkWCBleHRlbmRzIEVycm9ye2NvZGU7Y29uc3RydWN0b3IoWCwkKXtzdXBlcihYLCQpO2lmKHRoaXMubmFtZT10aGlzLmNvbnN0cnVjdG9yLm5hbWUsJD8uY29kZSl0aGlzLmNvZGU9JD8uY29kZTtFcnJvci5jYXB0dXJlU3RhY2tUcmFjZT8uKHRoaXMsdGhpcy5jb25zdHJ1Y3Rvcil9fWZ1bmN0aW9uIEcoWCwkLFEpe3JldHVybiBuZXcgJFgoWCx7Y29kZTokLGNhdXNlOlF9KX1hc3luYyBmdW5jdGlvbiBTJChYKXtsZXQgJDtzd2l0Y2goWC5rdHkpe2Nhc2UiRUMiOiQ9e2NydjpYLmNydixrdHk6WC5rdHkseDpYLngseTpYLnl9O2JyZWFrO2Nhc2UiT0tQIjokPXtjcnY6WC5jcnYsa3R5Olgua3R5LHg6WC54fTticmVhaztjYXNlIkFLUCI6JD17YWxnOlguYWxnLGt0eTpYLmt0eSxwdWI6WC5wdWJ9O2JyZWFrO2Nhc2UiUlNBIjokPXtlOlguZSxrdHk6WC5rdHksbjpYLm59O2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IFIoInVuc3VwcG9ydGVkIEpXSyBrZXkgdHlwZSIse2NhdXNlOlh9KX1yZXR1cm4gaihhd2FpdCBjcnlwdG8uc3VidGxlLmRpZ2VzdCgiU0hBLTI1NiIseShKU09OLnN0cmluZ2lmeSgkKSkpKX1mdW5jdGlvbiBRWChYLCQpe2lmKCEoWCBpbnN0YW5jZW9mIENyeXB0b0tleSkpdGhyb3cgYihgJHskfSBtdXN0IGJlIGEgQ3J5cHRvS2V5YCxBKX1mdW5jdGlvbiBfJChYLCQpe2lmKFFYKFgsJCksWC50eXBlIT09InByaXZhdGUiKXRocm93IGIoYCR7JH0gbXVzdCBiZSBhIHByaXZhdGUgQ3J5cHRvS2V5YCxxKX1mdW5jdGlvbiBUJChYLCQpe2lmKFFYKFgsJCksWC50eXBlIT09InB1YmxpYyIpdGhyb3cgYihgJHskfSBtdXN0IGJlIGEgcHVibGljIENyeXB0b0tleWAscSl9ZnVuY3Rpb24gZShYKXtpZihYPT09bnVsbHx8dHlwZW9mIFghPT0ib2JqZWN0Inx8QXJyYXkuaXNBcnJheShYKSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBaWChYKXtpZihIMShYLEhlYWRlcnMpKVg9T2JqZWN0LmZyb21FbnRyaWVzKFguZW50cmllcygpKTtsZXQgJD1uZXcgSGVhZGVycyhYPz97fSk7aWYoQzEmJiEkLmhhcygidXNlci1hZ2VudCIpKSQuc2V0KCJ1c2VyLWFnZW50IixDMSk7aWYoJC5oYXMoImF1dGhvcml6YXRpb24iKSl0aHJvdyBiKCcib3B0aW9ucy5oZWFkZXJzIiBtdXN0IG5vdCBpbmNsdWRlIHRoZSAiYXV0aG9yaXphdGlvbiIgaGVhZGVyIG5hbWUnLHEpO3JldHVybiAkfWZ1bmN0aW9uIEhYKFgsJCl7aWYoJCE9PXZvaWQgMCl7aWYodHlwZW9mICQ9PT0iZnVuY3Rpb24iKSQ9JChYLmhyZWYpO2lmKCEoJCBpbnN0YW5jZW9mIEFib3J0U2lnbmFsKSl0aHJvdyBiKCcib3B0aW9ucy5zaWduYWwiIG11c3QgcmV0dXJuIG9yIGJlIGFuIGluc3RhbmNlIG9mIEFib3J0U2lnbmFsJyxBKTtyZXR1cm4gJH1yZXR1cm59ZnVuY3Rpb24gelgoWCl7aWYoWC5pbmNsdWRlcygiLy8iKSlyZXR1cm4gWC5yZXBsYWNlKCIvLyIsIi8iKTtyZXR1cm4gWH1mdW5jdGlvbiBJJChYLCQsUT0hMSl7aWYoWC5wYXRobmFtZT09PSIvIilYLnBhdGhuYW1lPSQ7ZWxzZSBYLnBhdGhuYW1lPXpYKGAkeyR9LyR7UT9YLnBhdGhuYW1lOlgucGF0aG5hbWUucmVwbGFjZSgvKFwvKSQvLCIiKX1gKTtyZXR1cm4gWH1mdW5jdGlvbiBxJChYLCQpe3JldHVybiBYLnBhdGhuYW1lPXpYKGAke1gucGF0aG5hbWV9LyR7JH1gKSxYfWFzeW5jIGZ1bmN0aW9uIFIkKFgsJCxRLFope2lmKCEoWCBpbnN0YW5jZW9mIFVSTCkpdGhyb3cgYihgIiR7JH0iIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgVVJMYCxBKTtMWChYLFo/Llt6MV0hPT0hMCk7bGV0IEg9UShuZXcgVVJMKFguaHJlZikpLEo9WlgoWj8uaGVhZGVycyk7cmV0dXJuIEouc2V0KCJhY2NlcHQiLCJhcHBsaWNhdGlvbi9qc29uIiksKFo/LltYWF18fGZldGNoKShILmhyZWYse2JvZHk6dm9pZCAwLGhlYWRlcnM6T2JqZWN0LmZyb21FbnRyaWVzKEouZW50cmllcygpKSxtZXRob2Q6IkdFVCIscmVkaXJlY3Q6Im1hbnVhbCIsc2lnbmFsOkhYKEgsWj8uc2lnbmFsKX0pfWFzeW5jIGZ1bmN0aW9uIFdYKFgsJCl7cmV0dXJuIFIkKFgsImlzc3VlcklkZW50aWZpZXIiLChRKT0+e3N3aXRjaCgkPy5hbGdvcml0aG0pe2Nhc2Ugdm9pZCAwOmNhc2Uib2lkYyI6cSQoUSwiLndlbGwta25vd24vb3BlbmlkLWNvbmZpZ3VyYXRpb24iKTticmVhaztjYXNlIm9hdXRoMiI6SSQoUSwiLndlbGwta25vd24vb2F1dGgtYXV0aG9yaXphdGlvbi1zZXJ2ZXIiKTticmVhaztkZWZhdWx0OnRocm93IGIoJyJvcHRpb25zLmFsZ29yaXRobSIgbXVzdCBiZSAib2lkYyIgKGRlZmF1bHQpLCBvciAib2F1dGgyIicscSl9cmV0dXJuIFF9LCQpfWZ1bmN0aW9uIFgxKFgsJCxRLFosSCl7dHJ5e2lmKHR5cGVvZiBYIT09Im51bWJlciJ8fCFOdW1iZXIuaXNGaW5pdGUoWCkpdGhyb3cgYihgJHtRfSBtdXN0IGJlIGEgbnVtYmVyYCxBLEgpO2lmKFg+MClyZXR1cm47aWYoJCl7aWYoWCE9PTApdGhyb3cgYihgJHtRfSBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlcmAscSxIKTtyZXR1cm59dGhyb3cgYihgJHtRfSBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyYCxxLEgpfWNhdGNoKEope2lmKFopdGhyb3cgRyhKLm1lc3NhZ2UsWixIKTt0aHJvdyBKfX1mdW5jdGlvbiBJKFgsJCxRLFope3RyeXtpZih0eXBlb2YgWCE9PSJzdHJpbmciKXRocm93IGIoYCR7JH0gbXVzdCBiZSBhIHN0cmluZ2AsQSxaKTtpZihYLmxlbmd0aD09PTApdGhyb3cgYihgJHskfSBtdXN0IG5vdCBiZSBlbXB0eWAscSxaKX1jYXRjaChIKXtpZihRKXRocm93IEcoSC5tZXNzYWdlLFEsWik7dGhyb3cgSH19YXN5bmMgZnVuY3Rpb24gSlgoWCwkKXtsZXQgUT1YO2lmKCEoUSBpbnN0YW5jZW9mIFVSTCkmJlEhPT1lMSl0aHJvdyBiKCciZXhwZWN0ZWRJc3N1ZXJJZGVudGlmaWVyIiBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIFVSTCcsQSk7aWYoIUgxKCQsUmVzcG9uc2UpKXRocm93IGIoJyJyZXNwb25zZSIgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBSZXNwb25zZScsQSk7aWYoJC5zdGF0dXMhPT0yMDApdGhyb3cgRygnInJlc3BvbnNlIiBpcyBub3QgYSBjb25mb3JtIEF1dGhvcml6YXRpb24gU2VydmVyIE1ldGFkYXRhIHJlc3BvbnNlICh1bmV4cGVjdGVkIEhUVFAgc3RhdHVzIGNvZGUpJyxPWCwkKTt2MSgkKTtsZXQgWj1hd2FpdCBBWCgkKTtpZihJKFouaXNzdWVyLCcicmVzcG9uc2UiIGJvZHkgImlzc3VlciIgcHJvcGVydHknLFUse2JvZHk6Wn0pLFEhPT1lMSYmbmV3IFVSTChaLmlzc3VlcikuaHJlZiE9PVEuaHJlZil0aHJvdyBHKCcicmVzcG9uc2UiIGJvZHkgImlzc3VlciIgcHJvcGVydHkgZG9lcyBub3QgbWF0Y2ggdGhlIGV4cGVjdGVkIHZhbHVlJyxDMCx7ZXhwZWN0ZWQ6US5ocmVmLGJvZHk6WixhdHRyaWJ1dGU6Imlzc3VlciJ9KTtyZXR1cm4gWn1mdW5jdGlvbiBZWChYKXtmJChYLCJhcHBsaWNhdGlvbi9qc29uIil9ZnVuY3Rpb24gTyQoWCwuLi4kKXtsZXQgUT0nInJlc3BvbnNlIiBjb250ZW50LXR5cGUgbXVzdCBiZSAnO2lmKCQubGVuZ3RoPjIpe2xldCBaPSQucG9wKCk7USs9YCR7JC5qb2luKCIsICIpfSwgb3IgJHtafWB9ZWxzZSBpZigkLmxlbmd0aD09PTIpUSs9YCR7JFswXX0gb3IgJHskWzFdfWA7ZWxzZSBRKz0kWzBdO3JldHVybiBHKFEsTjAsWCl9ZnVuY3Rpb24gZiQoWCwkKXtpZihyJChYKSE9PSQpdGhyb3cgTyQoWCwkKX1mdW5jdGlvbiBXMSgpe3JldHVybiBqKGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMzIpKSl9ZnVuY3Rpb24gQlgoKXtyZXR1cm4gVzEoKX1mdW5jdGlvbiBEWCgpe3JldHVybiBXMSgpfWZ1bmN0aW9uIEdYKCl7cmV0dXJuIFcxKCl9YXN5bmMgZnVuY3Rpb24gS1goWCl7cmV0dXJuIEkoWCwiY29kZVZlcmlmaWVyIiksaihhd2FpdCBjcnlwdG8uc3VidGxlLmRpZ2VzdCgiU0hBLTI1NiIseShYKSkpfWZ1bmN0aW9uIEEkKFgpe3N3aXRjaChYLmFsZ29yaXRobS5oYXNoLm5hbWUpe2Nhc2UiU0hBLTI1NiI6cmV0dXJuIlBTMjU2IjtjYXNlIlNIQS0zODQiOnJldHVybiJQUzM4NCI7Y2FzZSJTSEEtNTEyIjpyZXR1cm4iUFM1MTIiO2RlZmF1bHQ6dGhyb3cgbmV3IFIoInVuc3VwcG9ydGVkIFJzYUhhc2hlZEtleUFsZ29yaXRobSBoYXNoIG5hbWUiLHtjYXVzZTpYfSl9fWZ1bmN0aW9uIHYkKFgpe3N3aXRjaChYLmFsZ29yaXRobS5oYXNoLm5hbWUpe2Nhc2UiU0hBLTI1NiI6cmV0dXJuIlJTMjU2IjtjYXNlIlNIQS0zODQiOnJldHVybiJSUzM4NCI7Y2FzZSJTSEEtNTEyIjpyZXR1cm4iUlM1MTIiO2RlZmF1bHQ6dGhyb3cgbmV3IFIoInVuc3VwcG9ydGVkIFJzYUhhc2hlZEtleUFsZ29yaXRobSBoYXNoIG5hbWUiLHtjYXVzZTpYfSl9fWZ1bmN0aW9uIEUkKFgpe3N3aXRjaChYLmFsZ29yaXRobS5uYW1lZEN1cnZlKXtjYXNlIlAtMjU2IjpyZXR1cm4iRVMyNTYiO2Nhc2UiUC0zODQiOnJldHVybiJFUzM4NCI7Y2FzZSJQLTUyMSI6cmV0dXJuIkVTNTEyIjtkZWZhdWx0OnRocm93IG5ldyBSKCJ1bnN1cHBvcnRlZCBFY0tleUFsZ29yaXRobSBuYW1lZEN1cnZlIix7Y2F1c2U6WH0pfX1mdW5jdGlvbiB4JChYKXtzd2l0Y2goWC5hbGdvcml0aG0ubmFtZSl7Y2FzZSJSU0EtUFNTIjpyZXR1cm4gQSQoWCk7Y2FzZSJSU0FTU0EtUEtDUzEtdjFfNSI6cmV0dXJuIHYkKFgpO2Nhc2UiRUNEU0EiOnJldHVybiBFJChYKTtjYXNlIkVkMjU1MTkiOmNhc2UiTUwtRFNBLTQ0IjpjYXNlIk1MLURTQS02NSI6Y2FzZSJNTC1EU0EtODciOnJldHVybiBYLmFsZ29yaXRobS5uYW1lO2Nhc2UiRWREU0EiOnJldHVybiJFZDI1NTE5IjtkZWZhdWx0OnRocm93IG5ldyBSKCJ1bnN1cHBvcnRlZCBDcnlwdG9LZXkgYWxnb3JpdGhtIG5hbWUiLHtjYXVzZTpYfSl9fWZ1bmN0aW9uIFIxKFgpe2xldCAkPVg/LltVJF07cmV0dXJuIHR5cGVvZiAkPT09Im51bWJlciImJk51bWJlci5pc0Zpbml0ZSgkKT8kOjB9ZnVuY3Rpb24gRlgoWCl7bGV0ICQ9WD8uW04kXTtyZXR1cm4gdHlwZW9mICQ9PT0ibnVtYmVyIiYmTnVtYmVyLmlzRmluaXRlKCQpJiZNYXRoLnNpZ24oJCkhPT0tMT8kOjMwfWZ1bmN0aW9uIE8xKCl7cmV0dXJuIE1hdGguZmxvb3IoRGF0ZS5ub3coKS8xMDAwKX1mdW5jdGlvbiBmMShYKXtpZih0eXBlb2YgWCE9PSJvYmplY3QifHxYPT09bnVsbCl0aHJvdyBiKCciYXMiIG11c3QgYmUgYW4gb2JqZWN0JyxBKTtJKFguaXNzdWVyLCciYXMuaXNzdWVyIicpfWZ1bmN0aW9uIEExKFgpe2lmKHR5cGVvZiBYIT09Im9iamVjdCJ8fFg9PT1udWxsKXRocm93IGIoJyJjbGllbnQiIG11c3QgYmUgYW4gb2JqZWN0JyxBKTtJKFguY2xpZW50X2lkLCciY2xpZW50LmNsaWVudF9pZCInKX1mdW5jdGlvbiB0MShYKXtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KFgpLnJlcGxhY2UoLyg/OlstXy4hfionKCldfCUyMCkvZywoJCk9Pntzd2l0Y2goJCl7Y2FzZSItIjpjYXNlIl8iOmNhc2UiLiI6Y2FzZSIhIjpjYXNlIn4iOmNhc2UiKiI6Y2FzZSInIjpjYXNlIigiOmNhc2UiKSI6cmV0dXJuYCUkeyQuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX1gO2Nhc2UiJTIwIjpyZXR1cm4iKyI7ZGVmYXVsdDp0aHJvdyBFcnJvcigpfX0pfWZ1bmN0aW9uIFZYKFgpe3JldHVybiBJKFgsJyJjbGllbnRTZWNyZXQiJyksKCQsUSxaLEgpPT57Wi5zZXQoImNsaWVudF9pZCIsUS5jbGllbnRfaWQpLFouc2V0KCJjbGllbnRfc2VjcmV0IixYKX19ZnVuY3Rpb24gTVgoWCl7cmV0dXJuIEkoWCwnImNsaWVudFNlY3JldCInKSwoJCxRLFosSCk9PntsZXQgSj10MShRLmNsaWVudF9pZCksej10MShYKSxZPWJ0b2EoYCR7Sn06JHt6fWApO0guc2V0KCJhdXRob3JpemF0aW9uIixgQmFzaWMgJHtZfWApfX1hc3luYyBmdW5jdGlvbiBqJChYLCQsUSl7aWYoIVEudXNhZ2VzLmluY2x1ZGVzKCJzaWduIikpdGhyb3cgYignQ3J5cHRvS2V5IGluc3RhbmNlcyB1c2VkIGZvciBzaWduaW5nIGFzc2VydGlvbnMgbXVzdCBpbmNsdWRlICJzaWduIiBpbiB0aGVpciAidXNhZ2VzIicscSk7bGV0IFo9YCR7aih5KEpTT04uc3RyaW5naWZ5KFgpKSl9LiR7aih5KEpTT04uc3RyaW5naWZ5KCQpKSl9YCxIPWooYXdhaXQgY3J5cHRvLnN1YnRsZS5zaWduKEkwKFEpLFEseShaKSkpO3JldHVybmAke1p9LiR7SH1gfXZhciBUMTthc3luYyBmdW5jdGlvbiB5JChYLCQpe2xldHtrdHk6USxlOlosbjpILHg6Six5OnosY3J2OlkscHViOkJ9PWF3YWl0IGNyeXB0by5zdWJ0bGUuZXhwb3J0S2V5KCJqd2siLFgpLFc9e2t0eTpRLGU6WixuOkgseDpKLHk6eixjcnY6WSxwdWI6Qn07aWYoUT09PSJBS1AiKVcuYWxnPSQ7cmV0dXJuIFQxLnNldChYLFcpLFd9YXN5bmMgZnVuY3Rpb24gdyQoWCwkKXtyZXR1cm4gVDF8fD1uZXcgV2Vha01hcCxUMS5nZXQoWCl8fHkkKFgsJCl9dmFyIGckPVVSTC5wYXJzZT8oWCwkKT0+VVJMLnBhcnNlKFgsJCk6KFgsJCk9Pnt0cnl7cmV0dXJuIG5ldyBVUkwoWCwkKX1jYXRjaHtyZXR1cm4gbnVsbH19O2Z1bmN0aW9uIExYKFgsJCl7aWYoJCYmWC5wcm90b2NvbCE9PSJodHRwczoiKXRocm93IEcoIm9ubHkgcmVxdWVzdHMgdG8gSFRUUFMgYXJlIGFsbG93ZWQiLFAwLFgpO2lmKFgucHJvdG9jb2whPT0iaHR0cHM6IiYmWC5wcm90b2NvbCE9PSJodHRwOiIpdGhyb3cgRygib25seSBIVFRQIGFuZCBIVFRQUyByZXF1ZXN0cyBhcmUgYWxsb3dlZCIsYjAsWCl9ZnVuY3Rpb24gczEoWCwkLFEsWil7bGV0IEg7aWYodHlwZW9mIFghPT0ic3RyaW5nInx8IShIPWckKFgpKSl0aHJvdyBHKGBhdXRob3JpemF0aW9uIHNlcnZlciBtZXRhZGF0YSBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgJHtRP2AiYXMubXRsc19lbmRwb2ludF9hbGlhc2VzLiR7JH0iYDpgImFzLiR7JH0iYH1gLFg9PT12b2lkIDA/UzA6XzAse2F0dHJpYnV0ZTpRP2BtdGxzX2VuZHBvaW50X2FsaWFzZXMuJHskfWA6JH0pO3JldHVybiBMWChILFopLEh9ZnVuY3Rpb24gaCQoWCwkLFEsWil7aWYoUSYmWC5tdGxzX2VuZHBvaW50X2FsaWFzZXMmJiQgaW4gWC5tdGxzX2VuZHBvaW50X2FsaWFzZXMpcmV0dXJuIHMxKFgubXRsc19lbmRwb2ludF9hbGlhc2VzWyRdLCQsUSxaKTtyZXR1cm4gczEoWFskXSwkLFEsWil9Y2xhc3MgayR7IyQ7I1E7I1o7I3o7I1c7I1g7I0g7Y29uc3RydWN0b3IoWCwkLFEpe2lmKF8kKCQ/LnByaXZhdGVLZXksJyJEUG9QLnByaXZhdGVLZXkiJyksVCQoJD8ucHVibGljS2V5LCciRFBvUC5wdWJsaWNLZXkiJyksISQucHVibGljS2V5LmV4dHJhY3RhYmxlKXRocm93IGIoJyJEUG9QLnB1YmxpY0tleS5leHRyYWN0YWJsZSIgbXVzdCBiZSB0cnVlJyxxKTt0aGlzLiNXPVE/LltQJF0sdGhpcy4jej1SMShYKSx0aGlzLiNRPSQucHJpdmF0ZUtleSx0aGlzLiNaPSQucHVibGljS2V5LFkxLmFkZCh0aGlzKX0jSihYKXt0aGlzLiNYfHw9bmV3IE1hcDtsZXQgJD10aGlzLiNYLmdldChYKTtpZigkKXRoaXMuI1guZGVsZXRlKFgpLHRoaXMuI1guc2V0KFgsJCk7cmV0dXJuICR9I1koWCwkKXtpZih0aGlzLiNYfHw9bmV3IE1hcCx0aGlzLiNYLmRlbGV0ZShYKSx0aGlzLiNYLnNpemU9PT0xMDApdGhpcy4jWC5kZWxldGUodGhpcy4jWC5rZXlzKCkubmV4dCgpLnZhbHVlKTt0aGlzLiNYLnNldChYLCQpfWFzeW5jIGNhbGN1bGF0ZVRodW1icHJpbnQoKXtpZighdGhpcy4jSCl7bGV0IFg9YXdhaXQgY3J5cHRvLnN1YnRsZS5leHBvcnRLZXkoImp3ayIsdGhpcy4jWik7dGhpcy4jSHx8PWF3YWl0IFMkKFgpfXJldHVybiB0aGlzLiNIfWFzeW5jIGFkZFByb29mKFgsJCxRLFope2xldCBIPXgkKHRoaXMuI1EpO3RoaXMuIyR8fD17YWxnOkgsdHlwOiJkcG9wK2p3dCIsandrOmF3YWl0IHckKHRoaXMuI1osSCl9O2xldCBKPXRoaXMuI0ooWC5vcmlnaW4pLFk9e2lhdDpPMSgpK3RoaXMuI3osanRpOlcxKCksaHRtOlEsbm9uY2U6SixodHU6YCR7WC5vcmlnaW59JHtYLnBhdGhuYW1lfWAsYXRoOlo/aihhd2FpdCBjcnlwdG8uc3VidGxlLmRpZ2VzdCgiU0hBLTI1NiIseShaKSkpOnZvaWQgMH07dGhpcy4jVz8uKHRoaXMuIyQsWSksJC5zZXQoImRwb3AiLGF3YWl0IGokKHRoaXMuIyQsWSx0aGlzLiNRKSl9Y2FjaGVOb25jZShYLCQpe3RyeXtsZXQgUT1YLmhlYWRlcnMuZ2V0KCJkcG9wLW5vbmNlIik7aWYoUSl0aGlzLiNZKCQub3JpZ2luLFEpfWNhdGNoe319fWNsYXNzIFVYIGV4dGVuZHMgRXJyb3J7Y2F1c2U7Y29kZTtlcnJvcjtzdGF0dXM7ZXJyb3JfZGVzY3JpcHRpb247cmVzcG9uc2U7Y29uc3RydWN0b3IoWCwkKXtzdXBlcihYLCQpO3RoaXMubmFtZT10aGlzLmNvbnN0cnVjdG9yLm5hbWUsdGhpcy5jb2RlPU0wLHRoaXMuY2F1c2U9JC5jYXVzZSx0aGlzLmVycm9yPSQuY2F1c2UuZXJyb3IsdGhpcy5zdGF0dXM9JC5yZXNwb25zZS5zdGF0dXMsdGhpcy5lcnJvcl9kZXNjcmlwdGlvbj0kLmNhdXNlLmVycm9yX2Rlc2NyaXB0aW9uLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJyZXNwb25zZSIse2VudW1lcmFibGU6ITEsdmFsdWU6JC5yZXNwb25zZX0pLEVycm9yLmNhcHR1cmVTdGFja1RyYWNlPy4odGhpcyx0aGlzLmNvbnN0cnVjdG9yKX19Y2xhc3MgTlggZXh0ZW5kcyBFcnJvcntjYXVzZTtjb2RlO2Vycm9yO2Vycm9yX2Rlc2NyaXB0aW9uO2NvbnN0cnVjdG9yKFgsJCl7c3VwZXIoWCwkKTt0aGlzLm5hbWU9dGhpcy5jb25zdHJ1Y3Rvci5uYW1lLHRoaXMuY29kZT1VMCx0aGlzLmNhdXNlPSQuY2F1c2UsdGhpcy5lcnJvcj0kLmNhdXNlLmdldCgiZXJyb3IiKSx0aGlzLmVycm9yX2Rlc2NyaXB0aW9uPSQuY2F1c2UuZ2V0KCJlcnJvcl9kZXNjcmlwdGlvbiIpPz92b2lkIDAsRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2U/Lih0aGlzLHRoaXMuY29uc3RydWN0b3IpfX1jbGFzcyBQWCBleHRlbmRzIEVycm9ye2NhdXNlO2NvZGU7cmVzcG9uc2U7c3RhdHVzO2NvbnN0cnVjdG9yKFgsJCl7c3VwZXIoWCwkKTt0aGlzLm5hbWU9dGhpcy5jb25zdHJ1Y3Rvci5uYW1lLHRoaXMuY29kZT1WMCx0aGlzLmNhdXNlPSQuY2F1c2UsdGhpcy5zdGF0dXM9JC5yZXNwb25zZS5zdGF0dXMsdGhpcy5yZXNwb25zZT0kLnJlc3BvbnNlLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJyZXNwb25zZSIse2VudW1lcmFibGU6ITF9KSxFcnJvci5jYXB0dXJlU3RhY2tUcmFjZT8uKHRoaXMsdGhpcy5jb25zdHJ1Y3Rvcil9fXZhciAkMT0iW2EtekEtWjAtOSEjJCUmXFwnXFwqXFwrXFwtXFwuXFxeX2BcXHx+XSsiLG0kPSJbYS16QS1aMC05XFwtXFwuX1xcflxcK1xcL10rPXswLDJ9Iix1JD0nIigoPzpbXiJcXFxcXXxcXFxcW1xcc1xcU10pKikiJyxkJD0iKCIrJDErIilcXHMqPVxccyoiK3UkLGMkPSIoIiskMSsiKVxccyo9XFxzKigiKyQxKyIpIixsJD1uZXcgUmVnRXhwKCJeWyxcXHNdKigiKyQxKyIpIikscCQ9bmV3IFJlZ0V4cCgiXlssXFxzXSoiK2QkKyJbLFxcc10qKC4qKSIpLGkkPW5ldyBSZWdFeHAoIl5bLFxcc10qIitjJCsiWyxcXHNdKiguKikiKSxuJD1uZXcgUmVnRXhwKCJeKCIrbSQrIikoPzokfFssXFxzXSkoLiopIik7ZnVuY3Rpb24gYSQoWCl7aWYoIUgxKFgsUmVzcG9uc2UpKXRocm93IGIoJyJyZXNwb25zZSIgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBSZXNwb25zZScsQSk7bGV0ICQ9WC5oZWFkZXJzLmdldCgid3d3LWF1dGhlbnRpY2F0ZSIpO2lmKCQ9PT1udWxsKXJldHVybjtsZXQgUT1bXSxaPSQ7d2hpbGUoWil7bGV0IEg9Wi5tYXRjaChsJCksSj1IPy5bIjEiXS50b0xvd2VyQ2FzZSgpO2lmKCFKKXJldHVybjtsZXQgej1aLnN1YnN0cmluZyhIWzBdLmxlbmd0aCk7aWYoeiYmIXoubWF0Y2goL15bXHMsXS8pKXJldHVybjtsZXQgWT16Lm1hdGNoKC9eXHMrKC4qKSQvKSxCPSEhWTtaPVk/WVsxXTp2b2lkIDA7bGV0IFc9e30sSztpZihCKXdoaWxlKFope2xldCBOLF87aWYoSD1aLm1hdGNoKHAkKSl7aWYoWyxOLF8sWl09SCxfLmluY2x1ZGVzKCJcXCIpKV89Xy5yZXBsYWNlKC9cXChbXHNcU10pL2csIiQxIik7V1tOLnRvTG93ZXJDYXNlKCldPV87Y29udGludWV9aWYoSD1aLm1hdGNoKGkkKSl7WyxOLF8sWl09SCxXW04udG9Mb3dlckNhc2UoKV09Xztjb250aW51ZX1pZihIPVoubWF0Y2gobiQpKXtpZihPYmplY3Qua2V5cyhXKS5sZW5ndGgpYnJlYWs7WyxLLFpdPUg7YnJlYWt9cmV0dXJufWVsc2UgWj16fHx2b2lkIDA7bGV0IEw9e3NjaGVtZTpKLHBhcmFtZXRlcnM6V307aWYoSylMLnRva2VuNjg9SztRLnB1c2goTCl9aWYoIVEubGVuZ3RoKXJldHVybjtyZXR1cm4gUX1hc3luYyBmdW5jdGlvbiBvJChYKXtpZihYLnN0YXR1cz4zOTkmJlguc3RhdHVzPDUwMCl7djEoWCksWVgoWCk7dHJ5e2xldCAkPWF3YWl0IFguY2xvbmUoKS5qc29uKCk7aWYoZSgkKSYmdHlwZW9mICQuZXJyb3I9PT0ic3RyaW5nIiYmJC5lcnJvci5sZW5ndGgpcmV0dXJuICR9Y2F0Y2h7fX1yZXR1cm59YXN5bmMgZnVuY3Rpb24gdCQoWCwkLFEpe2lmKFguc3RhdHVzIT09JCl7UTAoWCk7bGV0IFo7aWYoWj1hd2FpdCBvJChYKSl0aHJvdyBhd2FpdCBYLmJvZHk/LmNhbmNlbCgpLG5ldyBVWCgic2VydmVyIHJlc3BvbmRlZCB3aXRoIGFuIGVycm9yIGluIHRoZSByZXNwb25zZSBib2R5Iix7Y2F1c2U6WixyZXNwb25zZTpYfSk7dGhyb3cgRyhgInJlc3BvbnNlIiBpcyBub3QgYSBjb25mb3JtICR7UX0gcmVzcG9uc2UgKHVuZXhwZWN0ZWQgSFRUUCBzdGF0dXMgY29kZSlgLE9YLFgpfX1mdW5jdGlvbiBzJChYKXtpZighWTEuaGFzKFgpKXRocm93IGIoJyJvcHRpb25zLkRQb1AiIGlzIG5vdCBhIHZhbGlkIERQb1BIYW5kbGUnLHEpfXZhciAkOD1TeW1ib2woKTtmdW5jdGlvbiByJChYKXtyZXR1cm4gWC5oZWFkZXJzLmdldCgiY29udGVudC10eXBlIik/LnNwbGl0KCI7IilbMF19YXN5bmMgZnVuY3Rpb24gZSQoWCwkLFEsWixILEoseil7cmV0dXJuIGF3YWl0IFEoWCwkLEgsSiksSi5zZXQoImNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04IiksKHo/LltYWF18fGZldGNoKShaLmhyZWYse2JvZHk6SCxoZWFkZXJzOk9iamVjdC5mcm9tRW50cmllcyhKLmVudHJpZXMoKSksbWV0aG9kOiJQT1NUIixyZWRpcmVjdDoibWFudWFsIixzaWduYWw6SFgoWix6Py5zaWduYWwpfSl9YXN5bmMgZnVuY3Rpb24gWDAoWCwkLFEsWixILEope2xldCB6PWgkKFgsInRva2VuX2VuZHBvaW50IiwkLnVzZV9tdGxzX2VuZHBvaW50X2FsaWFzZXMsSj8uW3oxXSE9PSEwKTtILnNldCgiZ3JhbnRfdHlwZSIsWik7bGV0IFk9WlgoSj8uaGVhZGVycyk7aWYoWS5zZXQoImFjY2VwdCIsImFwcGxpY2F0aW9uL2pzb24iKSxKPy5EUG9QIT09dm9pZCAwKXMkKEouRFBvUCksYXdhaXQgSi5EUG9QLmFkZFByb29mKHosWSwiUE9TVCIpO2xldCBCPWF3YWl0IGUkKFgsJCxRLHosSCxZLEopO3JldHVybiBKPy5EUG9QPy5jYWNoZU5vbmNlKEIseiksQn12YXIgYlg9bmV3IFdlYWtNYXAsJDA9bmV3IFdlYWtNYXA7ZnVuY3Rpb24gSjEoWCl7aWYoIVguaWRfdG9rZW4pcmV0dXJuO2xldCAkPWJYLmdldChYKTtpZighJCl0aHJvdyBiKCcicmVmIiB3YXMgYWxyZWFkeSBnYXJiYWdlIGNvbGxlY3RlZCBvciBkaWQgbm90IHJlc29sdmUgZnJvbSB0aGUgcHJvcGVyIHNvdXJjZXMnLHEpO3JldHVybiAkfWFzeW5jIGZ1bmN0aW9uIENYKFgsJCxRLFosSCxKKXtpZihmMShYKSxBMSgkKSwhSDEoUSxSZXNwb25zZSkpdGhyb3cgYignInJlc3BvbnNlIiBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIFJlc3BvbnNlJyxBKTthd2FpdCB0JChRLDIwMCwiVG9rZW4gRW5kcG9pbnQiKSx2MShRKTtsZXQgej1hd2FpdCBBWChRKTtpZihJKHouYWNjZXNzX3Rva2VuLCcicmVzcG9uc2UiIGJvZHkgImFjY2Vzc190b2tlbiIgcHJvcGVydHknLFUse2JvZHk6en0pLEkoei50b2tlbl90eXBlLCcicmVzcG9uc2UiIGJvZHkgInRva2VuX3R5cGUiIHByb3BlcnR5JyxVLHtib2R5Onp9KSx6LnRva2VuX3R5cGU9ei50b2tlbl90eXBlLnRvTG93ZXJDYXNlKCksei5leHBpcmVzX2luIT09dm9pZCAwKXtsZXQgWT10eXBlb2Ygei5leHBpcmVzX2luIT09Im51bWJlciI/cGFyc2VGbG9hdCh6LmV4cGlyZXNfaW4pOnouZXhwaXJlc19pbjtYMShZLCEwLCcicmVzcG9uc2UiIGJvZHkgImV4cGlyZXNfaW4iIHByb3BlcnR5JyxVLHtib2R5Onp9KSx6LmV4cGlyZXNfaW49WX1pZih6LnJlZnJlc2hfdG9rZW4hPT12b2lkIDApSSh6LnJlZnJlc2hfdG9rZW4sJyJyZXNwb25zZSIgYm9keSAicmVmcmVzaF90b2tlbiIgcHJvcGVydHknLFUse2JvZHk6en0pO2lmKHouc2NvcGUhPT12b2lkIDAmJnR5cGVvZiB6LnNjb3BlIT09InN0cmluZyIpdGhyb3cgRygnInJlc3BvbnNlIiBib2R5ICJzY29wZSIgcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZycsVSx7Ym9keTp6fSk7aWYoei5pZF90b2tlbiE9PXZvaWQgMCl7SSh6LmlkX3Rva2VuLCcicmVzcG9uc2UiIGJvZHkgImlkX3Rva2VuIiBwcm9wZXJ0eScsVSx7Ym9keTp6fSk7bGV0IFk9W107aWYoJC5yZXF1aXJlX2F1dGhfdGltZT09PSEwKVkucHVzaCgiYXV0aF90aW1lIik7aWYoJC5kZWZhdWx0X21heF9hZ2UhPT12b2lkIDApWDEoJC5kZWZhdWx0X21heF9hZ2UsITAsJyJjbGllbnQuZGVmYXVsdF9tYXhfYWdlIicpLFkucHVzaCgiYXV0aF90aW1lIik7aWYoWj8ubGVuZ3RoKVkucHVzaCguLi5aKTtsZXR7Y2xhaW1zOkIsand0Old9PWF3YWl0IEIwKFgsJCx6LmlkX3Rva2VuLFksSCk7RzAoJCxCKSxEMChCKSwkMC5zZXQoUSxXKSxiWC5zZXQoeixCKX1pZihKPy5bei50b2tlbl90eXBlXSE9PXZvaWQgMClKW3oudG9rZW5fdHlwZV0oUSx6KTtlbHNlIGlmKHoudG9rZW5fdHlwZSE9PSJkcG9wIiYmei50b2tlbl90eXBlIT09ImJlYXJlciIpdGhyb3cgbmV3IFIoInVuc3VwcG9ydGVkIGB0b2tlbl90eXBlYCB2YWx1ZSIse2NhdXNlOntib2R5Onp9fSk7cmV0dXJuIHp9ZnVuY3Rpb24gUTAoWCl7bGV0ICQ7aWYoJD1hJChYKSl0aHJvdyBuZXcgUFgoInNlcnZlciByZXNwb25kZWQgd2l0aCBhIGNoYWxsZW5nZSBpbiB0aGUgV1dXLUF1dGhlbnRpY2F0ZSBIVFRQIEhlYWRlciIse2NhdXNlOiQscmVzcG9uc2U6WH0pfWZ1bmN0aW9uIFowKFgsJCl7aWYoQXJyYXkuaXNBcnJheSgkLmNsYWltcy5hdWQpKXtpZighJC5jbGFpbXMuYXVkLmluY2x1ZGVzKFgpKXRocm93IEcoJ3VuZXhwZWN0ZWQgSldUICJhdWQiIChhdWRpZW5jZSkgY2xhaW0gdmFsdWUnLGQse2V4cGVjdGVkOlgsY2xhaW1zOiQuY2xhaW1zLGNsYWltOiJhdWQifSl9ZWxzZSBpZigkLmNsYWltcy5hdWQhPT1YKXRocm93IEcoJ3VuZXhwZWN0ZWQgSldUICJhdWQiIChhdWRpZW5jZSkgY2xhaW0gdmFsdWUnLGQse2V4cGVjdGVkOlgsY2xhaW1zOiQuY2xhaW1zLGNsYWltOiJhdWQifSk7cmV0dXJuICR9ZnVuY3Rpb24gSDAoWCwkKXtsZXQgUT1YW0EwXT8uKCQpPz9YLmlzc3VlcjtpZigkLmNsYWltcy5pc3MhPT1RKXRocm93IEcoJ3VuZXhwZWN0ZWQgSldUICJpc3MiIChpc3N1ZXIpIGNsYWltIHZhbHVlJyxkLHtleHBlY3RlZDpRLGNsYWltczokLmNsYWltcyxjbGFpbToiaXNzIn0pO3JldHVybiAkfXZhciBZMT1uZXcgV2Vha1NldDtmdW5jdGlvbiB6MChYKXtyZXR1cm4gWTEuYWRkKFgpLFh9dmFyIFcwPVN5bWJvbCgpO2FzeW5jIGZ1bmN0aW9uIFNYKFgsJCxRLFosSCxKLHope2lmKGYxKFgpLEExKCQpLCFZMS5oYXMoWikpdGhyb3cgYignImNhbGxiYWNrUGFyYW1ldGVycyIgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBVUkxTZWFyY2hQYXJhbXMgb2J0YWluZWQgZnJvbSAidmFsaWRhdGVBdXRoUmVzcG9uc2UoKSIsIG9yICJ2YWxpZGF0ZUp3dEF1dGhSZXNwb25zZSgpJyxxKTtJKEgsJyJyZWRpcmVjdFVyaSInKTtsZXQgWT1nKFosImNvZGUiKTtpZighWSl0aHJvdyBHKCdubyBhdXRob3JpemF0aW9uIGNvZGUgaW4gImNhbGxiYWNrUGFyYW1ldGVycyInLFUpO2xldCBCPW5ldyBVUkxTZWFyY2hQYXJhbXMoej8uYWRkaXRpb25hbFBhcmFtZXRlcnMpO2lmKEIuc2V0KCJyZWRpcmVjdF91cmkiLEgpLEIuc2V0KCJjb2RlIixZKSxKIT09VzApSShKLCciY29kZVZlcmlmaWVyIicpLEIuc2V0KCJjb2RlX3ZlcmlmaWVyIixKKTtyZXR1cm4gWDAoWCwkLFEsImF1dGhvcml6YXRpb25fY29kZSIsQix6KX12YXIgX1g9e2F1ZDoiYXVkaWVuY2UiLGNfaGFzaDoiY29kZSBoYXNoIixjbGllbnRfaWQ6ImNsaWVudCBpZCIsZXhwOiJleHBpcmF0aW9uIHRpbWUiLGlhdDoiaXNzdWVkIGF0Iixpc3M6Imlzc3VlciIsanRpOiJqd3QgaWQiLG5vbmNlOiJub25jZSIsc19oYXNoOiJzdGF0ZSBoYXNoIixzdWI6InN1YmplY3QiLGF0aDoiYWNjZXNzIHRva2VuIGhhc2giLGh0bToiaHR0cCBtZXRob2QiLGh0dToiaHR0cCB1cmkiLGNuZjoiY29uZmlybWF0aW9uIixhdXRoX3RpbWU6ImF1dGhlbnRpY2F0aW9uIHRpbWUifTtmdW5jdGlvbiBKMChYLCQpe2ZvcihsZXQgUSBvZiBYKWlmKCQuY2xhaW1zW1FdPT09dm9pZCAwKXRocm93IEcoYEpXVCAiJHtRfSIgKCR7X1hbUV19KSBjbGFpbSBtaXNzaW5nYCxVLHtjbGFpbXM6JC5jbGFpbXN9KTtyZXR1cm4gJH1mdW5jdGlvbiBZMChYLCQpe2lmKHR5cGVvZiAkLmNsYWltc1tYXSE9PSJzdHJpbmciKXRocm93IEcoYHVuZXhwZWN0ZWQgSldUICIke1h9IiAoJHtfWFtYXX0pIGNsYWltIHR5cGVgLFUse2NsYWltczokLmNsYWltc30pO3JldHVybiAkfWZ1bmN0aW9uIEIwKFgsJCxRLFosSCl7cmV0dXJuIHEwKFEsUjAuYmluZCh2b2lkIDAsJC5pZF90b2tlbl9zaWduZWRfcmVzcG9uc2VfYWxnLFguaWRfdG9rZW5fc2lnbmluZ19hbGdfdmFsdWVzX3N1cHBvcnRlZCwiUlMyNTYiKSxSMSgkKSxGWCgkKSxIKS50aGVuKEowLmJpbmQodm9pZCAwLFsiYXVkIiwiZXhwIiwiaWF0IiwiaXNzIiwic3ViIiwuLi5aXSkpLnRoZW4oSDAuYmluZCh2b2lkIDAsWCkpLnRoZW4oWjAuYmluZCh2b2lkIDAsJC5jbGllbnRfaWQpKS50aGVuKFkwLmJpbmQodm9pZCAwLCJzdWIiKSl9ZnVuY3Rpb24gVFgoWCwkKXtpZigkPT09WjEpcmV0dXJuICQ7bGV0IFE9JD09PXZvaWQgMDtpZihRKSQ9WC5kZWZhdWx0X21heF9hZ2U7aWYoJD09PXZvaWQgMClyZXR1cm4gWjE7cmV0dXJuIFgxKCQsITAsUT8nImNsaWVudC5kZWZhdWx0X21heF9hZ2UiJzonIm1heEFnZSIgYXJndW1lbnQnKSwkfWZ1bmN0aW9uIEQwKFgpe2lmKFguYXV0aF90aW1lIT09dm9pZCAwKVgxKFguYXV0aF90aW1lLCEwLCdJRCBUb2tlbiAiYXV0aF90aW1lIiAoYXV0aGVudGljYXRpb24gdGltZSknLFUse2NsYWltczpYfSl9ZnVuY3Rpb24gSVgoWCwkLFEpe2lmKFE9PT1aMSlyZXR1cm47bGV0IFo9TzEoKStSMShYKSxIPUZYKFgpO2lmKCQuYXV0aF90aW1lK1E8Wi1IKXRocm93IEcoInRvbyBtdWNoIHRpbWUgaGFzIGVsYXBzZWQgc2luY2UgdGhlIGxhc3QgRW5kLVVzZXIgYXV0aGVudGljYXRpb24iLHExLHtjbGFpbXM6JCxub3c6Wix0b2xlcmFuY2U6SCxjbGFpbToiYXV0aF90aW1lIn0pfWZ1bmN0aW9uIHFYKFgsJCl7bGV0IFE9JD09PVExP3ZvaWQgMDokO2lmKFgubm9uY2UhPT1RKXRocm93IEcoJ3VuZXhwZWN0ZWQgSUQgVG9rZW4gIm5vbmNlIiBjbGFpbSB2YWx1ZScsZCx7ZXhwZWN0ZWQ6USxjbGFpbXM6WCxjbGFpbToibm9uY2UifSl9ZnVuY3Rpb24gRzAoWCwkKXtpZihBcnJheS5pc0FycmF5KCQuYXVkKSYmJC5hdWQubGVuZ3RoIT09MSl7aWYoJC5henA9PT12b2lkIDApdGhyb3cgRygnSUQgVG9rZW4gImF1ZCIgKGF1ZGllbmNlKSBjbGFpbSBpbmNsdWRlcyBhZGRpdGlvbmFsIHVudHJ1c3RlZCBhdWRpZW5jZXMnLGQse2NsYWltczokLGNsYWltOiJhdWQifSk7aWYoJC5henAhPT1YLmNsaWVudF9pZCl0aHJvdyBHKCd1bmV4cGVjdGVkIElEIFRva2VuICJhenAiIChhdXRob3JpemVkIHBhcnR5KSBjbGFpbSB2YWx1ZScsZCx7ZXhwZWN0ZWQ6WC5jbGllbnRfaWQsY2xhaW1zOiQsY2xhaW06ImF6cCJ9KX19dmFyIFExPVN5bWJvbCgpLFoxPVN5bWJvbCgpO2FzeW5jIGZ1bmN0aW9uIFJYKFgsJCxRLFope2lmKHR5cGVvZiBaPy5leHBlY3RlZE5vbmNlPT09InN0cmluZyJ8fHR5cGVvZiBaPy5tYXhBZ2U9PT0ibnVtYmVyInx8Wj8ucmVxdWlyZUlkVG9rZW4pcmV0dXJuIEswKFgsJCxRLFouZXhwZWN0ZWROb25jZSxaLm1heEFnZSxaW28xXSxaLnJlY29nbml6ZWRUb2tlblR5cGVzKTtyZXR1cm4gRjAoWCwkLFEsWj8ubWF4QWdlLFo/LltvMV0sWj8ucmVjb2duaXplZFRva2VuVHlwZXMpfWFzeW5jIGZ1bmN0aW9uIEswKFgsJCxRLFosSCxKLHope2xldCBZPVtdO3N3aXRjaChaKXtjYXNlIHZvaWQgMDpaPVExO2JyZWFrO2Nhc2UgUTE6YnJlYWs7ZGVmYXVsdDpJKFosJyJleHBlY3RlZE5vbmNlIiBhcmd1bWVudCcpLFkucHVzaCgibm9uY2UiKX1pZihIPVRYKCQsSCksSCE9PVoxKVkucHVzaCgiYXV0aF90aW1lIik7bGV0IEI9YXdhaXQgQ1goWCwkLFEsWSxKLHopO0koQi5pZF90b2tlbiwnInJlc3BvbnNlIiBib2R5ICJpZF90b2tlbiIgcHJvcGVydHknLFUse2JvZHk6Qn0pO2xldCBXPUoxKEIpO3JldHVybiBJWCgkLFcsSCkscVgoVyxaKSxCfWFzeW5jIGZ1bmN0aW9uIEYwKFgsJCxRLFosSCxKKXtsZXQgej1hd2FpdCBDWChYLCQsUSx2b2lkIDAsSCxKKSxZPUoxKHopO2lmKFkpSVgoJCxZLFRYKCQsWikpLHFYKFksUTEpO3JldHVybiB6fXZhciBWMD0iT0FVVEhfV1dXX0FVVEhFTlRJQ0FURV9DSEFMTEVOR0UiLE0wPSJPQVVUSF9SRVNQT05TRV9CT0RZX0VSUk9SIixMMD0iT0FVVEhfVU5TVVBQT1JURURfT1BFUkFUSU9OIixVMD0iT0FVVEhfQVVUSE9SSVpBVElPTl9SRVNQT05TRV9FUlJPUiI7dmFyIEkxPSJPQVVUSF9QQVJTRV9FUlJPUiIsVT0iT0FVVEhfSU5WQUxJRF9SRVNQT05TRSI7dmFyIE4wPSJPQVVUSF9SRVNQT05TRV9JU19OT1RfSlNPTiIsT1g9Ik9BVVRIX1JFU1BPTlNFX0lTX05PVF9DT05GT1JNIixQMD0iT0FVVEhfSFRUUF9SRVFVRVNUX0ZPUkJJRERFTiIsYjA9Ik9BVVRIX1JFUVVFU1RfUFJPVE9DT0xfRk9SQklEREVOIixxMT0iT0FVVEhfSldUX1RJTUVTVEFNUF9DSEVDS19GQUlMRUQiLGQ9Ik9BVVRIX0pXVF9DTEFJTV9DT01QQVJJU09OX0ZBSUxFRCIsQzA9Ik9BVVRIX0pTT05fQVRUUklCVVRFX0NPTVBBUklTT05fRkFJTEVEIjt2YXIgUzA9Ik9BVVRIX01JU1NJTkdfU0VSVkVSX01FVEFEQVRBIixfMD0iT0FVVEhfSU5WQUxJRF9TRVJWRVJfTUVUQURBVEEiO2Z1bmN0aW9uIHYxKFgpe2lmKFguYm9keVVzZWQpdGhyb3cgYignInJlc3BvbnNlIiBib2R5IGhhcyBiZWVuIHVzZWQgYWxyZWFkeScscSl9ZnVuY3Rpb24gcjEoWCl7bGV0e2FsZ29yaXRobTokfT1YO2lmKHR5cGVvZiAkLm1vZHVsdXNMZW5ndGghPT0ibnVtYmVyInx8JC5tb2R1bHVzTGVuZ3RoPDIwNDgpdGhyb3cgbmV3IFIoYHVuc3VwcG9ydGVkICR7JC5uYW1lfSBtb2R1bHVzTGVuZ3RoYCx7Y2F1c2U6WH0pfWZ1bmN0aW9uIFQwKFgpe2xldHthbGdvcml0aG06JH09WDtzd2l0Y2goJC5uYW1lZEN1cnZlKXtjYXNlIlAtMjU2IjpyZXR1cm4iU0hBLTI1NiI7Y2FzZSJQLTM4NCI6cmV0dXJuIlNIQS0zODQiO2Nhc2UiUC01MjEiOnJldHVybiJTSEEtNTEyIjtkZWZhdWx0OnRocm93IG5ldyBSKCJ1bnN1cHBvcnRlZCBFQ0RTQSBuYW1lZEN1cnZlIix7Y2F1c2U6WH0pfX1mdW5jdGlvbiBJMChYKXtzd2l0Y2goWC5hbGdvcml0aG0ubmFtZSl7Y2FzZSJFQ0RTQSI6cmV0dXJue25hbWU6WC5hbGdvcml0aG0ubmFtZSxoYXNoOlQwKFgpfTtjYXNlIlJTQS1QU1MiOnN3aXRjaChyMShYKSxYLmFsZ29yaXRobS5oYXNoLm5hbWUpe2Nhc2UiU0hBLTI1NiI6Y2FzZSJTSEEtMzg0IjpjYXNlIlNIQS01MTIiOnJldHVybntuYW1lOlguYWxnb3JpdGhtLm5hbWUsc2FsdExlbmd0aDpwYXJzZUludChYLmFsZ29yaXRobS5oYXNoLm5hbWUuc2xpY2UoLTMpLDEwKT4+M307ZGVmYXVsdDp0aHJvdyBuZXcgUigidW5zdXBwb3J0ZWQgUlNBLVBTUyBoYXNoIG5hbWUiLHtjYXVzZTpYfSl9Y2FzZSJSU0FTU0EtUEtDUzEtdjFfNSI6cmV0dXJuIHIxKFgpLFguYWxnb3JpdGhtLm5hbWU7Y2FzZSJNTC1EU0EtNDQiOmNhc2UiTUwtRFNBLTY1IjpjYXNlIk1MLURTQS04NyI6Y2FzZSJFZDI1NTE5IjpyZXR1cm4gWC5hbGdvcml0aG0ubmFtZX10aHJvdyBuZXcgUigidW5zdXBwb3J0ZWQgQ3J5cHRvS2V5IGFsZ29yaXRobSBuYW1lIix7Y2F1c2U6WH0pfWFzeW5jIGZ1bmN0aW9uIHEwKFgsJCxRLFosSCl7bGV0ezA6SiwxOnosbGVuZ3RoOll9PVguc3BsaXQoIi4iKTtpZihZPT09NSlpZihIIT09dm9pZCAwKVg9YXdhaXQgSChYKSx7MDpKLDE6eixsZW5ndGg6WX09WC5zcGxpdCgiLiIpO2Vsc2UgdGhyb3cgbmV3IFIoIkpXRSBkZWNyeXB0aW9uIGlzIG5vdCBjb25maWd1cmVkIix7Y2F1c2U6WH0pO2lmKFkhPT0zKXRocm93IEcoIkludmFsaWQgSldUIixVLFgpO2xldCBCO3RyeXtCPUpTT04ucGFyc2UoeShqKEopKSl9Y2F0Y2goTCl7dGhyb3cgRygiZmFpbGVkIHRvIHBhcnNlIEpXVCBIZWFkZXIgYm9keSBhcyBiYXNlNjR1cmwgZW5jb2RlZCBKU09OIixJMSxMKX1pZighZShCKSl0aHJvdyBHKCJKV1QgSGVhZGVyIG11c3QgYmUgYSB0b3AgbGV2ZWwgb2JqZWN0IixVLFgpO2lmKCQoQiksQi5jcml0IT09dm9pZCAwKXRocm93IG5ldyBSKCdubyBKV1QgImNyaXQiIGhlYWRlciBwYXJhbWV0ZXIgZXh0ZW5zaW9ucyBhcmUgc3VwcG9ydGVkJyx7Y2F1c2U6e2hlYWRlcjpCfX0pO2xldCBXO3RyeXtXPUpTT04ucGFyc2UoeShqKHopKSl9Y2F0Y2goTCl7dGhyb3cgRygiZmFpbGVkIHRvIHBhcnNlIEpXVCBQYXlsb2FkIGJvZHkgYXMgYmFzZTY0dXJsIGVuY29kZWQgSlNPTiIsSTEsTCl9aWYoIWUoVykpdGhyb3cgRygiSldUIFBheWxvYWQgbXVzdCBiZSBhIHRvcCBsZXZlbCBvYmplY3QiLFUsWCk7bGV0IEs9TzEoKStRO2lmKFcuZXhwIT09dm9pZCAwKXtpZih0eXBlb2YgVy5leHAhPT0ibnVtYmVyIil0aHJvdyBHKCd1bmV4cGVjdGVkIEpXVCAiZXhwIiAoZXhwaXJhdGlvbiB0aW1lKSBjbGFpbSB0eXBlJyxVLHtjbGFpbXM6V30pO2lmKFcuZXhwPD1LLVopdGhyb3cgRygndW5leHBlY3RlZCBKV1QgImV4cCIgKGV4cGlyYXRpb24gdGltZSkgY2xhaW0gdmFsdWUsIGV4cGlyYXRpb24gaXMgcGFzdCBjdXJyZW50IHRpbWVzdGFtcCcscTEse2NsYWltczpXLG5vdzpLLHRvbGVyYW5jZTpaLGNsYWltOiJleHAifSl9aWYoVy5pYXQhPT12b2lkIDApe2lmKHR5cGVvZiBXLmlhdCE9PSJudW1iZXIiKXRocm93IEcoJ3VuZXhwZWN0ZWQgSldUICJpYXQiIChpc3N1ZWQgYXQpIGNsYWltIHR5cGUnLFUse2NsYWltczpXfSl9aWYoVy5pc3MhPT12b2lkIDApe2lmKHR5cGVvZiBXLmlzcyE9PSJzdHJpbmciKXRocm93IEcoJ3VuZXhwZWN0ZWQgSldUICJpc3MiIChpc3N1ZXIpIGNsYWltIHR5cGUnLFUse2NsYWltczpXfSl9aWYoVy5uYmYhPT12b2lkIDApe2lmKHR5cGVvZiBXLm5iZiE9PSJudW1iZXIiKXRocm93IEcoJ3VuZXhwZWN0ZWQgSldUICJuYmYiIChub3QgYmVmb3JlKSBjbGFpbSB0eXBlJyxVLHtjbGFpbXM6V30pO2lmKFcubmJmPksrWil0aHJvdyBHKCd1bmV4cGVjdGVkIEpXVCAibmJmIiAobm90IGJlZm9yZSkgY2xhaW0gdmFsdWUnLHExLHtjbGFpbXM6Vyxub3c6Syx0b2xlcmFuY2U6WixjbGFpbToibmJmIn0pfWlmKFcuYXVkIT09dm9pZCAwKXtpZih0eXBlb2YgVy5hdWQhPT0ic3RyaW5nIiYmIUFycmF5LmlzQXJyYXkoVy5hdWQpKXRocm93IEcoJ3VuZXhwZWN0ZWQgSldUICJhdWQiIChhdWRpZW5jZSkgY2xhaW0gdHlwZScsVSx7Y2xhaW1zOld9KX1yZXR1cm57aGVhZGVyOkIsY2xhaW1zOlcsand0Olh9fWZ1bmN0aW9uIFIwKFgsJCxRLFope2lmKFghPT12b2lkIDApe2lmKHR5cGVvZiBYPT09InN0cmluZyI/Wi5hbGchPT1YOiFYLmluY2x1ZGVzKFouYWxnKSl0aHJvdyBHKCd1bmV4cGVjdGVkIEpXVCAiYWxnIiBoZWFkZXIgcGFyYW1ldGVyJyxVLHtoZWFkZXI6WixleHBlY3RlZDpYLHJlYXNvbjoiY2xpZW50IGNvbmZpZ3VyYXRpb24ifSk7cmV0dXJufWlmKEFycmF5LmlzQXJyYXkoJCkpe2lmKCEkLmluY2x1ZGVzKFouYWxnKSl0aHJvdyBHKCd1bmV4cGVjdGVkIEpXVCAiYWxnIiBoZWFkZXIgcGFyYW1ldGVyJyxVLHtoZWFkZXI6WixleHBlY3RlZDokLHJlYXNvbjoiYXV0aG9yaXphdGlvbiBzZXJ2ZXIgbWV0YWRhdGEifSk7cmV0dXJufWlmKFEhPT12b2lkIDApe2lmKHR5cGVvZiBRPT09InN0cmluZyI/Wi5hbGchPT1ROnR5cGVvZiBRPT09ImZ1bmN0aW9uIj8hUShaLmFsZyk6IVEuaW5jbHVkZXMoWi5hbGcpKXRocm93IEcoJ3VuZXhwZWN0ZWQgSldUICJhbGciIGhlYWRlciBwYXJhbWV0ZXInLFUse2hlYWRlcjpaLGV4cGVjdGVkOlEscmVhc29uOiJkZWZhdWx0IHZhbHVlIn0pO3JldHVybn10aHJvdyBHKCdtaXNzaW5nIGNsaWVudCBvciBzZXJ2ZXIgY29uZmlndXJhdGlvbiB0byB2ZXJpZnkgdXNlZCBKV1QgImFsZyIgaGVhZGVyIHBhcmFtZXRlcicsdm9pZCAwLHtjbGllbnQ6WCxpc3N1ZXI6JCxmYWxsYmFjazpRfSl9ZnVuY3Rpb24gZyhYLCQpe2xldHswOlEsbGVuZ3RoOlp9PVguZ2V0QWxsKCQpO2lmKFo+MSl0aHJvdyBHKGAiJHskfSIgcGFyYW1ldGVyIG11c3QgYmUgcHJvdmlkZWQgb25seSBvbmNlYCxVKTtyZXR1cm4gUX12YXIgTzA9U3ltYm9sKCksZjA9U3ltYm9sKCk7ZnVuY3Rpb24gZlgoWCwkLFEsWil7aWYoZjEoWCksQTEoJCksUSBpbnN0YW5jZW9mIFVSTClRPVEuc2VhcmNoUGFyYW1zO2lmKCEoUSBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtcykpdGhyb3cgYignInBhcmFtZXRlcnMiIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgVVJMU2VhcmNoUGFyYW1zLCBvciBVUkwnLEEpO2lmKGcoUSwicmVzcG9uc2UiKSl0aHJvdyBHKCcicGFyYW1ldGVycyIgY29udGFpbnMgYSBKQVJNIHJlc3BvbnNlLCB1c2UgdmFsaWRhdGVKd3RBdXRoUmVzcG9uc2UoKSBpbnN0ZWFkIG9mIHZhbGlkYXRlQXV0aFJlc3BvbnNlKCknLFUse3BhcmFtZXRlcnM6UX0pO2xldCBIPWcoUSwiaXNzIiksSj1nKFEsInN0YXRlIik7aWYoIUgmJlguYXV0aG9yaXphdGlvbl9yZXNwb25zZV9pc3NfcGFyYW1ldGVyX3N1cHBvcnRlZCl0aHJvdyBHKCdyZXNwb25zZSBwYXJhbWV0ZXIgImlzcyIgKGlzc3VlcikgbWlzc2luZycsVSx7cGFyYW1ldGVyczpRfSk7aWYoSCYmSCE9PVguaXNzdWVyKXRocm93IEcoJ3VuZXhwZWN0ZWQgImlzcyIgKGlzc3VlcikgcmVzcG9uc2UgcGFyYW1ldGVyIHZhbHVlJyxVLHtleHBlY3RlZDpYLmlzc3VlcixwYXJhbWV0ZXJzOlF9KTtzd2l0Y2goWil7Y2FzZSB2b2lkIDA6Y2FzZSBmMDppZihKIT09dm9pZCAwKXRocm93IEcoJ3VuZXhwZWN0ZWQgInN0YXRlIiByZXNwb25zZSBwYXJhbWV0ZXIgZW5jb3VudGVyZWQnLFUse2V4cGVjdGVkOnZvaWQgMCxwYXJhbWV0ZXJzOlF9KTticmVhaztjYXNlIE8wOmJyZWFrO2RlZmF1bHQ6aWYoSShaLCciZXhwZWN0ZWRTdGF0ZSIgYXJndW1lbnQnKSxKIT09Wil0aHJvdyBHKEo9PT12b2lkIDA/J3Jlc3BvbnNlIHBhcmFtZXRlciAic3RhdGUiIG1pc3NpbmcnOid1bmV4cGVjdGVkICJzdGF0ZSIgcmVzcG9uc2UgcGFyYW1ldGVyIHZhbHVlJyxVLHtleHBlY3RlZDpaLHBhcmFtZXRlcnM6UX0pfWlmKGcoUSwiZXJyb3IiKSl0aHJvdyBuZXcgTlgoImF1dGhvcml6YXRpb24gcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyIGlzIGFuIGVycm9yIix7Y2F1c2U6UX0pO2xldCBZPWcoUSwiaWRfdG9rZW4iKSxCPWcoUSwidG9rZW4iKTtpZihZIT09dm9pZCAwfHxCIT09dm9pZCAwKXRocm93IG5ldyBSKCJpbXBsaWNpdCBhbmQgaHlicmlkIGZsb3dzIGFyZSBub3Qgc3VwcG9ydGVkIik7cmV0dXJuIHowKG5ldyBVUkxTZWFyY2hQYXJhbXMoUSkpfWFzeW5jIGZ1bmN0aW9uIEFYKFgsJD1ZWCl7bGV0IFE7dHJ5e1E9YXdhaXQgWC5qc29uKCl9Y2F0Y2goWil7dGhyb3cgJChYKSxHKCdmYWlsZWQgdG8gcGFyc2UgInJlc3BvbnNlIiBib2R5IGFzIEpTT04nLEkxLFopfWlmKCFlKFEpKXRocm93IEcoJyJyZXNwb25zZSIgYm9keSBtdXN0IGJlIGEgdG9wIGxldmVsIG9iamVjdCcsVSx7Ym9keTpRfSk7cmV0dXJuIFF9dmFyIGUxPVN5bWJvbCgpLEEwPVN5bWJvbCgpO2Z1bmN0aW9uIEIxKC4uLlgpe2ZvcihsZXQgJCBvZiBYKXtpZigkPT09dm9pZCAwfHwkLnRyaW0oKT09PSIiKWNvbnRpbnVlO2xldCBRO3RyeXtRPW5ldyBVUkwoJC50cmltKCkpfWNhdGNoe2NvbnRpbnVlfWlmKFEucHJvdG9jb2whPT0iaHR0cHM6IiYmUS5wcm90b2NvbCE9PSJodHRwOiIpY29udGludWU7aWYoUS51c2VybmFtZSE9PSIifHxRLnBhc3N3b3JkIT09IiJ8fFEuc2VhcmNoIT09IiJ8fFEuaGFzaCE9PSIiKWNvbnRpbnVlO3JldHVybmAke1Eub3JpZ2lufSR7US5wYXRobmFtZS5yZXBsYWNlKC9cLyskLywiIil9YH1yZXR1cm4iIn1mdW5jdGlvbiBFMChYKXtmb3IobGV0ICQ9MDskPFgubGVuZ3RoOyQrKyl7bGV0IFE9WC5jaGFyQ29kZUF0KCQpO2lmKFE8PTMyfHxRPT09MTI3KXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIEUxKFgpe3JldHVybiBYLnN0YXJ0c1dpdGgoIi8iKSYmIVguc3RhcnRzV2l0aCgiLy8iKSYmIVguaW5jbHVkZXMoIlxcIikmJiFFMChYKX1mdW5jdGlvbiBEMShYLCQpe3JldHVybmAke1h9JHtFMSgkKT8kOiIvIn1gfWZ1bmN0aW9uIHgxKFgsJCxRKXtsZXQgWj1RPT09Ii8iPyIiOmA/cmV0dXJuVG89JHtlbmNvZGVVUklDb21wb25lbnQoUSl9YDtyZXR1cm5gJHtYfS8ke2VuY29kZVVSSUNvbXBvbmVudCgkKX0ke1p9YH12YXIgeDA9NjAwMDAwLGowPTg2NDAwMDAwLHkwPTE1MDAwO2NsYXNzIE8gZXh0ZW5kcyBFcnJvcntyZWFzb247Y29uc3RydWN0b3IoWCwkKXtzdXBlcigkKTt0aGlzLnJlYXNvbj1YO3RoaXMubmFtZT0iT2lkY0Zsb3dFcnJvciJ9fWNsYXNzIGoxe2NvbmZpZztyZWRpcmVjdFVyaTthbGxvd0luc2VjdXJlSHR0cDttZXRhZGF0YTttZXRhZGF0YUZldGNoZWRBdD0wO2xhc3REaXNjb3ZlcnlGYWlsdXJlQXQ9MDtjb25zdHJ1Y3RvcihYLCQsUSl7dGhpcy5jb25maWc9WDt0aGlzLnJlZGlyZWN0VXJpPSQ7dGhpcy5hbGxvd0luc2VjdXJlSHR0cD1RfWdldCBjbGllbnQoKXtyZXR1cm57Y2xpZW50X2lkOnRoaXMuY29uZmlnLmNsaWVudElkfX1nZXQgY2xpZW50QXV0aCgpe3JldHVybiB0aGlzLmNvbmZpZy50b2tlbkVuZHBvaW50QXV0aE1ldGhvZD09PSJjbGllbnRfc2VjcmV0X3Bvc3QiP1ZYKHRoaXMuY29uZmlnLmNsaWVudFNlY3JldCk6TVgodGhpcy5jb25maWcuY2xpZW50U2VjcmV0KX1yZXF1ZXN0T3B0aW9ucygpe3JldHVybiB0aGlzLmFsbG93SW5zZWN1cmVIdHRwP3tbejFdOiEwfTp7fX1hc3luYyBhdXRob3JpemF0aW9uU2VydmVyKCl7bGV0IFg9RGF0ZS5ub3coKTtpZih0aGlzLm1ldGFkYXRhIT09dm9pZCAwJiZYLXRoaXMubWV0YWRhdGFGZXRjaGVkQXQ8ajApcmV0dXJuIHRoaXMubWV0YWRhdGE7aWYodGhpcy5tZXRhZGF0YT09PXZvaWQgMCYmWC10aGlzLmxhc3REaXNjb3ZlcnlGYWlsdXJlQXQ8eTApdGhyb3cgbmV3IE8oInByb3ZpZGVyVW5hdmFpbGFibGUiLGBkaXNjb3ZlcnkgZm9yIHByb3ZpZGVyICR7dGhpcy5jb25maWcuaWR9IGZhaWxlZCByZWNlbnRseTsgcmV0cnlpbmcgc2hvcnRseWApO2xldCAkPW5ldyBVUkwodGhpcy5jb25maWcuaXNzdWVyKSxRPVdYKCQse2FsZ29yaXRobToib2lkYyIsLi4udGhpcy5yZXF1ZXN0T3B0aW9ucygpfSkudGhlbigoWik9PkpYKCQsWikpO3RoaXMubWV0YWRhdGE9USx0aGlzLm1ldGFkYXRhRmV0Y2hlZEF0PVg7dHJ5e3JldHVybiBhd2FpdCBRfWNhdGNoKFope3Rocm93IHRoaXMubWV0YWRhdGE9dm9pZCAwLHRoaXMubGFzdERpc2NvdmVyeUZhaWx1cmVBdD1EYXRlLm5vdygpLG5ldyBPKCJwcm92aWRlclVuYXZhaWxhYmxlIixgZGlzY292ZXJ5IGZvciBwcm92aWRlciAke3RoaXMuY29uZmlnLmlkfSAoJHt0aGlzLmNvbmZpZy5pc3N1ZXJ9KSBmYWlsZWQ6ICR7Wi5tZXNzYWdlfWApfX1hc3luYyBiZWdpbihYKXtsZXQgJD1hd2FpdCB0aGlzLmF1dGhvcml6YXRpb25TZXJ2ZXIoKTtpZigkLmF1dGhvcml6YXRpb25fZW5kcG9pbnQ9PT12b2lkIDApdGhyb3cgbmV3IE8oInByb3ZpZGVyTWlzY29uZmlndXJlZCIsYHByb3ZpZGVyICR7dGhpcy5jb25maWcuaWR9IGhhcyBubyBhdXRob3JpemF0aW9uX2VuZHBvaW50YCk7bGV0IFE9QlgoKSxaPXtwcm92aWRlcjp0aGlzLmNvbmZpZy5pZCxzdGF0ZTpEWCgpLG5vbmNlOkdYKCksY29kZVZlcmlmaWVyOlEscmV0dXJuVG86WCxjcmVhdGVkQXQ6RGF0ZS5ub3coKX0sSD1uZXcgVVJMKCQuYXV0aG9yaXphdGlvbl9lbmRwb2ludCk7cmV0dXJuIEguc2VhcmNoUGFyYW1zLnNldCgiY2xpZW50X2lkIix0aGlzLmNvbmZpZy5jbGllbnRJZCksSC5zZWFyY2hQYXJhbXMuc2V0KCJyZWRpcmVjdF91cmkiLHRoaXMucmVkaXJlY3RVcmkpLEguc2VhcmNoUGFyYW1zLnNldCgicmVzcG9uc2VfdHlwZSIsImNvZGUiKSxILnNlYXJjaFBhcmFtcy5zZXQoInNjb3BlIix0aGlzLmNvbmZpZy5zY29wZXMuam9pbigiICIpKSxILnNlYXJjaFBhcmFtcy5zZXQoInN0YXRlIixaLnN0YXRlKSxILnNlYXJjaFBhcmFtcy5zZXQoIm5vbmNlIixaLm5vbmNlKSxILnNlYXJjaFBhcmFtcy5zZXQoImNvZGVfY2hhbGxlbmdlIixhd2FpdCBLWChRKSksSC5zZWFyY2hQYXJhbXMuc2V0KCJjb2RlX2NoYWxsZW5nZV9tZXRob2QiLCJTMjU2Iikse3VybDpILmhyZWYscGVuZGluZzpafX1hc3luYyBjb21wbGV0ZShYLCQpe2lmKCQucHJvdmlkZXIhPT10aGlzLmNvbmZpZy5pZCl0aHJvdyBuZXcgTygic3RhdGVNaXNtYXRjaCIsInRoZSBwZW5kaW5nIGxvZ2luIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgcHJvdmlkZXIiKTtpZihEYXRlLm5vdygpLSQuY3JlYXRlZEF0PngwKXRocm93IG5ldyBPKCJsb2dpbkV4cGlyZWQiLCJ0aGUgbG9naW4gdG9vayB0b28gbG9uZzsgc3RhcnQgYWdhaW4iKTtsZXQgUT1hd2FpdCB0aGlzLmF1dGhvcml6YXRpb25TZXJ2ZXIoKSxaO3RyeXtaPWZYKFEsdGhpcy5jbGllbnQsWCwkLnN0YXRlKX1jYXRjaChZKXt0aHJvdyBuZXcgTygiYXV0aG9yaXphdGlvbkZhaWxlZCIsWS5tZXNzYWdlKX1sZXQgSD1hd2FpdCBTWChRLHRoaXMuY2xpZW50LHRoaXMuY2xpZW50QXV0aCxaLHRoaXMucmVkaXJlY3RVcmksJC5jb2RlVmVyaWZpZXIsdGhpcy5yZXF1ZXN0T3B0aW9ucygpKSxKO3RyeXtKPWF3YWl0IFJYKFEsdGhpcy5jbGllbnQsSCx7ZXhwZWN0ZWROb25jZTokLm5vbmNlLHJlcXVpcmVJZFRva2VuOiEwfSl9Y2F0Y2goWSl7dGhyb3cgbmV3IE8oInRva2VuRXhjaGFuZ2VGYWlsZWQiLFkubWVzc2FnZSl9bGV0IHo9SjEoSik7aWYoej09PXZvaWQgMCl0aHJvdyBuZXcgTygidG9rZW5FeGNoYW5nZUZhaWxlZCIsIm5vIElEIHRva2VuIGluIHRoZSB0b2tlbiByZXNwb25zZSIpO3JldHVybiB6fX1mdW5jdGlvbiBHMShYKXtyZXR1cm4gdHlwZW9mIFg9PT0ic3RyaW5nIiYmRTEoWCk/WDoiLyJ9ZnVuY3Rpb24gYyhYKXtyZXR1cm4gWC5yZXBsYWNlKC8mL2csIiZhbXA7IikucmVwbGFjZSgvPC9nLCImbHQ7IikucmVwbGFjZSgvPi9nLCImZ3Q7IikucmVwbGFjZSgvIi9nLCImcXVvdDsiKS5yZXBsYWNlKC8nL2csIiYjMzk7Iil9dmFyIHcwPSJib2R5e2ZvbnQtZmFtaWx5OnN5c3RlbS11aSxzYW5zLXNlcmlmO2JhY2tncm91bmQ6IzExMTtjb2xvcjojZWVlO2Rpc3BsYXk6ZmxleDttaW4taGVpZ2h0OjEwMHZoO2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO21hcmdpbjowfW1haW57bWF4LXdpZHRoOjI0cmVtO3dpZHRoOjEwMCU7cGFkZGluZzoycmVtfWgxe2ZvbnQtc2l6ZToxLjI1cmVtO21hcmdpbjowIDAgMS41cmVtfWEucHJvdmlkZXJ7ZGlzcGxheTpibG9jaztwYWRkaW5nOi43NXJlbSAxcmVtO21hcmdpbjouNXJlbSAwO2JvcmRlcjoxcHggc29saWQgIzQ0NDtib3JkZXItcmFkaXVzOi41cmVtO2NvbG9yOiNlZWU7dGV4dC1kZWNvcmF0aW9uOm5vbmV9YS5wcm92aWRlcjpob3Zlcntib3JkZXItY29sb3I6Izg4OH1we2NvbG9yOiNiYmI7bGluZS1oZWlnaHQ6MS41fWF7Y29sb3I6IzhhYjRmOH0iO2Z1bmN0aW9uIHZYKFgsJCl7cmV0dXJuYDwhZG9jdHlwZSBodG1sPjxodG1sIGxhbmc9ImVuIj48aGVhZD48bWV0YSBjaGFyc2V0PSJ1dGYtOCI+PG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCxpbml0aWFsLXNjYWxlPTEiPjx0aXRsZT4ke2MoWCl9PC90aXRsZT48c3R5bGU+JHt3MH08L3N0eWxlPjwvaGVhZD48Ym9keT48bWFpbj4keyR9PC9tYWluPjwvYm9keT48L2h0bWw+YH1mdW5jdGlvbiBFWChYLCQpe2xldCBRPVgubWFwKChIKT0+YDxhIGNsYXNzPSJwcm92aWRlciIgaHJlZj0iJHtjKEguaHJlZil9Ij4ke2MoSC5sYWJlbCl9PC9hPmApLmpvaW4oIiIpLFo9JD09PXZvaWQgMD8iIjpgPHA+PGEgaHJlZj0iJHtjKCQpfSI+U2lnbiBpbiB3aXRoIGVtYWlsIGFuZCBwYXNzd29yZDwvYT48L3A+YDtyZXR1cm4gdlgoIlNpZ24gaW4gdG8gSHlwZXJEWCIsYDxoMT5TaWduIGluIHRvIEh5cGVyRFg8L2gxPiR7UX0ke1p9YCl9dmFyIGcwPXtzdWJqZWN0TWlzc2luZzoiVGhlIGlkZW50aXR5IHByb3ZpZGVyIGRpZCBub3QgcmV0dXJuIGEgdXNlciBpZGVudGlmaWVyLiIsZW1haWxNaXNzaW5nOiJUaGUgaWRlbnRpdHkgcHJvdmlkZXIgZGlkIG5vdCByZXR1cm4gYW4gZW1haWwgYWRkcmVzcyBmb3IgeW91ciBhY2NvdW50LiIsZW1haWxJbnZhbGlkOiJZb3VyIGVtYWlsIGFkZHJlc3MgY29udGFpbnMgY2hhcmFjdGVycyBIeXBlckRYIHNpZ24taW4gZG9lcyBub3QgYWNjZXB0LiIsZW1haWxJblVzZToiQSBIeXBlckRYIGFjY291bnQgd2l0aCB5b3VyIGVtYWlsIGFkZHJlc3MgYWxyZWFkeSBiZWxvbmdzIHRvIGFub3RoZXIgc2lnbi1pbi4gQXNrIGFuIGFkbWluaXN0cmF0b3IuIixpbnN0YW5jZU5vdFJlYWR5OiJIeXBlckRYIGlzIHN0aWxsIGJlaW5nIHNldCB1cC4gVHJ5IGFnYWluIGluIGEgbWludXRlLiIsc3RvcmVVbmF2YWlsYWJsZToiSHlwZXJEWCBzaWduLWluIGlzIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlLiBUcnkgYWdhaW4gaW4gYSBtaW51dGUuIix1bmtub3duUHJvdmlkZXI6IlRoYXQgc2lnbi1pbiBwcm92aWRlciBpcyBub3QgY29uZmlndXJlZC4iLGVtYWlsTm90VmVyaWZpZWQ6IllvdXIgZW1haWwgYWRkcmVzcyBpcyBub3QgdmVyaWZpZWQgd2l0aCB0aGUgaWRlbnRpdHkgcHJvdmlkZXIuIixncm91cE5vdEFsbG93ZWQ6IllvdXIgYWNjb3VudCBpcyBub3QgaW4gYSBncm91cCB0aGF0IGlzIGFsbG93ZWQgdG8gdXNlIEh5cGVyRFguIixlbWFpbERvbWFpbk5vdEFsbG93ZWQ6IllvdXIgZW1haWwgYWRkcmVzcydzIGRvbWFpbiBpcyBub3QgYWxsb3dlZCB0byB1c2UgSHlwZXJEWC4iLG5vQWNjb3VudDoiVGhlcmUgaXMgbm8gSHlwZXJEWCBhY2NvdW50IGZvciB5b3UsIGFuZCB0aGlzIHByb3ZpZGVyIGRvZXMgbm90IGNyZWF0ZSBhY2NvdW50cy4iLHByb3ZpZGVyVW5hdmFpbGFibGU6IlRoZSBpZGVudGl0eSBwcm92aWRlciBjb3VsZCBub3QgYmUgcmVhY2hlZC4gVHJ5IGFnYWluIGluIGEgbW9tZW50LiIsbG9naW5FeHBpcmVkOiJUaGUgc2lnbi1pbiB0b29rIHRvbyBsb25nLiBTdGFydCBhZ2Fpbi4ifTtmdW5jdGlvbiB5MShYLCQpe2xldCBRPWcwW1hdPz8iU2lnbi1pbiBmYWlsZWQuIjtyZXR1cm4gdlgoIlNpZ24taW4gZmFpbGVkIixgPGgxPlNpZ24taW4gZmFpbGVkPC9oMT48cD4ke2MoUSl9PC9wPjxwPjxhIGhyZWY9IiR7YygkKX0iPlRyeSBhZ2FpbjwvYT48L3A+YCl9dmFyIEsxPSJ0eXBla3JvLW9pZGM6IixoMD0idHlwZWtyb19vaWRjX2lkZW50aXRpZXMiLGswPSJ0eXBla3JvX29pZGNfc3RhdGUiLEYxPSJ0ZWFtLWNsYWltIixtMD0xNTAwMCx1MD02MDAwMDtmdW5jdGlvbiB3MShYKXtyZXR1cm4gWD8uY29kZT09PTExMDAwfWZ1bmN0aW9uIGQwKFgpe3JldHVybiBOMShYLnBhdGgpfXZhciB4WD0iQXV0aGVudGljYXRpb24gbWV0aG9kIHBhc3N3b3JkIGlzIG5vdCBhbGxvd2VkIGJ5IHlvdXIgdGVhbSBhZG1pbi4iO2Z1bmN0aW9uIFYxKFgpe3JldHVybiBYLmRlZmF1bHQ/P1h9ZnVuY3Rpb24gaFgoWCl7bGV0ICQ9d1guY3JlYXRlUmVxdWlyZShnWC5qb2luKFgsImluZGV4LmpzIikpLFE9KE4pPT4kKE4pLFo9VjEoUSgicGFzc3BvcnQiKSksSD1WMShRKCIuL3JvdXRlcnMvYXBpL3Jvb3QuanMiKSksSj1WMShRKCIuL21vZGVscy91c2VyLmpzIikpLHo9VjEoUSgiLi9tb2RlbHMvdGVhbS5qcyIpKSxZPVEoIi4vY29udHJvbGxlcnMvdGVhbS5qcyIpLEI9USgiLi9zZXR1cERlZmF1bHRzLmpzIiksVz1RKCIuL2NvbmZpZy5qcyIpLEw9W1sicGFzc3BvcnQudXNlIix0eXBlb2YgWj8udXNlPT09ImZ1bmN0aW9uIl0sWyJwYXNzcG9ydC51bnVzZSIsdHlwZW9mIFo/LnVudXNlPT09ImZ1bmN0aW9uIl0sWyJwYXNzcG9ydC5hdXRoZW50aWNhdGUiLHR5cGVvZiBaPy5hdXRoZW50aWNhdGU9PT0iZnVuY3Rpb24iXSxbInBhc3Nwb3J0Ll9zdHJhdGVneSgnbG9jYWwnKSIsdHlwZW9mIFo/Ll9zdHJhdGVneT09PSJmdW5jdGlvbiImJnR5cGVvZiBaLl9zdHJhdGVneSgibG9jYWwiKT8uYXV0aGVudGljYXRlPT09ImZ1bmN0aW9uIl0sWyJyb3V0ZXJzL2FwaS9yb290IHJvdXRlciIsQXJyYXkuaXNBcnJheShIPy5zdGFjaykmJnR5cGVvZiBIPy5nZXQ9PT0iZnVuY3Rpb24iXSxbIm1vZGVscy91c2VyIix0eXBlb2YgSj8uZmluZE9uZT09PSJmdW5jdGlvbiImJnR5cGVvZiBKPy5jcmVhdGU9PT0iZnVuY3Rpb24iJiZ0eXBlb2YgSj8udXBkYXRlT25lPT09ImZ1bmN0aW9uIl0sWyJtb2RlbHMvdGVhbSIsdHlwZW9mIHo/LmZpbmQ9PT0iZnVuY3Rpb24iXSxbImNvbnRyb2xsZXJzL3RlYW0uY3JlYXRlVGVhbSIsdHlwZW9mIFkuY3JlYXRlVGVhbT09PSJmdW5jdGlvbiJdLFsic2V0dXBEZWZhdWx0cy5zZXR1cFRlYW1EZWZhdWx0cyIsdHlwZW9mIEIuc2V0dXBUZWFtRGVmYXVsdHM9PT0iZnVuY3Rpb24iXSxbImNvbmZpZy5GUk9OVEVORF9VUkwiLHR5cGVvZiBXLkZST05URU5EX1VSTD09PSJzdHJpbmcifHxXLkZST05URU5EX1VSTD09PXZvaWQgMF1dLmZpbHRlcigoWyxOXSk9PiFOKS5tYXAoKFtOXSk9Pk4pO2lmKEwubGVuZ3RoPjApdGhyb3cgRXJyb3IoYEh5cGVyRFggaG9vayBwb2ludChzKSBub3QgZm91bmQ6ICR7TC5qb2luKCIsICIpfWApO3JldHVybntwYXNzcG9ydDpaLHJvb3RSb3V0ZXI6SCxVc2VyOkosVGVhbTp6LGNyZWF0ZVRlYW06WS5jcmVhdGVUZWFtLHNldHVwVGVhbURlZmF1bHRzOkIuc2V0dXBUZWFtRGVmYXVsdHMsZnJvbnRlbmRVcmw6U3RyaW5nKFcuRlJPTlRFTkRfVVJMPz8iIikucmVwbGFjZSgvXC8rJC8sIiIpLGZyb250ZW5kUmVkaXJlY3RCYXNlOlN0cmluZyhXLkZST05URU5EX1JFRElSRUNUX0JBU0U/P1cuRlJPTlRFTkRfVVJMPz8iIikucmVwbGFjZSgvXC8rJC8sIiIpfX1mdW5jdGlvbiBjMChYLCQsUSxaKXtsZXQgSD1YLlVzZXIuZGIuY29sbGVjdGlvbihoMCksSj1YLlVzZXIuZGIuY29sbGVjdGlvbihrMCkseixZPSgpPT57aWYoej09PXZvaWQgMCl6PVByb21pc2UuYWxsKFtILmNyZWF0ZUluZGV4KHtwcm92aWRlcjoxLHN1YmplY3Q6MX0se3VuaXF1ZTohMCxuYW1lOiJwcm92aWRlcl9zdWJqZWN0In0pLEguY3JlYXRlSW5kZXgoe3VzZXJJZDoxfSx7dW5pcXVlOiEwLG5hbWU6InVzZXIifSldKS50aGVuKCgpPT57cmV0dXJufSwoVyk9Pnt0aHJvdyB6PXZvaWQgMCxaLmVycm9yKCJjb3VsZCBub3QgY3JlYXRlIHRoZSBpZGVudGl0eS1saW5rIGluZGV4ZXM7IE9JREMgc2lnbi1pbiBpcyByZWZ1c2VkIHVudGlsIHRoZXkgZXhpc3QiLHtlcnJvcjpTdHJpbmcoVyl9KSxuZXcgTygic3RvcmVVbmF2YWlsYWJsZSIsImlkZW50aXR5LWxpbmsgaW5kZXhlcyBhcmUgbm90IGluIHBsYWNlIil9KTtyZXR1cm4gen07WSgpLmNhdGNoKCgpPT57fSk7YXN5bmMgZnVuY3Rpb24gQihXKXtsZXQgSz0kKCkudGVhbUlkO2lmKEshPT12b2lkIDApe2lmKGF3YWl0IFguVGVhbS5maW5kQnlJZChLKT09PW51bGwpdGhyb3cgRXJyb3IoYGNvbmZpZ3VyZWQgdGVhbUlkICR7S30gZG9lcyBub3QgZXhpc3RgKTtyZXR1cm4gS31sZXQgTD1hc3luYygpPT5hd2FpdCBYLlRlYW0uZmluZCh7fSkuc2VsZWN0KCJfaWQiKS5saW1pdCgyKS5sZWFuKCksTj1hd2FpdCBMKCk7aWYoTi5sZW5ndGg9PT0xKXJldHVybiBOWzBdLl9pZC50b1N0cmluZygpO2lmKE4ubGVuZ3RoPjEpdGhyb3cgRXJyb3IoIm1vcmUgdGhhbiBvbmUgSHlwZXJEWCB0ZWFtIGV4aXN0czsgc2V0IHRlYW1JZCBpbiB0aGUgT0lEQyBjb25maWd1cmF0aW9uIik7aWYoIVEuY3JlYXRlVGVhbSl0aHJvdyBuZXcgTygiaW5zdGFuY2VOb3RSZWFkeSIsIm5vIEh5cGVyRFggdGVhbSBleGlzdHMgeWV0IGFuZCB0aGlzIHBsdWdpbiBkb2VzIG5vdCBjcmVhdGUgb25lIik7bGV0IF89KFQpPT5ULmxlbmd0aD09PTE/VFswXS5faWQudG9TdHJpbmcoKTp2b2lkIDA7dHJ5e2F3YWl0IEouaW5zZXJ0T25lKHtfaWQ6RjEsYXQ6bmV3IERhdGUsYnk6V30pfWNhdGNoKFQpe2lmKCF3MShUKSl0aHJvdyBUO2xldCBrPURhdGUubm93KCkrbTA7d2hpbGUoRGF0ZS5ub3coKTxrKXtsZXQgeD1fKGF3YWl0IEwoKSk7aWYoeCE9PXZvaWQgMClyZXR1cm4geDthd2FpdCBuZXcgUHJvbWlzZSgobyk9PnNldFRpbWVvdXQobywyNTApKX1sZXQgbD1hd2FpdCBKLmZpbmRPbmUoe19pZDpGMX0pLGE9bD8uYXQgaW5zdGFuY2VvZiBEYXRlP2wuYXQuZ2V0VGltZSgpOjA7aWYoRGF0ZS5ub3coKS1hPnUwKWF3YWl0IEouZGVsZXRlT25lKHtfaWQ6RjEsYXQ6bD8uYXR9KTt0aHJvdyBuZXcgTygiaW5zdGFuY2VOb3RSZWFkeSIsImFub3RoZXIgZmlyc3QgbG9naW4gaXMgY3JlYXRpbmcgdGhlIEh5cGVyRFggdGVhbSIpfWxldCB2O3RyeXt2PWF3YWl0IFguY3JlYXRlVGVhbSh7bmFtZTpgJHtXfSdzIFRlYW1gLGNvbGxlY3RvckF1dGhlbnRpY2F0aW9uRW5mb3JjZWQ6ITB9KX1jYXRjaChUKXtsZXQgaz1fKGF3YWl0IEwoKSk7aWYoayE9PXZvaWQgMClyZXR1cm4gazt0aHJvdyBhd2FpdCBKLmRlbGV0ZU9uZSh7X2lkOkYxfSksVH1sZXQgRT12Ll9pZC50b1N0cmluZygpO3JldHVybiBhd2FpdCBYLnNldHVwVGVhbURlZmF1bHRzKEUpLmNhdGNoKChUKT0+Wi5lcnJvcigic2V0dGluZyB1cCBkZWZhdWx0IGNvbm5lY3Rpb25zIGFuZCBzb3VyY2VzIGZvciB0aGUgbmV3IHRlYW0gZmFpbGVkIix7ZXJyb3I6U3RyaW5nKFQpfSkpLEV9cmV0dXJue2FzeW5jIGZpbmRMaW5rZWRVc2VySWQoVyxLKXthd2FpdCBZKCk7bGV0IEw9YXdhaXQgSC5maW5kT25lKHtwcm92aWRlcjpXLHN1YmplY3Q6S30pO3JldHVybiBMPT09bnVsbD9udWxsOlN0cmluZyhMLnVzZXJJZCl9LGFzeW5jIHVzZXJFeGlzdHMoVyl7cmV0dXJuIGF3YWl0IFguVXNlci5maW5kQnlJZChXKSE9PW51bGx9LGFzeW5jIGZpbmRVc2VySWRCeUVtYWlsKFcpe2xldCBLPWF3YWl0IFguVXNlci5maW5kT25lKHtlbWFpbDpXfSkuc2VsZWN0KCJfaWQiKS5sZWFuKCk7cmV0dXJuIEs9PT1udWxsP251bGw6U3RyaW5nKEsuX2lkKX0sYXN5bmMgdXNlckhhc0FueUxpbmsoVyl7cmV0dXJuIGF3YWl0IEguZmluZE9uZSh7dXNlcklkOld9KSE9PW51bGx9LGFzeW5jIGNyZWF0ZVVzZXIoVyxLKXtsZXQgTD1hd2FpdCBCKFcpO3RyeXtyZXR1cm4oYXdhaXQgWC5Vc2VyLmNyZWF0ZSh7ZW1haWw6VyxuYW1lOkssdGVhbTpMfSkpLl9pZC50b1N0cmluZygpfWNhdGNoKE4pe2lmKHcxKE4pKXRocm93IG5ldyB1O3Rocm93IE59fSxhc3luYyBsaW5rKFcsSyl7YXdhaXQgWSgpO2xldCBMPW5ldyBEYXRlO3RyeXthd2FpdCBILnVwZGF0ZU9uZSh7cHJvdmlkZXI6Vy5wcm92aWRlcixzdWJqZWN0Olcuc3ViamVjdH0seyRzZXQ6e3VzZXJJZDpLLGVtYWlsOlcuZW1haWwsbGFzdExvZ2luQXQ6TH0sJHNldE9uSW5zZXJ0OntjcmVhdGVkQXQ6TH19LHt1cHNlcnQ6ITB9KX1jYXRjaChOKXtpZighdzEoTikpdGhyb3cgTjtsZXQgXz1hd2FpdCBILmZpbmRPbmUoe3Byb3ZpZGVyOlcucHJvdmlkZXIsc3ViamVjdDpXLnN1YmplY3R9KTtpZihfIT09bnVsbCYmU3RyaW5nKF8udXNlcklkKT09PUspcmV0dXJuO3Rocm93IG5ldyB1fX0sYXN5bmMgdW5saW5rKFcsSyl7YXdhaXQgSC5kZWxldGVPbmUoe3Byb3ZpZGVyOlcsc3ViamVjdDpLfSl9LGFzeW5jIHRvdWNoKFcsSyl7YXdhaXQgSC51cGRhdGVPbmUoe3Byb3ZpZGVyOlcsc3ViamVjdDpLfSx7JHNldDp7bGFzdExvZ2luQXQ6bmV3IERhdGV9fSl9fX1mdW5jdGlvbiBrWChYLCQsUSxaPXtjcmVhdGVUZWFtOiEwfSl7bGV0IEgsSix6PSExLFk9bmV3IE1hcCxCPWMwKFgsKCk9Pkg/P2IxKCd7InByb3ZpZGVycyI6W119JyksWixRKTthc3luYyBmdW5jdGlvbiBXKEQsRil7aWYodHlwZW9mIEYhPT0ic3RyaW5nIilyZXR1cm47bGV0IE09YXdhaXQgQi5maW5kTGlua2VkVXNlcklkKEQsRik7aWYoTT09PW51bGwpcmV0dXJuO2F3YWl0IFguVXNlci51cGRhdGVPbmUoe19pZDpNfSx7JHNldDp7YWNjZXNzS2V5OmpYLnJhbmRvbVVVSUQoKX19KSxRLndhcm4oInJvdGF0ZWQgdGhlIGFjY2VzcyBrZXkgb2YgYSBsaW5rZWQgdXNlciB0aGUgcHJvdmlkZXIgbm8gbG9uZ2VyIGFkbWl0cyIse3Byb3ZpZGVyOkQsdXNlcklkOk19KX1sZXQgSz0oKT0+SD8uYXBpUGF0aFByZWZpeD8/Ii9hcGkiLEw9KCk9PmAke0soKX0vbG9naW4vb2lkY2AsTj0oRCk9PkIxKEQ/LnJlZGlyZWN0QmFzZVVybCxYLmZyb250ZW5kVXJsKSxfPSgpPT5OKEgpLHY9KCk9PkIxKFguZnJvbnRlbmRSZWRpcmVjdEJhc2UsSD8ucmVkaXJlY3RCYXNlVXJsKSxFPShEKT0+RDEodigpLEQpO2Z1bmN0aW9uIFQoRCl7cmV0dXJue25hbWU6YCR7SzF9JHtEfWAsYXV0aGVudGljYXRlKEYpe2xldCBNPVkuZ2V0KEQpO2lmKE09PT12b2lkIDApe3RoaXMuZmFpbCh7cmVhc29uOiJ1bmtub3duUHJvdmlkZXIifSw0MDQpO3JldHVybn0oYXN5bmMoKT0+e2xldCBDPUYuc2Vzc2lvbjtpZihDPT09dm9pZCAwKXRocm93IEVycm9yKCJIeXBlckRYIHNlc3Npb24gbWlkZGxld2FyZSBpcyBub3QgYWN0aXZlIik7aWYoRi5xdWVyeS5jb2RlPT09dm9pZCAwJiZGLnF1ZXJ5LmVycm9yPT09dm9pZCAwKXtsZXR7dXJsOm5YLHBlbmRpbmc6YVh9PWF3YWl0IE0uYmVnaW4oRzEoRi5xdWVyeS5yZXR1cm5UbykpO0MudHlwZWtyb09pZGNQZW5kaW5nPWFYLHRoaXMucmVkaXJlY3QoblgpO3JldHVybn1sZXQgUD1DLnR5cGVrcm9PaWRjUGVuZGluZztpZihkZWxldGUgQy50eXBla3JvT2lkY1BlbmRpbmcsUD09PXZvaWQgMCl7dGhpcy5mYWlsKHtyZWFzb246ImxvZ2luRXhwaXJlZCJ9LDQwMCk7cmV0dXJufWxldCBMMT1uZXcgVVJMKEYub3JpZ2luYWxVcmwsXygpfHwiaHR0cDovL3BsYWNlaG9sZGVyLmludmFsaWQiKSx3PWF3YWl0IE0uY29tcGxldGUoTDEsUCksZj1uMShNLmNvbmZpZyx3KTtpZighZi5hbGxvd2VkKXtpZihRLndhcm4oIk9JREMgbG9naW4gZGVuaWVkIix7cHJvdmlkZXI6RCxyZWFzb246Zi5yZWFzb259KSxmLnJlYXNvbiE9PSJzdWJqZWN0TWlzc2luZyIpYXdhaXQgVyhELHcuc3ViKTt0aGlzLmZhaWwoe3JlYXNvbjpmLnJlYXNvbixyZXR1cm5UbzpQLnJldHVyblRvfSw0MDMpO3JldHVybn1sZXQgcD1hd2FpdCBhMShCLE0uY29uZmlnLGYuaWRlbnRpdHkpO2lmKCJkZW5pZWQiaW4gcCl7US53YXJuKCJPSURDIGxvZ2luIGRlbmllZCIse3Byb3ZpZGVyOkQscmVhc29uOnAuZGVuaWVkLGVtYWlsOmYuaWRlbnRpdHkuZW1haWx9KSx0aGlzLmZhaWwoe3JlYXNvbjpwLmRlbmllZH0sNDAzKTtyZXR1cm59bGV0IGlYPWF3YWl0IFguVXNlci5maW5kQnlJZChwLnVzZXJJZCk7US5pbmZvKCJPSURDIGxvZ2luIix7cHJvdmlkZXI6RCxlbWFpbDpmLmlkZW50aXR5LmVtYWlsLG91dGNvbWU6cC5vdXRjb21lfSksdGhpcy5zdWNjZXNzKGlYLHtwcm92aWRlcjpELHJldHVyblRvOlAucmV0dXJuVG99KX0pKCkuY2F0Y2goKEMpPT57aWYoQyBpbnN0YW5jZW9mIE8pe1Eud2FybigiT0lEQyBsb2dpbiBmYWlsZWQiLHtwcm92aWRlcjpELHJlYXNvbjpDLnJlYXNvbixkZXRhaWw6Qy5tZXNzYWdlfSk7bGV0IFA9WyJwcm92aWRlclVuYXZhaWxhYmxlIiwiaW5zdGFuY2VOb3RSZWFkeSIsInN0b3JlVW5hdmFpbGFibGUiXS5pbmNsdWRlcyhDLnJlYXNvbik7dGhpcy5mYWlsKHtyZWFzb246Qy5yZWFzb259LFA/NTAzOjQwMCk7cmV0dXJufXRoaXMuZXJyb3IoQyl9KX19fWZ1bmN0aW9uIGsoRCl7bGV0IEY9bmV3IE1hcCxNPU4oRCk7Zm9yKGxldCBWIG9mIEQucHJvdmlkZXJzKXtsZXQgQz1EMShNLGAke0QuYXBpUGF0aFByZWZpeH0vbG9naW4vb2lkYy8ke1YuaWR9L2NhbGxiYWNrYCksUD1ZLmdldChWLmlkKTtGLnNldChWLmlkLFAhPT12b2lkIDAmJlAucmVkaXJlY3RVcmk9PT1DJiZKU09OLnN0cmluZ2lmeShQLmNvbmZpZyk9PT1KU09OLnN0cmluZ2lmeShWKT9QOm5ldyBqMShWLEMsRC5hbGxvd0luc2VjdXJlSHR0cCkpfWZvcihsZXQgViBvZiBZLmtleXMoKSlpZighRi5oYXMoVikpWC5wYXNzcG9ydC51bnVzZShgJHtLMX0ke1Z9YCk7Zm9yKGxldCBWIG9mIEYua2V5cygpKVgucGFzc3BvcnQudXNlKGAke0sxfSR7Vn1gLFQoVikpO2lmKFk9RixIPUQsbChEKSxELmFsbG93SW5zZWN1cmVIdHRwKVEud2FybigiYWxsb3dJbnNlY3VyZUh0dHAgaXMgb246IGlzc3VlcnMgYW5kIGNhbGxiYWNrcyBtYXkgdXNlIHBsYWluIGh0dHAuIFVzZSB0aGlzIG9ubHkgZm9yIHRlc3RzOyBpdCByZW1vdmVzIHRoZSBUTFMgcHJvdGVjdGlvbiB0aGUgSUQtdG9rZW4gY2hlY2tzIHJlbHkgb24uIik7Zm9yKGxldCBWIG9mIFkudmFsdWVzKCkpVi5hdXRob3JpemF0aW9uU2VydmVyKCkuY2F0Y2goKEMpPT5RLndhcm4oIk9JREMgZGlzY292ZXJ5IGZhaWxlZDsgd2lsbCByZXRyeSBvbiBkZW1hbmQiLHtwcm92aWRlcjpWLmNvbmZpZy5pZCxlcnJvcjpTdHJpbmcoQyl9KSl9ZnVuY3Rpb24gbChEKXtsZXQgRj1CMShYLmZyb250ZW5kVXJsKTtpZihOKEQpPT09IiIpe2xldCBNPVguZnJvbnRlbmRVcmw9PT0iIj8iaXMgbm90IHNldCI6ImlzIG5vdCBhIHZhbGlkIGh0dHAocykgYmFzZSBVUkwgKGFic29sdXRlLCB3aXRob3V0IGNyZWRlbnRpYWxzLCBxdWVyeSBvciBmcmFnbWVudCkiO1Eud2FybihgSHlwZXJEWCdzIEZST05URU5EX1VSTCAke019IGFuZCByZWRpcmVjdEJhc2VVcmwgaXMgbm90IHNldDogY2FsbGJhY2sgVVJMcyBhbmQgcmVkaXJlY3RzIGFyZSByZWxhdGl2ZS4gUHJvdmlkZXJzIHJlZnVzZSBhIHJlbGF0aXZlIGNhbGxiYWNrLCBhbmQgYmVoaW5kIGEgcmV2ZXJzZSBwcm94eSBIeXBlckRYJ3MgVUkgcmV3cml0ZXMgcmVsYXRpdmUgcmVkaXJlY3RzIHRvIHRoZSBBUEkgc2VydmVyJ3MgcG9ydC5gKTtyZXR1cm59aWYoRC5yZWRpcmVjdEJhc2VVcmwhPT12b2lkIDAmJkYhPT0iIil7bGV0IE09bmV3IFVSTChELnJlZGlyZWN0QmFzZVVybCkub3JpZ2luLFY9bmV3IFVSTChGKS5vcmlnaW47aWYoTSE9PVYpUS53YXJuKCJyZWRpcmVjdEJhc2VVcmwgYW5kIEh5cGVyRFgncyBGUk9OVEVORF9VUkwgaGF2ZSBkaWZmZXJlbnQgb3JpZ2luczogc2lnbi1pbiBjb21wbGV0ZXMsIGFuZCBzZXRzIGl0cyBzZXNzaW9uIGNvb2tpZSwgb24gcmVkaXJlY3RCYXNlVXJsJ3Mgb3JpZ2luLCB0aGVuIHNlbmRzIHRoZSBicm93c2VyIHRvIEZST05URU5EX1VSTCdzLCB3aGVyZSB0aGF0IHNlc3Npb24gaXMgbm90IHNlbnQuIFRoZXkgbXVzdCBzaGFyZSBhbiBvcmlnaW4uIix7cmVkaXJlY3RCYXNlT3JpZ2luOk0sZnJvbnRlbmRPcmlnaW46Vn0pfX1mdW5jdGlvbiBhKCl7bGV0IEQ7dHJ5e0Q9eVgucmVhZEZpbGVTeW5jKCQsInV0ZjgiKX1jYXRjaChGKXtpZigheil6PSEwLFEuZXJyb3IoSD09PXZvaWQgMD8iT0lEQyBjb25maWd1cmF0aW9uIHVucmVhZGFibGU7IG5vIHByb3ZpZGVycyBhY3RpdmUiOiJPSURDIGNvbmZpZ3VyYXRpb24gYmVjYW1lIHVucmVhZGFibGU7IGtlZXBpbmcgdGhlIHByZXZpb3VzIG9uZSIse3BhdGg6JCxlcnJvcjpTdHJpbmcoRil9KTtyZXR1cm4hMX1pZih6KXo9ITEsUS5pbmZvKCJPSURDIGNvbmZpZ3VyYXRpb24gcmVhZGFibGUgYWdhaW4iLHtwYXRoOiR9KTtpZihEPT09SilyZXR1cm4hMTtKPUQ7dHJ5e2soYjEoRCkpfWNhdGNoKEYpe3JldHVybiBRLmVycm9yKEg9PT12b2lkIDA/Ik9JREMgY29uZmlndXJhdGlvbiByZWplY3RlZCBhbmQgbm9uZSBoYXMgYmVlbiBhcHBsaWVkIHNpbmNlIHN0YXJ0OyBubyBwcm92aWRlcnMgYWN0aXZlIGFuZCBwYXNzd29yZCBsb2dpbiBpcyBhbGxvd2VkIjoiT0lEQyBjb25maWd1cmF0aW9uIHJlamVjdGVkOyBrZWVwaW5nIHRoZSBwcmV2aW91cyBvbmUiLHtlcnJvcjpTdHJpbmcoRil9KSwhMX1yZXR1cm4gUS5pbmZvKCJPSURDIGNvbmZpZ3VyYXRpb24gYXBwbGllZCIse3Byb3ZpZGVyczpbLi4uWS5rZXlzKCldLHBhc3N3b3JkTG9naW46SD8ucGFzc3dvcmRMb2dpbixtYXhTZXNzaW9uQWdlTXM6SD8ubWF4U2Vzc2lvbkFnZU1zfSksITB9bGV0IHg9WC5yb290Um91dGVyO2Z1bmN0aW9uIG8oRCl7eC51c2UoRCk7bGV0IEY9eC5zdGFjay5wb3AoKTt4LnN0YWNrLnVuc2hpZnQoRil9bygoRCxGLE0pPT57bGV0IFY9RC5zZXNzaW9uPy50eXBla3JvT2lkY0F1dGg7aWYoVj09PXZvaWQgMHx8RC51c2VyPT09dm9pZCAwfHxIPT09dm9pZCAwKXtNKCk7cmV0dXJufWlmKCEoSC5tYXhTZXNzaW9uQWdlTXM+MCYmRGF0ZS5ub3coKS1WLmF0PkgubWF4U2Vzc2lvbkFnZU1zKSYmWS5oYXMoVi5wcm92aWRlcikpe00oKTtyZXR1cm59RC5sb2dvdXQoKFApPT5NKFApKX0pO2xldCBoMT1YLnBhc3Nwb3J0Ll9zdHJhdGVneSgibG9jYWwiKSxjWD1oMS5hdXRoZW50aWNhdGUsazE9bmV3IFdlYWtTZXQ7aDEuYXV0aGVudGljYXRlPWZ1bmN0aW9uKEYsTSl7aWYoSCE9PXZvaWQgMCYmIUgucGFzc3dvcmRMb2dpbiYmIWsxLmhhcyhGKSl7dGhpcy5mYWlsKHttZXNzYWdlOnhYfSk7cmV0dXJufWNYLmNhbGwodGhpcyxGLE0pfTtsZXQgbFg9Wy9eXC9sb2dpblwvcGFzc3dvcmQkLywvXlwvcmVnaXN0ZXJcL3Bhc3N3b3JkJC8sL15cL3RlYW1cL3NldHVwXC9bXi9dKyQvXSxwWD1hc3luYygpPT4oYXdhaXQgWC5UZWFtLmZpbmQoe30pLnNlbGVjdCgiX2lkIikubGltaXQoMSkubGVhbigpKS5sZW5ndGg+MDtvKChELEYsTSk9PntpZihELm1ldGhvZCE9PSJQT1NUInx8SD09PXZvaWQgMHx8SC5wYXNzd29yZExvZ2luKXtNKCk7cmV0dXJufWxldCBWPWQwKEQpO2lmKCFsWC5zb21lKChQKT0+UC50ZXN0KFYpKSl7TSgpO3JldHVybn1sZXQgQz0oKT0+e2lmKEQuc2Vzc2lvbiE9PXZvaWQgMClELnNlc3Npb24ubWVzc2FnZXM9W3hYXTtGLnJlZGlyZWN0KDMwMyxFKCIvbG9naW4/ZXJyPXBhc3N3b3JkQXV0aE5vdEFsbG93ZWQiKSl9O2lmKFYhPT0iL3JlZ2lzdGVyL3Bhc3N3b3JkIil7QygpO3JldHVybn1sMShELFose3RlYW1FeGlzdHM6cFh9KS50aGVuKChQKT0+e2lmKCFQKXtDKCk7cmV0dXJufWsxLmFkZChEKSxNKCl9LChQKT0+e1Eud2FybigiY291bGQgbm90IGNoZWNrIGZvciBhbiBleGlzdGluZyB0ZWFtOyByZWZ1c2luZyB0aGUgcmVnaXN0cmF0aW9uIix7ZXJyb3I6U3RyaW5nKFApfSksQygpfSl9KSx4LmdldCgiL2xvZ2luL29pZGMiLChELEYpPT57bGV0IE09RzEoRC5xdWVyeS5yZXR1cm5UbyksVj1bLi4uWS52YWx1ZXMoKV07aWYoVi5sZW5ndGg9PT0xKXtsZXQgUD14MShMKCksVlswXS5jb25maWcuaWQsTSk7Ri5yZWRpcmVjdCgzMDIsRDEoXygpLFApKTtyZXR1cm59bGV0IEM9SD8ucGFzc3dvcmRMb2dpbj09PSExP3ZvaWQgMDpFKCIvbG9naW4iKTtGLnN0YXR1cyhWLmxlbmd0aD09PTA/NTAzOjIwMCkudHlwZSgiaHRtbCIpLnNlbmQoRVgoVi5tYXAoKFApPT4oe2xhYmVsOlAuY29uZmlnLmRpc3BsYXlOYW1lLGhyZWY6eDEoTCgpLFAuY29uZmlnLmlkLE0pfSkpLEMpKX0pO2xldCBtMT0oRCxGLE0pPT57bGV0IFY9RC5wYXJhbXMucHJvdmlkZXI/PyIiO2lmKCFZLmhhcyhWKSl7Ri5zdGF0dXMoNDA0KS50eXBlKCJodG1sIikuc2VuZCh5MSgidW5rbm93blByb3ZpZGVyIixMKCkpKTtyZXR1cm59WC5wYXNzcG9ydC5hdXRoZW50aWNhdGUoYCR7SzF9JHtWfWAsKEMsUCxMMSk9PntpZihDKXtNKEMpO3JldHVybn1sZXQgdz1MMT8/e307aWYoIVApe2xldCBmPXcucmVhc29uPT09InVua25vd25Qcm92aWRlciI/NDA0OlsicHJvdmlkZXJVbmF2YWlsYWJsZSIsImluc3RhbmNlTm90UmVhZHkiLCJzdG9yZVVuYXZhaWxhYmxlIl0uaW5jbHVkZXMody5yZWFzb24/PyIiKT81MDM6NDAzO0Yuc3RhdHVzKGYpLnR5cGUoImh0bWwiKS5zZW5kKHkxKHcucmVhc29uPz8idW5rbm93biIsTCgpKSk7cmV0dXJufUQubG9nSW4oUCwoZik9PntpZihmKXtNKGYpO3JldHVybn1pZihELnNlc3Npb24hPT12b2lkIDApRC5zZXNzaW9uLnR5cGVrcm9PaWRjQXV0aD17cHJvdmlkZXI6VixhdDpEYXRlLm5vdygpfTtGLnJlZGlyZWN0KDMwMixFKEcxKHcucmV0dXJuVG8pKSl9KX0pKEQsRixNKX07cmV0dXJuIHguZ2V0KCIvbG9naW4vb2lkYy86cHJvdmlkZXIiLG0xKSx4LmdldCgiL2xvZ2luL29pZGMvOnByb3ZpZGVyL2NhbGxiYWNrIixtMSksYSgpLHtyZWxvYWQ6YSxwcm92aWRlcklkczooKT0+Wy4uLlkua2V5cygpXX19dmFyIGwwPSJUWVBFS1JPX0hEWF9PSURDX0NPTkZJRyIscDA9IlRZUEVLUk9fSERYX09JRENfUkVMT0FEX1NFQ09ORFMiLGkwPSJUWVBFS1JPX0hEWF9PSURDX0NSRUFURV9URUFNIixuMD0vW1xcL11wYWNrYWdlc1tcXC9dYXBpW1xcL11idWlsZFtcXC9daW5kZXhcLmpzJC8saD17aW5mbzooWCwkKT0+Y29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoe2xldmVsOiJpbmZvIixwbHVnaW46InR5cGVrcm8tb2lkYyIsbWVzc2FnZTpYLC4uLiR9KSksd2FybjooWCwkKT0+Y29uc29sZS53YXJuKEpTT04uc3RyaW5naWZ5KHtsZXZlbDoid2FybiIscGx1Z2luOiJ0eXBla3JvLW9pZGMiLG1lc3NhZ2U6WCwuLi4kfSkpLGVycm9yOihYLCQpPT5jb25zb2xlLmVycm9yKEpTT04uc3RyaW5naWZ5KHtsZXZlbDoiZXJyb3IiLHBsdWdpbjoidHlwZWtyby1vaWRjIixtZXNzYWdlOlgsLi4uJH0pKX0sYTA9NjAwMDA7ZnVuY3Rpb24gbzAoWCwkKXtsZXQgUTt0cnl7UT11WC5yZWFscGF0aFN5bmMoTTEuZGlybmFtZSgkKSl9Y2F0Y2goQil7aC5lcnJvcigibm90IGluc3RhbGxlZDsgY291bGQgbm90IHJlc29sdmUgdGhlIEFQSSBidWlsZCBkaXJlY3RvcnkiLHtlcnJvcjpTdHJpbmcoQil9KTtyZXR1cm59bGV0IFo9TTEuam9pbihRLCJyb3V0ZXJzIiwiYXBpIiwicm9vdC5qcyIpLEg9ZFguZGVmYXVsdCxKPUguX2xvYWQsej0hMSxZPWZ1bmN0aW9uKFcsSyxMKXtsZXQgTj1KLmNhbGwodGhpcyxXLEssTCk7aWYoIXomJkguX2NhY2hlW1pdPy5sb2FkZWQ9PT0hMCl7aWYoej0hMCxILl9sb2FkPT09WSlILl9sb2FkPUo7dHJ5e2xldCBfPXByb2Nlc3MuZW52W2kwXSE9PSJmYWxzZSIsdj1fP3ZvaWQgMDpjMShwcm9jZXNzLmVudik7aWYoIV8mJnY9PT12b2lkIDApaC53YXJuKCJubyBpbml0aWFsLXVzZXIgYm9vdHN0cmFwIGNyZWRlbnRpYWxzOyB3aXRoIHBhc3N3b3JkTG9naW46IGZhbHNlLCBmaXJzdC1ydW4gcmVnaXN0cmF0aW9uIGlzIHJlZnVzZWQiKTtlbHNlIGlmKHYhPT12b2lkIDAmJlUxKHYucGFzc3dvcmRGaWxlKT09PXZvaWQgMCloLndhcm4oImluaXRpYWwtdXNlciBib290c3RyYXAgcGFzc3dvcmQgZmlsZSBpcyBhYnNlbnQgb3IgZW1wdHk7IHdpdGggcGFzc3dvcmRMb2dpbjogZmFsc2UsIGZpcnN0LXJ1biByZWdpc3RyYXRpb24gaXMgcmVmdXNlZCB1bnRpbCBpdCBhcHBlYXJzIix7cGFzc3dvcmRGaWxlOnYucGFzc3dvcmRGaWxlfSk7bGV0IEU9a1goaFgoUSksWCxoLHtjcmVhdGVUZWFtOl8sLi4udiE9PXZvaWQgMCYme2Jvb3RzdHJhcDp2fX0pLFQ9TnVtYmVyKHByb2Nlc3MuZW52W3AwXT8/IjE1Iik7c2V0SW50ZXJ2YWwoKCk9PkUucmVsb2FkKCksTWF0aC5tYXgoMSxOdW1iZXIuaXNGaW5pdGUoVCk/VDoxNSkqMTAwMCkudW5yZWYoKSxoLmluZm8oImluc3RhbGxlZCIse3Byb3ZpZGVyczpFLnByb3ZpZGVySWRzKCl9KX1jYXRjaChfKXtoLmVycm9yKCJub3QgaW5zdGFsbGVkOyBIeXBlckRYIGNvbnRpbnVlcyB3aXRob3V0IE9JREMiLHtlcnJvcjpTdHJpbmcoXyl9KX19cmV0dXJuIE59O0guX2xvYWQ9WSxzZXRUaW1lb3V0KCgpPT57aWYoIXopaC5lcnJvcigiSHlwZXJEWCBuZXZlciBsb2FkZWQgaXRzIHJvb3Qgcm91dGVyOyB0aGUgcGx1Z2luIHdhcyBub3QgaW5zdGFsbGVkIix7cm9vdFJvdXRlclBhdGg6Wn0pfSxhMCkudW5yZWYoKX12YXIgZzE9cHJvY2Vzcy5lbnZbbDBdLG1YPXByb2Nlc3MuYXJndlsxXT8/IiI7aWYoZzEhPT12b2lkIDAmJmcxLmxlbmd0aD4wJiZuMC50ZXN0KG1YKSlvMChnMSxtWCk7Cg==';
|
|
7
|
+
export const HYPERDX_OIDC_PLUGIN_BASE64 = 'LyohIFR5cGVLcm8gSHlwZXJEWCBPSURDIHBsdWdpbiDigJQgaHR0cHM6Ly9naXRodWIuY29tL3llaHVkYWNvaGVuL3R5cGVrcm8gKEFwYWNoZS0yLjApCiAqIEJ1bmRsZXMgb2F1dGg0d2ViYXBpIChodHRwczovL2dpdGh1Yi5jb20vcGFudmEvb2F1dGg0d2ViYXBpKToKICogVGhlIE1JVCBMaWNlbnNlIChNSVQpCiAqIAogKiBDb3B5cmlnaHQgKGMpIDIwMjIgRmlsaXAgU2tva2FuCiAqIAogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAogKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICogCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAogKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgogKiAKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQogKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCiAqIFNPRlRXQVJFLgogKi8KdmFyIEQwPU9iamVjdC5jcmVhdGU7dmFye2dldFByb3RvdHlwZU9mOkcwLGRlZmluZVByb3BlcnR5Om4xLGdldE93blByb3BlcnR5TmFtZXM6VjB9PU9iamVjdDt2YXIgTTA9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBVMCgkKXtyZXR1cm4gdGhpc1skXX12YXIgTDAsTjAsYjA9KCQsWCxRKT0+e3ZhciBaPSQhPW51bGwmJnR5cGVvZiAkPT09Im9iamVjdCI7aWYoWil7dmFyIHo9WD9MMD8/PW5ldyBXZWFrTWFwOk4wPz89bmV3IFdlYWtNYXAsVz16LmdldCgkKTtpZihXKXJldHVybiBXfVE9JCE9bnVsbD9EMChHMCgkKSk6e307bGV0IEo9WHx8ISR8fCEkLl9fZXNNb2R1bGU/bjEoUSwiZGVmYXVsdCIse3ZhbHVlOiQsZW51bWVyYWJsZTohMH0pOlE7Zm9yKGxldCBIIG9mIFYwKCQpKWlmKCFNMC5jYWxsKEosSCkpbjEoSixILHtnZXQ6VTAuYmluZCgkLEgpLGVudW1lcmFibGU6ITB9KTtpZihaKXouc2V0KCQsSik7cmV0dXJuIEp9O3ZhciB6MD1yZXF1aXJlKCJub2RlOmZzIiksSjA9YjAocmVxdWlyZSgibm9kZTptb2R1bGUiKSksYjE9cmVxdWlyZSgibm9kZTpwYXRoIik7dmFyIGU9cmVxdWlyZSgibm9kZTpjcnlwdG8iKSxvMT1yZXF1aXJlKCJub2RlOmZzIiksUzA9IlRZUEVLUk9fSERYX09JRENfQk9PVFNUUkFQX0VNQUlMIixQMD0iVFlQRUtST19IRFhfT0lEQ19CT09UU1RSQVBfUEFTU1dPUkRfRklMRSI7ZnVuY3Rpb24gdDEoJCl7bGV0IFg9JFtTMF0/LnRyaW0oKT8/IiIsUT0kW1AwXT8udHJpbSgpPz8iIjtpZihYLmxlbmd0aD09PTB8fFEubGVuZ3RoPT09MClyZXR1cm47cmV0dXJue2VtYWlsOlgscGFzc3dvcmRGaWxlOlF9fWZ1bmN0aW9uIFAxKCQpe2xldCBYO3RyeXtYPW8xLnJlYWRGaWxlU3luYygkLCJ1dGY4Iil9Y2F0Y2h7cmV0dXJufXJldHVybiBYLmxlbmd0aD09PTA/dm9pZCAwOlh9ZnVuY3Rpb24gQzEoJCl7cmV0dXJuICQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cLyskLywiIil9ZnVuY3Rpb24gQzAoJCxYKXtsZXQgUT0oWik9PmUuY3JlYXRlSGFzaCgic2hhMjU2IikudXBkYXRlKFosInV0ZjgiKS5kaWdlc3QoKTtyZXR1cm4gZS50aW1pbmdTYWZlRXF1YWwoUSgkKSxRKFgpKX1mdW5jdGlvbiBUMCgkLFgsUT1QMSl7aWYodHlwZW9mICQhPT0ib2JqZWN0Inx8JD09PW51bGwpcmV0dXJuITE7bGV0e2VtYWlsOloscGFzc3dvcmQ6en09JDtpZih0eXBlb2YgWiE9PSJzdHJpbmcifHx0eXBlb2YgeiE9PSJzdHJpbmciKXJldHVybiExO2xldCBXPVEoWC5wYXNzd29yZEZpbGUpO2lmKFc9PT12b2lkIDApcmV0dXJuITE7bGV0IEo9QzAoeixXKTtyZXR1cm4gWi50b0xvd2VyQ2FzZSgpPT09WC5lbWFpbC50b0xvd2VyQ2FzZSgpJiZKfWFzeW5jIGZ1bmN0aW9uIHMxKCQsWCxRKXtsZXQgWj1YLmJvb3RzdHJhcDtpZihYLmNyZWF0ZVRlYW18fFo9PT12b2lkIDApcmV0dXJuITE7aWYoJC5tZXRob2QhPT0iUE9TVCJ8fEMxKCQucGF0aCkhPT0iL3JlZ2lzdGVyL3Bhc3N3b3JkIilyZXR1cm4hMTtpZihhd2FpdCBRLnRlYW1FeGlzdHMoKSlyZXR1cm4hMTtyZXR1cm4gVDAoJC5ib2R5LFosUS5yZWFkUGFzc3dvcmQpfXZhciB0JD1yZXF1aXJlKCJub2RlOmNyeXB0byIpLHMkPXJlcXVpcmUoIm5vZGU6ZnMiKSxyJD1yZXF1aXJlKCJub2RlOm1vZHVsZSIpLGUkPXJlcXVpcmUoIm5vZGU6cGF0aCIpO2Z1bmN0aW9uICQxKC4uLiQpe2ZvcihsZXQgWCBvZiAkKXtpZihYPT09dm9pZCAwfHxYLnRyaW0oKT09PSIiKWNvbnRpbnVlO2xldCBRO3RyeXtRPW5ldyBVUkwoWC50cmltKCkpfWNhdGNoe2NvbnRpbnVlfWlmKFEucHJvdG9jb2whPT0iaHR0cHM6IiYmUS5wcm90b2NvbCE9PSJodHRwOiIpY29udGludWU7aWYoUS51c2VybmFtZSE9PSIifHxRLnBhc3N3b3JkIT09IiJ8fFEuc2VhcmNoIT09IiJ8fFEuaGFzaCE9PSIiKWNvbnRpbnVlO3JldHVybmAke1Eub3JpZ2lufSR7US5wYXRobmFtZS5yZXBsYWNlKC9cLyskLywiIil9YH1yZXR1cm4iIn1mdW5jdGlvbiBfMCgkKXtmb3IobGV0IFg9MDtYPCQubGVuZ3RoO1grKyl7bGV0IFE9JC5jaGFyQ29kZUF0KFgpO2lmKFE8PTMyfHxRPT09MTI3KXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIHUoJCl7cmV0dXJuICQuc3RhcnRzV2l0aCgiLyIpJiYhJC5zdGFydHNXaXRoKCIvLyIpJiYhJC5pbmNsdWRlcygiXFwiKSYmIV8wKCQpfWZ1bmN0aW9uIFgxKCQsWCl7cmV0dXJuYCR7JH0ke3UoWCk/WDoiLyJ9YH1mdW5jdGlvbiBUMSgkLFgsUSl7bGV0IFo9UT09PSIvIj8iIjpgP3JldHVyblRvPSR7ZW5jb2RlVVJJQ29tcG9uZW50KFEpfWA7cmV0dXJuYCR7JH0vJHtlbmNvZGVVUklDb21wb25lbnQoWCl9JHtafWB9Y2xhc3MgQyBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKCQpe3N1cGVyKCQpO3RoaXMubmFtZT0iT2lkY0NvbmZpZ0Vycm9yIn19dmFyIFIwPS9eW2EtejAtOV1bYS16MC05LV17MCw2Mn0kLyxxMD0vXihcZCspXHMqKG1zfHN8bXxofGQpJC8sSTA9e21zOjEsczoxMDAwLG06NjAwMDAsaDozNjAwMDAwLGQ6ODY0MDAwMDB9O2Z1bmN0aW9uIGYwKCQsWCl7aWYodHlwZW9mICQ9PT0ibnVtYmVyIiYmTnVtYmVyLmlzRmluaXRlKCQpJiYkPj0wKXJldHVybiAkKjEwMDA7aWYodHlwZW9mICQ9PT0ic3RyaW5nIil7bGV0IFE9cTAuZXhlYygkLnRyaW0oKSk7aWYoUSlyZXR1cm4gTnVtYmVyKFFbMV0pKkkwW1FbMl1dfXRocm93IG5ldyBDKGAke1h9IG11c3QgYmUgYSBkdXJhdGlvbiBsaWtlICIxMmgiLCAiMzBtIiBvciAiN2QiLCBvciBhIG51bWJlciBvZiBzZWNvbmRzIChnb3QgJHtKU09OLnN0cmluZ2lmeSgkKX0pYCl9ZnVuY3Rpb24gUTEoJCl7cmV0dXJuIHR5cGVvZiAkPT09Im9iamVjdCImJiQhPT1udWxsJiYhQXJyYXkuaXNBcnJheSgkKX1mdW5jdGlvbiBkKCQsWCxRKXtsZXQgWj0kW1hdO2lmKHR5cGVvZiBaIT09InN0cmluZyJ8fFoudHJpbSgpLmxlbmd0aD09PTApdGhyb3cgbmV3IEMoYCR7UX0uJHtYfSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZ2ApO3JldHVybiBafWZ1bmN0aW9uIHQoJCxYLFEsWil7bGV0IHo9JFtYXTtpZih6PT09dm9pZCAwKXJldHVybiBaO2lmKHR5cGVvZiB6IT09InN0cmluZyJ8fHoudHJpbSgpLmxlbmd0aD09PTApdGhyb3cgbmV3IEMoYCR7UX0uJHtYfSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZyB3aGVuIHNldGApO3JldHVybiB6fWZ1bmN0aW9uIHMoJCxYLFEsWil7bGV0IHo9JFtYXTtpZih6PT09dm9pZCAwKXJldHVybiBaO2lmKHR5cGVvZiB6IT09ImJvb2xlYW4iKXRocm93IG5ldyBDKGAke1F9LiR7WH0gbXVzdCBiZSBhIGJvb2xlYW5gKTtyZXR1cm4gen1mdW5jdGlvbiBfMSgkLFgpe2lmKCQ9PT12b2lkIDApcmV0dXJuW107aWYoIUFycmF5LmlzQXJyYXkoJCl8fCQuc29tZSgoUSk9PnR5cGVvZiBRIT09InN0cmluZyJ8fFEubGVuZ3RoPT09MCkpdGhyb3cgbmV3IEMoYCR7WH0gbXVzdCBiZSBhbiBhcnJheSBvZiBub24tZW1wdHkgc3RyaW5nc2ApO3JldHVybiAkfWZ1bmN0aW9uIFoxKCQsWCxRKXtsZXQgWj1PYmplY3Qua2V5cygkKS5maWx0ZXIoKHopPT4hWC5pbmNsdWRlcyh6KSk7aWYoWi5sZW5ndGg+MCl0aHJvdyBuZXcgQyhgJHtRfSBoYXMgdW5rbm93biBrZXkocykgJHtaLm1hcCgoeik9PkpTT04uc3RyaW5naWZ5KHopKS5qb2luKCIsICIpfTsgYWxsb3dlZDogJHtYLmpvaW4oIiwgIil9YCl9ZnVuY3Rpb24gcjEoJCxYLFEpe2xldCBaO3RyeXtaPW5ldyBVUkwoJCl9Y2F0Y2h7dGhyb3cgbmV3IEMoYCR7WH0gbXVzdCBiZSBhbiBhYnNvbHV0ZSBVUkwgKGdvdCAke0pTT04uc3RyaW5naWZ5KCQpfSlgKX1pZihaLnByb3RvY29sIT09Imh0dHBzOiImJiEoUSYmWi5wcm90b2NvbD09PSJodHRwOiIpKXRocm93IG5ldyBDKGAke1h9IG11c3QgdXNlIGh0dHBzIChnb3QgJHtKU09OLnN0cmluZ2lmeSgkKX0pYCk7cmV0dXJuICQucmVwbGFjZSgvXC8rJC8sIiIpfXZhciBPMD1bImlkIiwiZGlzcGxheU5hbWUiLCJpc3N1ZXIiLCJjbGllbnRJZCIsImNsaWVudFNlY3JldCIsInRva2VuRW5kcG9pbnRBdXRoTWV0aG9kIiwic2NvcGVzIiwiY2xhaW1zIiwiYWxsb3ciLCJyZXF1aXJlVmVyaWZpZWRFbWFpbCIsImxpbmtFeGlzdGluZ1VzZXJzQnlFbWFpbCIsImNyZWF0ZVVzZXJzIl07ZnVuY3Rpb24gQTAoJCxYLFEpe2xldCBaPWBwcm92aWRlcnNbJHtYfV1gO2lmKCFRMSgkKSl0aHJvdyBuZXcgQyhgJHtafSBtdXN0IGJlIGFuIG9iamVjdGApO1oxKCQsTzAsWik7bGV0IHo9ZCgkLCJpZCIsWik7aWYoIVIwLnRlc3QoeikpdGhyb3cgbmV3IEMoYCR7Wn0uaWQgbXVzdCBiZSBsb3dlcmNhc2UgbGV0dGVycywgZGlnaXRzIGFuZCBkYXNoZXMsIHN0YXJ0aW5nIHdpdGggYSBsZXR0ZXIgb3IgZGlnaXQgKGdvdCAke0pTT04uc3RyaW5naWZ5KHopfSlgKTtsZXQgVz0kLnRva2VuRW5kcG9pbnRBdXRoTWV0aG9kPz8iY2xpZW50X3NlY3JldF9iYXNpYyI7aWYoVyE9PSJjbGllbnRfc2VjcmV0X2Jhc2ljIiYmVyE9PSJjbGllbnRfc2VjcmV0X3Bvc3QiKXRocm93IG5ldyBDKGAke1p9LnRva2VuRW5kcG9pbnRBdXRoTWV0aG9kIG11c3QgYmUgImNsaWVudF9zZWNyZXRfYmFzaWMiIG9yICJjbGllbnRfc2VjcmV0X3Bvc3QiYCk7bGV0IEo9JC5zY29wZXM9PT12b2lkIDA/WyJvcGVuaWQiLCJlbWFpbCIsInByb2ZpbGUiXTpfMSgkLnNjb3BlcyxgJHtafS5zY29wZXNgKTtpZighSi5pbmNsdWRlcygib3BlbmlkIikpdGhyb3cgbmV3IEMoYCR7Wn0uc2NvcGVzIG11c3QgaW5jbHVkZSAib3BlbmlkImApO2xldCBIPSQuY2xhaW1zPz97fTtpZighUTEoSCkpdGhyb3cgbmV3IEMoYCR7Wn0uY2xhaW1zIG11c3QgYmUgYW4gb2JqZWN0YCk7WjEoSCxbImVtYWlsIiwiZ3JvdXBzIiwibmFtZSJdLGAke1p9LmNsYWltc2ApO2xldCBCPXtlbWFpbDp0KEgsImVtYWlsIixgJHtafS5jbGFpbXNgLCJlbWFpbCIpLGdyb3Vwczp0KEgsImdyb3VwcyIsYCR7Wn0uY2xhaW1zYCwiZ3JvdXBzIiksbmFtZTp0KEgsIm5hbWUiLGAke1p9LmNsYWltc2AsIm5hbWUiKX07aWYoIVExKCQuYWxsb3cpKXRocm93IG5ldyBDKGAke1p9LmFsbG93IGlzIHJlcXVpcmVkOiBzZXQgYWxsb3cuZ3JvdXBzIGFuZC9vciBhbGxvdy5lbWFpbERvbWFpbnMuIFdpdGhvdXQgYSBydWxlLCBldmVyeSBhY2NvdW50IHRoZSBwcm92aWRlciBjYW4gYXV0aGVudGljYXRlIHdvdWxkIGdldCBpbnRvIEh5cGVyRFguYCk7WjEoJC5hbGxvdyxbImdyb3VwcyIsImVtYWlsRG9tYWlucyJdLGAke1p9LmFsbG93YCk7bGV0IFk9e2dyb3VwczpfMSgkLmFsbG93Lmdyb3VwcyxgJHtafS5hbGxvdy5ncm91cHNgKSxlbWFpbERvbWFpbnM6XzEoJC5hbGxvdy5lbWFpbERvbWFpbnMsYCR7Wn0uYWxsb3cuZW1haWxEb21haW5zYCkubWFwKChWKT0+Vi50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL15ALywiIikpfTtpZihZLmdyb3Vwcy5sZW5ndGg9PT0wJiZZLmVtYWlsRG9tYWlucy5sZW5ndGg9PT0wKXRocm93IG5ldyBDKGAke1p9LmFsbG93IG11c3Qgc2V0IGF0IGxlYXN0IG9uZSBvZiBncm91cHMgb3IgZW1haWxEb21haW5zOyBhbiBlbXB0eSBydWxlIHdvdWxkIGFkbWl0IGV2ZXJ5IGFjY291bnQgdGhlIHByb3ZpZGVyIGNhbiBhdXRoZW50aWNhdGUuYCk7bGV0IEY9cygkLCJyZXF1aXJlVmVyaWZpZWRFbWFpbCIsWiwhMCksTD1zKCQsImxpbmtFeGlzdGluZ1VzZXJzQnlFbWFpbCIsWixGKTtpZihMJiYhRil0aHJvdyBuZXcgQyhgJHtafS5saW5rRXhpc3RpbmdVc2Vyc0J5RW1haWwgY2Fubm90IGJlIHRydWUgd2hlbiByZXF1aXJlVmVyaWZpZWRFbWFpbCBpcyBmYWxzZTogYW4gdW52ZXJpZmllZCBlbWFpbCBpcyBvbmx5IGEgY2xhaW0sIHNvIGxpbmtpbmcgYnkgaXQgd291bGQgbGV0IGFueW9uZSB3aG8gY2FuIHNldCB0aGVpciBlbWFpbCBhdCB0aGUgcHJvdmlkZXIgdGFrZSBvdmVyIHRoZSBIeXBlckRYIGFjY291bnQgdGhhdCBoYXMgaXQuYCk7cmV0dXJue2lkOnosZGlzcGxheU5hbWU6dCgkLCJkaXNwbGF5TmFtZSIsWix6KSxpc3N1ZXI6cjEoZCgkLCJpc3N1ZXIiLFopLGAke1p9Lmlzc3VlcmAsUSksY2xpZW50SWQ6ZCgkLCJjbGllbnRJZCIsWiksY2xpZW50U2VjcmV0OmQoJCwiY2xpZW50U2VjcmV0IixaKSx0b2tlbkVuZHBvaW50QXV0aE1ldGhvZDpXLHNjb3BlczpKLGNsYWltczpCLGFsbG93OlkscmVxdWlyZVZlcmlmaWVkRW1haWw6RixsaW5rRXhpc3RpbmdVc2Vyc0J5RW1haWw6TCxjcmVhdGVVc2VyczpzKCQsImNyZWF0ZVVzZXJzIixaLCEwKX19ZnVuY3Rpb24geDAoJCxYKXtsZXQgUT1kKCQsInJlZGlyZWN0QmFzZVVybCIsImNvbmZpZ3VyYXRpb24iKTtyMShRLCJjb25maWd1cmF0aW9uLnJlZGlyZWN0QmFzZVVybCIsWCk7bGV0IFo9bmV3IFVSTChRKTtpZihaLnVzZXJuYW1lIT09IiJ8fFoucGFzc3dvcmQhPT0iInx8US5pbmNsdWRlcygiPyIpfHxRLmluY2x1ZGVzKCIjIikpdGhyb3cgbmV3IEMoImNvbmZpZ3VyYXRpb24ucmVkaXJlY3RCYXNlVXJsIG11c3Qgbm90IGNvbnRhaW4gY3JlZGVudGlhbHMsIGEgcXVlcnkgb3IgYSBmcmFnbWVudCIpO3JldHVybmAke1oub3JpZ2lufSR7Wi5wYXRobmFtZS5yZXBsYWNlKC9cLyskLywiIil9YH12YXIgdjA9WyJwcm92aWRlcnMiLCJwYXNzd29yZExvZ2luIiwicGFzc3dvcmRMb2dpblBhdGgiLCJtYXhTZXNzaW9uQWdlIiwicmVkaXJlY3RCYXNlVXJsIiwiYXBpUGF0aFByZWZpeCIsInRlYW1JZCIsImFsbG93SW5zZWN1cmVIdHRwIl0sRTA9Ii9sb2dpbiI7ZnVuY3Rpb24gUjEoJCxYKXtpZigkPy5wYXNzd29yZExvZ2luPT09ITEpcmV0dXJuO3JldHVybiAkPy5wYXNzd29yZExvZ2luUGF0aD8/WD8/RTB9ZnVuY3Rpb24gcTEoJCl7bGV0IFg7dHJ5e1g9SlNPTi5wYXJzZSgkKX1jYXRjaChZKXtsZXQgRj0vcG9zaXRpb24gKFxkKykvLmV4ZWMoWS5tZXNzYWdlKT8uWzFdO3Rocm93IG5ldyBDKGBjb25maWd1cmF0aW9uIGlzIG5vdCB2YWxpZCBKU09OJHtGPT09dm9pZCAwPyIiOmAgKG5lYXIgY2hhcmFjdGVyICR7Rn0pYH1gKX1pZighUTEoWCkpdGhyb3cgbmV3IEMoImNvbmZpZ3VyYXRpb24gbXVzdCBiZSBhIEpTT04gb2JqZWN0Iik7WjEoWCx2MCwiY29uZmlndXJhdGlvbiIpO2xldCBRPXMoWCwiYWxsb3dJbnNlY3VyZUh0dHAiLCJjb25maWd1cmF0aW9uIiwhMSk7aWYoIUFycmF5LmlzQXJyYXkoWC5wcm92aWRlcnMpKXRocm93IG5ldyBDKCJjb25maWd1cmF0aW9uLnByb3ZpZGVycyBtdXN0IGJlIGFuIGFycmF5Iik7bGV0IFo9WC5wcm92aWRlcnMubWFwKChZLEYpPT5BMChZLEYsUSkpLHo9bmV3IFNldDtmb3IobGV0IFkgb2YgWil7aWYoei5oYXMoWS5pZCkpdGhyb3cgbmV3IEMoYHByb3ZpZGVyIGlkICR7SlNPTi5zdHJpbmdpZnkoWS5pZCl9IGlzIHVzZWQgdHdpY2VgKTt6LmFkZChZLmlkKX1sZXQgVz10KFgsImFwaVBhdGhQcmVmaXgiLCJjb25maWd1cmF0aW9uIiwiL2FwaSIpO2lmKCFXLnN0YXJ0c1dpdGgoIi8iKSl0aHJvdyBuZXcgQygnY29uZmlndXJhdGlvbi5hcGlQYXRoUHJlZml4IG11c3Qgc3RhcnQgd2l0aCAiLyInKTtsZXQgSj1YLnRlYW1JZD09PXZvaWQgMD92b2lkIDA6ZChYLCJ0ZWFtSWQiLCJjb25maWd1cmF0aW9uIik7aWYoSiE9PXZvaWQgMCYmIS9eWzAtOWEtZl17MjR9JC8udGVzdChKKSl0aHJvdyBuZXcgQygiY29uZmlndXJhdGlvbi50ZWFtSWQgbXVzdCBiZSBhIEh5cGVyRFggdGVhbSBpZCAoMjQgaGV4YWRlY2ltYWwgY2hhcmFjdGVycykiKTtsZXQgSD1YLnJlZGlyZWN0QmFzZVVybD09PXZvaWQgMD92b2lkIDA6eDAoWCxRKSxCPVgucGFzc3dvcmRMb2dpblBhdGg9PT12b2lkIDA/dm9pZCAwOmQoWCwicGFzc3dvcmRMb2dpblBhdGgiLCJjb25maWd1cmF0aW9uIik7aWYoQiE9PXZvaWQgMCYmIXUoQikpdGhyb3cgbmV3IEMoYGNvbmZpZ3VyYXRpb24ucGFzc3dvcmRMb2dpblBhdGggbXVzdCBiZSBhIHBhdGggb24gSHlwZXJEWCdzIG93biBvcmlnaW4sIHN0YXJ0aW5nIHdpdGggYSBzaW5nbGUgIi8iIChubyAiLy8iLCBiYWNrc2xhc2gsIHdoaXRlc3BhY2Ugb3IgY29udHJvbCBjaGFyYWN0ZXIpYCk7cmV0dXJue3Byb3ZpZGVyczpaLHBhc3N3b3JkTG9naW46cyhYLCJwYXNzd29yZExvZ2luIiwiY29uZmlndXJhdGlvbiIsITApLC4uLkIhPT12b2lkIDAmJntwYXNzd29yZExvZ2luUGF0aDpCfSxtYXhTZXNzaW9uQWdlTXM6WC5tYXhTZXNzaW9uQWdlPT09dm9pZCAwPzQzMjAwMDAwOmYwKFgubWF4U2Vzc2lvbkFnZSwiY29uZmlndXJhdGlvbi5tYXhTZXNzaW9uQWdlIiksYXBpUGF0aFByZWZpeDpXLnJlcGxhY2UoL1wvKyQvLCIiKSwuLi5IIT09dm9pZCAwJiZ7cmVkaXJlY3RCYXNlVXJsOkh9LC4uLkohPT12b2lkIDAmJnt0ZWFtSWQ6Sn0sYWxsb3dJbnNlY3VyZUh0dHA6UX19ZnVuY3Rpb24gajAoJCl7aWYoQXJyYXkuaXNBcnJheSgkKSlyZXR1cm4gJC5maWx0ZXIoKFgpPT50eXBlb2YgWD09PSJzdHJpbmciKTtpZih0eXBlb2YgJD09PSJzdHJpbmciJiYkLmxlbmd0aD4wKXJldHVyblskXTtyZXR1cm5bXX1mdW5jdGlvbiB5MCgkKXtyZXR1cm4gJD09PSEwfHwkPT09InRydWUifWZ1bmN0aW9uICQkKCQsWCl7bGV0IFE9WC5zdWI7aWYodHlwZW9mIFEhPT0ic3RyaW5nInx8US5sZW5ndGg9PT0wKXJldHVybnthbGxvd2VkOiExLHJlYXNvbjoic3ViamVjdE1pc3NpbmcifTtsZXQgWj1YWyQuY2xhaW1zLmVtYWlsXTtpZih0eXBlb2YgWiE9PSJzdHJpbmcifHxaLnRyaW0oKS5sZW5ndGg9PT0wKXJldHVybnthbGxvd2VkOiExLHJlYXNvbjoiZW1haWxNaXNzaW5nIn07aWYoIS9eW1x4MjEtXHg3ZV0rJC8udGVzdChaLnRyaW0oKSkpcmV0dXJue2FsbG93ZWQ6ITEscmVhc29uOiJlbWFpbEludmFsaWQifTtsZXQgej1aLnRyaW0oKS50b0xvd2VyQ2FzZSgpLFc9ei5sYXN0SW5kZXhPZigiQCIpO2lmKFc8PTB8fFc9PT16Lmxlbmd0aC0xKXJldHVybnthbGxvd2VkOiExLHJlYXNvbjoiZW1haWxNaXNzaW5nIn07aWYoJC5yZXF1aXJlVmVyaWZpZWRFbWFpbCYmIXkwKFguZW1haWxfdmVyaWZpZWQpKXJldHVybnthbGxvd2VkOiExLHJlYXNvbjoiZW1haWxOb3RWZXJpZmllZCJ9O2xldCBKPWowKFhbJC5jbGFpbXMuZ3JvdXBzXSk7aWYoJC5hbGxvdy5ncm91cHMubGVuZ3RoPjAmJiFKLnNvbWUoKFkpPT4kLmFsbG93Lmdyb3Vwcy5pbmNsdWRlcyhZKSkpcmV0dXJue2FsbG93ZWQ6ITEscmVhc29uOiJncm91cE5vdEFsbG93ZWQifTtsZXQgSD16LnNsaWNlKFcrMSk7aWYoJC5hbGxvdy5lbWFpbERvbWFpbnMubGVuZ3RoPjAmJiEkLmFsbG93LmVtYWlsRG9tYWlucy5pbmNsdWRlcyhIKSlyZXR1cm57YWxsb3dlZDohMSxyZWFzb246ImVtYWlsRG9tYWluTm90QWxsb3dlZCJ9O2xldCBCPVhbJC5jbGFpbXMubmFtZV07cmV0dXJue2FsbG93ZWQ6ITAsaWRlbnRpdHk6e3Byb3ZpZGVyOiQuaWQsc3ViamVjdDpRLGVtYWlsOnosbmFtZTp0eXBlb2YgQj09PSJzdHJpbmciJiZCLnRyaW0oKS5sZW5ndGg+MD9CLnRyaW0oKTp6LGdyb3VwczpKfX19Y2xhc3MgcCBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKCl7c3VwZXIoInRoZSBhY2NvdW50IGlzIGFscmVhZHkgbGlua2VkIHRvIGFub3RoZXIgc2lnbi1pbiIpO3RoaXMubmFtZT0iTGlua0NvbmZsaWN0RXJyb3IifX1hc3luYyBmdW5jdGlvbiBYJCgkLFgsUSl7dHJ5e3JldHVybiBhd2FpdCBlMSgkLFgsUSl9Y2F0Y2goWil7aWYoIShaIGluc3RhbmNlb2YgcCkpdGhyb3cgWjt0cnl7cmV0dXJuIGF3YWl0IGUxKCQsWCxRKX1jYXRjaCh6KXtpZih6IGluc3RhbmNlb2YgcClyZXR1cm57ZGVuaWVkOiJlbWFpbEluVXNlIn07dGhyb3cgen19fWFzeW5jIGZ1bmN0aW9uIGUxKCQsWCxRKXtsZXQgWj1hd2FpdCAkLmZpbmRMaW5rZWRVc2VySWQoUS5wcm92aWRlcixRLnN1YmplY3QpO2lmKFohPT1udWxsKXtpZihhd2FpdCAkLnVzZXJFeGlzdHMoWikpcmV0dXJuIGF3YWl0ICQudG91Y2goUS5wcm92aWRlcixRLnN1YmplY3QpLHt1c2VySWQ6WixvdXRjb21lOiJsaW5rZWQifTthd2FpdCAkLnVubGluayhRLnByb3ZpZGVyLFEuc3ViamVjdCl9bGV0IHo9YXdhaXQgJC5maW5kVXNlcklkQnlFbWFpbChRLmVtYWlsKTtpZih6IT09bnVsbCl7aWYoWC5saW5rRXhpc3RpbmdVc2Vyc0J5RW1haWwmJiFhd2FpdCAkLnVzZXJIYXNBbnlMaW5rKHopKXJldHVybiBhd2FpdCAkLmxpbmsoUSx6KSx7dXNlcklkOnosb3V0Y29tZToibGlua2VkQnlFbWFpbCJ9O3JldHVybntkZW5pZWQ6ImVtYWlsSW5Vc2UifX1pZighWC5jcmVhdGVVc2VycylyZXR1cm57ZGVuaWVkOiJub0FjY291bnQifTtsZXQgVz1hd2FpdCAkLmNyZWF0ZVVzZXIoUS5lbWFpbCxRLm5hbWUpO3JldHVybiBhd2FpdCAkLmxpbmsoUSxXKSx7dXNlcklkOlcsb3V0Y29tZToiY3JlYXRlZCJ9fXZhciBJMTtpZih0eXBlb2YgbmF2aWdhdG9yPiJ1Inx8IW5hdmlnYXRvci51c2VyQWdlbnQ/LnN0YXJ0c1dpdGg/LigiTW96aWxsYS81LjAgIikpSTE9Im9hdXRoNHdlYmFwaS92My44LjgiO2Z1bmN0aW9uIEIxKCQsWCl7aWYoJD09bnVsbClyZXR1cm4hMTt0cnl7cmV0dXJuICQgaW5zdGFuY2VvZiBYfHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoJClbU3ltYm9sLnRvU3RyaW5nVGFnXT09PVgucHJvdG90eXBlW1N5bWJvbC50b1N0cmluZ1RhZ119Y2F0Y2h7cmV0dXJuITF9fXZhciBxPSJFUlJfSU5WQUxJRF9BUkdfVkFMVUUiLEE9IkVSUl9JTlZBTElEX0FSR19UWVBFIjtmdW5jdGlvbiBTKCQsWCxRKXtsZXQgWj1UeXBlRXJyb3IoJCx7Y2F1c2U6UX0pO3JldHVybiBPYmplY3QuYXNzaWduKFose2NvZGU6WH0pLFp9dmFyIEsxPVN5bWJvbCgpLHcwPVN5bWJvbCgpLGcwPVN5bWJvbCgpLFkkPVN5bWJvbCgpLGgwPVN5bWJvbCgpLFEkPVN5bWJvbCgpLFI1PVN5bWJvbCgpLGswPW5ldyBUZXh0RW5jb2RlcixtMD1uZXcgVGV4dERlY29kZXI7ZnVuY3Rpb24gZygkKXtpZih0eXBlb2YgJD09PSJzdHJpbmciKXJldHVybiBrMC5lbmNvZGUoJCk7cmV0dXJuIG0wLmRlY29kZSgkKX12YXIgZjE7aWYoVWludDhBcnJheS5wcm90b3R5cGUudG9CYXNlNjQpZjE9KCQpPT57aWYoJCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSQ9bmV3IFVpbnQ4QXJyYXkoJCk7cmV0dXJuICQudG9CYXNlNjQoe2FscGhhYmV0OiJiYXNlNjR1cmwiLG9taXRQYWRkaW5nOiEwfSl9O2Vsc2UgZjE9KFgpPT57aWYoWCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKVg9bmV3IFVpbnQ4QXJyYXkoWCk7bGV0IFE9W107Zm9yKGxldCBaPTA7WjxYLmJ5dGVMZW5ndGg7Wis9MzI3NjgpUS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxYLnN1YmFycmF5KFosWiszMjc2OCkpKTtyZXR1cm4gYnRvYShRLmpvaW4oIiIpKS5yZXBsYWNlKC89L2csIiIpLnJlcGxhY2UoL1wrL2csIi0iKS5yZXBsYWNlKC9cLy9nLCJfIil9O3ZhciBPMTtpZihVaW50OEFycmF5LmZyb21CYXNlNjQpTzE9KCQpPT57dHJ5e3JldHVybiBVaW50OEFycmF5LmZyb21CYXNlNjQoJCx7YWxwaGFiZXQ6ImJhc2U2NHVybCJ9KX1jYXRjaChYKXt0aHJvdyBTKCJUaGUgaW5wdXQgdG8gYmUgZGVjb2RlZCBpcyBub3QgY29ycmVjdGx5IGVuY29kZWQuIixxLFgpfX07ZWxzZSBPMT0oJCk9Pnt0cnl7bGV0IFg9YXRvYigkLnJlcGxhY2UoLy0vZywiKyIpLnJlcGxhY2UoL18vZywiLyIpLnJlcGxhY2UoL1xzL2csIiIpKSxRPW5ldyBVaW50OEFycmF5KFgubGVuZ3RoKTtmb3IobGV0IFo9MDtaPFgubGVuZ3RoO1orKylRW1pdPVguY2hhckNvZGVBdChaKTtyZXR1cm4gUX1jYXRjaChYKXt0aHJvdyBTKCJUaGUgaW5wdXQgdG8gYmUgZGVjb2RlZCBpcyBub3QgY29ycmVjdGx5IGVuY29kZWQuIixxLFgpfX07ZnVuY3Rpb24gaigkKXtpZih0eXBlb2YgJD09PSJzdHJpbmciKXJldHVybiBPMSgkKTtyZXR1cm4gZjEoJCl9Y2xhc3MgZiBleHRlbmRzIEVycm9ye2NvZGU7Y29uc3RydWN0b3IoJCxYKXtzdXBlcigkLFgpO3RoaXMubmFtZT10aGlzLmNvbnN0cnVjdG9yLm5hbWUsdGhpcy5jb2RlPXk4LEVycm9yLmNhcHR1cmVTdGFja1RyYWNlPy4odGhpcyx0aGlzLmNvbnN0cnVjdG9yKX19Y2xhc3MgSCQgZXh0ZW5kcyBFcnJvcntjb2RlO2NvbnN0cnVjdG9yKCQsWCl7c3VwZXIoJCxYKTtpZih0aGlzLm5hbWU9dGhpcy5jb25zdHJ1Y3Rvci5uYW1lLFg/LmNvZGUpdGhpcy5jb2RlPVg/LmNvZGU7RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2U/Lih0aGlzLHRoaXMuY29uc3RydWN0b3IpfX1mdW5jdGlvbiBEKCQsWCxRKXtyZXR1cm4gbmV3IEgkKCQse2NvZGU6WCxjYXVzZTpRfSl9YXN5bmMgZnVuY3Rpb24gdTAoJCl7bGV0IFg7c3dpdGNoKCQua3R5KXtjYXNlIkVDIjpYPXtjcnY6JC5jcnYsa3R5OiQua3R5LHg6JC54LHk6JC55fTticmVhaztjYXNlIk9LUCI6WD17Y3J2OiQuY3J2LGt0eTokLmt0eSx4OiQueH07YnJlYWs7Y2FzZSJBS1AiOlg9e2FsZzokLmFsZyxrdHk6JC5rdHkscHViOiQucHVifTticmVhaztjYXNlIlJTQSI6WD17ZTokLmUsa3R5OiQua3R5LG46JC5ufTticmVhaztkZWZhdWx0OnRocm93IG5ldyBmKCJ1bnN1cHBvcnRlZCBKV0sga2V5IHR5cGUiLHtjYXVzZTokfSl9cmV0dXJuIGooYXdhaXQgY3J5cHRvLnN1YnRsZS5kaWdlc3QoIlNIQS0yNTYiLGcoSlNPTi5zdHJpbmdpZnkoWCkpKSl9ZnVuY3Rpb24gQiQoJCxYKXtpZighKCQgaW5zdGFuY2VvZiBDcnlwdG9LZXkpKXRocm93IFMoYCR7WH0gbXVzdCBiZSBhIENyeXB0b0tleWAsQSl9ZnVuY3Rpb24gZDAoJCxYKXtpZihCJCgkLFgpLCQudHlwZSE9PSJwcml2YXRlIil0aHJvdyBTKGAke1h9IG11c3QgYmUgYSBwcml2YXRlIENyeXB0b0tleWAscSl9ZnVuY3Rpb24gYzAoJCxYKXtpZihCJCgkLFgpLCQudHlwZSE9PSJwdWJsaWMiKXRocm93IFMoYCR7WH0gbXVzdCBiZSBhIHB1YmxpYyBDcnlwdG9LZXlgLHEpfWZ1bmN0aW9uIHoxKCQpe2lmKCQ9PT1udWxsfHx0eXBlb2YgJCE9PSJvYmplY3QifHxBcnJheS5pc0FycmF5KCQpKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIEskKCQpe2lmKEIxKCQsSGVhZGVycykpJD1PYmplY3QuZnJvbUVudHJpZXMoJC5lbnRyaWVzKCkpO2xldCBYPW5ldyBIZWFkZXJzKCQ/P3t9KTtpZihJMSYmIVguaGFzKCJ1c2VyLWFnZW50IikpWC5zZXQoInVzZXItYWdlbnQiLEkxKTtpZihYLmhhcygiYXV0aG9yaXphdGlvbiIpKXRocm93IFMoJyJvcHRpb25zLmhlYWRlcnMiIG11c3Qgbm90IGluY2x1ZGUgdGhlICJhdXRob3JpemF0aW9uIiBoZWFkZXIgbmFtZScscSk7cmV0dXJuIFh9ZnVuY3Rpb24gRiQoJCxYKXtpZihYIT09dm9pZCAwKXtpZih0eXBlb2YgWD09PSJmdW5jdGlvbiIpWD1YKCQuaHJlZik7aWYoIShYIGluc3RhbmNlb2YgQWJvcnRTaWduYWwpKXRocm93IFMoJyJvcHRpb25zLnNpZ25hbCIgbXVzdCByZXR1cm4gb3IgYmUgYW4gaW5zdGFuY2Ugb2YgQWJvcnRTaWduYWwnLEEpO3JldHVybiBYfXJldHVybn1mdW5jdGlvbiBEJCgkKXtpZigkLmluY2x1ZGVzKCIvLyIpKXJldHVybiAkLnJlcGxhY2UoIi8vIiwiLyIpO3JldHVybiAkfWZ1bmN0aW9uIGwwKCQsWCxRPSExKXtpZigkLnBhdGhuYW1lPT09Ii8iKSQucGF0aG5hbWU9WDtlbHNlICQucGF0aG5hbWU9RCQoYCR7WH0vJHtRPyQucGF0aG5hbWU6JC5wYXRobmFtZS5yZXBsYWNlKC8oXC8pJC8sIiIpfWApO3JldHVybiAkfWZ1bmN0aW9uIHAwKCQsWCl7cmV0dXJuICQucGF0aG5hbWU9RCQoYCR7JC5wYXRobmFtZX0vJHtYfWApLCR9YXN5bmMgZnVuY3Rpb24gaTAoJCxYLFEsWil7aWYoISgkIGluc3RhbmNlb2YgVVJMKSl0aHJvdyBTKGAiJHtYfSIgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBVUkxgLEEpO1QkKCQsWj8uW0sxXSE9PSEwKTtsZXQgej1RKG5ldyBVUkwoJC5ocmVmKSksVz1LJChaPy5oZWFkZXJzKTtyZXR1cm4gVy5zZXQoImFjY2VwdCIsImFwcGxpY2F0aW9uL2pzb24iKSwoWj8uW1kkXXx8ZmV0Y2gpKHouaHJlZix7Ym9keTp2b2lkIDAsaGVhZGVyczpPYmplY3QuZnJvbUVudHJpZXMoVy5lbnRyaWVzKCkpLG1ldGhvZDoiR0VUIixyZWRpcmVjdDoibWFudWFsIixzaWduYWw6RiQoeixaPy5zaWduYWwpfSl9YXN5bmMgZnVuY3Rpb24gRyQoJCxYKXtyZXR1cm4gaTAoJCwiaXNzdWVySWRlbnRpZmllciIsKFEpPT57c3dpdGNoKFg/LmFsZ29yaXRobSl7Y2FzZSB2b2lkIDA6Y2FzZSJvaWRjIjpwMChRLCIud2VsbC1rbm93bi9vcGVuaWQtY29uZmlndXJhdGlvbiIpO2JyZWFrO2Nhc2Uib2F1dGgyIjpsMChRLCIud2VsbC1rbm93bi9vYXV0aC1hdXRob3JpemF0aW9uLXNlcnZlciIpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgUygnIm9wdGlvbnMuYWxnb3JpdGhtIiBtdXN0IGJlICJvaWRjIiAoZGVmYXVsdCksIG9yICJvYXV0aDIiJyxxKX1yZXR1cm4gUX0sWCl9ZnVuY3Rpb24gSjEoJCxYLFEsWix6KXt0cnl7aWYodHlwZW9mICQhPT0ibnVtYmVyInx8IU51bWJlci5pc0Zpbml0ZSgkKSl0aHJvdyBTKGAke1F9IG11c3QgYmUgYSBudW1iZXJgLEEseik7aWYoJD4wKXJldHVybjtpZihYKXtpZigkIT09MCl0aHJvdyBTKGAke1F9IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyYCxxLHopO3JldHVybn10aHJvdyBTKGAke1F9IG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXJgLHEseil9Y2F0Y2goVyl7aWYoWil0aHJvdyBEKFcubWVzc2FnZSxaLHopO3Rocm93IFd9fWZ1bmN0aW9uIFIoJCxYLFEsWil7dHJ5e2lmKHR5cGVvZiAkIT09InN0cmluZyIpdGhyb3cgUyhgJHtYfSBtdXN0IGJlIGEgc3RyaW5nYCxBLFopO2lmKCQubGVuZ3RoPT09MCl0aHJvdyBTKGAke1h9IG11c3Qgbm90IGJlIGVtcHR5YCxxLFopfWNhdGNoKHope2lmKFEpdGhyb3cgRCh6Lm1lc3NhZ2UsUSxaKTt0aHJvdyB6fX1hc3luYyBmdW5jdGlvbiBWJCgkLFgpe2xldCBRPSQ7aWYoIShRIGluc3RhbmNlb2YgVVJMKSYmUSE9PVckKXRocm93IFMoJyJleHBlY3RlZElzc3VlcklkZW50aWZpZXIiIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgVVJMJyxBKTtpZighQjEoWCxSZXNwb25zZSkpdGhyb3cgUygnInJlc3BvbnNlIiBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIFJlc3BvbnNlJyxBKTtpZihYLnN0YXR1cyE9PTIwMCl0aHJvdyBEKCcicmVzcG9uc2UiIGlzIG5vdCBhIGNvbmZvcm0gQXV0aG9yaXphdGlvbiBTZXJ2ZXIgTWV0YWRhdGEgcmVzcG9uc2UgKHVuZXhwZWN0ZWQgSFRUUCBzdGF0dXMgY29kZSknLHkkLFgpO2cxKFgpO2xldCBaPWF3YWl0IGckKFgpO2lmKFIoWi5pc3N1ZXIsJyJyZXNwb25zZSIgYm9keSAiaXNzdWVyIiBwcm9wZXJ0eScsTix7Ym9keTpafSksUSE9PVckJiZuZXcgVVJMKFouaXNzdWVyKS5ocmVmIT09US5ocmVmKXRocm93IEQoJyJyZXNwb25zZSIgYm9keSAiaXNzdWVyIiBwcm9wZXJ0eSBkb2VzIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWQgdmFsdWUnLG04LHtleHBlY3RlZDpRLmhyZWYsYm9keTpaLGF0dHJpYnV0ZToiaXNzdWVyIn0pO3JldHVybiBafWZ1bmN0aW9uIE0kKCQpe24wKCQsImFwcGxpY2F0aW9uL2pzb24iKX1mdW5jdGlvbiBhMCgkLC4uLlgpe2xldCBRPScicmVzcG9uc2UiIGNvbnRlbnQtdHlwZSBtdXN0IGJlICc7aWYoWC5sZW5ndGg+Mil7bGV0IFo9WC5wb3AoKTtRKz1gJHtYLmpvaW4oIiwgIil9LCBvciAke1p9YH1lbHNlIGlmKFgubGVuZ3RoPT09MilRKz1gJHtYWzBdfSBvciAke1hbMV19YDtlbHNlIFErPVhbMF07cmV0dXJuIEQoUSxnOCwkKX1mdW5jdGlvbiBuMCgkLFgpe2lmKEw4KCQpIT09WCl0aHJvdyBhMCgkLFgpfWZ1bmN0aW9uIEYxKCl7cmV0dXJuIGooY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSgzMikpKX1mdW5jdGlvbiBVJCgpe3JldHVybiBGMSgpfWZ1bmN0aW9uIEwkKCl7cmV0dXJuIEYxKCl9ZnVuY3Rpb24gTiQoKXtyZXR1cm4gRjEoKX1hc3luYyBmdW5jdGlvbiBiJCgkKXtyZXR1cm4gUigkLCJjb2RlVmVyaWZpZXIiKSxqKGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KCJTSEEtMjU2IixnKCQpKSl9ZnVuY3Rpb24gbzAoJCl7c3dpdGNoKCQuYWxnb3JpdGhtLmhhc2gubmFtZSl7Y2FzZSJTSEEtMjU2IjpyZXR1cm4iUFMyNTYiO2Nhc2UiU0hBLTM4NCI6cmV0dXJuIlBTMzg0IjtjYXNlIlNIQS01MTIiOnJldHVybiJQUzUxMiI7ZGVmYXVsdDp0aHJvdyBuZXcgZigidW5zdXBwb3J0ZWQgUnNhSGFzaGVkS2V5QWxnb3JpdGhtIGhhc2ggbmFtZSIse2NhdXNlOiR9KX19ZnVuY3Rpb24gdDAoJCl7c3dpdGNoKCQuYWxnb3JpdGhtLmhhc2gubmFtZSl7Y2FzZSJTSEEtMjU2IjpyZXR1cm4iUlMyNTYiO2Nhc2UiU0hBLTM4NCI6cmV0dXJuIlJTMzg0IjtjYXNlIlNIQS01MTIiOnJldHVybiJSUzUxMiI7ZGVmYXVsdDp0aHJvdyBuZXcgZigidW5zdXBwb3J0ZWQgUnNhSGFzaGVkS2V5QWxnb3JpdGhtIGhhc2ggbmFtZSIse2NhdXNlOiR9KX19ZnVuY3Rpb24gczAoJCl7c3dpdGNoKCQuYWxnb3JpdGhtLm5hbWVkQ3VydmUpe2Nhc2UiUC0yNTYiOnJldHVybiJFUzI1NiI7Y2FzZSJQLTM4NCI6cmV0dXJuIkVTMzg0IjtjYXNlIlAtNTIxIjpyZXR1cm4iRVM1MTIiO2RlZmF1bHQ6dGhyb3cgbmV3IGYoInVuc3VwcG9ydGVkIEVjS2V5QWxnb3JpdGhtIG5hbWVkQ3VydmUiLHtjYXVzZTokfSl9fWZ1bmN0aW9uIHIwKCQpe3N3aXRjaCgkLmFsZ29yaXRobS5uYW1lKXtjYXNlIlJTQS1QU1MiOnJldHVybiBvMCgkKTtjYXNlIlJTQVNTQS1QS0NTMS12MV81IjpyZXR1cm4gdDAoJCk7Y2FzZSJFQ0RTQSI6cmV0dXJuIHMwKCQpO2Nhc2UiRWQyNTUxOSI6Y2FzZSJNTC1EU0EtNDQiOmNhc2UiTUwtRFNBLTY1IjpjYXNlIk1MLURTQS04NyI6cmV0dXJuICQuYWxnb3JpdGhtLm5hbWU7Y2FzZSJFZERTQSI6cmV0dXJuIkVkMjU1MTkiO2RlZmF1bHQ6dGhyb3cgbmV3IGYoInVuc3VwcG9ydGVkIENyeXB0b0tleSBhbGdvcml0aG0gbmFtZSIse2NhdXNlOiR9KX19ZnVuY3Rpb24gRTEoJCl7bGV0IFg9JD8uW3cwXTtyZXR1cm4gdHlwZW9mIFg9PT0ibnVtYmVyIiYmTnVtYmVyLmlzRmluaXRlKFgpP1g6MH1mdW5jdGlvbiBTJCgkKXtsZXQgWD0kPy5bZzBdO3JldHVybiB0eXBlb2YgWD09PSJudW1iZXIiJiZOdW1iZXIuaXNGaW5pdGUoWCkmJk1hdGguc2lnbihYKSE9PS0xP1g6MzB9ZnVuY3Rpb24gajEoKXtyZXR1cm4gTWF0aC5mbG9vcihEYXRlLm5vdygpLzEwMDApfWZ1bmN0aW9uIHkxKCQpe2lmKHR5cGVvZiAkIT09Im9iamVjdCJ8fCQ9PT1udWxsKXRocm93IFMoJyJhcyIgbXVzdCBiZSBhbiBvYmplY3QnLEEpO1IoJC5pc3N1ZXIsJyJhcy5pc3N1ZXIiJyl9ZnVuY3Rpb24gdzEoJCl7aWYodHlwZW9mICQhPT0ib2JqZWN0Inx8JD09PW51bGwpdGhyb3cgUygnImNsaWVudCIgbXVzdCBiZSBhbiBvYmplY3QnLEEpO1IoJC5jbGllbnRfaWQsJyJjbGllbnQuY2xpZW50X2lkIicpfWZ1bmN0aW9uIFokKCQpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoJCkucmVwbGFjZSgvKD86Wy1fLiF+KicoKV18JTIwKS9nLChYKT0+e3N3aXRjaChYKXtjYXNlIi0iOmNhc2UiXyI6Y2FzZSIuIjpjYXNlIiEiOmNhc2UifiI6Y2FzZSIqIjpjYXNlIiciOmNhc2UiKCI6Y2FzZSIpIjpyZXR1cm5gJSR7WC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfWA7Y2FzZSIlMjAiOnJldHVybiIrIjtkZWZhdWx0OnRocm93IEVycm9yKCl9fSl9ZnVuY3Rpb24gUCQoJCl7cmV0dXJuIFIoJCwnImNsaWVudFNlY3JldCInKSwoWCxRLFoseik9PntaLnNldCgiY2xpZW50X2lkIixRLmNsaWVudF9pZCksWi5zZXQoImNsaWVudF9zZWNyZXQiLCQpfX1mdW5jdGlvbiBDJCgkKXtyZXR1cm4gUigkLCciY2xpZW50U2VjcmV0IicpLChYLFEsWix6KT0+e2xldCBXPVokKFEuY2xpZW50X2lkKSxKPVokKCQpLEg9YnRvYShgJHtXfToke0p9YCk7ei5zZXQoImF1dGhvcml6YXRpb24iLGBCYXNpYyAke0h9YCl9fWFzeW5jIGZ1bmN0aW9uIGUwKCQsWCxRKXtpZighUS51c2FnZXMuaW5jbHVkZXMoInNpZ24iKSl0aHJvdyBTKCdDcnlwdG9LZXkgaW5zdGFuY2VzIHVzZWQgZm9yIHNpZ25pbmcgYXNzZXJ0aW9ucyBtdXN0IGluY2x1ZGUgInNpZ24iIGluIHRoZWlyICJ1c2FnZXMiJyxxKTtsZXQgWj1gJHtqKGcoSlNPTi5zdHJpbmdpZnkoJCkpKX0uJHtqKGcoSlNPTi5zdHJpbmdpZnkoWCkpKX1gLHo9aihhd2FpdCBjcnlwdG8uc3VidGxlLnNpZ24obDgoUSksUSxnKFopKSk7cmV0dXJuYCR7Wn0uJHt6fWB9dmFyIEExO2FzeW5jIGZ1bmN0aW9uICQ4KCQsWCl7bGV0e2t0eTpRLGU6WixuOnoseDpXLHk6SixjcnY6SCxwdWI6Qn09YXdhaXQgY3J5cHRvLnN1YnRsZS5leHBvcnRLZXkoImp3ayIsJCksWT17a3R5OlEsZTpaLG46eix4OlcseTpKLGNydjpILHB1YjpCfTtpZihRPT09IkFLUCIpWS5hbGc9WDtyZXR1cm4gQTEuc2V0KCQsWSksWX1hc3luYyBmdW5jdGlvbiBYOCgkLFgpe3JldHVybiBBMXx8PW5ldyBXZWFrTWFwLEExLmdldCgkKXx8JDgoJCxYKX12YXIgUTg9VVJMLnBhcnNlPygkLFgpPT5VUkwucGFyc2UoJCxYKTooJCxYKT0+e3RyeXtyZXR1cm4gbmV3IFVSTCgkLFgpfWNhdGNoe3JldHVybiBudWxsfX07ZnVuY3Rpb24gVCQoJCxYKXtpZihYJiYkLnByb3RvY29sIT09Imh0dHBzOiIpdGhyb3cgRCgib25seSByZXF1ZXN0cyB0byBIVFRQUyBhcmUgYWxsb3dlZCIsaDgsJCk7aWYoJC5wcm90b2NvbCE9PSJodHRwczoiJiYkLnByb3RvY29sIT09Imh0dHA6Iil0aHJvdyBEKCJvbmx5IEhUVFAgYW5kIEhUVFBTIHJlcXVlc3RzIGFyZSBhbGxvd2VkIixrOCwkKX1mdW5jdGlvbiB6JCgkLFgsUSxaKXtsZXQgejtpZih0eXBlb2YgJCE9PSJzdHJpbmcifHwhKHo9UTgoJCkpKXRocm93IEQoYGF1dGhvcml6YXRpb24gc2VydmVyIG1ldGFkYXRhIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCAke1E/YCJhcy5tdGxzX2VuZHBvaW50X2FsaWFzZXMuJHtYfSJgOmAiYXMuJHtYfSJgfWAsJD09PXZvaWQgMD91ODpkOCx7YXR0cmlidXRlOlE/YG10bHNfZW5kcG9pbnRfYWxpYXNlcy4ke1h9YDpYfSk7cmV0dXJuIFQkKHosWiksen1mdW5jdGlvbiBaOCgkLFgsUSxaKXtpZihRJiYkLm10bHNfZW5kcG9pbnRfYWxpYXNlcyYmWCBpbiAkLm10bHNfZW5kcG9pbnRfYWxpYXNlcylyZXR1cm4geiQoJC5tdGxzX2VuZHBvaW50X2FsaWFzZXNbWF0sWCxRLFopO3JldHVybiB6JCgkW1hdLFgsUSxaKX1jbGFzcyB6OHsjWDsjUTsjWjsjSjsjVzsjJDsjejtjb25zdHJ1Y3RvcigkLFgsUSl7aWYoZDAoWD8ucHJpdmF0ZUtleSwnIkRQb1AucHJpdmF0ZUtleSInKSxjMChYPy5wdWJsaWNLZXksJyJEUG9QLnB1YmxpY0tleSInKSwhWC5wdWJsaWNLZXkuZXh0cmFjdGFibGUpdGhyb3cgUygnIkRQb1AucHVibGljS2V5LmV4dHJhY3RhYmxlIiBtdXN0IGJlIHRydWUnLHEpO3RoaXMuI1c9UT8uW2gwXSx0aGlzLiNKPUUxKCQpLHRoaXMuI1E9WC5wcml2YXRlS2V5LHRoaXMuI1o9WC5wdWJsaWNLZXksRzEuYWRkKHRoaXMpfSNZKCQpe3RoaXMuIyR8fD1uZXcgTWFwO2xldCBYPXRoaXMuIyQuZ2V0KCQpO2lmKFgpdGhpcy4jJC5kZWxldGUoJCksdGhpcy4jJC5zZXQoJCxYKTtyZXR1cm4gWH0jSCgkLFgpe2lmKHRoaXMuIyR8fD1uZXcgTWFwLHRoaXMuIyQuZGVsZXRlKCQpLHRoaXMuIyQuc2l6ZT09PTEwMCl0aGlzLiMkLmRlbGV0ZSh0aGlzLiMkLmtleXMoKS5uZXh0KCkudmFsdWUpO3RoaXMuIyQuc2V0KCQsWCl9YXN5bmMgY2FsY3VsYXRlVGh1bWJwcmludCgpe2lmKCF0aGlzLiN6KXtsZXQgJD1hd2FpdCBjcnlwdG8uc3VidGxlLmV4cG9ydEtleSgiandrIix0aGlzLiNaKTt0aGlzLiN6fHw9YXdhaXQgdTAoJCl9cmV0dXJuIHRoaXMuI3p9YXN5bmMgYWRkUHJvb2YoJCxYLFEsWil7bGV0IHo9cjAodGhpcy4jUSk7dGhpcy4jWHx8PXthbGc6eix0eXA6ImRwb3Arand0Iixqd2s6YXdhaXQgWDgodGhpcy4jWix6KX07bGV0IFc9dGhpcy4jWSgkLm9yaWdpbiksSD17aWF0OmoxKCkrdGhpcy4jSixqdGk6RjEoKSxodG06USxub25jZTpXLGh0dTpgJHskLm9yaWdpbn0keyQucGF0aG5hbWV9YCxhdGg6Wj9qKGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KCJTSEEtMjU2IixnKFopKSk6dm9pZCAwfTt0aGlzLiNXPy4odGhpcy4jWCxIKSxYLnNldCgiZHBvcCIsYXdhaXQgZTAodGhpcy4jWCxILHRoaXMuI1EpKX1jYWNoZU5vbmNlKCQsWCl7dHJ5e2xldCBRPSQuaGVhZGVycy5nZXQoImRwb3Atbm9uY2UiKTtpZihRKXRoaXMuI0goWC5vcmlnaW4sUSl9Y2F0Y2h7fX19Y2xhc3MgXyQgZXh0ZW5kcyBFcnJvcntjYXVzZTtjb2RlO2Vycm9yO3N0YXR1cztlcnJvcl9kZXNjcmlwdGlvbjtyZXNwb25zZTtjb25zdHJ1Y3RvcigkLFgpe3N1cGVyKCQsWCk7dGhpcy5uYW1lPXRoaXMuY29uc3RydWN0b3IubmFtZSx0aGlzLmNvZGU9ajgsdGhpcy5jYXVzZT1YLmNhdXNlLHRoaXMuZXJyb3I9WC5jYXVzZS5lcnJvcix0aGlzLnN0YXR1cz1YLnJlc3BvbnNlLnN0YXR1cyx0aGlzLmVycm9yX2Rlc2NyaXB0aW9uPVguY2F1c2UuZXJyb3JfZGVzY3JpcHRpb24sT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInJlc3BvbnNlIix7ZW51bWVyYWJsZTohMSx2YWx1ZTpYLnJlc3BvbnNlfSksRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2U/Lih0aGlzLHRoaXMuY29uc3RydWN0b3IpfX1jbGFzcyBSJCBleHRlbmRzIEVycm9ye2NhdXNlO2NvZGU7ZXJyb3I7ZXJyb3JfZGVzY3JpcHRpb247Y29uc3RydWN0b3IoJCxYKXtzdXBlcigkLFgpO3RoaXMubmFtZT10aGlzLmNvbnN0cnVjdG9yLm5hbWUsdGhpcy5jb2RlPXc4LHRoaXMuY2F1c2U9WC5jYXVzZSx0aGlzLmVycm9yPVguY2F1c2UuZ2V0KCJlcnJvciIpLHRoaXMuZXJyb3JfZGVzY3JpcHRpb249WC5jYXVzZS5nZXQoImVycm9yX2Rlc2NyaXB0aW9uIik/P3ZvaWQgMCxFcnJvci5jYXB0dXJlU3RhY2tUcmFjZT8uKHRoaXMsdGhpcy5jb25zdHJ1Y3Rvcil9fWNsYXNzIHEkIGV4dGVuZHMgRXJyb3J7Y2F1c2U7Y29kZTtyZXNwb25zZTtzdGF0dXM7Y29uc3RydWN0b3IoJCxYKXtzdXBlcigkLFgpO3RoaXMubmFtZT10aGlzLmNvbnN0cnVjdG9yLm5hbWUsdGhpcy5jb2RlPUU4LHRoaXMuY2F1c2U9WC5jYXVzZSx0aGlzLnN0YXR1cz1YLnJlc3BvbnNlLnN0YXR1cyx0aGlzLnJlc3BvbnNlPVgucmVzcG9uc2UsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInJlc3BvbnNlIix7ZW51bWVyYWJsZTohMX0pLEVycm9yLmNhcHR1cmVTdGFja1RyYWNlPy4odGhpcyx0aGlzLmNvbnN0cnVjdG9yKX19dmFyIFcxPSJbYS16QS1aMC05ISMkJSZcXCdcXCpcXCtcXC1cXC5cXF5fYFxcfH5dKyIsSjg9IlthLXpBLVowLTlcXC1cXC5fXFx+XFwrXFwvXSs9ezAsMn0iLFc4PSciKCg/OlteIlxcXFxdfFxcXFxbXFxzXFxTXSkqKSInLFk4PSIoIitXMSsiKVxccyo9XFxzKiIrVzgsSDg9IigiK1cxKyIpXFxzKj1cXHMqKCIrVzErIikiLEI4PW5ldyBSZWdFeHAoIl5bLFxcc10qKCIrVzErIikiKSxLOD1uZXcgUmVnRXhwKCJeWyxcXHNdKiIrWTgrIlssXFxzXSooLiopIiksRjg9bmV3IFJlZ0V4cCgiXlssXFxzXSoiK0g4KyJbLFxcc10qKC4qKSIpLEQ4PW5ldyBSZWdFeHAoIl4oIitKOCsiKSg/OiR8WyxcXHNdKSguKikiKTtmdW5jdGlvbiBHOCgkKXtpZighQjEoJCxSZXNwb25zZSkpdGhyb3cgUygnInJlc3BvbnNlIiBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIFJlc3BvbnNlJyxBKTtsZXQgWD0kLmhlYWRlcnMuZ2V0KCJ3d3ctYXV0aGVudGljYXRlIik7aWYoWD09PW51bGwpcmV0dXJuO2xldCBRPVtdLFo9WDt3aGlsZShaKXtsZXQgej1aLm1hdGNoKEI4KSxXPXo/LlsiMSJdLnRvTG93ZXJDYXNlKCk7aWYoIVcpcmV0dXJuO2xldCBKPVouc3Vic3RyaW5nKHpbMF0ubGVuZ3RoKTtpZihKJiYhSi5tYXRjaCgvXltccyxdLykpcmV0dXJuO2xldCBIPUoubWF0Y2goL15ccysoLiopJC8pLEI9ISFIO1o9SD9IWzFdOnZvaWQgMDtsZXQgWT17fSxGO2lmKEIpd2hpbGUoWil7bGV0IFYsUDtpZih6PVoubWF0Y2goSzgpKXtpZihbLFYsUCxaXT16LFAuaW5jbHVkZXMoIlxcIikpUD1QLnJlcGxhY2UoL1xcKFtcc1xTXSkvZywiJDEiKTtZW1YudG9Mb3dlckNhc2UoKV09UDtjb250aW51ZX1pZih6PVoubWF0Y2goRjgpKXtbLFYsUCxaXT16LFlbVi50b0xvd2VyQ2FzZSgpXT1QO2NvbnRpbnVlfWlmKHo9Wi5tYXRjaChEOCkpe2lmKE9iamVjdC5rZXlzKFkpLmxlbmd0aClicmVhaztbLEYsWl09ejticmVha31yZXR1cm59ZWxzZSBaPUp8fHZvaWQgMDtsZXQgTD17c2NoZW1lOlcscGFyYW1ldGVyczpZfTtpZihGKUwudG9rZW42OD1GO1EucHVzaChMKX1pZighUS5sZW5ndGgpcmV0dXJuO3JldHVybiBRfWFzeW5jIGZ1bmN0aW9uIFY4KCQpe2lmKCQuc3RhdHVzPjM5OSYmJC5zdGF0dXM8NTAwKXtnMSgkKSxNJCgkKTt0cnl7bGV0IFg9YXdhaXQgJC5jbG9uZSgpLmpzb24oKTtpZih6MShYKSYmdHlwZW9mIFguZXJyb3I9PT0ic3RyaW5nIiYmWC5lcnJvci5sZW5ndGgpcmV0dXJuIFh9Y2F0Y2h7fX1yZXR1cm59YXN5bmMgZnVuY3Rpb24gTTgoJCxYLFEpe2lmKCQuc3RhdHVzIT09WCl7UDgoJCk7bGV0IFo7aWYoWj1hd2FpdCBWOCgkKSl0aHJvdyBhd2FpdCAkLmJvZHk/LmNhbmNlbCgpLG5ldyBfJCgic2VydmVyIHJlc3BvbmRlZCB3aXRoIGFuIGVycm9yIGluIHRoZSByZXNwb25zZSBib2R5Iix7Y2F1c2U6WixyZXNwb25zZTokfSk7dGhyb3cgRChgInJlc3BvbnNlIiBpcyBub3QgYSBjb25mb3JtICR7UX0gcmVzcG9uc2UgKHVuZXhwZWN0ZWQgSFRUUCBzdGF0dXMgY29kZSlgLHkkLCQpfX1mdW5jdGlvbiBVOCgkKXtpZighRzEuaGFzKCQpKXRocm93IFMoJyJvcHRpb25zLkRQb1AiIGlzIG5vdCBhIHZhbGlkIERQb1BIYW5kbGUnLHEpfXZhciBxNT1TeW1ib2woKTtmdW5jdGlvbiBMOCgkKXtyZXR1cm4gJC5oZWFkZXJzLmdldCgiY29udGVudC10eXBlIik/LnNwbGl0KCI7IilbMF19YXN5bmMgZnVuY3Rpb24gTjgoJCxYLFEsWix6LFcsSil7cmV0dXJuIGF3YWl0IFEoJCxYLHosVyksVy5zZXQoImNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04IiksKEo/LltZJF18fGZldGNoKShaLmhyZWYse2JvZHk6eixoZWFkZXJzOk9iamVjdC5mcm9tRW50cmllcyhXLmVudHJpZXMoKSksbWV0aG9kOiJQT1NUIixyZWRpcmVjdDoibWFudWFsIixzaWduYWw6RiQoWixKPy5zaWduYWwpfSl9YXN5bmMgZnVuY3Rpb24gYjgoJCxYLFEsWix6LFcpe2xldCBKPVo4KCQsInRva2VuX2VuZHBvaW50IixYLnVzZV9tdGxzX2VuZHBvaW50X2FsaWFzZXMsVz8uW0sxXSE9PSEwKTt6LnNldCgiZ3JhbnRfdHlwZSIsWik7bGV0IEg9SyQoVz8uaGVhZGVycyk7aWYoSC5zZXQoImFjY2VwdCIsImFwcGxpY2F0aW9uL2pzb24iKSxXPy5EUG9QIT09dm9pZCAwKVU4KFcuRFBvUCksYXdhaXQgVy5EUG9QLmFkZFByb29mKEosSCwiUE9TVCIpO2xldCBCPWF3YWl0IE44KCQsWCxRLEoseixILFcpO3JldHVybiBXPy5EUG9QPy5jYWNoZU5vbmNlKEIsSiksQn12YXIgSSQ9bmV3IFdlYWtNYXAsUzg9bmV3IFdlYWtNYXA7ZnVuY3Rpb24gRDEoJCl7aWYoISQuaWRfdG9rZW4pcmV0dXJuO2xldCBYPUkkLmdldCgkKTtpZighWCl0aHJvdyBTKCcicmVmIiB3YXMgYWxyZWFkeSBnYXJiYWdlIGNvbGxlY3RlZCBvciBkaWQgbm90IHJlc29sdmUgZnJvbSB0aGUgcHJvcGVyIHNvdXJjZXMnLHEpO3JldHVybiBYfWFzeW5jIGZ1bmN0aW9uIGYkKCQsWCxRLFoseixXKXtpZih5MSgkKSx3MShYKSwhQjEoUSxSZXNwb25zZSkpdGhyb3cgUygnInJlc3BvbnNlIiBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIFJlc3BvbnNlJyxBKTthd2FpdCBNOChRLDIwMCwiVG9rZW4gRW5kcG9pbnQiKSxnMShRKTtsZXQgSj1hd2FpdCBnJChRKTtpZihSKEouYWNjZXNzX3Rva2VuLCcicmVzcG9uc2UiIGJvZHkgImFjY2Vzc190b2tlbiIgcHJvcGVydHknLE4se2JvZHk6Sn0pLFIoSi50b2tlbl90eXBlLCcicmVzcG9uc2UiIGJvZHkgInRva2VuX3R5cGUiIHByb3BlcnR5JyxOLHtib2R5Okp9KSxKLnRva2VuX3R5cGU9Si50b2tlbl90eXBlLnRvTG93ZXJDYXNlKCksSi5leHBpcmVzX2luIT09dm9pZCAwKXtsZXQgSD10eXBlb2YgSi5leHBpcmVzX2luIT09Im51bWJlciI/cGFyc2VGbG9hdChKLmV4cGlyZXNfaW4pOkouZXhwaXJlc19pbjtKMShILCEwLCcicmVzcG9uc2UiIGJvZHkgImV4cGlyZXNfaW4iIHByb3BlcnR5JyxOLHtib2R5Okp9KSxKLmV4cGlyZXNfaW49SH1pZihKLnJlZnJlc2hfdG9rZW4hPT12b2lkIDApUihKLnJlZnJlc2hfdG9rZW4sJyJyZXNwb25zZSIgYm9keSAicmVmcmVzaF90b2tlbiIgcHJvcGVydHknLE4se2JvZHk6Sn0pO2lmKEouc2NvcGUhPT12b2lkIDAmJnR5cGVvZiBKLnNjb3BlIT09InN0cmluZyIpdGhyb3cgRCgnInJlc3BvbnNlIiBib2R5ICJzY29wZSIgcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZycsTix7Ym9keTpKfSk7aWYoSi5pZF90b2tlbiE9PXZvaWQgMCl7UihKLmlkX3Rva2VuLCcicmVzcG9uc2UiIGJvZHkgImlkX3Rva2VuIiBwcm9wZXJ0eScsTix7Ym9keTpKfSk7bGV0IEg9W107aWYoWC5yZXF1aXJlX2F1dGhfdGltZT09PSEwKUgucHVzaCgiYXV0aF90aW1lIik7aWYoWC5kZWZhdWx0X21heF9hZ2UhPT12b2lkIDApSjEoWC5kZWZhdWx0X21heF9hZ2UsITAsJyJjbGllbnQuZGVmYXVsdF9tYXhfYWdlIicpLEgucHVzaCgiYXV0aF90aW1lIik7aWYoWj8ubGVuZ3RoKUgucHVzaCguLi5aKTtsZXR7Y2xhaW1zOkIsand0Oll9PWF3YWl0IGY4KCQsWCxKLmlkX3Rva2VuLEgseik7QTgoWCxCKSxPOChCKSxTOC5zZXQoUSxZKSxJJC5zZXQoSixCKX1pZihXPy5bSi50b2tlbl90eXBlXSE9PXZvaWQgMClXW0oudG9rZW5fdHlwZV0oUSxKKTtlbHNlIGlmKEoudG9rZW5fdHlwZSE9PSJkcG9wIiYmSi50b2tlbl90eXBlIT09ImJlYXJlciIpdGhyb3cgbmV3IGYoInVuc3VwcG9ydGVkIGB0b2tlbl90eXBlYCB2YWx1ZSIse2NhdXNlOntib2R5Okp9fSk7cmV0dXJuIEp9ZnVuY3Rpb24gUDgoJCl7bGV0IFg7aWYoWD1HOCgkKSl0aHJvdyBuZXcgcSQoInNlcnZlciByZXNwb25kZWQgd2l0aCBhIGNoYWxsZW5nZSBpbiB0aGUgV1dXLUF1dGhlbnRpY2F0ZSBIVFRQIEhlYWRlciIse2NhdXNlOlgscmVzcG9uc2U6JH0pfWZ1bmN0aW9uIEM4KCQsWCl7aWYoQXJyYXkuaXNBcnJheShYLmNsYWltcy5hdWQpKXtpZighWC5jbGFpbXMuYXVkLmluY2x1ZGVzKCQpKXRocm93IEQoJ3VuZXhwZWN0ZWQgSldUICJhdWQiIChhdWRpZW5jZSkgY2xhaW0gdmFsdWUnLGkse2V4cGVjdGVkOiQsY2xhaW1zOlguY2xhaW1zLGNsYWltOiJhdWQifSl9ZWxzZSBpZihYLmNsYWltcy5hdWQhPT0kKXRocm93IEQoJ3VuZXhwZWN0ZWQgSldUICJhdWQiIChhdWRpZW5jZSkgY2xhaW0gdmFsdWUnLGkse2V4cGVjdGVkOiQsY2xhaW1zOlguY2xhaW1zLGNsYWltOiJhdWQifSk7cmV0dXJuIFh9ZnVuY3Rpb24gVDgoJCxYKXtsZXQgUT0kW284XT8uKFgpPz8kLmlzc3VlcjtpZihYLmNsYWltcy5pc3MhPT1RKXRocm93IEQoJ3VuZXhwZWN0ZWQgSldUICJpc3MiIChpc3N1ZXIpIGNsYWltIHZhbHVlJyxpLHtleHBlY3RlZDpRLGNsYWltczpYLmNsYWltcyxjbGFpbToiaXNzIn0pO3JldHVybiBYfXZhciBHMT1uZXcgV2Vha1NldDtmdW5jdGlvbiBfOCgkKXtyZXR1cm4gRzEuYWRkKCQpLCR9dmFyIFI4PVN5bWJvbCgpO2FzeW5jIGZ1bmN0aW9uIE8kKCQsWCxRLFoseixXLEope2lmKHkxKCQpLHcxKFgpLCFHMS5oYXMoWikpdGhyb3cgUygnImNhbGxiYWNrUGFyYW1ldGVycyIgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBVUkxTZWFyY2hQYXJhbXMgb2J0YWluZWQgZnJvbSAidmFsaWRhdGVBdXRoUmVzcG9uc2UoKSIsIG9yICJ2YWxpZGF0ZUp3dEF1dGhSZXNwb25zZSgpJyxxKTtSKHosJyJyZWRpcmVjdFVyaSInKTtsZXQgSD1jKFosImNvZGUiKTtpZighSCl0aHJvdyBEKCdubyBhdXRob3JpemF0aW9uIGNvZGUgaW4gImNhbGxiYWNrUGFyYW1ldGVycyInLE4pO2xldCBCPW5ldyBVUkxTZWFyY2hQYXJhbXMoSj8uYWRkaXRpb25hbFBhcmFtZXRlcnMpO2lmKEIuc2V0KCJyZWRpcmVjdF91cmkiLHopLEIuc2V0KCJjb2RlIixIKSxXIT09UjgpUihXLCciY29kZVZlcmlmaWVyIicpLEIuc2V0KCJjb2RlX3ZlcmlmaWVyIixXKTtyZXR1cm4gYjgoJCxYLFEsImF1dGhvcml6YXRpb25fY29kZSIsQixKKX12YXIgQSQ9e2F1ZDoiYXVkaWVuY2UiLGNfaGFzaDoiY29kZSBoYXNoIixjbGllbnRfaWQ6ImNsaWVudCBpZCIsZXhwOiJleHBpcmF0aW9uIHRpbWUiLGlhdDoiaXNzdWVkIGF0Iixpc3M6Imlzc3VlciIsanRpOiJqd3QgaWQiLG5vbmNlOiJub25jZSIsc19oYXNoOiJzdGF0ZSBoYXNoIixzdWI6InN1YmplY3QiLGF0aDoiYWNjZXNzIHRva2VuIGhhc2giLGh0bToiaHR0cCBtZXRob2QiLGh0dToiaHR0cCB1cmkiLGNuZjoiY29uZmlybWF0aW9uIixhdXRoX3RpbWU6ImF1dGhlbnRpY2F0aW9uIHRpbWUifTtmdW5jdGlvbiBxOCgkLFgpe2ZvcihsZXQgUSBvZiAkKWlmKFguY2xhaW1zW1FdPT09dm9pZCAwKXRocm93IEQoYEpXVCAiJHtRfSIgKCR7QSRbUV19KSBjbGFpbSBtaXNzaW5nYCxOLHtjbGFpbXM6WC5jbGFpbXN9KTtyZXR1cm4gWH1mdW5jdGlvbiBJOCgkLFgpe2lmKHR5cGVvZiBYLmNsYWltc1skXSE9PSJzdHJpbmciKXRocm93IEQoYHVuZXhwZWN0ZWQgSldUICIkeyR9IiAoJHtBJFskXX0pIGNsYWltIHR5cGVgLE4se2NsYWltczpYLmNsYWltc30pO3JldHVybiBYfWZ1bmN0aW9uIGY4KCQsWCxRLFoseil7cmV0dXJuIHA4KFEsaTguYmluZCh2b2lkIDAsWC5pZF90b2tlbl9zaWduZWRfcmVzcG9uc2VfYWxnLCQuaWRfdG9rZW5fc2lnbmluZ19hbGdfdmFsdWVzX3N1cHBvcnRlZCwiUlMyNTYiKSxFMShYKSxTJChYKSx6KS50aGVuKHE4LmJpbmQodm9pZCAwLFsiYXVkIiwiZXhwIiwiaWF0IiwiaXNzIiwic3ViIiwuLi5aXSkpLnRoZW4oVDguYmluZCh2b2lkIDAsJCkpLnRoZW4oQzguYmluZCh2b2lkIDAsWC5jbGllbnRfaWQpKS50aGVuKEk4LmJpbmQodm9pZCAwLCJzdWIiKSl9ZnVuY3Rpb24geCQoJCxYKXtpZihYPT09SDEpcmV0dXJuIFg7bGV0IFE9WD09PXZvaWQgMDtpZihRKVg9JC5kZWZhdWx0X21heF9hZ2U7aWYoWD09PXZvaWQgMClyZXR1cm4gSDE7cmV0dXJuIEoxKFgsITAsUT8nImNsaWVudC5kZWZhdWx0X21heF9hZ2UiJzonIm1heEFnZSIgYXJndW1lbnQnKSxYfWZ1bmN0aW9uIE84KCQpe2lmKCQuYXV0aF90aW1lIT09dm9pZCAwKUoxKCQuYXV0aF90aW1lLCEwLCdJRCBUb2tlbiAiYXV0aF90aW1lIiAoYXV0aGVudGljYXRpb24gdGltZSknLE4se2NsYWltczokfSl9ZnVuY3Rpb24gdiQoJCxYLFEpe2lmKFE9PT1IMSlyZXR1cm47bGV0IFo9ajEoKStFMSgkKSx6PVMkKCQpO2lmKFguYXV0aF90aW1lK1E8Wi16KXRocm93IEQoInRvbyBtdWNoIHRpbWUgaGFzIGVsYXBzZWQgc2luY2UgdGhlIGxhc3QgRW5kLVVzZXIgYXV0aGVudGljYXRpb24iLHYxLHtjbGFpbXM6WCxub3c6Wix0b2xlcmFuY2U6eixjbGFpbToiYXV0aF90aW1lIn0pfWZ1bmN0aW9uIEUkKCQsWCl7bGV0IFE9WD09PVkxP3ZvaWQgMDpYO2lmKCQubm9uY2UhPT1RKXRocm93IEQoJ3VuZXhwZWN0ZWQgSUQgVG9rZW4gIm5vbmNlIiBjbGFpbSB2YWx1ZScsaSx7ZXhwZWN0ZWQ6USxjbGFpbXM6JCxjbGFpbToibm9uY2UifSl9ZnVuY3Rpb24gQTgoJCxYKXtpZihBcnJheS5pc0FycmF5KFguYXVkKSYmWC5hdWQubGVuZ3RoIT09MSl7aWYoWC5henA9PT12b2lkIDApdGhyb3cgRCgnSUQgVG9rZW4gImF1ZCIgKGF1ZGllbmNlKSBjbGFpbSBpbmNsdWRlcyBhZGRpdGlvbmFsIHVudHJ1c3RlZCBhdWRpZW5jZXMnLGkse2NsYWltczpYLGNsYWltOiJhdWQifSk7aWYoWC5henAhPT0kLmNsaWVudF9pZCl0aHJvdyBEKCd1bmV4cGVjdGVkIElEIFRva2VuICJhenAiIChhdXRob3JpemVkIHBhcnR5KSBjbGFpbSB2YWx1ZScsaSx7ZXhwZWN0ZWQ6JC5jbGllbnRfaWQsY2xhaW1zOlgsY2xhaW06ImF6cCJ9KX19dmFyIFkxPVN5bWJvbCgpLEgxPVN5bWJvbCgpO2FzeW5jIGZ1bmN0aW9uIGokKCQsWCxRLFope2lmKHR5cGVvZiBaPy5leHBlY3RlZE5vbmNlPT09InN0cmluZyJ8fHR5cGVvZiBaPy5tYXhBZ2U9PT0ibnVtYmVyInx8Wj8ucmVxdWlyZUlkVG9rZW4pcmV0dXJuIHg4KCQsWCxRLFouZXhwZWN0ZWROb25jZSxaLm1heEFnZSxaW1EkXSxaLnJlY29nbml6ZWRUb2tlblR5cGVzKTtyZXR1cm4gdjgoJCxYLFEsWj8ubWF4QWdlLFo/LltRJF0sWj8ucmVjb2duaXplZFRva2VuVHlwZXMpfWFzeW5jIGZ1bmN0aW9uIHg4KCQsWCxRLFoseixXLEope2xldCBIPVtdO3N3aXRjaChaKXtjYXNlIHZvaWQgMDpaPVkxO2JyZWFrO2Nhc2UgWTE6YnJlYWs7ZGVmYXVsdDpSKFosJyJleHBlY3RlZE5vbmNlIiBhcmd1bWVudCcpLEgucHVzaCgibm9uY2UiKX1pZih6PXgkKFgseikseiE9PUgxKUgucHVzaCgiYXV0aF90aW1lIik7bGV0IEI9YXdhaXQgZiQoJCxYLFEsSCxXLEopO1IoQi5pZF90b2tlbiwnInJlc3BvbnNlIiBib2R5ICJpZF90b2tlbiIgcHJvcGVydHknLE4se2JvZHk6Qn0pO2xldCBZPUQxKEIpO3JldHVybiB2JChYLFkseiksRSQoWSxaKSxCfWFzeW5jIGZ1bmN0aW9uIHY4KCQsWCxRLFoseixXKXtsZXQgSj1hd2FpdCBmJCgkLFgsUSx2b2lkIDAseixXKSxIPUQxKEopO2lmKEgpdiQoWCxILHgkKFgsWikpLEUkKEgsWTEpO3JldHVybiBKfXZhciBFOD0iT0FVVEhfV1dXX0FVVEhFTlRJQ0FURV9DSEFMTEVOR0UiLGo4PSJPQVVUSF9SRVNQT05TRV9CT0RZX0VSUk9SIix5OD0iT0FVVEhfVU5TVVBQT1JURURfT1BFUkFUSU9OIix3OD0iT0FVVEhfQVVUSE9SSVpBVElPTl9SRVNQT05TRV9FUlJPUiI7dmFyIHgxPSJPQVVUSF9QQVJTRV9FUlJPUiIsTj0iT0FVVEhfSU5WQUxJRF9SRVNQT05TRSI7dmFyIGc4PSJPQVVUSF9SRVNQT05TRV9JU19OT1RfSlNPTiIseSQ9Ik9BVVRIX1JFU1BPTlNFX0lTX05PVF9DT05GT1JNIixoOD0iT0FVVEhfSFRUUF9SRVFVRVNUX0ZPUkJJRERFTiIsazg9Ik9BVVRIX1JFUVVFU1RfUFJPVE9DT0xfRk9SQklEREVOIix2MT0iT0FVVEhfSldUX1RJTUVTVEFNUF9DSEVDS19GQUlMRUQiLGk9Ik9BVVRIX0pXVF9DTEFJTV9DT01QQVJJU09OX0ZBSUxFRCIsbTg9Ik9BVVRIX0pTT05fQVRUUklCVVRFX0NPTVBBUklTT05fRkFJTEVEIjt2YXIgdTg9Ik9BVVRIX01JU1NJTkdfU0VSVkVSX01FVEFEQVRBIixkOD0iT0FVVEhfSU5WQUxJRF9TRVJWRVJfTUVUQURBVEEiO2Z1bmN0aW9uIGcxKCQpe2lmKCQuYm9keVVzZWQpdGhyb3cgUygnInJlc3BvbnNlIiBib2R5IGhhcyBiZWVuIHVzZWQgYWxyZWFkeScscSl9ZnVuY3Rpb24gSiQoJCl7bGV0e2FsZ29yaXRobTpYfT0kO2lmKHR5cGVvZiBYLm1vZHVsdXNMZW5ndGghPT0ibnVtYmVyInx8WC5tb2R1bHVzTGVuZ3RoPDIwNDgpdGhyb3cgbmV3IGYoYHVuc3VwcG9ydGVkICR7WC5uYW1lfSBtb2R1bHVzTGVuZ3RoYCx7Y2F1c2U6JH0pfWZ1bmN0aW9uIGM4KCQpe2xldHthbGdvcml0aG06WH09JDtzd2l0Y2goWC5uYW1lZEN1cnZlKXtjYXNlIlAtMjU2IjpyZXR1cm4iU0hBLTI1NiI7Y2FzZSJQLTM4NCI6cmV0dXJuIlNIQS0zODQiO2Nhc2UiUC01MjEiOnJldHVybiJTSEEtNTEyIjtkZWZhdWx0OnRocm93IG5ldyBmKCJ1bnN1cHBvcnRlZCBFQ0RTQSBuYW1lZEN1cnZlIix7Y2F1c2U6JH0pfX1mdW5jdGlvbiBsOCgkKXtzd2l0Y2goJC5hbGdvcml0aG0ubmFtZSl7Y2FzZSJFQ0RTQSI6cmV0dXJue25hbWU6JC5hbGdvcml0aG0ubmFtZSxoYXNoOmM4KCQpfTtjYXNlIlJTQS1QU1MiOnN3aXRjaChKJCgkKSwkLmFsZ29yaXRobS5oYXNoLm5hbWUpe2Nhc2UiU0hBLTI1NiI6Y2FzZSJTSEEtMzg0IjpjYXNlIlNIQS01MTIiOnJldHVybntuYW1lOiQuYWxnb3JpdGhtLm5hbWUsc2FsdExlbmd0aDpwYXJzZUludCgkLmFsZ29yaXRobS5oYXNoLm5hbWUuc2xpY2UoLTMpLDEwKT4+M307ZGVmYXVsdDp0aHJvdyBuZXcgZigidW5zdXBwb3J0ZWQgUlNBLVBTUyBoYXNoIG5hbWUiLHtjYXVzZTokfSl9Y2FzZSJSU0FTU0EtUEtDUzEtdjFfNSI6cmV0dXJuIEokKCQpLCQuYWxnb3JpdGhtLm5hbWU7Y2FzZSJNTC1EU0EtNDQiOmNhc2UiTUwtRFNBLTY1IjpjYXNlIk1MLURTQS04NyI6Y2FzZSJFZDI1NTE5IjpyZXR1cm4gJC5hbGdvcml0aG0ubmFtZX10aHJvdyBuZXcgZigidW5zdXBwb3J0ZWQgQ3J5cHRvS2V5IGFsZ29yaXRobSBuYW1lIix7Y2F1c2U6JH0pfWFzeW5jIGZ1bmN0aW9uIHA4KCQsWCxRLFoseil7bGV0ezA6VywxOkosbGVuZ3RoOkh9PSQuc3BsaXQoIi4iKTtpZihIPT09NSlpZih6IT09dm9pZCAwKSQ9YXdhaXQgeigkKSx7MDpXLDE6SixsZW5ndGg6SH09JC5zcGxpdCgiLiIpO2Vsc2UgdGhyb3cgbmV3IGYoIkpXRSBkZWNyeXB0aW9uIGlzIG5vdCBjb25maWd1cmVkIix7Y2F1c2U6JH0pO2lmKEghPT0zKXRocm93IEQoIkludmFsaWQgSldUIixOLCQpO2xldCBCO3RyeXtCPUpTT04ucGFyc2UoZyhqKFcpKSl9Y2F0Y2goTCl7dGhyb3cgRCgiZmFpbGVkIHRvIHBhcnNlIEpXVCBIZWFkZXIgYm9keSBhcyBiYXNlNjR1cmwgZW5jb2RlZCBKU09OIix4MSxMKX1pZighejEoQikpdGhyb3cgRCgiSldUIEhlYWRlciBtdXN0IGJlIGEgdG9wIGxldmVsIG9iamVjdCIsTiwkKTtpZihYKEIpLEIuY3JpdCE9PXZvaWQgMCl0aHJvdyBuZXcgZignbm8gSldUICJjcml0IiBoZWFkZXIgcGFyYW1ldGVyIGV4dGVuc2lvbnMgYXJlIHN1cHBvcnRlZCcse2NhdXNlOntoZWFkZXI6Qn19KTtsZXQgWTt0cnl7WT1KU09OLnBhcnNlKGcoaihKKSkpfWNhdGNoKEwpe3Rocm93IEQoImZhaWxlZCB0byBwYXJzZSBKV1QgUGF5bG9hZCBib2R5IGFzIGJhc2U2NHVybCBlbmNvZGVkIEpTT04iLHgxLEwpfWlmKCF6MShZKSl0aHJvdyBEKCJKV1QgUGF5bG9hZCBtdXN0IGJlIGEgdG9wIGxldmVsIG9iamVjdCIsTiwkKTtsZXQgRj1qMSgpK1E7aWYoWS5leHAhPT12b2lkIDApe2lmKHR5cGVvZiBZLmV4cCE9PSJudW1iZXIiKXRocm93IEQoJ3VuZXhwZWN0ZWQgSldUICJleHAiIChleHBpcmF0aW9uIHRpbWUpIGNsYWltIHR5cGUnLE4se2NsYWltczpZfSk7aWYoWS5leHA8PUYtWil0aHJvdyBEKCd1bmV4cGVjdGVkIEpXVCAiZXhwIiAoZXhwaXJhdGlvbiB0aW1lKSBjbGFpbSB2YWx1ZSwgZXhwaXJhdGlvbiBpcyBwYXN0IGN1cnJlbnQgdGltZXN0YW1wJyx2MSx7Y2xhaW1zOlksbm93OkYsdG9sZXJhbmNlOlosY2xhaW06ImV4cCJ9KX1pZihZLmlhdCE9PXZvaWQgMCl7aWYodHlwZW9mIFkuaWF0IT09Im51bWJlciIpdGhyb3cgRCgndW5leHBlY3RlZCBKV1QgImlhdCIgKGlzc3VlZCBhdCkgY2xhaW0gdHlwZScsTix7Y2xhaW1zOll9KX1pZihZLmlzcyE9PXZvaWQgMCl7aWYodHlwZW9mIFkuaXNzIT09InN0cmluZyIpdGhyb3cgRCgndW5leHBlY3RlZCBKV1QgImlzcyIgKGlzc3VlcikgY2xhaW0gdHlwZScsTix7Y2xhaW1zOll9KX1pZihZLm5iZiE9PXZvaWQgMCl7aWYodHlwZW9mIFkubmJmIT09Im51bWJlciIpdGhyb3cgRCgndW5leHBlY3RlZCBKV1QgIm5iZiIgKG5vdCBiZWZvcmUpIGNsYWltIHR5cGUnLE4se2NsYWltczpZfSk7aWYoWS5uYmY+RitaKXRocm93IEQoJ3VuZXhwZWN0ZWQgSldUICJuYmYiIChub3QgYmVmb3JlKSBjbGFpbSB2YWx1ZScsdjEse2NsYWltczpZLG5vdzpGLHRvbGVyYW5jZTpaLGNsYWltOiJuYmYifSl9aWYoWS5hdWQhPT12b2lkIDApe2lmKHR5cGVvZiBZLmF1ZCE9PSJzdHJpbmciJiYhQXJyYXkuaXNBcnJheShZLmF1ZCkpdGhyb3cgRCgndW5leHBlY3RlZCBKV1QgImF1ZCIgKGF1ZGllbmNlKSBjbGFpbSB0eXBlJyxOLHtjbGFpbXM6WX0pfXJldHVybntoZWFkZXI6QixjbGFpbXM6WSxqd3Q6JH19ZnVuY3Rpb24gaTgoJCxYLFEsWil7aWYoJCE9PXZvaWQgMCl7aWYodHlwZW9mICQ9PT0ic3RyaW5nIj9aLmFsZyE9PSQ6ISQuaW5jbHVkZXMoWi5hbGcpKXRocm93IEQoJ3VuZXhwZWN0ZWQgSldUICJhbGciIGhlYWRlciBwYXJhbWV0ZXInLE4se2hlYWRlcjpaLGV4cGVjdGVkOiQscmVhc29uOiJjbGllbnQgY29uZmlndXJhdGlvbiJ9KTtyZXR1cm59aWYoQXJyYXkuaXNBcnJheShYKSl7aWYoIVguaW5jbHVkZXMoWi5hbGcpKXRocm93IEQoJ3VuZXhwZWN0ZWQgSldUICJhbGciIGhlYWRlciBwYXJhbWV0ZXInLE4se2hlYWRlcjpaLGV4cGVjdGVkOlgscmVhc29uOiJhdXRob3JpemF0aW9uIHNlcnZlciBtZXRhZGF0YSJ9KTtyZXR1cm59aWYoUSE9PXZvaWQgMCl7aWYodHlwZW9mIFE9PT0ic3RyaW5nIj9aLmFsZyE9PVE6dHlwZW9mIFE9PT0iZnVuY3Rpb24iPyFRKFouYWxnKTohUS5pbmNsdWRlcyhaLmFsZykpdGhyb3cgRCgndW5leHBlY3RlZCBKV1QgImFsZyIgaGVhZGVyIHBhcmFtZXRlcicsTix7aGVhZGVyOlosZXhwZWN0ZWQ6USxyZWFzb246ImRlZmF1bHQgdmFsdWUifSk7cmV0dXJufXRocm93IEQoJ21pc3NpbmcgY2xpZW50IG9yIHNlcnZlciBjb25maWd1cmF0aW9uIHRvIHZlcmlmeSB1c2VkIEpXVCAiYWxnIiBoZWFkZXIgcGFyYW1ldGVyJyx2b2lkIDAse2NsaWVudDokLGlzc3VlcjpYLGZhbGxiYWNrOlF9KX1mdW5jdGlvbiBjKCQsWCl7bGV0ezA6USxsZW5ndGg6Wn09JC5nZXRBbGwoWCk7aWYoWj4xKXRocm93IEQoYCIke1h9IiBwYXJhbWV0ZXIgbXVzdCBiZSBwcm92aWRlZCBvbmx5IG9uY2VgLE4pO3JldHVybiBRfXZhciBhOD1TeW1ib2woKSxuOD1TeW1ib2woKTtmdW5jdGlvbiB3JCgkLFgsUSxaKXtpZih5MSgkKSx3MShYKSxRIGluc3RhbmNlb2YgVVJMKVE9US5zZWFyY2hQYXJhbXM7aWYoIShRIGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zKSl0aHJvdyBTKCcicGFyYW1ldGVycyIgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBVUkxTZWFyY2hQYXJhbXMsIG9yIFVSTCcsQSk7aWYoYyhRLCJyZXNwb25zZSIpKXRocm93IEQoJyJwYXJhbWV0ZXJzIiBjb250YWlucyBhIEpBUk0gcmVzcG9uc2UsIHVzZSB2YWxpZGF0ZUp3dEF1dGhSZXNwb25zZSgpIGluc3RlYWQgb2YgdmFsaWRhdGVBdXRoUmVzcG9uc2UoKScsTix7cGFyYW1ldGVyczpRfSk7bGV0IHo9YyhRLCJpc3MiKSxXPWMoUSwic3RhdGUiKTtpZigheiYmJC5hdXRob3JpemF0aW9uX3Jlc3BvbnNlX2lzc19wYXJhbWV0ZXJfc3VwcG9ydGVkKXRocm93IEQoJ3Jlc3BvbnNlIHBhcmFtZXRlciAiaXNzIiAoaXNzdWVyKSBtaXNzaW5nJyxOLHtwYXJhbWV0ZXJzOlF9KTtpZih6JiZ6IT09JC5pc3N1ZXIpdGhyb3cgRCgndW5leHBlY3RlZCAiaXNzIiAoaXNzdWVyKSByZXNwb25zZSBwYXJhbWV0ZXIgdmFsdWUnLE4se2V4cGVjdGVkOiQuaXNzdWVyLHBhcmFtZXRlcnM6UX0pO3N3aXRjaChaKXtjYXNlIHZvaWQgMDpjYXNlIG44OmlmKFchPT12b2lkIDApdGhyb3cgRCgndW5leHBlY3RlZCAic3RhdGUiIHJlc3BvbnNlIHBhcmFtZXRlciBlbmNvdW50ZXJlZCcsTix7ZXhwZWN0ZWQ6dm9pZCAwLHBhcmFtZXRlcnM6UX0pO2JyZWFrO2Nhc2UgYTg6YnJlYWs7ZGVmYXVsdDppZihSKFosJyJleHBlY3RlZFN0YXRlIiBhcmd1bWVudCcpLFchPT1aKXRocm93IEQoVz09PXZvaWQgMD8ncmVzcG9uc2UgcGFyYW1ldGVyICJzdGF0ZSIgbWlzc2luZyc6J3VuZXhwZWN0ZWQgInN0YXRlIiByZXNwb25zZSBwYXJhbWV0ZXIgdmFsdWUnLE4se2V4cGVjdGVkOloscGFyYW1ldGVyczpRfSl9aWYoYyhRLCJlcnJvciIpKXRocm93IG5ldyBSJCgiYXV0aG9yaXphdGlvbiByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIgaXMgYW4gZXJyb3IiLHtjYXVzZTpRfSk7bGV0IEg9YyhRLCJpZF90b2tlbiIpLEI9YyhRLCJ0b2tlbiIpO2lmKEghPT12b2lkIDB8fEIhPT12b2lkIDApdGhyb3cgbmV3IGYoImltcGxpY2l0IGFuZCBoeWJyaWQgZmxvd3MgYXJlIG5vdCBzdXBwb3J0ZWQiKTtyZXR1cm4gXzgobmV3IFVSTFNlYXJjaFBhcmFtcyhRKSl9YXN5bmMgZnVuY3Rpb24gZyQoJCxYPU0kKXtsZXQgUTt0cnl7UT1hd2FpdCAkLmpzb24oKX1jYXRjaChaKXt0aHJvdyBYKCQpLEQoJ2ZhaWxlZCB0byBwYXJzZSAicmVzcG9uc2UiIGJvZHkgYXMgSlNPTicseDEsWil9aWYoIXoxKFEpKXRocm93IEQoJyJyZXNwb25zZSIgYm9keSBtdXN0IGJlIGEgdG9wIGxldmVsIG9iamVjdCcsTix7Ym9keTpRfSk7cmV0dXJuIFF9dmFyIFckPVN5bWJvbCgpLG84PVN5bWJvbCgpO3ZhciBWMT02MDAwMDAsczg9ODY0MDAwMDAscjg9MTUwMDA7Y2xhc3MgSSBleHRlbmRzIEVycm9ye3JlYXNvbjtjb25zdHJ1Y3RvcigkLFgpe3N1cGVyKFgpO3RoaXMucmVhc29uPSQ7dGhpcy5uYW1lPSJPaWRjRmxvd0Vycm9yIn19Y2xhc3MgaDF7Y29uZmlnO3JlZGlyZWN0VXJpO2FsbG93SW5zZWN1cmVIdHRwO21ldGFkYXRhO21ldGFkYXRhRmV0Y2hlZEF0PTA7bGFzdERpc2NvdmVyeUZhaWx1cmVBdD0wO2NvbnN0cnVjdG9yKCQsWCxRKXt0aGlzLmNvbmZpZz0kO3RoaXMucmVkaXJlY3RVcmk9WDt0aGlzLmFsbG93SW5zZWN1cmVIdHRwPVF9Z2V0IGNsaWVudCgpe3JldHVybntjbGllbnRfaWQ6dGhpcy5jb25maWcuY2xpZW50SWR9fWdldCBjbGllbnRBdXRoKCl7cmV0dXJuIHRoaXMuY29uZmlnLnRva2VuRW5kcG9pbnRBdXRoTWV0aG9kPT09ImNsaWVudF9zZWNyZXRfcG9zdCI/UCQodGhpcy5jb25maWcuY2xpZW50U2VjcmV0KTpDJCh0aGlzLmNvbmZpZy5jbGllbnRTZWNyZXQpfXJlcXVlc3RPcHRpb25zKCl7cmV0dXJuIHRoaXMuYWxsb3dJbnNlY3VyZUh0dHA/e1tLMV06ITB9Ont9fWFzeW5jIGF1dGhvcml6YXRpb25TZXJ2ZXIoKXtsZXQgJD1EYXRlLm5vdygpO2lmKHRoaXMubWV0YWRhdGEhPT12b2lkIDAmJiQtdGhpcy5tZXRhZGF0YUZldGNoZWRBdDxzOClyZXR1cm4gdGhpcy5tZXRhZGF0YTtpZih0aGlzLm1ldGFkYXRhPT09dm9pZCAwJiYkLXRoaXMubGFzdERpc2NvdmVyeUZhaWx1cmVBdDxyOCl0aHJvdyBuZXcgSSgicHJvdmlkZXJVbmF2YWlsYWJsZSIsYGRpc2NvdmVyeSBmb3IgcHJvdmlkZXIgJHt0aGlzLmNvbmZpZy5pZH0gZmFpbGVkIHJlY2VudGx5OyByZXRyeWluZyBzaG9ydGx5YCk7bGV0IFg9bmV3IFVSTCh0aGlzLmNvbmZpZy5pc3N1ZXIpLFE9RyQoWCx7YWxnb3JpdGhtOiJvaWRjIiwuLi50aGlzLnJlcXVlc3RPcHRpb25zKCl9KS50aGVuKChaKT0+ViQoWCxaKSk7dGhpcy5tZXRhZGF0YT1RLHRoaXMubWV0YWRhdGFGZXRjaGVkQXQ9JDt0cnl7cmV0dXJuIGF3YWl0IFF9Y2F0Y2goWil7dGhyb3cgdGhpcy5tZXRhZGF0YT12b2lkIDAsdGhpcy5sYXN0RGlzY292ZXJ5RmFpbHVyZUF0PURhdGUubm93KCksbmV3IEkoInByb3ZpZGVyVW5hdmFpbGFibGUiLGBkaXNjb3ZlcnkgZm9yIHByb3ZpZGVyICR7dGhpcy5jb25maWcuaWR9ICgke3RoaXMuY29uZmlnLmlzc3Vlcn0pIGZhaWxlZDogJHtaLm1lc3NhZ2V9YCl9fWFzeW5jIGJlZ2luKCQpe2xldCBYPWF3YWl0IHRoaXMuYXV0aG9yaXphdGlvblNlcnZlcigpO2lmKFguYXV0aG9yaXphdGlvbl9lbmRwb2ludD09PXZvaWQgMCl0aHJvdyBuZXcgSSgicHJvdmlkZXJNaXNjb25maWd1cmVkIixgcHJvdmlkZXIgJHt0aGlzLmNvbmZpZy5pZH0gaGFzIG5vIGF1dGhvcml6YXRpb25fZW5kcG9pbnRgKTtsZXQgUT1VJCgpLFo9e3Byb3ZpZGVyOnRoaXMuY29uZmlnLmlkLHN0YXRlOkwkKCksbm9uY2U6TiQoKSxjb2RlVmVyaWZpZXI6USxyZXR1cm5UbzokLGNyZWF0ZWRBdDpEYXRlLm5vdygpfSx6PW5ldyBVUkwoWC5hdXRob3JpemF0aW9uX2VuZHBvaW50KTtyZXR1cm4gei5zZWFyY2hQYXJhbXMuc2V0KCJjbGllbnRfaWQiLHRoaXMuY29uZmlnLmNsaWVudElkKSx6LnNlYXJjaFBhcmFtcy5zZXQoInJlZGlyZWN0X3VyaSIsdGhpcy5yZWRpcmVjdFVyaSksei5zZWFyY2hQYXJhbXMuc2V0KCJyZXNwb25zZV90eXBlIiwiY29kZSIpLHouc2VhcmNoUGFyYW1zLnNldCgic2NvcGUiLHRoaXMuY29uZmlnLnNjb3Blcy5qb2luKCIgIikpLHouc2VhcmNoUGFyYW1zLnNldCgic3RhdGUiLFouc3RhdGUpLHouc2VhcmNoUGFyYW1zLnNldCgibm9uY2UiLFoubm9uY2UpLHouc2VhcmNoUGFyYW1zLnNldCgiY29kZV9jaGFsbGVuZ2UiLGF3YWl0IGIkKFEpKSx6LnNlYXJjaFBhcmFtcy5zZXQoImNvZGVfY2hhbGxlbmdlX21ldGhvZCIsIlMyNTYiKSx7dXJsOnouaHJlZixwZW5kaW5nOlp9fWFzeW5jIGNvbXBsZXRlKCQsWCl7aWYoWC5wcm92aWRlciE9PXRoaXMuY29uZmlnLmlkKXRocm93IG5ldyBJKCJzdGF0ZU1pc21hdGNoIiwidGhlIHBlbmRpbmcgbG9naW4gYmVsb25ncyB0byBhIGRpZmZlcmVudCBwcm92aWRlciIpO2lmKERhdGUubm93KCktWC5jcmVhdGVkQXQ+VjEpdGhyb3cgbmV3IEkoImxvZ2luRXhwaXJlZCIsInRoZSBsb2dpbiB0b29rIHRvbyBsb25nOyBzdGFydCBhZ2FpbiIpO2xldCBRPWF3YWl0IHRoaXMuYXV0aG9yaXphdGlvblNlcnZlcigpLFo7dHJ5e1o9dyQoUSx0aGlzLmNsaWVudCwkLFguc3RhdGUpfWNhdGNoKEgpe3Rocm93IG5ldyBJKCJhdXRob3JpemF0aW9uRmFpbGVkIixILm1lc3NhZ2UpfWxldCB6PWF3YWl0IE8kKFEsdGhpcy5jbGllbnQsdGhpcy5jbGllbnRBdXRoLFosdGhpcy5yZWRpcmVjdFVyaSxYLmNvZGVWZXJpZmllcix0aGlzLnJlcXVlc3RPcHRpb25zKCkpLFc7dHJ5e1c9YXdhaXQgaiQoUSx0aGlzLmNsaWVudCx6LHtleHBlY3RlZE5vbmNlOlgubm9uY2UscmVxdWlyZUlkVG9rZW46ITB9KX1jYXRjaChIKXt0aHJvdyBuZXcgSSgidG9rZW5FeGNoYW5nZUZhaWxlZCIsSC5tZXNzYWdlKX1sZXQgSj1EMShXKTtpZihKPT09dm9pZCAwKXRocm93IG5ldyBJKCJ0b2tlbkV4Y2hhbmdlRmFpbGVkIiwibm8gSUQgdG9rZW4gaW4gdGhlIHRva2VuIHJlc3BvbnNlIik7cmV0dXJuIEp9fXZhciBlOD0yMDQ4O2Z1bmN0aW9uIE0xKCQpe3JldHVybiB0eXBlb2YgJD09PSJzdHJpbmciJiYkLmxlbmd0aDw9ZTgmJnUoJCk/JDoiLyJ9ZnVuY3Rpb24gYSgkKXtyZXR1cm4gJC5yZXBsYWNlKC8mL2csIiZhbXA7IikucmVwbGFjZSgvPC9nLCImbHQ7IikucmVwbGFjZSgvPi9nLCImZ3Q7IikucmVwbGFjZSgvIi9nLCImcXVvdDsiKS5yZXBsYWNlKC8nL2csIiYjMzk7Iil9dmFyICQ1PSJib2R5e2ZvbnQtZmFtaWx5OnN5c3RlbS11aSxzYW5zLXNlcmlmO2JhY2tncm91bmQ6IzExMTtjb2xvcjojZWVlO2Rpc3BsYXk6ZmxleDttaW4taGVpZ2h0OjEwMHZoO2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO21hcmdpbjowfW1haW57bWF4LXdpZHRoOjI0cmVtO3dpZHRoOjEwMCU7cGFkZGluZzoycmVtfWgxe2ZvbnQtc2l6ZToxLjI1cmVtO21hcmdpbjowIDAgMS41cmVtfWEucHJvdmlkZXJ7ZGlzcGxheTpibG9jaztwYWRkaW5nOi43NXJlbSAxcmVtO21hcmdpbjouNXJlbSAwO2JvcmRlcjoxcHggc29saWQgIzQ0NDtib3JkZXItcmFkaXVzOi41cmVtO2NvbG9yOiNlZWU7dGV4dC1kZWNvcmF0aW9uOm5vbmV9YS5wcm92aWRlcjpob3Zlcntib3JkZXItY29sb3I6Izg4OH1we2NvbG9yOiNiYmI7bGluZS1oZWlnaHQ6MS41fWF7Y29sb3I6IzhhYjRmOH0iO2Z1bmN0aW9uIGgkKCQsWCl7cmV0dXJuYDwhZG9jdHlwZSBodG1sPjxodG1sIGxhbmc9ImVuIj48aGVhZD48bWV0YSBjaGFyc2V0PSJ1dGYtOCI+PG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCxpbml0aWFsLXNjYWxlPTEiPjx0aXRsZT4ke2EoJCl9PC90aXRsZT48c3R5bGU+JHskNX08L3N0eWxlPjwvaGVhZD48Ym9keT48bWFpbj4ke1h9PC9tYWluPjwvYm9keT48L2h0bWw+YH1mdW5jdGlvbiBrJCgkLFgpe2xldCBRPSQubWFwKCh6KT0+YDxhIGNsYXNzPSJwcm92aWRlciIgaHJlZj0iJHthKHouaHJlZil9Ij4ke2Eoei5sYWJlbCl9PC9hPmApLmpvaW4oIiIpLFo9WD09PXZvaWQgMD8iIjpgPHA+PGEgaHJlZj0iJHthKFgpfSI+U2lnbiBpbiB3aXRoIGVtYWlsIGFuZCBwYXNzd29yZDwvYT48L3A+YDtyZXR1cm4gaCQoIlNpZ24gaW4gdG8gSHlwZXJEWCIsYDxoMT5TaWduIGluIHRvIEh5cGVyRFg8L2gxPiR7UX0ke1p9YCl9dmFyIFg1PXtzdWJqZWN0TWlzc2luZzoiVGhlIGlkZW50aXR5IHByb3ZpZGVyIGRpZCBub3QgcmV0dXJuIGEgdXNlciBpZGVudGlmaWVyLiIsZW1haWxNaXNzaW5nOiJUaGUgaWRlbnRpdHkgcHJvdmlkZXIgZGlkIG5vdCByZXR1cm4gYW4gZW1haWwgYWRkcmVzcyBmb3IgeW91ciBhY2NvdW50LiIsZW1haWxJbnZhbGlkOiJZb3VyIGVtYWlsIGFkZHJlc3MgY29udGFpbnMgY2hhcmFjdGVycyBIeXBlckRYIHNpZ24taW4gZG9lcyBub3QgYWNjZXB0LiIsZW1haWxJblVzZToiQSBIeXBlckRYIGFjY291bnQgd2l0aCB5b3VyIGVtYWlsIGFkZHJlc3MgYWxyZWFkeSBiZWxvbmdzIHRvIGFub3RoZXIgc2lnbi1pbi4gQXNrIGFuIGFkbWluaXN0cmF0b3IuIixpbnN0YW5jZU5vdFJlYWR5OiJIeXBlckRYIGlzIHN0aWxsIGJlaW5nIHNldCB1cC4gVHJ5IGFnYWluIGluIGEgbWludXRlLiIsc3RvcmVVbmF2YWlsYWJsZToiSHlwZXJEWCBzaWduLWluIGlzIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlLiBUcnkgYWdhaW4gaW4gYSBtaW51dGUuIix1bmtub3duUHJvdmlkZXI6IlRoYXQgc2lnbi1pbiBwcm92aWRlciBpcyBub3QgY29uZmlndXJlZC4iLGVtYWlsTm90VmVyaWZpZWQ6IllvdXIgZW1haWwgYWRkcmVzcyBpcyBub3QgdmVyaWZpZWQgd2l0aCB0aGUgaWRlbnRpdHkgcHJvdmlkZXIuIixncm91cE5vdEFsbG93ZWQ6IllvdXIgYWNjb3VudCBpcyBub3QgaW4gYSBncm91cCB0aGF0IGlzIGFsbG93ZWQgdG8gdXNlIEh5cGVyRFguIixlbWFpbERvbWFpbk5vdEFsbG93ZWQ6IllvdXIgZW1haWwgYWRkcmVzcydzIGRvbWFpbiBpcyBub3QgYWxsb3dlZCB0byB1c2UgSHlwZXJEWC4iLG5vQWNjb3VudDoiVGhlcmUgaXMgbm8gSHlwZXJEWCBhY2NvdW50IGZvciB5b3UsIGFuZCB0aGlzIHByb3ZpZGVyIGRvZXMgbm90IGNyZWF0ZSBhY2NvdW50cy4iLHByb3ZpZGVyVW5hdmFpbGFibGU6IlRoZSBpZGVudGl0eSBwcm92aWRlciBjb3VsZCBub3QgYmUgcmVhY2hlZC4gVHJ5IGFnYWluIGluIGEgbW9tZW50LiIsbG9naW5FeHBpcmVkOiJUaGUgc2lnbi1pbiB0b29rIHRvbyBsb25nLiBTdGFydCBhZ2Fpbi4ifTtmdW5jdGlvbiBrMSgkLFgpe2xldCBRPVg1WyRdPz8iU2lnbi1pbiBmYWlsZWQuIjtyZXR1cm4gaCQoIlNpZ24taW4gZmFpbGVkIixgPGgxPlNpZ24taW4gZmFpbGVkPC9oMT48cD4ke2EoUSl9PC9wPjxwPjxhIGhyZWY9IiR7YShYKX0iPlRyeSBhZ2FpbjwvYT48L3A+YCl9dmFyIHI9cmVxdWlyZSgibm9kZTpjcnlwdG8iKTt2YXIgbSQ9MTAsdSQ9InR5cGVrcm9fb2lkY18iLFE1PTUxMjtmdW5jdGlvbiBkJCgkKXtsZXQgWD1uZXcgVVJMKCQsImh0dHA6Ly9wbGFjZWhvbGRlci5pbnZhbGlkIiksUT1YLnBhdGhuYW1lLnJlcGxhY2UoL1wvW14vXStcL2NhbGxiYWNrJC8sIiIpO3JldHVybntwYXRoOlE9PT0iIj8iLyI6USxzZWN1cmU6WC5wcm90b2NvbD09PSJodHRwczoifX1mdW5jdGlvbiBjJCgkKXtyZXR1cm5gJHt1JH0ke3IuY3JlYXRlSGFzaCgic2hhMjU2IikudXBkYXRlKCQpLmRpZ2VzdCgiYmFzZTY0dXJsIikuc2xpY2UoMCwyMil9YH1mdW5jdGlvbiBtMSgkKXtyZXR1cm4gci5jcmVhdGVIYXNoKCJzaGEyNTYiKS51cGRhdGUoJCkuZGlnZXN0KCJoZXgiKX1mdW5jdGlvbiBsJCgkKXtsZXQgWD1uZXcgTWFwO2lmKHR5cGVvZiAkIT09InN0cmluZyIpcmV0dXJuIFg7Zm9yKGxldCBRIG9mICQuc3BsaXQoIjsiKSl7bGV0IFo9US5pbmRleE9mKCI9Iik7aWYoWjw9MCljb250aW51ZTtsZXQgej1RLnNsaWNlKDAsWikudHJpbSgpO2lmKCFYLmhhcyh6KSlYLnNldCh6LFEuc2xpY2UoWisxKS50cmltKCkpfXJldHVybiBYfWZ1bmN0aW9uIHAkKCQsWCxRLFope3JldHVybmAkeyR9PSR7WH07IFBhdGg9JHtRLnBhdGh9OyBNYXgtQWdlPSR7Wn07IEh0dHBPbmx5OyBTYW1lU2l0ZT1MYXhgKyhRLnNlY3VyZT8iOyBTZWN1cmUiOiIiKX12YXIgaSQ9KCQsWCk9PnAkKCQsIiIsWCwwKTtmdW5jdGlvbiBaNSgkKXtsZXQgWD1uZXcgTWFwO2ZvcihsZXRbUSxaXW9mIGwkKCQpKWlmKFEuc3RhcnRzV2l0aCh1JCkmJlohPT0iIilYLnNldChtMShaKSxRKTtyZXR1cm4gWH1hc3luYyBmdW5jdGlvbiBhJCgkLFgsUSxaLHope2xldCBXPVtdLEo9WjUoWCk7aWYoSi5zaXplPj1tJCl7bGV0IEI9Wy4uLmF3YWl0ICQubGlzdEJ5QmluZGluZyhbLi4uSi5rZXlzKCldLG5ldyBEYXRlKHopKV0uc29ydCgoVixQKT0+Vi5jcmVhdGVkQXQtUC5jcmVhdGVkQXQpLFk9bmV3IFNldChCLm1hcCgoVik9PlYuYmluZGluZ0hhc2gpKSxGPVsuLi5KLmtleXMoKV0uZmlsdGVyKChWKT0+IVkuaGFzKFYpKSxMPUIuc2xpY2UoMCxNYXRoLm1heCgwLEIubGVuZ3RoLShtJC0xKSkpLm1hcCgoVik9PlYuYmluZGluZ0hhc2gpO2lmKEwubGVuZ3RoPjApYXdhaXQgJC5yZW1vdmVCeUJpbmRpbmcoTCk7Zm9yKGxldCBWIG9mWy4uLkYsLi4uTF0pVy5wdXNoKGkkKEouZ2V0KFYpLFopKX1sZXQgSD1yLnJhbmRvbUJ5dGVzKDMyKS50b1N0cmluZygiYmFzZTY0dXJsIik7cmV0dXJuIGF3YWl0ICQuaW5zZXJ0KHsuLi5RLGJpbmRpbmdIYXNoOm0xKEgpLGV4cGlyZXNBdDpuZXcgRGF0ZShRLmNyZWF0ZWRBdCtWMSl9KSxXLnB1c2gocCQoYyQoUS5zdGF0ZSksSCxaLFYxLzEwMDApKSxXfWFzeW5jIGZ1bmN0aW9uIG4kKCQsWCxRLFoseixXKXtpZih0eXBlb2YgUSE9PSJzdHJpbmcifHxRLmxlbmd0aD09PTB8fFEubGVuZ3RoPlE1KXJldHVybntwZW5kaW5nOnZvaWQgMCxzZXRDb29raWVzOltdfTtsZXQgSj1jJChRKSxIPWwkKFgpLmdldChKKTtpZihIPT09dm9pZCAwKXJldHVybntwZW5kaW5nOnZvaWQgMCxzZXRDb29raWVzOltdfTtsZXQgQj1baSQoSix6KV07aWYoSD09PSIiKXJldHVybntwZW5kaW5nOnZvaWQgMCxzZXRDb29raWVzOkJ9O2xldCBZPXo1KGF3YWl0ICQudGFrZShRLG0xKEgpLFosbmV3IERhdGUoVykpKTtyZXR1cm57cGVuZGluZzpZIT09dm9pZCAwJiZZLnN0YXRlPT09USYmWS5wcm92aWRlcj09PVo/WTp2b2lkIDAsc2V0Q29va2llczpCfX1mdW5jdGlvbiB6NSgkKXtpZih0eXBlb2YgJCE9PSJvYmplY3QifHwkPT09bnVsbClyZXR1cm47bGV0IFg9JDtpZih0eXBlb2YgWC5wcm92aWRlciE9PSJzdHJpbmcifHx0eXBlb2YgWC5zdGF0ZSE9PSJzdHJpbmcifHx0eXBlb2YgWC5ub25jZSE9PSJzdHJpbmcifHx0eXBlb2YgWC5jb2RlVmVyaWZpZXIhPT0ic3RyaW5nInx8dHlwZW9mIFgucmV0dXJuVG8hPT0ic3RyaW5nInx8dHlwZW9mIFguY3JlYXRlZEF0IT09Im51bWJlciJ8fCFOdW1iZXIuaXNGaW5pdGUoWC5jcmVhdGVkQXQpKXJldHVybjtyZXR1cm57cHJvdmlkZXI6WC5wcm92aWRlcixzdGF0ZTpYLnN0YXRlLG5vbmNlOlgubm9uY2UsY29kZVZlcmlmaWVyOlguY29kZVZlcmlmaWVyLHJldHVyblRvOlgucmV0dXJuVG8sY3JlYXRlZEF0OlguY3JlYXRlZEF0fX12YXIgVTE9InR5cGVrcm8tb2lkYzoiLEo1PSJ0eXBla3JvX29pZGNfaWRlbnRpdGllcyIsVzU9InR5cGVrcm9fb2lkY19wZW5kaW5nX2xvZ2lucyIsWTU9InR5cGVrcm9fb2lkY19zdGF0ZSIsTDE9InRlYW0tY2xhaW0iLEg1PTE1MDAwLEI1PTYwMDAwO2Z1bmN0aW9uIHUxKCQpe3JldHVybiAkPy5jb2RlPT09MTEwMDB9ZnVuY3Rpb24gSzUoJCl7cmV0dXJuIEMxKCQucGF0aCl9dmFyIG8kPSJBdXRoZW50aWNhdGlvbiBtZXRob2QgcGFzc3dvcmQgaXMgbm90IGFsbG93ZWQgYnkgeW91ciB0ZWFtIGFkbWluLiI7ZnVuY3Rpb24gTjEoJCl7cmV0dXJuICQuZGVmYXVsdD8/JH1mdW5jdGlvbiAkMCgkKXtsZXQgWD1yJC5jcmVhdGVSZXF1aXJlKGUkLmpvaW4oJCwiaW5kZXguanMiKSksUT0oVik9PlgoViksWj1OMShRKCJwYXNzcG9ydCIpKSx6PU4xKFEoIi4vcm91dGVycy9hcGkvcm9vdC5qcyIpKSxXPU4xKFEoIi4vbW9kZWxzL3VzZXIuanMiKSksSj1OMShRKCIuL21vZGVscy90ZWFtLmpzIikpLEg9USgiLi9jb250cm9sbGVycy90ZWFtLmpzIiksQj1RKCIuL3NldHVwRGVmYXVsdHMuanMiKSxZPVEoIi4vY29uZmlnLmpzIiksTD1bWyJwYXNzcG9ydC51c2UiLHR5cGVvZiBaPy51c2U9PT0iZnVuY3Rpb24iXSxbInBhc3Nwb3J0LnVudXNlIix0eXBlb2YgWj8udW51c2U9PT0iZnVuY3Rpb24iXSxbInBhc3Nwb3J0LmF1dGhlbnRpY2F0ZSIsdHlwZW9mIFo/LmF1dGhlbnRpY2F0ZT09PSJmdW5jdGlvbiJdLFsicGFzc3BvcnQuX3N0cmF0ZWd5KCdsb2NhbCcpIix0eXBlb2YgWj8uX3N0cmF0ZWd5PT09ImZ1bmN0aW9uIiYmdHlwZW9mIFouX3N0cmF0ZWd5KCJsb2NhbCIpPy5hdXRoZW50aWNhdGU9PT0iZnVuY3Rpb24iXSxbInJvdXRlcnMvYXBpL3Jvb3Qgcm91dGVyIixBcnJheS5pc0FycmF5KHo/LnN0YWNrKSYmdHlwZW9mIHo/LmdldD09PSJmdW5jdGlvbiJdLFsibW9kZWxzL3VzZXIiLHR5cGVvZiBXPy5maW5kT25lPT09ImZ1bmN0aW9uIiYmdHlwZW9mIFc/LmNyZWF0ZT09PSJmdW5jdGlvbiImJnR5cGVvZiBXPy51cGRhdGVPbmU9PT0iZnVuY3Rpb24iXSxbIm1vZGVscy90ZWFtIix0eXBlb2YgSj8uZmluZD09PSJmdW5jdGlvbiJdLFsiY29udHJvbGxlcnMvdGVhbS5jcmVhdGVUZWFtIix0eXBlb2YgSC5jcmVhdGVUZWFtPT09ImZ1bmN0aW9uIl0sWyJzZXR1cERlZmF1bHRzLnNldHVwVGVhbURlZmF1bHRzIix0eXBlb2YgQi5zZXR1cFRlYW1EZWZhdWx0cz09PSJmdW5jdGlvbiJdLFsiY29uZmlnLkZST05URU5EX1VSTCIsdHlwZW9mIFkuRlJPTlRFTkRfVVJMPT09InN0cmluZyJ8fFkuRlJPTlRFTkRfVVJMPT09dm9pZCAwXV0uZmlsdGVyKChbLFZdKT0+IVYpLm1hcCgoW1ZdKT0+Vik7aWYoTC5sZW5ndGg+MCl0aHJvdyBFcnJvcihgSHlwZXJEWCBob29rIHBvaW50KHMpIG5vdCBmb3VuZDogJHtMLmpvaW4oIiwgIil9YCk7cmV0dXJue3Bhc3Nwb3J0Oloscm9vdFJvdXRlcjp6LFVzZXI6VyxUZWFtOkosY3JlYXRlVGVhbTpILmNyZWF0ZVRlYW0sc2V0dXBUZWFtRGVmYXVsdHM6Qi5zZXR1cFRlYW1EZWZhdWx0cyxmcm9udGVuZFVybDpTdHJpbmcoWS5GUk9OVEVORF9VUkw/PyIiKS5yZXBsYWNlKC9cLyskLywiIiksZnJvbnRlbmRSZWRpcmVjdEJhc2U6U3RyaW5nKFkuRlJPTlRFTkRfUkVESVJFQ1RfQkFTRT8/WS5GUk9OVEVORF9VUkw/PyIiKS5yZXBsYWNlKC9cLyskLywiIil9fWZ1bmN0aW9uIEY1KCQsWCl7bGV0IFE9JC5Vc2VyLmRiLmNvbGxlY3Rpb24oVzUpLFosej0oKT0+e2lmKFo9PT12b2lkIDApWj1Qcm9taXNlLmFsbChbUS5jcmVhdGVJbmRleCh7c3RhdGU6MX0se3VuaXF1ZTohMCxuYW1lOiJzdGF0ZSJ9KSxRLmNyZWF0ZUluZGV4KHtleHBpcmVzQXQ6MX0se2V4cGlyZUFmdGVyU2Vjb25kczowLG5hbWU6ImV4cGlyeSJ9KSxRLmNyZWF0ZUluZGV4KHtiaW5kaW5nSGFzaDoxfSx7bmFtZToiYmluZGluZyJ9KV0pLnRoZW4oKCk9PntyZXR1cm59LChXKT0+e3Rocm93IFo9dm9pZCAwLFguZXJyb3IoImNvdWxkIG5vdCBjcmVhdGUgdGhlIHBlbmRpbmcgc2lnbi1pbiBpbmRleGVzOyBPSURDIHNpZ24taW4gaXMgcmVmdXNlZCB1bnRpbCB0aGV5IGV4aXN0Iix7ZXJyb3I6U3RyaW5nKFcpfSksbmV3IEkoInN0b3JlVW5hdmFpbGFibGUiLCJwZW5kaW5nIHNpZ24taW4gaW5kZXhlcyBhcmUgbm90IGluIHBsYWNlIil9KTtyZXR1cm4gWn07cmV0dXJuIHooKS5jYXRjaCgoKT0+e30pLHthc3luYyBpbnNlcnQoVyl7YXdhaXQgeigpLGF3YWl0IFEuaW5zZXJ0T25lKHsuLi5XfSl9LGFzeW5jIHRha2UoVyxKLEgsQil7cmV0dXJuIGF3YWl0IHooKSwoYXdhaXQgUS5maW5kT25lQW5kRGVsZXRlKHtzdGF0ZTpXLGJpbmRpbmdIYXNoOkoscHJvdmlkZXI6SCxleHBpcmVzQXQ6eyRndDpCfX0se2luY2x1ZGVSZXN1bHRNZXRhZGF0YTohMH0pKT8udmFsdWU/P251bGx9LGFzeW5jIGxpc3RCeUJpbmRpbmcoVyxKKXtyZXR1cm4oYXdhaXQgUS5maW5kKHtiaW5kaW5nSGFzaDp7JGluOlsuLi5XXX0sZXhwaXJlc0F0OnskZ3Q6Sn19LHtwcm9qZWN0aW9uOntfaWQ6MCxiaW5kaW5nSGFzaDoxLGNyZWF0ZWRBdDoxfX0pLnRvQXJyYXkoKSkuZmxhdE1hcCgoQik9PnR5cGVvZiBCLmJpbmRpbmdIYXNoPT09InN0cmluZyImJnR5cGVvZiBCLmNyZWF0ZWRBdD09PSJudW1iZXIiP1t7YmluZGluZ0hhc2g6Qi5iaW5kaW5nSGFzaCxjcmVhdGVkQXQ6Qi5jcmVhdGVkQXR9XTpbXSl9LGFzeW5jIHJlbW92ZUJ5QmluZGluZyhXKXthd2FpdCBRLmRlbGV0ZU1hbnkoe2JpbmRpbmdIYXNoOnskaW46Wy4uLlddfX0pfX19ZnVuY3Rpb24gRDUoJCxYLFEsWil7bGV0IHo9JC5Vc2VyLmRiLmNvbGxlY3Rpb24oSjUpLFc9JC5Vc2VyLmRiLmNvbGxlY3Rpb24oWTUpLEosSD0oKT0+e2lmKEo9PT12b2lkIDApSj1Qcm9taXNlLmFsbChbei5jcmVhdGVJbmRleCh7cHJvdmlkZXI6MSxzdWJqZWN0OjF9LHt1bmlxdWU6ITAsbmFtZToicHJvdmlkZXJfc3ViamVjdCJ9KSx6LmNyZWF0ZUluZGV4KHt1c2VySWQ6MX0se3VuaXF1ZTohMCxuYW1lOiJ1c2VyIn0pXSkudGhlbigoKT0+e3JldHVybn0sKFkpPT57dGhyb3cgSj12b2lkIDAsWi5lcnJvcigiY291bGQgbm90IGNyZWF0ZSB0aGUgaWRlbnRpdHktbGluayBpbmRleGVzOyBPSURDIHNpZ24taW4gaXMgcmVmdXNlZCB1bnRpbCB0aGV5IGV4aXN0Iix7ZXJyb3I6U3RyaW5nKFkpfSksbmV3IEkoInN0b3JlVW5hdmFpbGFibGUiLCJpZGVudGl0eS1saW5rIGluZGV4ZXMgYXJlIG5vdCBpbiBwbGFjZSIpfSk7cmV0dXJuIEp9O0goKS5jYXRjaCgoKT0+e30pO2FzeW5jIGZ1bmN0aW9uIEIoWSl7bGV0IEY9WCgpLnRlYW1JZDtpZihGIT09dm9pZCAwKXtpZihhd2FpdCAkLlRlYW0uZmluZEJ5SWQoRik9PT1udWxsKXRocm93IEVycm9yKGBjb25maWd1cmVkIHRlYW1JZCAke0Z9IGRvZXMgbm90IGV4aXN0YCk7cmV0dXJuIEZ9bGV0IEw9YXN5bmMoKT0+YXdhaXQgJC5UZWFtLmZpbmQoe30pLnNlbGVjdCgiX2lkIikubGltaXQoMikubGVhbigpLFY9YXdhaXQgTCgpO2lmKFYubGVuZ3RoPT09MSlyZXR1cm4gVlswXS5faWQudG9TdHJpbmcoKTtpZihWLmxlbmd0aD4xKXRocm93IEVycm9yKCJtb3JlIHRoYW4gb25lIEh5cGVyRFggdGVhbSBleGlzdHM7IHNldCB0ZWFtSWQgaW4gdGhlIE9JREMgY29uZmlndXJhdGlvbiIpO2lmKCFRLmNyZWF0ZVRlYW0pdGhyb3cgbmV3IEkoImluc3RhbmNlTm90UmVhZHkiLCJubyBIeXBlckRYIHRlYW0gZXhpc3RzIHlldCBhbmQgdGhpcyBwbHVnaW4gZG9lcyBub3QgY3JlYXRlIG9uZSIpO2xldCBQPShfKT0+Xy5sZW5ndGg9PT0xP19bMF0uX2lkLnRvU3RyaW5nKCk6dm9pZCAwO3RyeXthd2FpdCBXLmluc2VydE9uZSh7X2lkOkwxLGF0Om5ldyBEYXRlLGJ5Oll9KX1jYXRjaChfKXtpZighdTEoXykpdGhyb3cgXztsZXQgRT1EYXRlLm5vdygpK0g1O3doaWxlKERhdGUubm93KCk8RSl7bGV0IG49UChhd2FpdCBMKCkpO2lmKG4hPT12b2lkIDApcmV0dXJuIG47YXdhaXQgbmV3IFByb21pc2UoKHcpPT5zZXRUaW1lb3V0KHcsMjUwKSl9bGV0IHk9YXdhaXQgVy5maW5kT25lKHtfaWQ6TDF9KSxTMT15Py5hdCBpbnN0YW5jZW9mIERhdGU/eS5hdC5nZXRUaW1lKCk6MDtpZihEYXRlLm5vdygpLVMxPkI1KWF3YWl0IFcuZGVsZXRlT25lKHtfaWQ6TDEsYXQ6eT8uYXR9KTt0aHJvdyBuZXcgSSgiaW5zdGFuY2VOb3RSZWFkeSIsImFub3RoZXIgZmlyc3QgbG9naW4gaXMgY3JlYXRpbmcgdGhlIEh5cGVyRFggdGVhbSIpfWxldCBPO3RyeXtPPWF3YWl0ICQuY3JlYXRlVGVhbSh7bmFtZTpgJHtZfSdzIFRlYW1gLGNvbGxlY3RvckF1dGhlbnRpY2F0aW9uRW5mb3JjZWQ6ITB9KX1jYXRjaChfKXtsZXQgRT1QKGF3YWl0IEwoKSk7aWYoRSE9PXZvaWQgMClyZXR1cm4gRTt0aHJvdyBhd2FpdCBXLmRlbGV0ZU9uZSh7X2lkOkwxfSksX31sZXQgdj1PLl9pZC50b1N0cmluZygpO3JldHVybiBhd2FpdCAkLnNldHVwVGVhbURlZmF1bHRzKHYpLmNhdGNoKChfKT0+Wi5lcnJvcigic2V0dGluZyB1cCBkZWZhdWx0IGNvbm5lY3Rpb25zIGFuZCBzb3VyY2VzIGZvciB0aGUgbmV3IHRlYW0gZmFpbGVkIix7ZXJyb3I6U3RyaW5nKF8pfSkpLHZ9cmV0dXJue2FzeW5jIGZpbmRMaW5rZWRVc2VySWQoWSxGKXthd2FpdCBIKCk7bGV0IEw9YXdhaXQgei5maW5kT25lKHtwcm92aWRlcjpZLHN1YmplY3Q6Rn0pO3JldHVybiBMPT09bnVsbD9udWxsOlN0cmluZyhMLnVzZXJJZCl9LGFzeW5jIHVzZXJFeGlzdHMoWSl7cmV0dXJuIGF3YWl0ICQuVXNlci5maW5kQnlJZChZKSE9PW51bGx9LGFzeW5jIGZpbmRVc2VySWRCeUVtYWlsKFkpe2xldCBGPWF3YWl0ICQuVXNlci5maW5kT25lKHtlbWFpbDpZfSkuc2VsZWN0KCJfaWQiKS5sZWFuKCk7cmV0dXJuIEY9PT1udWxsP251bGw6U3RyaW5nKEYuX2lkKX0sYXN5bmMgdXNlckhhc0FueUxpbmsoWSl7cmV0dXJuIGF3YWl0IHouZmluZE9uZSh7dXNlcklkOll9KSE9PW51bGx9LGFzeW5jIGNyZWF0ZVVzZXIoWSxGKXtsZXQgTD1hd2FpdCBCKFkpO3RyeXtyZXR1cm4oYXdhaXQgJC5Vc2VyLmNyZWF0ZSh7ZW1haWw6WSxuYW1lOkYsdGVhbTpMfSkpLl9pZC50b1N0cmluZygpfWNhdGNoKFYpe2lmKHUxKFYpKXRocm93IG5ldyBwO3Rocm93IFZ9fSxhc3luYyBsaW5rKFksRil7YXdhaXQgSCgpO2xldCBMPW5ldyBEYXRlO3RyeXthd2FpdCB6LnVwZGF0ZU9uZSh7cHJvdmlkZXI6WS5wcm92aWRlcixzdWJqZWN0Olkuc3ViamVjdH0seyRzZXQ6e3VzZXJJZDpGLGVtYWlsOlkuZW1haWwsbGFzdExvZ2luQXQ6TH0sJHNldE9uSW5zZXJ0OntjcmVhdGVkQXQ6TH19LHt1cHNlcnQ6ITB9KX1jYXRjaChWKXtpZighdTEoVikpdGhyb3cgVjtsZXQgUD1hd2FpdCB6LmZpbmRPbmUoe3Byb3ZpZGVyOlkucHJvdmlkZXIsc3ViamVjdDpZLnN1YmplY3R9KTtpZihQIT09bnVsbCYmU3RyaW5nKFAudXNlcklkKT09PUYpcmV0dXJuO3Rocm93IG5ldyBwfX0sYXN5bmMgdW5saW5rKFksRil7YXdhaXQgei5kZWxldGVPbmUoe3Byb3ZpZGVyOlksc3ViamVjdDpGfSl9LGFzeW5jIHRvdWNoKFksRil7YXdhaXQgei51cGRhdGVPbmUoe3Byb3ZpZGVyOlksc3ViamVjdDpGfSx7JHNldDp7bGFzdExvZ2luQXQ6bmV3IERhdGV9fSl9fX1mdW5jdGlvbiBYMCgkLFgsUSxaPXtjcmVhdGVUZWFtOiEwfSl7bGV0IHosVyxKPSExLEg9bmV3IE1hcCxCPUQ1KCQsKCk9Pno/P3ExKCd7InByb3ZpZGVycyI6W119JyksWixRKSxZPUY1KCQsUSk7YXN5bmMgZnVuY3Rpb24gRihLLEcpe2lmKHR5cGVvZiBHIT09InN0cmluZyIpcmV0dXJuO2xldCBNPWF3YWl0IEIuZmluZExpbmtlZFVzZXJJZChLLEcpO2lmKE09PT1udWxsKXJldHVybjthd2FpdCAkLlVzZXIudXBkYXRlT25lKHtfaWQ6TX0seyRzZXQ6e2FjY2Vzc0tleTp0JC5yYW5kb21VVUlEKCl9fSksUS53YXJuKCJyb3RhdGVkIHRoZSBhY2Nlc3Mga2V5IG9mIGEgbGlua2VkIHVzZXIgdGhlIHByb3ZpZGVyIG5vIGxvbmdlciBhZG1pdHMiLHtwcm92aWRlcjpLLHVzZXJJZDpNfSl9bGV0IEw9KCk9Pno/LmFwaVBhdGhQcmVmaXg/PyIvYXBpIixWPSgpPT5gJHtMKCl9L2xvZ2luL29pZGNgLFA9KEspPT4kMShLPy5yZWRpcmVjdEJhc2VVcmwsJC5mcm9udGVuZFVybCksTz0oKT0+UCh6KSx2PSgpPT4kMSgkLmZyb250ZW5kUmVkaXJlY3RCYXNlLHo/LnJlZGlyZWN0QmFzZVVybCksXz0oSyk9PlgxKHYoKSxLKTtmdW5jdGlvbiBFKEspe3JldHVybntuYW1lOmAke1UxfSR7S31gLGF1dGhlbnRpY2F0ZShHKXtsZXQgTT1ILmdldChLKTtpZihNPT09dm9pZCAwKXt0aGlzLmZhaWwoe3JlYXNvbjoidW5rbm93blByb3ZpZGVyIn0sNDA0KTtyZXR1cm59KGFzeW5jKCk9PntsZXQgYj1HLnNlc3Npb247aWYoYj09PXZvaWQgMCl0aHJvdyBFcnJvcigiSHlwZXJEWCBzZXNzaW9uIG1pZGRsZXdhcmUgaXMgbm90IGFjdGl2ZSIpO2lmKEcucmVzPT09dm9pZCAwKXRocm93IEVycm9yKCJ0aGUgcmVxdWVzdCBoYXMgbm8gcmVzcG9uc2UgdG8gc2V0IGNvb2tpZXMgb24iKTtpZigidHlwZWtyb09pZGNQZW5kaW5nImluIGIpZGVsZXRlIGIudHlwZWtyb09pZGNQZW5kaW5nO2lmKCJ0eXBla3JvT2lkY1BlbmRpbmdMb2dpbnMiaW4gYilkZWxldGUgYi50eXBla3JvT2lkY1BlbmRpbmdMb2dpbnM7bGV0IFQ9ZCQoTS5yZWRpcmVjdFVyaSk7aWYoRy5xdWVyeS5jb2RlPT09dm9pZCAwJiZHLnF1ZXJ5LmVycm9yPT09dm9pZCAwKXtsZXR7dXJsOkswLHBlbmRpbmc6RjB9PWF3YWl0IE0uYmVnaW4oTTEoRy5xdWVyeS5yZXR1cm5UbykpO0cucmVzLmFwcGVuZCgiU2V0LUNvb2tpZSIsYXdhaXQgYSQoWSxHLmhlYWRlcnMuY29va2llLEYwLFQsRGF0ZS5ub3coKSkpLHRoaXMucmVkaXJlY3QoSzApO3JldHVybn1sZXR7cGVuZGluZzp4LHNldENvb2tpZXM6a309YXdhaXQgbiQoWSxHLmhlYWRlcnMuY29va2llLEcucXVlcnkuc3RhdGUsSyxULERhdGUubm93KCkpO2lmKGsubGVuZ3RoPjApRy5yZXMuYXBwZW5kKCJTZXQtQ29va2llIixrKTtpZih4PT09dm9pZCAwKXtRLndhcm4oIk9JREMgY2FsbGJhY2sgbWF0Y2hlZCBubyBwZW5kaW5nIHNpZ24taW4iLHtwcm92aWRlcjpLfSksdGhpcy5mYWlsKHtyZWFzb246ImxvZ2luRXhwaXJlZCJ9LDQwMCk7cmV0dXJufWxldCBsPW5ldyBVUkwoRy5vcmlnaW5hbFVybCxPKCl8fCJodHRwOi8vcGxhY2Vob2xkZXIuaW52YWxpZCIpLGExPWF3YWl0IE0uY29tcGxldGUobCx4KSxtPSQkKE0uY29uZmlnLGExKTtpZighbS5hbGxvd2VkKXtpZihRLndhcm4oIk9JREMgbG9naW4gZGVuaWVkIix7cHJvdmlkZXI6SyxyZWFzb246bS5yZWFzb259KSxtLnJlYXNvbiE9PSJzdWJqZWN0TWlzc2luZyIpYXdhaXQgRihLLGExLnN1Yik7dGhpcy5mYWlsKHtyZWFzb246bS5yZWFzb24scmV0dXJuVG86eC5yZXR1cm5Ub30sNDAzKTtyZXR1cm59bGV0IG89YXdhaXQgWCQoQixNLmNvbmZpZyxtLmlkZW50aXR5KTtpZigiZGVuaWVkImluIG8pe1Eud2FybigiT0lEQyBsb2dpbiBkZW5pZWQiLHtwcm92aWRlcjpLLHJlYXNvbjpvLmRlbmllZCxlbWFpbDptLmlkZW50aXR5LmVtYWlsfSksdGhpcy5mYWlsKHtyZWFzb246by5kZW5pZWR9LDQwMyk7cmV0dXJufWxldCBCMD1hd2FpdCAkLlVzZXIuZmluZEJ5SWQoby51c2VySWQpO1EuaW5mbygiT0lEQyBsb2dpbiIse3Byb3ZpZGVyOkssZW1haWw6bS5pZGVudGl0eS5lbWFpbCxvdXRjb21lOm8ub3V0Y29tZX0pLHRoaXMuc3VjY2VzcyhCMCx7cHJvdmlkZXI6SyxyZXR1cm5Ubzp4LnJldHVyblRvfSl9KSgpLmNhdGNoKChiKT0+e2lmKGIgaW5zdGFuY2VvZiBJKXtRLndhcm4oIk9JREMgbG9naW4gZmFpbGVkIix7cHJvdmlkZXI6SyxyZWFzb246Yi5yZWFzb24sZGV0YWlsOmIubWVzc2FnZX0pO2xldCBUPVsicHJvdmlkZXJVbmF2YWlsYWJsZSIsImluc3RhbmNlTm90UmVhZHkiLCJzdG9yZVVuYXZhaWxhYmxlIl0uaW5jbHVkZXMoYi5yZWFzb24pO3RoaXMuZmFpbCh7cmVhc29uOmIucmVhc29ufSxUPzUwMzo0MDApO3JldHVybn10aGlzLmVycm9yKGIpfSl9fX1mdW5jdGlvbiB5KEspe2xldCBHPW5ldyBNYXAsTT1QKEspO2ZvcihsZXQgVSBvZiBLLnByb3ZpZGVycyl7bGV0IGI9WDEoTSxgJHtLLmFwaVBhdGhQcmVmaXh9L2xvZ2luL29pZGMvJHtVLmlkfS9jYWxsYmFja2ApLFQ9SC5nZXQoVS5pZCk7Ry5zZXQoVS5pZCxUIT09dm9pZCAwJiZULnJlZGlyZWN0VXJpPT09YiYmSlNPTi5zdHJpbmdpZnkoVC5jb25maWcpPT09SlNPTi5zdHJpbmdpZnkoVSk/VDpuZXcgaDEoVSxiLEsuYWxsb3dJbnNlY3VyZUh0dHApKX1mb3IobGV0IFUgb2YgSC5rZXlzKCkpaWYoIUcuaGFzKFUpKSQucGFzc3BvcnQudW51c2UoYCR7VTF9JHtVfWApO2ZvcihsZXQgVSBvZiBHLmtleXMoKSkkLnBhc3Nwb3J0LnVzZShgJHtVMX0ke1V9YCxFKFUpKTtpZihIPUcsej1LLFMxKEspLEsuYWxsb3dJbnNlY3VyZUh0dHApUS53YXJuKCJhbGxvd0luc2VjdXJlSHR0cCBpcyBvbjogaXNzdWVycyBhbmQgY2FsbGJhY2tzIG1heSB1c2UgcGxhaW4gaHR0cC4gVXNlIHRoaXMgb25seSBmb3IgdGVzdHM7IGl0IHJlbW92ZXMgdGhlIFRMUyBwcm90ZWN0aW9uIHRoZSBJRC10b2tlbiBjaGVja3MgcmVseSBvbi4iKTtmb3IobGV0IFUgb2YgSC52YWx1ZXMoKSlVLmF1dGhvcml6YXRpb25TZXJ2ZXIoKS5jYXRjaCgoYik9PlEud2FybigiT0lEQyBkaXNjb3ZlcnkgZmFpbGVkOyB3aWxsIHJldHJ5IG9uIGRlbWFuZCIse3Byb3ZpZGVyOlUuY29uZmlnLmlkLGVycm9yOlN0cmluZyhiKX0pKX1mdW5jdGlvbiBTMShLKXtsZXQgRz0kMSgkLmZyb250ZW5kVXJsKTtpZihQKEspPT09IiIpe2xldCBNPSQuZnJvbnRlbmRVcmw9PT0iIj8iaXMgbm90IHNldCI6ImlzIG5vdCBhIHZhbGlkIGh0dHAocykgYmFzZSBVUkwgKGFic29sdXRlLCB3aXRob3V0IGNyZWRlbnRpYWxzLCBxdWVyeSBvciBmcmFnbWVudCkiO1Eud2FybihgSHlwZXJEWCdzIEZST05URU5EX1VSTCAke019IGFuZCByZWRpcmVjdEJhc2VVcmwgaXMgbm90IHNldDogY2FsbGJhY2sgVVJMcyBhbmQgcmVkaXJlY3RzIGFyZSByZWxhdGl2ZS4gUHJvdmlkZXJzIHJlZnVzZSBhIHJlbGF0aXZlIGNhbGxiYWNrLCBhbmQgYmVoaW5kIGEgcmV2ZXJzZSBwcm94eSBIeXBlckRYJ3MgVUkgcmV3cml0ZXMgcmVsYXRpdmUgcmVkaXJlY3RzIHRvIHRoZSBBUEkgc2VydmVyJ3MgcG9ydC5gKTtyZXR1cm59aWYoSy5yZWRpcmVjdEJhc2VVcmwhPT12b2lkIDAmJkchPT0iIil7bGV0IE09bmV3IFVSTChLLnJlZGlyZWN0QmFzZVVybCkub3JpZ2luLFU9bmV3IFVSTChHKS5vcmlnaW47aWYoTSE9PVUpUS53YXJuKCJyZWRpcmVjdEJhc2VVcmwgYW5kIEh5cGVyRFgncyBGUk9OVEVORF9VUkwgaGF2ZSBkaWZmZXJlbnQgb3JpZ2luczogc2lnbi1pbiBjb21wbGV0ZXMsIGFuZCBzZXRzIGl0cyBzZXNzaW9uIGNvb2tpZSwgb24gcmVkaXJlY3RCYXNlVXJsJ3Mgb3JpZ2luLCB0aGVuIHNlbmRzIHRoZSBicm93c2VyIHRvIEZST05URU5EX1VSTCdzLCB3aGVyZSB0aGF0IHNlc3Npb24gaXMgbm90IHNlbnQuIFRoZXkgbXVzdCBzaGFyZSBhbiBvcmlnaW4uIix7cmVkaXJlY3RCYXNlT3JpZ2luOk0sZnJvbnRlbmRPcmlnaW46VX0pfX1mdW5jdGlvbiBuKCl7bGV0IEs7dHJ5e0s9cyQucmVhZEZpbGVTeW5jKFgsInV0ZjgiKX1jYXRjaChHKXtpZighSilKPSEwLFEuZXJyb3Ioej09PXZvaWQgMD8iT0lEQyBjb25maWd1cmF0aW9uIHVucmVhZGFibGU7IG5vIHByb3ZpZGVycyBhY3RpdmUiOiJPSURDIGNvbmZpZ3VyYXRpb24gYmVjYW1lIHVucmVhZGFibGU7IGtlZXBpbmcgdGhlIHByZXZpb3VzIG9uZSIse3BhdGg6WCxlcnJvcjpTdHJpbmcoRyl9KTtyZXR1cm4hMX1pZihKKUo9ITEsUS5pbmZvKCJPSURDIGNvbmZpZ3VyYXRpb24gcmVhZGFibGUgYWdhaW4iLHtwYXRoOlh9KTtpZihLPT09VylyZXR1cm4hMTtXPUs7dHJ5e3kocTEoSykpfWNhdGNoKEcpe3JldHVybiBRLmVycm9yKHo9PT12b2lkIDA/Ik9JREMgY29uZmlndXJhdGlvbiByZWplY3RlZCBhbmQgbm9uZSBoYXMgYmVlbiBhcHBsaWVkIHNpbmNlIHN0YXJ0OyBubyBwcm92aWRlcnMgYWN0aXZlIGFuZCBwYXNzd29yZCBsb2dpbiBpcyBhbGxvd2VkIjoiT0lEQyBjb25maWd1cmF0aW9uIHJlamVjdGVkOyBrZWVwaW5nIHRoZSBwcmV2aW91cyBvbmUiLHtlcnJvcjpTdHJpbmcoRyl9KSwhMX1yZXR1cm4gUS5pbmZvKCJPSURDIGNvbmZpZ3VyYXRpb24gYXBwbGllZCIse3Byb3ZpZGVyczpbLi4uSC5rZXlzKCldLHBhc3N3b3JkTG9naW46ej8ucGFzc3dvcmRMb2dpbixwYXNzd29yZExvZ2luUGF0aDpSMSh6LFoucGFzc3dvcmRMb2dpblBhdGgpLG1heFNlc3Npb25BZ2VNczp6Py5tYXhTZXNzaW9uQWdlTXN9KSwhMH1sZXQgdz0kLnJvb3RSb3V0ZXI7ZnVuY3Rpb24gYzEoSyl7dy51c2UoSyk7bGV0IEc9dy5zdGFjay5wb3AoKTt3LnN0YWNrLnVuc2hpZnQoRyl9YzEoKEssRyxNKT0+e2xldCBVPUsuc2Vzc2lvbj8udHlwZWtyb09pZGNBdXRoO2lmKFU9PT12b2lkIDB8fEsudXNlcj09PXZvaWQgMHx8ej09PXZvaWQgMCl7TSgpO3JldHVybn1pZighKHoubWF4U2Vzc2lvbkFnZU1zPjAmJkRhdGUubm93KCktVS5hdD56Lm1heFNlc3Npb25BZ2VNcykmJkguaGFzKFUucHJvdmlkZXIpKXtNKCk7cmV0dXJufUsubG9nb3V0KChUKT0+TShUKSl9KTtsZXQgbDE9JC5wYXNzcG9ydC5fc3RyYXRlZ3koImxvY2FsIiksVzA9bDEuYXV0aGVudGljYXRlLHAxPW5ldyBXZWFrU2V0O2wxLmF1dGhlbnRpY2F0ZT1mdW5jdGlvbihHLE0pe2lmKHohPT12b2lkIDAmJiF6LnBhc3N3b3JkTG9naW4mJiFwMS5oYXMoRykpe3RoaXMuZmFpbCh7bWVzc2FnZTpvJH0pO3JldHVybn1XMC5jYWxsKHRoaXMsRyxNKX07bGV0IFkwPVsvXlwvbG9naW5cL3Bhc3N3b3JkJC8sL15cL3JlZ2lzdGVyXC9wYXNzd29yZCQvLC9eXC90ZWFtXC9zZXR1cFwvW14vXSskL10sSDA9YXN5bmMoKT0+KGF3YWl0ICQuVGVhbS5maW5kKHt9KS5zZWxlY3QoIl9pZCIpLmxpbWl0KDEpLmxlYW4oKSkubGVuZ3RoPjA7YzEoKEssRyxNKT0+e2lmKEsubWV0aG9kIT09IlBPU1QifHx6PT09dm9pZCAwfHx6LnBhc3N3b3JkTG9naW4pe00oKTtyZXR1cm59bGV0IFU9SzUoSyk7aWYoIVkwLnNvbWUoKFQpPT5ULnRlc3QoVSkpKXtNKCk7cmV0dXJufWxldCBiPSgpPT57aWYoSy5zZXNzaW9uIT09dm9pZCAwKUsuc2Vzc2lvbi5tZXNzYWdlcz1bbyRdO0cucmVkaXJlY3QoMzAzLF8oIi9sb2dpbj9lcnI9cGFzc3dvcmRBdXRoTm90QWxsb3dlZCIpKX07aWYoVSE9PSIvcmVnaXN0ZXIvcGFzc3dvcmQiKXtiKCk7cmV0dXJufXMxKEssWix7dGVhbUV4aXN0czpIMH0pLnRoZW4oKFQpPT57aWYoIVQpe2IoKTtyZXR1cm59cDEuYWRkKEspLE0oKX0sKFQpPT57US53YXJuKCJjb3VsZCBub3QgY2hlY2sgZm9yIGFuIGV4aXN0aW5nIHRlYW07IHJlZnVzaW5nIHRoZSByZWdpc3RyYXRpb24iLHtlcnJvcjpTdHJpbmcoVCl9KSxiKCl9KX0pLHcuZ2V0KCIvbG9naW4vb2lkYyIsKEssRyk9PntsZXQgTT1NMShLLnF1ZXJ5LnJldHVyblRvKSxVPVsuLi5ILnZhbHVlcygpXTtpZihVLmxlbmd0aD09PTEpe2xldCB4PVQxKFYoKSxVWzBdLmNvbmZpZy5pZCxNKTtHLnJlZGlyZWN0KDMwMixYMShPKCkseCkpO3JldHVybn1sZXQgYj1SMSh6LFoucGFzc3dvcmRMb2dpblBhdGgpLFQ9Yj09PXZvaWQgMD92b2lkIDA6XyhiKTtHLnN0YXR1cyhVLmxlbmd0aD09PTA/NTAzOjIwMCkudHlwZSgiaHRtbCIpLnNlbmQoayQoVS5tYXAoKHgpPT4oe2xhYmVsOnguY29uZmlnLmRpc3BsYXlOYW1lLGhyZWY6VDEoVigpLHguY29uZmlnLmlkLE0pfSkpLFQpKX0pO2xldCBpMT0oSyxHLE0pPT57bGV0IFU9Sy5wYXJhbXMucHJvdmlkZXI/PyIiO2lmKCFILmhhcyhVKSl7Ry5zdGF0dXMoNDA0KS50eXBlKCJodG1sIikuc2VuZChrMSgidW5rbm93blByb3ZpZGVyIixWKCkpKTtyZXR1cm59JC5wYXNzcG9ydC5hdXRoZW50aWNhdGUoYCR7VTF9JHtVfWAsKGIsVCx4KT0+e2lmKGIpe00oYik7cmV0dXJufWxldCBrPXg/P3t9O2lmKCFUKXtsZXQgbD1rLnJlYXNvbj09PSJ1bmtub3duUHJvdmlkZXIiPzQwNDpbInByb3ZpZGVyVW5hdmFpbGFibGUiLCJpbnN0YW5jZU5vdFJlYWR5Iiwic3RvcmVVbmF2YWlsYWJsZSJdLmluY2x1ZGVzKGsucmVhc29uPz8iIik/NTAzOjQwMztHLnN0YXR1cyhsKS50eXBlKCJodG1sIikuc2VuZChrMShrLnJlYXNvbj8/InVua25vd24iLFYoKSkpO3JldHVybn1LLmxvZ0luKFQsKGwpPT57aWYobCl7TShsKTtyZXR1cm59aWYoSy5zZXNzaW9uIT09dm9pZCAwKUsuc2Vzc2lvbi50eXBla3JvT2lkY0F1dGg9e3Byb3ZpZGVyOlUsYXQ6RGF0ZS5ub3coKX07Ry5yZWRpcmVjdCgzMDIsXyhNMShrLnJldHVyblRvKSkpfSl9KShLLEcsTSl9O3JldHVybiB3LmdldCgiL2xvZ2luL29pZGMvOnByb3ZpZGVyIixpMSksdy5nZXQoIi9sb2dpbi9vaWRjLzpwcm92aWRlci9jYWxsYmFjayIsaTEpLG4oKSx7cmVsb2FkOm4scHJvdmlkZXJJZHM6KCk9PlsuLi5ILmtleXMoKV19fXZhciBHNT0iVFlQRUtST19IRFhfT0lEQ19DT05GSUciLFY1PSJUWVBFS1JPX0hEWF9PSURDX1JFTE9BRF9TRUNPTkRTIixNNT0iVFlQRUtST19IRFhfT0lEQ19DUkVBVEVfVEVBTSIsUTA9IlRZUEVLUk9fSERYX09JRENfUEFTU1dPUkRfTE9HSU5fUEFUSCIsVTU9L1tcXC9dcGFja2FnZXNbXFwvXWFwaVtcXC9dYnVpbGRbXFwvXWluZGV4XC5qcyQvLGg9e2luZm86KCQsWCk9PmNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHtsZXZlbDoiaW5mbyIscGx1Z2luOiJ0eXBla3JvLW9pZGMiLG1lc3NhZ2U6JCwuLi5YfSkpLHdhcm46KCQsWCk9PmNvbnNvbGUud2FybihKU09OLnN0cmluZ2lmeSh7bGV2ZWw6Indhcm4iLHBsdWdpbjoidHlwZWtyby1vaWRjIixtZXNzYWdlOiQsLi4uWH0pKSxlcnJvcjooJCxYKT0+Y29uc29sZS5lcnJvcihKU09OLnN0cmluZ2lmeSh7bGV2ZWw6ImVycm9yIixwbHVnaW46InR5cGVrcm8tb2lkYyIsbWVzc2FnZTokLC4uLlh9KSl9LEw1PTYwMDAwO2Z1bmN0aW9uIE41KCQsWCl7bGV0IFE7dHJ5e1E9ejAucmVhbHBhdGhTeW5jKGIxLmRpcm5hbWUoWCkpfWNhdGNoKEIpe2guZXJyb3IoIm5vdCBpbnN0YWxsZWQ7IGNvdWxkIG5vdCByZXNvbHZlIHRoZSBBUEkgYnVpbGQgZGlyZWN0b3J5Iix7ZXJyb3I6U3RyaW5nKEIpfSk7cmV0dXJufWxldCBaPWIxLmpvaW4oUSwicm91dGVycyIsImFwaSIsInJvb3QuanMiKSx6PUowLmRlZmF1bHQsVz16Ll9sb2FkLEo9ITEsSD1mdW5jdGlvbihZLEYsTCl7bGV0IFY9Vy5jYWxsKHRoaXMsWSxGLEwpO2lmKCFKJiZ6Ll9jYWNoZVtaXT8ubG9hZGVkPT09ITApe2lmKEo9ITAsei5fbG9hZD09PUgpei5fbG9hZD1XO3RyeXtsZXQgUD1wcm9jZXNzLmVudltNNV0hPT0iZmFsc2UiLE89UD92b2lkIDA6dDEocHJvY2Vzcy5lbnYpO2lmKCFQJiZPPT09dm9pZCAwKWgud2Fybigibm8gaW5pdGlhbC11c2VyIGJvb3RzdHJhcCBjcmVkZW50aWFsczsgd2l0aCBwYXNzd29yZExvZ2luOiBmYWxzZSwgZmlyc3QtcnVuIHJlZ2lzdHJhdGlvbiBpcyByZWZ1c2VkIik7ZWxzZSBpZihPIT09dm9pZCAwJiZQMShPLnBhc3N3b3JkRmlsZSk9PT12b2lkIDApaC53YXJuKCJpbml0aWFsLXVzZXIgYm9vdHN0cmFwIHBhc3N3b3JkIGZpbGUgaXMgYWJzZW50IG9yIGVtcHR5OyB3aXRoIHBhc3N3b3JkTG9naW46IGZhbHNlLCBmaXJzdC1ydW4gcmVnaXN0cmF0aW9uIGlzIHJlZnVzZWQgdW50aWwgaXQgYXBwZWFycyIse3Bhc3N3b3JkRmlsZTpPLnBhc3N3b3JkRmlsZX0pO2xldCB2PXByb2Nlc3MuZW52W1EwXSxfPXYhPT12b2lkIDAmJnUodik/djp2b2lkIDA7aWYodiE9PXZvaWQgMCYmXz09PXZvaWQgMCloLndhcm4oImlnbm9yaW5nIGEgcGFzc3dvcmQgbG9naW4gcGF0aCB0aGF0IGlzIG5vdCBhIHNhbWUtb3JpZ2luIHBhdGgiLHtlbnY6UTB9KTtsZXQgRT1YMCgkMChRKSwkLGgse2NyZWF0ZVRlYW06UCwuLi5PIT09dm9pZCAwJiZ7Ym9vdHN0cmFwOk99LC4uLl8hPT12b2lkIDAmJntwYXNzd29yZExvZ2luUGF0aDpffX0pLHk9TnVtYmVyKHByb2Nlc3MuZW52W1Y1XT8/IjE1Iik7c2V0SW50ZXJ2YWwoKCk9PkUucmVsb2FkKCksTWF0aC5tYXgoMSxOdW1iZXIuaXNGaW5pdGUoeSk/eToxNSkqMTAwMCkudW5yZWYoKSxoLmluZm8oImluc3RhbGxlZCIse3Byb3ZpZGVyczpFLnByb3ZpZGVySWRzKCl9KX1jYXRjaChQKXtoLmVycm9yKCJub3QgaW5zdGFsbGVkOyBIeXBlckRYIGNvbnRpbnVlcyB3aXRob3V0IE9JREMiLHtlcnJvcjpTdHJpbmcoUCl9KX19cmV0dXJuIFZ9O3ouX2xvYWQ9SCxzZXRUaW1lb3V0KCgpPT57aWYoIUopaC5lcnJvcigiSHlwZXJEWCBuZXZlciBsb2FkZWQgaXRzIHJvb3Qgcm91dGVyOyB0aGUgcGx1Z2luIHdhcyBub3QgaW5zdGFsbGVkIix7cm9vdFJvdXRlclBhdGg6Wn0pfSxMNSkudW5yZWYoKX12YXIgZDE9cHJvY2Vzcy5lbnZbRzVdLFowPXByb2Nlc3MuYXJndlsxXT8/IiI7aWYoZDEhPT12b2lkIDAmJmQxLmxlbmd0aD4wJiZVNS50ZXN0KFowKSlONShkMSxaMCk7Cg==';
|
|
8
8
|
/** SHA-256 of the decoded bundle; changes whenever the plugin does. */
|
|
9
|
-
export const HYPERDX_OIDC_PLUGIN_SHA256 = '
|
|
9
|
+
export const HYPERDX_OIDC_PLUGIN_SHA256 = '74eb77c8cd694103b66900234d07be367b44b8e4a90e7566c63472423ba170d7';
|
|
10
10
|
/** Size of the decoded bundle in bytes. */
|
|
11
|
-
export const HYPERDX_OIDC_PLUGIN_BYTES =
|
|
11
|
+
export const HYPERDX_OIDC_PLUGIN_BYTES = 56650;
|
|
12
12
|
/** Hash of the inputs the bundle was built from (see the --check mode of the build script). */
|
|
13
|
-
export const HYPERDX_OIDC_PLUGIN_INPUTS_SHA256 = '
|
|
13
|
+
export const HYPERDX_OIDC_PLUGIN_INPUTS_SHA256 = '71d7193fa0f20225983d185c3e4f07ca6b96d4457d1d343b4e9604c3c3117349';
|
|
14
14
|
//# sourceMappingURL=plugin-bundle.generated.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-bundle.generated.js","sourceRoot":"","sources":["../../../../src/factories/clickstack/hyperdx-oidc/plugin-bundle.generated.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,gEAAgE;AAEhE;;;GAGG;AACH,MAAM,CAAC,MAAM,0BAA0B,GACrC,
|
|
1
|
+
{"version":3,"file":"plugin-bundle.generated.js","sourceRoot":"","sources":["../../../../src/factories/clickstack/hyperdx-oidc/plugin-bundle.generated.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,gEAAgE;AAEhE;;;GAGG;AACH,MAAM,CAAC,MAAM,0BAA0B,GACrC,kxzEAAkxzE,CAAC;AAErxzE,uEAAuE;AACvE,MAAM,CAAC,MAAM,0BAA0B,GAAW,kEAAkE,CAAC;AAErH,2CAA2C;AAC3C,MAAM,CAAC,MAAM,yBAAyB,GAAW,KAAK,CAAC;AAEvD,+FAA+F;AAC/F,MAAM,CAAC,MAAM,iCAAiC,GAAW,kEAAkE,CAAC"}
|