@workflow/core 5.0.0-beta.42 → 5.0.0-beta.43
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/create-hook.d.ts +9 -5
- package/dist/create-hook.d.ts.map +1 -1
- package/dist/create-hook.js +1 -1
- package/dist/private.d.ts +31 -12
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +147 -23
- package/dist/runtime/constants.d.ts +27 -0
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +33 -1
- package/dist/runtime/quickjs-entrypoint.d.ts +2 -0
- package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
- package/dist/runtime/quickjs-entrypoint.js +3 -2
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +54 -29
- package/dist/runtime/step-executor.d.ts +49 -1
- package/dist/runtime/step-executor.d.ts.map +1 -1
- package/dist/runtime/step-executor.js +67 -8
- package/dist/runtime/step-latency.d.ts +6 -0
- package/dist/runtime/step-latency.d.ts.map +1 -1
- package/dist/runtime/step-latency.js +3 -1
- package/dist/runtime/suspension-handler.d.ts +81 -1
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +501 -15
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +126 -16
- package/dist/serialization.d.ts +10 -2
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +48 -6
- package/dist/telemetry.d.ts +6 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +22 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/dist/workflow/create-hook.js +2 -2
- package/dist/workflow/hook.js +3 -3
- package/dist/workflow.js +16 -8
- package/docs/foundations/hooks.mdx +2 -2
- package/docs/foundations/streaming.mdx +24 -0
- package/docs/how-it-works/event-sourcing.mdx +39 -1
- package/package.json +4 -4
|
@@ -506,7 +506,7 @@ async function dispatchPendingOps(params) {
|
|
|
506
506
|
* assume parity with the node engine on this axis.
|
|
507
507
|
*/
|
|
508
508
|
export async function runWorkflowWithQuickJS(params) {
|
|
509
|
-
const { workflowCode, workflowName, workflowRun, preloadedEvents, preloadedEventsComplete, runInput, parentSpan, maxEventsLimit, deliveryAttempt, ownerMessageId, namespace, } = params;
|
|
509
|
+
const { workflowCode, workflowName, workflowRun, preloadedEvents, preloadedEventsComplete, runInput, parentSpan, maxEventsLimit, deliveryAttempt, ownerMessageId, requestId, namespace, } = params;
|
|
510
510
|
// Standalone-caller fallback (tests): without a runtime.ts carrier
|
|
511
511
|
// accessor, fall back to the current invocation context.
|
|
512
512
|
const nextTraceCarrier = params.nextTraceCarrier ?? (() => serializeTraceCarrier());
|
|
@@ -1111,6 +1111,7 @@ export async function runWorkflowWithQuickJS(params) {
|
|
|
1111
1111
|
workflowDeploymentId: workflowRun.deploymentId,
|
|
1112
1112
|
workflowName: workflowRun.workflowName,
|
|
1113
1113
|
workflowStartedAt,
|
|
1114
|
+
requestId,
|
|
1114
1115
|
rootRunId,
|
|
1115
1116
|
stepId: step.correlationId,
|
|
1116
1117
|
stepName: step.stepId,
|
|
@@ -1557,4 +1558,4 @@ export async function runWorkflowWithQuickJS(params) {
|
|
|
1557
1558
|
wfdiag('exit_failed', { result: 'run_failed_written' });
|
|
1558
1559
|
}
|
|
1559
1560
|
}
|
|
1560
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVpY2tqcy1lbnRyeXBvaW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvcXVpY2tqcy1lbnRyeXBvaW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFHSCxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGlCQUFpQixFQUNqQixzQkFBc0IsRUFDdEIsZUFBZSxFQUNmLDBCQUEwQixHQUMzQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFFTCxxQkFBcUIsRUFFckIsb0JBQW9CLEVBQ3BCLDBDQUEwQyxHQUUzQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0MsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixPQUFPLElBQUkscUJBQXFCLEdBRWpDLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixlQUFlLEVBQ2YsWUFBWSxHQUNiLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pFLE9BQU8sS0FBSyxTQUFTLE1BQU0sc0NBQXNDLENBQUM7QUFDbEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUNMLDhCQUE4QixFQUM5QixpQkFBaUIsRUFDakIsOEJBQThCLEVBQzlCLDhCQUE4QixHQUMvQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNqRCxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLFlBQVksRUFDWiwwQkFBMEIsR0FDM0IsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUNMLHdCQUF3QixFQU94QixvQkFBb0IsR0FDckIsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBNEIsTUFBTSxvQkFBb0IsQ0FBQztBQUMzRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXRDLHlFQUF5RTtBQUN6RSxTQUFTLElBQUk7SUFDWCxPQUFPLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUMzQixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQy9CLGVBQTZDO0lBRTdDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDcEUsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsT0FBTyxlQUFlLENBQUMsS0FBSyxDQUMxQixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsS0FBSyxhQUFhLElBQUksQ0FBQyxDQUFDLFNBQVMsS0FBSyxhQUFhLENBQ3RFLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxLQUFLLFVBQVUsZ0JBQWdCLENBQUMsTUFtQy9CO0lBQ0MsTUFBTSxFQUNKLEtBQUssRUFDTCxLQUFLLEVBQ0wsV0FBVyxFQUNYLElBQUksRUFDSixZQUFZLEVBQ1osU0FBUyxFQUNULGdCQUFnQixFQUNoQixPQUFPLEVBQ1AsU0FBUyxFQUNULE1BQU0sR0FDUCxHQUFHLE1BQU0sQ0FBQztJQUNYLE1BQU0sWUFBWSxHQUFHLE1BQU0sZ0JBQWdCLEVBQUUsQ0FBQztJQUM5QyxNQUFNLFlBQVksQ0FDaEIsS0FBSyxFQUNMLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLEVBQ3pEO1FBQ0UsS0FBSztRQUNMLE1BQU0sRUFBRSxJQUFJLENBQUMsYUFBYTtRQUMxQixRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU07UUFDckIsWUFBWTtRQUNaLFdBQVcsRUFBRSxJQUFJLElBQUksRUFBRTtRQUN2QixHQUFHLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ3hFLEVBQ0Q7UUFDRSxxRUFBcUU7UUFDckUsdUVBQXVFO1FBQ3ZFLGtFQUFrRTtRQUNsRSx1RUFBdUU7UUFDdkUsa0NBQWtDO1FBQ2xDLGNBQWMsRUFDWixPQUFPLEtBQUssVUFBVTtZQUNwQixDQUFDLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQzdELENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLElBQUksT0FBTyxFQUFFO1FBQ3hDLEdBQUcsQ0FBQyxZQUFZLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQzlELENBQ0YsQ0FBQztJQUNGLE1BQU0sQ0FBQyxhQUFhLEVBQUU7UUFDcEIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1FBQ25CLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtRQUNqQyxPQUFPO1FBQ1AsWUFBWSxFQUFFLFlBQVksSUFBSSxDQUFDO1FBQy9CLEdBQUcsQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ3hELENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsS0FBSyxVQUFVLGtCQUFrQixDQUFDLE1BZ0NqQztJQU1DLE1BQU0sRUFDSixLQUFLLEVBQ0wsS0FBSyxFQUNMLFdBQVcsRUFDWCxhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxnQkFBZ0IsR0FDakIsR0FBRyxNQUFNLENBQUM7SUFDWCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztJQUNqRCxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDO0lBQzNDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDN0Isc0VBQXNFO0lBQ3RFLHdFQUF3RTtJQUN4RSx1Q0FBdUM7SUFDdkMsTUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUN6QywwRUFBMEU7SUFDMUUsMkVBQTJFO0lBQzNFLG9EQUFvRDtJQUNwRCxFQUFFO0lBQ0Ysb0RBQW9EO0lBQ3BELHdFQUF3RTtJQUN4RSwwRUFBMEU7SUFDMUUsdUVBQXVFO0lBQ3ZFLHlFQUF5RTtJQUN6RSxzRUFBc0U7SUFDdEUsbUVBQW1FO0lBQ25FLE1BQU0seUJBQXlCLEdBQzdCLGFBQWEsS0FBSyxTQUFTO1FBQzNCLGFBQWEsQ0FBQyxJQUFJLEdBQUcsQ0FBQztRQUN0Qiw4QkFBOEIsRUFBRTtRQUNoQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDO1lBQzVCLDBDQUEwQyxDQUFDO0lBQy9DLDhEQUE4RDtJQUM5RCx3RUFBd0U7SUFDeEUsMERBQTBEO0lBQzFELElBQUksc0JBQXNCLEdBQUcsS0FBSyxDQUFDO0lBQ25DLGdFQUFnRTtJQUNoRSxtRUFBbUU7SUFDbkUscUVBQXFFO0lBQ3JFLG1DQUFtQztJQUNuQyxJQUFJLHFCQUFxQixHQUFHLEtBQUssQ0FBQztJQUNsQyxNQUFNLFdBQVcsR0FBb0IsRUFBRSxDQUFDO0lBRXhDLE1BQU0sYUFBYSxHQUFHLEtBQUssRUFBRSxJQUFpQixFQUFpQixFQUFFO1FBQy9ELGFBQWEsQ0FBQyxLQUFLLENBQUMscUNBQXFDLEVBQUU7WUFDekQsYUFBYSxFQUFFLEtBQUs7WUFDcEIsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO1lBQ2pDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixTQUFTLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSztZQUM1QixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDekIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZTtZQUNyQyxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWM7U0FDcEMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUMxQix1REFBdUQ7WUFDdkQsNERBQTREO1lBQzVELHlEQUF5RDtZQUN6RCxxREFBcUQ7WUFDckQsaUNBQWlDO1lBQ2pDLEVBQUU7WUFDRixpRUFBaUU7WUFDakUsK0RBQStEO1lBQy9ELGdFQUFnRTtZQUNoRSw4REFBOEQ7WUFDOUQsdUNBQXVDO1lBQ3ZDLElBQUksQ0FBQztnQkFDSCxNQUFNLGlCQUFpQixHQUNyQixPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssV0FBVztvQkFDbEMsQ0FBQyxDQUFDLFNBQVM7b0JBQ1gsQ0FBQyxDQUFDLE1BQU0scUJBQXFCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztnQkFDaEUsTUFBTSxNQUFNLEdBQUcsTUFBTSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7b0JBQzlDLFNBQVMsRUFBRSxjQUFjO29CQUN6QixXQUFXLEVBQUUsb0JBQW9CO29CQUNqQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7b0JBQ2pDLFNBQVMsRUFBRTt3QkFDVCxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7d0JBQ2pCLG1CQUFtQixFQUNqQixJQUFJLENBQUMsbUJBQW1CLEtBQUssU0FBUzs0QkFDcEMsQ0FBQyxDQUFDLFNBQVM7NEJBQ1gsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQzt3QkFDeEMsUUFBUSxFQUFFLGlCQUFpQjt3QkFDM0IsNERBQTREO3dCQUM1RCwyREFBMkQ7d0JBQzNELDJEQUEyRDt3QkFDM0QsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO3dCQUN6QixzREFBc0Q7d0JBQ3RELG1DQUFtQzt3QkFDbkMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7cUJBQ3RDO2lCQUNULENBQUMsQ0FBQztnQkFFSCx5REFBeUQ7Z0JBQ3pELHdEQUF3RDtnQkFDeEQsa0RBQWtEO2dCQUNsRCxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsU0FBUyxLQUFLLGVBQWUsRUFBRSxDQUFDO29CQUNoRCxNQUFNLFlBQVksQ0FDaEIsS0FBSyxFQUNMLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLEVBQ3pEO3dCQUNFLEtBQUs7d0JBQ0wsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLEVBQUU7d0JBQ3RDLFdBQVcsRUFBRSxJQUFJLElBQUksRUFBRTtxQkFDeEIsRUFDRCxFQUFFLGNBQWMsRUFBRSxpQkFBaUIsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQzFELENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLDREQUE0RDtnQkFDNUQseURBQXlEO2dCQUN6RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQztvQkFBRSxNQUFNLEdBQUcsQ0FBQztZQUM5QyxDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFDL0Isc0JBQXNCLEdBQUcsSUFBSSxDQUFDO1lBQ2hDLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEIsMkRBQTJEO1lBQzNELHlEQUF5RDtZQUN6RCxzREFBc0Q7WUFDdEQsdURBQXVEO1lBQ3ZELCtCQUErQjtZQUMvQixNQUFNLFlBQVksR0FDaEIsSUFBSSxDQUFDLFlBQVksWUFBWSxVQUFVO2dCQUNyQyxDQUFDLENBQUUsQ0FBQyxNQUFNLHFCQUFxQixDQUMzQixJQUFJLENBQUMsWUFBWSxFQUNqQixhQUFhLENBQ2QsQ0FBZ0I7Z0JBQ25CLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDaEIsSUFBSSxDQUFDO2dCQUNILE1BQU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO29CQUMvQixTQUFTLEVBQUUsZUFBZTtvQkFDMUIsV0FBVyxFQUFFLG9CQUFvQjtvQkFDakMsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO29CQUNqQyxTQUFTLEVBQUU7d0JBQ1QsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO3dCQUNqQixPQUFPLEVBQUUsWUFBWTtxQkFDZjtpQkFDVCxDQUFDLENBQUM7WUFDTCxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixJQUFJLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQztvQkFBRSxNQUFNLEdBQUcsQ0FBQztZQUM5QyxDQUFDO1lBQ0Qsa0RBQWtEO1lBQ2xELDRDQUE0QztZQUM1QyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUNuRCxNQUFNLFVBQVUsR0FBRyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDO2dCQUMzRSxJQUFJLENBQUM7b0JBQ0gsTUFBTSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDO29CQUMzRCxNQUFNLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDL0MsQ0FBQztnQkFBQyxNQUFNLENBQUM7b0JBQ1Asb0RBQW9EO29CQUNwRCxZQUFZO29CQUNaLGFBQWEsQ0FBQyxLQUFLLENBQ2pCLHNEQUFzRCxFQUN0RDt3QkFDRSxhQUFhLEVBQUUsS0FBSzt3QkFDcEIsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO3FCQUNsQyxDQUNGLENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7WUFDRCxNQUFNLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ3ZCLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtnQkFDakMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO2FBQ2xCLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDLENBQUM7SUFFRixNQUFNLG9CQUFvQixHQUFHLEtBQUssRUFDaEMsRUFBc0IsRUFDUCxFQUFFO1FBQ2pCLElBQUksQ0FBQztZQUNILE1BQU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO2dCQUMvQixTQUFTLEVBQUUsZUFBZTtnQkFDMUIsV0FBVyxFQUFFLG9CQUFvQjtnQkFDakMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxhQUFhO2FBQ2hDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsSUFBSSxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDO2dCQUFFLE9BQU87WUFDeEMsa0VBQWtFO1lBQ2xFLDREQUE0RDtZQUM1RCw2REFBNkQ7WUFDN0QsK0RBQStEO1lBQy9ELElBQUksaUJBQWlCLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQztnQkFBRSxPQUFPO1lBQ3RDLE1BQU0sR0FBRyxDQUFDO1FBQ1osQ0FBQztJQUNILENBQUMsQ0FBQztJQUVGLHFFQUFxRTtJQUNyRSxpRUFBaUU7SUFDakUsa0VBQWtFO0lBQ2xFLGlFQUFpRTtJQUNqRSxzRUFBc0U7SUFDdEUscUVBQXFFO0lBQ3JFLHFFQUFxRTtJQUNyRSxxRUFBcUU7SUFDckUsbUNBQW1DO0lBQ25DLE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxFQUczQixDQUFDO0lBQ0osS0FBSyxNQUFNLEVBQUUsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1FBQ25DLElBQUksR0FBdUIsQ0FBQztRQUM1QixJQUNFLEVBQUUsQ0FBQyxJQUFJLEtBQUssTUFBTTtZQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLGVBQWUsSUFBSyxFQUFrQixDQUFDLGNBQWMsQ0FBQyxFQUMzRCxDQUFDO1lBQ0QsR0FBRyxHQUFJLEVBQWtCLENBQUMsS0FBSyxDQUFDO1FBQ2xDLENBQUM7YUFBTSxJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssY0FBYyxJQUFJLENBQUMsRUFBRSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzdELGdFQUFnRTtZQUNoRSx1REFBdUQ7WUFDdkQsR0FBRyxHQUFJLEVBQXlCLENBQUMsS0FBSyxJQUFJLFNBQVMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3hFLENBQUM7UUFDRCxJQUFJLEdBQUcsS0FBSyxTQUFTO1lBQUUsU0FBUztRQUNoQyxNQUFNLEtBQUssR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQXNDLENBQUMsQ0FBQztRQUNyRCxDQUFDO2FBQU0sQ0FBQztZQUNOLGNBQWMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBc0MsQ0FBQyxDQUFDLENBQUM7UUFDcEUsQ0FBQztJQUNILENBQUM7SUFDRCxLQUFLLE1BQU0sS0FBSyxJQUFJLGNBQWMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBQzVDLFdBQVcsQ0FBQyxJQUFJLENBQ2QsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUNWLEtBQUssTUFBTSxFQUFFLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ3ZCLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztvQkFDdkIsTUFBTSxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzFCLENBQUM7cUJBQU0sQ0FBQztvQkFDTixNQUFNLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNqQyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUMsQ0FBQyxFQUFFLENBQ0wsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLE1BQU0sRUFBRSxJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFDbkMsSUFDRSxFQUFFLENBQUMsSUFBSSxLQUFLLE1BQU07WUFDbEIsQ0FBQyxFQUFFLENBQUMsZUFBZTtZQUNuQixDQUFDLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQ3hDLENBQUM7WUFDRCxNQUFNLElBQUksR0FBRyxFQUFpQixDQUFDO1lBQy9CLFdBQVcsQ0FBQyxJQUFJLENBQ2QsQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDVixpREFBaUQ7Z0JBQ2pELDREQUE0RDtnQkFDNUQsMERBQTBEO2dCQUMxRCx1REFBdUQ7Z0JBQ3ZELHlEQUF5RDtnQkFDekQsbUNBQW1DO2dCQUNuQyx1REFBdUQ7Z0JBQ3ZELE1BQU0sY0FBYyxHQUFHLE1BQU0scUJBQXFCLENBQ2hELElBQUksQ0FBQyxLQUFLLEVBQ1YsYUFBYSxDQUNkLENBQUM7Z0JBRUYsK0RBQStEO2dCQUMvRCw2REFBNkQ7Z0JBQzdELDBEQUEwRDtnQkFDMUQsOERBQThEO2dCQUM5RCw4REFBOEQ7Z0JBQzlELDZEQUE2RDtnQkFDN0QseURBQXlEO2dCQUN6RCw2REFBNkQ7Z0JBQzdELElBQ0UseUJBQXlCO29CQUN6QixhQUFhLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7b0JBQ3RDLGNBQWMsWUFBWSxVQUFVO29CQUNwQyxjQUFjLENBQUMsVUFBVSxJQUFJLDhCQUE4QixFQUMzRCxDQUFDO29CQUNELE1BQU0sQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDO3dCQUMzRCxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7NEJBQ3pCLFNBQVMsRUFBRSxjQUFjOzRCQUN6QixXQUFXLEVBQUUsb0JBQW9COzRCQUNqQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7NEJBQ2pDLFNBQVMsRUFBRTtnQ0FDVCxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU07Z0NBQ3JCLEtBQUssRUFBRSxjQUFjOzZCQUN0Qjt5QkFDRixDQUFDO3dCQUNGLGdCQUFnQixDQUFDOzRCQUNmLEtBQUs7NEJBQ0wsS0FBSzs0QkFDTCxXQUFXOzRCQUNYLElBQUk7NEJBQ0osU0FBUzs0QkFDVCxnQkFBZ0I7NEJBQ2hCLE9BQU8sRUFBRSxVQUFVOzRCQUNuQixTQUFTLEVBQUUsY0FBYzs0QkFDekIsTUFBTTt5QkFDUCxDQUFDO3FCQUNILENBQUMsQ0FBQztvQkFDSCx3REFBd0Q7b0JBQ3hELHdEQUF3RDtvQkFDeEQseURBQXlEO29CQUN6RCxvREFBb0Q7b0JBQ3BELDBEQUEwRDtvQkFDMUQsa0NBQWtDO29CQUNsQyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFLENBQUM7d0JBQ3RDLE1BQU0sV0FBVyxDQUFDLE1BQU0sQ0FBQztvQkFDM0IsQ0FBQztvQkFDRCxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDdkMsSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLFVBQVUsRUFBRSxDQUFDO3dCQUN2QyxNQUFNLEdBQUcsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDO3dCQUNoQyxJQUFJLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDOzRCQUNoQyx3REFBd0Q7NEJBQ3hELG9EQUFvRDs0QkFDcEQsK0NBQStDOzRCQUMvQyxPQUFPO3dCQUNULENBQUM7d0JBQ0QsSUFBSSxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDOzRCQUMvQix1REFBdUQ7NEJBQ3ZELHNEQUFzRDs0QkFDdEQsb0RBQW9EOzRCQUNwRCxrREFBa0Q7NEJBQ2xELGFBQWE7NEJBQ2IsYUFBYSxDQUFDLElBQUksQ0FDaEIscURBQXFEO2dDQUNuRCxtREFBbUQ7Z0NBQ25ELHdDQUF3QyxFQUMxQztnQ0FDRSxhQUFhLEVBQUUsS0FBSztnQ0FDcEIsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO2dDQUNqQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU07Z0NBQ3JCLEtBQUssRUFBRSxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDOzZCQUN4RCxDQUNGLENBQUM7NEJBQ0YsTUFBTSxDQUFDLG1DQUFtQyxFQUFFO2dDQUMxQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07Z0NBQ25CLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTs2QkFDbEMsQ0FBQyxDQUFDOzRCQUNILE9BQU87d0JBQ1QsQ0FBQzt3QkFDRCxNQUFNLEdBQUcsQ0FBQztvQkFDWixDQUFDO29CQUNELE9BQU87Z0JBQ1QsQ0FBQztnQkFFRCxJQUFJLENBQUM7b0JBQ0gsTUFBTSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7d0JBQy9CLFNBQVMsRUFBRSxjQUFjO3dCQUN6QixXQUFXLEVBQUUsb0JBQW9CO3dCQUNqQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7d0JBQ2pDLFNBQVMsRUFBRTs0QkFDVCxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU07NEJBQ3JCLEtBQUssRUFBRSxjQUFjO3lCQUN0QjtxQkFDRixDQUFDLENBQUM7Z0JBQ0wsQ0FBQztnQkFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO29CQUNiLElBQUksbUJBQW1CLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQzt3QkFBRSxPQUFPO29CQUN4QyxNQUFNLEdBQUcsQ0FBQztnQkFDWixDQUFDO2dCQUVELCtEQUErRDtnQkFDL0QsMkRBQTJEO2dCQUMzRCxvREFBb0Q7Z0JBQ3BELHFCQUFxQjtZQUN2QixDQUFDLENBQUMsRUFBRSxDQUNMLENBQUM7UUFDSixDQUFDO2FBQU0sSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLFdBQVcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUMxRCxNQUFNLElBQUksR0FBRyxFQUFzQixDQUFDO1lBQ3BDLFdBQVcsQ0FBQyxJQUFJLENBQ2QsQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDVixJQUFJLENBQUM7b0JBQ0gsTUFBTSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7d0JBQy9CLFNBQVMsRUFBRSxVQUFVO3dCQUNyQixXQUFXLEVBQUUsb0JBQW9CO3dCQUNqQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7d0JBQ2pDLFNBQVMsRUFBRTs0QkFDVCxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87NEJBQ3JCLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7NEJBQzVCLEdBQUcsQ0FBQyxJQUFJLENBQUMsdUJBQXVCO2dDQUM5QixDQUFDLENBQUMsRUFBRSx1QkFBdUIsRUFBRSxJQUFJLEVBQUU7Z0NBQ25DLENBQUMsQ0FBQyxFQUFFLENBQUM7eUJBQ0Q7cUJBQ1QsQ0FBQyxDQUFDO29CQUNILHFCQUFxQixHQUFHLElBQUksQ0FBQztnQkFDL0IsQ0FBQztnQkFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO29CQUNiLElBQUksbUJBQW1CLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7d0JBQ2hDLHFEQUFxRDt3QkFDckQsZ0RBQWdEO3dCQUNoRCxxQkFBcUIsR0FBRyxJQUFJLENBQUM7d0JBQzdCLE9BQU87b0JBQ1QsQ0FBQztvQkFDRCxNQUFNLEdBQUcsQ0FBQztnQkFDWixDQUFDO1lBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FDTCxDQUFDO1FBQ0osQ0FBQzthQUFNLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDckQsTUFBTSxJQUFJLEdBQUcsRUFBaUIsQ0FBQztZQUMvQixXQUFXLENBQUMsSUFBSSxDQUNkLENBQUMsS0FBSyxJQUFJLEVBQUU7Z0JBQ1YsSUFBSSxDQUFDO29CQUNILE1BQU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO3dCQUMvQixTQUFTLEVBQUUsY0FBYzt3QkFDekIsV0FBVyxFQUFFLG9CQUFvQjt3QkFDakMsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO3dCQUNqQyxTQUFTLEVBQUU7NEJBQ1QsUUFBUSxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7eUJBQ2xDO3FCQUNGLENBQUMsQ0FBQztnQkFDTCxDQUFDO2dCQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7b0JBQ2IsSUFBSSxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDO3dCQUFFLE9BQU87b0JBQ3hDLE1BQU0sR0FBRyxDQUFDO2dCQUNaLENBQUM7WUFDSCxDQUFDLENBQUMsRUFBRSxDQUNMLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVELG9DQUFvQztJQUNwQyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7SUFFL0IsT0FBTyxFQUFFLHFCQUFxQixFQUFFLHNCQUFzQixFQUFFLGNBQWMsRUFBRSxDQUFDO0FBQzNFLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsc0JBQXNCLENBQUMsTUFzRTVDO0lBQ0MsTUFBTSxFQUNKLFlBQVksRUFDWixZQUFZLEVBQ1osV0FBVyxFQUNYLGVBQWUsRUFDZix1QkFBdUIsRUFDdkIsUUFBUSxFQUNSLFVBQVUsRUFDVixjQUFjLEVBQ2QsZUFBZSxFQUNmLGNBQWMsRUFDZCxTQUFTLEdBQ1YsR0FBRyxNQUFNLENBQUM7SUFDWCxtRUFBbUU7SUFDbkUseURBQXlEO0lBQ3pELE1BQU0sZ0JBQWdCLEdBQ3BCLE1BQU0sQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQztJQUM3RCxNQUFNLEtBQUssR0FBRyxNQUFNLFFBQVEsRUFBRSxDQUFDO0lBQy9CLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUM7SUFDaEMsTUFBTSxlQUFlLEdBQUcsSUFBSSxFQUFFLENBQUM7SUFFL0Isc0VBQXNFO0lBQ3RFLDJEQUEyRDtJQUMzRCxvRUFBb0U7SUFDcEUsNERBQTREO0lBQzVELHFFQUFxRTtJQUNyRSw4QkFBOEI7SUFDOUIsTUFBTSxpQkFBaUIsR0FBRyxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUU3RCx1RUFBdUU7SUFDdkUsc0VBQXNFO0lBQ3RFLHNCQUFzQjtJQUN0QixNQUFNLFlBQVksR0FBRyxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0lBRXRFLHVFQUF1RTtJQUN2RSxNQUFNLE1BQU0sR0FBRyxDQUFDLFVBQWtCLEVBQUUsTUFBK0IsRUFBRSxFQUFFO1FBQ3JFLGFBQWEsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUU7WUFDckMsVUFBVTtZQUNWLEtBQUs7WUFDTCxZQUFZO1lBQ1osVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDO1lBQ2hELEdBQUcsTUFBTTtTQUNWLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztJQUVGLFVBQVUsRUFBRSxhQUFhLENBQUM7UUFDeEIsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQztLQUNuQyxDQUFDLENBQUM7SUFFSCxNQUFNLENBQUMsT0FBTyxFQUFFO1FBQ2QsWUFBWTtRQUNaLGVBQWU7UUFDZixrQkFBa0IsRUFDaEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsSUFBSSxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUM7UUFDOUQsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLE1BQU0sSUFBSSxDQUFDO1FBQ2pELFdBQVcsRUFBRSxDQUFDLENBQUMsUUFBUTtLQUN4QixDQUFDLENBQUM7SUFFSCx3RUFBd0U7SUFDeEUsa0RBQWtEO0lBQ2xELE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQztJQUVoQyxnRUFBZ0U7SUFDaEUsc0VBQXNFO0lBQ3RFLHdFQUF3RTtJQUN4RSwwRUFBMEU7SUFDMUUsdUVBQXVFO0lBQ3ZFLGdFQUFnRTtJQUNoRSwwRUFBMEU7SUFDMUUsMEVBQTBFO0lBQzFFLHdFQUF3RTtJQUN4RSx1Q0FBdUM7SUFDdkMsTUFBTSxNQUFNLEdBQUcsTUFBTSxLQUFLLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNqRSxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUU5RSwrREFBK0Q7SUFDL0Qsc0VBQXNFO0lBQ3RFLG1FQUFtRTtJQUNuRSx5REFBeUQ7SUFDekQsSUFBSSxNQUFlLENBQUM7SUFDcEIsSUFBSSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7SUFDM0IsTUFBTSxZQUFZLEdBQ2hCLENBQUMsdUJBQXVCLEtBQUssSUFBSTtRQUMvQixLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQztRQUM5QixlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUM3QixpQkFBaUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNyQyxJQUFJLFlBQVksSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUNwQyxNQUFNLEdBQUcsZUFBZSxDQUFDO0lBQzNCLENBQUM7U0FBTSxDQUFDO1FBQ04sTUFBTSxTQUFTLEdBQVksRUFBRSxDQUFDO1FBQzlCLElBQUksTUFBTSxHQUFrQixJQUFJLENBQUM7UUFDakMsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBRW5CLE9BQU8sT0FBTyxFQUFFLENBQUM7WUFDZixNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUN2QyxLQUFLO2dCQUNMLFVBQVUsRUFBRTtvQkFDVixTQUFTLEVBQUUsS0FBSztvQkFDaEIsTUFBTSxFQUFFLE1BQU0sSUFBSSxTQUFTO29CQUMzQixLQUFLLEVBQUUsSUFBSTtpQkFDWjthQUNGLENBQUMsQ0FBQztZQUNILGtCQUFrQixFQUFFLENBQUM7WUFDckIsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxvRUFBb0U7WUFDcEUsa0VBQWtFO1lBQ2xFLHlFQUF5RTtZQUN6RSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDcEIsTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFDM0IsQ0FBQztZQUNELE9BQU8sR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUM7UUFDaEUsQ0FBQztRQUVELE1BQU0sR0FBRyxTQUFTLENBQUM7SUFDckIsQ0FBQztJQUVELGlFQUFpRTtJQUNqRSxrRUFBa0U7SUFDbEUsd0JBQXdCO0lBQ3hCLElBQUksY0FBYyxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQ3BFLE1BQU0sSUFBSSxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFRCxVQUFVLEVBQUUsYUFBYSxDQUFDO1FBQ3hCLEdBQUcsU0FBUyxDQUFDLHNCQUFzQixDQUFDLFlBQVksQ0FBQztRQUNqRCxHQUFHLFNBQVMsQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ3JELEdBQUcsU0FBUyxDQUFDLHlCQUF5QixDQUFDLGtCQUFrQixDQUFDO0tBQzNELENBQUMsQ0FBQztJQUVILE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRTtRQUN2QixVQUFVLEVBQUUsTUFBTSxDQUFDLE1BQU07UUFDekIsa0JBQWtCO1FBQ2xCLFlBQVk7UUFDWixVQUFVLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBeUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDM0QsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQy9DLE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxFQUFFLEVBQUUsQ0FBQztLQUNQLENBQUMsQ0FBQztJQUVILDBCQUEwQjtJQUMxQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDdkIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsQ0FDOUIsTUFBTTtTQUNILE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsS0FBSyxnQkFBZ0IsQ0FBQztTQUMvQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FDL0IsQ0FBQztJQUNGLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7UUFDM0IsSUFDRSxLQUFLLENBQUMsU0FBUyxLQUFLLGNBQWM7WUFDbEMsS0FBSyxDQUFDLGFBQWE7WUFDbkIsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxFQUMxQyxDQUFDO1lBQ0QsTUFBTSxTQUFTLEdBQ2IsV0FBVyxJQUFJLEtBQUs7Z0JBQ2xCLENBQUMsQ0FBRSxLQUFLLENBQUMsU0FBcUM7Z0JBQzlDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDaEIsTUFBTSxRQUFRLEdBQUcsU0FBUyxFQUFFLFFBQVEsQ0FBQztZQUNyQyxJQUFJLFFBQVEsSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsUUFBa0IsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7Z0JBQzlELElBQUksQ0FBQztvQkFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTt3QkFDOUMsU0FBUyxFQUFFLGdCQUFnQjt3QkFDM0IsV0FBVyxFQUFFLG9CQUFvQjt3QkFDakMsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhO3FCQUNuQyxDQUFDLENBQUM7b0JBQ0gsSUFBSSxNQUFNLENBQUMsS0FBSzt3QkFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDOUMsQ0FBQztnQkFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO29CQUNiLElBQUksbUJBQW1CLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQzt3QkFBRSxTQUFTO29CQUMxQyxNQUFNLEdBQUcsQ0FBQztnQkFDWixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQseUVBQXlFO0lBQ3pFLHlFQUF5RTtJQUN6RSx3REFBd0Q7SUFDeEQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEtBQUssU0FBUyxDQUFDO0lBQ3RELE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLFdBQVcsRUFBRSxDQUFDO0lBRXhELHFDQUFxQztJQUNyQyxhQUFhLENBQUMsS0FBSyxDQUFDLDhCQUE4QixFQUFFO1FBQ2xELGFBQWEsRUFBRSxLQUFLO1FBQ3BCLFVBQVU7UUFDVixVQUFVLEVBQUUsTUFBTSxDQUFDLE1BQU07S0FDMUIsQ0FBQyxDQUFDO0lBRUgsTUFBTSxPQUFPLEdBQUcsTUFBTSxvQkFBb0IsQ0FBQztRQUN6Qyw4REFBOEQ7UUFDOUQsZ0VBQWdFO1FBQ2hFLG1FQUFtRTtRQUNuRSxtREFBbUQ7UUFDbkQsWUFBWSxFQUFFLGlCQUFpQjtRQUMvQixVQUFVO1FBQ1YsV0FBVztRQUNYLE1BQU07UUFDTixpQkFBaUIsRUFBRSxLQUFLLENBQUMsWUFBWTtRQUNyQyxhQUFhO1FBQ2IsSUFBSTtRQUNKLFFBQVE7S0FDVCxDQUFDLENBQUM7SUFDSCxJQUFJLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO0lBRTVCLGFBQWEsQ0FBQyxLQUFLLENBQUMsOEJBQThCLEVBQUU7UUFDbEQsYUFBYSxFQUFFLEtBQUs7UUFDcEIsU0FBUyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUztRQUM3QixTQUFTLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTO1FBQzdCLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU07UUFDdkIsZUFBZSxFQUFFLE1BQU0sQ0FBQyxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsTUFBTTtLQUM3RCxDQUFDLENBQUM7SUFFSCxNQUFNLENBQUMsYUFBYSxFQUFFO1FBQ3BCLE9BQU8sRUFBRSxNQUFNLENBQUMsU0FBUztZQUN2QixDQUFDLENBQUMsV0FBVztZQUNiLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUztnQkFDaEIsQ0FBQyxDQUFDLFdBQVc7Z0JBQ2IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNO29CQUNiLENBQUMsQ0FBQyxRQUFRO29CQUNWLENBQUMsQ0FBQyxTQUFTO1FBQ2pCLGVBQWUsRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sSUFBSSxDQUFDO1FBQ2pFLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2pFLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSTtZQUNaLGFBQWEsRUFBRSxDQUFDLENBQUMsYUFBYTtZQUM5QixlQUFlLEVBQUUsQ0FBQyxDQUFDLGVBQWU7WUFDbEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRyxDQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDcEUsQ0FBQyxDQUFDO1FBQ0gsY0FBYyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTztRQUN0QyxXQUFXLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJO0tBQ2pDLENBQUMsQ0FBQztJQUVILHFDQUFxQztJQUNyQyxFQUFFO0lBQ0Ysb0VBQW9FO0lBQ3BFLG9FQUFvRTtJQUNwRSxFQUFFO0lBQ0Ysc0VBQXNFO0lBQ3RFLGdFQUFnRTtJQUNoRSw2REFBNkQ7SUFDN0QsdUVBQXVFO0lBQ3ZFLHlFQUF5RTtJQUN6RSxrRUFBa0U7SUFDbEUsbUVBQW1FO0lBQ25FLG1FQUFtRTtJQUNuRSwrREFBK0Q7SUFDL0QscUVBQXFFO0lBQ3JFLDJEQUEyRDtJQUMzRCxxREFBcUQ7SUFDckQsdUVBQXVFO0lBQ3ZFLHFFQUFxRTtJQUNyRSxrRUFBa0U7SUFDbEUsc0VBQXNFO0lBQ3RFLG9FQUFvRTtJQUNwRSxxRUFBcUU7SUFDckUsdUVBQXVFO0lBQ3ZFLGlCQUFpQjtJQUNqQixFQUFFO0lBQ0YsbUVBQW1FO0lBQ25FLHFFQUFxRTtJQUNyRSxRQUFRO0lBQ1IsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUN2QyxLQUFLLE1BQU0sQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxDQUFDLE9BQU87WUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBQ0Qsd0RBQXdEO0lBQ3hELE1BQU0sZUFBZSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDMUMsZ0VBQWdFO0lBQ2hFLE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDeEMsb0VBQW9FO0lBQ3BFLGlFQUFpRTtJQUNqRSx5Q0FBeUM7SUFDekMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQzNDLG9FQUFvRTtJQUNwRSxNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDNUMsb0VBQW9FO0lBQ3BFLGtFQUFrRTtJQUNsRSxzRUFBc0U7SUFDdEUsZ0VBQWdFO0lBQ2hFLHFFQUFxRTtJQUNyRSxrRUFBa0U7SUFDbEUsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLEVBRzFCLENBQUM7SUFDSixNQUFNLHlCQUF5QixHQUFHLENBQUMsUUFBaUIsRUFBUSxFQUFFO1FBQzVELEtBQUssTUFBTSxDQUFDLElBQUksUUFBUSxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLENBQUMsYUFBYSxLQUFLLFNBQVM7Z0JBQUUsU0FBUztZQUM1QyxJQUFJLENBQUMsQ0FBQyxTQUFTLEtBQUssY0FBYyxFQUFFLENBQUM7Z0JBQ25DLE1BQU0sS0FBSyxHQUNULFdBQVcsSUFBSSxDQUFDO29CQUNoQixDQUFDLENBQUMsU0FBUztvQkFDWCxnQkFBZ0IsSUFBSSxDQUFDLENBQUMsU0FBUztvQkFDL0IsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLGNBQWMsS0FBSyxRQUFRO29CQUM1QyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxjQUFjO29CQUM1QixDQUFDLENBQUMsU0FBUyxDQUFDO2dCQUNoQixNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDakQsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFO29CQUNqQyxLQUFLO29CQUNMLFdBQVcsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztvQkFDN0QsV0FBVyxFQUFFLEtBQUssRUFBRSxXQUFXLElBQUksS0FBSztpQkFDekMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztpQkFBTSxJQUFJLENBQUMsQ0FBQyxTQUFTLEtBQUssZUFBZSxFQUFFLENBQUM7Z0JBQzNDLE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUNqRCxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUU7b0JBQ2pDLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO29CQUNoQixXQUFXLEVBQUUsSUFBSTtpQkFDbEIsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDLENBQUM7SUFDRix5QkFBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsQyxNQUFNLDBCQUEwQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDckQsTUFBTSxjQUFjLEdBQUcsaUJBQWlCLEVBQUUsQ0FBQztJQUMzQyxNQUFNLE1BQU0sR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBQ2xDLE1BQU0saUJBQWlCLEdBQUcsV0FBVyxDQUFDLFNBQVM7UUFDN0MsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVM7UUFDeEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNmLE1BQU0sU0FBUyxHQUNaLFdBQVcsQ0FBQyxVQUFpRCxFQUFFLENBQzlELHFCQUFxQixDQUN0QixJQUFJLEtBQUssQ0FBQztJQUNiLElBQUksbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0lBQzVCLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNwQix1RUFBdUU7SUFDdkUscUVBQXFFO0lBQ3JFLHFFQUFxRTtJQUNyRSx1RUFBdUU7SUFDdkUsdUVBQXVFO0lBQ3ZFLHNFQUFzRTtJQUN0RSxvQ0FBb0M7SUFDcEMsSUFBSSxvQkFBb0IsR0FBRyxLQUFLLENBQUM7SUFFakMscUVBQXFFO0lBQ3JFLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxJQUFzQixFQUFFO1FBQ3JELE1BQU0sTUFBTSxHQUFZLEVBQUUsQ0FBQztRQUMzQixJQUFJLE1BQU0sR0FBa0IsSUFBSSxDQUFDO1FBQ2pDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQztRQUNuQixPQUFPLE9BQU8sRUFBRSxDQUFDO1lBQ2YsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDdkMsS0FBSztnQkFDTCxVQUFVLEVBQUU7b0JBQ1YsU0FBUyxFQUFFLEtBQUs7b0JBQ2hCLE1BQU0sRUFBRSxNQUFNLElBQUksU0FBUztvQkFDM0IsS0FBSyxFQUFFLElBQUk7aUJBQ1o7YUFDRixDQUFDLENBQUM7WUFDSCxLQUFLLE1BQU0sQ0FBQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDOUIsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztvQkFBRSxTQUFTO2dCQUN2RCxJQUFJLENBQUMsQ0FBQyxPQUFPO29CQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMzQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pCLENBQUM7WUFDRCxJQUFJLFFBQVEsQ0FBQyxNQUFNO2dCQUFFLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQzlDLE9BQU8sR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUM7UUFDaEUsQ0FBQztRQUNELHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xDLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUMsQ0FBQztJQUVGLElBQUksQ0FBQztRQUNILElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNsQixPQUFPLE1BQU0sQ0FBQyxTQUFTLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUM3RCxTQUFTLEVBQUUsQ0FBQztZQUNaLG9FQUFvRTtZQUNwRSxxRUFBcUU7WUFDckUscUVBQXFFO1lBQ3JFLG1FQUFtRTtZQUNuRSwrREFBK0Q7WUFDL0QsU0FBUztZQUNULElBQUksY0FBYyxLQUFLLFNBQVMsSUFBSSxZQUFZLENBQUMsSUFBSSxJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUN4RSxNQUFNLElBQUksc0JBQXNCLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQztZQUN0RSxDQUFDO1lBQ0QsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDO1lBRTdELG9FQUFvRTtZQUNwRSxxRUFBcUU7WUFDckUsbUVBQW1FO1lBQ25FLGdFQUFnRTtZQUNoRSxrRUFBa0U7WUFDbEUsaUVBQWlFO1lBQ2pFLGtFQUFrRTtZQUNsRSxvRUFBb0U7WUFDcEUsb0NBQW9DO1lBQ3BDLE1BQU0sVUFBVSxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FDekMsQ0FBQyxFQUFFLEVBQXFCLEVBQUUsQ0FDeEIsRUFBRSxDQUFDLElBQUksS0FBSyxNQUFNO2dCQUNsQixDQUFDLEVBQUUsQ0FBQyxlQUFlO2dCQUNuQixDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQztnQkFDdEMsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FDdkMsQ0FBQztZQUNGLE1BQU0sZ0JBQWdCLEdBQ3BCLGNBQWMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFDakUsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLENBQzdCLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUNuRCxDQUFDO1lBRUYsNkRBQTZEO1lBQzdELE1BQU0sYUFBYSxHQUFHLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQ2pELEVBQUUsQ0FBQyxJQUFJLEtBQUssTUFBTTtnQkFDakIsRUFBa0IsQ0FBQyxjQUFjO2dCQUNsQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQztnQkFDcEMsQ0FBQyxDQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBdUI7Z0JBQ3hELENBQUMsQ0FBQyxFQUFFLENBQ1AsQ0FBQztZQUNGLEtBQUssTUFBTSxFQUFFLElBQUksaUJBQWlCLEVBQUUsQ0FBQztnQkFDbkMsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLE1BQU0sSUFBSyxFQUFrQixDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUM3RCxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUN6QyxDQUFDO1lBQ0gsQ0FBQztZQUNELGtFQUFrRTtZQUNsRSxtRUFBbUU7WUFDbkUsa0VBQWtFO1lBQ2xFLG1FQUFtRTtZQUNuRSxpRUFBaUU7WUFDakUsbUVBQW1FO1lBQ25FLDREQUE0RDtZQUM1RCw2REFBNkQ7WUFDN0QsK0RBQStEO1lBQy9ELG9FQUFvRTtZQUNwRSxxRUFBcUU7WUFDckUscUVBQXFFO1lBQ3JFLCtEQUErRDtZQUMvRCxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2hFLE1BQU0sVUFBVSxHQUFHLE1BQU0sa0JBQWtCLENBQUM7Z0JBQzFDLEtBQUs7Z0JBQ0wsS0FBSztnQkFDTCxXQUFXO2dCQUNYLGFBQWE7Z0JBQ2IsU0FBUztnQkFDVCxnQkFBZ0I7Z0JBQ2hCLGlCQUFpQixFQUFFLGFBQWE7Z0JBQ2hDLGdCQUFnQixFQUFFLGVBQWU7Z0JBQ2pDLGFBQWEsRUFBRSxJQUFJLEdBQUcsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ2pFLE1BQU07YUFDUCxDQUFDLENBQUM7WUFDSCxJQUNFLFVBQVUsQ0FBQyxxQkFBcUI7Z0JBQ2hDLFVBQVUsQ0FBQyxzQkFBc0IsRUFDakMsQ0FBQztnQkFDRCxvQkFBb0IsR0FBRyxJQUFJLENBQUM7WUFDOUIsQ0FBQztZQUVELEtBQUssTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUM1QyxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pCLENBQUM7WUFDRCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsYUFBYTtpQkFDVixNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2lCQUNwRSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDWixhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDdEMsT0FBTyxnQkFBZ0IsQ0FBQztvQkFDdEIsS0FBSztvQkFDTCxLQUFLO29CQUNMLFdBQVc7b0JBQ1gsSUFBSTtvQkFDSixTQUFTO29CQUNULGdCQUFnQjtvQkFDaEIsT0FBTyxFQUFFLFVBQVU7b0JBQ25CLE1BQU07aUJBQ1AsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQ0wsQ0FBQztZQUVGLG1FQUFtRTtZQUNuRSwyREFBMkQ7WUFDM0QsTUFBTSxvQkFBb0IsR0FBb0IsRUFBRSxDQUFDO1lBQ2pELEtBQUssTUFBTSxFQUFFLElBQUksaUJBQWlCLEVBQUUsQ0FBQztnQkFDbkMsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLE1BQU07b0JBQUUsU0FBUztnQkFDakMsTUFBTSxJQUFJLEdBQUcsRUFBaUIsQ0FBQztnQkFDL0IsSUFBSSxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztvQkFBRSxTQUFTO2dCQUN4RCxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztvQkFBRSxTQUFTO2dCQUNqRSxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUMxQyxvQkFBb0IsQ0FBQyxJQUFJLENBQ3ZCLENBQUMsS0FBSyxJQUFJLEVBQUU7b0JBQ1YsSUFBSSxDQUFDO3dCQUNILE1BQU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFOzRCQUMvQixTQUFTLEVBQUUsZ0JBQWdCOzRCQUMzQixXQUFXLEVBQUUsb0JBQW9COzRCQUNqQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7eUJBQ2xDLENBQUMsQ0FBQztvQkFDTCxDQUFDO29CQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7d0JBQ2IsSUFBSSxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDOzRCQUFFLE9BQU87d0JBQ3hDLE1BQU0sR0FBRyxDQUFDO29CQUNaLENBQUM7Z0JBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FDTCxDQUFDO1lBQ0osQ0FBQztZQUNELElBQUksb0JBQW9CLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNwQyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUMxQyxDQUFDO1lBRUQsb0VBQW9FO1lBQ3BFLHFDQUFxQztZQUNyQyxDQUFDO2dCQUNDLE1BQU0sU0FBUyxHQUFHLE1BQU0saUJBQWlCLEVBQUUsQ0FBQztnQkFDNUMsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUN6Qiw0REFBNEQ7b0JBQzVELDZEQUE2RDtvQkFDN0QsNkRBQTZEO29CQUM3RCxvQkFBb0IsR0FBRyxLQUFLLENBQUM7b0JBQzdCLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDckQsTUFBTSxDQUFDLGtCQUFrQixFQUFFO3dCQUN6QixTQUFTO3dCQUNULEtBQUssRUFBRSxNQUFNO3dCQUNiLFNBQVMsRUFBRSxTQUFTLENBQUMsTUFBTTt3QkFDM0IsT0FBTyxFQUFFLE1BQU0sQ0FBQyxTQUFTOzRCQUN2QixDQUFDLENBQUMsV0FBVzs0QkFDYixDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU07Z0NBQ2IsQ0FBQyxDQUFDLFFBQVE7Z0NBQ1YsQ0FBQyxDQUFDLFdBQVc7cUJBQ2xCLENBQUMsQ0FBQztvQkFDSCxTQUFTO2dCQUNYLENBQUM7WUFDSCxDQUFDO1lBRUQsb0RBQW9EO1lBQ3BELE1BQU0sT0FBTyxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FDdEMsQ0FBQyxFQUFFLEVBQXFCLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FDOUMsQ0FBQztZQUNGLG1FQUFtRTtZQUNuRSxtRUFBbUU7WUFDbkUsbUVBQW1FO1lBQ25FLG9FQUFvRTtZQUNwRSxvRUFBb0U7WUFDcEUsZ0VBQWdFO1lBQ2hFLHdEQUF3RDtZQUN4RCxFQUFFO1lBQ0Ysb0VBQW9FO1lBQ3BFLGdFQUFnRTtZQUNoRSw2REFBNkQ7WUFDN0Qsa0VBQWtFO1lBQ2xFLG1FQUFtRTtZQUNuRSxrRUFBa0U7WUFDbEUsb0JBQW9CO1lBQ3BCLG1FQUFtRTtZQUNuRSxzREFBc0Q7WUFDdEQsbUVBQW1FO1lBQ25FLG1FQUFtRTtZQUNuRSw0REFBNEQ7WUFDNUQsK0RBQStEO1lBQy9ELHdCQUF3QjtZQUN4QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDekIsS0FBSyxNQUFNLElBQUksSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlO29CQUFFLFNBQVM7Z0JBQ3BDLElBQUksZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO29CQUFFLFNBQVM7Z0JBQ3RELElBQUksYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO29CQUFFLFNBQVM7Z0JBQ3BELE1BQU0sU0FBUyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUN4RCxNQUFNLGVBQWUsR0FDbkIsU0FBUyxLQUFLLFNBQVM7b0JBQ3ZCLFNBQVMsQ0FBQyxLQUFLLEtBQUssU0FBUztvQkFDN0IsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO2dCQUN6QixJQUFJLHFCQUFxQixHQUFHLENBQUMsQ0FBQztnQkFDOUIsSUFBSSxlQUFlLElBQUksU0FBUyxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDM0QsTUFBTSxZQUFZLEdBQUcsOEJBQThCLEVBQUUsQ0FBQztvQkFDdEQscUJBQXFCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDOUIsWUFBWSxFQUNaLElBQUksQ0FBQyxHQUFHLENBQ04sQ0FBQyxFQUNELElBQUksQ0FBQyxJQUFJLENBQ1AsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLFlBQVksR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUM3RCxDQUNGLENBQ0YsQ0FBQztnQkFDSixDQUFDO2dCQUNELElBQ0UsZUFBZTtvQkFDZixTQUFTLENBQUMsS0FBSyxLQUFLLGNBQWM7b0JBQ2xDLHFCQUFxQixHQUFHLENBQUMsRUFDekIsQ0FBQztvQkFDRCxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDdEMsTUFBTSxnQkFBZ0IsQ0FBQzt3QkFDckIsS0FBSzt3QkFDTCxLQUFLO3dCQUNMLFdBQVc7d0JBQ1gsSUFBSTt3QkFDSixZQUFZLEVBQUUscUJBQXFCO3dCQUNuQyxTQUFTO3dCQUNULGdCQUFnQjt3QkFDaEIsT0FBTyxFQUFFLFlBQVksU0FBUyxDQUFDLFdBQVcsRUFBRTt3QkFDNUMsTUFBTTtxQkFDUCxDQUFDLENBQUM7Z0JBQ0wsQ0FBQztxQkFBTSxDQUFDO29CQUNOLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUN0QyxNQUFNLGdCQUFnQixDQUFDO3dCQUNyQixLQUFLO3dCQUNMLEtBQUs7d0JBQ0wsV0FBVzt3QkFDWCxJQUFJO3dCQUNKLFNBQVM7d0JBQ1QsZ0JBQWdCO3dCQUNoQixPQUFPLEVBQUUsVUFBVTt3QkFDbkIsTUFBTTtxQkFDUCxDQUFDLENBQUM7Z0JBQ0wsQ0FBQztZQUNILENBQUM7WUFFRCxJQUFJLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDbEMsK0RBQStEO2dCQUMvRCxvREFBb0Q7Z0JBQ3BELE1BQU07WUFDUixDQUFDO1lBRUQsK0RBQStEO1lBQy9ELDZEQUE2RDtZQUM3RCxtRUFBbUU7WUFDbkUsa0VBQWtFO1lBQ2xFLCtCQUErQjtZQUMvQixJQUFJLFdBQW1FLENBQUM7WUFDeEUsS0FBSyxNQUFNLEVBQUUsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO2dCQUNuQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssTUFBTTtvQkFBRSxTQUFTO2dCQUNqQyxNQUFNLElBQUksR0FBRyxFQUFpQixDQUFDO2dCQUMvQixJQUFJLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO29CQUFFLFNBQVM7Z0JBQ2pFLGdFQUFnRTtnQkFDaEUsZ0VBQWdFO2dCQUNoRSxnREFBZ0Q7Z0JBQ2hELElBQUksaUJBQWlCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7b0JBQUUsU0FBUztnQkFDeEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDaEUsaUVBQWlFO2dCQUNqRSxvREFBb0Q7Z0JBQ3BELDhEQUE4RDtnQkFDOUQsNkRBQTZEO2dCQUM3RCw2REFBNkQ7Z0JBQzdELGdFQUFnRTtnQkFDaEUsNkRBQTZEO2dCQUM3RCwyREFBMkQ7Z0JBQzNELGdFQUFnRTtnQkFDaEUsNERBQTREO2dCQUM1RCwyREFBMkQ7Z0JBQzNELGdFQUFnRTtnQkFDaEUsaUVBQWlFO2dCQUNqRSwyREFBMkQ7Z0JBQzNELDZEQUE2RDtnQkFDN0QsZ0VBQWdFO2dCQUNoRSw0REFBNEQ7Z0JBQzVELDRCQUE0QjtnQkFDNUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDeEQsSUFBSSxDQUFDLFdBQVcsSUFBSSxPQUFPLEdBQUcsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNsRCxXQUFXLEdBQUcsRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxPQUFPLEVBQUUsQ0FBQztnQkFDL0QsQ0FBQztZQUNILENBQUM7WUFDRCxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUNoQiwwQkFBMEIsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUMxRCxNQUFNLFlBQVksQ0FDaEIsS0FBSyxFQUNMLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLEVBQ3pEO29CQUNFLEtBQUs7b0JBQ0wsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLEVBQUU7b0JBQ3RDLFdBQVcsRUFBRSxJQUFJLElBQUksRUFBRTtpQkFDeEIsRUFDRCwyQkFBMkIsQ0FDekIsV0FBVyxDQUFDLE9BQU8sRUFDbkIsV0FBVyxDQUFDLGFBQWEsQ0FDMUIsQ0FDRixDQUFDO2dCQUNGLE1BQU0sQ0FBQyw2QkFBNkIsRUFBRTtvQkFDcEMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxhQUFhO29CQUN4QyxZQUFZLEVBQUUsV0FBVyxDQUFDLE9BQU87aUJBQ2xDLENBQUMsQ0FBQztZQUNMLENBQUM7WUFFRCw2REFBNkQ7WUFDN0QsaUVBQWlFO1lBQ2pFLCtEQUErRDtZQUMvRCxtRUFBbUU7WUFDbkUsK0RBQStEO1lBQy9ELGdFQUFnRTtZQUNoRSw0REFBNEQ7WUFDNUQsa0VBQWtFO1lBQ2xFLHdEQUF3RDtZQUN4RCxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLFFBQStCLENBQUM7WUFDcEMsSUFBSSxDQUFDO2dCQUNILFFBQVEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQzFCLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQzVCLG1CQUFtQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRSxDQUNsRCxDQUFDLEtBQUssSUFBSSxFQUFFLENBQ1YsV0FBVyxDQUFDO29CQUNWLEtBQUs7b0JBQ0wsYUFBYSxFQUFFLEtBQUs7b0JBQ3BCLG9CQUFvQixFQUFFLFdBQVcsQ0FBQyxZQUFZO29CQUM5QyxZQUFZLEVBQUUsV0FBVyxDQUFDLFlBQVk7b0JBQ3RDLGlCQUFpQjtvQkFDakIsU0FBUztvQkFDVCxNQUFNLEVBQUUsSUFBSSxDQUFDLGFBQWE7b0JBQzFCLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTTtvQkFDckIsYUFBYTtvQkFDYixjQUFjLEVBQUUsV0FBVyxDQUFDLFdBQVc7b0JBQ3ZDLHdEQUF3RDtvQkFDeEQsdURBQXVEO29CQUN2RCw2Q0FBNkM7b0JBQzdDLGdEQUFnRDtvQkFDaEQsc0RBQXNEO29CQUN0RCx3REFBd0Q7b0JBQ3hELGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUN4QyxJQUFJLENBQUMsS0FBSyxFQUNWLGFBQWEsQ0FDZDtvQkFDRCxtREFBbUQ7b0JBQ25ELHVEQUF1RDtvQkFDdkQsOENBQThDO29CQUM5QyxjQUFjO29CQUNkLG1EQUFtRDtvQkFDbkQsV0FBVztvQkFDWCxvQkFBb0IsRUFBRSxDQUFDO2lCQUN4QixDQUFDLENBQUMsRUFBRSxDQUNSLENBQ0YsQ0FDRixDQUFDO1lBQ0osQ0FBQztvQkFBUyxDQUFDO2dCQUNULE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsQixDQUFDO1lBQ0QsbUJBQW1CLElBQUksZ0JBQWdCLENBQUMsTUFBTSxDQUFDO1lBRS9DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDakQsTUFBTSxJQUFJLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUIsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ3hDLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxXQUFXLEVBQUUsQ0FBQztvQkFDN0QsMERBQTBEO29CQUMxRCxrREFBa0Q7b0JBQ2xELGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUN0QyxNQUFNLGdCQUFnQixDQUFDO3dCQUNyQixLQUFLO3dCQUNMLEtBQUs7d0JBQ0wsV0FBVzt3QkFDWCxJQUFJO3dCQUNKLFlBQVksRUFBRSxPQUFPLENBQUMsY0FBYzt3QkFDcEMsU0FBUzt3QkFDVCxnQkFBZ0I7d0JBQ2hCLDZEQUE2RDt3QkFDN0Qsd0RBQXdEO3dCQUN4RCx3REFBd0Q7d0JBQ3hELDZEQUE2RDt3QkFDN0QsT0FBTyxFQUFFLFNBQVM7d0JBQ2xCLE1BQU07cUJBQ1AsQ0FBQyxDQUFDO2dCQUNMLENBQUM7cUJBQU0sSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRSxDQUFDO29CQUNuQyxPQUFPLEdBQUcsSUFBSSxDQUFDO2dCQUNqQixDQUFDO2dCQUNELG1FQUFtRTtnQkFDbkUsZ0VBQWdFO2dCQUNoRSxpRUFBaUU7Z0JBQ2pFLG9DQUFvQztZQUN0QyxDQUFDO1lBQ0QsTUFBTSxDQUFDLHVCQUF1QixFQUFFO2dCQUM5QixTQUFTO2dCQUNULEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxNQUFNO2dCQUM5QixRQUFRLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQzthQUN0QyxDQUFDLENBQUM7WUFFSCxpRUFBaUU7WUFDakUsK0RBQStEO1lBQy9ELG9FQUFvRTtZQUNwRSxtRUFBbUU7WUFDbkUsb0VBQW9FO1lBQ3BFLGdFQUFnRTtZQUNoRSxtRUFBbUU7WUFDbkUsb0VBQW9FO1lBQ3BFLGdFQUFnRTtZQUNoRSxnRUFBZ0U7WUFDaEUsbUVBQW1FO1lBQ25FLGlDQUFpQztZQUNqQyxNQUFNLFNBQVMsR0FBRyxNQUFNLGlCQUFpQixFQUFFLENBQUM7WUFDNUMsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUMzQixvQkFBb0IsR0FBRyxJQUFJLENBQUM7Z0JBQzVCLE1BQU07WUFDUixDQUFDO1lBQ0QsTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRXJELE1BQU0sQ0FBQyxrQkFBa0IsRUFBRTtnQkFDekIsU0FBUztnQkFDVCxLQUFLLEVBQUUsT0FBTztnQkFDZCxTQUFTLEVBQUUsU0FBUyxDQUFDLE1BQU07Z0JBQzNCLE9BQU8sRUFBRSxNQUFNLENBQUMsU0FBUztvQkFDdkIsQ0FBQyxDQUFDLFdBQVc7b0JBQ2IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNO3dCQUNiLENBQUMsQ0FBQyxRQUFRO3dCQUNWLENBQUMsQ0FBQyxXQUFXO2dCQUNqQixlQUFlLEVBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRTthQUN0QyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztZQUFTLENBQUM7UUFDVCxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVELFVBQVUsRUFBRSxhQUFhLENBQUM7UUFDeEIsR0FBRyxTQUFTLENBQUMsa0JBQWtCLENBQUMsbUJBQW1CLENBQUM7S0FDckQsQ0FBQyxDQUFDO0lBRUgsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDckIscUJBQXFCO1FBQ3JCLGFBQWEsQ0FBQyxJQUFJLENBQUMscUNBQXFDLEVBQUU7WUFDeEQsYUFBYSxFQUFFLEtBQUs7U0FDckIsQ0FBQyxDQUFDO1FBQ0gsVUFBVSxFQUFFLGFBQWEsQ0FBQztZQUN4QixHQUFHLFNBQVMsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO1NBQ3pDLENBQUMsQ0FBQztRQUVILHFFQUFxRTtRQUNyRSxtRUFBbUU7UUFDbkUsdUVBQXVFO1FBQ3ZFLGtFQUFrRTtRQUNsRSxtQkFBbUI7UUFDbkIsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGVBQWUsRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUM3QyxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxrQkFBa0IsQ0FBQztvQkFDdkIsS0FBSztvQkFDTCxLQUFLO29CQUNMLFdBQVc7b0JBQ1gsYUFBYTtvQkFDYixTQUFTO29CQUNULGdCQUFnQjtvQkFDaEIsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxlQUFlO29CQUNuRCxNQUFNO2lCQUNQLENBQUMsQ0FBQztZQUNMLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLGFBQWEsQ0FBQyxJQUFJLENBQUMsd0NBQXdDLEVBQUU7b0JBQzNELGFBQWEsRUFBRSxLQUFLO29CQUNwQixPQUFPLEVBQUcsR0FBYSxFQUFFLE9BQU87aUJBQ2pDLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO1FBRUQsOEJBQThCO1FBQzlCLHlFQUF5RTtRQUN6RSxxRUFBcUU7UUFDckUsMkVBQTJFO1FBQzNFLHNFQUFzRTtRQUN0RSxvREFBb0Q7UUFDcEQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7Z0JBQy9CLFNBQVMsRUFBRSxlQUFlO2dCQUMxQixXQUFXLEVBQUUsb0JBQW9CO2dCQUNqQyxTQUFTLEVBQUU7b0JBQ1QsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQ2pDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUN2QixhQUFhLENBQ2Q7aUJBQ0Y7YUFDRixDQUFDLENBQUM7WUFDSCxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsSUFBSSxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksZUFBZSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUMzRCxhQUFhLENBQUMsSUFBSSxDQUNoQixtREFBbUQsRUFDbkQsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQ3pCLENBQUM7Z0JBQ0YsTUFBTSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsTUFBTSxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQztnQkFDekQsT0FBTztZQUNULENBQUM7WUFDRCxNQUFNLENBQUMsc0JBQXNCLEVBQUU7Z0JBQzdCLFNBQVMsRUFBRyxHQUFhLEVBQUUsSUFBSTtnQkFDL0IsWUFBWSxFQUFHLEdBQWEsRUFBRSxPQUFPO2FBQ3RDLENBQUMsQ0FBQztZQUNILE1BQU0sR0FBRyxDQUFDO1FBQ1osQ0FBQztJQUNILENBQUM7U0FBTSxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM1QixtRUFBbUU7UUFDbkUsb0VBQW9FO1FBQ3BFLGtFQUFrRTtRQUNsRSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBRS9DLGFBQWEsQ0FBQyxJQUFJLENBQUMscUNBQXFDLEVBQUU7WUFDeEQsYUFBYSxFQUFFLEtBQUs7WUFDcEIsbUJBQW1CO1lBQ25CLFlBQVksRUFBRSxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUMsTUFBTTtZQUN2RSxZQUFZLEVBQUUsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxDQUFDLE1BQU07WUFDdkUsVUFBVSxFQUFFLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDeEMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO2dCQUNaLGFBQWEsRUFBRSxDQUFDLENBQUMsYUFBYTtnQkFDOUIsZUFBZSxFQUFFLENBQUMsQ0FBQyxlQUFlO2dCQUNsQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFHLENBQWlCLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUNwRSxDQUFDLENBQUM7U0FDSixDQUFDLENBQUM7UUFFSCxVQUFVLEVBQUUsYUFBYSxDQUFDO1lBQ3hCLEdBQUcsU0FBUyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUM7WUFDeEMsR0FBRyxTQUFTLENBQUMsc0JBQXNCLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDO1NBQzlELENBQUMsQ0FBQztRQUVILElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixtRUFBbUU7WUFDbkUsTUFBTSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDakQsT0FBTztRQUNULENBQUM7UUFFRCxpRUFBaUU7UUFDakUsaUVBQWlFO1FBQ2pFLDREQUE0RDtRQUM1RCxvRUFBb0U7UUFDcEUsK0RBQStEO1FBQy9ELGlFQUFpRTtRQUNqRSxrRUFBa0U7UUFDbEUsb0VBQW9FO1FBQ3BFLG1FQUFtRTtRQUNuRSxpRUFBaUU7UUFDakUsMERBQTBEO1FBQzFELE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxJQUFtQixFQUFFO1lBQ25ELE1BQU0sWUFBWSxDQUNoQixLQUFLLEVBQ0wsb0JBQW9CLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsRUFDekQ7Z0JBQ0UsS0FBSztnQkFDTCxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsRUFBRTtnQkFDdEMsV0FBVyxFQUFFLElBQUksSUFBSSxFQUFFO2FBQ3hCLENBQ0YsQ0FBQztRQUNKLENBQUMsQ0FBQztRQUVGLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDekIsNERBQTREO1lBQzVELDZDQUE2QztZQUM3QyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1lBQ2pFLE1BQU0sa0JBQWtCLEVBQUUsQ0FBQztZQUMzQixPQUFPO1FBQ1QsQ0FBQztRQUVELCtEQUErRDtRQUMvRCxnRUFBZ0U7UUFDaEUscUVBQXFFO1FBQ3JFLDREQUE0RDtRQUM1RCxJQUFJLFdBQW1FLENBQUM7UUFDeEUsSUFBSSxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQzNCLEtBQUssTUFBTSxFQUFFLElBQUksaUJBQWlCLEVBQUUsQ0FBQztZQUNuQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssTUFBTTtnQkFBRSxTQUFTO1lBQ2pDLE1BQU0sSUFBSSxHQUFHLEVBQWlCLENBQUM7WUFDL0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNoRSxJQUFJLFFBQVEsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDbEIsY0FBYyxHQUFHLElBQUksQ0FBQztZQUN4QixDQUFDO2lCQUFNLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7Z0JBQy9ELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQy9ELElBQUksQ0FBQyxXQUFXLElBQUksY0FBYyxHQUFHLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDekQsV0FBVyxHQUFHO3dCQUNaLE9BQU8sRUFBRSxjQUFjO3dCQUN2QixhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7cUJBQ2xDLENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNuQixNQUFNLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQyxDQUFDO1lBQzdELE1BQU0sa0JBQWtCLEVBQUUsQ0FBQztZQUMzQixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksb0JBQW9CLEVBQUUsQ0FBQztZQUN6Qiw2REFBNkQ7WUFDN0QsNkRBQTZEO1lBQzdELGtFQUFrRTtZQUNsRSwrREFBK0Q7WUFDL0QsNERBQTREO1lBQzVELDREQUE0RDtZQUM1RCxnRUFBZ0U7WUFDaEUsbUVBQW1FO1lBQ25FLGlEQUFpRDtZQUNqRCxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsMkJBQTJCLEVBQUUsQ0FBQyxDQUFDO1lBQ2xFLE1BQU0sa0JBQWtCLEVBQUUsQ0FBQztZQUMzQixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsaUVBQWlFO1lBQ2pFLDJEQUEyRDtZQUMzRCw4REFBOEQ7WUFDOUQsMERBQTBEO1lBQzFELGdDQUFnQztZQUNoQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ3ZCLE1BQU0sRUFBRSx1QkFBdUI7Z0JBQy9CLGNBQWMsRUFBRSxXQUFXLENBQUMsT0FBTztnQkFDbkMsaUJBQWlCLEVBQUUsV0FBVyxDQUFDLGFBQWE7YUFDN0MsQ0FBQyxDQUFDO1lBQ0gsMEJBQTBCLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMxRCxNQUFNLFlBQVksQ0FDaEIsS0FBSyxFQUNMLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLEVBQ3pEO2dCQUNFLEtBQUs7Z0JBQ0wsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLEVBQUU7Z0JBQ3RDLFdBQVcsRUFBRSxJQUFJLElBQUksRUFBRTthQUN4QixFQUNELDJCQUEyQixDQUN6QixXQUFXLENBQUMsT0FBTyxFQUNuQixXQUFXLENBQUMsYUFBYSxDQUMxQixDQUNGLENBQUM7WUFDRixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRTtZQUN2QixNQUFNLEVBQUUsbUJBQW1CO1lBQzNCLGVBQWUsRUFBRSxpQkFBaUIsQ0FBQyxNQUFNO1NBQzFDLENBQUMsQ0FBQztJQUNMLENBQUM7U0FBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN6QixnRUFBZ0U7UUFDaEUsbUVBQW1FO1FBQ25FLHFFQUFxRTtRQUNyRSw4REFBOEQ7UUFDOUQsa0VBQWtFO1FBQ2xFLG1FQUFtRTtRQUNuRSxJQUFJLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNyQyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2YsTUFBTSxVQUFVLEdBQUcsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDbkQsTUFBTSxRQUFRLEdBQUcsVUFBVSxFQUFFLGVBQWUsSUFBSSxZQUFZLENBQUM7WUFDN0QsVUFBVSxHQUFHLGVBQWUsQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQ2pFLFVBQVUsR0FBRyxlQUFlLENBQzFCLFVBQVUsRUFDVix3QkFBd0IsRUFDeEIsWUFBWSxDQUNiLENBQUM7UUFDSixDQUFDO1FBRUQscUVBQXFFO1FBQ3JFLHFFQUFxRTtRQUNyRSxzREFBc0Q7UUFDdEQsRUFBRTtRQUNGLGdFQUFnRTtRQUNoRSxrRUFBa0U7UUFDbEUsaUVBQWlFO1FBQ2pFLG9FQUFvRTtRQUNwRSxNQUFNLGFBQWEsR0FDakIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssNEJBQTRCO1lBQ2pELENBQUMsQ0FBQyxJQUFJLDBCQUEwQixDQUFDLFlBQVksQ0FBQztZQUM5QyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssT0FBTztnQkFDOUIsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO2dCQUNsQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUM5QyxJQUFJLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJO2lCQUN6QixDQUFDLENBQUM7UUFDWCxNQUFNLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUVsRCxhQUFhLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxFQUFFO1lBQ3RELGFBQWEsRUFBRSxLQUFLO1lBQ3BCLFNBQVMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUk7WUFDN0IsWUFBWSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTztZQUNuQyxVQUFVO1lBQ1YsU0FBUztTQUNWLENBQUMsQ0FBQztRQUNILFVBQVUsRUFBRSxhQUFhLENBQUM7WUFDeEIsR0FBRyxTQUFTLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQztTQUN0QyxDQUFDLENBQUM7UUFFSCxrRUFBa0U7UUFDbEUsZ0RBQWdEO1FBQ2hELElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDO2dCQUNILE1BQU0sa0JBQWtCLENBQUM7b0JBQ3ZCLEtBQUs7b0JBQ0wsS0FBSztvQkFDTCxXQUFXO29CQUNYLGFBQWE7b0JBQ2IsU0FBUztvQkFDVCxnQkFBZ0I7b0JBQ2hCLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsZUFBZTtvQkFDaEQsTUFBTTtpQkFDUCxDQUFDLENBQUM7WUFDTCxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixhQUFhLENBQUMsSUFBSSxDQUFDLHdDQUF3QyxFQUFFO29CQUMzRCxhQUFhLEVBQUUsS0FBSztvQkFDcEIsT0FBTyxFQUFHLEdBQWEsRUFBRSxPQUFPO2lCQUNqQyxDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztRQUVELDJEQUEyRDtRQUMzRCxxRUFBcUU7UUFDckUsb0VBQW9FO1FBQ3BFLDJCQUEyQjtRQUMzQixpRUFBaUU7UUFDakUsZ0VBQWdFO1FBQ2hFLGlFQUFpRTtRQUNqRSwrREFBK0Q7UUFDL0QsaUVBQWlFO1FBQ2pFLCtEQUErRDtRQUMvRCw2REFBNkQ7UUFDN0Qsa0VBQWtFO1FBQ2xFLHVEQUF1RDtRQUN2RCxnRUFBZ0U7UUFDaEUsdURBQXVEO1FBQ3ZELElBQUksZUFBMkIsQ0FBQztRQUNoQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDN0IsNERBQTREO1lBQzVELGlFQUFpRTtZQUNqRSw0REFBNEQ7WUFDNUQsNkRBQTZEO1lBQzdELDhEQUE4RDtZQUM5RCxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSxlQUFlLENBQ3BDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUN4QixLQUFLLEVBQ0wsU0FBUyxDQUFDLDJCQUEyQjtpQkFDdEMsQ0FBQztnQkFDRixJQUNFLFFBQVE7b0JBQ1IsT0FBTyxRQUFRLEtBQUssUUFBUTtvQkFDNUIsT0FBTyxJQUFLLFFBQW1CO29CQUMvQixPQUFRLFFBQWdDLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFDM0QsQ0FBQztvQkFDRCxNQUFNLFVBQVUsR0FBRyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDbkQsTUFBTSxRQUFRLEdBQUcsVUFBVSxFQUFFLGVBQWUsSUFBSSxZQUFZLENBQUM7b0JBQzdELDhEQUE4RDtvQkFDN0QsUUFBK0IsQ0FBQyxLQUFLLEdBQUcsZUFBZSxDQUN0RCxlQUFlLENBQ1osUUFBOEIsQ0FBQyxLQUFLLEVBQ3JDLFFBQVEsRUFDUixZQUFZLENBQ2IsRUFDRCx3QkFBd0IsRUFDeEIsWUFBWSxDQUNiLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxvREFBb0Q7Z0JBQ3BELE1BQU0sSUFBSSxHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7Z0JBQ25DLElBQUksSUFBSSxHQUFJLFFBQWdDLEVBQUUsS0FBSyxDQUFDO2dCQUNwRCxPQUFPLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQWMsQ0FBQyxFQUFFLENBQUM7b0JBQ3JFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBYyxDQUFDLENBQUM7b0JBQ3pCLE1BQU0sU0FBUyxHQUFJLElBQTRCLENBQUMsS0FBSyxDQUFDO29CQUN0RCxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsRUFBRSxDQUFDO3dCQUNsQyxNQUFNLFVBQVUsR0FBRyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQzt3QkFDbkQsTUFBTSxRQUFRLEdBQUcsVUFBVSxFQUFFLGVBQWUsSUFBSSxZQUFZLENBQUM7d0JBQzdELDhEQUE4RDt3QkFDN0QsSUFBMkIsQ0FBQyxLQUFLLEdBQUcsZUFBZSxDQUNsRCxlQUFlLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxZQUFZLENBQUMsRUFDbEQsd0JBQXdCLEVBQ3hCLFlBQVksQ0FDYixDQUFDO29CQUNKLENBQUM7b0JBQ0QsSUFBSSxHQUFJLElBQTRCLENBQUMsS0FBSyxDQUFDO2dCQUM3QyxDQUFDO2dCQUNELGVBQWUsR0FBRyxNQUFNLGlCQUFpQixDQUN2QyxRQUFRLEVBQ1IsS0FBSyxFQUNMLGFBQWEsQ0FDZCxDQUFDO1lBQ0osQ0FBQztZQUFDLE9BQU8sWUFBWSxFQUFFLENBQUM7Z0JBQ3RCLDJEQUEyRDtnQkFDM0QsNERBQTREO2dCQUM1RCwwREFBMEQ7Z0JBQzFELDBDQUEwQztnQkFDMUMsYUFBYSxDQUFDLElBQUksQ0FDaEIsaUZBQWlGLEVBQ2pGO29CQUNFLGFBQWEsRUFBRSxLQUFLO29CQUNwQixPQUFPLEVBQUcsWUFBc0IsRUFBRSxPQUFPO2lCQUMxQyxDQUNGLENBQUM7Z0JBQ0YsZUFBZSxHQUFHLENBQUMsTUFBTSxZQUFZLENBQ25DLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUN4QixhQUFhLENBQ2QsQ0FBZSxDQUFDO1lBQ25CLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ2YsYUFBYSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUM7WUFDbkMsQ0FBQztZQUNELElBQUksQ0FBQztnQkFDSCxlQUFlLEdBQUcsTUFBTSxpQkFBaUIsQ0FDdkMsYUFBYSxFQUNiLEtBQUssRUFDTCxhQUFhLENBQ2QsQ0FBQztZQUNKLENBQUM7WUFBQyxPQUFPLE1BQU0sRUFBRSxDQUFDO2dCQUNoQiw2REFBNkQ7Z0JBQzdELDZEQUE2RDtnQkFDN0QsYUFBYSxDQUFDLElBQUksQ0FDaEIsNEVBQTRFLEVBQzVFLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUcsTUFBZ0IsRUFBRSxPQUFPLEVBQUUsQ0FDOUQsQ0FBQztnQkFDRixlQUFlLEdBQUcsTUFBTSxpQkFBaUIsQ0FDdkMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUM5QyxJQUFJLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJO2lCQUN6QixDQUFDLEVBQ0YsS0FBSyxFQUNMLGFBQWEsQ0FDZCxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLENBQUM7WUFDSCxNQUFNLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtnQkFDL0IsU0FBUyxFQUFFLFlBQVk7Z0JBQ3ZCLFdBQVcsRUFBRSxvQkFBb0I7Z0JBQ2pDLFNBQVMsRUFBRTtvQkFDVCxLQUFLLEVBQUUsZUFBZTtvQkFDdEIsU0FBUztpQkFDVjthQUNGLENBQUMsQ0FBQztRQUNMLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsSUFBSSxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksZUFBZSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUMzRCxhQUFhLENBQUMsSUFBSSxDQUFDLGdEQUFnRCxFQUFFO29CQUNuRSxhQUFhLEVBQUUsS0FBSztpQkFDckIsQ0FBQyxDQUFDO2dCQUNILE1BQU0sQ0FBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO2dCQUN0RCxPQUFPO1lBQ1QsQ0FBQztZQUNELE1BQU0sQ0FBQyxtQkFBbUIsRUFBRTtnQkFDMUIsU0FBUyxFQUFHLEdBQWEsRUFBRSxJQUFJO2dCQUMvQixZQUFZLEVBQUcsR0FBYSxFQUFFLE9BQU87YUFDdEMsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxHQUFHLENBQUM7UUFDWixDQUFDO1FBQ0QsTUFBTSxDQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxDQUFDLENBQUM7SUFDMUQsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFF1aWNrSlMgVk0gaW50ZWdyYXRpb24gd2l0aCB0aGUgV29ya2Zsb3cgRGV2S2l0LlxuICpcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHRoZSBlbnRyeSBwb2ludCBmb3IgcnVubmluZyB3b3JrZmxvd3MgaW4gdGhlXG4gKiBRdWlja0pTIFdBU00gVk0gZW5naW5lIGluc3RlYWQgb2YgdGhlIGBub2RlOnZtYCBlbmdpbmUuIEJvdGggZW5naW5lc1xuICogaW1wbGVtZW50IHRoZSBzYW1lIGV2ZW50LXJlcGxheSBleGVjdXRpb24gbW9kZWwg4oCUIGV2ZXJ5IGludm9jYXRpb246XG4gKlxuICogMS4gTG9hZHMgdGhlIGZ1bGwgZXZlbnQgbG9nIGZvciB0aGUgcnVuXG4gKiAyLiBSdW5zIHRoZSB3b3JrZmxvdyBmdW5jdGlvbiBmcm9tIHRoZSB0b3AgaW4gYSBmcmVzaCBRdWlja0pTIFZNLFxuICogICAgcmVwbGF5aW5nIHRoZSBldmVudCBsb2cgdG8gcmVzb2x2ZSBhd2FpdGVkIHByaW1pdGl2ZXNcbiAqIDMuIE9uIHN1c3BlbnNpb246IGNyZWF0ZXMgZXZlbnRzICsgcXVldWVzIHN0ZXBzIGZvciBuZXcgcGVuZGluZyBvcHNcbiAqIDQuIE9uIGNvbXBsZXRpb246IGNyZWF0ZXMgcnVuX2NvbXBsZXRlZFxuICogNS4gT24gZmFpbHVyZTogY3JlYXRlcyBydW5fZmFpbGVkXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTcGFuIH0gZnJvbSAnQG9wZW50ZWxlbWV0cnkvYXBpJztcbmltcG9ydCB7XG4gIEVudGl0eUNvbmZsaWN0RXJyb3IsXG4gIEhvb2tOb3RGb3VuZEVycm9yLFxuICBNYXhFdmVudHNFeGNlZWRlZEVycm9yLFxuICBSdW5FeHBpcmVkRXJyb3IsXG4gIFdvcmtmbG93Tm90UmVnaXN0ZXJlZEVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IHBhcnNlV29ya2Zsb3dOYW1lIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzL3BhcnNlLW5hbWUnO1xuaW1wb3J0IHtcbiAgdHlwZSBFdmVudCxcbiAgUk9PVF9SVU5fSURfQVRUUklCVVRFLFxuICB0eXBlIFJ1bklucHV0LFxuICBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NCT1JfUVVFVUVfVFJBTlNQT1JULFxuICB0eXBlIFdvcmtmbG93UnVuLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgY2xhc3NpZnlSdW5FcnJvciwgaXNSZXRyeWFibGVXb3JsZEVycm9yIH0gZnJvbSAnLi4vY2xhc3NpZnktZXJyb3IuanMnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQge1xuICBkZXJpdmVSdW5QYXlsb2FkS2V5cyxcbiAgZW5jcnlwdCBhcyBlbmNyeXB0U2VyaWFsaXplZERhdGEsXG4gIHR5cGUgUnVuUGF5bG9hZEtleXMsXG59IGZyb20gJy4uL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQge1xuICBkZWh5ZHJhdGVSdW5FcnJvcixcbiAgaHlkcmF0ZVJ1bkVycm9yLFxuICBtYXliZUVuY3J5cHQsXG59IGZyb20gJy4uL3NlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgcmVtYXBFcnJvclN0YWNrLCBzdHJpcElubGluZVNvdXJjZU1hcCB9IGZyb20gJy4uL3NvdXJjZS1tYXAuanMnO1xuaW1wb3J0ICogYXMgQXR0cmlidXRlIGZyb20gJy4uL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQgeyBzZXJpYWxpemVUcmFjZUNhcnJpZXIgfSBmcm9tICcuLi90ZWxlbWV0cnkuanMnO1xuaW1wb3J0IHtcbiAgZ2V0SW5saW5lT3duZXJzaGlwTGVhc2VTZWNvbmRzLFxuICBnZXRNYXhJbmxpbmVTdGVwcyxcbiAgaXNSZXNpbGllbnRTdGVwRGlzcGF0Y2hFbmFibGVkLFxuICBNQVhfUkVTSUxJRU5UX1NURVBfSU5QVVRfQllURVMsXG59IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IGdldFBvcnRMYXp5IH0gZnJvbSAnLi9nZXQtcG9ydC1sYXp5LmpzJztcbmltcG9ydCB7XG4gIGdldFdvcmtmbG93UXVldWVOYW1lLFxuICBxdWV1ZU1lc3NhZ2UsXG4gIHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5LFxufSBmcm9tICcuL2hlbHBlcnMuanMnO1xuaW1wb3J0IHtcbiAgQkFTRUxJTkVfQlVORExFX0ZJTEVOQU1FLFxuICB0eXBlIFBlbmRpbmdBdHRyaWJ1dGUsXG4gIHR5cGUgUGVuZGluZ0hvb2ssXG4gIHR5cGUgUGVuZGluZ0hvb2tEaXNwb3NlLFxuICB0eXBlIFBlbmRpbmdPcGVyYXRpb24sXG4gIHR5cGUgUGVuZGluZ1N0ZXAsXG4gIHR5cGUgUGVuZGluZ1dhaXQsXG4gIHN0YXJ0UXVpY2tKU1dvcmtmbG93LFxufSBmcm9tICcuL3F1aWNranMtcnVudGltZS5qcyc7XG5pbXBvcnQgeyBSZXBsYXlCdWRnZXQgfSBmcm9tICcuL3JlcGxheS1idWRnZXQuanMnO1xuaW1wb3J0IHsgZXhlY3V0ZVN0ZXAsIHR5cGUgU3RlcEV4ZWN1dGlvblJlc3VsdCB9IGZyb20gJy4vc3RlcC1leGVjdXRvci5qcyc7XG5pbXBvcnQgeyBydW5TdGVwU2luZ2xlRmxpZ2h0IH0gZnJvbSAnLi9zdGVwLXNpbmdsZS1mbGlnaHQuanMnO1xuaW1wb3J0IHsgZ2V0V2FpdENvbnRpbnVhdGlvbkRpc3BhdGNoIH0gZnJvbSAnLi93YWl0LWNvbnRpbnVhdGlvbi5qcyc7XG5pbXBvcnQgeyBnZXRXb3JsZCB9IGZyb20gJy4vd29ybGQuanMnO1xuXG4vKiogVGlueSBtcyB0aW1lciB1c2luZyBwZXJmb3JtYW5jZS5ub3coKSDigJQgYWxyZWFkeSBtb25vdG9uaWMgb24gTm9kZS4gKi9cbmZ1bmN0aW9uIHRpY2soKTogbnVtYmVyIHtcbiAgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBzdXBwbGllZCBwcmVsb2FkZWQgZXZlbnRzIGluZGljYXRlIHRoaXMgaXMgdGhlXG4gKiBmaXJzdCB3b3JrZmxvdyBoYW5kbGVyIGludm9jYXRpb24gZm9yIHRoZSBydW4g4oCUIGkuZS4gdGhlIGxvZyBjb250YWluc1xuICogbm90aGluZyBiZXlvbmQgYHJ1bl9jcmVhdGVkYCAvIGBydW5fc3RhcnRlZGAuIEluIHRoYXQgY2FzZSB0aGVcbiAqIHByZWxvYWRlZCBldmVudHMgQVJFIHRoZSBjb21wbGV0ZSBldmVudCBsb2cgYW5kIHRoZSBgZXZlbnRzLmxpc3RgXG4gKiByb3VuZC10cmlwcyBjYW4gYmUgc2tpcHBlZCBlbnRpcmVseS5cbiAqXG4gKiBDcnVjaWFsbHksIGlmIHRoZSB3b3JsZCBiYWNrZmlsbGVkIGEgbWlzc2luZyBgcnVuX2NyZWF0ZWRgIHZpYSB0aGVcbiAqIHJlc2lsaWVudCBzdGFydCBwYXRoLCBgcHJlbG9hZGVkRXZlbnRzYCBjb250YWlucyBpdCBldmVuIHdoZW4gYSBmcmVzaFxuICogYGV2ZW50cy5saXN0YCBtaWdodCBub3QgKGV2ZW50dWFsIGNvbnNpc3RlbmN5KSwgc28gcHJlZmVycmluZyB0aGVcbiAqIHByZWxvYWRlZCBldmVudHMgb24gZmlyc3QgaW52b2NhdGlvbiBpcyBhbHNvIHRoZSBtb3JlIGNvcnJlY3QgY2hvaWNlLlxuICpcbiAqIFJldHVybnMgZmFsc2Ugd2hlbiBgcHJlbG9hZGVkRXZlbnRzYCBpcyBtaXNzaW5nL2VtcHR5IHNvIHRoZSBjYWxsZXJcbiAqIGZhbGxzIGJhY2sgdG8gdGhlIG5vcm1hbCBmZXRjaCBwYXRoLlxuICpcbiAqIEV4cG9ydGVkIGZvciB1bml0IHRlc3RpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0ZpcnN0SW52b2NhdGlvbihcbiAgcHJlbG9hZGVkRXZlbnRzOiByZWFkb25seSBFdmVudFtdIHwgdW5kZWZpbmVkXG4pOiBib29sZWFuIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHByZWxvYWRlZEV2ZW50cykgfHwgcHJlbG9hZGVkRXZlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gcHJlbG9hZGVkRXZlbnRzLmV2ZXJ5KFxuICAgIChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9jcmVhdGVkJyB8fCBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9zdGFydGVkJ1xuICApO1xufVxuXG4vKipcbiAqIFF1ZXVlIGEgc3RlcCBmb3IgYmFja2dyb3VuZCBleGVjdXRpb24gdmlhIHRoZSB1bmlmaWVkIHdvcmtmbG93IHF1ZXVlXG4gKiAoVjIgYXJjaGl0ZWN0dXJlKS4gVGhlIGNvbWJpbmVkIGhhbmRsZXIgaW4gcnVudGltZS50cyBkaXNwYXRjaGVzXG4gKiBtZXNzYWdlcyB3aXRoIGBzdGVwSWRgIHRvIGV4ZWN1dGVTdGVwLCB3aGljaCB3b3JrcyBmb3IgYm90aCBWTSBlbmdpbmVzLlxuICogYGRlbGF5U2Vjb25kc2Agc3VwcG9ydHMgcmV0cnkvdGhyb3R0bGUgYmFja29mZi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcXVldWVTdGVwTWVzc2FnZShwYXJhbXM6IHtcbiAgd29ybGQ6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgZ2V0V29ybGQ+PjtcbiAgcnVuSWQ6IHN0cmluZztcbiAgd29ya2Zsb3dSdW46IFdvcmtmbG93UnVuO1xuICBzdGVwOiBQZW5kaW5nU3RlcDtcbiAgZGVsYXlTZWNvbmRzPzogbnVtYmVyO1xuICAvKiogUXVldWUgbmFtZXNwYWNlIGZvciB0aGUgcHVibGlzaCAoc2VlIHJ1bnRpbWUudHMpLiAqL1xuICBuYW1lc3BhY2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqIFJ1bi1vcmlnaW4gdHJhY2UgY2FycmllciBhY2Nlc3NvciAoc2VlIHJ1bldvcmtmbG93V2l0aFF1aWNrSlMpLiAqL1xuICBuZXh0VHJhY2VDYXJyaWVyOiAoKSA9PiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuICAvKipcbiAgICogUHVibGlzaCBwdXJwb3NlLCB1c2VkIHRvIGJ1Y2tldCB0aGUgaWRlbXBvdGVuY3kga2V5LiBXb3JsZHMgcmV0aXJlXG4gICAqIHVzZWQga2V5cyAoVlFTIHJldGVudGlvbiBUVEwsIHdvcmxkLXBvc3RncmVzIGNvbXBsZXRlZC1rZXlzIGNhY2hlKSxcbiAgICogc28gYSBrZXkgc2hhcmVkIGFjcm9zcyBwdXJwb3NlcyBzaWxlbnRseSBzd2FsbG93cyB0aGUgc2Vjb25kXG4gICAqIHB1Ymxpc2gg4oCUIHNlZSB3YWl0LWNvbnRpbnVhdGlvbi50cyBmb3IgdGhlIHNhbWUgaGF6YXJkIG9uIHdhaXRcbiAgICoga2V5cy4gYGRpc3BhdGNoYCBpcyB0aGUgcGxhaW4gYmFja2dyb3VuZCBoYW5kb2ZmIChvdmVyZmxvdyAvIGNyYXNoXG4gICAqIHJlY292ZXJ5KSBhbmQgdXNlcyB0aGUgc3RlcC1pZGVudGl0eS1zY29wZWQgZGlzcGF0Y2gga2V5XG4gICAqIChzdGVwRGlzcGF0Y2hJZGVtcG90ZW5jeUtleSkgc28gaXQgc3RheXMgbXV0dWFsbHlcbiAgICogZXhjbHVzaXZlIHdpdGggdGhlIG5vZGUgZW5naW5lJ3MgZGlzcGF0Y2ggb2YgdGhlIHNhbWUgc3RlcDtcbiAgICogYGJhY2tzdG9wOjxlcG9jaD5gIGNvdmVycyBkZWxheWVkIGNyYXNoIGJhY2tzdG9wcywgc2NvcGVkIHRvIHRoZVxuICAgKiBvd25lcnNoaXAgZXBvY2ggc28gYSByZWZyZXNoZWQgbGVhc2UgcmUtYXJtcyBhIE5FVyBiYWNrc3RvcCBpbnN0ZWFkXG4gICAqIG9mIGJlaW5nIGFic29yYmVkIGJ5IHRoZSBpbi1mbGlnaHQgb25lOyBgcmV0cnk6PG4+YCBjb3ZlcnMgZGVsYXllZFxuICAgKiByZXRyeS90aHJvdHRsZSByZS1lbnF1ZXVlcywgc2NvcGVkIHRvIHRoZSBhdHRlbXB0IHNvIGVhY2ggYmFja29mZlxuICAgKiBob3AgaXMgZW5xdWV1ZWFibGUuXG4gICAqL1xuICBwdXJwb3NlOiAnZGlzcGF0Y2gnIHwgYGJhY2tzdG9wOiR7c3RyaW5nfWAgfCBgcmV0cnk6JHtudW1iZXJ9YDtcbiAgLyoqXG4gICAqIFJlc2lsaWVudCBzdGVwIGRpc3BhdGNoOiB0aGUgc2VyaWFsaXplZCAocG9zc2libHkgZW5jcnlwdGVkKSBzdGVwIGlucHV0XG4gICAqIHRvIGNhcnJ5IG9uIHRoZSBtZXNzYWdlIGFzIGBzdGVwSW5wdXRgLCBzbyB0aGUgY29uc3VtZXIgY2FuIGlkZW1wb3RlbnRseVxuICAgKiByZS1lbnN1cmUgdGhlIGBzdGVwX2NyZWF0ZWRgIGV2ZW50IGlmIHRoZSBwcm9kdWNlcidzIHBhcmFsbGVsIGRpcmVjdFxuICAgKiB3cml0ZSBmYWlsZWQgdHJhbnNpZW50bHkuIE9ubHkgc2V0IG9uIGBkaXNwYXRjaGAgcHVibGlzaGVzIHRoYXRcbiAgICogZGlzcGF0Y2hQZW5kaW5nT3BzIHBhcmFsbGVsaXplcyB3aXRoIHRoZSBzdGVwX2NyZWF0ZWQgd3JpdGUuXG4gICAqL1xuICBzdGVwSW5wdXQ/OiBVaW50OEFycmF5O1xuICB3ZmRpYWc6IChjaGVja3BvaW50OiBzdHJpbmcsIGZpZWxkczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQ7XG59KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICB3b3JsZCxcbiAgICBydW5JZCxcbiAgICB3b3JrZmxvd1J1bixcbiAgICBzdGVwLFxuICAgIGRlbGF5U2Vjb25kcyxcbiAgICBuYW1lc3BhY2UsXG4gICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICBwdXJwb3NlLFxuICAgIHN0ZXBJbnB1dCxcbiAgICB3ZmRpYWcsXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHRyYWNlQ2FycmllciA9IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKTtcbiAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgIHdvcmxkLFxuICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93UnVuLndvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICB7XG4gICAgICBydW5JZCxcbiAgICAgIHN0ZXBJZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgc3RlcE5hbWU6IHN0ZXAuc3RlcElkLFxuICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAuLi4oc3RlcElucHV0ICE9PSB1bmRlZmluZWQgPyB7IHN0ZXBJbnB1dDogeyBpbnB1dDogc3RlcElucHV0IH0gfSA6IHt9KSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIFRoZSAnZGlzcGF0Y2gnIGtleSBpcyBzdGVwLWlkZW50aXR5LXNjb3BlZCAoY29ycmVsYXRpb25JZCArIGhhc2hlZFxuICAgICAgLy8gc3RlcCBuYW1lKSDigJQgc2hhcmVkIHdpdGggdGhlIG5vZGUgZW5naW5lJ3MgZGlzcGF0Y2ggb2YgdGhlIHNhbWUgc3RlcFxuICAgICAgLy8gc28gdGhlIHR3byBzdGF5IG11dHVhbGx5IGV4Y2x1c2l2ZSwgd2l0aG91dCBhIHJldm9rZWQgcmVzaWxpZW50XG4gICAgICAvLyBtZXNzYWdlIGFic29yYmluZyBhIHJlYXNzaWduZWQgY29ycmVsYXRpb24gaWQncyBsZWdpdGltYXRlIGRpc3BhdGNoLlxuICAgICAgLy8gU2VlIHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5LlxuICAgICAgaWRlbXBvdGVuY3lLZXk6XG4gICAgICAgIHB1cnBvc2UgPT09ICdkaXNwYXRjaCdcbiAgICAgICAgICA/IHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5KHN0ZXAuY29ycmVsYXRpb25JZCwgc3RlcC5zdGVwSWQpXG4gICAgICAgICAgOiBgJHtzdGVwLmNvcnJlbGF0aW9uSWR9OiR7cHVycG9zZX1gLFxuICAgICAgLi4uKGRlbGF5U2Vjb25kcyAmJiBkZWxheVNlY29uZHMgPiAwID8geyBkZWxheVNlY29uZHMgfSA6IHt9KSxcbiAgICB9XG4gICk7XG4gIHdmZGlhZygnc3RlcF9xdWV1ZWQnLCB7XG4gICAgc3RlcElkOiBzdGVwLnN0ZXBJZCxcbiAgICBjb3JyZWxhdGlvbklkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgcHVycG9zZSxcbiAgICBkZWxheVNlY29uZHM6IGRlbGF5U2Vjb25kcyA/PyAwLFxuICAgIC4uLihzdGVwSW5wdXQgIT09IHVuZGVmaW5lZCA/IHsgcmVzaWxpZW50OiB0cnVlIH0gOiB7fSksXG4gIH0pO1xufVxuXG4vKipcbiAqIERpc3BhdGNoIGR1cmFibGUgc2lkZSBlZmZlY3RzIGZvciBhIHNldCBvZiBwZW5kaW5nIFZNIG9wZXJhdGlvbnM6XG4gKiBzdGVwX2NyZWF0ZWQgKCsgb3B0aW9uYWwgcXVldWVpbmcpLCBob29rX2NyZWF0ZWQgLyBob29rX3JlY2VpdmVkIChhYm9ydHMpLFxuICogYXR0cl9zZXQsIGhvb2tfZGlzcG9zZWQsIGFuZCB3YWl0X2NyZWF0ZWQgZXZlbnRzLlxuICpcbiAqIFN0ZXBzIGFyZSBjcmVhdGVkIGJ1dCAodXN1YWxseSkgbm90IHF1ZXVlZCBoZXJlIOKAlCBxdWV1ZWluZyAob3IgaW5saW5lXG4gKiBleGVjdXRpb24pIGlzIHRoZSBjYWxsZXIncyBkZWNpc2lvbi4gVXNlZCBib3RoIGZvciBzdXNwZW5zaW9uXG4gKiBwcm9jZXNzaW5nICh0aGUgaW5saW5lIGxvb3ApIGFuZCBmb3IgdGhlIHRlcm1pbmFsIGRyYWluIChmbHVzaGluZ1xuICogbGVmdG92ZXIgc2lkZSBlZmZlY3RzIHdoZW4gdGhlIHdvcmtmbG93IGNvbXBsZXRlZCBvciBmYWlsZWQsIG1pcnJvcmluZ1xuICogdGhlIG5vZGU6dm0gZW5naW5lJ3MgZHJhaW5QZW5kaW5nUXVldWVJdGVtcykuXG4gKlxuICogVGhlIG9uZSBleGNlcHRpb24gaXMgcmVzaWxpZW50IHN0ZXAgZGlzcGF0Y2g6IGZvciBzdGVwIGNpZHMgbmFtZWQgaW5cbiAqIGBxdWV1ZVN0ZXBDaWRzYCAodGhlIGNhbGxlcidzIG92ZXJmbG93IHN0ZXBzKSB0aGF0IHBhc3MgdGhlIGVsaWdpYmlsaXR5XG4gKiBnYXRlcywgdGhlIHN0ZXBfY3JlYXRlZCB3cml0ZSBpcyBwYXJhbGxlbGl6ZWQgd2l0aCB0aGUgc3RlcCdzIHF1ZXVlXG4gKiBwdWJsaXNoIOKAlCB0aGUgbWVzc2FnZSBjYXJyaWVzIHRoZSBzZXJpYWxpemVkIGlucHV0IChgc3RlcElucHV0YCkgc28gdGhlXG4gKiBjb25zdW1lciBjYW4gaWRlbXBvdGVudGx5IHJlLWVuc3VyZSB0aGUgZXZlbnQgaWYgdGhlIGRpcmVjdCB3cml0ZSBmYWlsZWRcbiAqIHRyYW5zaWVudGx5LiBTdGVwcyBxdWV1ZWQgdGhpcyB3YXkgYXJlIHJlcG9ydGVkIGluIGBxdWV1ZWRTdGVwQ2lkc2A7IHRoZVxuICogY2FsbGVyIHF1ZXVlcyB0aGUgcmVzdCBpdHNlbGYuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRpc3BhdGNoUGVuZGluZ09wcyhwYXJhbXM6IHtcbiAgd29ybGQ6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgZ2V0V29ybGQ+PjtcbiAgcnVuSWQ6IHN0cmluZztcbiAgd29ya2Zsb3dSdW46IFdvcmtmbG93UnVuO1xuICBlbmNyeXB0aW9uS2V5OiBSdW5QYXlsb2FkS2V5cyB8IHVuZGVmaW5lZDtcbiAgcGVuZGluZ09wZXJhdGlvbnM6IFBlbmRpbmdPcGVyYXRpb25bXTtcbiAgLyoqXG4gICAqIFN0ZXAgY2lkcyB3aG9zZSBgc3RlcF9jcmVhdGVkYCBtdXN0IE5PVCBiZSB3cml0dGVuIGhlcmU6IHRoZSBpbmxpbmVcbiAgICogbG9vcCBjbGFpbXMgdGhlc2UgYXRvbWljYWxseSB2aWEgYSBsYXp5IGBzdGVwX3N0YXJ0ZWRgIChjYXJyeWluZyB0aGVcbiAgICogaW5wdXQpLCBzbyBhIGNvbmN1cnJlbnQgY2xhaW1hbnQgbG9zZXMgd2l0aCBFbnRpdHlDb25mbGljdEVycm9yXG4gICAqIGluc3RlYWQgb2YgYm90aCBpbnZvY2F0aW9ucyBiYXJlLXN0YXJ0aW5nIHRoZSBzYW1lIHN0ZXAuXG4gICAqL1xuICBza2lwU3RlcENyZWF0aW9uPzogU2V0PHN0cmluZz47XG4gIC8qKlxuICAgKiBTdGVwIGNpZHMgdGhlIGNhbGxlciBpbnRlbmRzIHRvIGhhbmQgdG8gdGhlIHF1ZXVlIHRoaXMgdHVybiAob3ZlcmZsb3dcbiAgICogc3RlcHMgYmV5b25kIHRoZSBpbmxpbmUgY2FwKS4gRWxpZ2libGUgb25lcyBhcmUgcHVibGlzaGVkIGhlcmUsIGluXG4gICAqIHBhcmFsbGVsIHdpdGggdGhlaXIgc3RlcF9jcmVhdGVkIHdyaXRlIChyZXNpbGllbnQgc3RlcCBkaXNwYXRjaCksIGFuZFxuICAgKiByZXBvcnRlZCBiYWNrIGluIGBxdWV1ZWRTdGVwQ2lkc2AuXG4gICAqL1xuICBxdWV1ZVN0ZXBDaWRzPzogU2V0PHN0cmluZz47XG4gIC8qKiBRdWV1ZSBuYW1lc3BhY2UgZm9yIGFsbCBtZXNzYWdlIHB1Ymxpc2hlcyAoc2VlIHJ1bnRpbWUudHMpLiAqL1xuICBuYW1lc3BhY2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFJ1bi1vcmlnaW4gdHJhY2UgY2FycmllciBhY2Nlc3NvciBmcm9tIHJ1bnRpbWUudHMuIEluIHRoZSBkZWZhdWx0XG4gICAqIGBsaW5rZWRgIHRyYWNlIG1vZGUgdGhpcyByZXR1cm5zIHRoZSBjYXJyaWVyIG9mIHRoZSBydW4ncyBPUklHSU5cbiAgICogY29udGV4dCAod29ya2Zsb3cuc3RhcnQpLCBzbyBldmVyeSBpbnZvY2F0aW9uIGxpbmtzIGJhY2sgdG8gdGhlXG4gICAqIHN0YXJ0IGluIGEgc3RhciDigJQgY2FwdHVyaW5nIHRoZSBjdXJyZW50IGNvbnRleHQgaGVyZSBpbnN0ZWFkIHdvdWxkXG4gICAqIGNoYWluIGludm9jYXRpb25zIHRvIGVhY2ggb3RoZXIgYW5kIGZyYWdtZW50IHRoZSBydW4gdmlldyBvbiBhc3luY1xuICAgKiBxdWV1ZXMuXG4gICAqL1xuICBuZXh0VHJhY2VDYXJyaWVyOiAoKSA9PiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuICB3ZmRpYWc6IChjaGVja3BvaW50OiBzdHJpbmcsIGZpZWxkczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQ7XG59KTogUHJvbWlzZTx7XG4gIGNyZWF0ZWRBdHRyaWJ1dGVFdmVudDogYm9vbGVhbjtcbiAgY3JlYXRlZEdldENvbmZsaWN0SG9vazogYm9vbGVhbjtcbiAgLyoqIFN0ZXAgY2lkcyBhbHJlYWR5IHB1Ymxpc2hlZCB2aWEgcmVzaWxpZW50IGRpc3BhdGNoIOKAlCBzZWUgYWJvdmUuICovXG4gIHF1ZXVlZFN0ZXBDaWRzOiBTZXQ8c3RyaW5nPjtcbn0+IHtcbiAgY29uc3Qge1xuICAgIHdvcmxkLFxuICAgIHJ1bklkLFxuICAgIHdvcmtmbG93UnVuLFxuICAgIGVuY3J5cHRpb25LZXksXG4gICAgcGVuZGluZ09wZXJhdGlvbnMsXG4gICAgbmFtZXNwYWNlLFxuICAgIG5leHRUcmFjZUNhcnJpZXIsXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHNraXBTdGVwQ3JlYXRpb24gPSBwYXJhbXMuc2tpcFN0ZXBDcmVhdGlvbjtcbiAgY29uc3QgcXVldWVTdGVwQ2lkcyA9IHBhcmFtcy5xdWV1ZVN0ZXBDaWRzO1xuICBjb25zdCB3ZmRpYWcgPSBwYXJhbXMud2ZkaWFnO1xuICAvLyBTdGVwIGNpZHMgcHVibGlzaGVkIHZpYSByZXNpbGllbnQgZGlzcGF0Y2ggYmVsb3cgKGNyZWF0ZSArIHF1ZXVlIGluXG4gIC8vIHBhcmFsbGVsLCBtZXNzYWdlIGNhcnJ5aW5nIGBzdGVwSW5wdXRgKS4gUmVwb3J0ZWQgdG8gdGhlIGNhbGxlciBzbyBpdFxuICAvLyBza2lwcyB0aGVtIGluIGl0cyBvd24gcXVldWVpbmcgcGFzcy5cbiAgY29uc3QgcXVldWVkU3RlcENpZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLy8gUmVzaWxpZW50IHN0ZXAgZGlzcGF0Y2ggZWxpZ2liaWxpdHksIHNoYXJlZCBieSBldmVyeSBzdGVwIG9wIGJlbG93ICh0aGVcbiAgLy8gcGVyLXN0ZXAgaW5wdXQtc2l6ZSBjaGVjayBpcyBhcHBsaWVkIGluc2lkZSB0aGUgb3ApOiBmZWF0dXJlIGVuYWJsZWQgYW5kXG4gIC8vIGEgYmluYXJ5LXNhZmUgKENCT1IpIHF1ZXVlIHRyYW5zcG9ydCBmb3IgdGhlIHJ1bi5cbiAgLy9cbiAgLy8gVW5saWtlIHRoZSBub2RlOnZtIHN1c3BlbnNpb24gaGFuZGxlcidzIGdhdGUgKHNlZVxuICAvLyBTdXNwZW5zaW9uSGFuZGxlclBhcmFtcy5zdGVwRGlzcGF0Y2gpLCB0aGVyZSBpcyBOTyBwcmVjb25kaXRpb24tZ3VhcmRcbiAgLy8gZ2F0ZSBoZXJlOiB0aGlzIGVuZ2luZSdzIHN0ZXBfY3JlYXRlZCB3cml0ZXMgYXJlIHVuZ3VhcmRlZCAobm8gc25hcHNob3RcbiAgLy8gaXMgYXR0YWNoZWQpLCBzbyBhIGd1YXJkLWVuZm9yY2luZyBXb3JsZCBjYW4gbmV2ZXIgNDEyLXJlamVjdCB0aGVtIOKAlFxuICAvLyB0aGUgY29uc3VtZXIncyByZS1lbnN1cmUgdGhlcmVmb3JlIGNhbm5vdCBtYXRlcmlhbGl6ZSBhIHN0ZXAgdGhlIGd1YXJkXG4gIC8vIHJlamVjdGVkLiBJZiB0aGlzIGVuZ2luZSBldmVyIGFkb3B0cyBndWFyZGVkIHN1c3BlbnNpb24gd3JpdGVzLCB0aGVcbiAgLy8gY2FwYWJpbGl0eSBnYXRlIGZyb20gdGhlIG5vZGU6dm0gaGFuZGxlciBtdXN0IGJlIGFkZGVkIGhlcmUgdG9vLlxuICBjb25zdCByZXNpbGllbnREaXNwYXRjaEVsaWdpYmxlID1cbiAgICBxdWV1ZVN0ZXBDaWRzICE9PSB1bmRlZmluZWQgJiZcbiAgICBxdWV1ZVN0ZXBDaWRzLnNpemUgPiAwICYmXG4gICAgaXNSZXNpbGllbnRTdGVwRGlzcGF0Y2hFbmFibGVkKCkgJiZcbiAgICAod29ya2Zsb3dSdW4uc3BlY1ZlcnNpb24gPz8gMCkgPj1cbiAgICAgIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DQk9SX1FVRVVFX1RSQU5TUE9SVDtcbiAgLy8gU2V0IHdoZW4gYSBob29rIHdpdGggYSBwYXJrZWQgZ2V0Q29uZmxpY3QoKSBhd2FpdGVyIGhhZCBpdHNcbiAgLy8gaG9va19jcmVhdGVkIHdyaXR0ZW4gdGhpcyBpbnZvY2F0aW9uLiBUaGUgd29ya2Zsb3cgbXVzdCBiZSByZS1pbnZva2VkXG4gIC8vIHNvIHJlcGxheSBjYW4gY29uZmlybSBjcmVhdGlvbiBhbmQgcmVzb2x2ZSB0aGUgYXdhaXRlci5cbiAgbGV0IGNyZWF0ZWRHZXRDb25mbGljdEhvb2sgPSBmYWxzZTtcbiAgLy8gU2V0IHdoZW4gYSBuZXcgYXR0cl9zZXQgZXZlbnQgaXMgd3JpdHRlbiB0aGlzIGludm9jYXRpb24uIFRoZVxuICAvLyB3b3JrZmxvdyBtdXN0IGJlIHJlLWludm9rZWQgdG8gY29uc3VtZSBpdCAocmVzb2x2aW5nIHRoZSBwZW5kaW5nXG4gIC8vIHNldEF0dHJpYnV0ZXMoKSBwcm9taXNlKSwgc28gdGhlIGVudHJ5cG9pbnQgcmVxdWV1ZXMgaW1tZWRpYXRlbHkg4oCUXG4gIC8vIHNhbWUgcGF0dGVybiBhcyBhbiBlbGFwc2VkIHdhaXQuXG4gIGxldCBjcmVhdGVkQXR0cmlidXRlRXZlbnQgPSBmYWxzZTtcbiAgY29uc3Qgb3BzUHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuXG4gIGNvbnN0IHByb2Nlc3NIb29rT3AgPSBhc3luYyAoaG9vazogUGVuZGluZ0hvb2spOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdRdWlja0pTIHJ1bnRpbWU6IHByb2Nlc3NpbmcgaG9vayBvcCcsIHtcbiAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgY29ycmVsYXRpb25JZDogaG9vay5jb3JyZWxhdGlvbklkLFxuICAgICAgdG9rZW46IGhvb2sudG9rZW4sXG4gICAgICB0b2tlblR5cGU6IHR5cGVvZiBob29rLnRva2VuLFxuICAgICAgaXNXZWJob29rOiBob29rLmlzV2ViaG9vayxcbiAgICAgIGlzU3lzdGVtOiBob29rLmlzU3lzdGVtLFxuICAgICAgaGFzQ3JlYXRlZEV2ZW50OiBob29rLmhhc0NyZWF0ZWRFdmVudCxcbiAgICAgIGFib3J0UmVxdWVzdGVkOiBob29rLmFib3J0UmVxdWVzdGVkLFxuICAgIH0pO1xuXG4gICAgaWYgKCFob29rLmhhc0NyZWF0ZWRFdmVudCkge1xuICAgICAgLy8gYGhvb2subWV0YWRhdGFgIGlzIHRoZSBmb3JtYXQtcHJlZml4ZWQgZGV2YWx1ZSBieXRlc1xuICAgICAgLy8gcHJvZHVjZWQgYnkgYGdsb2JhbFRoaXNbU3ltYm9sLmZvcignd29ya2Zsb3ctc2VyaWFsaXplJyldXG4gICAgICAvLyAob3B0aW9ucy5tZXRhZGF0YSlgIGluc2lkZSB0aGUgVk0uIEVuY3J5cHQgb24gdGhlIGhvc3RcbiAgICAgIC8vIHNpZGUgYmVmb3JlIHdyaXRpbmcg4oCUIG1hdGNoZXMgdGhlIG5vZGU6dm0gZW5naW5lJ3NcbiAgICAgIC8vIGBkZWh5ZHJhdGVTdGVwQXJndW1lbnRzYCBmbG93LlxuICAgICAgLy9cbiAgICAgIC8vIE5vIHByZS1jaGVjayB2aWEgaG9va3MubGlzdDogd2l0aCBkZXRlcm1pbmlzdGljIGNvcnJlbGF0aW9uSWRzXG4gICAgICAvLyAoc2FtZSBWTSBzZWVkIGFjcm9zcyByZXBsYXlzKSBhbmQgcGVyLShydW5JZCwgY29ycmVsYXRpb25JZClcbiAgICAgIC8vIHVuaXF1ZW5lc3MgaW4gd29ybGRzLCB0aGUgc3RvcmFnZSBsYXllciByZWplY3RzIGR1cGxpY2F0ZXMgYXNcbiAgICAgIC8vIEVudGl0eUNvbmZsaWN0RXJyb3IsIHdoaWNoIHdlIHN3YWxsb3cgYmVsb3cuIFRoaXMgZHJvcHMgb25lXG4gICAgICAvLyBuZXR3b3JrIHJvdW5kLXRyaXAgcGVyIHBlbmRpbmcgaG9vay5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVuY3J5cHRlZE1ldGFkYXRhID1cbiAgICAgICAgICB0eXBlb2YgaG9vay5tZXRhZGF0YSA9PT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICA6IGF3YWl0IGVuY3J5cHRTZXJpYWxpemVkRGF0YShob29rLm1ldGFkYXRhLCBlbmNyeXB0aW9uS2V5KTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShydW5JZCwge1xuICAgICAgICAgIGV2ZW50VHlwZTogJ2hvb2tfY3JlYXRlZCcsXG4gICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGhvb2suY29ycmVsYXRpb25JZCxcbiAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgIHRva2VuOiBob29rLnRva2VuLFxuICAgICAgICAgICAgdG9rZW5SZXRlbnRpb25VbnRpbDpcbiAgICAgICAgICAgICAgaG9vay50b2tlblJldGVudGlvblVudGlsID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIDogbmV3IERhdGUoaG9vay50b2tlblJldGVudGlvblVudGlsKSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBlbmNyeXB0ZWRNZXRhZGF0YSxcbiAgICAgICAgICAgIC8vIEFsd2F5cyBpbmNsdWRlIGlzV2ViaG9vayBleHBsaWNpdGx5LiBXb3JsZHMgZGVmYXVsdCBpdCB0b1xuICAgICAgICAgICAgLy8gYHRydWVgIHdoZW4gYWJzZW50LCB3aGljaCB3b3VsZCBicmVhayB0aGUgcHVibGljIHdlYmhvb2tcbiAgICAgICAgICAgIC8vIGVuZHBvaW50J3MgNDA0IGd1YXJkIGZvciBob29rcyBjcmVhdGVkIHZpYSBjcmVhdGVIb29rKCkuXG4gICAgICAgICAgICBpc1dlYmhvb2s6IGhvb2suaXNXZWJob29rLFxuICAgICAgICAgICAgLy8gU3lzdGVtIGhvb2tzIChBYm9ydENvbnRyb2xsZXIpIGFyZSBleGVtcHQgZnJvbSB1c2VyXG4gICAgICAgICAgICAvLyB0b2tlbiBuYW1lc3BhY2UgY29uZmxpY3QgY2hlY2tzLlxuICAgICAgICAgICAgLi4uKGhvb2suaXNTeXN0ZW0gPyB7IGlzU3lzdGVtOiB0cnVlIH0gOiB7fSksXG4gICAgICAgICAgfSBhcyBhbnksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIElmIHN0b3JhZ2UgZGV0ZWN0ZWQgYSByZWFsIHRva2VuIGNvbmZsaWN0IHdpdGggYW5vdGhlclxuICAgICAgICAvLyB3b3JrZmxvdydzIGhvb2ssIHJlLXF1ZXVlIHNvIHRoZSB3b3JrZmxvdyBoYW5kbGVyIGNhblxuICAgICAgICAvLyBwcm9jZXNzIHRoZSBjb25mbGljdCBldmVudCBhbmQgZmFpbCBncmFjZWZ1bGx5LlxuICAgICAgICBpZiAocmVzdWx0LmV2ZW50Py5ldmVudFR5cGUgPT09ICdob29rX2NvbmZsaWN0Jykge1xuICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgaWRlbXBvdGVuY3lLZXk6IGBob29rX2NvbmZsaWN0XyR7aG9vay5jb3JyZWxhdGlvbklkfWAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBBbHJlYWR5IGNyZWF0ZWQgYnkgYSBjb25jdXJyZW50IGludm9jYXRpb24g4oCUIGZhbGwgdGhyb3VnaFxuICAgICAgICAvLyB0byBhYm9ydCBwcm9jZXNzaW5nIGJlbG93IChpZiBhbnkpIGluc3RlYWQgb2YgYmFpbGluZy5cbiAgICAgICAgaWYgKCFFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIGlmIChob29rLmhhc0dldENvbmZsaWN0QXdhaXRlcikge1xuICAgICAgICBjcmVhdGVkR2V0Q29uZmxpY3RIb29rID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaG9vay5hYm9ydFJlcXVlc3RlZCkge1xuICAgICAgLy8gUmVjb3JkIHRoZSBhYm9ydCBkdXJhYmx5OiBhIGhvb2tfcmVjZWl2ZWQgZXZlbnQgY2FycnlpbmdcbiAgICAgIC8vIHRoZSBWTS1zZXJpYWxpemVkIGB7IGFib3J0ZWQ6IHRydWUsIHJlYXNvbiB9YCBwYXlsb2FkLFxuICAgICAgLy8gcGx1cyBhIGJlc3QtZWZmb3J0IHN0cmVhbSBwYWNrZXQgZm9yIHJlYWwtdGltZSBzdGVwXG4gICAgICAvLyBwcm9wYWdhdGlvbi4gTWlycm9ycyB0aGUgbm9kZTp2bSBlbmdpbmUncyBzdXNwZW5zaW9uXG4gICAgICAvLyBoYW5kbGVyIChob29rc05lZWRpbmdBYm9ydCkuXG4gICAgICBjb25zdCBhYm9ydFBheWxvYWQgPVxuICAgICAgICBob29rLmFib3J0UGF5bG9hZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXlcbiAgICAgICAgICA/ICgoYXdhaXQgZW5jcnlwdFNlcmlhbGl6ZWREYXRhKFxuICAgICAgICAgICAgICBob29rLmFib3J0UGF5bG9hZCxcbiAgICAgICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICAgICAgKSkgYXMgVWludDhBcnJheSlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHtcbiAgICAgICAgICBldmVudFR5cGU6ICdob29rX3JlY2VpdmVkJyxcbiAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgY29ycmVsYXRpb25JZDogaG9vay5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgdG9rZW46IGhvb2sudG9rZW4sXG4gICAgICAgICAgICBwYXlsb2FkOiBhYm9ydFBheWxvYWQsXG4gICAgICAgICAgfSBhcyBhbnksXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmICghRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICAvLyBzdHJlYW1OYW1lIGlzIGRlcml2ZWQgZnJvbSB0aGUgYWJvcnQgaG9vayB0b2tlblxuICAgICAgLy8gKGBhYnJ0X3tpZH1gIOKGkiBgc3RybV97aWR9X3N5c3RlbV9hYm9ydGApLlxuICAgICAgaWYgKGhvb2sudG9rZW4uc3RhcnRzV2l0aCgnYWJydF8nKSAmJiBhYm9ydFBheWxvYWQpIHtcbiAgICAgICAgY29uc3Qgc3RyZWFtTmFtZSA9IGBzdHJtXyR7aG9vay50b2tlbi5zbGljZSgnYWJydF8nLmxlbmd0aCl9X3N5c3RlbV9hYm9ydGA7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgd29ybGQuc3RyZWFtcy53cml0ZShydW5JZCwgc3RyZWFtTmFtZSwgYWJvcnRQYXlsb2FkKTtcbiAgICAgICAgICBhd2FpdCB3b3JsZC5zdHJlYW1zLmNsb3NlKHJ1bklkLCBzdHJlYW1OYW1lKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gQmVzdC1lZmZvcnQg4oCUIHRoZSBob29rIGV2ZW50IHByb3ZpZGVzIHRoZSBkdXJhYmxlXG4gICAgICAgICAgLy8gZmFsbGJhY2suXG4gICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICdRdWlja0pTIHJ1bnRpbWU6IGZhaWxlZCB0byB3cml0ZSBhYm9ydCBzdHJlYW0gcGFja2V0JyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGhvb2suY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3ZmRpYWcoJ2Fib3J0X3JlY29yZGVkJywge1xuICAgICAgICBjb3JyZWxhdGlvbklkOiBob29rLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgIHRva2VuOiBob29rLnRva2VuLFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHByb2Nlc3NIb29rRGlzcG9zZU9wID0gYXN5bmMgKFxuICAgIG9wOiBQZW5kaW5nSG9va0Rpc3Bvc2VcbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHtcbiAgICAgICAgZXZlbnRUeXBlOiAnaG9va19kaXNwb3NlZCcsXG4gICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgY29ycmVsYXRpb25JZDogb3AuY29ycmVsYXRpb25JZCxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkgcmV0dXJuO1xuICAgICAgLy8gRGlzcG9zaW5nIGEgaG9vayB3aG9zZSBlbnRpdHkgbm8gbG9uZ2VyIChvciBuZXZlcikgZXhpc3RzIGlzIGFuXG4gICAgICAvLyBpZGVtcG90ZW50IG5vLW9wOiB0aGUgZW50aXR5IG1heSBoYXZlIGJlZW4gdG9ybiBkb3duIGJ5IGFcbiAgICAgIC8vIGNvbmN1cnJlbnQgcnVuIGNhbmNlbGxhdGlvbiwgb3IgdGhlIGhvb2sgbWF5IGhhdmUgbG9zdCBpdHNcbiAgICAgIC8vIHRva2VuIGNsYWltIHRvIGEgY29uZmxpY3QuIFRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byByZWxlYXNlLlxuICAgICAgaWYgKEhvb2tOb3RGb3VuZEVycm9yLmlzKGVycikpIHJldHVybjtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH07XG5cbiAgLy8gSG9vayBvcGVyYXRpb25zIGFyZSBncm91cGVkIGJ5IHRva2VuIGFuZCBwcm9jZXNzZWQgU0VRVUVOVElBTExZIGluXG4gIC8vIGNvZGUgb3JkZXIgd2l0aGluIGVhY2ggZ3JvdXAsIG1pcnJvcmluZyB0aGUgbm9kZTp2bSBzdXNwZW5zaW9uXG4gIC8vIGhhbmRsZXIgKGhvb2tJdGVtc0J5VG9rZW4pOiBhIGRpc3Bvc2UoKSBvZiBhbiBlYXJsaWVyIGhvb2sgbXVzdFxuICAvLyByZWxlYXNlIHRoZSB0b2tlbiBiZWZvcmUgYSBsYXRlciBzYW1lLXRva2VuIGhvb2sncyBjcmVhdGlvbiBpc1xuICAvLyB2YWxpZGF0ZWQgYnkgdGhlIHdvcmxkIOKAlCBwYXJhbGxlbCBkaXNwYXRjaCB3b3VsZCBvdGhlcndpc2UgcmVjb3JkIGFcbiAgLy8gc3B1cmlvdXMgaG9va19jb25mbGljdCBhZ2FpbnN0IHRoZSBydW4ncyBvd24gZGlzcG9zZWQgaG9vayAoZS5nLiBhXG4gIC8vIGRpc3Bvc2XihpJyZWNyZWF0ZSBsb29wIHJldXNpbmcgb25lIHRva2VuKS4gRGlmZmVyZW50IHRva2VucyBoYXZlIG5vXG4gIC8vIGNsYWltIGludGVyYWN0aW9uLCBzbyB0b2tlbiBncm91cHMgcnVuIGluIHBhcmFsbGVsIHdpdGggZWFjaCBvdGhlclxuICAvLyBhbmQgd2l0aCB0aGUgbm9uLWhvb2sgb3BzIGJlbG93LlxuICBjb25zdCBob29rT3BzQnlUb2tlbiA9IG5ldyBNYXA8XG4gICAgc3RyaW5nLFxuICAgIChQZW5kaW5nSG9vayB8IFBlbmRpbmdIb29rRGlzcG9zZSlbXVxuICA+KCk7XG4gIGZvciAoY29uc3Qgb3Agb2YgcGVuZGluZ09wZXJhdGlvbnMpIHtcbiAgICBsZXQga2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKFxuICAgICAgb3AudHlwZSA9PT0gJ2hvb2snICYmXG4gICAgICAoIW9wLmhhc0NyZWF0ZWRFdmVudCB8fCAob3AgYXMgUGVuZGluZ0hvb2spLmFib3J0UmVxdWVzdGVkKVxuICAgICkge1xuICAgICAga2V5ID0gKG9wIGFzIFBlbmRpbmdIb29rKS50b2tlbjtcbiAgICB9IGVsc2UgaWYgKG9wLnR5cGUgPT09ICdob29rX2Rpc3Bvc2UnICYmICFvcC5oYXNDcmVhdGVkRXZlbnQpIHtcbiAgICAgIC8vIFBlci1vcCBmYWxsYmFjayBncm91cCB3aGVuIHRoZSB0b2tlbiBpcyB1bmtub3duIOKAlCBubyBvcmRlcmluZ1xuICAgICAgLy8gZ3VhcmFudGVlcywgbWF0Y2hpbmcgdGhlIHByZXZpb3VzIHBhcmFsbGVsIGJlaGF2aW9yLlxuICAgICAga2V5ID0gKG9wIGFzIFBlbmRpbmdIb29rRGlzcG9zZSkudG9rZW4gPz8gYF9fY2lkOiR7b3AuY29ycmVsYXRpb25JZH1gO1xuICAgIH1cbiAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGdyb3VwID0gaG9va09wc0J5VG9rZW4uZ2V0KGtleSk7XG4gICAgaWYgKGdyb3VwKSB7XG4gICAgICBncm91cC5wdXNoKG9wIGFzIFBlbmRpbmdIb29rIHwgUGVuZGluZ0hvb2tEaXNwb3NlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaG9va09wc0J5VG9rZW4uc2V0KGtleSwgW29wIGFzIFBlbmRpbmdIb29rIHwgUGVuZGluZ0hvb2tEaXNwb3NlXSk7XG4gICAgfVxuICB9XG4gIGZvciAoY29uc3QgZ3JvdXAgb2YgaG9va09wc0J5VG9rZW4udmFsdWVzKCkpIHtcbiAgICBvcHNQcm9taXNlcy5wdXNoKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBvcCBvZiBncm91cCkge1xuICAgICAgICAgIGlmIChvcC50eXBlID09PSAnaG9vaycpIHtcbiAgICAgICAgICAgIGF3YWl0IHByb2Nlc3NIb29rT3Aob3ApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCBwcm9jZXNzSG9va0Rpc3Bvc2VPcChvcCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSgpXG4gICAgKTtcbiAgfVxuXG4gIGZvciAoY29uc3Qgb3Agb2YgcGVuZGluZ09wZXJhdGlvbnMpIHtcbiAgICBpZiAoXG4gICAgICBvcC50eXBlID09PSAnc3RlcCcgJiZcbiAgICAgICFvcC5oYXNDcmVhdGVkRXZlbnQgJiZcbiAgICAgICFza2lwU3RlcENyZWF0aW9uPy5oYXMob3AuY29ycmVsYXRpb25JZClcbiAgICApIHtcbiAgICAgIGNvbnN0IHN0ZXAgPSBvcCBhcyBQZW5kaW5nU3RlcDtcbiAgICAgIG9wc1Byb21pc2VzLnB1c2goXG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgLy8gQ3JlYXRlIHN0ZXBfY3JlYXRlZCBldmVudC4gYHN0ZXAuaW5wdXRgIGlzIHRoZVxuICAgICAgICAgIC8vIGZvcm1hdC1wcmVmaXhlZCBkZXZhbHVlIGJ5dGVzIChcImRldmxcIiArIGRldmFsdWUpIHByb2R1Y2VkXG4gICAgICAgICAgLy8gYnkgYGdsb2JhbFRoaXNbU3ltYm9sLmZvcignd29ya2Zsb3ctc2VyaWFsaXplJyldKHthcmdzLFxuICAgICAgICAgIC8vIGNsb3N1cmVWYXJzLCB0aGlzVmFsfSlgIGluc2lkZSB0aGUgVk0uIFRoZSBWTSBoYXMgbm9cbiAgICAgICAgICAvLyBhY2Nlc3MgdG8gdGhlIENyeXB0b0tleSwgc28gZW5jcnlwdGlvbiBpcyBhcHBsaWVkIGhlcmVcbiAgICAgICAgICAvLyBvbiB0aGUgaG9zdCBzaWRlIOKAlCBtYXRjaGluZyB3aGF0XG4gICAgICAgICAgLy8gYGRlaHlkcmF0ZVN0ZXBBcmd1bWVudHNgIGRvZXMgaW4gdGhlIG5vZGU6dm0gZW5naW5lLlxuICAgICAgICAgIGNvbnN0IGVuY3J5cHRlZElucHV0ID0gYXdhaXQgZW5jcnlwdFNlcmlhbGl6ZWREYXRhKFxuICAgICAgICAgICAgc3RlcC5pbnB1dCxcbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gUmVzaWxpZW50IHN0ZXAgZGlzcGF0Y2g6IGZpcmUgdGhlIHN0ZXBfY3JlYXRlZCB3cml0ZSBhbmQgdGhlXG4gICAgICAgICAgLy8gc3RlcCdzIHF1ZXVlIHB1Ymxpc2ggaW4gcGFyYWxsZWwg4oCUIHRoZSBtZXNzYWdlIGNhcnJpZXMgdGhlXG4gICAgICAgICAgLy8gc2FtZSBzZXJpYWxpemVkIGlucHV0IChgc3RlcElucHV0YCkgc28gdGhlIGNvbnN1bWVyIGNhblxuICAgICAgICAgIC8vIGlkZW1wb3RlbnRseSByZS1lbnN1cmUgdGhlIGV2ZW50IGlmIHRoZSBkaXJlY3Qgd3JpdGUgZmFpbGVkXG4gICAgICAgICAgLy8gdHJhbnNpZW50bHkuIE1pcnJvcnMgdGhlIG5vZGU6dm0gc3VzcGVuc2lvbiBoYW5kbGVyIGFuZCB0aGVcbiAgICAgICAgICAvLyByZXNpbGllbnQgc3RhcnQgLyByZXNpbGllbnQgaG9vayByZXN1bWUgcGF0dGVybnMuIE9ubHkgZm9yXG4gICAgICAgICAgLy8gY2FsbGVyLWRlc2lnbmF0ZWQgb3ZlcmZsb3cgc3RlcHMgd2l0aCBpbnB1dHMgdGhlIHF1ZXVlXG4gICAgICAgICAgLy8gbWVzc2FnZSBjYW4gc2FmZWx5IGNhcnJ5IChiaW5hcnksIHVuZGVyIHRoZSBWUVMgc2l6ZSBjYXApLlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHJlc2lsaWVudERpc3BhdGNoRWxpZ2libGUgJiZcbiAgICAgICAgICAgIHF1ZXVlU3RlcENpZHM/LmhhcyhzdGVwLmNvcnJlbGF0aW9uSWQpICYmXG4gICAgICAgICAgICBlbmNyeXB0ZWRJbnB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgJiZcbiAgICAgICAgICAgIGVuY3J5cHRlZElucHV0LmJ5dGVMZW5ndGggPD0gTUFYX1JFU0lMSUVOVF9TVEVQX0lOUFVUX0JZVEVTXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBbY3JlYXRlUmVzdWx0LCBxdWV1ZVJlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW1xuICAgICAgICAgICAgICB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9jcmVhdGVkJyxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHN0ZXAuc3RlcElkLFxuICAgICAgICAgICAgICAgICAgaW5wdXQ6IGVuY3J5cHRlZElucHV0LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBxdWV1ZVN0ZXBNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgICBuZXh0VHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgICAgIHB1cnBvc2U6ICdkaXNwYXRjaCcsXG4gICAgICAgICAgICAgICAgc3RlcElucHV0OiBlbmNyeXB0ZWRJbnB1dCxcbiAgICAgICAgICAgICAgICB3ZmRpYWcsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAvLyBRdWV1ZSBmYWlsdXJlIGlzIGFsd2F5cyBmYXRhbCBmb3IgdGhpcyBkaXNwYXRjaCBwYXNzOlxuICAgICAgICAgICAgLy8gd2l0aG91dCB0aGUgbWVzc2FnZSB0aGUgc3RlcCB3b3VsZCByZWx5IG9uIHRoZSBjcmVhdGVcbiAgICAgICAgICAgIC8vIGFsb25lLCBhbmQgaWYgdGhlIGNyZWF0ZSBBTFNPIGZhaWxlZCB0aGVyZSB3b3VsZCBiZSBub1xuICAgICAgICAgICAgLy8gZHVyYWJsZSByZWNvcmQgYXQgYWxsLiBQcm9wYWdhdGluZyByZWRlbGl2ZXJzIHRoZVxuICAgICAgICAgICAgLy8gb3JjaGVzdHJhdG9yIG1lc3NhZ2UsIHdoaWNoIHJlLWNyZWF0ZXMgdGhlIChpZGVtcG90ZW50KVxuICAgICAgICAgICAgLy8gc3RlcF9jcmVhdGVkIGFuZCByZS1kaXNwYXRjaGVzLlxuICAgICAgICAgICAgaWYgKHF1ZXVlUmVzdWx0LnN0YXR1cyA9PT0gJ3JlamVjdGVkJykge1xuICAgICAgICAgICAgICB0aHJvdyBxdWV1ZVJlc3VsdC5yZWFzb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBxdWV1ZWRTdGVwQ2lkcy5hZGQoc3RlcC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICAgIGlmIChjcmVhdGVSZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVyciA9IGNyZWF0ZVJlc3VsdC5yZWFzb247XG4gICAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgICAvLyBDb25jdXJyZW50IGludm9jYXRpb24gd3JvdGUgaXQgZmlyc3Qg4oCUIHRoZSBtZXNzYWdlIGlzXG4gICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBvdXQ7IGl0cyBkdXBsaWNhdGUgcHVibGlzaCBkZWR1cGVzIG9uIHRoZVxuICAgICAgICAgICAgICAgIC8vIHNoYXJlZCBzdGVwLWlkZW50aXR5LXNjb3BlZCBpZGVtcG90ZW5jeSBrZXkuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChpc1JldHJ5YWJsZVdvcmxkRXJyb3IoZXJyKSkge1xuICAgICAgICAgICAgICAgIC8vIFJlc2lsaWVudDogdGhlIHdyaXRlIGZhaWxlZCB0cmFuc2llbnRseSAoNDI5IC8gNXh4IC9cbiAgICAgICAgICAgICAgICAvLyB0cmFuc3BvcnQpIGJ1dCB0aGUgc3RlcCBtZXNzYWdlIOKAlCBjYXJyeWluZyB0aGUgc2FtZVxuICAgICAgICAgICAgICAgIC8vIHNlcmlhbGl6ZWQgaW5wdXQg4oCUIHdhcyBwdWJsaXNoZWQsIHNvIHRoZSBjb25zdW1lclxuICAgICAgICAgICAgICAgIC8vIGlkZW1wb3RlbnRseSByZS1lbnN1cmVzIHRoZSBzdGVwX2NyZWF0ZWQgYmVmb3JlXG4gICAgICAgICAgICAgICAgLy8gZXhlY3V0aW5nLlxuICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICdTdGVwIGNyZWF0aW9uIGV2ZW50IHdyaXRlIGZhaWxlZCwgYnV0IHRoZSBzdGVwIHdhcyAnICtcbiAgICAgICAgICAgICAgICAgICAgJ2Rpc3BhdGNoZWQgdmlhIHRoZSBxdWV1ZS4gVGhlIHN0ZXBfY3JlYXRlZCBldmVudCAnICtcbiAgICAgICAgICAgICAgICAgICAgJ3dpbGwgYmUgZW5zdXJlZCBieSB0aGUgcXVldWUgY29uc3VtZXIuJyxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHN0ZXAuc3RlcElkLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgd2ZkaWFnKCdzdGVwX3Jlc2lsaWVudF9kaXNwYXRjaF9yZWNvdmVyZWQnLCB7XG4gICAgICAgICAgICAgICAgICBzdGVwSWQ6IHN0ZXAuc3RlcElkLFxuICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHtcbiAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9jcmVhdGVkJyxcbiAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzdGVwLnN0ZXBJZCxcbiAgICAgICAgICAgICAgICBpbnB1dDogZW5jcnlwdGVkSW5wdXQsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHJldHVybjtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBOT1RFOiBzdGVwIHF1ZXVlaW5nIGlzIG90aGVyd2lzZSB0aGUgY2FsbGVyJ3MgZGVjaXNpb24g4oCUIHRoZVxuICAgICAgICAgIC8vIGlubGluZSBsb29wIGV4ZWN1dGVzIGZyZXNoIHN0ZXBzIGluIHRoZSBsaXZlIFZNIGFuZCBvbmx5XG4gICAgICAgICAgLy8gcXVldWVzIHRoZSBvdmVyZmxvdyAvIHJldHJ5IC8gYmFja3N0b3AgY2FzZXMgKHNlZVxuICAgICAgICAgIC8vIHF1ZXVlU3RlcE1lc3NhZ2UpLlxuICAgICAgICB9KSgpXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAob3AudHlwZSA9PT0gJ2F0dHJpYnV0ZScgJiYgIW9wLmhhc0NyZWF0ZWRFdmVudCkge1xuICAgICAgY29uc3QgYXR0ciA9IG9wIGFzIFBlbmRpbmdBdHRyaWJ1dGU7XG4gICAgICBvcHNQcm9taXNlcy5wdXNoKFxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2F0dHJfc2V0JyxcbiAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBhdHRyLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgIGNoYW5nZXM6IGF0dHIuY2hhbmdlcyxcbiAgICAgICAgICAgICAgICB3cml0ZXI6IHsgdHlwZTogJ3dvcmtmbG93JyB9LFxuICAgICAgICAgICAgICAgIC4uLihhdHRyLmFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzXG4gICAgICAgICAgICAgICAgICA/IHsgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM6IHRydWUgfVxuICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgIH0gYXMgYW55LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjcmVhdGVkQXR0cmlidXRlRXZlbnQgPSB0cnVlO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAvLyBFdmVudCBhbHJlYWR5IGV4aXN0cyAoY29uY3VycmVudCBpbnZvY2F0aW9uKSDigJQgdGhlXG4gICAgICAgICAgICAgIC8vIHJlcGxheSBzdGlsbCBuZWVkcyB0byBjb25zdW1lIGl0LCBzbyByZXF1ZXVlLlxuICAgICAgICAgICAgICBjcmVhdGVkQXR0cmlidXRlRXZlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICB9KSgpXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAob3AudHlwZSA9PT0gJ3dhaXQnICYmICFvcC5oYXNDcmVhdGVkRXZlbnQpIHtcbiAgICAgIGNvbnN0IHdhaXQgPSBvcCBhcyBQZW5kaW5nV2FpdDtcbiAgICAgIG9wc1Byb21pc2VzLnB1c2goXG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHtcbiAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnd2FpdF9jcmVhdGVkJyxcbiAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiB3YWl0LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgIHJlc3VtZUF0OiBuZXcgRGF0ZSh3YWl0LnJlc3VtZUF0KSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkgcmV0dXJuO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBQZXItb3AgZGlzcGF0Y2ggcnVucyBpbiBwYXJhbGxlbC5cbiAgYXdhaXQgUHJvbWlzZS5hbGwob3BzUHJvbWlzZXMpO1xuXG4gIHJldHVybiB7IGNyZWF0ZWRBdHRyaWJ1dGVFdmVudCwgY3JlYXRlZEdldENvbmZsaWN0SG9vaywgcXVldWVkU3RlcENpZHMgfTtcbn1cblxuLyoqXG4gKiBSdW4gYSB3b3JrZmxvdyB1c2luZyB0aGUgUXVpY2tKUyBXQVNNIFZNIGVuZ2luZS5cbiAqXG4gKiBUaGlzIHJlcGxhY2VzIHRoZSBgbm9kZTp2bWAgcmVwbGF5IHBhdGggKHJ1bldvcmtmbG93ICsgRXZlbnRzQ29uc3VtZXIpXG4gKiB3aXRoIGEgUXVpY2tKUyBWTSBpbnZvY2F0aW9uIHRoYXQgcGVyZm9ybXMgdGhlIHNhbWUgZnVsbCBldmVudCByZXBsYXkuXG4gKlxuICogS05PV04gR0FQIOKAlCBzbG90IHNuYXBzaG90OiB1bmxpa2UgdGhlIG5vZGU6dm0gcGF0aCwgbm8gZXZlbnQgd3JpdGUgaW5cbiAqIHRoaXMgZmlsZSBjYXJyaWVzIHtAbGluayBDcmVhdGVFdmVudFBhcmFtcy5ldmVudENvdW50fSwgc28gYSBXb3JsZCBuZXZlclxuICogbGVhcm5zIHdoaWNoIGV2ZW50cyB0aGUgd3JpdGVyIGhhZCBub3Qgc2VlbiBhbmQgbmV2ZXIgcmVwb3J0cyB0aGVtIGJhY2suXG4gKiBUaGUgZW5naW5lIGN1cnJlbnRseSByZWxpZXMgb24gcGVyLShydW5JZCwgY29ycmVsYXRpb25JZCkgZXZlbnRcbiAqIHVuaXF1ZW5lc3MgKEVudGl0eUNvbmZsaWN0RXJyb3IgZGVkdXApIGFsb25lLiBUaGlzIGlzIGEgZGVsaWJlcmF0ZVxuICogc2ltcGxpZmljYXRpb24gd2hpbGUgdGhlIGVuZ2luZSBpcyBleHBlcmltZW50YWwg4oCUIHdpcmluZyB0aGUgc25hcHNob3QgaXNcbiAqIHRyYWNrZWQgZm9sbG93LXVwIHdvcms7IGFueW9uZSBhZGRpbmcgbmV3IHdyaXRlIHBhdGhzIGhlcmUgc2hvdWxkIG5vdFxuICogYXNzdW1lIHBhcml0eSB3aXRoIHRoZSBub2RlIGVuZ2luZSBvbiB0aGlzIGF4aXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5Xb3JrZmxvd1dpdGhRdWlja0pTKHBhcmFtczoge1xuICB3b3JrZmxvd0NvZGU6IHN0cmluZztcbiAgd29ya2Zsb3dOYW1lOiBzdHJpbmc7XG4gIHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1bjtcbiAgLyoqXG4gICAqIEV2ZW50cyByZXR1cm5lZCBpbmxpbmUgYnkgYGV2ZW50cy5jcmVhdGUoJ3J1bl9zdGFydGVkJywgLi4uKWAgb3IgYnlcbiAgICogdGhlIGxhenkgaG9vayBmYXN0IHBhdGgncyBgaG9va19yZWNlaXZlZGAgcHJlbG9hZC4gV2hlbiB0aGV5IGluZGljYXRlXG4gICAqIGEgZmlyc3QgaW52b2NhdGlvbiDigJQgb3Igd2hlbiBgcHJlbG9hZGVkRXZlbnRzQ29tcGxldGVgIGF0dGVzdHMgdGhleVxuICAgKiBhcmUgdGhlIGNvbXBsZXRlIGxvZyDigJQgdGhleSBhcmUgdXNlZCBhcyB0aGUgZXZlbnQgbG9nIGluc3RlYWQgb2ZcbiAgICogZmV0Y2hpbmcgdmlhIGBldmVudHMubGlzdGAsIG1hdGNoaW5nIHRoZSBub2RlOnZtIGVuZ2luZSdzIGZhc3QgcGF0aC5cbiAgICovXG4gIHByZWxvYWRlZEV2ZW50cz86IEV2ZW50W107XG4gIC8qKlxuICAgKiBUcnVlIHdoZW4gdGhlIGNhbGxlciBoYXMgdmFsaWRhdGVkIHRoYXQgYHByZWxvYWRlZEV2ZW50c2AgaXMgdGhlIHJ1bidzXG4gICAqIENPTVBMRVRFIGV2ZW50IGxvZyAoZS5nLiB0aGUgbGF6eSBob29rIGZhc3QgcGF0aCdzIGhhc01vcmUtZmFsc2VcbiAgICogcmVwbGF5IHByZWxvYWQpLiBUaGUgZmlyc3QtaW52b2NhdGlvbiBoZXVyaXN0aWMgYmVsb3cgb25seSByZWNvZ25pemVzXG4gICAqIHJ1bl9jcmVhdGVkL3J1bl9zdGFydGVkLW9ubHkgcHJlbG9hZHMsIHNvIHdpdGhvdXQgdGhpcyBhdHRlc3RhdGlvbiBhXG4gICAqIGhvb2stcmVzdW1lIHByZWxvYWQgd291bGQgYmUgZGlzY2FyZGVkIGFuZCByZWZldGNoZWQuXG4gICAqL1xuICBwcmVsb2FkZWRFdmVudHNDb21wbGV0ZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBSdW4gaW5wdXQgY2FycmllZCB0aHJvdWdoIHRoZSBxdWV1ZSBtZXNzYWdlIG9uIGZpcnN0IGRlbGl2ZXJ5LiBVc2VkXG4gICAqIGFzIGEgbGFzdC1yZXNvcnQgZmFsbGJhY2sgZm9yIGBydW5fY3JlYXRlZC5ldmVudERhdGEuaW5wdXRgIHdoZW5cbiAgICogdGhlIGV2ZW50IGxvZyBpcyBpbmNvbXBsZXRlLlxuICAgKi9cbiAgcnVuSW5wdXQ/OiBSdW5JbnB1dDtcbiAgLyoqXG4gICAqIFRoZSBwYXJlbnQgT1RlbCBzcGFuICh0aGUgb3V0ZXIgYFdPUktGTE9XIHt3b3JrZmxvd05hbWV9YCBzcGFuIGZyb21cbiAgICogYHJ1bnRpbWUudHNgKS4gV2hlbiBzdXBwbGllZCwgVk0gbGlmZWN5Y2xlIGF0dHJpYnV0ZXMgYXJlIGF0dGFjaGVkXG4gICAqIHRvIGl0IGZvciBlbmQtdG8tZW5kIHZpc2liaWxpdHkuXG4gICAqL1xuICBwYXJlbnRTcGFuPzogU3BhbjtcbiAgLyoqXG4gICAqIFNlcnZlci1zdXBwbGllZCBwZXItcnVuIGV2ZW50IGNlaWxpbmcgZnJvbSB0aGUgcnVuX3N0YXJ0ZWQgcmVzcG9uc2VcbiAgICogKHVuZGVmaW5lZCDih5Igbm8gZW5mb3JjZW1lbnQpLiBNaXJyb3JzIHRoZSBub2RlOnZtIGVuZ2luZSdzIGd1YXJkOlxuICAgKiBhIHJ1bmF3YXkgcnVuIGlzIGZhaWxlZCBvbmNlIGl0cyBsb2cgcmVhY2hlcyB0aGUgY2VpbGluZy4gVGhlIHRocm93XG4gICAqIHByb3BhZ2F0ZXMgdG8gdGhlIHJlcGxheSBsb29wJ3MgY2F0Y2ggaW4gcnVudGltZS50cyAodGhlIFF1aWNrSlNcbiAgICogZGlzcGF0Y2ggcnVucyBpbnNpZGUgdGhhdCBsb29wJ3MgdHJ5KSwgd2hpY2ggY2xhc3NpZmllcyBpdCBhbmRcbiAgICogcmVjb3JkcyBydW5fZmFpbGVkIHdpdGggTUFYX0VWRU5UU19FWENFRURFRC5cbiAgICovXG4gIG1heEV2ZW50c0xpbWl0PzogbnVtYmVyO1xuICAvKipcbiAgICogUXVldWUgZGVsaXZlcnkgYXR0ZW1wdCBvZiB0aGUgbWVzc2FnZSBkcml2aW5nIHRoaXMgaW52b2NhdGlvbiAoZnJvbVxuICAgKiB0aGUgcXVldWUgaGFuZGxlcidzIG1ldGFkYXRhOyAxID0gZmlyc3QgZGVsaXZlcnkpLiBTdXJmYWNlZCBpblxuICAgKiBkaWFnbm9zdGljczsgY3Jhc2ggcmVjb3ZlcnkgaXRzZWxmIGlzIGRyaXZlbiBieSB0aGUgb3duZXJzaGlwLWxlYXNlXG4gICAqIGRlY2lzaW9uIHRhYmxlIGluIHRoZSBsb29wLCBub3QgYnkgdGhlIGF0dGVtcHQgY291bnQuXG4gICAqL1xuICBkZWxpdmVyeUF0dGVtcHQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBRdWV1ZSBtZXNzYWdlIElEIG9mIHRoZSBkZWxpdmVyeSBkcml2aW5nIHRoaXMgaW52b2NhdGlvbiwgc3RhbXBlZCBhc1xuICAgKiBgb3duZXJNZXNzYWdlSWRgIG9uIGlubGluZSBsYXp5IHN0ZXAgY2xhaW1zIHNvIHdha2UgcmVwbGF5cyBkZWZlciB0b1xuICAgKiB0aGUgaW4tZmxpZ2h0IGJvZHkgaW5zdGVhZCBvZiByZXF1ZXVlaW5nIHRoZSBzdGVwLlxuICAgKi9cbiAgb3duZXJNZXNzYWdlSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBRdWV1ZSBuYW1lc3BhY2UgcmVzb2x2ZWQgYXQgcm91dGUgcmVnaXN0cmF0aW9uIChydW50aW1lLnRzKS4gTXVzdCBiZVxuICAgKiB0aHJlYWRlZCBpbnRvIGV2ZXJ5IG1lc3NhZ2UgcHVibGlzaDogdGhlIGJ1aWxkZXJzIGJha2UgdGhlIG5hbWVzcGFjZVxuICAgKiBpbnRvIGdlbmVyYXRlZCByb3V0ZXMsIHNvIGNvbnN1bWVycyBsaXN0ZW4gb24gYF9fPG5zPl93a2Zfd29ya2Zsb3dfKmBcbiAgICog4oCUIGEgcHVibGlzaCB3aXRob3V0IGl0IGxhbmRzIG9uIGBfX3drZl93b3JrZmxvd18qYCBhbmQgaXMgbmV2ZXJcbiAgICogcGlja2VkIHVwLlxuICAgKi9cbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICAvKipcbiAgICogUnVuLW9yaWdpbiB0cmFjZSBjYXJyaWVyIGFjY2Vzc29yIGZyb20gcnVudGltZS50c1xuICAgKiAoZ2V0TmV4dFRyYWNlQ2FycmllcikuIEluIHRoZSBkZWZhdWx0IGBsaW5rZWRgIHRyYWNlIG1vZGUgZXZlcnlcbiAgICogaW52b2NhdGlvbiBtdXN0IGxpbmsgYmFjayB0byB0aGUgcnVuJ3Mgb3JpZ2luICh3b3JrZmxvdy5zdGFydCkgaW4gYVxuICAgKiBzdGFyOyBjYXB0dXJpbmcgdGhlIGN1cnJlbnQgaW52b2NhdGlvbiBjb250ZXh0IGluc3RlYWQgd291bGQgY2hhaW5cbiAgICogaW52b2NhdGlvbnMgdG8gZWFjaCBvdGhlciBhbmQgZnJhZ21lbnQgdGhlIHJ1biB2aWV3IG9uIGFzeW5jIHF1ZXVlcy5cbiAgICovXG4gIG5leHRUcmFjZUNhcnJpZXI/OiAoKSA9PiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xufSk6IFByb21pc2U8eyB0aW1lb3V0U2Vjb25kcz86IG51bWJlciB9IHwgdm9pZD4ge1xuICBjb25zdCB7XG4gICAgd29ya2Zsb3dDb2RlLFxuICAgIHdvcmtmbG93TmFtZSxcbiAgICB3b3JrZmxvd1J1bixcbiAgICBwcmVsb2FkZWRFdmVudHMsXG4gICAgcHJlbG9hZGVkRXZlbnRzQ29tcGxldGUsXG4gICAgcnVuSW5wdXQsXG4gICAgcGFyZW50U3BhbixcbiAgICBtYXhFdmVudHNMaW1pdCxcbiAgICBkZWxpdmVyeUF0dGVtcHQsXG4gICAgb3duZXJNZXNzYWdlSWQsXG4gICAgbmFtZXNwYWNlLFxuICB9ID0gcGFyYW1zO1xuICAvLyBTdGFuZGFsb25lLWNhbGxlciBmYWxsYmFjayAodGVzdHMpOiB3aXRob3V0IGEgcnVudGltZS50cyBjYXJyaWVyXG4gIC8vIGFjY2Vzc29yLCBmYWxsIGJhY2sgdG8gdGhlIGN1cnJlbnQgaW52b2NhdGlvbiBjb250ZXh0LlxuICBjb25zdCBuZXh0VHJhY2VDYXJyaWVyID1cbiAgICBwYXJhbXMubmV4dFRyYWNlQ2FycmllciA/PyAoKCkgPT4gc2VyaWFsaXplVHJhY2VDYXJyaWVyKCkpO1xuICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkKCk7XG4gIGNvbnN0IHJ1bklkID0gd29ya2Zsb3dSdW4ucnVuSWQ7XG4gIGNvbnN0IGludm9jYXRpb25TdGFydCA9IHRpY2soKTtcblxuICAvLyBTdHJpcCB0aGUgaW5saW5lIHNvdXJjZSBtYXAgY29tbWVudCBiZWZvcmUgZXZhbHVhdGluZyB0aGUgYnVuZGxlIGluXG4gIC8vIHRoZSBRdWlja0pTIFZNLiBUaGUgbWFwIGlzIHB1cmVseSBob3N0LXNpZGUgbWV0YWRhdGEgZm9yXG4gIC8vIGByZW1hcEVycm9yU3RhY2tgIChjYWxsZWQgYmVsb3cgb24gd29ya2Zsb3cgZmFpbHVyZXMsIGFnYWluc3QgdGhlXG4gIC8vIE9SSUdJTkFMIGB3b3JrZmxvd0NvZGVgKS4gUXVpY2tKUyByZXRhaW5zIHNvdXJjZSB0ZXh0IGZvclxuICAvLyBzdGFjay10cmFjZSBsaW5lIGxvb2t1cHMsIHNvIHRoZSBmZXctTUIgYmFzZTY0IGNvbW1lbnQgd291bGQgYmxvYXRcbiAgLy8gdGhlIFZNIGhlYXAgZm9yIG5vIGJlbmVmaXQuXG4gIGNvbnN0IHdvcmtmbG93Q29kZUZvclZNID0gc3RyaXBJbmxpbmVTb3VyY2VNYXAod29ya2Zsb3dDb2RlKTtcblxuICAvLyBQZXItaW52b2NhdGlvbiBkaWFnbm9zdGljIGlkIHNvIGRlYnVnIGxvZ3MgY2FuIGJlIGNvcnJlbGF0ZWQgZXZlbiBpZlxuICAvLyB0aGUgc2FtZSBydW5JZCBpcyBwcm9jZXNzZWQgYnkgb3ZlcmxhcHBpbmcgaW52b2NhdGlvbnMgb24gZGlmZmVyZW50XG4gIC8vIGZ1bmN0aW9uIGluc3RhbmNlcy5cbiAgY29uc3QgaW52b2NhdGlvbklkID0gYGludl8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDEwKX1gO1xuXG4gIC8vIFN0cnVjdHVyZWQgcGVyLWNoZWNrcG9pbnQgZGlhZ25vc3RpYyBoZWxwZXIsIGdyZXAtZnJpZW5kbHkgYnkgcnVuSWQuXG4gIGNvbnN0IHdmZGlhZyA9IChjaGVja3BvaW50OiBzdHJpbmcsIGZpZWxkczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdRVUlDS0pTX1ZNX0RJQUcnLCB7XG4gICAgICBjaGVja3BvaW50LFxuICAgICAgcnVuSWQsXG4gICAgICBpbnZvY2F0aW9uSWQsXG4gICAgICB0RWxhcHNlZE1zOiBNYXRoLnJvdW5kKHRpY2soKSAtIGludm9jYXRpb25TdGFydCksXG4gICAgICAuLi5maWVsZHMsXG4gICAgfSk7XG4gIH07XG5cbiAgcGFyZW50U3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgLi4uQXR0cmlidXRlLldvcmtmbG93Vm0oJ3F1aWNranMnKSxcbiAgfSk7XG5cbiAgd2ZkaWFnKCdlbnRlcicsIHtcbiAgICB3b3JrZmxvd05hbWUsXG4gICAgZGVsaXZlcnlBdHRlbXB0LFxuICAgIGhhc1ByZWxvYWRlZEV2ZW50czpcbiAgICAgIEFycmF5LmlzQXJyYXkocHJlbG9hZGVkRXZlbnRzKSAmJiBwcmVsb2FkZWRFdmVudHMubGVuZ3RoID4gMCxcbiAgICBwcmVsb2FkZWRFdmVudENvdW50OiBwcmVsb2FkZWRFdmVudHM/Lmxlbmd0aCA/PyAwLFxuICAgIGhhc1J1bklucHV0OiAhIXJ1bklucHV0LFxuICB9KTtcblxuICAvLyBUaGUgd29ya2Zsb3dOYW1lIGZyb20gdGhlIHF1ZXVlIHRvcGljIGlzIGFscmVhZHkgdGhlIGZ1bGwgd29ya2Zsb3cgSURcbiAgLy8gKGUuZy4gXCJ3b3JrZmxvdy8vLi93b3JrZmxvd3MvMV9zaW1wbGUvL3NpbXBsZVwiKVxuICBjb25zdCB3b3JrZmxvd0lkID0gd29ya2Zsb3dOYW1lO1xuXG4gIC8vIFJlc29sdmUgdGhlIGVuY3J5cHRpb24ga2V5IHVwIGZyb250IOKAlCBuZWVkZWQgdG8gZGVjcnlwdCBldmVudFxuICAvLyBwYXlsb2FkcyBpbnNpZGUgdGhlIFZNIGFuZCB0byBlbmNyeXB0IGV2ZW50IHBheWxvYWRzIHdyaXR0ZW4gYmVsb3cuXG4gIC8vIFJlc29sdmUgdGhlIEZVTEwgY2FwYWJpbGl0eSAoc3ltbWV0cmljIEFFUyBrZXkgKyBYMjU1MTkga2V5cGFpciksIG5vdFxuICAvLyBqdXN0IGBpbXBvcnRLZXkocmF3S2V5KWA6IGEgcnVuIHJlYWRpbmcgaXRzIG93biBldmVudCBsb2cgY2FuIGVuY291bnRlclxuICAvLyBzZWFsZWQgKGBlbmNwYCkgaG9vayBwYXlsb2FkcyB0aGF0IGEgY3Jvc3MtZGVwbG95bWVudCBgcmVzdW1lSG9vaygpYFxuICAvLyB3cm90ZSB0byBpdCAoc2VhbGluZyBpcyBwcmVzZW5jZS1nYXRlZCBvbiB0aGUgcnVuJ3MgcHVibGlzaGVkXG4gIC8vIGVuY3J5cHRpb25QdWJsaWNLZXksIHdoaWNoIHRoZSBzaGFyZWQgc3RhcnQoKSBwYXRoIHN0YW1wcyByZWdhcmRsZXNzIG9mXG4gIC8vIGVuZ2luZSkuIEEgYmFyZSBzeW1tZXRyaWMga2V5IGNhbm5vdCBvcGVuIHRob3NlIGFuZCB3b3VsZCB3ZWRnZSB0aGUgcnVuXG4gIC8vIHJpZ2h0IGFmdGVyIGhvb2tfcmVjZWl2ZWQg4oCUIHRoZSBub2RlOnZtIGVuZ2luZSByZXNvbHZlcyB0aGUgc2FtZSBmdWxsXG4gIC8vIGNhcGFiaWxpdHkgdmlhIG1lbW9pemVFbmNyeXB0aW9uS2V5LlxuICBjb25zdCByYXdLZXkgPSBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuPy4od29ya2Zsb3dSdW4pO1xuICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gcmF3S2V5ID8gYXdhaXQgZGVyaXZlUnVuUGF5bG9hZEtleXMocmF3S2V5KSA6IHVuZGVmaW5lZDtcblxuICAvLyBMb2FkIHRoZSBGVUxMIGV2ZW50IGxvZyBmb3IgdGhlIHJ1bi4gT24gZmlyc3QgaW52b2NhdGlvbiB0aGVcbiAgLy8gcHJlbG9hZGVkIGV2ZW50cyBmcm9tIHRoZSBydW5fc3RhcnRlZCByZXNwb25zZSBhcmUgdGhlIGNvbXBsZXRlIGxvZ1xuICAvLyBhbmQgc2F2ZSB0aGUgZXZlbnRzLmxpc3Qgcm91bmQtdHJpcHM7IGEgY2FsbGVyLWF0dGVzdGVkIGNvbXBsZXRlXG4gIC8vIHByZWxvYWQgKGxhenkgaG9vayBmYXN0IHBhdGgpIGlzIHRydXN0ZWQgdGhlIHNhbWUgd2F5LlxuICBsZXQgZXZlbnRzOiBFdmVudFtdO1xuICBsZXQgZXZlbnRzRmV0Y2hlZFBhZ2VzID0gMDtcbiAgY29uc3QgdXNlUHJlbG9hZGVkID1cbiAgICAocHJlbG9hZGVkRXZlbnRzQ29tcGxldGUgPT09IHRydWUgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkocHJlbG9hZGVkRXZlbnRzKSAmJlxuICAgICAgcHJlbG9hZGVkRXZlbnRzLmxlbmd0aCA+IDApIHx8XG4gICAgaXNGaXJzdEludm9jYXRpb24ocHJlbG9hZGVkRXZlbnRzKTtcbiAgaWYgKHVzZVByZWxvYWRlZCAmJiBwcmVsb2FkZWRFdmVudHMpIHtcbiAgICBldmVudHMgPSBwcmVsb2FkZWRFdmVudHM7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgYWxsRXZlbnRzOiBFdmVudFtdID0gW107XG4gICAgbGV0IGN1cnNvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGhhc01vcmUgPSB0cnVlO1xuXG4gICAgd2hpbGUgKGhhc01vcmUpIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgd29ybGQuZXZlbnRzLmxpc3Qoe1xuICAgICAgICBydW5JZCxcbiAgICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICAgIHNvcnRPcmRlcjogJ2FzYycsXG4gICAgICAgICAgY3Vyc29yOiBjdXJzb3IgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIGxpbWl0OiAxMDAwLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBldmVudHNGZXRjaGVkUGFnZXMrKztcbiAgICAgIGFsbEV2ZW50cy5wdXNoKC4uLnJlc3BvbnNlLmRhdGEpO1xuICAgICAgLy8gVXBkYXRlIHRoZSBjdXJzb3IgdG8gdGhlIGxhc3Qgc3VjY2Vzc2Z1bGx5IGZldGNoZWQgcGFnZSdzIGN1cnNvci5cbiAgICAgIC8vIE9ubHkgdXBkYXRlIHdoZW4gd2UgZ290IHJlc3VsdHMg4oCUIHRoZSBmaW5hbCBlbXB0eS1wYWdlIHJlc3BvbnNlXG4gICAgICAvLyByZXR1cm5zIGN1cnNvcj1udWxsIHdoaWNoIHdlIG11c3QgTk9UIHVzZSAoaXQgd291bGQgcmVzZXQgdGhlIGN1cnNvcikuXG4gICAgICBpZiAocmVzcG9uc2UuY3Vyc29yKSB7XG4gICAgICAgIGN1cnNvciA9IHJlc3BvbnNlLmN1cnNvcjtcbiAgICAgIH1cbiAgICAgIGhhc01vcmUgPSByZXNwb25zZS5kYXRhLmxlbmd0aCA+IDAgJiYgcmVzcG9uc2UuY3Vyc29yICE9IG51bGw7XG4gICAgfVxuXG4gICAgZXZlbnRzID0gYWxsRXZlbnRzO1xuICB9XG5cbiAgLy8gRXZlbnQtbGltaXQgZ3VhcmQ6IGZhaWwgYSBydW5hd2F5IHJ1biBvbmNlIGl0cyBsb2cgcmVhY2hlcyB0aGVcbiAgLy8gc2VydmVyLXN1cHBsaWVkIGNlaWxpbmcg4oCUIHNhbWUgZW5mb3JjZW1lbnQgcG9pbnQgYXMgdGhlIG5vZGU6dm1cbiAgLy8gZW5naW5lJ3MgcmVwbGF5IGxvb3AuXG4gIGlmIChtYXhFdmVudHNMaW1pdCAhPT0gdW5kZWZpbmVkICYmIGV2ZW50cy5sZW5ndGggPj0gbWF4RXZlbnRzTGltaXQpIHtcbiAgICB0aHJvdyBuZXcgTWF4RXZlbnRzRXhjZWVkZWRFcnJvcihldmVudHMubGVuZ3RoLCBtYXhFdmVudHNMaW1pdCk7XG4gIH1cblxuICBwYXJlbnRTcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAuLi5BdHRyaWJ1dGUuUXVpY2tKU0V2ZW50c1ByZWxvYWRlZCh1c2VQcmVsb2FkZWQpLFxuICAgIC4uLkF0dHJpYnV0ZS5RdWlja0pTRXZlbnRzRmV0Y2hlZENvdW50KGV2ZW50cy5sZW5ndGgpLFxuICAgIC4uLkF0dHJpYnV0ZS5RdWlja0pTRXZlbnRzRmV0Y2hlZFBhZ2VzKGV2ZW50c0ZldGNoZWRQYWdlcyksXG4gIH0pO1xuXG4gIHdmZGlhZygnZXZlbnRzX2ZldGNoZWQnLCB7XG4gICAgZXZlbnRDb3VudDogZXZlbnRzLmxlbmd0aCxcbiAgICBldmVudHNGZXRjaGVkUGFnZXMsXG4gICAgdXNlUHJlbG9hZGVkLFxuICAgIGV2ZW50VHlwZXM6IGV2ZW50cy5yZWR1Y2U8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4oKGFjYywgZSkgPT4ge1xuICAgICAgYWNjW2UuZXZlbnRUeXBlXSA9IChhY2NbZS5ldmVudFR5cGVdID8/IDApICsgMTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pLFxuICB9KTtcblxuICAvLyBDaGVjayBmb3IgZWxhcHNlZCB3YWl0c1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBjb25zdCBjb21wbGV0ZWRXYWl0SWRzID0gbmV3IFNldChcbiAgICBldmVudHNcbiAgICAgIC5maWx0ZXIoKGUpID0+IGUuZXZlbnRUeXBlID09PSAnd2FpdF9jb21wbGV0ZWQnKVxuICAgICAgLm1hcCgoZSkgPT4gZS5jb3JyZWxhdGlvbklkKVxuICApO1xuICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgIGlmIChcbiAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3dhaXRfY3JlYXRlZCcgJiZcbiAgICAgIGV2ZW50LmNvcnJlbGF0aW9uSWQgJiZcbiAgICAgICFjb21wbGV0ZWRXYWl0SWRzLmhhcyhldmVudC5jb3JyZWxhdGlvbklkKVxuICAgICkge1xuICAgICAgY29uc3QgZXZlbnREYXRhID1cbiAgICAgICAgJ2V2ZW50RGF0YScgaW4gZXZlbnRcbiAgICAgICAgICA/IChldmVudC5ldmVudERhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCByZXN1bWVBdCA9IGV2ZW50RGF0YT8ucmVzdW1lQXQ7XG4gICAgICBpZiAocmVzdW1lQXQgJiYgbm93ID49IG5ldyBEYXRlKHJlc3VtZUF0IGFzIHN0cmluZykuZ2V0VGltZSgpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShydW5JZCwge1xuICAgICAgICAgICAgZXZlbnRUeXBlOiAnd2FpdF9jb21wbGV0ZWQnLFxuICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgY29ycmVsYXRpb25JZDogZXZlbnQuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAocmVzdWx0LmV2ZW50KSBldmVudHMucHVzaChyZXN1bHQuZXZlbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSBjb250aW51ZTtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBSZXNvbHZlIHRoZSB3b3JrZmxvdyBzZXJ2ZXIgcG9ydCBzbyBgZ2V0V29ya2Zsb3dNZXRhZGF0YSgpLnVybGAgaW5zaWRlXG4gIC8vIHRoZSBWTSBtYXRjaGVzIHdoYXQgdGhlIHN0ZXAtc2lkZSBoYW5kbGVyIHJlcG9ydHMuIFNraXBwZWQgb24gVmVyY2VsIOKAlFxuICAvLyB0aGUgVk0gcmVhZHMgVkVSQ0VMX1VSTCBkaXJlY3RseSBpbiB0aGF0IGVudmlyb25tZW50LlxuICBjb25zdCBpc1ZlcmNlbCA9IHByb2Nlc3MuZW52LlZFUkNFTF9VUkwgIT09IHVuZGVmaW5lZDtcbiAgY29uc3QgcG9ydCA9IGlzVmVyY2VsID8gdW5kZWZpbmVkIDogYXdhaXQgZ2V0UG9ydExhenkoKTtcblxuICAvLyBSdW4gdGhlIHdvcmtmbG93IGluIHRoZSBRdWlja0pTIFZNXG4gIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1F1aWNrSlMgcnVudGltZTogaW52b2tpbmcgVk0nLCB7XG4gICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgd29ya2Zsb3dJZCxcbiAgICBldmVudENvdW50OiBldmVudHMubGVuZ3RoLFxuICB9KTtcblxuICBjb25zdCBzZXNzaW9uID0gYXdhaXQgc3RhcnRRdWlja0pTV29ya2Zsb3coe1xuICAgIC8vIFBhc3MgdGhlIFNUUklQUEVEIGJ1bmRsZSB0byB0aGUgVk0gc28gdGhlIGlubGluZSBzb3VyY2UgbWFwXG4gICAgLy8gZG9lc24ndCBlbmQgdXAgaW4gdGhlIFF1aWNrSlMgaGVhcC4gVGhlIG9yaWdpbmFsICh1bnN0cmlwcGVkKVxuICAgIC8vIGB3b3JrZmxvd0NvZGVgIGlzIHN0aWxsIGtlcHQgaW4gdGhpcyBob3N0LXNpZGUgc2NvcGUgYW5kIGlzIHVzZWRcbiAgICAvLyBieSBgcmVtYXBFcnJvclN0YWNrYCBvbiB3b3JrZmxvdyBmYWlsdXJlcyBiZWxvdy5cbiAgICB3b3JrZmxvd0NvZGU6IHdvcmtmbG93Q29kZUZvclZNLFxuICAgIHdvcmtmbG93SWQsXG4gICAgd29ya2Zsb3dSdW4sXG4gICAgZXZlbnRzLFxuICAgIHdvcmxkQ2FwYWJpbGl0aWVzOiB3b3JsZC5jYXBhYmlsaXRpZXMsXG4gICAgZW5jcnlwdGlvbktleSxcbiAgICBwb3J0LFxuICAgIHJ1bklucHV0LFxuICB9KTtcbiAgbGV0IHJlc3VsdCA9IHNlc3Npb24ucmVzdWx0O1xuXG4gIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1F1aWNrSlMgcnVudGltZTogVk0gcmV0dXJuZWQnLCB7XG4gICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgY29tcGxldGVkOiAhIXJlc3VsdC5jb21wbGV0ZWQsXG4gICAgc3VzcGVuZGVkOiAhIXJlc3VsdC5zdXNwZW5kZWQsXG4gICAgZmFpbGVkOiAhIXJlc3VsdC5mYWlsZWQsXG4gICAgcGVuZGluZ09wc0NvdW50OiByZXN1bHQuc3VzcGVuZGVkPy5wZW5kaW5nT3BlcmF0aW9ucz8ubGVuZ3RoLFxuICB9KTtcblxuICB3ZmRpYWcoJ3ZtX3JldHVybmVkJywge1xuICAgIG91dGNvbWU6IHJlc3VsdC5jb21wbGV0ZWRcbiAgICAgID8gJ2NvbXBsZXRlZCdcbiAgICAgIDogcmVzdWx0LnN1c3BlbmRlZFxuICAgICAgICA/ICdzdXNwZW5kZWQnXG4gICAgICAgIDogcmVzdWx0LmZhaWxlZFxuICAgICAgICAgID8gJ2ZhaWxlZCdcbiAgICAgICAgICA6ICd1bmtub3duJyxcbiAgICBwZW5kaW5nT3BzQ291bnQ6IHJlc3VsdC5zdXNwZW5kZWQ/LnBlbmRpbmdPcGVyYXRpb25zPy5sZW5ndGggPz8gMCxcbiAgICBwZW5kaW5nT3BTdW1tYXJ5OiByZXN1bHQuc3VzcGVuZGVkPy5wZW5kaW5nT3BlcmF0aW9ucz8ubWFwKChwKSA9PiAoe1xuICAgICAgdHlwZTogcC50eXBlLFxuICAgICAgY29ycmVsYXRpb25JZDogcC5jb3JyZWxhdGlvbklkLFxuICAgICAgaGFzQ3JlYXRlZEV2ZW50OiBwLmhhc0NyZWF0ZWRFdmVudCxcbiAgICAgIC4uLihwLnR5cGUgPT09ICdzdGVwJyA/IHsgc3RlcElkOiAocCBhcyBQZW5kaW5nU3RlcCkuc3RlcElkIH0gOiB7fSksXG4gICAgfSkpLFxuICAgIGZhaWx1cmVNZXNzYWdlOiByZXN1bHQuZmFpbGVkPy5tZXNzYWdlLFxuICAgIGZhaWx1cmVOYW1lOiByZXN1bHQuZmFpbGVkPy5uYW1lLFxuICB9KTtcblxuICAvLyAtLS0tIElubGluZSBjb250aW51YXRpb24gbG9vcCAtLS0tXG4gIC8vXG4gIC8vIFdoaWxlIHRoZSB3b3JrZmxvdyBpcyBzdXNwZW5kZWQsIHRoaXMgbG9vcCBrZWVwcyB0aGUgVk0gYWxpdmUgYW5kXG4gIC8vIG1ha2VzIGFzIG11Y2ggZm9yd2FyZCBwcm9ncmVzcyBhcyBwb3NzaWJsZSB3aXRoaW4gb25lIGludm9jYXRpb246XG4gIC8vXG4gIC8vICAgMS4gRGlzcGF0Y2ggZHVyYWJsZSBzaWRlIGVmZmVjdHMgZm9yIHRoZSBzdXNwZW5zaW9uJ3MgcGVuZGluZyBvcHNcbiAgLy8gICAgICAoc3RlcF9jcmVhdGVkIC8gaG9va19jcmVhdGVkIC8gYXR0cl9zZXQgLyB3YWl0X2NyZWF0ZWQgL1xuICAvLyAgICAgIGhvb2tfcmVjZWl2ZWQgZm9yIGFib3J0cykgYW5kIGNvbXBsZXRlIGVsYXBzZWQgd2FpdHMuXG4gIC8vICAgMi4gRmVlZCBhbGwgbmV3bHkgcmVjb3JkZWQgZXZlbnRzIChhdHRyX3NldCwgaG9va19jcmVhdGVkLCBlbGFwc2VkXG4gIC8vICAgICAgd2FpdF9jb21wbGV0ZWQsIHRlcm1pbmFscyB3cml0dGVuIGJ5IGNvbmN1cnJlbnQgaW52b2NhdGlvbnMsIC4uLilcbiAgLy8gICAgICBpbnRvIHRoZSBMSVZFIFZNIHZpYSBzZXNzaW9uLmNvbnRpbnVlV2l0aEV2ZW50cyDigJQgcmVzdW1pbmdcbiAgLy8gICAgICBleGVjdXRpb24gZXhhY3RseSB3aGVyZSBpdCBsZWZ0IG9mZiwgbm8gZnJlc2gtVk0gcmUtcmVwbGF5LlxuICAvLyAgICAgIENoZWFwIHByb2dyZXNzIGlzIGZlZCBCRUZPUkUgcnVubmluZyBzdGVwIGJvZGllcyBzbyBwcm9taXNlXG4gIC8vICAgICAgY2hhaW5zIHRoYXQgYXJlIG5vdCBnYXRlZCBvbiBzdGVwcyAoaG9vay5nZXRDb25mbGljdCgpLFxuICAvLyAgICAgIHNldEF0dHJpYnV0ZXMoKSwgcmFjaW5nIHNsZWVwcykgYWR2YW5jZSBmaXJzdCBhbmQgY2FuIHN1cmZhY2VcbiAgLy8gICAgICBhZGRpdGlvbmFsIHBlbmRpbmcgc3RlcHMgZm9yIHRoZSBzYW1lIGlubGluZSBiYXRjaC5cbiAgLy8gICAzLiBPbmNlIG5vIGNoZWFwIHByb2dyZXNzIHJlbWFpbnMsIGV4ZWN1dGUgdXAgdG9cbiAgLy8gICAgICBnZXRNYXhJbmxpbmVTdGVwcygpIHN0ZXBzIGNyZWF0ZWQgYnkgVEhJUyBpbnZvY2F0aW9uIGlubGluZSAobm9cbiAgLy8gICAgICBxdWV1ZSByb3VuZC10cmlwKSwgaW4gcGFyYWxsZWwsIHdpdGggdGhlIHJlcGxheSBidWRnZXQgcGF1c2VkXG4gIC8vICAgICAgZHVyaW5nIHN0ZXAgYm9kaWVzIOKAlCBtaXJyb3JpbmcgdGhlIG5vZGU6dm0gZW5naW5lJ3MgaW5saW5lXG4gIC8vICAgICAgcmVwbGF5IGxvb3AuIE92ZXJmbG93IGFuZCByZXRyeS90aHJvdHRsZWQgc3RlcHMgYXJlIHF1ZXVlZCBmb3JcbiAgLy8gICAgICBiYWNrZ3JvdW5kIGV4ZWN1dGlvbi4gQSBkZWxheWVkIHdhaXQtY29udGludWF0aW9uIG1lc3NhZ2UgaXNcbiAgLy8gICAgICBlbnF1ZXVlZCBmb3IgdGhlIHNvb25lc3QgcGVuZGluZyB3YWl0IGZpcnN0LCBzbyByYWNpbmcgdGltZXJzXG4gIC8vICAgICAgZmlyZSBvbiB0aW1lIChpbiBhIHNlcGFyYXRlIGludm9jYXRpb24pIHdoaWxlIHN0ZXAgYm9kaWVzIGJsb2NrXG4gIC8vICAgICAgdGhpcyBvbmUuXG4gIC8vXG4gIC8vIFRoZSBsb29wIGV4aXRzIHdoZW4gdGhlIHdvcmtmbG93IHNldHRsZXMsIG5vIGZvcndhcmQgcHJvZ3Jlc3MgaXNcbiAgLy8gcG9zc2libGUgaW4tcHJvY2VzcywgdGhlIHJlcGxheSBidWRnZXQgaXMgZXhoYXVzdGVkLCBvciB0aGUgcnVuIGlzXG4gIC8vIGdvbmUuXG4gIGNvbnN0IHNlZW5FdmVudElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IGUgb2YgZXZlbnRzKSB7XG4gICAgaWYgKGUuZXZlbnRJZCkgc2VlbkV2ZW50SWRzLmFkZChlLmV2ZW50SWQpO1xuICB9XG4gIC8vIFN0ZXAgY2lkcyBhbHJlYWR5IGV4ZWN1dGVkIGlubGluZSBieSB0aGlzIGludm9jYXRpb24uXG4gIGNvbnN0IGV4ZWN1dGVkU3RlcElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAvLyBTdGVwcyBmb3Igd2hpY2ggVEhJUyBpbnZvY2F0aW9uIGFscmVhZHkgc2VudCBhIHF1ZXVlIG1lc3NhZ2UuXG4gIGNvbnN0IHF1ZXVlZFN0ZXBJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLy8gQWJvcnRzIFRISVMgaW52b2NhdGlvbiBhbHJlYWR5IHJlY29yZGVkIChob29rX3JlY2VpdmVkIHdyaXR0ZW4pIOKAlFxuICAvLyBndWFyZHMgYWdhaW5zdCByZS1yZWNvcmRpbmcgd2hlbiB0aGUgVk0tc2lkZSBmbGFnIGhhcyBub3QgYmVlblxuICAvLyBjbGVhcmVkIHlldCB3aXRoaW4gdGhlIHNhbWUgaXRlcmF0aW9uLlxuICBjb25zdCByZWNvcmRlZEFib3J0SWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIC8vIFdhaXRzIGZvciB3aGljaCBUSElTIGludm9jYXRpb24gYWxyZWFkeSBjb21wbGV0ZWQvc2NoZWR1bGVkIHdvcmsuXG4gIGNvbnN0IGNvbXBsZXRlZFdhaXRJZHMyID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIC8vIElubGluZS1vd25lcnNoaXAgc3RhdGUgcGVyIHN0ZXAgY29ycmVsYXRpb25JZCwgZGVyaXZlZCBmcm9tIGV2ZXJ5XG4gIC8vIGV2ZW50IHRoaXMgaW52b2NhdGlvbiBvYnNlcnZlcyAoaW5pdGlhbCBsb2cgKyBldmVyeSBmZWVkKSDigJQgdGhlXG4gIC8vIHF1aWNranMgYW5hbG9nIG9mIHRoZSByZXBsYXktZGVyaXZlZCBvd25lcnNoaXAgb24gdGhlIG5vZGUgZW5naW5lJ3NcbiAgLy8gU3RlcEludm9jYXRpb25RdWV1ZUl0ZW0gKHNlZSBzdGVwLW93bmVyc2hpcC50cykuIExhdGVzdC13aW5zOlxuICAvLyBldmVudHMgYXJyaXZlIGluIGxvZyBvcmRlciwgc28gYSBsYXRlciBzdGVwX3N0YXJ0ZWQgb3ZlcndyaXRlcyB0aGVcbiAgLy8gc3RhbXA7IGEgc3RlcF9yZXRyeWluZyBsYXBzZXMgb3duZXJzaGlwIHBlcm1hbmVudGx5IGZvciB0aGUgaWQuXG4gIGNvbnN0IHN0ZXBPd25lcnNoaXAgPSBuZXcgTWFwPFxuICAgIHN0cmluZyxcbiAgICB7IG93bmVyPzogc3RyaW5nOyBzdGFydGVkQXRNcz86IG51bWJlcjsgc2F3UmV0cnlpbmc6IGJvb2xlYW4gfVxuICA+KCk7XG4gIGNvbnN0IG9ic2VydmVFdmVudHNGb3JPd25lcnNoaXAgPSAob2JzZXJ2ZWQ6IEV2ZW50W10pOiB2b2lkID0+IHtcbiAgICBmb3IgKGNvbnN0IGUgb2Ygb2JzZXJ2ZWQpIHtcbiAgICAgIGlmIChlLmNvcnJlbGF0aW9uSWQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICBpZiAoZS5ldmVudFR5cGUgPT09ICdzdGVwX3N0YXJ0ZWQnKSB7XG4gICAgICAgIGNvbnN0IG93bmVyID1cbiAgICAgICAgICAnZXZlbnREYXRhJyBpbiBlICYmXG4gICAgICAgICAgZS5ldmVudERhdGEgJiZcbiAgICAgICAgICAnb3duZXJNZXNzYWdlSWQnIGluIGUuZXZlbnREYXRhICYmXG4gICAgICAgICAgdHlwZW9mIGUuZXZlbnREYXRhLm93bmVyTWVzc2FnZUlkID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgPyBlLmV2ZW50RGF0YS5vd25lck1lc3NhZ2VJZFxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHByaW9yID0gc3RlcE93bmVyc2hpcC5nZXQoZS5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgc3RlcE93bmVyc2hpcC5zZXQoZS5jb3JyZWxhdGlvbklkLCB7XG4gICAgICAgICAgb3duZXIsXG4gICAgICAgICAgc3RhcnRlZEF0TXM6IGUuY3JlYXRlZEF0ID8gK25ldyBEYXRlKGUuY3JlYXRlZEF0KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBzYXdSZXRyeWluZzogcHJpb3I/LnNhd1JldHJ5aW5nID8/IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoZS5ldmVudFR5cGUgPT09ICdzdGVwX3JldHJ5aW5nJykge1xuICAgICAgICBjb25zdCBwcmlvciA9IHN0ZXBPd25lcnNoaXAuZ2V0KGUuY29ycmVsYXRpb25JZCk7XG4gICAgICAgIHN0ZXBPd25lcnNoaXAuc2V0KGUuY29ycmVsYXRpb25JZCwge1xuICAgICAgICAgIC4uLihwcmlvciA/PyB7fSksXG4gICAgICAgICAgc2F3UmV0cnlpbmc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgb2JzZXJ2ZUV2ZW50c0Zvck93bmVyc2hpcChldmVudHMpO1xuICBjb25zdCBzY2hlZHVsZWRXYWl0Q29udGludWF0aW9ucyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBtYXhJbmxpbmVTdGVwcyA9IGdldE1heElubGluZVN0ZXBzKCk7XG4gIGNvbnN0IGJ1ZGdldCA9IG5ldyBSZXBsYXlCdWRnZXQoKTtcbiAgY29uc3Qgd29ya2Zsb3dTdGFydGVkQXQgPSB3b3JrZmxvd1J1bi5zdGFydGVkQXRcbiAgICA/ICt3b3JrZmxvd1J1bi5zdGFydGVkQXRcbiAgICA6IERhdGUubm93KCk7XG4gIGNvbnN0IHJvb3RSdW5JZCA9XG4gICAgKHdvcmtmbG93UnVuLmF0dHJpYnV0ZXMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCk/LltcbiAgICAgIFJPT1RfUlVOX0lEX0FUVFJJQlVURVxuICAgIF0gPz8gcnVuSWQ7XG4gIGxldCBpbmxpbmVTdGVwc0V4ZWN1dGVkID0gMDtcbiAgbGV0IHJ1bkdvbmUgPSBmYWxzZTtcbiAgLy8gU2V0IHdoZW4gdGhpcyBpbnZvY2F0aW9uIHdyb3RlIGFuIGV2ZW50IHRoZSB3b3JrZmxvdyBtdXN0IGNvbnN1bWUgdG9cbiAgLy8gbWFrZSBwcm9ncmVzcyAoYXR0cl9zZXQsIGdldENvbmZsaWN0LWF3YWl0ZWQgaG9va19jcmVhdGVkKSBhbmQgdGhlXG4gIC8vIGxvb3AgaGFzIG5vdCB5ZXQgcmVhZCBpdCBiYWNrIOKAlCBldmVudHVhbGx5LWNvbnNpc3RlbnQgbGlzdGluZ3MgY2FuXG4gIC8vIHJldHVybiAwIG5ldyBldmVudHMgcmlnaHQgYWZ0ZXIgYSB3cml0ZS4gSWYgaXQgaXMgc3RpbGwgc2V0IHdoZW4gdGhlXG4gIC8vIGxvb3AgZXhpdHMgc3VzcGVuZGVkLCB0aGUgZW50cnlwb2ludCByZXF1ZXVlcyBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mXG4gIC8vIGV4aXRpbmcgYXdhaXRpbmdfZXh0ZXJuYWwgd2l0aCB0aGUgdW5ibG9ja2luZyBldmVudCBhbHJlYWR5IHdyaXR0ZW5cbiAgLy8gYW5kIG5vdGhpbmcgc2NoZWR1bGVkIHRvIHJlYWQgaXQuXG4gIGxldCBwZW5kaW5nUmVxdWV1ZVNpZ25hbCA9IGZhbHNlO1xuXG4gIC8qKiBGZXRjaCBhbGwgZXZlbnRzIG5vdCB5ZXQgcHJvY2Vzc2VkIGJ5IHRoZSBsaXZlIFZNIChsb2cgb3JkZXIpLiAqL1xuICBjb25zdCBmZXRjaFVuc2VlbkV2ZW50cyA9IGFzeW5jICgpOiBQcm9taXNlPEV2ZW50W10+ID0+IHtcbiAgICBjb25zdCB1bnNlZW46IEV2ZW50W10gPSBbXTtcbiAgICBsZXQgY3Vyc29yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaGFzTW9yZSA9IHRydWU7XG4gICAgd2hpbGUgKGhhc01vcmUpIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgd29ybGQuZXZlbnRzLmxpc3Qoe1xuICAgICAgICBydW5JZCxcbiAgICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICAgIHNvcnRPcmRlcjogJ2FzYycsXG4gICAgICAgICAgY3Vyc29yOiBjdXJzb3IgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIGxpbWl0OiAxMDAwLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBmb3IgKGNvbnN0IGUgb2YgcmVzcG9uc2UuZGF0YSkge1xuICAgICAgICBpZiAoZS5ldmVudElkICYmIHNlZW5FdmVudElkcy5oYXMoZS5ldmVudElkKSkgY29udGludWU7XG4gICAgICAgIGlmIChlLmV2ZW50SWQpIHNlZW5FdmVudElkcy5hZGQoZS5ldmVudElkKTtcbiAgICAgICAgdW5zZWVuLnB1c2goZSk7XG4gICAgICB9XG4gICAgICBpZiAocmVzcG9uc2UuY3Vyc29yKSBjdXJzb3IgPSByZXNwb25zZS5jdXJzb3I7XG4gICAgICBoYXNNb3JlID0gcmVzcG9uc2UuZGF0YS5sZW5ndGggPiAwICYmIHJlc3BvbnNlLmN1cnNvciAhPSBudWxsO1xuICAgIH1cbiAgICBvYnNlcnZlRXZlbnRzRm9yT3duZXJzaGlwKHVuc2Vlbik7XG4gICAgcmV0dXJuIHVuc2VlbjtcbiAgfTtcblxuICB0cnkge1xuICAgIGxldCBpdGVyYXRpb24gPSAwO1xuICAgIHdoaWxlIChyZXN1bHQuc3VzcGVuZGVkICYmICFydW5Hb25lICYmICFidWRnZXQuaXNFeGhhdXN0ZWQoKSkge1xuICAgICAgaXRlcmF0aW9uKys7XG4gICAgICAvLyBSZS1jaGVjayB0aGUgZXZlbnQgY2VpbGluZyBldmVyeSB0dXJuOiB0aGUgbG9vcCBhcHBlbmRzIGV2ZW50cyBvblxuICAgICAgLy8gZWFjaCBjb250aW51ZVdpdGhFdmVudHMsIHNvIGEgc2luZ2xlIGludm9jYXRpb24gY2FuIG90aGVyd2lzZSBncm93XG4gICAgICAvLyB0aGUgbG9nIGFyYml0cmFyaWx5IGZhciBwYXN0IHRoZSBvcGVyYXRvcidzIGxpbWl0ICh0aGUgbm9kZSBlbmdpbmVcbiAgICAgIC8vIHJlLWNoZWNrcyBwZXIgcmVwbGF5IGZvciB0aGUgc2FtZSByZWFzb24pLiBgc2VlbkV2ZW50SWRzYCBjb3VudHNcbiAgICAgIC8vIGV2ZXJ5IGV2ZW50IHRoaXMgaW52b2NhdGlvbiBoYXMgb2JzZXJ2ZWQg4oCUIGluaXRpYWwgbG9nICsgYWxsXG4gICAgICAvLyBmZWVkcy5cbiAgICAgIGlmIChtYXhFdmVudHNMaW1pdCAhPT0gdW5kZWZpbmVkICYmIHNlZW5FdmVudElkcy5zaXplID49IG1heEV2ZW50c0xpbWl0KSB7XG4gICAgICAgIHRocm93IG5ldyBNYXhFdmVudHNFeGNlZWRlZEVycm9yKHNlZW5FdmVudElkcy5zaXplLCBtYXhFdmVudHNMaW1pdCk7XG4gICAgICB9XG4gICAgICBjb25zdCBwZW5kaW5nT3BlcmF0aW9ucyA9IHJlc3VsdC5zdXNwZW5kZWQucGVuZGluZ09wZXJhdGlvbnM7XG5cbiAgICAgIC8vIFNlbGVjdCB0aGlzIHR1cm4ncyBpbmxpbmUgY2FuZGlkYXRlcyBCRUZPUkUgZGlzcGF0Y2g6IGZyZXNoIHN0ZXBzXG4gICAgICAvLyAobm8gc3RlcF9jcmVhdGVkIHlldCkgdGhhdCB0aGlzIGludm9jYXRpb24gaGFzbid0IGFscmVhZHkgaGFuZGxlZC5cbiAgICAgIC8vIFRoZWlyIHN0ZXBfY3JlYXRlZCBpcyBkZWxpYmVyYXRlbHkgTk9UIHdyaXR0ZW4gYnkgZGlzcGF0Y2gg4oCUIHRoZVxuICAgICAgLy8gaW5saW5lIGNsYWltIGJlbG93IGlzIGEgbGF6eSBzdGVwX3N0YXJ0ZWQgY2FycnlpbmcgdGhlIGlucHV0LFxuICAgICAgLy8gd2hpY2ggdGhlIHdvcmxkIGFwcGxpZXMgYXMgYW4gYXRvbWljIGNyZWF0ZS1jbGFpbS4gQSBjb25jdXJyZW50XG4gICAgICAvLyBpbnZvY2F0aW9uIHJhY2luZyBvbiB0aGUgc2FtZSBmcmVzaCBzdGVwIGxvc2VzIHRoYXQgY2xhaW0gd2l0aFxuICAgICAgLy8gRW50aXR5Q29uZmxpY3RFcnJvciBhbmQgc2tpcHMsIHNvIHN0ZXAgYm9kaWVzIGNhbm5vdCBkb3VibGUtcnVuXG4gICAgICAvLyAocHJldmlvdXNseSBib3RoIGludm9jYXRpb25zIGJhcmUtc3RhcnRlZCB0aGUgc3RlcCBhZnRlciBvbmUgbG9zdFxuICAgICAgLy8gdGhlIHN3YWxsb3dlZCBzdGVwX2NyZWF0ZWQgcmFjZSkuXG4gICAgICBjb25zdCBmcmVzaFN0ZXBzID0gcGVuZGluZ09wZXJhdGlvbnMuZmlsdGVyKFxuICAgICAgICAob3ApOiBvcCBpcyBQZW5kaW5nU3RlcCA9PlxuICAgICAgICAgIG9wLnR5cGUgPT09ICdzdGVwJyAmJlxuICAgICAgICAgICFvcC5oYXNDcmVhdGVkRXZlbnQgJiZcbiAgICAgICAgICAhZXhlY3V0ZWRTdGVwSWRzLmhhcyhvcC5jb3JyZWxhdGlvbklkKSAmJlxuICAgICAgICAgICFxdWV1ZWRTdGVwSWRzLmhhcyhvcC5jb3JyZWxhdGlvbklkKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGlubGluZUNhbmRpZGF0ZXMgPVxuICAgICAgICBtYXhJbmxpbmVTdGVwcyA8PSAwID8gW10gOiBmcmVzaFN0ZXBzLnNsaWNlKDAsIG1heElubGluZVN0ZXBzKTtcbiAgICAgIGNvbnN0IGlubGluZUNsYWltQ2lkcyA9IG5ldyBTZXQoXG4gICAgICAgIGlubGluZUNhbmRpZGF0ZXMubWFwKChzdGVwKSA9PiBzdGVwLmNvcnJlbGF0aW9uSWQpXG4gICAgICApO1xuXG4gICAgICAvLyAxLiBEdXJhYmxlIHNpZGUgZWZmZWN0cyBmb3IgdGhpcyBzdXNwZW5zaW9uJ3MgcGVuZGluZyBvcHMuXG4gICAgICBjb25zdCBvcHNUb0Rpc3BhdGNoID0gcGVuZGluZ09wZXJhdGlvbnMubWFwKChvcCkgPT5cbiAgICAgICAgb3AudHlwZSA9PT0gJ2hvb2snICYmXG4gICAgICAgIChvcCBhcyBQZW5kaW5nSG9vaykuYWJvcnRSZXF1ZXN0ZWQgJiZcbiAgICAgICAgcmVjb3JkZWRBYm9ydElkcy5oYXMob3AuY29ycmVsYXRpb25JZClcbiAgICAgICAgICA/ICh7IC4uLm9wLCBhYm9ydFJlcXVlc3RlZDogZmFsc2UgfSBhcyBQZW5kaW5nT3BlcmF0aW9uKVxuICAgICAgICAgIDogb3BcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IG9wIG9mIHBlbmRpbmdPcGVyYXRpb25zKSB7XG4gICAgICAgIGlmIChvcC50eXBlID09PSAnaG9vaycgJiYgKG9wIGFzIFBlbmRpbmdIb29rKS5hYm9ydFJlcXVlc3RlZCkge1xuICAgICAgICAgIHJlY29yZGVkQWJvcnRJZHMuYWRkKG9wLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBTdGVwcyBiZXlvbmQgdGhlIGlubGluZSBjYXAgYXJlIGhhbmRlZCB0byB0aGUgcXVldWUgaW4gdGhlIHNhbWVcbiAgICAgIC8vIHR1cm4gdGhlaXIgc3RlcF9jcmVhdGVkIGlzIHdyaXR0ZW4uIFdoZXJlIGVsaWdpYmxlLCB0aGUgZGlzcGF0Y2hcbiAgICAgIC8vIGJlbG93IHBhcmFsbGVsaXplcyBlYWNoIG92ZXJmbG93IHN0ZXAncyBzdGVwX2NyZWF0ZWQgd3JpdGUgd2l0aFxuICAgICAgLy8gaXRzIHF1ZXVlIHB1Ymxpc2ggKHJlc2lsaWVudCBzdGVwIGRpc3BhdGNoIOKAlCB0aGUgbWVzc2FnZSBjYXJyaWVzXG4gICAgICAvLyBgc3RlcElucHV0YCBzbyB0aGUgY29uc3VtZXIgY2FuIHJlLWVuc3VyZSB0aGUgZXZlbnQpOyB0aGUgcmVzdFxuICAgICAgLy8gYXJlIHF1ZXVlZCByaWdodCBhZnRlciwgaW4gcGFyYWxsZWwuIFRoaXMgbXVzdCBhbGwgaGFwcGVuIEJFRk9SRVxuICAgICAgLy8gdGhlIGV2ZW50IGZlZWQgYmVsb3c6IHRoZSBmZWVkIGFsd2F5cyBvYnNlcnZlcyB0aG9zZSB2ZXJ5XG4gICAgICAvLyBzdGVwX2NyZWF0ZWQgd3JpdGVzIGFzIHVuc2VlbiBldmVudHMgYW5kIGBjb250aW51ZWBzLCBzbyBhXG4gICAgICAvLyBoYW5kb2ZmIHBsYWNlZCBhZnRlciBpdCBpcyB1bnJlYWNoYWJsZSBvbiB0aGUgb25seSBpdGVyYXRpb25cbiAgICAgIC8vIHRoYXQgc3RpbGwgY2xhc3NpZmllcyB0aGVzZSBzdGVwcyBhcyBmcmVzaCDigJQgbmV4dCB0dXJuIHRoZXkgY2FycnlcbiAgICAgIC8vIGhhc0NyZWF0ZWRFdmVudCBhbmQgd291bGQgbmV2ZXIgYmUgcXVldWVkIGF0IGFsbCAodGhlIHdlZGdlIGJlaGluZFxuICAgICAgLy8gcHJvbWlzZVJhY2VTdHJlc3NUZXN0V29ya2Zsb3cgaGFuZ2luZyBpbiB0aGUgcXVpY2tqcyBDSSBsZWdzKS4gVGhlXG4gICAgICAvLyBzdGVwLWlkZW50aXR5LXNjb3BlZCBpZGVtcG90ZW5jeSBrZXkgbWFrZXMgcmVwZWF0cyBoYXJtbGVzcy5cbiAgICAgIGNvbnN0IG92ZXJmbG93U3RlcHMgPSBmcmVzaFN0ZXBzLnNsaWNlKGlubGluZUNhbmRpZGF0ZXMubGVuZ3RoKTtcbiAgICAgIGNvbnN0IGRpc3BhdGNoZWQgPSBhd2FpdCBkaXNwYXRjaFBlbmRpbmdPcHMoe1xuICAgICAgICB3b3JsZCxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIG5leHRUcmFjZUNhcnJpZXIsXG4gICAgICAgIHBlbmRpbmdPcGVyYXRpb25zOiBvcHNUb0Rpc3BhdGNoLFxuICAgICAgICBza2lwU3RlcENyZWF0aW9uOiBpbmxpbmVDbGFpbUNpZHMsXG4gICAgICAgIHF1ZXVlU3RlcENpZHM6IG5ldyBTZXQob3ZlcmZsb3dTdGVwcy5tYXAoKHMpID0+IHMuY29ycmVsYXRpb25JZCkpLFxuICAgICAgICB3ZmRpYWcsXG4gICAgICB9KTtcbiAgICAgIGlmIChcbiAgICAgICAgZGlzcGF0Y2hlZC5jcmVhdGVkQXR0cmlidXRlRXZlbnQgfHxcbiAgICAgICAgZGlzcGF0Y2hlZC5jcmVhdGVkR2V0Q29uZmxpY3RIb29rXG4gICAgICApIHtcbiAgICAgICAgcGVuZGluZ1JlcXVldWVTaWduYWwgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGNpZCBvZiBkaXNwYXRjaGVkLnF1ZXVlZFN0ZXBDaWRzKSB7XG4gICAgICAgIHF1ZXVlZFN0ZXBJZHMuYWRkKGNpZCk7XG4gICAgICB9XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgb3ZlcmZsb3dTdGVwc1xuICAgICAgICAgIC5maWx0ZXIoKHN0ZXApID0+ICFkaXNwYXRjaGVkLnF1ZXVlZFN0ZXBDaWRzLmhhcyhzdGVwLmNvcnJlbGF0aW9uSWQpKVxuICAgICAgICAgIC5tYXAoKHN0ZXApID0+IHtcbiAgICAgICAgICAgIHF1ZXVlZFN0ZXBJZHMuYWRkKHN0ZXAuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgICByZXR1cm4gcXVldWVTdGVwTWVzc2FnZSh7XG4gICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICAgICAgICAgICAgcHVycG9zZTogJ2Rpc3BhdGNoJyxcbiAgICAgICAgICAgICAgd2ZkaWFnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIC8vIENvbXBsZXRlIGVsYXBzZWQgd2FpdHMgc28gdGhlaXIgd2FpdF9jb21wbGV0ZWQgZXZlbnRzIGFyZSBwaWNrZWRcbiAgICAgIC8vIHVwIGJ5IHRoZSBmZWVkIGJlbG93IChpbnN0ZWFkIG9mIGEgcXVldWUgcmUtaW52b2NhdGlvbikuXG4gICAgICBjb25zdCB3YWl0Q29tcGxldGVQcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgICBmb3IgKGNvbnN0IG9wIG9mIHBlbmRpbmdPcGVyYXRpb25zKSB7XG4gICAgICAgIGlmIChvcC50eXBlICE9PSAnd2FpdCcpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCB3YWl0ID0gb3AgYXMgUGVuZGluZ1dhaXQ7XG4gICAgICAgIGlmIChjb21wbGV0ZWRXYWl0SWRzMi5oYXMod2FpdC5jb3JyZWxhdGlvbklkKSkgY29udGludWU7XG4gICAgICAgIGlmIChuZXcgRGF0ZSh3YWl0LnJlc3VtZUF0KS5nZXRUaW1lKCkgLSBEYXRlLm5vdygpID4gMCkgY29udGludWU7XG4gICAgICAgIGNvbXBsZXRlZFdhaXRJZHMyLmFkZCh3YWl0LmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICB3YWl0Q29tcGxldGVQcm9taXNlcy5wdXNoKFxuICAgICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnd2FpdF9jb21wbGV0ZWQnLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiB3YWl0LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHJldHVybjtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh3YWl0Q29tcGxldGVQcm9taXNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHdhaXRDb21wbGV0ZVByb21pc2VzKTtcbiAgICAgIH1cblxuICAgICAgLy8gMi4gQ2hlYXAgcHJvZ3Jlc3MgZmlyc3Q6IGZlZWQgbmV3bHkgcmVjb3JkZWQgZXZlbnRzIGludG8gdGhlIGxpdmVcbiAgICAgIC8vIFZNIGJlZm9yZSBibG9ja2luZyBvbiBzdGVwIGJvZGllcy5cbiAgICAgIHtcbiAgICAgICAgY29uc3QgbmV3RXZlbnRzID0gYXdhaXQgZmV0Y2hVbnNlZW5FdmVudHMoKTtcbiAgICAgICAgaWYgKG5ld0V2ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgLy8gVGhlIGxpc3RpbmcgY2F1Z2h0IHVwIHdpdGggdGhpcyBpbnZvY2F0aW9uJ3Mgd3JpdGVzIOKAlCBhbnlcbiAgICAgICAgICAvLyBhdHRyX3NldCAvIGdldENvbmZsaWN0IGhvb2tfY3JlYXRlZCBoYXMgYmVlbiAob3IgaXMgYmVpbmcpXG4gICAgICAgICAgLy8gY29uc3VtZWQgYnkgdGhlIGxpdmUgVk0sIHNvIG5vIGV4dGVybmFsIHJlcXVldWUgaXMgbmVlZGVkLlxuICAgICAgICAgIHBlbmRpbmdSZXF1ZXVlU2lnbmFsID0gZmFsc2U7XG4gICAgICAgICAgcmVzdWx0ID0gYXdhaXQgc2Vzc2lvbi5jb250aW51ZVdpdGhFdmVudHMobmV3RXZlbnRzKTtcbiAgICAgICAgICB3ZmRpYWcoJ2lubGluZV9pdGVyYXRpb24nLCB7XG4gICAgICAgICAgICBpdGVyYXRpb24sXG4gICAgICAgICAgICBwaGFzZTogJ2ZlZWQnLFxuICAgICAgICAgICAgZmVkRXZlbnRzOiBuZXdFdmVudHMubGVuZ3RoLFxuICAgICAgICAgICAgb3V0Y29tZTogcmVzdWx0LmNvbXBsZXRlZFxuICAgICAgICAgICAgICA/ICdjb21wbGV0ZWQnXG4gICAgICAgICAgICAgIDogcmVzdWx0LmZhaWxlZFxuICAgICAgICAgICAgICAgID8gJ2ZhaWxlZCdcbiAgICAgICAgICAgICAgICA6ICdzdXNwZW5kZWQnLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIDMuIE5vIGNoZWFwIHByb2dyZXNzIGxlZnQg4oCUIGV4ZWN1dGUgc3RlcHMgaW5saW5lLlxuICAgICAgY29uc3Qgc3RlcE9wcyA9IHBlbmRpbmdPcGVyYXRpb25zLmZpbHRlcihcbiAgICAgICAgKG9wKTogb3AgaXMgUGVuZGluZ1N0ZXAgPT4gb3AudHlwZSA9PT0gJ3N0ZXAnXG4gICAgICApO1xuICAgICAgLy8gU3RlcHMgY3JlYXRlZCBieSBhbiBFQVJMSUVSIGludm9jYXRpb24gKG9yIGFuIGVhcmxpZXIgdHVybikgdGhhdFxuICAgICAgLy8gYXJlIHN0aWxsIHBlbmRpbmcsIHdpdGggbm8gd29yayBvd25lZCBieSBUSElTIGludm9jYXRpb24uIE1pcnJvclxuICAgICAgLy8gdGhlIG5vZGUgZW5naW5lJ3Mgb3duZXJzaGlwIGRlY2lzaW9uIHRhYmxlIChzdGVwLW93bmVyc2hpcC50cykg4oCUXG4gICAgICAvLyBOT1QgYSBkZWxpdmVyeUF0dGVtcHQgZ2F0ZTogd29ybGRzIGFkdmFuY2UgdGhlIGF0dGVtcHQgY291bnRlciBvblxuICAgICAgLy8gcm91dGluZSByZWRlbGl2ZXJpZXMgKHdvcmxkLWxvY2FsIGNvdW50cyBldmVyeSBoYW5kbGVkIHJlc3BvbnNlKSxcbiAgICAgIC8vIHNvIGF0dGVtcHQgPiAxIGlzIHRoZSBjb21tb24gY2FzZSBhbmQgd291bGQgZmlyZSBiYWNrc3RvcHMgYXRcbiAgICAgIC8vIHN0ZXBzIGFjdGl2ZWx5IGV4ZWN1dGluZyBpbmxpbmUgaW4gYSBsaXZlIGludm9jYXRpb24uXG4gICAgICAvL1xuICAgICAgLy8gICAtIE93bmVyc2hpcCBsZWFzZSBBQ1RJVkUsIGhlbGQgYnkgQU5PVEhFUiBtZXNzYWdlIOKGkiB0aGUgc3RlcCBpc1xuICAgICAgLy8gICAgIChwcmVzdW1hYmx5KSBleGVjdXRpbmcgaW5saW5lIGluIGEgbGl2ZSBpbnZvY2F0aW9uLiBBcm0gYVxuICAgICAgLy8gICAgIERFTEFZRUQgYmFja3N0b3AgZm9yIHRoZSBsZWFzZSByZW1haW5kZXIsIGtleWVkIHRvIHRoZVxuICAgICAgLy8gICAgIG93bmVyc2hpcCBlcG9jaCAoYSByZWZyZXNoZWQgbGVhc2UgcmUtYXJtcyBhIGZyZXNoIGJhY2tzdG9wXG4gICAgICAvLyAgICAgaW5zdGVhZCBvZiBkZWR1cGluZyBhZ2FpbnN0IHRoZSBpbi1mbGlnaHQgb25lKS4gSWYgdGhlIG93bmVyXG4gICAgICAvLyAgICAgY29tcGxldGVzIG5vcm1hbGx5LCB0aGUgYmFja3N0b3AgZGVsaXZlcnkgcmVzb2x2ZXMgdGhlIHN0ZXBcbiAgICAgIC8vICAgICBhcyAnc2tpcHBlZCcuXG4gICAgICAvLyAgIC0gT3duZXJzaGlwIGxlYXNlIEFDVElWRSwgaGVsZCBieSBUSElTIG1lc3NhZ2Ug4oaSIHRoaXMgZGVsaXZlcnlcbiAgICAgIC8vICAgICBpcyB0aGUgb3duZXIncyByZWRlbGl2ZXJ5OyB0aGUgY2xhaW1hbnQgY3Jhc2hlZFxuICAgICAgLy8gICAgIG1pZC1leGVjdXRpb24uIERpc3BhdGNoIGltbWVkaWF0ZWx5IGZvciBiYWNrZ3JvdW5kIHJlY292ZXJ5LlxuICAgICAgLy8gICAtIE5vIHN0YW1wIC8gbGVhc2UgRVhQSVJFRCAvIHN0ZXBfcmV0cnlpbmcgb2JzZXJ2ZWQg4oaSIHRoZSBzdGVwXG4gICAgICAvLyAgICAgaXMgcXVldWUtb3duZWQgb3Igb3JwaGFuZWQuIERpc3BhdGNoIGltbWVkaWF0ZWx5OyB0aGVcbiAgICAgIC8vICAgICBzdGVwLWlkZW50aXR5LXNjb3BlZCBpZGVtcG90ZW5jeSBrZXkgZGVkdXBlcyBhZ2FpbnN0IHRoZVxuICAgICAgLy8gICAgIG9yaWdpbmFsIGhhbmRvZmYuXG4gICAgICBjb25zdCBub3dNcyA9IERhdGUubm93KCk7XG4gICAgICBmb3IgKGNvbnN0IHN0ZXAgb2Ygc3RlcE9wcykge1xuICAgICAgICBpZiAoIXN0ZXAuaGFzQ3JlYXRlZEV2ZW50KSBjb250aW51ZTtcbiAgICAgICAgaWYgKGV4ZWN1dGVkU3RlcElkcy5oYXMoc3RlcC5jb3JyZWxhdGlvbklkKSkgY29udGludWU7XG4gICAgICAgIGlmIChxdWV1ZWRTdGVwSWRzLmhhcyhzdGVwLmNvcnJlbGF0aW9uSWQpKSBjb250aW51ZTtcbiAgICAgICAgY29uc3Qgb3duZXJzaGlwID0gc3RlcE93bmVyc2hpcC5nZXQoc3RlcC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgY29uc3Qgb3duZXJzaGlwQWN0aXZlID1cbiAgICAgICAgICBvd25lcnNoaXAgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgIG93bmVyc2hpcC5vd25lciAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgIW93bmVyc2hpcC5zYXdSZXRyeWluZztcbiAgICAgICAgbGV0IGxlYXNlUmVtYWluaW5nU2Vjb25kcyA9IDA7XG4gICAgICAgIGlmIChvd25lcnNoaXBBY3RpdmUgJiYgb3duZXJzaGlwLnN0YXJ0ZWRBdE1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCBsZWFzZVNlY29uZHMgPSBnZXRJbmxpbmVPd25lcnNoaXBMZWFzZVNlY29uZHMoKTtcbiAgICAgICAgICBsZWFzZVJlbWFpbmluZ1NlY29uZHMgPSBNYXRoLm1pbihcbiAgICAgICAgICAgIGxlYXNlU2Vjb25kcyxcbiAgICAgICAgICAgIE1hdGgubWF4KFxuICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICBNYXRoLmNlaWwoXG4gICAgICAgICAgICAgICAgKG93bmVyc2hpcC5zdGFydGVkQXRNcyArIGxlYXNlU2Vjb25kcyAqIDEwMDAgLSBub3dNcykgLyAxMDAwXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBvd25lcnNoaXBBY3RpdmUgJiZcbiAgICAgICAgICBvd25lcnNoaXAub3duZXIgIT09IG93bmVyTWVzc2FnZUlkICYmXG4gICAgICAgICAgbGVhc2VSZW1haW5pbmdTZWNvbmRzID4gMFxuICAgICAgICApIHtcbiAgICAgICAgICBxdWV1ZWRTdGVwSWRzLmFkZChzdGVwLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgIGF3YWl0IHF1ZXVlU3RlcE1lc3NhZ2Uoe1xuICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgIGRlbGF5U2Vjb25kczogbGVhc2VSZW1haW5pbmdTZWNvbmRzLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICAgICAgICAgIHB1cnBvc2U6IGBiYWNrc3RvcDoke293bmVyc2hpcC5zdGFydGVkQXRNc31gLFxuICAgICAgICAgICAgd2ZkaWFnLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHF1ZXVlZFN0ZXBJZHMuYWRkKHN0ZXAuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgYXdhaXQgcXVldWVTdGVwTWVzc2FnZSh7XG4gICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICAgICAgICAgIHB1cnBvc2U6ICdkaXNwYXRjaCcsXG4gICAgICAgICAgICB3ZmRpYWcsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlubGluZUNhbmRpZGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIE5vIGluLXByb2Nlc3MgcHJvZ3Jlc3MgcG9zc2libGUg4oCUIHRoZSBydW4gYXdhaXRzIGFuIGV4dGVybmFsXG4gICAgICAgIC8vIHN0aW11bHVzIChob29rIHBheWxvYWQsIHF1ZXVlZCBzdGVwLCB3YWl0IHRpbWVyKS5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8vIFJhY2luZyB0aW1lcnMgbXVzdCBmaXJlIG9uIHRpbWUgd2hpbGUgc3RlcCBib2RpZXMgYmxvY2sgdGhpc1xuICAgICAgLy8gaW52b2NhdGlvbjogZW5xdWV1ZSBhIGRlbGF5ZWQgY29udGludWF0aW9uIGZvciB0aGUgc29vbmVzdFxuICAgICAgLy8gcGVuZGluZyB3YWl0IChhIHNlcGFyYXRlIGludm9jYXRpb24gd3JpdGVzIGl0cyB3YWl0X2NvbXBsZXRlZCBhdFxuICAgICAgLy8gdGhlIHJpZ2h0IGxvZyBwb3NpdGlvbiDigJQgc2FtZSBtZWNoYW5pc20gYXMgdGhlIG5vZGU6dm0gZW5naW5lJ3NcbiAgICAgIC8vIHdhaXQtY29udGludWF0aW9uIGRpc3BhdGNoKS5cbiAgICAgIGxldCBzb29uZXN0V2FpdDogeyBjb3JyZWxhdGlvbklkOiBzdHJpbmc7IHNlY29uZHM6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgZm9yIChjb25zdCBvcCBvZiBwZW5kaW5nT3BlcmF0aW9ucykge1xuICAgICAgICBpZiAob3AudHlwZSAhPT0gJ3dhaXQnKSBjb250aW51ZTtcbiAgICAgICAgY29uc3Qgd2FpdCA9IG9wIGFzIFBlbmRpbmdXYWl0O1xuICAgICAgICBpZiAoc2NoZWR1bGVkV2FpdENvbnRpbnVhdGlvbnMuaGFzKHdhaXQuY29ycmVsYXRpb25JZCkpIGNvbnRpbnVlO1xuICAgICAgICAvLyBXYWl0cyB3aG9zZSB3YWl0X2NvbXBsZXRlZCBUSElTIGludm9jYXRpb24gYWxyZWFkeSB3cm90ZSAodGhlXG4gICAgICAgIC8vIGVsYXBzZWQtd2FpdCBwYXNzIGFib3ZlKSBhcmUgZG9uZSDigJQgdGhlIGV2ZW50IGp1c3QgaGFzbid0IGZlZFxuICAgICAgICAvLyBiYWNrIGludG8gdGhlIFZNIHlldC4gTm8gY29udGludWF0aW9uIG5lZWRlZC5cbiAgICAgICAgaWYgKGNvbXBsZXRlZFdhaXRJZHMyLmhhcyh3YWl0LmNvcnJlbGF0aW9uSWQpKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgcmVzdW1lTXMgPSBuZXcgRGF0ZSh3YWl0LnJlc3VtZUF0KS5nZXRUaW1lKCkgLSBEYXRlLm5vdygpO1xuICAgICAgICAvLyBBbiBhbHJlYWR5LWVsYXBzZWQgd2FpdCBNVVNUIHN0aWxsIGdldCBhIGNvbnRpbnVhdGlvbiAoY2xhbXBlZFxuICAgICAgICAvLyB0byB0aGUgMXMgbWluaW11bSwgZXhhY3RseSBsaWtlIHRoZSBub2RlIGVuZ2luZSdzXG4gICAgICAgIC8vIGBNYXRoLm1heCgxMDAwLCByZXN1bWVBdE1zIC0gbm93KWApLCBub3QgYmUgc2tpcHBlZDogYSB3YWl0XG4gICAgICAgIC8vIHdob3NlIGRlYWRsaW5lIGZhbGxzIGJldHdlZW4gdGhpcyBpdGVyYXRpb24ncyBlbGFwc2VkLXdhaXRcbiAgICAgICAgLy8gcGFzcyAod2hpY2ggc2F3IGl0IGFzIHN0aWxsIHBlbmRpbmcgYW5kIHdyb3RlIG5vdGhpbmcpIGFuZFxuICAgICAgICAvLyB0aGlzIHN3ZWVwIHdvdWxkIG90aGVyd2lzZSBnZXQgTkVJVEhFUiBhIHdhaXRfY29tcGxldGVkIE5PUiBhXG4gICAgICAgIC8vIGNvbnRpbnVhdGlvbiDigJQgYW5kIHRoZSBpbmxpbmUgYmF0Y2ggYmVsb3cgdGhlbiBibG9ja3MgdGhpc1xuICAgICAgICAvLyBpbnZvY2F0aW9uIGZvciB0aGUgZnVsbCBzdGVwIGR1cmF0aW9uIHdpdGggbm8gd2FrZSBhcm1lZFxuICAgICAgICAvLyBhbnl3aGVyZS4gRm9yIGBQcm9taXNlLnJhY2Uoc3RlcCwgc2xlZXApYCB0aGF0IHNpbGVudGx5IGhhbmRzXG4gICAgICAgIC8vIHRoZSByYWNlIHRvIHRoZSBzdGVwOiB0aGUgc2xlZXAncyB3YWl0X2NvbXBsZXRlZCBpcyBuZXZlclxuICAgICAgICAvLyB3cml0dGVuIGFuZCB0aGUgcnVuIGNvbXBsZXRlcyB3aXRoIHRoZSB3cm9uZyB3aW5uZXIuIFRoZVxuICAgICAgICAvLyB3aW5kb3cgYmV0d2VlbiB0aGUgdHdvIGNoZWNrcyBzcGFucyB0aGlzIGl0ZXJhdGlvbidzIGRpc3BhdGNoXG4gICAgICAgIC8vICsgZmVlZCByb3VuZC10cmlwcywgc28gb24gbmV0d29yay1iYWNrZWQgd29ybGRzICh3b3JsZC12ZXJjZWwpXG4gICAgICAgIC8vIGEgc2hvcnQgc2xlZXAgbGFuZHMgaW4gaXQgcm91dGluZWx5IOKAlCBvYnNlcnZlZCBhcyBhIH41MCVcbiAgICAgICAgLy8gc2xlZXBXaW5zUmFjZVdvcmtmbG93IGZhaWx1cmUgcmF0ZSBpbiB0aGUgVmVyY2VsIGUyZSBsZWdzLFxuICAgICAgICAvLyB3aGlsZSB3b3JsZC1sb2NhbCdzIHN1Yi1tcyByb3VuZC10cmlwcyBtYXNrZWQgaXQgbG9jYWxseS4gVGhlXG4gICAgICAgIC8vIGNvbnRpbnVhdGlvbiBpbnZvY2F0aW9uJ3MgcHJlLVZNIGVsYXBzZWQgY2hlY2sgd3JpdGVzIHRoZVxuICAgICAgICAvLyB3YWl0X2NvbXBsZXRlZCB+MXMgbGF0ZXIuXG4gICAgICAgIGNvbnN0IHNlY29uZHMgPSBNYXRoLm1heCgxLCBNYXRoLmNlaWwocmVzdW1lTXMgLyAxMDAwKSk7XG4gICAgICAgIGlmICghc29vbmVzdFdhaXQgfHwgc2Vjb25kcyA8IHNvb25lc3RXYWl0LnNlY29uZHMpIHtcbiAgICAgICAgICBzb29uZXN0V2FpdCA9IHsgY29ycmVsYXRpb25JZDogd2FpdC5jb3JyZWxhdGlvbklkLCBzZWNvbmRzIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzb29uZXN0V2FpdCkge1xuICAgICAgICBzY2hlZHVsZWRXYWl0Q29udGludWF0aW9ucy5hZGQoc29vbmVzdFdhaXQuY29ycmVsYXRpb25JZCk7XG4gICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd1J1bi53b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAge1xuICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZ2V0V2FpdENvbnRpbnVhdGlvbkRpc3BhdGNoKFxuICAgICAgICAgICAgc29vbmVzdFdhaXQuc2Vjb25kcyxcbiAgICAgICAgICAgIHNvb25lc3RXYWl0LmNvcnJlbGF0aW9uSWRcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIHdmZGlhZygnd2FpdF9jb250aW51YXRpb25fc2NoZWR1bGVkJywge1xuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHNvb25lc3RXYWl0LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgZGVsYXlTZWNvbmRzOiBzb29uZXN0V2FpdC5zZWNvbmRzLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gRXhlY3V0ZSB0aGUgaW5saW5lIGJhdGNoIGluIHBhcmFsbGVsLiBUaGUgcmVwbGF5IGJ1ZGdldCBpc1xuICAgICAgLy8gcGF1c2VkIHdoaWxlIHN0ZXAgYm9kaWVzIHJ1biDigJQgc3RlcCBkdXJhdGlvbiBpcyBib3VuZGVkIGJ5IHRoZVxuICAgICAgLy8gcGxhdGZvcm0gZnVuY3Rpb24gZHVyYXRpb24sIG5vdCB0aGUgcmVwbGF5IHRpbWVvdXQuIE5PVEUgKGJ5XG4gICAgICAvLyBkZXNpZ24pOiB3aXRoIHRoZSBidWRnZXQgcGFya2VkIHBlciBiYXRjaCwgdGhlIG9ubHkgYm91bmQgb24gaG93XG4gICAgICAvLyBtYW55IGlubGluZSBzdGVwcyBvbmUgaW52b2NhdGlvbiBjYW4gY2hhaW4gaXMgdGhlIHBsYXRmb3JtJ3NcbiAgICAgIC8vIGZ1bmN0aW9uIHRpbWVvdXQg4oCUIHRoZSBTREsgZGVsaWJlcmF0ZWx5IGltcG9zZXMgbm8gY2FwIG9mIGl0c1xuICAgICAgLy8gb3duLCBtYXRjaGluZyB0aGUgbm9kZTp2bSBlbmdpbmUsIHdoZXJlIGEgbG9uZyBzZXF1ZW50aWFsXG4gICAgICAvLyB3b3JrZmxvdyBsaWtld2lzZSBydW5zIHN0ZXAtYnktc3RlcCB1bnRpbCB0aGUgcGxhdGZvcm0gcmVjbGFpbXNcbiAgICAgIC8vIHRoZSBpbnZvY2F0aW9uIGFuZCBhIHJlZGVsaXZlcnkgcmVzdW1lcyBmcm9tIHRoZSBsb2cuXG4gICAgICBidWRnZXQucGF1c2UoKTtcbiAgICAgIGxldCBvdXRjb21lczogU3RlcEV4ZWN1dGlvblJlc3VsdFtdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgb3V0Y29tZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBpbmxpbmVDYW5kaWRhdGVzLm1hcCgoc3RlcCkgPT5cbiAgICAgICAgICAgIHJ1blN0ZXBTaW5nbGVGbGlnaHQocnVuSWQsIHN0ZXAuY29ycmVsYXRpb25JZCwgKCkgPT5cbiAgICAgICAgICAgICAgKGFzeW5jICgpID0+XG4gICAgICAgICAgICAgICAgZXhlY3V0ZVN0ZXAoe1xuICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93RGVwbG95bWVudElkOiB3b3JrZmxvd1J1bi5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IHdvcmtmbG93UnVuLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0LFxuICAgICAgICAgICAgICAgICAgcm9vdFJ1bklkLFxuICAgICAgICAgICAgICAgICAgc3RlcElkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICBzdGVwTmFtZTogc3RlcC5zdGVwSWQsXG4gICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgICAgICAgICAgcnVuU3BlY1ZlcnNpb246IHdvcmtmbG93UnVuLnNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgLy8gTGF6eSBpbmxpbmUgY2xhaW06IHN0ZXBfY3JlYXRlZCBpcyBkZWZlcnJlZCAoZGlzcGF0Y2hcbiAgICAgICAgICAgICAgICAgIC8vIHNraXBwZWQgaXQpIGFuZCB0aGlzIHN0ZXBfc3RhcnRlZCBjYXJyaWVzIHRoZSBpbnB1dCxcbiAgICAgICAgICAgICAgICAgIC8vIHNvIHRoZSB3b3JsZCBjcmVhdGVzIHRoZSBzdGVwIGF0b21pY2FsbHkg4oCUXG4gICAgICAgICAgICAgICAgICAvLyBleGFjdGx5LW9uZS1vd25lci4gQSBjb25jdXJyZW50IGNsYWltYW50IGdldHNcbiAgICAgICAgICAgICAgICAgIC8vIEVudGl0eUNvbmZsaWN0RXJyb3Ig4oaSIHsgdHlwZTogJ3NraXBwZWQnIH0gYW5kIG5ldmVyXG4gICAgICAgICAgICAgICAgICAvLyBydW5zIHRoZSBib2R5LiBNaXJyb3JzIHRoZSBub2RlIGVuZ2luZSdzIGlubGluZSBwYXRoLlxuICAgICAgICAgICAgICAgICAgbGF6eVN0ZXBJbnB1dDogYXdhaXQgZW5jcnlwdFNlcmlhbGl6ZWREYXRhKFxuICAgICAgICAgICAgICAgICAgICBzdGVwLmlucHV0LFxuICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5XG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgLy8gT3duZXJzaGlwIHN0YW1wOiB3YWtlIHJlcGxheXMgc2VlIHRoZSBib2R5IGFzIGluXG4gICAgICAgICAgICAgICAgICAvLyBmbGlnaHQgaW4gdGhpcyBpbnZvY2F0aW9uIGFuZCBhcm0gYSBkZWxheWVkIGJhY2tzdG9wXG4gICAgICAgICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIGltbWVkaWF0ZWx5IHJlcXVldWVpbmcgdGhlIHN0ZXAuXG4gICAgICAgICAgICAgICAgICBvd25lck1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgICAgIC8vIEEgbGF6eSBzdGVwIGlzIGJyYW5kLW5ldyBieSBjb25zdHJ1Y3Rpb24g4oCUIGZpcnN0XG4gICAgICAgICAgICAgICAgICAvLyBhdHRlbXB0LlxuICAgICAgICAgICAgICAgICAgYXV0aG9yaXRhdGl2ZUF0dGVtcHQ6IDEsXG4gICAgICAgICAgICAgICAgfSkpKClcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBidWRnZXQucmVzdW1lKCk7XG4gICAgICB9XG4gICAgICBpbmxpbmVTdGVwc0V4ZWN1dGVkICs9IGlubGluZUNhbmRpZGF0ZXMubGVuZ3RoO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlubGluZUNhbmRpZGF0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgc3RlcCA9IGlubGluZUNhbmRpZGF0ZXNbaV07XG4gICAgICAgIGNvbnN0IG91dGNvbWUgPSBvdXRjb21lc1tpXTtcbiAgICAgICAgZXhlY3V0ZWRTdGVwSWRzLmFkZChzdGVwLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICBpZiAob3V0Y29tZS50eXBlID09PSAncmV0cnknIHx8IG91dGNvbWUudHlwZSA9PT0gJ3Rocm90dGxlZCcpIHtcbiAgICAgICAgICAvLyBIYW5kIHRoZSBzdGVwIHRvIHRoZSBxdWV1ZSB3aXRoIHRoZSByZXF1ZXN0ZWQgYmFja29mZiDigJRcbiAgICAgICAgICAvLyBiYWNrZ3JvdW5kIGRlbGl2ZXJ5IGRyaXZlcyB0aGUgcmV0cnkgZnJvbSBoZXJlLlxuICAgICAgICAgIHF1ZXVlZFN0ZXBJZHMuYWRkKHN0ZXAuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgYXdhaXQgcXVldWVTdGVwTWVzc2FnZSh7XG4gICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgZGVsYXlTZWNvbmRzOiBvdXRjb21lLnRpbWVvdXRTZWNvbmRzLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICAgICAgICAgIC8vIFN1ZmZpeGVkIGtleTogdGhpcyBzdGVwIHdhcyBpbmxpbmUtY2xhaW1lZCwgc28gbm8gZGlzcGF0Y2hcbiAgICAgICAgICAgIC8vIHB1Ymxpc2ggZXhpc3RzIHVuZGVyIHRoZSBkaXNwYXRjaCBrZXkg4oCUIGJ1dCBzdWZmaXhpbmdcbiAgICAgICAgICAgIC8vIGtlZXBzIHRoZSByZXRyeSBlbnF1ZXVlYWJsZSBldmVuIGlmIGEgd29ybGQgcmV0aXJlZCBhXG4gICAgICAgICAgICAvLyBoaXN0b3JpY2FsIGtleSBmb3IgdGhpcyBzdGVwIChzZWUgdGhlIHB1cnBvc2UgZG9jcyBhYm92ZSkuXG4gICAgICAgICAgICBwdXJwb3NlOiAncmV0cnk6MScsXG4gICAgICAgICAgICB3ZmRpYWcsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAob3V0Y29tZS50eXBlID09PSAnZ29uZScpIHtcbiAgICAgICAgICBydW5Hb25lID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyAnc2tpcHBlZCc6IGEgY29uY3VycmVudCBpbnZvY2F0aW9uIHdvbiB0aGUgbGF6eSBjcmVhdGUtY2xhaW0gYW5kXG4gICAgICAgIC8vIG93bnMgdGhlIGJvZHkuIE1hcmtlZCBleGVjdXRlZCBhYm92ZSBzbyB0aGlzIGludm9jYXRpb24gbmV2ZXJcbiAgICAgICAgLy8gcmUtY2xhaW1zIGl0OyB0aGUgd2lubmVyJ3MgdGVybWluYWwgZXZlbnRzIGFycml2ZSB2aWEgdGhlIGZlZWRcbiAgICAgICAgLy8gKG9yIGRyaXZlIGEgc2VwYXJhdGUgaW52b2NhdGlvbikuXG4gICAgICB9XG4gICAgICB3ZmRpYWcoJ2lubGluZV9zdGVwc19leGVjdXRlZCcsIHtcbiAgICAgICAgaXRlcmF0aW9uLFxuICAgICAgICBjb3VudDogaW5saW5lQ2FuZGlkYXRlcy5sZW5ndGgsXG4gICAgICAgIG91dGNvbWVzOiBvdXRjb21lcy5tYXAoKG8pID0+IG8udHlwZSksXG4gICAgICB9KTtcblxuICAgICAgLy8gRmVlZCB0aGUgaW5saW5lIGJhdGNoJ3MgdGVybWluYWwgZXZlbnRzIGludG8gdGhlIGxpdmUgVk0uIFdoZW5cbiAgICAgIC8vIHRoZSBldmVudHVhbGx5LWNvbnNpc3RlbnQgbGlzdGluZyBoYXMgbm90IHN1cmZhY2VkIHRoZW0geWV0LFxuICAgICAgLy8gZXhpdGluZyBtdXN0IE5PVCBhY2sgc2lsZW50bHk6IHRoZSB0ZXJtaW5hbHMgdGhpcyBpbnZvY2F0aW9uIGp1c3RcbiAgICAgIC8vIGNhdXNlZCBhcmUgZHVyYWJseSB3cml0dGVuIHdpdGggbm8gcXVldWUgbWVzc2FnZSBsZWZ0IHRvIGNvbnN1bWVcbiAgICAgIC8vIHRoZW0gKGlubGluZSBzdGVwcyBoYXZlIG5vbmUpLCBzbyBhbiBhd2FpdGluZ19leHRlcm5hbCBleGl0IHdvdWxkXG4gICAgICAvLyBwYXJrIHRoZSBydW4gJ3J1bm5pbmcnIHdpdGggYWxsIGl0cyBzdGVwcyBjb21wbGV0ZS4gUmFpc2UgdGhlXG4gICAgICAvLyByZXF1ZXVlIHNpZ25hbCBzbyB0aGUgc3VzcGVuZGVkIGV4aXQgc2NoZWR1bGVzIGEgZnJlc2ggaW1tZWRpYXRlXG4gICAgICAvLyBpbnZvY2F0aW9uIHdob3NlIGZyZXNoIHJlYWQgcGlja3MgdGhlIHRlcm1pbmFscyB1cC4gT3V0Y29tZXMgdGhhdFxuICAgICAgLy8gd3JvdGUgbm8gdGVybWluYWwgKCdza2lwcGVkJyDigJQgYSBjb25jdXJyZW50IGNsYWltYW50IG93bnMgdGhlXG4gICAgICAvLyBib2R5OyAnZ29uZScsIHJldHJ5L3Rocm90dGxlZCDigJQgYSBxdWV1ZSBtZXNzYWdlIGV4aXN0cykgZG9uJ3RcbiAgICAgIC8vIG5lZWQgaXQsIGJ1dCBzaWduYWxpbmcgb24gdGhlbSB0b28gb25seSBjb3N0cyBhIG5vLW9wIGludm9jYXRpb25cbiAgICAgIC8vIGluIGFuIGFscmVhZHktcmFyZSBsYWcgd2luZG93LlxuICAgICAgY29uc3QgbmV3RXZlbnRzID0gYXdhaXQgZmV0Y2hVbnNlZW5FdmVudHMoKTtcbiAgICAgIGlmIChuZXdFdmVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHBlbmRpbmdSZXF1ZXVlU2lnbmFsID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICByZXN1bHQgPSBhd2FpdCBzZXNzaW9uLmNvbnRpbnVlV2l0aEV2ZW50cyhuZXdFdmVudHMpO1xuXG4gICAgICB3ZmRpYWcoJ2lubGluZV9pdGVyYXRpb24nLCB7XG4gICAgICAgIGl0ZXJhdGlvbixcbiAgICAgICAgcGhhc2U6ICdzdGVwcycsXG4gICAgICAgIGZlZEV2ZW50czogbmV3RXZlbnRzLmxlbmd0aCxcbiAgICAgICAgb3V0Y29tZTogcmVzdWx0LmNvbXBsZXRlZFxuICAgICAgICAgID8gJ2NvbXBsZXRlZCdcbiAgICAgICAgICA6IHJlc3VsdC5mYWlsZWRcbiAgICAgICAgICAgID8gJ2ZhaWxlZCdcbiAgICAgICAgICAgIDogJ3N1c3BlbmRlZCcsXG4gICAgICAgIGJ1ZGdldEV4aGF1c3RlZDogYnVkZ2V0LmlzRXhoYXVzdGVkKCksXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgc2Vzc2lvbi5kaXNwb3NlKCk7XG4gIH1cblxuICBwYXJlbnRTcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAuLi5BdHRyaWJ1dGUuUXVpY2tKU0lubGluZVN0ZXBzKGlubGluZVN0ZXBzRXhlY3V0ZWQpLFxuICB9KTtcblxuICBpZiAocmVzdWx0LmNvbXBsZXRlZCkge1xuICAgIC8vIFdvcmtmbG93IGNvbXBsZXRlZFxuICAgIHJ1bnRpbWVMb2dnZXIuaW5mbygnUXVpY2tKUyBydW50aW1lOiB3b3JrZmxvdyBjb21wbGV0ZWQnLCB7XG4gICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICB9KTtcbiAgICBwYXJlbnRTcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgIC4uLkF0dHJpYnV0ZS5RdWlja0pTT3V0Y29tZSgnY29tcGxldGVkJyksXG4gICAgfSk7XG5cbiAgICAvLyBGbHVzaCBsZWZ0b3ZlciBwZW5kaW5nIHNpZGUgZWZmZWN0cyAoYWJvcnQgcmVjb3JkaW5ncywgc3lzdGVtLWhvb2tcbiAgICAvLyBkaXNwb3NhbHMsIGZpcmUtYW5kLWZvcmdldCBhdHRyaWJ1dGUvaG9vayBldmVudHMpIEJFRk9SRSB3cml0aW5nXG4gICAgLy8gcnVuX2NvbXBsZXRlZCDigJQgbWlycm9ycyB0aGUgbm9kZTp2bSBlbmdpbmUncyBkcmFpblBlbmRpbmdRdWV1ZUl0ZW1zLlxuICAgIC8vIERyYWluIGZhaWx1cmVzIGFyZSBzd2FsbG93ZWQ6IHRoZSB3b3JrZmxvdydzIG93biBvdXRjb21lIGlzIHRoZVxuICAgIC8vIHNvdXJjZSBvZiB0cnV0aC5cbiAgICBpZiAocmVzdWx0LmNvbXBsZXRlZC5kcmFpbk9wZXJhdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZGlzcGF0Y2hQZW5kaW5nT3BzKHtcbiAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBuZXh0VHJhY2VDYXJyaWVyLFxuICAgICAgICAgIHBlbmRpbmdPcGVyYXRpb25zOiByZXN1bHQuY29tcGxldGVkLmRyYWluT3BlcmF0aW9ucyxcbiAgICAgICAgICB3ZmRpYWcsXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybignUXVpY2tKUyBydW50aW1lOiB0ZXJtaW5hbCBkcmFpbiBmYWlsZWQnLCB7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgbWVzc2FnZTogKGVyciBhcyBFcnJvcik/Lm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENyZWF0ZSBydW5fY29tcGxldGVkIGV2ZW50LlxuICAgIC8vIFRoZSBWTSBzZXJpYWxpemVzIHRoZSB3b3JrZmxvdyByZXN1bHQgYXMgZm9ybWF0LXByZWZpeGVkIGRldmFsdWUgYnl0ZXNcbiAgICAvLyAoXCJkZXZsXCIgKyBkZXZhbHVlKSB3aXRoIG5vIGVuY3J5cHRpb24gKHRoZSBWTSBoYXMgbm8gYWNjZXNzIHRvIHRoZVxuICAgIC8vIENyeXB0b0tleSkuIEhvc3Qtc2lkZSBlbmNyeXB0aW9uIGlzIGFwcGxpZWQgaGVyZSBzbyB0aGF0IGBydW5fY29tcGxldGVkYFxuICAgIC8vIGV2ZW50cyBoYXZlIHRoZSBzYW1lIGBlbmNyYC1wcmVmaXhlZCBwYXlsb2FkIHNoYXBlIHRoYXQgdGhlIG5vZGU6dm1cbiAgICAvLyBlbmdpbmUncyBgZGVoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZWAgcHJvZHVjZXMuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHtcbiAgICAgICAgZXZlbnRUeXBlOiAncnVuX2NvbXBsZXRlZCcsXG4gICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgb3V0cHV0OiBhd2FpdCBlbmNyeXB0U2VyaWFsaXplZERhdGEoXG4gICAgICAgICAgICByZXN1bHQuY29tcGxldGVkLnJlc3VsdCxcbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICB3ZmRpYWcoJ2V4aXRfY29tcGxldGVkJywgeyByZXN1bHQ6ICdydW5fY29tcGxldGVkX3dyaXR0ZW4nIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSB8fCBSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgJ1dvcmtmbG93IGFscmVhZHkgZmluaXNoZWQsIHNraXBwaW5nIHJ1bl9jb21wbGV0ZWQnLFxuICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQgfVxuICAgICAgICApO1xuICAgICAgICB3ZmRpYWcoJ2V4aXRfY29tcGxldGVkJywgeyByZXN1bHQ6ICdhbHJlYWR5X2ZpbmlzaGVkJyB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgd2ZkaWFnKCdleGl0X2NvbXBsZXRlZF9lcnJvcicsIHtcbiAgICAgICAgZXJyb3JOYW1lOiAoZXJyIGFzIEVycm9yKT8ubmFtZSxcbiAgICAgICAgZXJyb3JNZXNzYWdlOiAoZXJyIGFzIEVycm9yKT8ubWVzc2FnZSxcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfSBlbHNlIGlmIChyZXN1bHQuc3VzcGVuZGVkKSB7XG4gICAgLy8gV29ya2Zsb3cgc3RpbGwgc3VzcGVuZGVkIGFmdGVyIHRoZSBpbmxpbmUgbG9vcC4gQWxsIGR1cmFibGUgc2lkZVxuICAgIC8vIGVmZmVjdHMgZm9yIHRoZSBmaW5hbCBzdXNwZW5zaW9uIHN0YXRlIHdlcmUgYWxyZWFkeSBkaXNwYXRjaGVkIGJ5XG4gICAgLy8gdGhlIGxvb3A7IHdoYXQgcmVtYWlucyBpcyBkZWNpZGluZyBob3cgdGhlIHJ1biBnZXRzIHJlLWludm9rZWQuXG4gICAgY29uc3QgeyBwZW5kaW5nT3BlcmF0aW9ucyB9ID0gcmVzdWx0LnN1c3BlbmRlZDtcblxuICAgIHJ1bnRpbWVMb2dnZXIuaW5mbygnUXVpY2tKUyBydW50aW1lOiB3b3JrZmxvdyBzdXNwZW5kZWQnLCB7XG4gICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgIGlubGluZVN0ZXBzRXhlY3V0ZWQsXG4gICAgICBwZW5kaW5nU3RlcHM6IHBlbmRpbmdPcGVyYXRpb25zLmZpbHRlcigocCkgPT4gcC50eXBlID09PSAnc3RlcCcpLmxlbmd0aCxcbiAgICAgIHBlbmRpbmdXYWl0czogcGVuZGluZ09wZXJhdGlvbnMuZmlsdGVyKChwKSA9PiBwLnR5cGUgPT09ICd3YWl0JykubGVuZ3RoLFxuICAgICAgcGVuZGluZ09wczogcGVuZGluZ09wZXJhdGlvbnMubWFwKChwKSA9PiAoe1xuICAgICAgICB0eXBlOiBwLnR5cGUsXG4gICAgICAgIGNvcnJlbGF0aW9uSWQ6IHAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgaGFzQ3JlYXRlZEV2ZW50OiBwLmhhc0NyZWF0ZWRFdmVudCxcbiAgICAgICAgLi4uKHAudHlwZSA9PT0gJ3N0ZXAnID8geyBzdGVwSWQ6IChwIGFzIFBlbmRpbmdTdGVwKS5zdGVwSWQgfSA6IHt9KSxcbiAgICAgIH0pKSxcbiAgICB9KTtcblxuICAgIHBhcmVudFNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgLi4uQXR0cmlidXRlLlF1aWNrSlNPdXRjb21lKCdzdXNwZW5kZWQnKSxcbiAgICAgIC4uLkF0dHJpYnV0ZS5RdWlja0pTUGVuZGluZ09wc0NvdW50KHBlbmRpbmdPcGVyYXRpb25zLmxlbmd0aCksXG4gICAgfSk7XG5cbiAgICBpZiAocnVuR29uZSkge1xuICAgICAgLy8gVGhlIHJ1biBubyBsb25nZXIgZXhpc3RzIChleHBpcmVkIC8gZGVsZXRlZCkg4oCUIG5vdGhpbmcgdG8gZHJpdmUuXG4gICAgICB3ZmRpYWcoJ2V4aXRfc3VzcGVuZGVkJywgeyBhY3Rpb246ICdydW5fZ29uZScgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRXhpdCByZXF1ZXVlcyBhcmUgRlJFU0ggbWVzc2FnZXMsIG5ldmVyIGEgYHsgdGltZW91dFNlY29uZHMgfWBcbiAgICAvLyB2aXNpYmlsaXR5LXJlZGVsaXZlcnkgb2YgdGhlIGN1cnJlbnQgbWVzc2FnZS4gUmVkZWxpdmVyaW5nIHRoZVxuICAgIC8vIENVUlJFTlQgbWVzc2FnZSBpcyBhIHRyYXA6IGEgaG9vay1yZXN1bWUgZGVsaXZlcnkgY2Fycmllc1xuICAgIC8vIGBob29rSW5wdXRgLCBhbmQgaXRzIHJlZGVsaXZlcnkgcmUtcnVucyB0aGUgbGF6eS1yZXN1bWUgcmUtZW5zdXJlXG4gICAgLy8gaW4gdGhlIGhhbmRsZXIgcHJvbG9ndWUg4oCUIGlmIHRoZSB3b3JrZmxvdyBkaXNwb3NlZCB0aGF0IGhvb2tcbiAgICAvLyBkdXJpbmcgdGhpcyBpbnZvY2F0aW9uIChkaXNwb3NlIOKGkiBzbGVlcCksIGEgd29ybGQgdGhhdCByZWplY3RzXG4gICAgLy8gdGhlIHJlLWVuc3VyZSB3b3VsZCBhY2sgdGhlIG1lc3NhZ2UgYXMgXCJub3RoaW5nIGxlZnQgdG8gcmVzdW1lXCJcbiAgICAvLyBhbmQgdGhlIGNvbnRpbnVhdGlvbiBpdCBjYXJyaWVkIGlzIHNpbGVudGx5IGxvc3QuIEEgZnJlc2ggbWVzc2FnZVxuICAgIC8vIGNhcnJpZXMgb25seSBgcnVuSWRgLCBzbyBpdHMgZGVsaXZlcnkgYWx3YXlzIHJlYWNoZXMgcmVwbGF5IChhbmRcbiAgICAvLyB1bmRlciB0dXJibyBhIHJlc2NoZWR1bGUgd291bGQgcmUtZW5nYWdlIHR1cmJvIGFnYWluc3QgYSBzdGFsZVxuICAgIC8vIHByZWxvYWRlZCBsb2cg4oCUIHNlZSB0aGUgcmVpbnZva2UoKSBkb2NzIGluIHJ1bnRpbWUudHMpLlxuICAgIGNvbnN0IHJlcXVldWVJbW1lZGlhdGVseSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgd29ybGQsXG4gICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93UnVuLndvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAge1xuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH07XG5cbiAgICBpZiAoYnVkZ2V0LmlzRXhoYXVzdGVkKCkpIHtcbiAgICAgIC8vIFRoZSBsb29wIHN0b3BwZWQgb24gdGhlIHJlcGxheSBidWRnZXQgd2l0aCBwcm9ncmVzcyBzdGlsbFxuICAgICAgLy8gcG9zc2libGUg4oCUIGNvbnRpbnVlIGluIGEgZnJlc2ggaW52b2NhdGlvbi5cbiAgICAgIHdmZGlhZygnZXhpdF9zdXNwZW5kZWQnLCB7IGFjdGlvbjogJ2J1ZGdldF9leGhhdXN0ZWRfcmVxdWV1ZScgfSk7XG4gICAgICBhd2FpdCByZXF1ZXVlSW1tZWRpYXRlbHkoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBFeGl0IHdhaXQgc3dlZXAuIEEgd2FpdCB0aGF0IGVsYXBzZWQgaW4gdGhlIHdpbmRvdyBzaW5jZSB0aGVcbiAgICAvLyBsb29wJ3MgbGFzdCBjaGVjayByZXF1ZXVlcyBpbW1lZGlhdGVseSAoaXRzIHdhaXRfY29tcGxldGVkIGlzXG4gICAgLy8gd3JpdHRlbiBieSB0aGUgbmV4dCBpbnZvY2F0aW9uJ3MgZWxhcHNlZC13YWl0IHBhc3MpOyBwZW5kaW5nIHdhaXRzXG4gICAgLy8gd2hvc2UgY29udGludWF0aW9uIHRoZSBsb29wIGFscmVhZHkgZW5xdWV1ZWQgYXJlIHNraXBwZWQuXG4gICAgbGV0IHNvb25lc3RXYWl0OiB7IHNlY29uZHM6IG51bWJlcjsgY29ycmVsYXRpb25JZDogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG4gICAgbGV0IGhhc0VsYXBzZWRXYWl0ID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBvcCBvZiBwZW5kaW5nT3BlcmF0aW9ucykge1xuICAgICAgaWYgKG9wLnR5cGUgIT09ICd3YWl0JykgY29udGludWU7XG4gICAgICBjb25zdCB3YWl0ID0gb3AgYXMgUGVuZGluZ1dhaXQ7XG4gICAgICBjb25zdCByZXN1bWVNcyA9IG5ldyBEYXRlKHdhaXQucmVzdW1lQXQpLmdldFRpbWUoKSAtIERhdGUubm93KCk7XG4gICAgICBpZiAocmVzdW1lTXMgPD0gMCkge1xuICAgICAgICBoYXNFbGFwc2VkV2FpdCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKCFzY2hlZHVsZWRXYWl0Q29udGludWF0aW9ucy5oYXMod2FpdC5jb3JyZWxhdGlvbklkKSkge1xuICAgICAgICBjb25zdCB0aW1lb3V0U2Vjb25kcyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChyZXN1bWVNcyAvIDEwMDApKTtcbiAgICAgICAgaWYgKCFzb29uZXN0V2FpdCB8fCB0aW1lb3V0U2Vjb25kcyA8IHNvb25lc3RXYWl0LnNlY29uZHMpIHtcbiAgICAgICAgICBzb29uZXN0V2FpdCA9IHtcbiAgICAgICAgICAgIHNlY29uZHM6IHRpbWVvdXRTZWNvbmRzLFxuICAgICAgICAgICAgY29ycmVsYXRpb25JZDogd2FpdC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFzRWxhcHNlZFdhaXQpIHtcbiAgICAgIHdmZGlhZygnZXhpdF9zdXNwZW5kZWQnLCB7IGFjdGlvbjogJ3dhaXRfZWxhcHNlZF9yZXF1ZXVlJyB9KTtcbiAgICAgIGF3YWl0IHJlcXVldWVJbW1lZGlhdGVseSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwZW5kaW5nUmVxdWV1ZVNpZ25hbCkge1xuICAgICAgLy8gVGhpcyBpbnZvY2F0aW9uIHdyb3RlIGV2ZW50cyB0aGUgd29ya2Zsb3cgbmVlZHMgdG8gY29uc3VtZVxuICAgICAgLy8gKGF0dHJfc2V0IC8gZ2V0Q29uZmxpY3QtYXdhaXRlZCBob29rX2NyZWF0ZWQgLyBpbmxpbmUgc3RlcFxuICAgICAgLy8gdGVybWluYWxzKSBidXQgdGhlIGV2ZW50dWFsbHktY29uc2lzdGVudCBsaXN0aW5nIG5ldmVyIHJldHVybmVkXG4gICAgICAvLyB0aGVtIGJlZm9yZSB0aGUgbG9vcCBleGl0ZWQuIFdpdGhvdXQgYSByZXF1ZXVlIHRoZSBydW4gd291bGRcbiAgICAgIC8vIHBhcmsgYXdhaXRpbmdfZXh0ZXJuYWwgd2l0aCBpdHMgdW5ibG9ja2luZyBldmVudHMgYWxyZWFkeVxuICAgICAgLy8gZHVyYWJseSB3cml0dGVuIGFuZCBubyBmdXR1cmUgaW52b2NhdGlvbiBjb21pbmcg4oCUIHJlcXVldWVcbiAgICAgIC8vIGltbWVkaWF0ZWx5IHNvIGEgZnJlc2ggcmVhZCBwaWNrcyB0aGVtIHVwLiBJbiB0aGUgY29tbW9uIGNhc2VcbiAgICAgIC8vIHRoZSBsb29wJ3Mgb3duIGZlZWQgb2JzZXJ2ZXMgdGhlIHdyaXRlcyBhbmQgY2xlYXJzIHRoaXMgZmxhZywgc29cbiAgICAgIC8vIHRoaXMgb25seSBmaXJlcyB3aGVuIHRoZSByZWFkIGFjdHVhbGx5IGxhZ2dlZC5cbiAgICAgIHdmZGlhZygnZXhpdF9zdXNwZW5kZWQnLCB7IGFjdGlvbjogJ3VucmVhZF9zZWxmX3dyaXRlX3JlcXVldWUnIH0pO1xuICAgICAgYXdhaXQgcmVxdWV1ZUltbWVkaWF0ZWx5KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNvb25lc3RXYWl0KSB7XG4gICAgICAvLyBEZWxheWVkIGNvbnRpbnVhdGlvbiBmb3IgdGhlIHNvb25lc3QgcGVuZGluZyB3YWl0IHRoZSBsb29wIGhhc1xuICAgICAgLy8gbm90IGFscmVhZHkgc2NoZWR1bGVkLiBUaGUgZGlzcGF0Y2ggaGVscGVyIGhhbmRsZXMgZGVsYXlcbiAgICAgIC8vIGNsYW1waW5nIChsb25nIHdhaXRzIGNoYWluIGFjcm9zcyBob3BzKSBhbmQgaWRlbXBvdGVuY3kta2V5XG4gICAgICAvLyBkZWR1cCBvZiByZS1vYnNlcnZhdGlvbnMgb2YgdGhlIHNhbWUgcGVuZGluZyB3YWl0IOKAlCBzZWVcbiAgICAgIC8vIHJ1bnRpbWUvd2FpdC1jb250aW51YXRpb24udHMuXG4gICAgICB3ZmRpYWcoJ2V4aXRfc3VzcGVuZGVkJywge1xuICAgICAgICBhY3Rpb246ICdzY2hlZHVsZV93YWl0X3RpbWVvdXQnLFxuICAgICAgICB0aW1lb3V0U2Vjb25kczogc29vbmVzdFdhaXQuc2Vjb25kcyxcbiAgICAgICAgd2FpdENvcnJlbGF0aW9uSWQ6IHNvb25lc3RXYWl0LmNvcnJlbGF0aW9uSWQsXG4gICAgICB9KTtcbiAgICAgIHNjaGVkdWxlZFdhaXRDb250aW51YXRpb25zLmFkZChzb29uZXN0V2FpdC5jb3JyZWxhdGlvbklkKTtcbiAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgd29ybGQsXG4gICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93UnVuLndvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAge1xuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICB9LFxuICAgICAgICBnZXRXYWl0Q29udGludWF0aW9uRGlzcGF0Y2goXG4gICAgICAgICAgc29vbmVzdFdhaXQuc2Vjb25kcyxcbiAgICAgICAgICBzb29uZXN0V2FpdC5jb3JyZWxhdGlvbklkXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2ZkaWFnKCdleGl0X3N1c3BlbmRlZCcsIHtcbiAgICAgIGFjdGlvbjogJ2F3YWl0aW5nX2V4dGVybmFsJyxcbiAgICAgIHBlbmRpbmdPcHNDb3VudDogcGVuZGluZ09wZXJhdGlvbnMubGVuZ3RoLFxuICAgIH0pO1xuICB9IGVsc2UgaWYgKHJlc3VsdC5mYWlsZWQpIHtcbiAgICAvLyBXb3JrZmxvdyBmYWlsZWQg4oCUIHJlbWFwIHN0YWNrIHRyYWNlIHVzaW5nIGlubGluZSBzb3VyY2UgbWFwcy5cbiAgICAvLyBGcmFtZXMgY2FycnkgdGhlIHJ1bidzIHdvcmtmbG93SWQgYXMgdGhlaXIgZmlsZW5hbWUgb24gdGhlIGZyZXNoXG4gICAgLy8gcGF0aCwgYnV0IHRoZSB3b3JrZmxvdy1pbmRlcGVuZGVudCBCQVNFTElORV9CVU5ETEVfRklMRU5BTUUgb24gdGhlXG4gICAgLy8gc25hcHNob3QgcGF0aCAodGhlIG5hbWUgaXMgYmFrZWQgaW50byB0aGUgc2hhcmVkIGJhc2VsaW5lJ3NcbiAgICAvLyBjb21waWxlZCBjb2RlIGF0IGh5ZHJhdGUpIOKAlCByZW1hcCBhZ2FpbnN0IGJvdGguIHJlbWFwRXJyb3JTdGFja1xuICAgIC8vIGVhcmx5LWV4aXRzIG9uIGEgY2hlYXAgaW5jbHVkZXMoKSB3aGVuIGEgZmlsZW5hbWUgaGFzIG5vIGZyYW1lcy5cbiAgICBsZXQgZXJyb3JTdGFjayA9IHJlc3VsdC5mYWlsZWQuc3RhY2s7XG4gICAgaWYgKGVycm9yU3RhY2spIHtcbiAgICAgIGNvbnN0IHBhcnNlZE5hbWUgPSBwYXJzZVdvcmtmbG93TmFtZSh3b3JrZmxvd05hbWUpO1xuICAgICAgY29uc3QgZmlsZW5hbWUgPSBwYXJzZWROYW1lPy5tb2R1bGVTcGVjaWZpZXIgfHwgd29ya2Zsb3dOYW1lO1xuICAgICAgZXJyb3JTdGFjayA9IHJlbWFwRXJyb3JTdGFjayhlcnJvclN0YWNrLCBmaWxlbmFtZSwgd29ya2Zsb3dDb2RlKTtcbiAgICAgIGVycm9yU3RhY2sgPSByZW1hcEVycm9yU3RhY2soXG4gICAgICAgIGVycm9yU3RhY2ssXG4gICAgICAgIEJBU0VMSU5FX0JVTkRMRV9GSUxFTkFNRSxcbiAgICAgICAgd29ya2Zsb3dDb2RlXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENsYXNzaWZ5IHRoZSBlcnJvciBzbyBjb25zdW1lcnMgKGBydW4ucmV0dXJuVmFsdWVgLCBvYnNlcnZhYmlsaXR5KVxuICAgIC8vIGdldCBgVVNFUl9FUlJPUmAgLyBgUlVOVElNRV9FUlJPUmAgb24gYGVycm9yLmNhdXNlLmNvZGVgLCBtYXRjaGluZ1xuICAgIC8vIHdoYXQgdGhlIG5vZGU6dm0gZW5naW5lIGFscmVhZHkgZG9lcyBpbiBydW50aW1lLnRzLlxuICAgIC8vXG4gICAgLy8gVGhlIFZNIHNlcmlhbGl6ZXMgZXJyb3JzIGFzIGB7IG5hbWUsIG1lc3NhZ2UsIHN0YWNrIH1gLCBzbyB3ZVxuICAgIC8vIHJlY29uc3RydWN0IGEgaG9zdC1zaWRlIEVycm9yIG9mIHRoZSBjb3JyZWN0IGNsYXNzIGJhc2VkIG9uIHRoZVxuICAgIC8vIFZNLXNpZGUgYG5hbWVgIOKAlCBzcGVjaWZpYyBXb3JrZmxvd1J1bnRpbWVFcnJvciBzdWJjbGFzc2VzIG5lZWRcbiAgICAvLyB0byBiZSBwcmVzZXJ2ZWQgc28gY2xhc3NpZnlSdW5FcnJvcigpIHRhZ3MgdGhlbSBhcyBSVU5USU1FX0VSUk9SLlxuICAgIGNvbnN0IHJlY29uc3RydWN0ZWQ6IEVycm9yID1cbiAgICAgIHJlc3VsdC5mYWlsZWQubmFtZSA9PT0gJ1dvcmtmbG93Tm90UmVnaXN0ZXJlZEVycm9yJ1xuICAgICAgICA/IG5ldyBXb3JrZmxvd05vdFJlZ2lzdGVyZWRFcnJvcih3b3JrZmxvd05hbWUpXG4gICAgICAgIDogcmVzdWx0LmZhaWxlZC5uYW1lID09PSAnRXJyb3InXG4gICAgICAgICAgPyBuZXcgRXJyb3IocmVzdWx0LmZhaWxlZC5tZXNzYWdlKVxuICAgICAgICAgIDogT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IocmVzdWx0LmZhaWxlZC5tZXNzYWdlKSwge1xuICAgICAgICAgICAgICBuYW1lOiByZXN1bHQuZmFpbGVkLm5hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICBjb25zdCBlcnJvckNvZGUgPSBjbGFzc2lmeVJ1bkVycm9yKHJlY29uc3RydWN0ZWQpO1xuXG4gICAgcnVudGltZUxvZ2dlci5lcnJvcignUXVpY2tKUyBydW50aW1lOiB3b3JrZmxvdyBmYWlsZWQnLCB7XG4gICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgIGVycm9yTmFtZTogcmVzdWx0LmZhaWxlZC5uYW1lLFxuICAgICAgZXJyb3JNZXNzYWdlOiByZXN1bHQuZmFpbGVkLm1lc3NhZ2UsXG4gICAgICBlcnJvclN0YWNrLFxuICAgICAgZXJyb3JDb2RlLFxuICAgIH0pO1xuICAgIHBhcmVudFNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgLi4uQXR0cmlidXRlLlF1aWNrSlNPdXRjb21lKCdmYWlsZWQnKSxcbiAgICB9KTtcblxuICAgIC8vIEZsdXNoIGxlZnRvdmVyIHBlbmRpbmcgc2lkZSBlZmZlY3RzIGJlZm9yZSB3cml0aW5nIHJ1bl9mYWlsZWQg4oCUXG4gICAgLy8gc2FtZSBkcmFpbiBzZW1hbnRpY3MgYXMgdGhlIGNvbXBsZXRlZCBicmFuY2guXG4gICAgaWYgKHJlc3VsdC5mYWlsZWQuZHJhaW5PcGVyYXRpb25zPy5sZW5ndGgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGRpc3BhdGNoUGVuZGluZ09wcyh7XG4gICAgICAgICAgd29ybGQsXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICAgICAgICBwZW5kaW5nT3BlcmF0aW9uczogcmVzdWx0LmZhaWxlZC5kcmFpbk9wZXJhdGlvbnMsXG4gICAgICAgICAgd2ZkaWFnLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oJ1F1aWNrSlMgcnVudGltZTogdGVybWluYWwgZHJhaW4gZmFpbGVkJywge1xuICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgIG1lc3NhZ2U6IChlcnIgYXMgRXJyb3IpPy5tZXNzYWdlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgcnVuX2ZhaWxlZCBldmVudC4gU2VyaWFsaXplIHRoZSBlcnJvciB0aHJvdWdoIHRoZVxuICAgIC8vIGZpcnN0LWNsYXNzIGRlaHlkcmF0aW9uIHBpcGVsaW5lIHNvIGNvbnN1bWVycyAoQ0xJLCBvYnNlcnZhYmlsaXR5LFxuICAgIC8vIHJ1bi5yZXR1cm5WYWx1ZSkgZ2V0IHRoZSBzYW1lIGh5ZHJhdGVkIHZhbHVlIHNoYXBlIGFzIHRoZSBub2RlOnZtXG4gICAgLy8gZW5naW5lIGVtaXRzLiBUd28gcGF0aHM6XG4gICAgLy8gICAqIE1vZGVybiAodmFsdWVCeXRlcyBwcmVzZW50KTogdGhlIFZNLXNpZGUgcmVqZWN0aW9uIGhhbmRsZXJcbiAgICAvLyAgICAgc2VyaWFsaXplZCB0aGUgb3JpZ2luYWwgdGhyb3duIHZhbHVlIChFcnJvciBzdWJjbGFzcyB3aXRoXG4gICAgLy8gICAgIGNhdXNlIGNoYWluLCBwbGFpbiBvYmplY3QsIHByaW1pdGl2ZSwgZXRjLikgdXNpbmcgdGhlIFZNJ3NcbiAgICAvLyAgICAgd29ya2Zsb3ctc2VyaWFsaXplLiBQYXNzIHRob3NlIGJ5dGVzIHRocm91Z2ggZGlyZWN0bHkgc29cbiAgICAvLyAgICAgdHlwZSBpZGVudGl0eSwgY2F1c2UgY2hhaW5zLCBhbmQgbm9uLUVycm9yIHRocm93cyBzdXJ2aXZlLlxuICAgIC8vICAgICBXZSBqdXN0IG5lZWQgdG8gYXBwbHkgZW5jcnlwdGlvbiBpZiBjb25maWd1cmVkICh0aGUgVk0nc1xuICAgIC8vICAgICBzZXJpYWxpemVyIGRvZXNuJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGVuY3J5cHRpb24ga2V5KS5cbiAgICAvLyAgICogTGVnYWN5IGZhbGxiYWNrOiByZWNvbnN0cnVjdCBhbiBFcnJvciBmcm9tIHRoZSBob3N0LXZpc2libGVcbiAgICAvLyAgICAge25hbWUsIG1lc3NhZ2UsIHN0YWNrfSBmaWVsZHMgYW5kIHJ1biBpdCB0aHJvdWdoXG4gICAgLy8gICAgIGBkZWh5ZHJhdGVSdW5FcnJvcmAuIFVzZWQgd2hlbiB2YWx1ZUJ5dGVzIGlzIGFic2VudCAoZS5nLlxuICAgIC8vICAgICBleHRyYWN0RXJyb3IgcHNldWRvLWZhaWx1cmVzIGZyb20gVk0gYm9vdHN0cmFwKS5cbiAgICBsZXQgZGVoeWRyYXRlZEVycm9yOiBVaW50OEFycmF5O1xuICAgIGlmIChyZXN1bHQuZmFpbGVkLnZhbHVlQnl0ZXMpIHtcbiAgICAgIC8vIEh5ZHJhdGUgdGhlIFZNLXNpZGUgYnl0ZXMsIHJlbWFwIHRoZSBlcnJvciBzdGFjayB3aXRoIHRoZVxuICAgICAgLy8gaG9zdC1zaWRlIHNvdXJjZSBtYXAgKHRoZSBWTSBjYW4ndCBkbyB0aGlzIOKAlCBpdCBsYWNrcyBib3RoIHRoZVxuICAgICAgLy8gc291cmNlIG1hcCBhbmQgYHJlbWFwRXJyb3JTdGFja2ApLCBhbmQgcmUtZGVoeWRyYXRlLiBUaGlzXG4gICAgICAvLyBwcmVzZXJ2ZXMgdGhlIG9yaWdpbmFsIHZhbHVlJ3MgdHlwZSBpZGVudGl0eSAvIGNhdXNlIGNoYWluXG4gICAgICAvLyB3aGlsZSBmaXhpbmcgdXAgZnJhbWVzIHRvIHBvaW50IGF0IHRoZSB1c2VyJ3Mgc291cmNlIGZpbGVzLlxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaHlkcmF0ZWQgPSBhd2FpdCBoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgcmVzdWx0LmZhaWxlZC52YWx1ZUJ5dGVzLFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHVuZGVmaW5lZCAvLyBWTSBieXRlcyBhcmUgdW5lbmNyeXB0ZWRcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGh5ZHJhdGVkICYmXG4gICAgICAgICAgdHlwZW9mIGh5ZHJhdGVkID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICdzdGFjaycgaW4gKGh5ZHJhdGVkIGFzIG9iamVjdCkgJiZcbiAgICAgICAgICB0eXBlb2YgKGh5ZHJhdGVkIGFzIHsgc3RhY2s/OiB1bmtub3duIH0pLnN0YWNrID09PSAnc3RyaW5nJ1xuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBwYXJzZWROYW1lID0gcGFyc2VXb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKTtcbiAgICAgICAgICBjb25zdCBmaWxlbmFtZSA9IHBhcnNlZE5hbWU/Lm1vZHVsZVNwZWNpZmllciB8fCB3b3JrZmxvd05hbWU7XG4gICAgICAgICAgLy8gQm90aCBmaWxlbmFtZSBzcGFjZXMg4oCUIHNlZSB0aGUgZmFpbGVkLWJyYW5jaCBjb21tZW50IGFib3ZlLlxuICAgICAgICAgIChoeWRyYXRlZCBhcyB7IHN0YWNrPzogc3RyaW5nIH0pLnN0YWNrID0gcmVtYXBFcnJvclN0YWNrKFxuICAgICAgICAgICAgcmVtYXBFcnJvclN0YWNrKFxuICAgICAgICAgICAgICAoaHlkcmF0ZWQgYXMgeyBzdGFjazogc3RyaW5nIH0pLnN0YWNrLFxuICAgICAgICAgICAgICBmaWxlbmFtZSxcbiAgICAgICAgICAgICAgd29ya2Zsb3dDb2RlXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgQkFTRUxJTkVfQlVORExFX0ZJTEVOQU1FLFxuICAgICAgICAgICAgd29ya2Zsb3dDb2RlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXYWxrIHRoZSBjYXVzZSBjaGFpbiBhbmQgcmVtYXAgbmVzdGVkIHN0YWNrcyB0b28uXG4gICAgICAgIGNvbnN0IHNlZW4gPSBuZXcgV2Vha1NldDxvYmplY3Q+KCk7XG4gICAgICAgIGxldCBub2RlID0gKGh5ZHJhdGVkIGFzIHsgY2F1c2U/OiB1bmtub3duIH0pPy5jYXVzZTtcbiAgICAgICAgd2hpbGUgKG5vZGUgJiYgdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnICYmICFzZWVuLmhhcyhub2RlIGFzIG9iamVjdCkpIHtcbiAgICAgICAgICBzZWVuLmFkZChub2RlIGFzIG9iamVjdCk7XG4gICAgICAgICAgY29uc3Qgbm9kZVN0YWNrID0gKG5vZGUgYXMgeyBzdGFjaz86IHVua25vd24gfSkuc3RhY2s7XG4gICAgICAgICAgaWYgKHR5cGVvZiBub2RlU3RhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWROYW1lID0gcGFyc2VXb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVuYW1lID0gcGFyc2VkTmFtZT8ubW9kdWxlU3BlY2lmaWVyIHx8IHdvcmtmbG93TmFtZTtcbiAgICAgICAgICAgIC8vIEJvdGggZmlsZW5hbWUgc3BhY2VzIOKAlCBzZWUgdGhlIGZhaWxlZC1icmFuY2ggY29tbWVudCBhYm92ZS5cbiAgICAgICAgICAgIChub2RlIGFzIHsgc3RhY2s/OiBzdHJpbmcgfSkuc3RhY2sgPSByZW1hcEVycm9yU3RhY2soXG4gICAgICAgICAgICAgIHJlbWFwRXJyb3JTdGFjayhub2RlU3RhY2ssIGZpbGVuYW1lLCB3b3JrZmxvd0NvZGUpLFxuICAgICAgICAgICAgICBCQVNFTElORV9CVU5ETEVfRklMRU5BTUUsXG4gICAgICAgICAgICAgIHdvcmtmbG93Q29kZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbm9kZSA9IChub2RlIGFzIHsgY2F1c2U/OiB1bmtub3duIH0pLmNhdXNlO1xuICAgICAgICB9XG4gICAgICAgIGRlaHlkcmF0ZWRFcnJvciA9IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgIGh5ZHJhdGVkLFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKHJlaHlkcmF0ZUVycikge1xuICAgICAgICAvLyBJZiBoeWRyYXRpb24gLyByZS1kZWh5ZHJhdGlvbiBmYWlscyBmb3IgYW55IHJlYXNvbiwgZmFsbFxuICAgICAgICAvLyBiYWNrIHRvIHBhc3NpbmcgdGhyb3VnaCB0aGUgb3JpZ2luYWwgVk0gYnl0ZXMgKGp1c3QgYXBwbHlcbiAgICAgICAgLy8gZW5jcnlwdGlvbiBpZiBjb25maWd1cmVkKS4gQmV0dGVyIHRvIGxvc2Ugc291cmNlLW1hcHBlZFxuICAgICAgICAvLyBmcmFtZXMgdGhhbiB0byBsb3NlIHRoZSBlcnJvciBlbnRpcmVseS5cbiAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICdRdWlja0pTIHJ1bnRpbWU6IGZhaWxlZCB0byByZW1hcCB3b3JrZmxvdyBlcnJvciBzdGFjaywgcGFzc2luZyBWTSBieXRlcyB0aHJvdWdoJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IChyZWh5ZHJhdGVFcnIgYXMgRXJyb3IpPy5tZXNzYWdlLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgZGVoeWRyYXRlZEVycm9yID0gKGF3YWl0IG1heWJlRW5jcnlwdChcbiAgICAgICAgICByZXN1bHQuZmFpbGVkLnZhbHVlQnl0ZXMsXG4gICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICApKSBhcyBVaW50OEFycmF5O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZXJyb3JTdGFjaykge1xuICAgICAgICByZWNvbnN0cnVjdGVkLnN0YWNrID0gZXJyb3JTdGFjaztcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGRlaHlkcmF0ZWRFcnJvciA9IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgIHJlY29uc3RydWN0ZWQsXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoc2VyRXJyKSB7XG4gICAgICAgIC8vIEZhbGwgYmFjayB0byBhIG1pbmltYWwgcGF5bG9hZCBzbyB0aGUgcnVuIHN0aWxsIHRlcm1pbmF0ZXNcbiAgICAgICAgLy8gZXZlbiB3aGVuIHRoZSBlcnJvciBpdHNlbGYgY29udGFpbnMgdW5zZXJpYWxpemFibGUgdmFsdWVzLlxuICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgJ1F1aWNrSlMgcnVudGltZTogZmFpbGVkIHRvIGRlaHlkcmF0ZSBydW4gZXJyb3IsIGZhbGxpbmcgYmFjayB0byBiYXJlIEVycm9yJyxcbiAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBtZXNzYWdlOiAoc2VyRXJyIGFzIEVycm9yKT8ubWVzc2FnZSB9XG4gICAgICAgICk7XG4gICAgICAgIGRlaHlkcmF0ZWRFcnJvciA9IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgIE9iamVjdC5hc3NpZ24obmV3IEVycm9yKHJlc3VsdC5mYWlsZWQubWVzc2FnZSksIHtcbiAgICAgICAgICAgIG5hbWU6IHJlc3VsdC5mYWlsZWQubmFtZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICBlbmNyeXB0aW9uS2V5XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgICAgIGV2ZW50VHlwZTogJ3J1bl9mYWlsZWQnLFxuICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgIGVycm9yOiBkZWh5ZHJhdGVkRXJyb3IsXG4gICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8IFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybignV29ya2Zsb3cgYWxyZWFkeSBmaW5pc2hlZCwgc2tpcHBpbmcgcnVuX2ZhaWxlZCcsIHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgfSk7XG4gICAgICAgIHdmZGlhZygnZXhpdF9mYWlsZWQnLCB7IHJlc3VsdDogJ2FscmVhZHlfZmluaXNoZWQnIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB3ZmRpYWcoJ2V4aXRfZmFpbGVkX2Vycm9yJywge1xuICAgICAgICBlcnJvck5hbWU6IChlcnIgYXMgRXJyb3IpPy5uYW1lLFxuICAgICAgICBlcnJvck1lc3NhZ2U6IChlcnIgYXMgRXJyb3IpPy5tZXNzYWdlLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIHdmZGlhZygnZXhpdF9mYWlsZWQnLCB7IHJlc3VsdDogJ3J1bl9mYWlsZWRfd3JpdHRlbicgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
1561
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVpY2tqcy1lbnRyeXBvaW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvcXVpY2tqcy1lbnRyeXBvaW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFHSCxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGlCQUFpQixFQUNqQixzQkFBc0IsRUFDdEIsZUFBZSxFQUNmLDBCQUEwQixHQUMzQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFFTCxxQkFBcUIsRUFFckIsb0JBQW9CLEVBQ3BCLDBDQUEwQyxHQUUzQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0MsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixPQUFPLElBQUkscUJBQXFCLEdBRWpDLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixlQUFlLEVBQ2YsWUFBWSxHQUNiLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pFLE9BQU8sS0FBSyxTQUFTLE1BQU0sc0NBQXNDLENBQUM7QUFDbEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUNMLDhCQUE4QixFQUM5QixpQkFBaUIsRUFDakIsOEJBQThCLEVBQzlCLDhCQUE4QixHQUMvQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNqRCxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLFlB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QWEsRUFBRSxJQUFJO2dCQUMvQixZQUFZLEVBQUcsR0FBYSxFQUFFLE9BQU87YUFDdEMsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxHQUFHLENBQUM7UUFDWixDQUFDO1FBQ0QsTUFBTSxDQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxDQUFDLENBQUM7SUFDMUQsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFF1aWNrSlMgVk0gaW50ZWdyYXRpb24gd2l0aCB0aGUgV29ya2Zsb3cgRGV2S2l0LlxuICpcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHRoZSBlbnRyeSBwb2ludCBmb3IgcnVubmluZyB3b3JrZmxvd3MgaW4gdGhlXG4gKiBRdWlja0pTIFdBU00gVk0gZW5naW5lIGluc3RlYWQgb2YgdGhlIGBub2RlOnZtYCBlbmdpbmUuIEJvdGggZW5naW5lc1xuICogaW1wbGVtZW50IHRoZSBzYW1lIGV2ZW50LXJlcGxheSBleGVjdXRpb24gbW9kZWwg4oCUIGV2ZXJ5IGludm9jYXRpb246XG4gKlxuICogMS4gTG9hZHMgdGhlIGZ1bGwgZXZlbnQgbG9nIGZvciB0aGUgcnVuXG4gKiAyLiBSdW5zIHRoZSB3b3JrZmxvdyBmdW5jdGlvbiBmcm9tIHRoZSB0b3AgaW4gYSBmcmVzaCBRdWlja0pTIFZNLFxuICogICAgcmVwbGF5aW5nIHRoZSBldmVudCBsb2cgdG8gcmVzb2x2ZSBhd2FpdGVkIHByaW1pdGl2ZXNcbiAqIDMuIE9uIHN1c3BlbnNpb246IGNyZWF0ZXMgZXZlbnRzICsgcXVldWVzIHN0ZXBzIGZvciBuZXcgcGVuZGluZyBvcHNcbiAqIDQuIE9uIGNvbXBsZXRpb246IGNyZWF0ZXMgcnVuX2NvbXBsZXRlZFxuICogNS4gT24gZmFpbHVyZTogY3JlYXRlcyBydW5fZmFpbGVkXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTcGFuIH0gZnJvbSAnQG9wZW50ZWxlbWV0cnkvYXBpJztcbmltcG9ydCB7XG4gIEVudGl0eUNvbmZsaWN0RXJyb3IsXG4gIEhvb2tOb3RGb3VuZEVycm9yLFxuICBNYXhFdmVudHNFeGNlZWRlZEVycm9yLFxuICBSdW5FeHBpcmVkRXJyb3IsXG4gIFdvcmtmbG93Tm90UmVnaXN0ZXJlZEVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IHBhcnNlV29ya2Zsb3dOYW1lIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzL3BhcnNlLW5hbWUnO1xuaW1wb3J0IHtcbiAgdHlwZSBFdmVudCxcbiAgUk9PVF9SVU5fSURfQVRUUklCVVRFLFxuICB0eXBlIFJ1bklucHV0LFxuICBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NCT1JfUVVFVUVfVFJBTlNQT1JULFxuICB0eXBlIFdvcmtmbG93UnVuLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgY2xhc3NpZnlSdW5FcnJvciwgaXNSZXRyeWFibGVXb3JsZEVycm9yIH0gZnJvbSAnLi4vY2xhc3NpZnktZXJyb3IuanMnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQge1xuICBkZXJpdmVSdW5QYXlsb2FkS2V5cyxcbiAgZW5jcnlwdCBhcyBlbmNyeXB0U2VyaWFsaXplZERhdGEsXG4gIHR5cGUgUnVuUGF5bG9hZEtleXMsXG59IGZyb20gJy4uL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQge1xuICBkZWh5ZHJhdGVSdW5FcnJvcixcbiAgaHlkcmF0ZVJ1bkVycm9yLFxuICBtYXliZUVuY3J5cHQsXG59IGZyb20gJy4uL3NlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgcmVtYXBFcnJvclN0YWNrLCBzdHJpcElubGluZVNvdXJjZU1hcCB9IGZyb20gJy4uL3NvdXJjZS1tYXAuanMnO1xuaW1wb3J0ICogYXMgQXR0cmlidXRlIGZyb20gJy4uL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQgeyBzZXJpYWxpemVUcmFjZUNhcnJpZXIgfSBmcm9tICcuLi90ZWxlbWV0cnkuanMnO1xuaW1wb3J0IHtcbiAgZ2V0SW5saW5lT3duZXJzaGlwTGVhc2VTZWNvbmRzLFxuICBnZXRNYXhJbmxpbmVTdGVwcyxcbiAgaXNSZXNpbGllbnRTdGVwRGlzcGF0Y2hFbmFibGVkLFxuICBNQVhfUkVTSUxJRU5UX1NURVBfSU5QVVRfQllURVMsXG59IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IGdldFBvcnRMYXp5IH0gZnJvbSAnLi9nZXQtcG9ydC1sYXp5LmpzJztcbmltcG9ydCB7XG4gIGdldFdvcmtmbG93UXVldWVOYW1lLFxuICBxdWV1ZU1lc3NhZ2UsXG4gIHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5LFxufSBmcm9tICcuL2hlbHBlcnMuanMnO1xuaW1wb3J0IHtcbiAgQkFTRUxJTkVfQlVORExFX0ZJTEVOQU1FLFxuICB0eXBlIFBlbmRpbmdBdHRyaWJ1dGUsXG4gIHR5cGUgUGVuZGluZ0hvb2ssXG4gIHR5cGUgUGVuZGluZ0hvb2tEaXNwb3NlLFxuICB0eXBlIFBlbmRpbmdPcGVyYXRpb24sXG4gIHR5cGUgUGVuZGluZ1N0ZXAsXG4gIHR5cGUgUGVuZGluZ1dhaXQsXG4gIHN0YXJ0UXVpY2tKU1dvcmtmbG93LFxufSBmcm9tICcuL3F1aWNranMtcnVudGltZS5qcyc7XG5pbXBvcnQgeyBSZXBsYXlCdWRnZXQgfSBmcm9tICcuL3JlcGxheS1idWRnZXQuanMnO1xuaW1wb3J0IHsgZXhlY3V0ZVN0ZXAsIHR5cGUgU3RlcEV4ZWN1dGlvblJlc3VsdCB9IGZyb20gJy4vc3RlcC1leGVjdXRvci5qcyc7XG5pbXBvcnQgeyBydW5TdGVwU2luZ2xlRmxpZ2h0IH0gZnJvbSAnLi9zdGVwLXNpbmdsZS1mbGlnaHQuanMnO1xuaW1wb3J0IHsgZ2V0V2FpdENvbnRpbnVhdGlvbkRpc3BhdGNoIH0gZnJvbSAnLi93YWl0LWNvbnRpbnVhdGlvbi5qcyc7XG5pbXBvcnQgeyBnZXRXb3JsZCB9IGZyb20gJy4vd29ybGQuanMnO1xuXG4vKiogVGlueSBtcyB0aW1lciB1c2luZyBwZXJmb3JtYW5jZS5ub3coKSDigJQgYWxyZWFkeSBtb25vdG9uaWMgb24gTm9kZS4gKi9cbmZ1bmN0aW9uIHRpY2soKTogbnVtYmVyIHtcbiAgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBzdXBwbGllZCBwcmVsb2FkZWQgZXZlbnRzIGluZGljYXRlIHRoaXMgaXMgdGhlXG4gKiBmaXJzdCB3b3JrZmxvdyBoYW5kbGVyIGludm9jYXRpb24gZm9yIHRoZSBydW4g4oCUIGkuZS4gdGhlIGxvZyBjb250YWluc1xuICogbm90aGluZyBiZXlvbmQgYHJ1bl9jcmVhdGVkYCAvIGBydW5fc3RhcnRlZGAuIEluIHRoYXQgY2FzZSB0aGVcbiAqIHByZWxvYWRlZCBldmVudHMgQVJFIHRoZSBjb21wbGV0ZSBldmVudCBsb2cgYW5kIHRoZSBgZXZlbnRzLmxpc3RgXG4gKiByb3VuZC10cmlwcyBjYW4gYmUgc2tpcHBlZCBlbnRpcmVseS5cbiAqXG4gKiBDcnVjaWFsbHksIGlmIHRoZSB3b3JsZCBiYWNrZmlsbGVkIGEgbWlzc2luZyBgcnVuX2NyZWF0ZWRgIHZpYSB0aGVcbiAqIHJlc2lsaWVudCBzdGFydCBwYXRoLCBgcHJlbG9hZGVkRXZlbnRzYCBjb250YWlucyBpdCBldmVuIHdoZW4gYSBmcmVzaFxuICogYGV2ZW50cy5saXN0YCBtaWdodCBub3QgKGV2ZW50dWFsIGNvbnNpc3RlbmN5KSwgc28gcHJlZmVycmluZyB0aGVcbiAqIHByZWxvYWRlZCBldmVudHMgb24gZmlyc3QgaW52b2NhdGlvbiBpcyBhbHNvIHRoZSBtb3JlIGNvcnJlY3QgY2hvaWNlLlxuICpcbiAqIFJldHVybnMgZmFsc2Ugd2hlbiBgcHJlbG9hZGVkRXZlbnRzYCBpcyBtaXNzaW5nL2VtcHR5IHNvIHRoZSBjYWxsZXJcbiAqIGZhbGxzIGJhY2sgdG8gdGhlIG5vcm1hbCBmZXRjaCBwYXRoLlxuICpcbiAqIEV4cG9ydGVkIGZvciB1bml0IHRlc3RpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0ZpcnN0SW52b2NhdGlvbihcbiAgcHJlbG9hZGVkRXZlbnRzOiByZWFkb25seSBFdmVudFtdIHwgdW5kZWZpbmVkXG4pOiBib29sZWFuIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHByZWxvYWRlZEV2ZW50cykgfHwgcHJlbG9hZGVkRXZlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gcHJlbG9hZGVkRXZlbnRzLmV2ZXJ5KFxuICAgIChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9jcmVhdGVkJyB8fCBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9zdGFydGVkJ1xuICApO1xufVxuXG4vKipcbiAqIFF1ZXVlIGEgc3RlcCBmb3IgYmFja2dyb3VuZCBleGVjdXRpb24gdmlhIHRoZSB1bmlmaWVkIHdvcmtmbG93IHF1ZXVlXG4gKiAoVjIgYXJjaGl0ZWN0dXJlKS4gVGhlIGNvbWJpbmVkIGhhbmRsZXIgaW4gcnVudGltZS50cyBkaXNwYXRjaGVzXG4gKiBtZXNzYWdlcyB3aXRoIGBzdGVwSWRgIHRvIGV4ZWN1dGVTdGVwLCB3aGljaCB3b3JrcyBmb3IgYm90aCBWTSBlbmdpbmVzLlxuICogYGRlbGF5U2Vjb25kc2Agc3VwcG9ydHMgcmV0cnkvdGhyb3R0bGUgYmFja29mZi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcXVldWVTdGVwTWVzc2FnZShwYXJhbXM6IHtcbiAgd29ybGQ6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgZ2V0V29ybGQ+PjtcbiAgcnVuSWQ6IHN0cmluZztcbiAgd29ya2Zsb3dSdW46IFdvcmtmbG93UnVuO1xuICBzdGVwOiBQZW5kaW5nU3RlcDtcbiAgZGVsYXlTZWNvbmRzPzogbnVtYmVyO1xuICAvKiogUXVldWUgbmFtZXNwYWNlIGZvciB0aGUgcHVibGlzaCAoc2VlIHJ1bnRpbWUudHMpLiAqL1xuICBuYW1lc3BhY2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqIFJ1bi1vcmlnaW4gdHJhY2UgY2FycmllciBhY2Nlc3NvciAoc2VlIHJ1bldvcmtmbG93V2l0aFF1aWNrSlMpLiAqL1xuICBuZXh0VHJhY2VDYXJyaWVyOiAoKSA9PiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuICAvKipcbiAgICogUHVibGlzaCBwdXJwb3NlLCB1c2VkIHRvIGJ1Y2tldCB0aGUgaWRlbXBvdGVuY3kga2V5LiBXb3JsZHMgcmV0aXJlXG4gICAqIHVzZWQga2V5cyAoVlFTIHJldGVudGlvbiBUVEwsIHdvcmxkLXBvc3RncmVzIGNvbXBsZXRlZC1rZXlzIGNhY2hlKSxcbiAgICogc28gYSBrZXkgc2hhcmVkIGFjcm9zcyBwdXJwb3NlcyBzaWxlbnRseSBzd2FsbG93cyB0aGUgc2Vjb25kXG4gICAqIHB1Ymxpc2gg4oCUIHNlZSB3YWl0LWNvbnRpbnVhdGlvbi50cyBmb3IgdGhlIHNhbWUgaGF6YXJkIG9uIHdhaXRcbiAgICoga2V5cy4gYGRpc3BhdGNoYCBpcyB0aGUgcGxhaW4gYmFja2dyb3VuZCBoYW5kb2ZmIChvdmVyZmxvdyAvIGNyYXNoXG4gICAqIHJlY292ZXJ5KSBhbmQgdXNlcyB0aGUgc3RlcC1pZGVudGl0eS1zY29wZWQgZGlzcGF0Y2gga2V5XG4gICAqIChzdGVwRGlzcGF0Y2hJZGVtcG90ZW5jeUtleSkgc28gaXQgc3RheXMgbXV0dWFsbHlcbiAgICogZXhjbHVzaXZlIHdpdGggdGhlIG5vZGUgZW5naW5lJ3MgZGlzcGF0Y2ggb2YgdGhlIHNhbWUgc3RlcDtcbiAgICogYGJhY2tzdG9wOjxlcG9jaD5gIGNvdmVycyBkZWxheWVkIGNyYXNoIGJhY2tzdG9wcywgc2NvcGVkIHRvIHRoZVxuICAgKiBvd25lcnNoaXAgZXBvY2ggc28gYSByZWZyZXNoZWQgbGVhc2UgcmUtYXJtcyBhIE5FVyBiYWNrc3RvcCBpbnN0ZWFkXG4gICAqIG9mIGJlaW5nIGFic29yYmVkIGJ5IHRoZSBpbi1mbGlnaHQgb25lOyBgcmV0cnk6PG4+YCBjb3ZlcnMgZGVsYXllZFxuICAgKiByZXRyeS90aHJvdHRsZSByZS1lbnF1ZXVlcywgc2NvcGVkIHRvIHRoZSBhdHRlbXB0IHNvIGVhY2ggYmFja29mZlxuICAgKiBob3AgaXMgZW5xdWV1ZWFibGUuXG4gICAqL1xuICBwdXJwb3NlOiAnZGlzcGF0Y2gnIHwgYGJhY2tzdG9wOiR7c3RyaW5nfWAgfCBgcmV0cnk6JHtudW1iZXJ9YDtcbiAgLyoqXG4gICAqIFJlc2lsaWVudCBzdGVwIGRpc3BhdGNoOiB0aGUgc2VyaWFsaXplZCAocG9zc2libHkgZW5jcnlwdGVkKSBzdGVwIGlucHV0XG4gICAqIHRvIGNhcnJ5IG9uIHRoZSBtZXNzYWdlIGFzIGBzdGVwSW5wdXRgLCBzbyB0aGUgY29uc3VtZXIgY2FuIGlkZW1wb3RlbnRseVxuICAgKiByZS1lbnN1cmUgdGhlIGBzdGVwX2NyZWF0ZWRgIGV2ZW50IGlmIHRoZSBwcm9kdWNlcidzIHBhcmFsbGVsIGRpcmVjdFxuICAgKiB3cml0ZSBmYWlsZWQgdHJhbnNpZW50bHkuIE9ubHkgc2V0IG9uIGBkaXNwYXRjaGAgcHVibGlzaGVzIHRoYXRcbiAgICogZGlzcGF0Y2hQZW5kaW5nT3BzIHBhcmFsbGVsaXplcyB3aXRoIHRoZSBzdGVwX2NyZWF0ZWQgd3JpdGUuXG4gICAqL1xuICBzdGVwSW5wdXQ/OiBVaW50OEFycmF5O1xuICB3ZmRpYWc6IChjaGVja3BvaW50OiBzdHJpbmcsIGZpZWxkczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQ7XG59KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICB3b3JsZCxcbiAgICBydW5JZCxcbiAgICB3b3JrZmxvd1J1bixcbiAgICBzdGVwLFxuICAgIGRlbGF5U2Vjb25kcyxcbiAgICBuYW1lc3BhY2UsXG4gICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICBwdXJwb3NlLFxuICAgIHN0ZXBJbnB1dCxcbiAgICB3ZmRpYWcsXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHRyYWNlQ2FycmllciA9IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKTtcbiAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgIHdvcmxkLFxuICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93UnVuLndvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICB7XG4gICAgICBydW5JZCxcbiAgICAgIHN0ZXBJZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgc3RlcE5hbWU6IHN0ZXAuc3RlcElkLFxuICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAuLi4oc3RlcElucHV0ICE9PSB1bmRlZmluZWQgPyB7IHN0ZXBJbnB1dDogeyBpbnB1dDogc3RlcElucHV0IH0gfSA6IHt9KSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIFRoZSAnZGlzcGF0Y2gnIGtleSBpcyBzdGVwLWlkZW50aXR5LXNjb3BlZCAoY29ycmVsYXRpb25JZCArIGhhc2hlZFxuICAgICAgLy8gc3RlcCBuYW1lKSDigJQgc2hhcmVkIHdpdGggdGhlIG5vZGUgZW5naW5lJ3MgZGlzcGF0Y2ggb2YgdGhlIHNhbWUgc3RlcFxuICAgICAgLy8gc28gdGhlIHR3byBzdGF5IG11dHVhbGx5IGV4Y2x1c2l2ZSwgd2l0aG91dCBhIHJldm9rZWQgcmVzaWxpZW50XG4gICAgICAvLyBtZXNzYWdlIGFic29yYmluZyBhIHJlYXNzaWduZWQgY29ycmVsYXRpb24gaWQncyBsZWdpdGltYXRlIGRpc3BhdGNoLlxuICAgICAgLy8gU2VlIHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5LlxuICAgICAgaWRlbXBvdGVuY3lLZXk6XG4gICAgICAgIHB1cnBvc2UgPT09ICdkaXNwYXRjaCdcbiAgICAgICAgICA/IHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5KHN0ZXAuY29ycmVsYXRpb25JZCwgc3RlcC5zdGVwSWQpXG4gICAgICAgICAgOiBgJHtzdGVwLmNvcnJlbGF0aW9uSWR9OiR7cHVycG9zZX1gLFxuICAgICAgLi4uKGRlbGF5U2Vjb25kcyAmJiBkZWxheVNlY29uZHMgPiAwID8geyBkZWxheVNlY29uZHMgfSA6IHt9KSxcbiAgICB9XG4gICk7XG4gIHdmZGlhZygnc3RlcF9xdWV1ZWQnLCB7XG4gICAgc3RlcElkOiBzdGVwLnN0ZXBJZCxcbiAgICBjb3JyZWxhdGlvbklkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgcHVycG9zZSxcbiAgICBkZWxheVNlY29uZHM6IGRlbGF5U2Vjb25kcyA/PyAwLFxuICAgIC4uLihzdGVwSW5wdXQgIT09IHVuZGVmaW5lZCA/IHsgcmVzaWxpZW50OiB0cnVlIH0gOiB7fSksXG4gIH0pO1xufVxuXG4vKipcbiAqIERpc3BhdGNoIGR1cmFibGUgc2lkZSBlZmZlY3RzIGZvciBhIHNldCBvZiBwZW5kaW5nIFZNIG9wZXJhdGlvbnM6XG4gKiBzdGVwX2NyZWF0ZWQgKCsgb3B0aW9uYWwgcXVldWVpbmcpLCBob29rX2NyZWF0ZWQgLyBob29rX3JlY2VpdmVkIChhYm9ydHMpLFxuICogYXR0cl9zZXQsIGhvb2tfZGlzcG9zZWQsIGFuZCB3YWl0X2NyZWF0ZWQgZXZlbnRzLlxuICpcbiAqIFN0ZXBzIGFyZSBjcmVhdGVkIGJ1dCAodXN1YWxseSkgbm90IHF1ZXVlZCBoZXJlIOKAlCBxdWV1ZWluZyAob3IgaW5saW5lXG4gKiBleGVjdXRpb24pIGlzIHRoZSBjYWxsZXIncyBkZWNpc2lvbi4gVXNlZCBib3RoIGZvciBzdXNwZW5zaW9uXG4gKiBwcm9jZXNzaW5nICh0aGUgaW5saW5lIGxvb3ApIGFuZCBmb3IgdGhlIHRlcm1pbmFsIGRyYWluIChmbHVzaGluZ1xuICogbGVmdG92ZXIgc2lkZSBlZmZlY3RzIHdoZW4gdGhlIHdvcmtmbG93IGNvbXBsZXRlZCBvciBmYWlsZWQsIG1pcnJvcmluZ1xuICogdGhlIG5vZGU6dm0gZW5naW5lJ3MgZHJhaW5QZW5kaW5nUXVldWVJdGVtcykuXG4gKlxuICogVGhlIG9uZSBleGNlcHRpb24gaXMgcmVzaWxpZW50IHN0ZXAgZGlzcGF0Y2g6IGZvciBzdGVwIGNpZHMgbmFtZWQgaW5cbiAqIGBxdWV1ZVN0ZXBDaWRzYCAodGhlIGNhbGxlcidzIG92ZXJmbG93IHN0ZXBzKSB0aGF0IHBhc3MgdGhlIGVsaWdpYmlsaXR5XG4gKiBnYXRlcywgdGhlIHN0ZXBfY3JlYXRlZCB3cml0ZSBpcyBwYXJhbGxlbGl6ZWQgd2l0aCB0aGUgc3RlcCdzIHF1ZXVlXG4gKiBwdWJsaXNoIOKAlCB0aGUgbWVzc2FnZSBjYXJyaWVzIHRoZSBzZXJpYWxpemVkIGlucHV0IChgc3RlcElucHV0YCkgc28gdGhlXG4gKiBjb25zdW1lciBjYW4gaWRlbXBvdGVudGx5IHJlLWVuc3VyZSB0aGUgZXZlbnQgaWYgdGhlIGRpcmVjdCB3cml0ZSBmYWlsZWRcbiAqIHRyYW5zaWVudGx5LiBTdGVwcyBxdWV1ZWQgdGhpcyB3YXkgYXJlIHJlcG9ydGVkIGluIGBxdWV1ZWRTdGVwQ2lkc2A7IHRoZVxuICogY2FsbGVyIHF1ZXVlcyB0aGUgcmVzdCBpdHNlbGYuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRpc3BhdGNoUGVuZGluZ09wcyhwYXJhbXM6IHtcbiAgd29ybGQ6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgZ2V0V29ybGQ+PjtcbiAgcnVuSWQ6IHN0cmluZztcbiAgd29ya2Zsb3dSdW46IFdvcmtmbG93UnVuO1xuICBlbmNyeXB0aW9uS2V5OiBSdW5QYXlsb2FkS2V5cyB8IHVuZGVmaW5lZDtcbiAgcGVuZGluZ09wZXJhdGlvbnM6IFBlbmRpbmdPcGVyYXRpb25bXTtcbiAgLyoqXG4gICAqIFN0ZXAgY2lkcyB3aG9zZSBgc3RlcF9jcmVhdGVkYCBtdXN0IE5PVCBiZSB3cml0dGVuIGhlcmU6IHRoZSBpbmxpbmVcbiAgICogbG9vcCBjbGFpbXMgdGhlc2UgYXRvbWljYWxseSB2aWEgYSBsYXp5IGBzdGVwX3N0YXJ0ZWRgIChjYXJyeWluZyB0aGVcbiAgICogaW5wdXQpLCBzbyBhIGNvbmN1cnJlbnQgY2xhaW1hbnQgbG9zZXMgd2l0aCBFbnRpdHlDb25mbGljdEVycm9yXG4gICAqIGluc3RlYWQgb2YgYm90aCBpbnZvY2F0aW9ucyBiYXJlLXN0YXJ0aW5nIHRoZSBzYW1lIHN0ZXAuXG4gICAqL1xuICBza2lwU3RlcENyZWF0aW9uPzogU2V0PHN0cmluZz47XG4gIC8qKlxuICAgKiBTdGVwIGNpZHMgdGhlIGNhbGxlciBpbnRlbmRzIHRvIGhhbmQgdG8gdGhlIHF1ZXVlIHRoaXMgdHVybiAob3ZlcmZsb3dcbiAgICogc3RlcHMgYmV5b25kIHRoZSBpbmxpbmUgY2FwKS4gRWxpZ2libGUgb25lcyBhcmUgcHVibGlzaGVkIGhlcmUsIGluXG4gICAqIHBhcmFsbGVsIHdpdGggdGhlaXIgc3RlcF9jcmVhdGVkIHdyaXRlIChyZXNpbGllbnQgc3RlcCBkaXNwYXRjaCksIGFuZFxuICAgKiByZXBvcnRlZCBiYWNrIGluIGBxdWV1ZWRTdGVwQ2lkc2AuXG4gICAqL1xuICBxdWV1ZVN0ZXBDaWRzPzogU2V0PHN0cmluZz47XG4gIC8qKiBRdWV1ZSBuYW1lc3BhY2UgZm9yIGFsbCBtZXNzYWdlIHB1Ymxpc2hlcyAoc2VlIHJ1bnRpbWUudHMpLiAqL1xuICBuYW1lc3BhY2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFJ1bi1vcmlnaW4gdHJhY2UgY2FycmllciBhY2Nlc3NvciBmcm9tIHJ1bnRpbWUudHMuIEluIHRoZSBkZWZhdWx0XG4gICAqIGBsaW5rZWRgIHRyYWNlIG1vZGUgdGhpcyByZXR1cm5zIHRoZSBjYXJyaWVyIG9mIHRoZSBydW4ncyBPUklHSU5cbiAgICogY29udGV4dCAod29ya2Zsb3cuc3RhcnQpLCBzbyBldmVyeSBpbnZvY2F0aW9uIGxpbmtzIGJhY2sgdG8gdGhlXG4gICAqIHN0YXJ0IGluIGEgc3RhciDigJQgY2FwdHVyaW5nIHRoZSBjdXJyZW50IGNvbnRleHQgaGVyZSBpbnN0ZWFkIHdvdWxkXG4gICAqIGNoYWluIGludm9jYXRpb25zIHRvIGVhY2ggb3RoZXIgYW5kIGZyYWdtZW50IHRoZSBydW4gdmlldyBvbiBhc3luY1xuICAgKiBxdWV1ZXMuXG4gICAqL1xuICBuZXh0VHJhY2VDYXJyaWVyOiAoKSA9PiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuICB3ZmRpYWc6IChjaGVja3BvaW50OiBzdHJpbmcsIGZpZWxkczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQ7XG59KTogUHJvbWlzZTx7XG4gIGNyZWF0ZWRBdHRyaWJ1dGVFdmVudDogYm9vbGVhbjtcbiAgY3JlYXRlZEdldENvbmZsaWN0SG9vazogYm9vbGVhbjtcbiAgLyoqIFN0ZXAgY2lkcyBhbHJlYWR5IHB1Ymxpc2hlZCB2aWEgcmVzaWxpZW50IGRpc3BhdGNoIOKAlCBzZWUgYWJvdmUuICovXG4gIHF1ZXVlZFN0ZXBDaWRzOiBTZXQ8c3RyaW5nPjtcbn0+IHtcbiAgY29uc3Qge1xuICAgIHdvcmxkLFxuICAgIHJ1bklkLFxuICAgIHdvcmtmbG93UnVuLFxuICAgIGVuY3J5cHRpb25LZXksXG4gICAgcGVuZGluZ09wZXJhdGlvbnMsXG4gICAgbmFtZXNwYWNlLFxuICAgIG5leHRUcmFjZUNhcnJpZXIsXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHNraXBTdGVwQ3JlYXRpb24gPSBwYXJhbXMuc2tpcFN0ZXBDcmVhdGlvbjtcbiAgY29uc3QgcXVldWVTdGVwQ2lkcyA9IHBhcmFtcy5xdWV1ZVN0ZXBDaWRzO1xuICBjb25zdCB3ZmRpYWcgPSBwYXJhbXMud2ZkaWFnO1xuICAvLyBTdGVwIGNpZHMgcHVibGlzaGVkIHZpYSByZXNpbGllbnQgZGlzcGF0Y2ggYmVsb3cgKGNyZWF0ZSArIHF1ZXVlIGluXG4gIC8vIHBhcmFsbGVsLCBtZXNzYWdlIGNhcnJ5aW5nIGBzdGVwSW5wdXRgKS4gUmVwb3J0ZWQgdG8gdGhlIGNhbGxlciBzbyBpdFxuICAvLyBza2lwcyB0aGVtIGluIGl0cyBvd24gcXVldWVpbmcgcGFzcy5cbiAgY29uc3QgcXVldWVkU3RlcENpZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLy8gUmVzaWxpZW50IHN0ZXAgZGlzcGF0Y2ggZWxpZ2liaWxpdHksIHNoYXJlZCBieSBldmVyeSBzdGVwIG9wIGJlbG93ICh0aGVcbiAgLy8gcGVyLXN0ZXAgaW5wdXQtc2l6ZSBjaGVjayBpcyBhcHBsaWVkIGluc2lkZSB0aGUgb3ApOiBmZWF0dXJlIGVuYWJsZWQgYW5kXG4gIC8vIGEgYmluYXJ5LXNhZmUgKENCT1IpIHF1ZXVlIHRyYW5zcG9ydCBmb3IgdGhlIHJ1bi5cbiAgLy9cbiAgLy8gVW5saWtlIHRoZSBub2RlOnZtIHN1c3BlbnNpb24gaGFuZGxlcidzIGdhdGUgKHNlZVxuICAvLyBTdXNwZW5zaW9uSGFuZGxlclBhcmFtcy5zdGVwRGlzcGF0Y2gpLCB0aGVyZSBpcyBOTyBwcmVjb25kaXRpb24tZ3VhcmRcbiAgLy8gZ2F0ZSBoZXJlOiB0aGlzIGVuZ2luZSdzIHN0ZXBfY3JlYXRlZCB3cml0ZXMgYXJlIHVuZ3VhcmRlZCAobm8gc25hcHNob3RcbiAgLy8gaXMgYXR0YWNoZWQpLCBzbyBhIGd1YXJkLWVuZm9yY2luZyBXb3JsZCBjYW4gbmV2ZXIgNDEyLXJlamVjdCB0aGVtIOKAlFxuICAvLyB0aGUgY29uc3VtZXIncyByZS1lbnN1cmUgdGhlcmVmb3JlIGNhbm5vdCBtYXRlcmlhbGl6ZSBhIHN0ZXAgdGhlIGd1YXJkXG4gIC8vIHJlamVjdGVkLiBJZiB0aGlzIGVuZ2luZSBldmVyIGFkb3B0cyBndWFyZGVkIHN1c3BlbnNpb24gd3JpdGVzLCB0aGVcbiAgLy8gY2FwYWJpbGl0eSBnYXRlIGZyb20gdGhlIG5vZGU6dm0gaGFuZGxlciBtdXN0IGJlIGFkZGVkIGhlcmUgdG9vLlxuICBjb25zdCByZXNpbGllbnREaXNwYXRjaEVsaWdpYmxlID1cbiAgICBxdWV1ZVN0ZXBDaWRzICE9PSB1bmRlZmluZWQgJiZcbiAgICBxdWV1ZVN0ZXBDaWRzLnNpemUgPiAwICYmXG4gICAgaXNSZXNpbGllbnRTdGVwRGlzcGF0Y2hFbmFibGVkKCkgJiZcbiAgICAod29ya2Zsb3dSdW4uc3BlY1ZlcnNpb24gPz8gMCkgPj1cbiAgICAgIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DQk9SX1FVRVVFX1RSQU5TUE9SVDtcbiAgLy8gU2V0IHdoZW4gYSBob29rIHdpdGggYSBwYXJrZWQgZ2V0Q29uZmxpY3QoKSBhd2FpdGVyIGhhZCBpdHNcbiAgLy8gaG9va19jcmVhdGVkIHdyaXR0ZW4gdGhpcyBpbnZvY2F0aW9uLiBUaGUgd29ya2Zsb3cgbXVzdCBiZSByZS1pbnZva2VkXG4gIC8vIHNvIHJlcGxheSBjYW4gY29uZmlybSBjcmVhdGlvbiBhbmQgcmVzb2x2ZSB0aGUgYXdhaXRlci5cbiAgbGV0IGNyZWF0ZWRHZXRDb25mbGljdEhvb2sgPSBmYWxzZTtcbiAgLy8gU2V0IHdoZW4gYSBuZXcgYXR0cl9zZXQgZXZlbnQgaXMgd3JpdHRlbiB0aGlzIGludm9jYXRpb24uIFRoZVxuICAvLyB3b3JrZmxvdyBtdXN0IGJlIHJlLWludm9rZWQgdG8gY29uc3VtZSBpdCAocmVzb2x2aW5nIHRoZSBwZW5kaW5nXG4gIC8vIHNldEF0dHJpYnV0ZXMoKSBwcm9taXNlKSwgc28gdGhlIGVudHJ5cG9pbnQgcmVxdWV1ZXMgaW1tZWRpYXRlbHkg4oCUXG4gIC8vIHNhbWUgcGF0dGVybiBhcyBhbiBlbGFwc2VkIHdhaXQuXG4gIGxldCBjcmVhdGVkQXR0cmlidXRlRXZlbnQgPSBmYWxzZTtcbiAgY29uc3Qgb3BzUHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuXG4gIGNvbnN0IHByb2Nlc3NIb29rT3AgPSBhc3luYyAoaG9vazogUGVuZGluZ0hvb2spOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdRdWlja0pTIHJ1bnRpbWU6IHByb2Nlc3NpbmcgaG9vayBvcCcsIHtcbiAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgY29ycmVsYXRpb25JZDogaG9vay5jb3JyZWxhdGlvbklkLFxuICAgICAgdG9rZW46IGhvb2sudG9rZW4sXG4gICAgICB0b2tlblR5cGU6IHR5cGVvZiBob29rLnRva2VuLFxuICAgICAgaXNXZWJob29rOiBob29rLmlzV2ViaG9vayxcbiAgICAgIGlzU3lzdGVtOiBob29rLmlzU3lzdGVtLFxuICAgICAgaGFzQ3JlYXRlZEV2ZW50OiBob29rLmhhc0NyZWF0ZWRFdmVudCxcbiAgICAgIGFib3J0UmVxdWVzdGVkOiBob29rLmFib3J0UmVxdWVzdGVkLFxuICAgIH0pO1xuXG4gICAgaWYgKCFob29rLmhhc0NyZWF0ZWRFdmVudCkge1xuICAgICAgLy8gYGhvb2subWV0YWRhdGFgIGlzIHRoZSBmb3JtYXQtcHJlZml4ZWQgZGV2YWx1ZSBieXRlc1xuICAgICAgLy8gcHJvZHVjZWQgYnkgYGdsb2JhbFRoaXNbU3ltYm9sLmZvcignd29ya2Zsb3ctc2VyaWFsaXplJyldXG4gICAgICAvLyAob3B0aW9ucy5tZXRhZGF0YSlgIGluc2lkZSB0aGUgVk0uIEVuY3J5cHQgb24gdGhlIGhvc3RcbiAgICAgIC8vIHNpZGUgYmVmb3JlIHdyaXRpbmcg4oCUIG1hdGNoZXMgdGhlIG5vZGU6dm0gZW5naW5lJ3NcbiAgICAgIC8vIGBkZWh5ZHJhdGVTdGVwQXJndW1lbnRzYCBmbG93LlxuICAgICAgLy9cbiAgICAgIC8vIE5vIHByZS1jaGVjayB2aWEgaG9va3MubGlzdDogd2l0aCBkZXRlcm1pbmlzdGljIGNvcnJlbGF0aW9uSWRzXG4gICAgICAvLyAoc2FtZSBWTSBzZWVkIGFjcm9zcyByZXBsYXlzKSBhbmQgcGVyLShydW5JZCwgY29ycmVsYXRpb25JZClcbiAgICAgIC8vIHVuaXF1ZW5lc3MgaW4gd29ybGRzLCB0aGUgc3RvcmFnZSBsYXllciByZWplY3RzIGR1cGxpY2F0ZXMgYXNcbiAgICAgIC8vIEVudGl0eUNvbmZsaWN0RXJyb3IsIHdoaWNoIHdlIHN3YWxsb3cgYmVsb3cuIFRoaXMgZHJvcHMgb25lXG4gICAgICAvLyBuZXR3b3JrIHJvdW5kLXRyaXAgcGVyIHBlbmRpbmcgaG9vay5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVuY3J5cHRlZE1ldGFkYXRhID1cbiAgICAgICAgICB0eXBlb2YgaG9vay5tZXRhZGF0YSA9PT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICA6IGF3YWl0IGVuY3J5cHRTZXJpYWxpemVkRGF0YShob29rLm1ldGFkYXRhLCBlbmNyeXB0aW9uS2V5KTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShydW5JZCwge1xuICAgICAgICAgIGV2ZW50VHlwZTogJ2hvb2tfY3JlYXRlZCcsXG4gICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGhvb2suY29ycmVsYXRpb25JZCxcbiAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgIHRva2VuOiBob29rLnRva2VuLFxuICAgICAgICAgICAgdG9rZW5SZXRlbnRpb25VbnRpbDpcbiAgICAgICAgICAgICAgaG9vay50b2tlblJldGVudGlvblVudGlsID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIDogbmV3IERhdGUoaG9vay50b2tlblJldGVudGlvblVudGlsKSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBlbmNyeXB0ZWRNZXRhZGF0YSxcbiAgICAgICAgICAgIC8vIEFsd2F5cyBpbmNsdWRlIGlzV2ViaG9vayBleHBsaWNpdGx5LiBXb3JsZHMgZGVmYXVsdCBpdCB0b1xuICAgICAgICAgICAgLy8gYHRydWVgIHdoZW4gYWJzZW50LCB3aGljaCB3b3VsZCBicmVhayB0aGUgcHVibGljIHdlYmhvb2tcbiAgICAgICAgICAgIC8vIGVuZHBvaW50J3MgNDA0IGd1YXJkIGZvciBob29rcyBjcmVhdGVkIHZpYSBjcmVhdGVIb29rKCkuXG4gICAgICAgICAgICBpc1dlYmhvb2s6IGhvb2suaXNXZWJob29rLFxuICAgICAgICAgICAgLy8gU3lzdGVtIGhvb2tzIChBYm9ydENvbnRyb2xsZXIpIGFyZSBleGVtcHQgZnJvbSB1c2VyXG4gICAgICAgICAgICAvLyB0b2tlbiBuYW1lc3BhY2UgY29uZmxpY3QgY2hlY2tzLlxuICAgICAgICAgICAgLi4uKGhvb2suaXNTeXN0ZW0gPyB7IGlzU3lzdGVtOiB0cnVlIH0gOiB7fSksXG4gICAgICAgICAgfSBhcyBhbnksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIElmIHN0b3JhZ2UgZGV0ZWN0ZWQgYSByZWFsIHRva2VuIGNvbmZsaWN0IHdpdGggYW5vdGhlclxuICAgICAgICAvLyB3b3JrZmxvdydzIGhvb2ssIHJlLXF1ZXVlIHNvIHRoZSB3b3JrZmxvdyBoYW5kbGVyIGNhblxuICAgICAgICAvLyBwcm9jZXNzIHRoZSBjb25mbGljdCBldmVudCBhbmQgZmFpbCBncmFjZWZ1bGx5LlxuICAgICAgICBpZiAocmVzdWx0LmV2ZW50Py5ldmVudFR5cGUgPT09ICdob29rX2NvbmZsaWN0Jykge1xuICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgaWRlbXBvdGVuY3lLZXk6IGBob29rX2NvbmZsaWN0XyR7aG9vay5jb3JyZWxhdGlvbklkfWAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBBbHJlYWR5IGNyZWF0ZWQgYnkgYSBjb25jdXJyZW50IGludm9jYXRpb24g4oCUIGZhbGwgdGhyb3VnaFxuICAgICAgICAvLyB0byBhYm9ydCBwcm9jZXNzaW5nIGJlbG93IChpZiBhbnkpIGluc3RlYWQgb2YgYmFpbGluZy5cbiAgICAgICAgaWYgKCFFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIGlmIChob29rLmhhc0dldENvbmZsaWN0QXdhaXRlcikge1xuICAgICAgICBjcmVhdGVkR2V0Q29uZmxpY3RIb29rID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaG9vay5hYm9ydFJlcXVlc3RlZCkge1xuICAgICAgLy8gUmVjb3JkIHRoZSBhYm9ydCBkdXJhYmx5OiBhIGhvb2tfcmVjZWl2ZWQgZXZlbnQgY2FycnlpbmdcbiAgICAgIC8vIHRoZSBWTS1zZXJpYWxpemVkIGB7IGFib3J0ZWQ6IHRydWUsIHJlYXNvbiB9YCBwYXlsb2FkLFxuICAgICAgLy8gcGx1cyBhIGJlc3QtZWZmb3J0IHN0cmVhbSBwYWNrZXQgZm9yIHJlYWwtdGltZSBzdGVwXG4gICAgICAvLyBwcm9wYWdhdGlvbi4gTWlycm9ycyB0aGUgbm9kZTp2bSBlbmdpbmUncyBzdXNwZW5zaW9uXG4gICAgICAvLyBoYW5kbGVyIChob29rc05lZWRpbmdBYm9ydCkuXG4gICAgICBjb25zdCBhYm9ydFBheWxvYWQgPVxuICAgICAgICBob29rLmFib3J0UGF5bG9hZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXlcbiAgICAgICAgICA/ICgoYXdhaXQgZW5jcnlwdFNlcmlhbGl6ZWREYXRhKFxuICAgICAgICAgICAgICBob29rLmFib3J0UGF5bG9hZCxcbiAgICAgICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICAgICAgKSkgYXMgVWludDhBcnJheSlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHtcbiAgICAgICAgICBldmVudFR5cGU6ICdob29rX3JlY2VpdmVkJyxcbiAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgY29ycmVsYXRpb25JZDogaG9vay5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgdG9rZW46IGhvb2sudG9rZW4sXG4gICAgICAgICAgICBwYXlsb2FkOiBhYm9ydFBheWxvYWQsXG4gICAgICAgICAgfSBhcyBhbnksXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmICghRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICAvLyBzdHJlYW1OYW1lIGlzIGRlcml2ZWQgZnJvbSB0aGUgYWJvcnQgaG9vayB0b2tlblxuICAgICAgLy8gKGBhYnJ0X3tpZH1gIOKGkiBgc3RybV97aWR9X3N5c3RlbV9hYm9ydGApLlxuICAgICAgaWYgKGhvb2sudG9rZW4uc3RhcnRzV2l0aCgnYWJydF8nKSAmJiBhYm9ydFBheWxvYWQpIHtcbiAgICAgICAgY29uc3Qgc3RyZWFtTmFtZSA9IGBzdHJtXyR7aG9vay50b2tlbi5zbGljZSgnYWJydF8nLmxlbmd0aCl9X3N5c3RlbV9hYm9ydGA7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgd29ybGQuc3RyZWFtcy53cml0ZShydW5JZCwgc3RyZWFtTmFtZSwgYWJvcnRQYXlsb2FkKTtcbiAgICAgICAgICBhd2FpdCB3b3JsZC5zdHJlYW1zLmNsb3NlKHJ1bklkLCBzdHJlYW1OYW1lKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gQmVzdC1lZmZvcnQg4oCUIHRoZSBob29rIGV2ZW50IHByb3ZpZGVzIHRoZSBkdXJhYmxlXG4gICAgICAgICAgLy8gZmFsbGJhY2suXG4gICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICdRdWlja0pTIHJ1bnRpbWU6IGZhaWxlZCB0byB3cml0ZSBhYm9ydCBzdHJlYW0gcGFja2V0JyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGhvb2suY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3ZmRpYWcoJ2Fib3J0X3JlY29yZGVkJywge1xuICAgICAgICBjb3JyZWxhdGlvbklkOiBob29rLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgIHRva2VuOiBob29rLnRva2VuLFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHByb2Nlc3NIb29rRGlzcG9zZU9wID0gYXN5bmMgKFxuICAgIG9wOiBQZW5kaW5nSG9va0Rpc3Bvc2VcbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHtcbiAgICAgICAgZXZlbnRUeXBlOiAnaG9va19kaXNwb3NlZCcsXG4gICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgY29ycmVsYXRpb25JZDogb3AuY29ycmVsYXRpb25JZCxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkgcmV0dXJuO1xuICAgICAgLy8gRGlzcG9zaW5nIGEgaG9vayB3aG9zZSBlbnRpdHkgbm8gbG9uZ2VyIChvciBuZXZlcikgZXhpc3RzIGlzIGFuXG4gICAgICAvLyBpZGVtcG90ZW50IG5vLW9wOiB0aGUgZW50aXR5IG1heSBoYXZlIGJlZW4gdG9ybiBkb3duIGJ5IGFcbiAgICAgIC8vIGNvbmN1cnJlbnQgcnVuIGNhbmNlbGxhdGlvbiwgb3IgdGhlIGhvb2sgbWF5IGhhdmUgbG9zdCBpdHNcbiAgICAgIC8vIHRva2VuIGNsYWltIHRvIGEgY29uZmxpY3QuIFRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byByZWxlYXNlLlxuICAgICAgaWYgKEhvb2tOb3RGb3VuZEVycm9yLmlzKGVycikpIHJldHVybjtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH07XG5cbiAgLy8gSG9vayBvcGVyYXRpb25zIGFyZSBncm91cGVkIGJ5IHRva2VuIGFuZCBwcm9jZXNzZWQgU0VRVUVOVElBTExZIGluXG4gIC8vIGNvZGUgb3JkZXIgd2l0aGluIGVhY2ggZ3JvdXAsIG1pcnJvcmluZyB0aGUgbm9kZTp2bSBzdXNwZW5zaW9uXG4gIC8vIGhhbmRsZXIgKGhvb2tJdGVtc0J5VG9rZW4pOiBhIGRpc3Bvc2UoKSBvZiBhbiBlYXJsaWVyIGhvb2sgbXVzdFxuICAvLyByZWxlYXNlIHRoZSB0b2tlbiBiZWZvcmUgYSBsYXRlciBzYW1lLXRva2VuIGhvb2sncyBjcmVhdGlvbiBpc1xuICAvLyB2YWxpZGF0ZWQgYnkgdGhlIHdvcmxkIOKAlCBwYXJhbGxlbCBkaXNwYXRjaCB3b3VsZCBvdGhlcndpc2UgcmVjb3JkIGFcbiAgLy8gc3B1cmlvdXMgaG9va19jb25mbGljdCBhZ2FpbnN0IHRoZSBydW4ncyBvd24gZGlzcG9zZWQgaG9vayAoZS5nLiBhXG4gIC8vIGRpc3Bvc2XihpJyZWNyZWF0ZSBsb29wIHJldXNpbmcgb25lIHRva2VuKS4gRGlmZmVyZW50IHRva2VucyBoYXZlIG5vXG4gIC8vIGNsYWltIGludGVyYWN0aW9uLCBzbyB0b2tlbiBncm91cHMgcnVuIGluIHBhcmFsbGVsIHdpdGggZWFjaCBvdGhlclxuICAvLyBhbmQgd2l0aCB0aGUgbm9uLWhvb2sgb3BzIGJlbG93LlxuICBjb25zdCBob29rT3BzQnlUb2tlbiA9IG5ldyBNYXA8XG4gICAgc3RyaW5nLFxuICAgIChQZW5kaW5nSG9vayB8IFBlbmRpbmdIb29rRGlzcG9zZSlbXVxuICA+KCk7XG4gIGZvciAoY29uc3Qgb3Agb2YgcGVuZGluZ09wZXJhdGlvbnMpIHtcbiAgICBsZXQga2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKFxuICAgICAgb3AudHlwZSA9PT0gJ2hvb2snICYmXG4gICAgICAoIW9wLmhhc0NyZWF0ZWRFdmVudCB8fCAob3AgYXMgUGVuZGluZ0hvb2spLmFib3J0UmVxdWVzdGVkKVxuICAgICkge1xuICAgICAga2V5ID0gKG9wIGFzIFBlbmRpbmdIb29rKS50b2tlbjtcbiAgICB9IGVsc2UgaWYgKG9wLnR5cGUgPT09ICdob29rX2Rpc3Bvc2UnICYmICFvcC5oYXNDcmVhdGVkRXZlbnQpIHtcbiAgICAgIC8vIFBlci1vcCBmYWxsYmFjayBncm91cCB3aGVuIHRoZSB0b2tlbiBpcyB1bmtub3duIOKAlCBubyBvcmRlcmluZ1xuICAgICAgLy8gZ3VhcmFudGVlcywgbWF0Y2hpbmcgdGhlIHByZXZpb3VzIHBhcmFsbGVsIGJlaGF2aW9yLlxuICAgICAga2V5ID0gKG9wIGFzIFBlbmRpbmdIb29rRGlzcG9zZSkudG9rZW4gPz8gYF9fY2lkOiR7b3AuY29ycmVsYXRpb25JZH1gO1xuICAgIH1cbiAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGdyb3VwID0gaG9va09wc0J5VG9rZW4uZ2V0KGtleSk7XG4gICAgaWYgKGdyb3VwKSB7XG4gICAgICBncm91cC5wdXNoKG9wIGFzIFBlbmRpbmdIb29rIHwgUGVuZGluZ0hvb2tEaXNwb3NlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaG9va09wc0J5VG9rZW4uc2V0KGtleSwgW29wIGFzIFBlbmRpbmdIb29rIHwgUGVuZGluZ0hvb2tEaXNwb3NlXSk7XG4gICAgfVxuICB9XG4gIGZvciAoY29uc3QgZ3JvdXAgb2YgaG9va09wc0J5VG9rZW4udmFsdWVzKCkpIHtcbiAgICBvcHNQcm9taXNlcy5wdXNoKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBvcCBvZiBncm91cCkge1xuICAgICAgICAgIGlmIChvcC50eXBlID09PSAnaG9vaycpIHtcbiAgICAgICAgICAgIGF3YWl0IHByb2Nlc3NIb29rT3Aob3ApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCBwcm9jZXNzSG9va0Rpc3Bvc2VPcChvcCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSgpXG4gICAgKTtcbiAgfVxuXG4gIGZvciAoY29uc3Qgb3Agb2YgcGVuZGluZ09wZXJhdGlvbnMpIHtcbiAgICBpZiAoXG4gICAgICBvcC50eXBlID09PSAnc3RlcCcgJiZcbiAgICAgICFvcC5oYXNDcmVhdGVkRXZlbnQgJiZcbiAgICAgICFza2lwU3RlcENyZWF0aW9uPy5oYXMob3AuY29ycmVsYXRpb25JZClcbiAgICApIHtcbiAgICAgIGNvbnN0IHN0ZXAgPSBvcCBhcyBQZW5kaW5nU3RlcDtcbiAgICAgIG9wc1Byb21pc2VzLnB1c2goXG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgLy8gQ3JlYXRlIHN0ZXBfY3JlYXRlZCBldmVudC4gYHN0ZXAuaW5wdXRgIGlzIHRoZVxuICAgICAgICAgIC8vIGZvcm1hdC1wcmVmaXhlZCBkZXZhbHVlIGJ5dGVzIChcImRldmxcIiArIGRldmFsdWUpIHByb2R1Y2VkXG4gICAgICAgICAgLy8gYnkgYGdsb2JhbFRoaXNbU3ltYm9sLmZvcignd29ya2Zsb3ctc2VyaWFsaXplJyldKHthcmdzLFxuICAgICAgICAgIC8vIGNsb3N1cmVWYXJzLCB0aGlzVmFsfSlgIGluc2lkZSB0aGUgVk0uIFRoZSBWTSBoYXMgbm9cbiAgICAgICAgICAvLyBhY2Nlc3MgdG8gdGhlIENyeXB0b0tleSwgc28gZW5jcnlwdGlvbiBpcyBhcHBsaWVkIGhlcmVcbiAgICAgICAgICAvLyBvbiB0aGUgaG9zdCBzaWRlIOKAlCBtYXRjaGluZyB3aGF0XG4gICAgICAgICAgLy8gYGRlaHlkcmF0ZVN0ZXBBcmd1bWVudHNgIGRvZXMgaW4gdGhlIG5vZGU6dm0gZW5naW5lLlxuICAgICAgICAgIGNvbnN0IGVuY3J5cHRlZElucHV0ID0gYXdhaXQgZW5jcnlwdFNlcmlhbGl6ZWREYXRhKFxuICAgICAgICAgICAgc3RlcC5pbnB1dCxcbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gUmVzaWxpZW50IHN0ZXAgZGlzcGF0Y2g6IGZpcmUgdGhlIHN0ZXBfY3JlYXRlZCB3cml0ZSBhbmQgdGhlXG4gICAgICAgICAgLy8gc3RlcCdzIHF1ZXVlIHB1Ymxpc2ggaW4gcGFyYWxsZWwg4oCUIHRoZSBtZXNzYWdlIGNhcnJpZXMgdGhlXG4gICAgICAgICAgLy8gc2FtZSBzZXJpYWxpemVkIGlucHV0IChgc3RlcElucHV0YCkgc28gdGhlIGNvbnN1bWVyIGNhblxuICAgICAgICAgIC8vIGlkZW1wb3RlbnRseSByZS1lbnN1cmUgdGhlIGV2ZW50IGlmIHRoZSBkaXJlY3Qgd3JpdGUgZmFpbGVkXG4gICAgICAgICAgLy8gdHJhbnNpZW50bHkuIE1pcnJvcnMgdGhlIG5vZGU6dm0gc3VzcGVuc2lvbiBoYW5kbGVyIGFuZCB0aGVcbiAgICAgICAgICAvLyByZXNpbGllbnQgc3RhcnQgLyByZXNpbGllbnQgaG9vayByZXN1bWUgcGF0dGVybnMuIE9ubHkgZm9yXG4gICAgICAgICAgLy8gY2FsbGVyLWRlc2lnbmF0ZWQgb3ZlcmZsb3cgc3RlcHMgd2l0aCBpbnB1dHMgdGhlIHF1ZXVlXG4gICAgICAgICAgLy8gbWVzc2FnZSBjYW4gc2FmZWx5IGNhcnJ5IChiaW5hcnksIHVuZGVyIHRoZSBWUVMgc2l6ZSBjYXApLlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHJlc2lsaWVudERpc3BhdGNoRWxpZ2libGUgJiZcbiAgICAgICAgICAgIHF1ZXVlU3RlcENpZHM/LmhhcyhzdGVwLmNvcnJlbGF0aW9uSWQpICYmXG4gICAgICAgICAgICBlbmNyeXB0ZWRJbnB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgJiZcbiAgICAgICAgICAgIGVuY3J5cHRlZElucHV0LmJ5dGVMZW5ndGggPD0gTUFYX1JFU0lMSUVOVF9TVEVQX0lOUFVUX0JZVEVTXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBbY3JlYXRlUmVzdWx0LCBxdWV1ZVJlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW1xuICAgICAgICAgICAgICB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9jcmVhdGVkJyxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHN0ZXAuc3RlcElkLFxuICAgICAgICAgICAgICAgICAgaW5wdXQ6IGVuY3J5cHRlZElucHV0LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBxdWV1ZVN0ZXBNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgICBuZXh0VHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgICAgIHB1cnBvc2U6ICdkaXNwYXRjaCcsXG4gICAgICAgICAgICAgICAgc3RlcElucHV0OiBlbmNyeXB0ZWRJbnB1dCxcbiAgICAgICAgICAgICAgICB3ZmRpYWcsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAvLyBRdWV1ZSBmYWlsdXJlIGlzIGFsd2F5cyBmYXRhbCBmb3IgdGhpcyBkaXNwYXRjaCBwYXNzOlxuICAgICAgICAgICAgLy8gd2l0aG91dCB0aGUgbWVzc2FnZSB0aGUgc3RlcCB3b3VsZCByZWx5IG9uIHRoZSBjcmVhdGVcbiAgICAgICAgICAgIC8vIGFsb25lLCBhbmQgaWYgdGhlIGNyZWF0ZSBBTFNPIGZhaWxlZCB0aGVyZSB3b3VsZCBiZSBub1xuICAgICAgICAgICAgLy8gZHVyYWJsZSByZWNvcmQgYXQgYWxsLiBQcm9wYWdhdGluZyByZWRlbGl2ZXJzIHRoZVxuICAgICAgICAgICAgLy8gb3JjaGVzdHJhdG9yIG1lc3NhZ2UsIHdoaWNoIHJlLWNyZWF0ZXMgdGhlIChpZGVtcG90ZW50KVxuICAgICAgICAgICAgLy8gc3RlcF9jcmVhdGVkIGFuZCByZS1kaXNwYXRjaGVzLlxuICAgICAgICAgICAgaWYgKHF1ZXVlUmVzdWx0LnN0YXR1cyA9PT0gJ3JlamVjdGVkJykge1xuICAgICAgICAgICAgICB0aHJvdyBxdWV1ZVJlc3VsdC5yZWFzb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBxdWV1ZWRTdGVwQ2lkcy5hZGQoc3RlcC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICAgIGlmIChjcmVhdGVSZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVyciA9IGNyZWF0ZVJlc3VsdC5yZWFzb247XG4gICAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgICAvLyBDb25jdXJyZW50IGludm9jYXRpb24gd3JvdGUgaXQgZmlyc3Qg4oCUIHRoZSBtZXNzYWdlIGlzXG4gICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBvdXQ7IGl0cyBkdXBsaWNhdGUgcHVibGlzaCBkZWR1cGVzIG9uIHRoZVxuICAgICAgICAgICAgICAgIC8vIHNoYXJlZCBzdGVwLWlkZW50aXR5LXNjb3BlZCBpZGVtcG90ZW5jeSBrZXkuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChpc1JldHJ5YWJsZVdvcmxkRXJyb3IoZXJyKSkge1xuICAgICAgICAgICAgICAgIC8vIFJlc2lsaWVudDogdGhlIHdyaXRlIGZhaWxlZCB0cmFuc2llbnRseSAoNDI5IC8gNXh4IC9cbiAgICAgICAgICAgICAgICAvLyB0cmFuc3BvcnQpIGJ1dCB0aGUgc3RlcCBtZXNzYWdlIOKAlCBjYXJyeWluZyB0aGUgc2FtZVxuICAgICAgICAgICAgICAgIC8vIHNlcmlhbGl6ZWQgaW5wdXQg4oCUIHdhcyBwdWJsaXNoZWQsIHNvIHRoZSBjb25zdW1lclxuICAgICAgICAgICAgICAgIC8vIGlkZW1wb3RlbnRseSByZS1lbnN1cmVzIHRoZSBzdGVwX2NyZWF0ZWQgYmVmb3JlXG4gICAgICAgICAgICAgICAgLy8gZXhlY3V0aW5nLlxuICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICdTdGVwIGNyZWF0aW9uIGV2ZW50IHdyaXRlIGZhaWxlZCwgYnV0IHRoZSBzdGVwIHdhcyAnICtcbiAgICAgICAgICAgICAgICAgICAgJ2Rpc3BhdGNoZWQgdmlhIHRoZSBxdWV1ZS4gVGhlIHN0ZXBfY3JlYXRlZCBldmVudCAnICtcbiAgICAgICAgICAgICAgICAgICAgJ3dpbGwgYmUgZW5zdXJlZCBieSB0aGUgcXVldWUgY29uc3VtZXIuJyxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHN0ZXAuc3RlcElkLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgd2ZkaWFnKCdzdGVwX3Jlc2lsaWVudF9kaXNwYXRjaF9yZWNvdmVyZWQnLCB7XG4gICAgICAgICAgICAgICAgICBzdGVwSWQ6IHN0ZXAuc3RlcElkLFxuICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHtcbiAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9jcmVhdGVkJyxcbiAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzdGVwLnN0ZXBJZCxcbiAgICAgICAgICAgICAgICBpbnB1dDogZW5jcnlwdGVkSW5wdXQsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHJldHVybjtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBOT1RFOiBzdGVwIHF1ZXVlaW5nIGlzIG90aGVyd2lzZSB0aGUgY2FsbGVyJ3MgZGVjaXNpb24g4oCUIHRoZVxuICAgICAgICAgIC8vIGlubGluZSBsb29wIGV4ZWN1dGVzIGZyZXNoIHN0ZXBzIGluIHRoZSBsaXZlIFZNIGFuZCBvbmx5XG4gICAgICAgICAgLy8gcXVldWVzIHRoZSBvdmVyZmxvdyAvIHJldHJ5IC8gYmFja3N0b3AgY2FzZXMgKHNlZVxuICAgICAgICAgIC8vIHF1ZXVlU3RlcE1lc3NhZ2UpLlxuICAgICAgICB9KSgpXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAob3AudHlwZSA9PT0gJ2F0dHJpYnV0ZScgJiYgIW9wLmhhc0NyZWF0ZWRFdmVudCkge1xuICAgICAgY29uc3QgYXR0ciA9IG9wIGFzIFBlbmRpbmdBdHRyaWJ1dGU7XG4gICAgICBvcHNQcm9taXNlcy5wdXNoKFxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2F0dHJfc2V0JyxcbiAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBhdHRyLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgIGNoYW5nZXM6IGF0dHIuY2hhbmdlcyxcbiAgICAgICAgICAgICAgICB3cml0ZXI6IHsgdHlwZTogJ3dvcmtmbG93JyB9LFxuICAgICAgICAgICAgICAgIC4uLihhdHRyLmFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzXG4gICAgICAgICAgICAgICAgICA/IHsgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM6IHRydWUgfVxuICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgIH0gYXMgYW55LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjcmVhdGVkQXR0cmlidXRlRXZlbnQgPSB0cnVlO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAvLyBFdmVudCBhbHJlYWR5IGV4aXN0cyAoY29uY3VycmVudCBpbnZvY2F0aW9uKSDigJQgdGhlXG4gICAgICAgICAgICAgIC8vIHJlcGxheSBzdGlsbCBuZWVkcyB0byBjb25zdW1lIGl0LCBzbyByZXF1ZXVlLlxuICAgICAgICAgICAgICBjcmVhdGVkQXR0cmlidXRlRXZlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICB9KSgpXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAob3AudHlwZSA9PT0gJ3dhaXQnICYmICFvcC5oYXNDcmVhdGVkRXZlbnQpIHtcbiAgICAgIGNvbnN0IHdhaXQgPSBvcCBhcyBQZW5kaW5nV2FpdDtcbiAgICAgIG9wc1Byb21pc2VzLnB1c2goXG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHtcbiAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnd2FpdF9jcmVhdGVkJyxcbiAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiB3YWl0LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgIHJlc3VtZUF0OiBuZXcgRGF0ZSh3YWl0LnJlc3VtZUF0KSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkgcmV0dXJuO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBQZXItb3AgZGlzcGF0Y2ggcnVucyBpbiBwYXJhbGxlbC5cbiAgYXdhaXQgUHJvbWlzZS5hbGwob3BzUHJvbWlzZXMpO1xuXG4gIHJldHVybiB7IGNyZWF0ZWRBdHRyaWJ1dGVFdmVudCwgY3JlYXRlZEdldENvbmZsaWN0SG9vaywgcXVldWVkU3RlcENpZHMgfTtcbn1cblxuLyoqXG4gKiBSdW4gYSB3b3JrZmxvdyB1c2luZyB0aGUgUXVpY2tKUyBXQVNNIFZNIGVuZ2luZS5cbiAqXG4gKiBUaGlzIHJlcGxhY2VzIHRoZSBgbm9kZTp2bWAgcmVwbGF5IHBhdGggKHJ1bldvcmtmbG93ICsgRXZlbnRzQ29uc3VtZXIpXG4gKiB3aXRoIGEgUXVpY2tKUyBWTSBpbnZvY2F0aW9uIHRoYXQgcGVyZm9ybXMgdGhlIHNhbWUgZnVsbCBldmVudCByZXBsYXkuXG4gKlxuICogS05PV04gR0FQIOKAlCBzbG90IHNuYXBzaG90OiB1bmxpa2UgdGhlIG5vZGU6dm0gcGF0aCwgbm8gZXZlbnQgd3JpdGUgaW5cbiAqIHRoaXMgZmlsZSBjYXJyaWVzIHtAbGluayBDcmVhdGVFdmVudFBhcmFtcy5ldmVudENvdW50fSwgc28gYSBXb3JsZCBuZXZlclxuICogbGVhcm5zIHdoaWNoIGV2ZW50cyB0aGUgd3JpdGVyIGhhZCBub3Qgc2VlbiBhbmQgbmV2ZXIgcmVwb3J0cyB0aGVtIGJhY2suXG4gKiBUaGUgZW5naW5lIGN1cnJlbnRseSByZWxpZXMgb24gcGVyLShydW5JZCwgY29ycmVsYXRpb25JZCkgZXZlbnRcbiAqIHVuaXF1ZW5lc3MgKEVudGl0eUNvbmZsaWN0RXJyb3IgZGVkdXApIGFsb25lLiBUaGlzIGlzIGEgZGVsaWJlcmF0ZVxuICogc2ltcGxpZmljYXRpb24gd2hpbGUgdGhlIGVuZ2luZSBpcyBleHBlcmltZW50YWwg4oCUIHdpcmluZyB0aGUgc25hcHNob3QgaXNcbiAqIHRyYWNrZWQgZm9sbG93LXVwIHdvcms7IGFueW9uZSBhZGRpbmcgbmV3IHdyaXRlIHBhdGhzIGhlcmUgc2hvdWxkIG5vdFxuICogYXNzdW1lIHBhcml0eSB3aXRoIHRoZSBub2RlIGVuZ2luZSBvbiB0aGlzIGF4aXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5Xb3JrZmxvd1dpdGhRdWlja0pTKHBhcmFtczoge1xuICB3b3JrZmxvd0NvZGU6IHN0cmluZztcbiAgd29ya2Zsb3dOYW1lOiBzdHJpbmc7XG4gIHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1bjtcbiAgLyoqXG4gICAqIEV2ZW50cyByZXR1cm5lZCBpbmxpbmUgYnkgYGV2ZW50cy5jcmVhdGUoJ3J1bl9zdGFydGVkJywgLi4uKWAgb3IgYnlcbiAgICogdGhlIGxhenkgaG9vayBmYXN0IHBhdGgncyBgaG9va19yZWNlaXZlZGAgcHJlbG9hZC4gV2hlbiB0aGV5IGluZGljYXRlXG4gICAqIGEgZmlyc3QgaW52b2NhdGlvbiDigJQgb3Igd2hlbiBgcHJlbG9hZGVkRXZlbnRzQ29tcGxldGVgIGF0dGVzdHMgdGhleVxuICAgKiBhcmUgdGhlIGNvbXBsZXRlIGxvZyDigJQgdGhleSBhcmUgdXNlZCBhcyB0aGUgZXZlbnQgbG9nIGluc3RlYWQgb2ZcbiAgICogZmV0Y2hpbmcgdmlhIGBldmVudHMubGlzdGAsIG1hdGNoaW5nIHRoZSBub2RlOnZtIGVuZ2luZSdzIGZhc3QgcGF0aC5cbiAgICovXG4gIHByZWxvYWRlZEV2ZW50cz86IEV2ZW50W107XG4gIC8qKlxuICAgKiBUcnVlIHdoZW4gdGhlIGNhbGxlciBoYXMgdmFsaWRhdGVkIHRoYXQgYHByZWxvYWRlZEV2ZW50c2AgaXMgdGhlIHJ1bidzXG4gICAqIENPTVBMRVRFIGV2ZW50IGxvZyAoZS5nLiB0aGUgbGF6eSBob29rIGZhc3QgcGF0aCdzIGhhc01vcmUtZmFsc2VcbiAgICogcmVwbGF5IHByZWxvYWQpLiBUaGUgZmlyc3QtaW52b2NhdGlvbiBoZXVyaXN0aWMgYmVsb3cgb25seSByZWNvZ25pemVzXG4gICAqIHJ1bl9jcmVhdGVkL3J1bl9zdGFydGVkLW9ubHkgcHJlbG9hZHMsIHNvIHdpdGhvdXQgdGhpcyBhdHRlc3RhdGlvbiBhXG4gICAqIGhvb2stcmVzdW1lIHByZWxvYWQgd291bGQgYmUgZGlzY2FyZGVkIGFuZCByZWZldGNoZWQuXG4gICAqL1xuICBwcmVsb2FkZWRFdmVudHNDb21wbGV0ZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBSdW4gaW5wdXQgY2FycmllZCB0aHJvdWdoIHRoZSBxdWV1ZSBtZXNzYWdlIG9uIGZpcnN0IGRlbGl2ZXJ5LiBVc2VkXG4gICAqIGFzIGEgbGFzdC1yZXNvcnQgZmFsbGJhY2sgZm9yIGBydW5fY3JlYXRlZC5ldmVudERhdGEuaW5wdXRgIHdoZW5cbiAgICogdGhlIGV2ZW50IGxvZyBpcyBpbmNvbXBsZXRlLlxuICAgKi9cbiAgcnVuSW5wdXQ/OiBSdW5JbnB1dDtcbiAgLyoqXG4gICAqIFRoZSBwYXJlbnQgT1RlbCBzcGFuICh0aGUgb3V0ZXIgYFdPUktGTE9XIHt3b3JrZmxvd05hbWV9YCBzcGFuIGZyb21cbiAgICogYHJ1bnRpbWUudHNgKS4gV2hlbiBzdXBwbGllZCwgVk0gbGlmZWN5Y2xlIGF0dHJpYnV0ZXMgYXJlIGF0dGFjaGVkXG4gICAqIHRvIGl0IGZvciBlbmQtdG8tZW5kIHZpc2liaWxpdHkuXG4gICAqL1xuICBwYXJlbnRTcGFuPzogU3BhbjtcbiAgLyoqXG4gICAqIFNlcnZlci1zdXBwbGllZCBwZXItcnVuIGV2ZW50IGNlaWxpbmcgZnJvbSB0aGUgcnVuX3N0YXJ0ZWQgcmVzcG9uc2VcbiAgICogKHVuZGVmaW5lZCDih5Igbm8gZW5mb3JjZW1lbnQpLiBNaXJyb3JzIHRoZSBub2RlOnZtIGVuZ2luZSdzIGd1YXJkOlxuICAgKiBhIHJ1bmF3YXkgcnVuIGlzIGZhaWxlZCBvbmNlIGl0cyBsb2cgcmVhY2hlcyB0aGUgY2VpbGluZy4gVGhlIHRocm93XG4gICAqIHByb3BhZ2F0ZXMgdG8gdGhlIHJlcGxheSBsb29wJ3MgY2F0Y2ggaW4gcnVudGltZS50cyAodGhlIFF1aWNrSlNcbiAgICogZGlzcGF0Y2ggcnVucyBpbnNpZGUgdGhhdCBsb29wJ3MgdHJ5KSwgd2hpY2ggY2xhc3NpZmllcyBpdCBhbmRcbiAgICogcmVjb3JkcyBydW5fZmFpbGVkIHdpdGggTUFYX0VWRU5UU19FWENFRURFRC5cbiAgICovXG4gIG1heEV2ZW50c0xpbWl0PzogbnVtYmVyO1xuICAvKipcbiAgICogUXVldWUgZGVsaXZlcnkgYXR0ZW1wdCBvZiB0aGUgbWVzc2FnZSBkcml2aW5nIHRoaXMgaW52b2NhdGlvbiAoZnJvbVxuICAgKiB0aGUgcXVldWUgaGFuZGxlcidzIG1ldGFkYXRhOyAxID0gZmlyc3QgZGVsaXZlcnkpLiBTdXJmYWNlZCBpblxuICAgKiBkaWFnbm9zdGljczsgY3Jhc2ggcmVjb3ZlcnkgaXRzZWxmIGlzIGRyaXZlbiBieSB0aGUgb3duZXJzaGlwLWxlYXNlXG4gICAqIGRlY2lzaW9uIHRhYmxlIGluIHRoZSBsb29wLCBub3QgYnkgdGhlIGF0dGVtcHQgY291bnQuXG4gICAqL1xuICBkZWxpdmVyeUF0dGVtcHQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBRdWV1ZSBtZXNzYWdlIElEIG9mIHRoZSBkZWxpdmVyeSBkcml2aW5nIHRoaXMgaW52b2NhdGlvbiwgc3RhbXBlZCBhc1xuICAgKiBgb3duZXJNZXNzYWdlSWRgIG9uIGlubGluZSBsYXp5IHN0ZXAgY2xhaW1zIHNvIHdha2UgcmVwbGF5cyBkZWZlciB0b1xuICAgKiB0aGUgaW4tZmxpZ2h0IGJvZHkgaW5zdGVhZCBvZiByZXF1ZXVlaW5nIHRoZSBzdGVwLlxuICAgKi9cbiAgb3duZXJNZXNzYWdlSWQ/OiBzdHJpbmc7XG4gIC8qKiBSZXF1ZXN0IElEIG9mIHRoZSBxdWV1ZSBpbnZvY2F0aW9uLCB3aGVuIHRoZSBxdWV1ZSBwcm92aWRlcyBvbmUuICovXG4gIHJlcXVlc3RJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFF1ZXVlIG5hbWVzcGFjZSByZXNvbHZlZCBhdCByb3V0ZSByZWdpc3RyYXRpb24gKHJ1bnRpbWUudHMpLiBNdXN0IGJlXG4gICAqIHRocmVhZGVkIGludG8gZXZlcnkgbWVzc2FnZSBwdWJsaXNoOiB0aGUgYnVpbGRlcnMgYmFrZSB0aGUgbmFtZXNwYWNlXG4gICAqIGludG8gZ2VuZXJhdGVkIHJvdXRlcywgc28gY29uc3VtZXJzIGxpc3RlbiBvbiBgX188bnM+X3drZl93b3JrZmxvd18qYFxuICAgKiDigJQgYSBwdWJsaXNoIHdpdGhvdXQgaXQgbGFuZHMgb24gYF9fd2tmX3dvcmtmbG93XypgIGFuZCBpcyBuZXZlclxuICAgKiBwaWNrZWQgdXAuXG4gICAqL1xuICBuYW1lc3BhY2U/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBSdW4tb3JpZ2luIHRyYWNlIGNhcnJpZXIgYWNjZXNzb3IgZnJvbSBydW50aW1lLnRzXG4gICAqIChnZXROZXh0VHJhY2VDYXJyaWVyKS4gSW4gdGhlIGRlZmF1bHQgYGxpbmtlZGAgdHJhY2UgbW9kZSBldmVyeVxuICAgKiBpbnZvY2F0aW9uIG11c3QgbGluayBiYWNrIHRvIHRoZSBydW4ncyBvcmlnaW4gKHdvcmtmbG93LnN0YXJ0KSBpbiBhXG4gICAqIHN0YXI7IGNhcHR1cmluZyB0aGUgY3VycmVudCBpbnZvY2F0aW9uIGNvbnRleHQgaW5zdGVhZCB3b3VsZCBjaGFpblxuICAgKiBpbnZvY2F0aW9ucyB0byBlYWNoIG90aGVyIGFuZCBmcmFnbWVudCB0aGUgcnVuIHZpZXcgb24gYXN5bmMgcXVldWVzLlxuICAgKi9cbiAgbmV4dFRyYWNlQ2Fycmllcj86ICgpID0+IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG59KTogUHJvbWlzZTx7IHRpbWVvdXRTZWNvbmRzPzogbnVtYmVyIH0gfCB2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICB3b3JrZmxvd0NvZGUsXG4gICAgd29ya2Zsb3dOYW1lLFxuICAgIHdvcmtmbG93UnVuLFxuICAgIHByZWxvYWRlZEV2ZW50cyxcbiAgICBwcmVsb2FkZWRFdmVudHNDb21wbGV0ZSxcbiAgICBydW5JbnB1dCxcbiAgICBwYXJlbnRTcGFuLFxuICAgIG1heEV2ZW50c0xpbWl0LFxuICAgIGRlbGl2ZXJ5QXR0ZW1wdCxcbiAgICBvd25lck1lc3NhZ2VJZCxcbiAgICByZXF1ZXN0SWQsXG4gICAgbmFtZXNwYWNlLFxuICB9ID0gcGFyYW1zO1xuICAvLyBTdGFuZGFsb25lLWNhbGxlciBmYWxsYmFjayAodGVzdHMpOiB3aXRob3V0IGEgcnVudGltZS50cyBjYXJyaWVyXG4gIC8vIGFjY2Vzc29yLCBmYWxsIGJhY2sgdG8gdGhlIGN1cnJlbnQgaW52b2NhdGlvbiBjb250ZXh0LlxuICBjb25zdCBuZXh0VHJhY2VDYXJyaWVyID1cbiAgICBwYXJhbXMubmV4dFRyYWNlQ2FycmllciA/PyAoKCkgPT4gc2VyaWFsaXplVHJhY2VDYXJyaWVyKCkpO1xuICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkKCk7XG4gIGNvbnN0IHJ1bklkID0gd29ya2Zsb3dSdW4ucnVuSWQ7XG4gIGNvbnN0IGludm9jYXRpb25TdGFydCA9IHRpY2soKTtcblxuICAvLyBTdHJpcCB0aGUgaW5saW5lIHNvdXJjZSBtYXAgY29tbWVudCBiZWZvcmUgZXZhbHVhdGluZyB0aGUgYnVuZGxlIGluXG4gIC8vIHRoZSBRdWlja0pTIFZNLiBUaGUgbWFwIGlzIHB1cmVseSBob3N0LXNpZGUgbWV0YWRhdGEgZm9yXG4gIC8vIGByZW1hcEVycm9yU3RhY2tgIChjYWxsZWQgYmVsb3cgb24gd29ya2Zsb3cgZmFpbHVyZXMsIGFnYWluc3QgdGhlXG4gIC8vIE9SSUdJTkFMIGB3b3JrZmxvd0NvZGVgKS4gUXVpY2tKUyByZXRhaW5zIHNvdXJjZSB0ZXh0IGZvclxuICAvLyBzdGFjay10cmFjZSBsaW5lIGxvb2t1cHMsIHNvIHRoZSBmZXctTUIgYmFzZTY0IGNvbW1lbnQgd291bGQgYmxvYXRcbiAgLy8gdGhlIFZNIGhlYXAgZm9yIG5vIGJlbmVmaXQuXG4gIGNvbnN0IHdvcmtmbG93Q29kZUZvclZNID0gc3RyaXBJbmxpbmVTb3VyY2VNYXAod29ya2Zsb3dDb2RlKTtcblxuICAvLyBQZXItaW52b2NhdGlvbiBkaWFnbm9zdGljIGlkIHNvIGRlYnVnIGxvZ3MgY2FuIGJlIGNvcnJlbGF0ZWQgZXZlbiBpZlxuICAvLyB0aGUgc2FtZSBydW5JZCBpcyBwcm9jZXNzZWQgYnkgb3ZlcmxhcHBpbmcgaW52b2NhdGlvbnMgb24gZGlmZmVyZW50XG4gIC8vIGZ1bmN0aW9uIGluc3RhbmNlcy5cbiAgY29uc3QgaW52b2NhdGlvbklkID0gYGludl8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDEwKX1gO1xuXG4gIC8vIFN0cnVjdHVyZWQgcGVyLWNoZWNrcG9pbnQgZGlhZ25vc3RpYyBoZWxwZXIsIGdyZXAtZnJpZW5kbHkgYnkgcnVuSWQuXG4gIGNvbnN0IHdmZGlhZyA9IChjaGVja3BvaW50OiBzdHJpbmcsIGZpZWxkczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdRVUlDS0pTX1ZNX0RJQUcnLCB7XG4gICAgICBjaGVja3BvaW50LFxuICAgICAgcnVuSWQsXG4gICAgICBpbnZvY2F0aW9uSWQsXG4gICAgICB0RWxhcHNlZE1zOiBNYXRoLnJvdW5kKHRpY2soKSAtIGludm9jYXRpb25TdGFydCksXG4gICAgICAuLi5maWVsZHMsXG4gICAgfSk7XG4gIH07XG5cbiAgcGFyZW50U3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgLi4uQXR0cmlidXRlLldvcmtmbG93Vm0oJ3F1aWNranMnKSxcbiAgfSk7XG5cbiAgd2ZkaWFnKCdlbnRlcicsIHtcbiAgICB3b3JrZmxvd05hbWUsXG4gICAgZGVsaXZlcnlBdHRlbXB0LFxuICAgIGhhc1ByZWxvYWRlZEV2ZW50czpcbiAgICAgIEFycmF5LmlzQXJyYXkocHJlbG9hZGVkRXZlbnRzKSAmJiBwcmVsb2FkZWRFdmVudHMubGVuZ3RoID4gMCxcbiAgICBwcmVsb2FkZWRFdmVudENvdW50OiBwcmVsb2FkZWRFdmVudHM/Lmxlbmd0aCA/PyAwLFxuICAgIGhhc1J1bklucHV0OiAhIXJ1bklucHV0LFxuICB9KTtcblxuICAvLyBUaGUgd29ya2Zsb3dOYW1lIGZyb20gdGhlIHF1ZXVlIHRvcGljIGlzIGFscmVhZHkgdGhlIGZ1bGwgd29ya2Zsb3cgSURcbiAgLy8gKGUuZy4gXCJ3b3JrZmxvdy8vLi93b3JrZmxvd3MvMV9zaW1wbGUvL3NpbXBsZVwiKVxuICBjb25zdCB3b3JrZmxvd0lkID0gd29ya2Zsb3dOYW1lO1xuXG4gIC8vIFJlc29sdmUgdGhlIGVuY3J5cHRpb24ga2V5IHVwIGZyb250IOKAlCBuZWVkZWQgdG8gZGVjcnlwdCBldmVudFxuICAvLyBwYXlsb2FkcyBpbnNpZGUgdGhlIFZNIGFuZCB0byBlbmNyeXB0IGV2ZW50IHBheWxvYWRzIHdyaXR0ZW4gYmVsb3cuXG4gIC8vIFJlc29sdmUgdGhlIEZVTEwgY2FwYWJpbGl0eSAoc3ltbWV0cmljIEFFUyBrZXkgKyBYMjU1MTkga2V5cGFpciksIG5vdFxuICAvLyBqdXN0IGBpbXBvcnRLZXkocmF3S2V5KWA6IGEgcnVuIHJlYWRpbmcgaXRzIG93biBldmVudCBsb2cgY2FuIGVuY291bnRlclxuICAvLyBzZWFsZWQgKGBlbmNwYCkgaG9vayBwYXlsb2FkcyB0aGF0IGEgY3Jvc3MtZGVwbG95bWVudCBgcmVzdW1lSG9vaygpYFxuICAvLyB3cm90ZSB0byBpdCAoc2VhbGluZyBpcyBwcmVzZW5jZS1nYXRlZCBvbiB0aGUgcnVuJ3MgcHVibGlzaGVkXG4gIC8vIGVuY3J5cHRpb25QdWJsaWNLZXksIHdoaWNoIHRoZSBzaGFyZWQgc3RhcnQoKSBwYXRoIHN0YW1wcyByZWdhcmRsZXNzIG9mXG4gIC8vIGVuZ2luZSkuIEEgYmFyZSBzeW1tZXRyaWMga2V5IGNhbm5vdCBvcGVuIHRob3NlIGFuZCB3b3VsZCB3ZWRnZSB0aGUgcnVuXG4gIC8vIHJpZ2h0IGFmdGVyIGhvb2tfcmVjZWl2ZWQg4oCUIHRoZSBub2RlOnZtIGVuZ2luZSByZXNvbHZlcyB0aGUgc2FtZSBmdWxsXG4gIC8vIGNhcGFiaWxpdHkgdmlhIG1lbW9pemVFbmNyeXB0aW9uS2V5LlxuICBjb25zdCByYXdLZXkgPSBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuPy4od29ya2Zsb3dSdW4pO1xuICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gcmF3S2V5ID8gYXdhaXQgZGVyaXZlUnVuUGF5bG9hZEtleXMocmF3S2V5KSA6IHVuZGVmaW5lZDtcblxuICAvLyBMb2FkIHRoZSBGVUxMIGV2ZW50IGxvZyBmb3IgdGhlIHJ1bi4gT24gZmlyc3QgaW52b2NhdGlvbiB0aGVcbiAgLy8gcHJlbG9hZGVkIGV2ZW50cyBmcm9tIHRoZSBydW5fc3RhcnRlZCByZXNwb25zZSBhcmUgdGhlIGNvbXBsZXRlIGxvZ1xuICAvLyBhbmQgc2F2ZSB0aGUgZXZlbnRzLmxpc3Qgcm91bmQtdHJpcHM7IGEgY2FsbGVyLWF0dGVzdGVkIGNvbXBsZXRlXG4gIC8vIHByZWxvYWQgKGxhenkgaG9vayBmYXN0IHBhdGgpIGlzIHRydXN0ZWQgdGhlIHNhbWUgd2F5LlxuICBsZXQgZXZlbnRzOiBFdmVudFtdO1xuICBsZXQgZXZlbnRzRmV0Y2hlZFBhZ2VzID0gMDtcbiAgY29uc3QgdXNlUHJlbG9hZGVkID1cbiAgICAocHJlbG9hZGVkRXZlbnRzQ29tcGxldGUgPT09IHRydWUgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkocHJlbG9hZGVkRXZlbnRzKSAmJlxuICAgICAgcHJlbG9hZGVkRXZlbnRzLmxlbmd0aCA+IDApIHx8XG4gICAgaXNGaXJzdEludm9jYXRpb24ocHJlbG9hZGVkRXZlbnRzKTtcbiAgaWYgKHVzZVByZWxvYWRlZCAmJiBwcmVsb2FkZWRFdmVudHMpIHtcbiAgICBldmVudHMgPSBwcmVsb2FkZWRFdmVudHM7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgYWxsRXZlbnRzOiBFdmVudFtdID0gW107XG4gICAgbGV0IGN1cnNvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGhhc01vcmUgPSB0cnVlO1xuXG4gICAgd2hpbGUgKGhhc01vcmUpIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgd29ybGQuZXZlbnRzLmxpc3Qoe1xuICAgICAgICBydW5JZCxcbiAgICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICAgIHNvcnRPcmRlcjogJ2FzYycsXG4gICAgICAgICAgY3Vyc29yOiBjdXJzb3IgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIGxpbWl0OiAxMDAwLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBldmVudHNGZXRjaGVkUGFnZXMrKztcbiAgICAgIGFsbEV2ZW50cy5wdXNoKC4uLnJlc3BvbnNlLmRhdGEpO1xuICAgICAgLy8gVXBkYXRlIHRoZSBjdXJzb3IgdG8gdGhlIGxhc3Qgc3VjY2Vzc2Z1bGx5IGZldGNoZWQgcGFnZSdzIGN1cnNvci5cbiAgICAgIC8vIE9ubHkgdXBkYXRlIHdoZW4gd2UgZ290IHJlc3VsdHMg4oCUIHRoZSBmaW5hbCBlbXB0eS1wYWdlIHJlc3BvbnNlXG4gICAgICAvLyByZXR1cm5zIGN1cnNvcj1udWxsIHdoaWNoIHdlIG11c3QgTk9UIHVzZSAoaXQgd291bGQgcmVzZXQgdGhlIGN1cnNvcikuXG4gICAgICBpZiAocmVzcG9uc2UuY3Vyc29yKSB7XG4gICAgICAgIGN1cnNvciA9IHJlc3BvbnNlLmN1cnNvcjtcbiAgICAgIH1cbiAgICAgIGhhc01vcmUgPSByZXNwb25zZS5kYXRhLmxlbmd0aCA+IDAgJiYgcmVzcG9uc2UuY3Vyc29yICE9IG51bGw7XG4gICAgfVxuXG4gICAgZXZlbnRzID0gYWxsRXZlbnRzO1xuICB9XG5cbiAgLy8gRXZlbnQtbGltaXQgZ3VhcmQ6IGZhaWwgYSBydW5hd2F5IHJ1biBvbmNlIGl0cyBsb2cgcmVhY2hlcyB0aGVcbiAgLy8gc2VydmVyLXN1cHBsaWVkIGNlaWxpbmcg4oCUIHNhbWUgZW5mb3JjZW1lbnQgcG9pbnQgYXMgdGhlIG5vZGU6dm1cbiAgLy8gZW5naW5lJ3MgcmVwbGF5IGxvb3AuXG4gIGlmIChtYXhFdmVudHNMaW1pdCAhPT0gdW5kZWZpbmVkICYmIGV2ZW50cy5sZW5ndGggPj0gbWF4RXZlbnRzTGltaXQpIHtcbiAgICB0aHJvdyBuZXcgTWF4RXZlbnRzRXhjZWVkZWRFcnJvcihldmVudHMubGVuZ3RoLCBtYXhFdmVudHNMaW1pdCk7XG4gIH1cblxuICBwYXJlbnRTcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAuLi5BdHRyaWJ1dGUuUXVpY2tKU0V2ZW50c1ByZWxvYWRlZCh1c2VQcmVsb2FkZWQpLFxuICAgIC4uLkF0dHJpYnV0ZS5RdWlja0pTRXZlbnRzRmV0Y2hlZENvdW50KGV2ZW50cy5sZW5ndGgpLFxuICAgIC4uLkF0dHJpYnV0ZS5RdWlja0pTRXZlbnRzRmV0Y2hlZFBhZ2VzKGV2ZW50c0ZldGNoZWRQYWdlcyksXG4gIH0pO1xuXG4gIHdmZGlhZygnZXZlbnRzX2ZldGNoZWQnLCB7XG4gICAgZXZlbnRDb3VudDogZXZlbnRzLmxlbmd0aCxcbiAgICBldmVudHNGZXRjaGVkUGFnZXMsXG4gICAgdXNlUHJlbG9hZGVkLFxuICAgIGV2ZW50VHlwZXM6IGV2ZW50cy5yZWR1Y2U8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4oKGFjYywgZSkgPT4ge1xuICAgICAgYWNjW2UuZXZlbnRUeXBlXSA9IChhY2NbZS5ldmVudFR5cGVdID8/IDApICsgMTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pLFxuICB9KTtcblxuICAvLyBDaGVjayBmb3IgZWxhcHNlZCB3YWl0c1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBjb25zdCBjb21wbGV0ZWRXYWl0SWRzID0gbmV3IFNldChcbiAgICBldmVudHNcbiAgICAgIC5maWx0ZXIoKGUpID0+IGUuZXZlbnRUeXBlID09PSAnd2FpdF9jb21wbGV0ZWQnKVxuICAgICAgLm1hcCgoZSkgPT4gZS5jb3JyZWxhdGlvbklkKVxuICApO1xuICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgIGlmIChcbiAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3dhaXRfY3JlYXRlZCcgJiZcbiAgICAgIGV2ZW50LmNvcnJlbGF0aW9uSWQgJiZcbiAgICAgICFjb21wbGV0ZWRXYWl0SWRzLmhhcyhldmVudC5jb3JyZWxhdGlvbklkKVxuICAgICkge1xuICAgICAgY29uc3QgZXZlbnREYXRhID1cbiAgICAgICAgJ2V2ZW50RGF0YScgaW4gZXZlbnRcbiAgICAgICAgICA/IChldmVudC5ldmVudERhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCByZXN1bWVBdCA9IGV2ZW50RGF0YT8ucmVzdW1lQXQ7XG4gICAgICBpZiAocmVzdW1lQXQgJiYgbm93ID49IG5ldyBEYXRlKHJlc3VtZUF0IGFzIHN0cmluZykuZ2V0VGltZSgpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShydW5JZCwge1xuICAgICAgICAgICAgZXZlbnRUeXBlOiAnd2FpdF9jb21wbGV0ZWQnLFxuICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgY29ycmVsYXRpb25JZDogZXZlbnQuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAocmVzdWx0LmV2ZW50KSBldmVudHMucHVzaChyZXN1bHQuZXZlbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSBjb250aW51ZTtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBSZXNvbHZlIHRoZSB3b3JrZmxvdyBzZXJ2ZXIgcG9ydCBzbyBgZ2V0V29ya2Zsb3dNZXRhZGF0YSgpLnVybGAgaW5zaWRlXG4gIC8vIHRoZSBWTSBtYXRjaGVzIHdoYXQgdGhlIHN0ZXAtc2lkZSBoYW5kbGVyIHJlcG9ydHMuIFNraXBwZWQgb24gVmVyY2VsIOKAlFxuICAvLyB0aGUgVk0gcmVhZHMgVkVSQ0VMX1VSTCBkaXJlY3RseSBpbiB0aGF0IGVudmlyb25tZW50LlxuICBjb25zdCBpc1ZlcmNlbCA9IHByb2Nlc3MuZW52LlZFUkNFTF9VUkwgIT09IHVuZGVmaW5lZDtcbiAgY29uc3QgcG9ydCA9IGlzVmVyY2VsID8gdW5kZWZpbmVkIDogYXdhaXQgZ2V0UG9ydExhenkoKTtcblxuICAvLyBSdW4gdGhlIHdvcmtmbG93IGluIHRoZSBRdWlja0pTIFZNXG4gIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1F1aWNrSlMgcnVudGltZTogaW52b2tpbmcgVk0nLCB7XG4gICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgd29ya2Zsb3dJZCxcbiAgICBldmVudENvdW50OiBldmVudHMubGVuZ3RoLFxuICB9KTtcblxuICBjb25zdCBzZXNzaW9uID0gYXdhaXQgc3RhcnRRdWlja0pTV29ya2Zsb3coe1xuICAgIC8vIFBhc3MgdGhlIFNUUklQUEVEIGJ1bmRsZSB0byB0aGUgVk0gc28gdGhlIGlubGluZSBzb3VyY2UgbWFwXG4gICAgLy8gZG9lc24ndCBlbmQgdXAgaW4gdGhlIFF1aWNrSlMgaGVhcC4gVGhlIG9yaWdpbmFsICh1bnN0cmlwcGVkKVxuICAgIC8vIGB3b3JrZmxvd0NvZGVgIGlzIHN0aWxsIGtlcHQgaW4gdGhpcyBob3N0LXNpZGUgc2NvcGUgYW5kIGlzIHVzZWRcbiAgICAvLyBieSBgcmVtYXBFcnJvclN0YWNrYCBvbiB3b3JrZmxvdyBmYWlsdXJlcyBiZWxvdy5cbiAgICB3b3JrZmxvd0NvZGU6IHdvcmtmbG93Q29kZUZvclZNLFxuICAgIHdvcmtmbG93SWQsXG4gICAgd29ya2Zsb3dSdW4sXG4gICAgZXZlbnRzLFxuICAgIHdvcmxkQ2FwYWJpbGl0aWVzOiB3b3JsZC5jYXBhYmlsaXRpZXMsXG4gICAgZW5jcnlwdGlvbktleSxcbiAgICBwb3J0LFxuICAgIHJ1bklucHV0LFxuICB9KTtcbiAgbGV0IHJlc3VsdCA9IHNlc3Npb24ucmVzdWx0O1xuXG4gIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1F1aWNrSlMgcnVudGltZTogVk0gcmV0dXJuZWQnLCB7XG4gICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgY29tcGxldGVkOiAhIXJlc3VsdC5jb21wbGV0ZWQsXG4gICAgc3VzcGVuZGVkOiAhIXJlc3VsdC5zdXNwZW5kZWQsXG4gICAgZmFpbGVkOiAhIXJlc3VsdC5mYWlsZWQsXG4gICAgcGVuZGluZ09wc0NvdW50OiByZXN1bHQuc3VzcGVuZGVkPy5wZW5kaW5nT3BlcmF0aW9ucz8ubGVuZ3RoLFxuICB9KTtcblxuICB3ZmRpYWcoJ3ZtX3JldHVybmVkJywge1xuICAgIG91dGNvbWU6IHJlc3VsdC5jb21wbGV0ZWRcbiAgICAgID8gJ2NvbXBsZXRlZCdcbiAgICAgIDogcmVzdWx0LnN1c3BlbmRlZFxuICAgICAgICA/ICdzdXNwZW5kZWQnXG4gICAgICAgIDogcmVzdWx0LmZhaWxlZFxuICAgICAgICAgID8gJ2ZhaWxlZCdcbiAgICAgICAgICA6ICd1bmtub3duJyxcbiAgICBwZW5kaW5nT3BzQ291bnQ6IHJlc3VsdC5zdXNwZW5kZWQ/LnBlbmRpbmdPcGVyYXRpb25zPy5sZW5ndGggPz8gMCxcbiAgICBwZW5kaW5nT3BTdW1tYXJ5OiByZXN1bHQuc3VzcGVuZGVkPy5wZW5kaW5nT3BlcmF0aW9ucz8ubWFwKChwKSA9PiAoe1xuICAgICAgdHlwZTogcC50eXBlLFxuICAgICAgY29ycmVsYXRpb25JZDogcC5jb3JyZWxhdGlvbklkLFxuICAgICAgaGFzQ3JlYXRlZEV2ZW50OiBwLmhhc0NyZWF0ZWRFdmVudCxcbiAgICAgIC4uLihwLnR5cGUgPT09ICdzdGVwJyA/IHsgc3RlcElkOiAocCBhcyBQZW5kaW5nU3RlcCkuc3RlcElkIH0gOiB7fSksXG4gICAgfSkpLFxuICAgIGZhaWx1cmVNZXNzYWdlOiByZXN1bHQuZmFpbGVkPy5tZXNzYWdlLFxuICAgIGZhaWx1cmVOYW1lOiByZXN1bHQuZmFpbGVkPy5uYW1lLFxuICB9KTtcblxuICAvLyAtLS0tIElubGluZSBjb250aW51YXRpb24gbG9vcCAtLS0tXG4gIC8vXG4gIC8vIFdoaWxlIHRoZSB3b3JrZmxvdyBpcyBzdXNwZW5kZWQsIHRoaXMgbG9vcCBrZWVwcyB0aGUgVk0gYWxpdmUgYW5kXG4gIC8vIG1ha2VzIGFzIG11Y2ggZm9yd2FyZCBwcm9ncmVzcyBhcyBwb3NzaWJsZSB3aXRoaW4gb25lIGludm9jYXRpb246XG4gIC8vXG4gIC8vICAgMS4gRGlzcGF0Y2ggZHVyYWJsZSBzaWRlIGVmZmVjdHMgZm9yIHRoZSBzdXNwZW5zaW9uJ3MgcGVuZGluZyBvcHNcbiAgLy8gICAgICAoc3RlcF9jcmVhdGVkIC8gaG9va19jcmVhdGVkIC8gYXR0cl9zZXQgLyB3YWl0X2NyZWF0ZWQgL1xuICAvLyAgICAgIGhvb2tfcmVjZWl2ZWQgZm9yIGFib3J0cykgYW5kIGNvbXBsZXRlIGVsYXBzZWQgd2FpdHMuXG4gIC8vICAgMi4gRmVlZCBhbGwgbmV3bHkgcmVjb3JkZWQgZXZlbnRzIChhdHRyX3NldCwgaG9va19jcmVhdGVkLCBlbGFwc2VkXG4gIC8vICAgICAgd2FpdF9jb21wbGV0ZWQsIHRlcm1pbmFscyB3cml0dGVuIGJ5IGNvbmN1cnJlbnQgaW52b2NhdGlvbnMsIC4uLilcbiAgLy8gICAgICBpbnRvIHRoZSBMSVZFIFZNIHZpYSBzZXNzaW9uLmNvbnRpbnVlV2l0aEV2ZW50cyDigJQgcmVzdW1pbmdcbiAgLy8gICAgICBleGVjdXRpb24gZXhhY3RseSB3aGVyZSBpdCBsZWZ0IG9mZiwgbm8gZnJlc2gtVk0gcmUtcmVwbGF5LlxuICAvLyAgICAgIENoZWFwIHByb2dyZXNzIGlzIGZlZCBCRUZPUkUgcnVubmluZyBzdGVwIGJvZGllcyBzbyBwcm9taXNlXG4gIC8vICAgICAgY2hhaW5zIHRoYXQgYXJlIG5vdCBnYXRlZCBvbiBzdGVwcyAoaG9vay5nZXRDb25mbGljdCgpLFxuICAvLyAgICAgIHNldEF0dHJpYnV0ZXMoKSwgcmFjaW5nIHNsZWVwcykgYWR2YW5jZSBmaXJzdCBhbmQgY2FuIHN1cmZhY2VcbiAgLy8gICAgICBhZGRpdGlvbmFsIHBlbmRpbmcgc3RlcHMgZm9yIHRoZSBzYW1lIGlubGluZSBiYXRjaC5cbiAgLy8gICAzLiBPbmNlIG5vIGNoZWFwIHByb2dyZXNzIHJlbWFpbnMsIGV4ZWN1dGUgdXAgdG9cbiAgLy8gICAgICBnZXRNYXhJbmxpbmVTdGVwcygpIHN0ZXBzIGNyZWF0ZWQgYnkgVEhJUyBpbnZvY2F0aW9uIGlubGluZSAobm9cbiAgLy8gICAgICBxdWV1ZSByb3VuZC10cmlwKSwgaW4gcGFyYWxsZWwsIHdpdGggdGhlIHJlcGxheSBidWRnZXQgcGF1c2VkXG4gIC8vICAgICAgZHVyaW5nIHN0ZXAgYm9kaWVzIOKAlCBtaXJyb3JpbmcgdGhlIG5vZGU6dm0gZW5naW5lJ3MgaW5saW5lXG4gIC8vICAgICAgcmVwbGF5IGxvb3AuIE92ZXJmbG93IGFuZCByZXRyeS90aHJvdHRsZWQgc3RlcHMgYXJlIHF1ZXVlZCBmb3JcbiAgLy8gICAgICBiYWNrZ3JvdW5kIGV4ZWN1dGlvbi4gQSBkZWxheWVkIHdhaXQtY29udGludWF0aW9uIG1lc3NhZ2UgaXNcbiAgLy8gICAgICBlbnF1ZXVlZCBmb3IgdGhlIHNvb25lc3QgcGVuZGluZyB3YWl0IGZpcnN0LCBzbyByYWNpbmcgdGltZXJzXG4gIC8vICAgICAgZmlyZSBvbiB0aW1lIChpbiBhIHNlcGFyYXRlIGludm9jYXRpb24pIHdoaWxlIHN0ZXAgYm9kaWVzIGJsb2NrXG4gIC8vICAgICAgdGhpcyBvbmUuXG4gIC8vXG4gIC8vIFRoZSBsb29wIGV4aXRzIHdoZW4gdGhlIHdvcmtmbG93IHNldHRsZXMsIG5vIGZvcndhcmQgcHJvZ3Jlc3MgaXNcbiAgLy8gcG9zc2libGUgaW4tcHJvY2VzcywgdGhlIHJlcGxheSBidWRnZXQgaXMgZXhoYXVzdGVkLCBvciB0aGUgcnVuIGlzXG4gIC8vIGdvbmUuXG4gIGNvbnN0IHNlZW5FdmVudElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IGUgb2YgZXZlbnRzKSB7XG4gICAgaWYgKGUuZXZlbnRJZCkgc2VlbkV2ZW50SWRzLmFkZChlLmV2ZW50SWQpO1xuICB9XG4gIC8vIFN0ZXAgY2lkcyBhbHJlYWR5IGV4ZWN1dGVkIGlubGluZSBieSB0aGlzIGludm9jYXRpb24uXG4gIGNvbnN0IGV4ZWN1dGVkU3RlcElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAvLyBTdGVwcyBmb3Igd2hpY2ggVEhJUyBpbnZvY2F0aW9uIGFscmVhZHkgc2VudCBhIHF1ZXVlIG1lc3NhZ2UuXG4gIGNvbnN0IHF1ZXVlZFN0ZXBJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLy8gQWJvcnRzIFRISVMgaW52b2NhdGlvbiBhbHJlYWR5IHJlY29yZGVkIChob29rX3JlY2VpdmVkIHdyaXR0ZW4pIOKAlFxuICAvLyBndWFyZHMgYWdhaW5zdCByZS1yZWNvcmRpbmcgd2hlbiB0aGUgVk0tc2lkZSBmbGFnIGhhcyBub3QgYmVlblxuICAvLyBjbGVhcmVkIHlldCB3aXRoaW4gdGhlIHNhbWUgaXRlcmF0aW9uLlxuICBjb25zdCByZWNvcmRlZEFib3J0SWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIC8vIFdhaXRzIGZvciB3aGljaCBUSElTIGludm9jYXRpb24gYWxyZWFkeSBjb21wbGV0ZWQvc2NoZWR1bGVkIHdvcmsuXG4gIGNvbnN0IGNvbXBsZXRlZFdhaXRJZHMyID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIC8vIElubGluZS1vd25lcnNoaXAgc3RhdGUgcGVyIHN0ZXAgY29ycmVsYXRpb25JZCwgZGVyaXZlZCBmcm9tIGV2ZXJ5XG4gIC8vIGV2ZW50IHRoaXMgaW52b2NhdGlvbiBvYnNlcnZlcyAoaW5pdGlhbCBsb2cgKyBldmVyeSBmZWVkKSDigJQgdGhlXG4gIC8vIHF1aWNranMgYW5hbG9nIG9mIHRoZSByZXBsYXktZGVyaXZlZCBvd25lcnNoaXAgb24gdGhlIG5vZGUgZW5naW5lJ3NcbiAgLy8gU3RlcEludm9jYXRpb25RdWV1ZUl0ZW0gKHNlZSBzdGVwLW93bmVyc2hpcC50cykuIExhdGVzdC13aW5zOlxuICAvLyBldmVudHMgYXJyaXZlIGluIGxvZyBvcmRlciwgc28gYSBsYXRlciBzdGVwX3N0YXJ0ZWQgb3ZlcndyaXRlcyB0aGVcbiAgLy8gc3RhbXA7IGEgc3RlcF9yZXRyeWluZyBsYXBzZXMgb3duZXJzaGlwIHBlcm1hbmVudGx5IGZvciB0aGUgaWQuXG4gIGNvbnN0IHN0ZXBPd25lcnNoaXAgPSBuZXcgTWFwPFxuICAgIHN0cmluZyxcbiAgICB7IG93bmVyPzogc3RyaW5nOyBzdGFydGVkQXRNcz86IG51bWJlcjsgc2F3UmV0cnlpbmc6IGJvb2xlYW4gfVxuICA+KCk7XG4gIGNvbnN0IG9ic2VydmVFdmVudHNGb3JPd25lcnNoaXAgPSAob2JzZXJ2ZWQ6IEV2ZW50W10pOiB2b2lkID0+IHtcbiAgICBmb3IgKGNvbnN0IGUgb2Ygb2JzZXJ2ZWQpIHtcbiAgICAgIGlmIChlLmNvcnJlbGF0aW9uSWQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICBpZiAoZS5ldmVudFR5cGUgPT09ICdzdGVwX3N0YXJ0ZWQnKSB7XG4gICAgICAgIGNvbnN0IG93bmVyID1cbiAgICAgICAgICAnZXZlbnREYXRhJyBpbiBlICYmXG4gICAgICAgICAgZS5ldmVudERhdGEgJiZcbiAgICAgICAgICAnb3duZXJNZXNzYWdlSWQnIGluIGUuZXZlbnREYXRhICYmXG4gICAgICAgICAgdHlwZW9mIGUuZXZlbnREYXRhLm93bmVyTWVzc2FnZUlkID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgPyBlLmV2ZW50RGF0YS5vd25lck1lc3NhZ2VJZFxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHByaW9yID0gc3RlcE93bmVyc2hpcC5nZXQoZS5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgc3RlcE93bmVyc2hpcC5zZXQoZS5jb3JyZWxhdGlvbklkLCB7XG4gICAgICAgICAgb3duZXIsXG4gICAgICAgICAgc3RhcnRlZEF0TXM6IGUuY3JlYXRlZEF0ID8gK25ldyBEYXRlKGUuY3JlYXRlZEF0KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBzYXdSZXRyeWluZzogcHJpb3I/LnNhd1JldHJ5aW5nID8/IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoZS5ldmVudFR5cGUgPT09ICdzdGVwX3JldHJ5aW5nJykge1xuICAgICAgICBjb25zdCBwcmlvciA9IHN0ZXBPd25lcnNoaXAuZ2V0KGUuY29ycmVsYXRpb25JZCk7XG4gICAgICAgIHN0ZXBPd25lcnNoaXAuc2V0KGUuY29ycmVsYXRpb25JZCwge1xuICAgICAgICAgIC4uLihwcmlvciA/PyB7fSksXG4gICAgICAgICAgc2F3UmV0cnlpbmc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgb2JzZXJ2ZUV2ZW50c0Zvck93bmVyc2hpcChldmVudHMpO1xuICBjb25zdCBzY2hlZHVsZWRXYWl0Q29udGludWF0aW9ucyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBtYXhJbmxpbmVTdGVwcyA9IGdldE1heElubGluZVN0ZXBzKCk7XG4gIGNvbnN0IGJ1ZGdldCA9IG5ldyBSZXBsYXlCdWRnZXQoKTtcbiAgY29uc3Qgd29ya2Zsb3dTdGFydGVkQXQgPSB3b3JrZmxvd1J1bi5zdGFydGVkQXRcbiAgICA/ICt3b3JrZmxvd1J1bi5zdGFydGVkQXRcbiAgICA6IERhdGUubm93KCk7XG4gIGNvbnN0IHJvb3RSdW5JZCA9XG4gICAgKHdvcmtmbG93UnVuLmF0dHJpYnV0ZXMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCk/LltcbiAgICAgIFJPT1RfUlVOX0lEX0FUVFJJQlVURVxuICAgIF0gPz8gcnVuSWQ7XG4gIGxldCBpbmxpbmVTdGVwc0V4ZWN1dGVkID0gMDtcbiAgbGV0IHJ1bkdvbmUgPSBmYWxzZTtcbiAgLy8gU2V0IHdoZW4gdGhpcyBpbnZvY2F0aW9uIHdyb3RlIGFuIGV2ZW50IHRoZSB3b3JrZmxvdyBtdXN0IGNvbnN1bWUgdG9cbiAgLy8gbWFrZSBwcm9ncmVzcyAoYXR0cl9zZXQsIGdldENvbmZsaWN0LWF3YWl0ZWQgaG9va19jcmVhdGVkKSBhbmQgdGhlXG4gIC8vIGxvb3AgaGFzIG5vdCB5ZXQgcmVhZCBpdCBiYWNrIOKAlCBldmVudHVhbGx5LWNvbnNpc3RlbnQgbGlzdGluZ3MgY2FuXG4gIC8vIHJldHVybiAwIG5ldyBldmVudHMgcmlnaHQgYWZ0ZXIgYSB3cml0ZS4gSWYgaXQgaXMgc3RpbGwgc2V0IHdoZW4gdGhlXG4gIC8vIGxvb3AgZXhpdHMgc3VzcGVuZGVkLCB0aGUgZW50cnlwb2ludCByZXF1ZXVlcyBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mXG4gIC8vIGV4aXRpbmcgYXdhaXRpbmdfZXh0ZXJuYWwgd2l0aCB0aGUgdW5ibG9ja2luZyBldmVudCBhbHJlYWR5IHdyaXR0ZW5cbiAgLy8gYW5kIG5vdGhpbmcgc2NoZWR1bGVkIHRvIHJlYWQgaXQuXG4gIGxldCBwZW5kaW5nUmVxdWV1ZVNpZ25hbCA9IGZhbHNlO1xuXG4gIC8qKiBGZXRjaCBhbGwgZXZlbnRzIG5vdCB5ZXQgcHJvY2Vzc2VkIGJ5IHRoZSBsaXZlIFZNIChsb2cgb3JkZXIpLiAqL1xuICBjb25zdCBmZXRjaFVuc2VlbkV2ZW50cyA9IGFzeW5jICgpOiBQcm9taXNlPEV2ZW50W10+ID0+IHtcbiAgICBjb25zdCB1bnNlZW46IEV2ZW50W10gPSBbXTtcbiAgICBsZXQgY3Vyc29yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaGFzTW9yZSA9IHRydWU7XG4gICAgd2hpbGUgKGhhc01vcmUpIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgd29ybGQuZXZlbnRzLmxpc3Qoe1xuICAgICAgICBydW5JZCxcbiAgICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICAgIHNvcnRPcmRlcjogJ2FzYycsXG4gICAgICAgICAgY3Vyc29yOiBjdXJzb3IgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIGxpbWl0OiAxMDAwLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBmb3IgKGNvbnN0IGUgb2YgcmVzcG9uc2UuZGF0YSkge1xuICAgICAgICBpZiAoZS5ldmVudElkICYmIHNlZW5FdmVudElkcy5oYXMoZS5ldmVudElkKSkgY29udGludWU7XG4gICAgICAgIGlmIChlLmV2ZW50SWQpIHNlZW5FdmVudElkcy5hZGQoZS5ldmVudElkKTtcbiAgICAgICAgdW5zZWVuLnB1c2goZSk7XG4gICAgICB9XG4gICAgICBpZiAocmVzcG9uc2UuY3Vyc29yKSBjdXJzb3IgPSByZXNwb25zZS5jdXJzb3I7XG4gICAgICBoYXNNb3JlID0gcmVzcG9uc2UuZGF0YS5sZW5ndGggPiAwICYmIHJlc3BvbnNlLmN1cnNvciAhPSBudWxsO1xuICAgIH1cbiAgICBvYnNlcnZlRXZlbnRzRm9yT3duZXJzaGlwKHVuc2Vlbik7XG4gICAgcmV0dXJuIHVuc2VlbjtcbiAgfTtcblxuICB0cnkge1xuICAgIGxldCBpdGVyYXRpb24gPSAwO1xuICAgIHdoaWxlIChyZXN1bHQuc3VzcGVuZGVkICYmICFydW5Hb25lICYmICFidWRnZXQuaXNFeGhhdXN0ZWQoKSkge1xuICAgICAgaXRlcmF0aW9uKys7XG4gICAgICAvLyBSZS1jaGVjayB0aGUgZXZlbnQgY2VpbGluZyBldmVyeSB0dXJuOiB0aGUgbG9vcCBhcHBlbmRzIGV2ZW50cyBvblxuICAgICAgLy8gZWFjaCBjb250aW51ZVdpdGhFdmVudHMsIHNvIGEgc2luZ2xlIGludm9jYXRpb24gY2FuIG90aGVyd2lzZSBncm93XG4gICAgICAvLyB0aGUgbG9nIGFyYml0cmFyaWx5IGZhciBwYXN0IHRoZSBvcGVyYXRvcidzIGxpbWl0ICh0aGUgbm9kZSBlbmdpbmVcbiAgICAgIC8vIHJlLWNoZWNrcyBwZXIgcmVwbGF5IGZvciB0aGUgc2FtZSByZWFzb24pLiBgc2VlbkV2ZW50SWRzYCBjb3VudHNcbiAgICAgIC8vIGV2ZXJ5IGV2ZW50IHRoaXMgaW52b2NhdGlvbiBoYXMgb2JzZXJ2ZWQg4oCUIGluaXRpYWwgbG9nICsgYWxsXG4gICAgICAvLyBmZWVkcy5cbiAgICAgIGlmIChtYXhFdmVudHNMaW1pdCAhPT0gdW5kZWZpbmVkICYmIHNlZW5FdmVudElkcy5zaXplID49IG1heEV2ZW50c0xpbWl0KSB7XG4gICAgICAgIHRocm93IG5ldyBNYXhFdmVudHNFeGNlZWRlZEVycm9yKHNlZW5FdmVudElkcy5zaXplLCBtYXhFdmVudHNMaW1pdCk7XG4gICAgICB9XG4gICAgICBjb25zdCBwZW5kaW5nT3BlcmF0aW9ucyA9IHJlc3VsdC5zdXNwZW5kZWQucGVuZGluZ09wZXJhdGlvbnM7XG5cbiAgICAgIC8vIFNlbGVjdCB0aGlzIHR1cm4ncyBpbmxpbmUgY2FuZGlkYXRlcyBCRUZPUkUgZGlzcGF0Y2g6IGZyZXNoIHN0ZXBzXG4gICAgICAvLyAobm8gc3RlcF9jcmVhdGVkIHlldCkgdGhhdCB0aGlzIGludm9jYXRpb24gaGFzbid0IGFscmVhZHkgaGFuZGxlZC5cbiAgICAgIC8vIFRoZWlyIHN0ZXBfY3JlYXRlZCBpcyBkZWxpYmVyYXRlbHkgTk9UIHdyaXR0ZW4gYnkgZGlzcGF0Y2gg4oCUIHRoZVxuICAgICAgLy8gaW5saW5lIGNsYWltIGJlbG93IGlzIGEgbGF6eSBzdGVwX3N0YXJ0ZWQgY2FycnlpbmcgdGhlIGlucHV0LFxuICAgICAgLy8gd2hpY2ggdGhlIHdvcmxkIGFwcGxpZXMgYXMgYW4gYXRvbWljIGNyZWF0ZS1jbGFpbS4gQSBjb25jdXJyZW50XG4gICAgICAvLyBpbnZvY2F0aW9uIHJhY2luZyBvbiB0aGUgc2FtZSBmcmVzaCBzdGVwIGxvc2VzIHRoYXQgY2xhaW0gd2l0aFxuICAgICAgLy8gRW50aXR5Q29uZmxpY3RFcnJvciBhbmQgc2tpcHMsIHNvIHN0ZXAgYm9kaWVzIGNhbm5vdCBkb3VibGUtcnVuXG4gICAgICAvLyAocHJldmlvdXNseSBib3RoIGludm9jYXRpb25zIGJhcmUtc3RhcnRlZCB0aGUgc3RlcCBhZnRlciBvbmUgbG9zdFxuICAgICAgLy8gdGhlIHN3YWxsb3dlZCBzdGVwX2NyZWF0ZWQgcmFjZSkuXG4gICAgICBjb25zdCBmcmVzaFN0ZXBzID0gcGVuZGluZ09wZXJhdGlvbnMuZmlsdGVyKFxuICAgICAgICAob3ApOiBvcCBpcyBQZW5kaW5nU3RlcCA9PlxuICAgICAgICAgIG9wLnR5cGUgPT09ICdzdGVwJyAmJlxuICAgICAgICAgICFvcC5oYXNDcmVhdGVkRXZlbnQgJiZcbiAgICAgICAgICAhZXhlY3V0ZWRTdGVwSWRzLmhhcyhvcC5jb3JyZWxhdGlvbklkKSAmJlxuICAgICAgICAgICFxdWV1ZWRTdGVwSWRzLmhhcyhvcC5jb3JyZWxhdGlvbklkKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGlubGluZUNhbmRpZGF0ZXMgPVxuICAgICAgICBtYXhJbmxpbmVTdGVwcyA8PSAwID8gW10gOiBmcmVzaFN0ZXBzLnNsaWNlKDAsIG1heElubGluZVN0ZXBzKTtcbiAgICAgIGNvbnN0IGlubGluZUNsYWltQ2lkcyA9IG5ldyBTZXQoXG4gICAgICAgIGlubGluZUNhbmRpZGF0ZXMubWFwKChzdGVwKSA9PiBzdGVwLmNvcnJlbGF0aW9uSWQpXG4gICAgICApO1xuXG4gICAgICAvLyAxLiBEdXJhYmxlIHNpZGUgZWZmZWN0cyBmb3IgdGhpcyBzdXNwZW5zaW9uJ3MgcGVuZGluZyBvcHMuXG4gICAgICBjb25zdCBvcHNUb0Rpc3BhdGNoID0gcGVuZGluZ09wZXJhdGlvbnMubWFwKChvcCkgPT5cbiAgICAgICAgb3AudHlwZSA9PT0gJ2hvb2snICYmXG4gICAgICAgIChvcCBhcyBQZW5kaW5nSG9vaykuYWJvcnRSZXF1ZXN0ZWQgJiZcbiAgICAgICAgcmVjb3JkZWRBYm9ydElkcy5oYXMob3AuY29ycmVsYXRpb25JZClcbiAgICAgICAgICA/ICh7IC4uLm9wLCBhYm9ydFJlcXVlc3RlZDogZmFsc2UgfSBhcyBQZW5kaW5nT3BlcmF0aW9uKVxuICAgICAgICAgIDogb3BcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IG9wIG9mIHBlbmRpbmdPcGVyYXRpb25zKSB7XG4gICAgICAgIGlmIChvcC50eXBlID09PSAnaG9vaycgJiYgKG9wIGFzIFBlbmRpbmdIb29rKS5hYm9ydFJlcXVlc3RlZCkge1xuICAgICAgICAgIHJlY29yZGVkQWJvcnRJZHMuYWRkKG9wLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBTdGVwcyBiZXlvbmQgdGhlIGlubGluZSBjYXAgYXJlIGhhbmRlZCB0byB0aGUgcXVldWUgaW4gdGhlIHNhbWVcbiAgICAgIC8vIHR1cm4gdGhlaXIgc3RlcF9jcmVhdGVkIGlzIHdyaXR0ZW4uIFdoZXJlIGVsaWdpYmxlLCB0aGUgZGlzcGF0Y2hcbiAgICAgIC8vIGJlbG93IHBhcmFsbGVsaXplcyBlYWNoIG92ZXJmbG93IHN0ZXAncyBzdGVwX2NyZWF0ZWQgd3JpdGUgd2l0aFxuICAgICAgLy8gaXRzIHF1ZXVlIHB1Ymxpc2ggKHJlc2lsaWVudCBzdGVwIGRpc3BhdGNoIOKAlCB0aGUgbWVzc2FnZSBjYXJyaWVzXG4gICAgICAvLyBgc3RlcElucHV0YCBzbyB0aGUgY29uc3VtZXIgY2FuIHJlLWVuc3VyZSB0aGUgZXZlbnQpOyB0aGUgcmVzdFxuICAgICAgLy8gYXJlIHF1ZXVlZCByaWdodCBhZnRlciwgaW4gcGFyYWxsZWwuIFRoaXMgbXVzdCBhbGwgaGFwcGVuIEJFRk9SRVxuICAgICAgLy8gdGhlIGV2ZW50IGZlZWQgYmVsb3c6IHRoZSBmZWVkIGFsd2F5cyBvYnNlcnZlcyB0aG9zZSB2ZXJ5XG4gICAgICAvLyBzdGVwX2NyZWF0ZWQgd3JpdGVzIGFzIHVuc2VlbiBldmVudHMgYW5kIGBjb250aW51ZWBzLCBzbyBhXG4gICAgICAvLyBoYW5kb2ZmIHBsYWNlZCBhZnRlciBpdCBpcyB1bnJlYWNoYWJsZSBvbiB0aGUgb25seSBpdGVyYXRpb25cbiAgICAgIC8vIHRoYXQgc3RpbGwgY2xhc3NpZmllcyB0aGVzZSBzdGVwcyBhcyBmcmVzaCDigJQgbmV4dCB0dXJuIHRoZXkgY2FycnlcbiAgICAgIC8vIGhhc0NyZWF0ZWRFdmVudCBhbmQgd291bGQgbmV2ZXIgYmUgcXVldWVkIGF0IGFsbCAodGhlIHdlZGdlIGJlaGluZFxuICAgICAgLy8gcHJvbWlzZVJhY2VTdHJlc3NUZXN0V29ya2Zsb3cgaGFuZ2luZyBpbiB0aGUgcXVpY2tqcyBDSSBsZWdzKS4gVGhlXG4gICAgICAvLyBzdGVwLWlkZW50aXR5LXNjb3BlZCBpZGVtcG90ZW5jeSBrZXkgbWFrZXMgcmVwZWF0cyBoYXJtbGVzcy5cbiAgICAgIGNvbnN0IG92ZXJmbG93U3RlcHMgPSBmcmVzaFN0ZXBzLnNsaWNlKGlubGluZUNhbmRpZGF0ZXMubGVuZ3RoKTtcbiAgICAgIGNvbnN0IGRpc3BhdGNoZWQgPSBhd2FpdCBkaXNwYXRjaFBlbmRpbmdPcHMoe1xuICAgICAgICB3b3JsZCxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIG5leHRUcmFjZUNhcnJpZXIsXG4gICAgICAgIHBlbmRpbmdPcGVyYXRpb25zOiBvcHNUb0Rpc3BhdGNoLFxuICAgICAgICBza2lwU3RlcENyZWF0aW9uOiBpbmxpbmVDbGFpbUNpZHMsXG4gICAgICAgIHF1ZXVlU3RlcENpZHM6IG5ldyBTZXQob3ZlcmZsb3dTdGVwcy5tYXAoKHMpID0+IHMuY29ycmVsYXRpb25JZCkpLFxuICAgICAgICB3ZmRpYWcsXG4gICAgICB9KTtcbiAgICAgIGlmIChcbiAgICAgICAgZGlzcGF0Y2hlZC5jcmVhdGVkQXR0cmlidXRlRXZlbnQgfHxcbiAgICAgICAgZGlzcGF0Y2hlZC5jcmVhdGVkR2V0Q29uZmxpY3RIb29rXG4gICAgICApIHtcbiAgICAgICAgcGVuZGluZ1JlcXVldWVTaWduYWwgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGNpZCBvZiBkaXNwYXRjaGVkLnF1ZXVlZFN0ZXBDaWRzKSB7XG4gICAgICAgIHF1ZXVlZFN0ZXBJZHMuYWRkKGNpZCk7XG4gICAgICB9XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgb3ZlcmZsb3dTdGVwc1xuICAgICAgICAgIC5maWx0ZXIoKHN0ZXApID0+ICFkaXNwYXRjaGVkLnF1ZXVlZFN0ZXBDaWRzLmhhcyhzdGVwLmNvcnJlbGF0aW9uSWQpKVxuICAgICAgICAgIC5tYXAoKHN0ZXApID0+IHtcbiAgICAgICAgICAgIHF1ZXVlZFN0ZXBJZHMuYWRkKHN0ZXAuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgICByZXR1cm4gcXVldWVTdGVwTWVzc2FnZSh7XG4gICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICAgICAgICAgICAgcHVycG9zZTogJ2Rpc3BhdGNoJyxcbiAgICAgICAgICAgICAgd2ZkaWFnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIC8vIENvbXBsZXRlIGVsYXBzZWQgd2FpdHMgc28gdGhlaXIgd2FpdF9jb21wbGV0ZWQgZXZlbnRzIGFyZSBwaWNrZWRcbiAgICAgIC8vIHVwIGJ5IHRoZSBmZWVkIGJlbG93IChpbnN0ZWFkIG9mIGEgcXVldWUgcmUtaW52b2NhdGlvbikuXG4gICAgICBjb25zdCB3YWl0Q29tcGxldGVQcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgICBmb3IgKGNvbnN0IG9wIG9mIHBlbmRpbmdPcGVyYXRpb25zKSB7XG4gICAgICAgIGlmIChvcC50eXBlICE9PSAnd2FpdCcpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCB3YWl0ID0gb3AgYXMgUGVuZGluZ1dhaXQ7XG4gICAgICAgIGlmIChjb21wbGV0ZWRXYWl0SWRzMi5oYXMod2FpdC5jb3JyZWxhdGlvbklkKSkgY29udGludWU7XG4gICAgICAgIGlmIChuZXcgRGF0ZSh3YWl0LnJlc3VtZUF0KS5nZXRUaW1lKCkgLSBEYXRlLm5vdygpID4gMCkgY29udGludWU7XG4gICAgICAgIGNvbXBsZXRlZFdhaXRJZHMyLmFkZCh3YWl0LmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICB3YWl0Q29tcGxldGVQcm9taXNlcy5wdXNoKFxuICAgICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnd2FpdF9jb21wbGV0ZWQnLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiB3YWl0LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHJldHVybjtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh3YWl0Q29tcGxldGVQcm9taXNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHdhaXRDb21wbGV0ZVByb21pc2VzKTtcbiAgICAgIH1cblxuICAgICAgLy8gMi4gQ2hlYXAgcHJvZ3Jlc3MgZmlyc3Q6IGZlZWQgbmV3bHkgcmVjb3JkZWQgZXZlbnRzIGludG8gdGhlIGxpdmVcbiAgICAgIC8vIFZNIGJlZm9yZSBibG9ja2luZyBvbiBzdGVwIGJvZGllcy5cbiAgICAgIHtcbiAgICAgICAgY29uc3QgbmV3RXZlbnRzID0gYXdhaXQgZmV0Y2hVbnNlZW5FdmVudHMoKTtcbiAgICAgICAgaWYgKG5ld0V2ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgLy8gVGhlIGxpc3RpbmcgY2F1Z2h0IHVwIHdpdGggdGhpcyBpbnZvY2F0aW9uJ3Mgd3JpdGVzIOKAlCBhbnlcbiAgICAgICAgICAvLyBhdHRyX3NldCAvIGdldENvbmZsaWN0IGhvb2tfY3JlYXRlZCBoYXMgYmVlbiAob3IgaXMgYmVpbmcpXG4gICAgICAgICAgLy8gY29uc3VtZWQgYnkgdGhlIGxpdmUgVk0sIHNvIG5vIGV4dGVybmFsIHJlcXVldWUgaXMgbmVlZGVkLlxuICAgICAgICAgIHBlbmRpbmdSZXF1ZXVlU2lnbmFsID0gZmFsc2U7XG4gICAgICAgICAgcmVzdWx0ID0gYXdhaXQgc2Vzc2lvbi5jb250aW51ZVdpdGhFdmVudHMobmV3RXZlbnRzKTtcbiAgICAgICAgICB3ZmRpYWcoJ2lubGluZV9pdGVyYXRpb24nLCB7XG4gICAgICAgICAgICBpdGVyYXRpb24sXG4gICAgICAgICAgICBwaGFzZTogJ2ZlZWQnLFxuICAgICAgICAgICAgZmVkRXZlbnRzOiBuZXdFdmVudHMubGVuZ3RoLFxuICAgICAgICAgICAgb3V0Y29tZTogcmVzdWx0LmNvbXBsZXRlZFxuICAgICAgICAgICAgICA/ICdjb21wbGV0ZWQnXG4gICAgICAgICAgICAgIDogcmVzdWx0LmZhaWxlZFxuICAgICAgICAgICAgICAgID8gJ2ZhaWxlZCdcbiAgICAgICAgICAgICAgICA6ICdzdXNwZW5kZWQnLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIDMuIE5vIGNoZWFwIHByb2dyZXNzIGxlZnQg4oCUIGV4ZWN1dGUgc3RlcHMgaW5saW5lLlxuICAgICAgY29uc3Qgc3RlcE9wcyA9IHBlbmRpbmdPcGVyYXRpb25zLmZpbHRlcihcbiAgICAgICAgKG9wKTogb3AgaXMgUGVuZGluZ1N0ZXAgPT4gb3AudHlwZSA9PT0gJ3N0ZXAnXG4gICAgICApO1xuICAgICAgLy8gU3RlcHMgY3JlYXRlZCBieSBhbiBFQVJMSUVSIGludm9jYXRpb24gKG9yIGFuIGVhcmxpZXIgdHVybikgdGhhdFxuICAgICAgLy8gYXJlIHN0aWxsIHBlbmRpbmcsIHdpdGggbm8gd29yayBvd25lZCBieSBUSElTIGludm9jYXRpb24uIE1pcnJvclxuICAgICAgLy8gdGhlIG5vZGUgZW5naW5lJ3Mgb3duZXJzaGlwIGRlY2lzaW9uIHRhYmxlIChzdGVwLW93bmVyc2hpcC50cykg4oCUXG4gICAgICAvLyBOT1QgYSBkZWxpdmVyeUF0dGVtcHQgZ2F0ZTogd29ybGRzIGFkdmFuY2UgdGhlIGF0dGVtcHQgY291bnRlciBvblxuICAgICAgLy8gcm91dGluZSByZWRlbGl2ZXJpZXMgKHdvcmxkLWxvY2FsIGNvdW50cyBldmVyeSBoYW5kbGVkIHJlc3BvbnNlKSxcbiAgICAgIC8vIHNvIGF0dGVtcHQgPiAxIGlzIHRoZSBjb21tb24gY2FzZSBhbmQgd291bGQgZmlyZSBiYWNrc3RvcHMgYXRcbiAgICAgIC8vIHN0ZXBzIGFjdGl2ZWx5IGV4ZWN1dGluZyBpbmxpbmUgaW4gYSBsaXZlIGludm9jYXRpb24uXG4gICAgICAvL1xuICAgICAgLy8gICAtIE93bmVyc2hpcCBsZWFzZSBBQ1RJVkUsIGhlbGQgYnkgQU5PVEhFUiBtZXNzYWdlIOKGkiB0aGUgc3RlcCBpc1xuICAgICAgLy8gICAgIChwcmVzdW1hYmx5KSBleGVjdXRpbmcgaW5saW5lIGluIGEgbGl2ZSBpbnZvY2F0aW9uLiBBcm0gYVxuICAgICAgLy8gICAgIERFTEFZRUQgYmFja3N0b3AgZm9yIHRoZSBsZWFzZSByZW1haW5kZXIsIGtleWVkIHRvIHRoZVxuICAgICAgLy8gICAgIG93bmVyc2hpcCBlcG9jaCAoYSByZWZyZXNoZWQgbGVhc2UgcmUtYXJtcyBhIGZyZXNoIGJhY2tzdG9wXG4gICAgICAvLyAgICAgaW5zdGVhZCBvZiBkZWR1cGluZyBhZ2FpbnN0IHRoZSBpbi1mbGlnaHQgb25lKS4gSWYgdGhlIG93bmVyXG4gICAgICAvLyAgICAgY29tcGxldGVzIG5vcm1hbGx5LCB0aGUgYmFja3N0b3AgZGVsaXZlcnkgcmVzb2x2ZXMgdGhlIHN0ZXBcbiAgICAgIC8vICAgICBhcyAnc2tpcHBlZCcuXG4gICAgICAvLyAgIC0gT3duZXJzaGlwIGxlYXNlIEFDVElWRSwgaGVsZCBieSBUSElTIG1lc3NhZ2Ug4oaSIHRoaXMgZGVsaXZlcnlcbiAgICAgIC8vICAgICBpcyB0aGUgb3duZXIncyByZWRlbGl2ZXJ5OyB0aGUgY2xhaW1hbnQgY3Jhc2hlZFxuICAgICAgLy8gICAgIG1pZC1leGVjdXRpb24uIERpc3BhdGNoIGltbWVkaWF0ZWx5IGZvciBiYWNrZ3JvdW5kIHJlY292ZXJ5LlxuICAgICAgLy8gICAtIE5vIHN0YW1wIC8gbGVhc2UgRVhQSVJFRCAvIHN0ZXBfcmV0cnlpbmcgb2JzZXJ2ZWQg4oaSIHRoZSBzdGVwXG4gICAgICAvLyAgICAgaXMgcXVldWUtb3duZWQgb3Igb3JwaGFuZWQuIERpc3BhdGNoIGltbWVkaWF0ZWx5OyB0aGVcbiAgICAgIC8vICAgICBzdGVwLWlkZW50aXR5LXNjb3BlZCBpZGVtcG90ZW5jeSBrZXkgZGVkdXBlcyBhZ2FpbnN0IHRoZVxuICAgICAgLy8gICAgIG9yaWdpbmFsIGhhbmRvZmYuXG4gICAgICBjb25zdCBub3dNcyA9IERhdGUubm93KCk7XG4gICAgICBmb3IgKGNvbnN0IHN0ZXAgb2Ygc3RlcE9wcykge1xuICAgICAgICBpZiAoIXN0ZXAuaGFzQ3JlYXRlZEV2ZW50KSBjb250aW51ZTtcbiAgICAgICAgaWYgKGV4ZWN1dGVkU3RlcElkcy5oYXMoc3RlcC5jb3JyZWxhdGlvbklkKSkgY29udGludWU7XG4gICAgICAgIGlmIChxdWV1ZWRTdGVwSWRzLmhhcyhzdGVwLmNvcnJlbGF0aW9uSWQpKSBjb250aW51ZTtcbiAgICAgICAgY29uc3Qgb3duZXJzaGlwID0gc3RlcE93bmVyc2hpcC5nZXQoc3RlcC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgY29uc3Qgb3duZXJzaGlwQWN0aXZlID1cbiAgICAgICAgICBvd25lcnNoaXAgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgIG93bmVyc2hpcC5vd25lciAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgIW93bmVyc2hpcC5zYXdSZXRyeWluZztcbiAgICAgICAgbGV0IGxlYXNlUmVtYWluaW5nU2Vjb25kcyA9IDA7XG4gICAgICAgIGlmIChvd25lcnNoaXBBY3RpdmUgJiYgb3duZXJzaGlwLnN0YXJ0ZWRBdE1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCBsZWFzZVNlY29uZHMgPSBnZXRJbmxpbmVPd25lcnNoaXBMZWFzZVNlY29uZHMoKTtcbiAgICAgICAgICBsZWFzZVJlbWFpbmluZ1NlY29uZHMgPSBNYXRoLm1pbihcbiAgICAgICAgICAgIGxlYXNlU2Vjb25kcyxcbiAgICAgICAgICAgIE1hdGgubWF4KFxuICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICBNYXRoLmNlaWwoXG4gICAgICAgICAgICAgICAgKG93bmVyc2hpcC5zdGFydGVkQXRNcyArIGxlYXNlU2Vjb25kcyAqIDEwMDAgLSBub3dNcykgLyAxMDAwXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBvd25lcnNoaXBBY3RpdmUgJiZcbiAgICAgICAgICBvd25lcnNoaXAub3duZXIgIT09IG93bmVyTWVzc2FnZUlkICYmXG4gICAgICAgICAgbGVhc2VSZW1haW5pbmdTZWNvbmRzID4gMFxuICAgICAgICApIHtcbiAgICAgICAgICBxdWV1ZWRTdGVwSWRzLmFkZChzdGVwLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgIGF3YWl0IHF1ZXVlU3RlcE1lc3NhZ2Uoe1xuICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgIGRlbGF5U2Vjb25kczogbGVhc2VSZW1haW5pbmdTZWNvbmRzLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICAgICAgICAgIHB1cnBvc2U6IGBiYWNrc3RvcDoke293bmVyc2hpcC5zdGFydGVkQXRNc31gLFxuICAgICAgICAgICAgd2ZkaWFnLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHF1ZXVlZFN0ZXBJZHMuYWRkKHN0ZXAuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgYXdhaXQgcXVldWVTdGVwTWVzc2FnZSh7XG4gICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICAgICAgICAgIHB1cnBvc2U6ICdkaXNwYXRjaCcsXG4gICAgICAgICAgICB3ZmRpYWcsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlubGluZUNhbmRpZGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIE5vIGluLXByb2Nlc3MgcHJvZ3Jlc3MgcG9zc2libGUg4oCUIHRoZSBydW4gYXdhaXRzIGFuIGV4dGVybmFsXG4gICAgICAgIC8vIHN0aW11bHVzIChob29rIHBheWxvYWQsIHF1ZXVlZCBzdGVwLCB3YWl0IHRpbWVyKS5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8vIFJhY2luZyB0aW1lcnMgbXVzdCBmaXJlIG9uIHRpbWUgd2hpbGUgc3RlcCBib2RpZXMgYmxvY2sgdGhpc1xuICAgICAgLy8gaW52b2NhdGlvbjogZW5xdWV1ZSBhIGRlbGF5ZWQgY29udGludWF0aW9uIGZvciB0aGUgc29vbmVzdFxuICAgICAgLy8gcGVuZGluZyB3YWl0IChhIHNlcGFyYXRlIGludm9jYXRpb24gd3JpdGVzIGl0cyB3YWl0X2NvbXBsZXRlZCBhdFxuICAgICAgLy8gdGhlIHJpZ2h0IGxvZyBwb3NpdGlvbiDigJQgc2FtZSBtZWNoYW5pc20gYXMgdGhlIG5vZGU6dm0gZW5naW5lJ3NcbiAgICAgIC8vIHdhaXQtY29udGludWF0aW9uIGRpc3BhdGNoKS5cbiAgICAgIGxldCBzb29uZXN0V2FpdDogeyBjb3JyZWxhdGlvbklkOiBzdHJpbmc7IHNlY29uZHM6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgZm9yIChjb25zdCBvcCBvZiBwZW5kaW5nT3BlcmF0aW9ucykge1xuICAgICAgICBpZiAob3AudHlwZSAhPT0gJ3dhaXQnKSBjb250aW51ZTtcbiAgICAgICAgY29uc3Qgd2FpdCA9IG9wIGFzIFBlbmRpbmdXYWl0O1xuICAgICAgICBpZiAoc2NoZWR1bGVkV2FpdENvbnRpbnVhdGlvbnMuaGFzKHdhaXQuY29ycmVsYXRpb25JZCkpIGNvbnRpbnVlO1xuICAgICAgICAvLyBXYWl0cyB3aG9zZSB3YWl0X2NvbXBsZXRlZCBUSElTIGludm9jYXRpb24gYWxyZWFkeSB3cm90ZSAodGhlXG4gICAgICAgIC8vIGVsYXBzZWQtd2FpdCBwYXNzIGFib3ZlKSBhcmUgZG9uZSDigJQgdGhlIGV2ZW50IGp1c3QgaGFzbid0IGZlZFxuICAgICAgICAvLyBiYWNrIGludG8gdGhlIFZNIHlldC4gTm8gY29udGludWF0aW9uIG5lZWRlZC5cbiAgICAgICAgaWYgKGNvbXBsZXRlZFdhaXRJZHMyLmhhcyh3YWl0LmNvcnJlbGF0aW9uSWQpKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgcmVzdW1lTXMgPSBuZXcgRGF0ZSh3YWl0LnJlc3VtZUF0KS5nZXRUaW1lKCkgLSBEYXRlLm5vdygpO1xuICAgICAgICAvLyBBbiBhbHJlYWR5LWVsYXBzZWQgd2FpdCBNVVNUIHN0aWxsIGdldCBhIGNvbnRpbnVhdGlvbiAoY2xhbXBlZFxuICAgICAgICAvLyB0byB0aGUgMXMgbWluaW11bSwgZXhhY3RseSBsaWtlIHRoZSBub2RlIGVuZ2luZSdzXG4gICAgICAgIC8vIGBNYXRoLm1heCgxMDAwLCByZXN1bWVBdE1zIC0gbm93KWApLCBub3QgYmUgc2tpcHBlZDogYSB3YWl0XG4gICAgICAgIC8vIHdob3NlIGRlYWRsaW5lIGZhbGxzIGJldHdlZW4gdGhpcyBpdGVyYXRpb24ncyBlbGFwc2VkLXdhaXRcbiAgICAgICAgLy8gcGFzcyAod2hpY2ggc2F3IGl0IGFzIHN0aWxsIHBlbmRpbmcgYW5kIHdyb3RlIG5vdGhpbmcpIGFuZFxuICAgICAgICAvLyB0aGlzIHN3ZWVwIHdvdWxkIG90aGVyd2lzZSBnZXQgTkVJVEhFUiBhIHdhaXRfY29tcGxldGVkIE5PUiBhXG4gICAgICAgIC8vIGNvbnRpbnVhdGlvbiDigJQgYW5kIHRoZSBpbmxpbmUgYmF0Y2ggYmVsb3cgdGhlbiBibG9ja3MgdGhpc1xuICAgICAgICAvLyBpbnZvY2F0aW9uIGZvciB0aGUgZnVsbCBzdGVwIGR1cmF0aW9uIHdpdGggbm8gd2FrZSBhcm1lZFxuICAgICAgICAvLyBhbnl3aGVyZS4gRm9yIGBQcm9taXNlLnJhY2Uoc3RlcCwgc2xlZXApYCB0aGF0IHNpbGVudGx5IGhhbmRzXG4gICAgICAgIC8vIHRoZSByYWNlIHRvIHRoZSBzdGVwOiB0aGUgc2xlZXAncyB3YWl0X2NvbXBsZXRlZCBpcyBuZXZlclxuICAgICAgICAvLyB3cml0dGVuIGFuZCB0aGUgcnVuIGNvbXBsZXRlcyB3aXRoIHRoZSB3cm9uZyB3aW5uZXIuIFRoZVxuICAgICAgICAvLyB3aW5kb3cgYmV0d2VlbiB0aGUgdHdvIGNoZWNrcyBzcGFucyB0aGlzIGl0ZXJhdGlvbidzIGRpc3BhdGNoXG4gICAgICAgIC8vICsgZmVlZCByb3VuZC10cmlwcywgc28gb24gbmV0d29yay1iYWNrZWQgd29ybGRzICh3b3JsZC12ZXJjZWwpXG4gICAgICAgIC8vIGEgc2hvcnQgc2xlZXAgbGFuZHMgaW4gaXQgcm91dGluZWx5IOKAlCBvYnNlcnZlZCBhcyBhIH41MCVcbiAgICAgICAgLy8gc2xlZXBXaW5zUmFjZVdvcmtmbG93IGZhaWx1cmUgcmF0ZSBpbiB0aGUgVmVyY2VsIGUyZSBsZWdzLFxuICAgICAgICAvLyB3aGlsZSB3b3JsZC1sb2NhbCdzIHN1Yi1tcyByb3VuZC10cmlwcyBtYXNrZWQgaXQgbG9jYWxseS4gVGhlXG4gICAgICAgIC8vIGNvbnRpbnVhdGlvbiBpbnZvY2F0aW9uJ3MgcHJlLVZNIGVsYXBzZWQgY2hlY2sgd3JpdGVzIHRoZVxuICAgICAgICAvLyB3YWl0X2NvbXBsZXRlZCB+MXMgbGF0ZXIuXG4gICAgICAgIGNvbnN0IHNlY29uZHMgPSBNYXRoLm1heCgxLCBNYXRoLmNlaWwocmVzdW1lTXMgLyAxMDAwKSk7XG4gICAgICAgIGlmICghc29vbmVzdFdhaXQgfHwgc2Vjb25kcyA8IHNvb25lc3RXYWl0LnNlY29uZHMpIHtcbiAgICAgICAgICBzb29uZXN0V2FpdCA9IHsgY29ycmVsYXRpb25JZDogd2FpdC5jb3JyZWxhdGlvbklkLCBzZWNvbmRzIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzb29uZXN0V2FpdCkge1xuICAgICAgICBzY2hlZHVsZWRXYWl0Q29udGludWF0aW9ucy5hZGQoc29vbmVzdFdhaXQuY29ycmVsYXRpb25JZCk7XG4gICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd1J1bi53b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAge1xuICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZ2V0V2FpdENvbnRpbnVhdGlvbkRpc3BhdGNoKFxuICAgICAgICAgICAgc29vbmVzdFdhaXQuc2Vjb25kcyxcbiAgICAgICAgICAgIHNvb25lc3RXYWl0LmNvcnJlbGF0aW9uSWRcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIHdmZGlhZygnd2FpdF9jb250aW51YXRpb25fc2NoZWR1bGVkJywge1xuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHNvb25lc3RXYWl0LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgZGVsYXlTZWNvbmRzOiBzb29uZXN0V2FpdC5zZWNvbmRzLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gRXhlY3V0ZSB0aGUgaW5saW5lIGJhdGNoIGluIHBhcmFsbGVsLiBUaGUgcmVwbGF5IGJ1ZGdldCBpc1xuICAgICAgLy8gcGF1c2VkIHdoaWxlIHN0ZXAgYm9kaWVzIHJ1biDigJQgc3RlcCBkdXJhdGlvbiBpcyBib3VuZGVkIGJ5IHRoZVxuICAgICAgLy8gcGxhdGZvcm0gZnVuY3Rpb24gZHVyYXRpb24sIG5vdCB0aGUgcmVwbGF5IHRpbWVvdXQuIE5PVEUgKGJ5XG4gICAgICAvLyBkZXNpZ24pOiB3aXRoIHRoZSBidWRnZXQgcGFya2VkIHBlciBiYXRjaCwgdGhlIG9ubHkgYm91bmQgb24gaG93XG4gICAgICAvLyBtYW55IGlubGluZSBzdGVwcyBvbmUgaW52b2NhdGlvbiBjYW4gY2hhaW4gaXMgdGhlIHBsYXRmb3JtJ3NcbiAgICAgIC8vIGZ1bmN0aW9uIHRpbWVvdXQg4oCUIHRoZSBTREsgZGVsaWJlcmF0ZWx5IGltcG9zZXMgbm8gY2FwIG9mIGl0c1xuICAgICAgLy8gb3duLCBtYXRjaGluZyB0aGUgbm9kZTp2bSBlbmdpbmUsIHdoZXJlIGEgbG9uZyBzZXF1ZW50aWFsXG4gICAgICAvLyB3b3JrZmxvdyBsaWtld2lzZSBydW5zIHN0ZXAtYnktc3RlcCB1bnRpbCB0aGUgcGxhdGZvcm0gcmVjbGFpbXNcbiAgICAgIC8vIHRoZSBpbnZvY2F0aW9uIGFuZCBhIHJlZGVsaXZlcnkgcmVzdW1lcyBmcm9tIHRoZSBsb2cuXG4gICAgICBidWRnZXQucGF1c2UoKTtcbiAgICAgIGxldCBvdXRjb21lczogU3RlcEV4ZWN1dGlvblJlc3VsdFtdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgb3V0Y29tZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBpbmxpbmVDYW5kaWRhdGVzLm1hcCgoc3RlcCkgPT5cbiAgICAgICAgICAgIHJ1blN0ZXBTaW5nbGVGbGlnaHQocnVuSWQsIHN0ZXAuY29ycmVsYXRpb25JZCwgKCkgPT5cbiAgICAgICAgICAgICAgKGFzeW5jICgpID0+XG4gICAgICAgICAgICAgICAgZXhlY3V0ZVN0ZXAoe1xuICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93RGVwbG95bWVudElkOiB3b3JrZmxvd1J1bi5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IHdvcmtmbG93UnVuLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0LFxuICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgcm9vdFJ1bklkLFxuICAgICAgICAgICAgICAgICAgc3RlcElkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICBzdGVwTmFtZTogc3RlcC5zdGVwSWQsXG4gICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgICAgICAgICAgcnVuU3BlY1ZlcnNpb246IHdvcmtmbG93UnVuLnNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgLy8gTGF6eSBpbmxpbmUgY2xhaW06IHN0ZXBfY3JlYXRlZCBpcyBkZWZlcnJlZCAoZGlzcGF0Y2hcbiAgICAgICAgICAgICAgICAgIC8vIHNraXBwZWQgaXQpIGFuZCB0aGlzIHN0ZXBfc3RhcnRlZCBjYXJyaWVzIHRoZSBpbnB1dCxcbiAgICAgICAgICAgICAgICAgIC8vIHNvIHRoZSB3b3JsZCBjcmVhdGVzIHRoZSBzdGVwIGF0b21pY2FsbHkg4oCUXG4gICAgICAgICAgICAgICAgICAvLyBleGFjdGx5LW9uZS1vd25lci4gQSBjb25jdXJyZW50IGNsYWltYW50IGdldHNcbiAgICAgICAgICAgICAgICAgIC8vIEVudGl0eUNvbmZsaWN0RXJyb3Ig4oaSIHsgdHlwZTogJ3NraXBwZWQnIH0gYW5kIG5ldmVyXG4gICAgICAgICAgICAgICAgICAvLyBydW5zIHRoZSBib2R5LiBNaXJyb3JzIHRoZSBub2RlIGVuZ2luZSdzIGlubGluZSBwYXRoLlxuICAgICAgICAgICAgICAgICAgbGF6eVN0ZXBJbnB1dDogYXdhaXQgZW5jcnlwdFNlcmlhbGl6ZWREYXRhKFxuICAgICAgICAgICAgICAgICAgICBzdGVwLmlucHV0LFxuICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5XG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgLy8gT3duZXJzaGlwIHN0YW1wOiB3YWtlIHJlcGxheXMgc2VlIHRoZSBib2R5IGFzIGluXG4gICAgICAgICAgICAgICAgICAvLyBmbGlnaHQgaW4gdGhpcyBpbnZvY2F0aW9uIGFuZCBhcm0gYSBkZWxheWVkIGJhY2tzdG9wXG4gICAgICAgICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIGltbWVkaWF0ZWx5IHJlcXVldWVpbmcgdGhlIHN0ZXAuXG4gICAgICAgICAgICAgICAgICBvd25lck1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgICAgIC8vIEEgbGF6eSBzdGVwIGlzIGJyYW5kLW5ldyBieSBjb25zdHJ1Y3Rpb24g4oCUIGZpcnN0XG4gICAgICAgICAgICAgICAgICAvLyBhdHRlbXB0LlxuICAgICAgICAgICAgICAgICAgYXV0aG9yaXRhdGl2ZUF0dGVtcHQ6IDEsXG4gICAgICAgICAgICAgICAgfSkpKClcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBidWRnZXQucmVzdW1lKCk7XG4gICAgICB9XG4gICAgICBpbmxpbmVTdGVwc0V4ZWN1dGVkICs9IGlubGluZUNhbmRpZGF0ZXMubGVuZ3RoO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlubGluZUNhbmRpZGF0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgc3RlcCA9IGlubGluZUNhbmRpZGF0ZXNbaV07XG4gICAgICAgIGNvbnN0IG91dGNvbWUgPSBvdXRjb21lc1tpXTtcbiAgICAgICAgZXhlY3V0ZWRTdGVwSWRzLmFkZChzdGVwLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICBpZiAob3V0Y29tZS50eXBlID09PSAncmV0cnknIHx8IG91dGNvbWUudHlwZSA9PT0gJ3Rocm90dGxlZCcpIHtcbiAgICAgICAgICAvLyBIYW5kIHRoZSBzdGVwIHRvIHRoZSBxdWV1ZSB3aXRoIHRoZSByZXF1ZXN0ZWQgYmFja29mZiDigJRcbiAgICAgICAgICAvLyBiYWNrZ3JvdW5kIGRlbGl2ZXJ5IGRyaXZlcyB0aGUgcmV0cnkgZnJvbSBoZXJlLlxuICAgICAgICAgIHF1ZXVlZFN0ZXBJZHMuYWRkKHN0ZXAuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgYXdhaXQgcXVldWVTdGVwTWVzc2FnZSh7XG4gICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgZGVsYXlTZWNvbmRzOiBvdXRjb21lLnRpbWVvdXRTZWNvbmRzLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICAgICAgICAgIC8vIFN1ZmZpeGVkIGtleTogdGhpcyBzdGVwIHdhcyBpbmxpbmUtY2xhaW1lZCwgc28gbm8gZGlzcGF0Y2hcbiAgICAgICAgICAgIC8vIHB1Ymxpc2ggZXhpc3RzIHVuZGVyIHRoZSBkaXNwYXRjaCBrZXkg4oCUIGJ1dCBzdWZmaXhpbmdcbiAgICAgICAgICAgIC8vIGtlZXBzIHRoZSByZXRyeSBlbnF1ZXVlYWJsZSBldmVuIGlmIGEgd29ybGQgcmV0aXJlZCBhXG4gICAgICAgICAgICAvLyBoaXN0b3JpY2FsIGtleSBmb3IgdGhpcyBzdGVwIChzZWUgdGhlIHB1cnBvc2UgZG9jcyBhYm92ZSkuXG4gICAgICAgICAgICBwdXJwb3NlOiAncmV0cnk6MScsXG4gICAgICAgICAgICB3ZmRpYWcsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAob3V0Y29tZS50eXBlID09PSAnZ29uZScpIHtcbiAgICAgICAgICBydW5Hb25lID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyAnc2tpcHBlZCc6IGEgY29uY3VycmVudCBpbnZvY2F0aW9uIHdvbiB0aGUgbGF6eSBjcmVhdGUtY2xhaW0gYW5kXG4gICAgICAgIC8vIG93bnMgdGhlIGJvZHkuIE1hcmtlZCBleGVjdXRlZCBhYm92ZSBzbyB0aGlzIGludm9jYXRpb24gbmV2ZXJcbiAgICAgICAgLy8gcmUtY2xhaW1zIGl0OyB0aGUgd2lubmVyJ3MgdGVybWluYWwgZXZlbnRzIGFycml2ZSB2aWEgdGhlIGZlZWRcbiAgICAgICAgLy8gKG9yIGRyaXZlIGEgc2VwYXJhdGUgaW52b2NhdGlvbikuXG4gICAgICB9XG4gICAgICB3ZmRpYWcoJ2lubGluZV9zdGVwc19leGVjdXRlZCcsIHtcbiAgICAgICAgaXRlcmF0aW9uLFxuICAgICAgICBjb3VudDogaW5saW5lQ2FuZGlkYXRlcy5sZW5ndGgsXG4gICAgICAgIG91dGNvbWVzOiBvdXRjb21lcy5tYXAoKG8pID0+IG8udHlwZSksXG4gICAgICB9KTtcblxuICAgICAgLy8gRmVlZCB0aGUgaW5saW5lIGJhdGNoJ3MgdGVybWluYWwgZXZlbnRzIGludG8gdGhlIGxpdmUgVk0uIFdoZW5cbiAgICAgIC8vIHRoZSBldmVudHVhbGx5LWNvbnNpc3RlbnQgbGlzdGluZyBoYXMgbm90IHN1cmZhY2VkIHRoZW0geWV0LFxuICAgICAgLy8gZXhpdGluZyBtdXN0IE5PVCBhY2sgc2lsZW50bHk6IHRoZSB0ZXJtaW5hbHMgdGhpcyBpbnZvY2F0aW9uIGp1c3RcbiAgICAgIC8vIGNhdXNlZCBhcmUgZHVyYWJseSB3cml0dGVuIHdpdGggbm8gcXVldWUgbWVzc2FnZSBsZWZ0IHRvIGNvbnN1bWVcbiAgICAgIC8vIHRoZW0gKGlubGluZSBzdGVwcyBoYXZlIG5vbmUpLCBzbyBhbiBhd2FpdGluZ19leHRlcm5hbCBleGl0IHdvdWxkXG4gICAgICAvLyBwYXJrIHRoZSBydW4gJ3J1bm5pbmcnIHdpdGggYWxsIGl0cyBzdGVwcyBjb21wbGV0ZS4gUmFpc2UgdGhlXG4gICAgICAvLyByZXF1ZXVlIHNpZ25hbCBzbyB0aGUgc3VzcGVuZGVkIGV4aXQgc2NoZWR1bGVzIGEgZnJlc2ggaW1tZWRpYXRlXG4gICAgICAvLyBpbnZvY2F0aW9uIHdob3NlIGZyZXNoIHJlYWQgcGlja3MgdGhlIHRlcm1pbmFscyB1cC4gT3V0Y29tZXMgdGhhdFxuICAgICAgLy8gd3JvdGUgbm8gdGVybWluYWwgKCdza2lwcGVkJyDigJQgYSBjb25jdXJyZW50IGNsYWltYW50IG93bnMgdGhlXG4gICAgICAvLyBib2R5OyAnZ29uZScsIHJldHJ5L3Rocm90dGxlZCDigJQgYSBxdWV1ZSBtZXNzYWdlIGV4aXN0cykgZG9uJ3RcbiAgICAgIC8vIG5lZWQgaXQsIGJ1dCBzaWduYWxpbmcgb24gdGhlbSB0b28gb25seSBjb3N0cyBhIG5vLW9wIGludm9jYXRpb25cbiAgICAgIC8vIGluIGFuIGFscmVhZHktcmFyZSBsYWcgd2luZG93LlxuICAgICAgY29uc3QgbmV3RXZlbnRzID0gYXdhaXQgZmV0Y2hVbnNlZW5FdmVudHMoKTtcbiAgICAgIGlmIChuZXdFdmVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHBlbmRpbmdSZXF1ZXVlU2lnbmFsID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICByZXN1bHQgPSBhd2FpdCBzZXNzaW9uLmNvbnRpbnVlV2l0aEV2ZW50cyhuZXdFdmVudHMpO1xuXG4gICAgICB3ZmRpYWcoJ2lubGluZV9pdGVyYXRpb24nLCB7XG4gICAgICAgIGl0ZXJhdGlvbixcbiAgICAgICAgcGhhc2U6ICdzdGVwcycsXG4gICAgICAgIGZlZEV2ZW50czogbmV3RXZlbnRzLmxlbmd0aCxcbiAgICAgICAgb3V0Y29tZTogcmVzdWx0LmNvbXBsZXRlZFxuICAgICAgICAgID8gJ2NvbXBsZXRlZCdcbiAgICAgICAgICA6IHJlc3VsdC5mYWlsZWRcbiAgICAgICAgICAgID8gJ2ZhaWxlZCdcbiAgICAgICAgICAgIDogJ3N1c3BlbmRlZCcsXG4gICAgICAgIGJ1ZGdldEV4aGF1c3RlZDogYnVkZ2V0LmlzRXhoYXVzdGVkKCksXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgc2Vzc2lvbi5kaXNwb3NlKCk7XG4gIH1cblxuICBwYXJlbnRTcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAuLi5BdHRyaWJ1dGUuUXVpY2tKU0lubGluZVN0ZXBzKGlubGluZVN0ZXBzRXhlY3V0ZWQpLFxuICB9KTtcblxuICBpZiAocmVzdWx0LmNvbXBsZXRlZCkge1xuICAgIC8vIFdvcmtmbG93IGNvbXBsZXRlZFxuICAgIHJ1bnRpbWVMb2dnZXIuaW5mbygnUXVpY2tKUyBydW50aW1lOiB3b3JrZmxvdyBjb21wbGV0ZWQnLCB7XG4gICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICB9KTtcbiAgICBwYXJlbnRTcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgIC4uLkF0dHJpYnV0ZS5RdWlja0pTT3V0Y29tZSgnY29tcGxldGVkJyksXG4gICAgfSk7XG5cbiAgICAvLyBGbHVzaCBsZWZ0b3ZlciBwZW5kaW5nIHNpZGUgZWZmZWN0cyAoYWJvcnQgcmVjb3JkaW5ncywgc3lzdGVtLWhvb2tcbiAgICAvLyBkaXNwb3NhbHMsIGZpcmUtYW5kLWZvcmdldCBhdHRyaWJ1dGUvaG9vayBldmVudHMpIEJFRk9SRSB3cml0aW5nXG4gICAgLy8gcnVuX2NvbXBsZXRlZCDigJQgbWlycm9ycyB0aGUgbm9kZTp2bSBlbmdpbmUncyBkcmFpblBlbmRpbmdRdWV1ZUl0ZW1zLlxuICAgIC8vIERyYWluIGZhaWx1cmVzIGFyZSBzd2FsbG93ZWQ6IHRoZSB3b3JrZmxvdydzIG93biBvdXRjb21lIGlzIHRoZVxuICAgIC8vIHNvdXJjZSBvZiB0cnV0aC5cbiAgICBpZiAocmVzdWx0LmNvbXBsZXRlZC5kcmFpbk9wZXJhdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZGlzcGF0Y2hQZW5kaW5nT3BzKHtcbiAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBuZXh0VHJhY2VDYXJyaWVyLFxuICAgICAgICAgIHBlbmRpbmdPcGVyYXRpb25zOiByZXN1bHQuY29tcGxldGVkLmRyYWluT3BlcmF0aW9ucyxcbiAgICAgICAgICB3ZmRpYWcsXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybignUXVpY2tKUyBydW50aW1lOiB0ZXJtaW5hbCBkcmFpbiBmYWlsZWQnLCB7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgbWVzc2FnZTogKGVyciBhcyBFcnJvcik/Lm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENyZWF0ZSBydW5fY29tcGxldGVkIGV2ZW50LlxuICAgIC8vIFRoZSBWTSBzZXJpYWxpemVzIHRoZSB3b3JrZmxvdyByZXN1bHQgYXMgZm9ybWF0LXByZWZpeGVkIGRldmFsdWUgYnl0ZXNcbiAgICAvLyAoXCJkZXZsXCIgKyBkZXZhbHVlKSB3aXRoIG5vIGVuY3J5cHRpb24gKHRoZSBWTSBoYXMgbm8gYWNjZXNzIHRvIHRoZVxuICAgIC8vIENyeXB0b0tleSkuIEhvc3Qtc2lkZSBlbmNyeXB0aW9uIGlzIGFwcGxpZWQgaGVyZSBzbyB0aGF0IGBydW5fY29tcGxldGVkYFxuICAgIC8vIGV2ZW50cyBoYXZlIHRoZSBzYW1lIGBlbmNyYC1wcmVmaXhlZCBwYXlsb2FkIHNoYXBlIHRoYXQgdGhlIG5vZGU6dm1cbiAgICAvLyBlbmdpbmUncyBgZGVoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZWAgcHJvZHVjZXMuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHtcbiAgICAgICAgZXZlbnRUeXBlOiAncnVuX2NvbXBsZXRlZCcsXG4gICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgb3V0cHV0OiBhd2FpdCBlbmNyeXB0U2VyaWFsaXplZERhdGEoXG4gICAgICAgICAgICByZXN1bHQuY29tcGxldGVkLnJlc3VsdCxcbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICB3ZmRpYWcoJ2V4aXRfY29tcGxldGVkJywgeyByZXN1bHQ6ICdydW5fY29tcGxldGVkX3dyaXR0ZW4nIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSB8fCBSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgJ1dvcmtmbG93IGFscmVhZHkgZmluaXNoZWQsIHNraXBwaW5nIHJ1bl9jb21wbGV0ZWQnLFxuICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQgfVxuICAgICAgICApO1xuICAgICAgICB3ZmRpYWcoJ2V4aXRfY29tcGxldGVkJywgeyByZXN1bHQ6ICdhbHJlYWR5X2ZpbmlzaGVkJyB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgd2ZkaWFnKCdleGl0X2NvbXBsZXRlZF9lcnJvcicsIHtcbiAgICAgICAgZXJyb3JOYW1lOiAoZXJyIGFzIEVycm9yKT8ubmFtZSxcbiAgICAgICAgZXJyb3JNZXNzYWdlOiAoZXJyIGFzIEVycm9yKT8ubWVzc2FnZSxcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfSBlbHNlIGlmIChyZXN1bHQuc3VzcGVuZGVkKSB7XG4gICAgLy8gV29ya2Zsb3cgc3RpbGwgc3VzcGVuZGVkIGFmdGVyIHRoZSBpbmxpbmUgbG9vcC4gQWxsIGR1cmFibGUgc2lkZVxuICAgIC8vIGVmZmVjdHMgZm9yIHRoZSBmaW5hbCBzdXNwZW5zaW9uIHN0YXRlIHdlcmUgYWxyZWFkeSBkaXNwYXRjaGVkIGJ5XG4gICAgLy8gdGhlIGxvb3A7IHdoYXQgcmVtYWlucyBpcyBkZWNpZGluZyBob3cgdGhlIHJ1biBnZXRzIHJlLWludm9rZWQuXG4gICAgY29uc3QgeyBwZW5kaW5nT3BlcmF0aW9ucyB9ID0gcmVzdWx0LnN1c3BlbmRlZDtcblxuICAgIHJ1bnRpbWVMb2dnZXIuaW5mbygnUXVpY2tKUyBydW50aW1lOiB3b3JrZmxvdyBzdXNwZW5kZWQnLCB7XG4gICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgIGlubGluZVN0ZXBzRXhlY3V0ZWQsXG4gICAgICBwZW5kaW5nU3RlcHM6IHBlbmRpbmdPcGVyYXRpb25zLmZpbHRlcigocCkgPT4gcC50eXBlID09PSAnc3RlcCcpLmxlbmd0aCxcbiAgICAgIHBlbmRpbmdXYWl0czogcGVuZGluZ09wZXJhdGlvbnMuZmlsdGVyKChwKSA9PiBwLnR5cGUgPT09ICd3YWl0JykubGVuZ3RoLFxuICAgICAgcGVuZGluZ09wczogcGVuZGluZ09wZXJhdGlvbnMubWFwKChwKSA9PiAoe1xuICAgICAgICB0eXBlOiBwLnR5cGUsXG4gICAgICAgIGNvcnJlbGF0aW9uSWQ6IHAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgaGFzQ3JlYXRlZEV2ZW50OiBwLmhhc0NyZWF0ZWRFdmVudCxcbiAgICAgICAgLi4uKHAudHlwZSA9PT0gJ3N0ZXAnID8geyBzdGVwSWQ6IChwIGFzIFBlbmRpbmdTdGVwKS5zdGVwSWQgfSA6IHt9KSxcbiAgICAgIH0pKSxcbiAgICB9KTtcblxuICAgIHBhcmVudFNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgLi4uQXR0cmlidXRlLlF1aWNrSlNPdXRjb21lKCdzdXNwZW5kZWQnKSxcbiAgICAgIC4uLkF0dHJpYnV0ZS5RdWlja0pTUGVuZGluZ09wc0NvdW50KHBlbmRpbmdPcGVyYXRpb25zLmxlbmd0aCksXG4gICAgfSk7XG5cbiAgICBpZiAocnVuR29uZSkge1xuICAgICAgLy8gVGhlIHJ1biBubyBsb25nZXIgZXhpc3RzIChleHBpcmVkIC8gZGVsZXRlZCkg4oCUIG5vdGhpbmcgdG8gZHJpdmUuXG4gICAgICB3ZmRpYWcoJ2V4aXRfc3VzcGVuZGVkJywgeyBhY3Rpb246ICdydW5fZ29uZScgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRXhpdCByZXF1ZXVlcyBhcmUgRlJFU0ggbWVzc2FnZXMsIG5ldmVyIGEgYHsgdGltZW91dFNlY29uZHMgfWBcbiAgICAvLyB2aXNpYmlsaXR5LXJlZGVsaXZlcnkgb2YgdGhlIGN1cnJlbnQgbWVzc2FnZS4gUmVkZWxpdmVyaW5nIHRoZVxuICAgIC8vIENVUlJFTlQgbWVzc2FnZSBpcyBhIHRyYXA6IGEgaG9vay1yZXN1bWUgZGVsaXZlcnkgY2Fycmllc1xuICAgIC8vIGBob29rSW5wdXRgLCBhbmQgaXRzIHJlZGVsaXZlcnkgcmUtcnVucyB0aGUgbGF6eS1yZXN1bWUgcmUtZW5zdXJlXG4gICAgLy8gaW4gdGhlIGhhbmRsZXIgcHJvbG9ndWUg4oCUIGlmIHRoZSB3b3JrZmxvdyBkaXNwb3NlZCB0aGF0IGhvb2tcbiAgICAvLyBkdXJpbmcgdGhpcyBpbnZvY2F0aW9uIChkaXNwb3NlIOKGkiBzbGVlcCksIGEgd29ybGQgdGhhdCByZWplY3RzXG4gICAgLy8gdGhlIHJlLWVuc3VyZSB3b3VsZCBhY2sgdGhlIG1lc3NhZ2UgYXMgXCJub3RoaW5nIGxlZnQgdG8gcmVzdW1lXCJcbiAgICAvLyBhbmQgdGhlIGNvbnRpbnVhdGlvbiBpdCBjYXJyaWVkIGlzIHNpbGVudGx5IGxvc3QuIEEgZnJlc2ggbWVzc2FnZVxuICAgIC8vIGNhcnJpZXMgb25seSBgcnVuSWRgLCBzbyBpdHMgZGVsaXZlcnkgYWx3YXlzIHJlYWNoZXMgcmVwbGF5IChhbmRcbiAgICAvLyB1bmRlciB0dXJibyBhIHJlc2NoZWR1bGUgd291bGQgcmUtZW5nYWdlIHR1cmJvIGFnYWluc3QgYSBzdGFsZVxuICAgIC8vIHByZWxvYWRlZCBsb2cg4oCUIHNlZSB0aGUgcmVpbnZva2UoKSBkb2NzIGluIHJ1bnRpbWUudHMpLlxuICAgIGNvbnN0IHJlcXVldWVJbW1lZGlhdGVseSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgd29ybGQsXG4gICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93UnVuLndvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAge1xuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH07XG5cbiAgICBpZiAoYnVkZ2V0LmlzRXhoYXVzdGVkKCkpIHtcbiAgICAgIC8vIFRoZSBsb29wIHN0b3BwZWQgb24gdGhlIHJlcGxheSBidWRnZXQgd2l0aCBwcm9ncmVzcyBzdGlsbFxuICAgICAgLy8gcG9zc2libGUg4oCUIGNvbnRpbnVlIGluIGEgZnJlc2ggaW52b2NhdGlvbi5cbiAgICAgIHdmZGlhZygnZXhpdF9zdXNwZW5kZWQnLCB7IGFjdGlvbjogJ2J1ZGdldF9leGhhdXN0ZWRfcmVxdWV1ZScgfSk7XG4gICAgICBhd2FpdCByZXF1ZXVlSW1tZWRpYXRlbHkoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBFeGl0IHdhaXQgc3dlZXAuIEEgd2FpdCB0aGF0IGVsYXBzZWQgaW4gdGhlIHdpbmRvdyBzaW5jZSB0aGVcbiAgICAvLyBsb29wJ3MgbGFzdCBjaGVjayByZXF1ZXVlcyBpbW1lZGlhdGVseSAoaXRzIHdhaXRfY29tcGxldGVkIGlzXG4gICAgLy8gd3JpdHRlbiBieSB0aGUgbmV4dCBpbnZvY2F0aW9uJ3MgZWxhcHNlZC13YWl0IHBhc3MpOyBwZW5kaW5nIHdhaXRzXG4gICAgLy8gd2hvc2UgY29udGludWF0aW9uIHRoZSBsb29wIGFscmVhZHkgZW5xdWV1ZWQgYXJlIHNraXBwZWQuXG4gICAgbGV0IHNvb25lc3RXYWl0OiB7IHNlY29uZHM6IG51bWJlcjsgY29ycmVsYXRpb25JZDogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG4gICAgbGV0IGhhc0VsYXBzZWRXYWl0ID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBvcCBvZiBwZW5kaW5nT3BlcmF0aW9ucykge1xuICAgICAgaWYgKG9wLnR5cGUgIT09ICd3YWl0JykgY29udGludWU7XG4gICAgICBjb25zdCB3YWl0ID0gb3AgYXMgUGVuZGluZ1dhaXQ7XG4gICAgICBjb25zdCByZXN1bWVNcyA9IG5ldyBEYXRlKHdhaXQucmVzdW1lQXQpLmdldFRpbWUoKSAtIERhdGUubm93KCk7XG4gICAgICBpZiAocmVzdW1lTXMgPD0gMCkge1xuICAgICAgICBoYXNFbGFwc2VkV2FpdCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKCFzY2hlZHVsZWRXYWl0Q29udGludWF0aW9ucy5oYXMod2FpdC5jb3JyZWxhdGlvbklkKSkge1xuICAgICAgICBjb25zdCB0aW1lb3V0U2Vjb25kcyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChyZXN1bWVNcyAvIDEwMDApKTtcbiAgICAgICAgaWYgKCFzb29uZXN0V2FpdCB8fCB0aW1lb3V0U2Vjb25kcyA8IHNvb25lc3RXYWl0LnNlY29uZHMpIHtcbiAgICAgICAgICBzb29uZXN0V2FpdCA9IHtcbiAgICAgICAgICAgIHNlY29uZHM6IHRpbWVvdXRTZWNvbmRzLFxuICAgICAgICAgICAgY29ycmVsYXRpb25JZDogd2FpdC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFzRWxhcHNlZFdhaXQpIHtcbiAgICAgIHdmZGlhZygnZXhpdF9zdXNwZW5kZWQnLCB7IGFjdGlvbjogJ3dhaXRfZWxhcHNlZF9yZXF1ZXVlJyB9KTtcbiAgICAgIGF3YWl0IHJlcXVldWVJbW1lZGlhdGVseSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwZW5kaW5nUmVxdWV1ZVNpZ25hbCkge1xuICAgICAgLy8gVGhpcyBpbnZvY2F0aW9uIHdyb3RlIGV2ZW50cyB0aGUgd29ya2Zsb3cgbmVlZHMgdG8gY29uc3VtZVxuICAgICAgLy8gKGF0dHJfc2V0IC8gZ2V0Q29uZmxpY3QtYXdhaXRlZCBob29rX2NyZWF0ZWQgLyBpbmxpbmUgc3RlcFxuICAgICAgLy8gdGVybWluYWxzKSBidXQgdGhlIGV2ZW50dWFsbHktY29uc2lzdGVudCBsaXN0aW5nIG5ldmVyIHJldHVybmVkXG4gICAgICAvLyB0aGVtIGJlZm9yZSB0aGUgbG9vcCBleGl0ZWQuIFdpdGhvdXQgYSByZXF1ZXVlIHRoZSBydW4gd291bGRcbiAgICAgIC8vIHBhcmsgYXdhaXRpbmdfZXh0ZXJuYWwgd2l0aCBpdHMgdW5ibG9ja2luZyBldmVudHMgYWxyZWFkeVxuICAgICAgLy8gZHVyYWJseSB3cml0dGVuIGFuZCBubyBmdXR1cmUgaW52b2NhdGlvbiBjb21pbmcg4oCUIHJlcXVldWVcbiAgICAgIC8vIGltbWVkaWF0ZWx5IHNvIGEgZnJlc2ggcmVhZCBwaWNrcyB0aGVtIHVwLiBJbiB0aGUgY29tbW9uIGNhc2VcbiAgICAgIC8vIHRoZSBsb29wJ3Mgb3duIGZlZWQgb2JzZXJ2ZXMgdGhlIHdyaXRlcyBhbmQgY2xlYXJzIHRoaXMgZmxhZywgc29cbiAgICAgIC8vIHRoaXMgb25seSBmaXJlcyB3aGVuIHRoZSByZWFkIGFjdHVhbGx5IGxhZ2dlZC5cbiAgICAgIHdmZGlhZygnZXhpdF9zdXNwZW5kZWQnLCB7IGFjdGlvbjogJ3VucmVhZF9zZWxmX3dyaXRlX3JlcXVldWUnIH0pO1xuICAgICAgYXdhaXQgcmVxdWV1ZUltbWVkaWF0ZWx5KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNvb25lc3RXYWl0KSB7XG4gICAgICAvLyBEZWxheWVkIGNvbnRpbnVhdGlvbiBmb3IgdGhlIHNvb25lc3QgcGVuZGluZyB3YWl0IHRoZSBsb29wIGhhc1xuICAgICAgLy8gbm90IGFscmVhZHkgc2NoZWR1bGVkLiBUaGUgZGlzcGF0Y2ggaGVscGVyIGhhbmRsZXMgZGVsYXlcbiAgICAgIC8vIGNsYW1waW5nIChsb25nIHdhaXRzIGNoYWluIGFjcm9zcyBob3BzKSBhbmQgaWRlbXBvdGVuY3kta2V5XG4gICAgICAvLyBkZWR1cCBvZiByZS1vYnNlcnZhdGlvbnMgb2YgdGhlIHNhbWUgcGVuZGluZyB3YWl0IOKAlCBzZWVcbiAgICAgIC8vIHJ1bnRpbWUvd2FpdC1jb250aW51YXRpb24udHMuXG4gICAgICB3ZmRpYWcoJ2V4aXRfc3VzcGVuZGVkJywge1xuICAgICAgICBhY3Rpb246ICdzY2hlZHVsZV93YWl0X3RpbWVvdXQnLFxuICAgICAgICB0aW1lb3V0U2Vjb25kczogc29vbmVzdFdhaXQuc2Vjb25kcyxcbiAgICAgICAgd2FpdENvcnJlbGF0aW9uSWQ6IHNvb25lc3RXYWl0LmNvcnJlbGF0aW9uSWQsXG4gICAgICB9KTtcbiAgICAgIHNjaGVkdWxlZFdhaXRDb250aW51YXRpb25zLmFkZChzb29uZXN0V2FpdC5jb3JyZWxhdGlvbklkKTtcbiAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgd29ybGQsXG4gICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93UnVuLndvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAge1xuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICB9LFxuICAgICAgICBnZXRXYWl0Q29udGludWF0aW9uRGlzcGF0Y2goXG4gICAgICAgICAgc29vbmVzdFdhaXQuc2Vjb25kcyxcbiAgICAgICAgICBzb29uZXN0V2FpdC5jb3JyZWxhdGlvbklkXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2ZkaWFnKCdleGl0X3N1c3BlbmRlZCcsIHtcbiAgICAgIGFjdGlvbjogJ2F3YWl0aW5nX2V4dGVybmFsJyxcbiAgICAgIHBlbmRpbmdPcHNDb3VudDogcGVuZGluZ09wZXJhdGlvbnMubGVuZ3RoLFxuICAgIH0pO1xuICB9IGVsc2UgaWYgKHJlc3VsdC5mYWlsZWQpIHtcbiAgICAvLyBXb3JrZmxvdyBmYWlsZWQg4oCUIHJlbWFwIHN0YWNrIHRyYWNlIHVzaW5nIGlubGluZSBzb3VyY2UgbWFwcy5cbiAgICAvLyBGcmFtZXMgY2FycnkgdGhlIHJ1bidzIHdvcmtmbG93SWQgYXMgdGhlaXIgZmlsZW5hbWUgb24gdGhlIGZyZXNoXG4gICAgLy8gcGF0aCwgYnV0IHRoZSB3b3JrZmxvdy1pbmRlcGVuZGVudCBCQVNFTElORV9CVU5ETEVfRklMRU5BTUUgb24gdGhlXG4gICAgLy8gc25hcHNob3QgcGF0aCAodGhlIG5hbWUgaXMgYmFrZWQgaW50byB0aGUgc2hhcmVkIGJhc2VsaW5lJ3NcbiAgICAvLyBjb21waWxlZCBjb2RlIGF0IGh5ZHJhdGUpIOKAlCByZW1hcCBhZ2FpbnN0IGJvdGguIHJlbWFwRXJyb3JTdGFja1xuICAgIC8vIGVhcmx5LWV4aXRzIG9uIGEgY2hlYXAgaW5jbHVkZXMoKSB3aGVuIGEgZmlsZW5hbWUgaGFzIG5vIGZyYW1lcy5cbiAgICBsZXQgZXJyb3JTdGFjayA9IHJlc3VsdC5mYWlsZWQuc3RhY2s7XG4gICAgaWYgKGVycm9yU3RhY2spIHtcbiAgICAgIGNvbnN0IHBhcnNlZE5hbWUgPSBwYXJzZVdvcmtmbG93TmFtZSh3b3JrZmxvd05hbWUpO1xuICAgICAgY29uc3QgZmlsZW5hbWUgPSBwYXJzZWROYW1lPy5tb2R1bGVTcGVjaWZpZXIgfHwgd29ya2Zsb3dOYW1lO1xuICAgICAgZXJyb3JTdGFjayA9IHJlbWFwRXJyb3JTdGFjayhlcnJvclN0YWNrLCBmaWxlbmFtZSwgd29ya2Zsb3dDb2RlKTtcbiAgICAgIGVycm9yU3RhY2sgPSByZW1hcEVycm9yU3RhY2soXG4gICAgICAgIGVycm9yU3RhY2ssXG4gICAgICAgIEJBU0VMSU5FX0JVTkRMRV9GSUxFTkFNRSxcbiAgICAgICAgd29ya2Zsb3dDb2RlXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENsYXNzaWZ5IHRoZSBlcnJvciBzbyBjb25zdW1lcnMgKGBydW4ucmV0dXJuVmFsdWVgLCBvYnNlcnZhYmlsaXR5KVxuICAgIC8vIGdldCBgVVNFUl9FUlJPUmAgLyBgUlVOVElNRV9FUlJPUmAgb24gYGVycm9yLmNhdXNlLmNvZGVgLCBtYXRjaGluZ1xuICAgIC8vIHdoYXQgdGhlIG5vZGU6dm0gZW5naW5lIGFscmVhZHkgZG9lcyBpbiBydW50aW1lLnRzLlxuICAgIC8vXG4gICAgLy8gVGhlIFZNIHNlcmlhbGl6ZXMgZXJyb3JzIGFzIGB7IG5hbWUsIG1lc3NhZ2UsIHN0YWNrIH1gLCBzbyB3ZVxuICAgIC8vIHJlY29uc3RydWN0IGEgaG9zdC1zaWRlIEVycm9yIG9mIHRoZSBjb3JyZWN0IGNsYXNzIGJhc2VkIG9uIHRoZVxuICAgIC8vIFZNLXNpZGUgYG5hbWVgIOKAlCBzcGVjaWZpYyBXb3JrZmxvd1J1bnRpbWVFcnJvciBzdWJjbGFzc2VzIG5lZWRcbiAgICAvLyB0byBiZSBwcmVzZXJ2ZWQgc28gY2xhc3NpZnlSdW5FcnJvcigpIHRhZ3MgdGhlbSBhcyBSVU5USU1FX0VSUk9SLlxuICAgIGNvbnN0IHJlY29uc3RydWN0ZWQ6IEVycm9yID1cbiAgICAgIHJlc3VsdC5mYWlsZWQubmFtZSA9PT0gJ1dvcmtmbG93Tm90UmVnaXN0ZXJlZEVycm9yJ1xuICAgICAgICA/IG5ldyBXb3JrZmxvd05vdFJlZ2lzdGVyZWRFcnJvcih3b3JrZmxvd05hbWUpXG4gICAgICAgIDogcmVzdWx0LmZhaWxlZC5uYW1lID09PSAnRXJyb3InXG4gICAgICAgICAgPyBuZXcgRXJyb3IocmVzdWx0LmZhaWxlZC5tZXNzYWdlKVxuICAgICAgICAgIDogT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IocmVzdWx0LmZhaWxlZC5tZXNzYWdlKSwge1xuICAgICAgICAgICAgICBuYW1lOiByZXN1bHQuZmFpbGVkLm5hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICBjb25zdCBlcnJvckNvZGUgPSBjbGFzc2lmeVJ1bkVycm9yKHJlY29uc3RydWN0ZWQpO1xuXG4gICAgcnVudGltZUxvZ2dlci5lcnJvcignUXVpY2tKUyBydW50aW1lOiB3b3JrZmxvdyBmYWlsZWQnLCB7XG4gICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgIGVycm9yTmFtZTogcmVzdWx0LmZhaWxlZC5uYW1lLFxuICAgICAgZXJyb3JNZXNzYWdlOiByZXN1bHQuZmFpbGVkLm1lc3NhZ2UsXG4gICAgICBlcnJvclN0YWNrLFxuICAgICAgZXJyb3JDb2RlLFxuICAgIH0pO1xuICAgIHBhcmVudFNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgLi4uQXR0cmlidXRlLlF1aWNrSlNPdXRjb21lKCdmYWlsZWQnKSxcbiAgICB9KTtcblxuICAgIC8vIEZsdXNoIGxlZnRvdmVyIHBlbmRpbmcgc2lkZSBlZmZlY3RzIGJlZm9yZSB3cml0aW5nIHJ1bl9mYWlsZWQg4oCUXG4gICAgLy8gc2FtZSBkcmFpbiBzZW1hbnRpY3MgYXMgdGhlIGNvbXBsZXRlZCBicmFuY2guXG4gICAgaWYgKHJlc3VsdC5mYWlsZWQuZHJhaW5PcGVyYXRpb25zPy5sZW5ndGgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGRpc3BhdGNoUGVuZGluZ09wcyh7XG4gICAgICAgICAgd29ybGQsXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICAgICAgICBwZW5kaW5nT3BlcmF0aW9uczogcmVzdWx0LmZhaWxlZC5kcmFpbk9wZXJhdGlvbnMsXG4gICAgICAgICAgd2ZkaWFnLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oJ1F1aWNrSlMgcnVudGltZTogdGVybWluYWwgZHJhaW4gZmFpbGVkJywge1xuICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgIG1lc3NhZ2U6IChlcnIgYXMgRXJyb3IpPy5tZXNzYWdlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgcnVuX2ZhaWxlZCBldmVudC4gU2VyaWFsaXplIHRoZSBlcnJvciB0aHJvdWdoIHRoZVxuICAgIC8vIGZpcnN0LWNsYXNzIGRlaHlkcmF0aW9uIHBpcGVsaW5lIHNvIGNvbnN1bWVycyAoQ0xJLCBvYnNlcnZhYmlsaXR5LFxuICAgIC8vIHJ1bi5yZXR1cm5WYWx1ZSkgZ2V0IHRoZSBzYW1lIGh5ZHJhdGVkIHZhbHVlIHNoYXBlIGFzIHRoZSBub2RlOnZtXG4gICAgLy8gZW5naW5lIGVtaXRzLiBUd28gcGF0aHM6XG4gICAgLy8gICAqIE1vZGVybiAodmFsdWVCeXRlcyBwcmVzZW50KTogdGhlIFZNLXNpZGUgcmVqZWN0aW9uIGhhbmRsZXJcbiAgICAvLyAgICAgc2VyaWFsaXplZCB0aGUgb3JpZ2luYWwgdGhyb3duIHZhbHVlIChFcnJvciBzdWJjbGFzcyB3aXRoXG4gICAgLy8gICAgIGNhdXNlIGNoYWluLCBwbGFpbiBvYmplY3QsIHByaW1pdGl2ZSwgZXRjLikgdXNpbmcgdGhlIFZNJ3NcbiAgICAvLyAgICAgd29ya2Zsb3ctc2VyaWFsaXplLiBQYXNzIHRob3NlIGJ5dGVzIHRocm91Z2ggZGlyZWN0bHkgc29cbiAgICAvLyAgICAgdHlwZSBpZGVudGl0eSwgY2F1c2UgY2hhaW5zLCBhbmQgbm9uLUVycm9yIHRocm93cyBzdXJ2aXZlLlxuICAgIC8vICAgICBXZSBqdXN0IG5lZWQgdG8gYXBwbHkgZW5jcnlwdGlvbiBpZiBjb25maWd1cmVkICh0aGUgVk0nc1xuICAgIC8vICAgICBzZXJpYWxpemVyIGRvZXNuJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGVuY3J5cHRpb24ga2V5KS5cbiAgICAvLyAgICogTGVnYWN5IGZhbGxiYWNrOiByZWNvbnN0cnVjdCBhbiBFcnJvciBmcm9tIHRoZSBob3N0LXZpc2libGVcbiAgICAvLyAgICAge25hbWUsIG1lc3NhZ2UsIHN0YWNrfSBmaWVsZHMgYW5kIHJ1biBpdCB0aHJvdWdoXG4gICAgLy8gICAgIGBkZWh5ZHJhdGVSdW5FcnJvcmAuIFVzZWQgd2hlbiB2YWx1ZUJ5dGVzIGlzIGFic2VudCAoZS5nLlxuICAgIC8vICAgICBleHRyYWN0RXJyb3IgcHNldWRvLWZhaWx1cmVzIGZyb20gVk0gYm9vdHN0cmFwKS5cbiAgICBsZXQgZGVoeWRyYXRlZEVycm9yOiBVaW50OEFycmF5O1xuICAgIGlmIChyZXN1bHQuZmFpbGVkLnZhbHVlQnl0ZXMpIHtcbiAgICAgIC8vIEh5ZHJhdGUgdGhlIFZNLXNpZGUgYnl0ZXMsIHJlbWFwIHRoZSBlcnJvciBzdGFjayB3aXRoIHRoZVxuICAgICAgLy8gaG9zdC1zaWRlIHNvdXJjZSBtYXAgKHRoZSBWTSBjYW4ndCBkbyB0aGlzIOKAlCBpdCBsYWNrcyBib3RoIHRoZVxuICAgICAgLy8gc291cmNlIG1hcCBhbmQgYHJlbWFwRXJyb3JTdGFja2ApLCBhbmQgcmUtZGVoeWRyYXRlLiBUaGlzXG4gICAgICAvLyBwcmVzZXJ2ZXMgdGhlIG9yaWdpbmFsIHZhbHVlJ3MgdHlwZSBpZGVudGl0eSAvIGNhdXNlIGNoYWluXG4gICAgICAvLyB3aGlsZSBmaXhpbmcgdXAgZnJhbWVzIHRvIHBvaW50IGF0IHRoZSB1c2VyJ3Mgc291cmNlIGZpbGVzLlxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaHlkcmF0ZWQgPSBhd2FpdCBoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgcmVzdWx0LmZhaWxlZC52YWx1ZUJ5dGVzLFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHVuZGVmaW5lZCAvLyBWTSBieXRlcyBhcmUgdW5lbmNyeXB0ZWRcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGh5ZHJhdGVkICYmXG4gICAgICAgICAgdHlwZW9mIGh5ZHJhdGVkID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICdzdGFjaycgaW4gKGh5ZHJhdGVkIGFzIG9iamVjdCkgJiZcbiAgICAgICAgICB0eXBlb2YgKGh5ZHJhdGVkIGFzIHsgc3RhY2s/OiB1bmtub3duIH0pLnN0YWNrID09PSAnc3RyaW5nJ1xuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBwYXJzZWROYW1lID0gcGFyc2VXb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKTtcbiAgICAgICAgICBjb25zdCBmaWxlbmFtZSA9IHBhcnNlZE5hbWU/Lm1vZHVsZVNwZWNpZmllciB8fCB3b3JrZmxvd05hbWU7XG4gICAgICAgICAgLy8gQm90aCBmaWxlbmFtZSBzcGFjZXMg4oCUIHNlZSB0aGUgZmFpbGVkLWJyYW5jaCBjb21tZW50IGFib3ZlLlxuICAgICAgICAgIChoeWRyYXRlZCBhcyB7IHN0YWNrPzogc3RyaW5nIH0pLnN0YWNrID0gcmVtYXBFcnJvclN0YWNrKFxuICAgICAgICAgICAgcmVtYXBFcnJvclN0YWNrKFxuICAgICAgICAgICAgICAoaHlkcmF0ZWQgYXMgeyBzdGFjazogc3RyaW5nIH0pLnN0YWNrLFxuICAgICAgICAgICAgICBmaWxlbmFtZSxcbiAgICAgICAgICAgICAgd29ya2Zsb3dDb2RlXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgQkFTRUxJTkVfQlVORExFX0ZJTEVOQU1FLFxuICAgICAgICAgICAgd29ya2Zsb3dDb2RlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXYWxrIHRoZSBjYXVzZSBjaGFpbiBhbmQgcmVtYXAgbmVzdGVkIHN0YWNrcyB0b28uXG4gICAgICAgIGNvbnN0IHNlZW4gPSBuZXcgV2Vha1NldDxvYmplY3Q+KCk7XG4gICAgICAgIGxldCBub2RlID0gKGh5ZHJhdGVkIGFzIHsgY2F1c2U/OiB1bmtub3duIH0pPy5jYXVzZTtcbiAgICAgICAgd2hpbGUgKG5vZGUgJiYgdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnICYmICFzZWVuLmhhcyhub2RlIGFzIG9iamVjdCkpIHtcbiAgICAgICAgICBzZWVuLmFkZChub2RlIGFzIG9iamVjdCk7XG4gICAgICAgICAgY29uc3Qgbm9kZVN0YWNrID0gKG5vZGUgYXMgeyBzdGFjaz86IHVua25vd24gfSkuc3RhY2s7XG4gICAgICAgICAgaWYgKHR5cGVvZiBub2RlU3RhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWROYW1lID0gcGFyc2VXb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVuYW1lID0gcGFyc2VkTmFtZT8ubW9kdWxlU3BlY2lmaWVyIHx8IHdvcmtmbG93TmFtZTtcbiAgICAgICAgICAgIC8vIEJvdGggZmlsZW5hbWUgc3BhY2VzIOKAlCBzZWUgdGhlIGZhaWxlZC1icmFuY2ggY29tbWVudCBhYm92ZS5cbiAgICAgICAgICAgIChub2RlIGFzIHsgc3RhY2s/OiBzdHJpbmcgfSkuc3RhY2sgPSByZW1hcEVycm9yU3RhY2soXG4gICAgICAgICAgICAgIHJlbWFwRXJyb3JTdGFjayhub2RlU3RhY2ssIGZpbGVuYW1lLCB3b3JrZmxvd0NvZGUpLFxuICAgICAgICAgICAgICBCQVNFTElORV9CVU5ETEVfRklMRU5BTUUsXG4gICAgICAgICAgICAgIHdvcmtmbG93Q29kZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbm9kZSA9IChub2RlIGFzIHsgY2F1c2U/OiB1bmtub3duIH0pLmNhdXNlO1xuICAgICAgICB9XG4gICAgICAgIGRlaHlkcmF0ZWRFcnJvciA9IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgIGh5ZHJhdGVkLFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKHJlaHlkcmF0ZUVycikge1xuICAgICAgICAvLyBJZiBoeWRyYXRpb24gLyByZS1kZWh5ZHJhdGlvbiBmYWlscyBmb3IgYW55IHJlYXNvbiwgZmFsbFxuICAgICAgICAvLyBiYWNrIHRvIHBhc3NpbmcgdGhyb3VnaCB0aGUgb3JpZ2luYWwgVk0gYnl0ZXMgKGp1c3QgYXBwbHlcbiAgICAgICAgLy8gZW5jcnlwdGlvbiBpZiBjb25maWd1cmVkKS4gQmV0dGVyIHRvIGxvc2Ugc291cmNlLW1hcHBlZFxuICAgICAgICAvLyBmcmFtZXMgdGhhbiB0byBsb3NlIHRoZSBlcnJvciBlbnRpcmVseS5cbiAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICdRdWlja0pTIHJ1bnRpbWU6IGZhaWxlZCB0byByZW1hcCB3b3JrZmxvdyBlcnJvciBzdGFjaywgcGFzc2luZyBWTSBieXRlcyB0aHJvdWdoJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IChyZWh5ZHJhdGVFcnIgYXMgRXJyb3IpPy5tZXNzYWdlLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgZGVoeWRyYXRlZEVycm9yID0gKGF3YWl0IG1heWJlRW5jcnlwdChcbiAgICAgICAgICByZXN1bHQuZmFpbGVkLnZhbHVlQnl0ZXMsXG4gICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICApKSBhcyBVaW50OEFycmF5O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZXJyb3JTdGFjaykge1xuICAgICAgICByZWNvbnN0cnVjdGVkLnN0YWNrID0gZXJyb3JTdGFjaztcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGRlaHlkcmF0ZWRFcnJvciA9IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgIHJlY29uc3RydWN0ZWQsXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoc2VyRXJyKSB7XG4gICAgICAgIC8vIEZhbGwgYmFjayB0byBhIG1pbmltYWwgcGF5bG9hZCBzbyB0aGUgcnVuIHN0aWxsIHRlcm1pbmF0ZXNcbiAgICAgICAgLy8gZXZlbiB3aGVuIHRoZSBlcnJvciBpdHNlbGYgY29udGFpbnMgdW5zZXJpYWxpemFibGUgdmFsdWVzLlxuICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgJ1F1aWNrSlMgcnVudGltZTogZmFpbGVkIHRvIGRlaHlkcmF0ZSBydW4gZXJyb3IsIGZhbGxpbmcgYmFjayB0byBiYXJlIEVycm9yJyxcbiAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBtZXNzYWdlOiAoc2VyRXJyIGFzIEVycm9yKT8ubWVzc2FnZSB9XG4gICAgICAgICk7XG4gICAgICAgIGRlaHlkcmF0ZWRFcnJvciA9IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgIE9iamVjdC5hc3NpZ24obmV3IEVycm9yKHJlc3VsdC5mYWlsZWQubWVzc2FnZSksIHtcbiAgICAgICAgICAgIG5hbWU6IHJlc3VsdC5mYWlsZWQubmFtZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICBlbmNyeXB0aW9uS2V5XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgICAgIGV2ZW50VHlwZTogJ3J1bl9mYWlsZWQnLFxuICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgIGVycm9yOiBkZWh5ZHJhdGVkRXJyb3IsXG4gICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8IFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybignV29ya2Zsb3cgYWxyZWFkeSBmaW5pc2hlZCwgc2tpcHBpbmcgcnVuX2ZhaWxlZCcsIHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgfSk7XG4gICAgICAgIHdmZGlhZygnZXhpdF9mYWlsZWQnLCB7IHJlc3VsdDogJ2FscmVhZHlfZmluaXNoZWQnIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB3ZmRpYWcoJ2V4aXRfZmFpbGVkX2Vycm9yJywge1xuICAgICAgICBlcnJvck5hbWU6IChlcnIgYXMgRXJyb3IpPy5uYW1lLFxuICAgICAgICBlcnJvck1lc3NhZ2U6IChlcnIgYXMgRXJyb3IpPy5tZXNzYWdlLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIHdmZGlhZygnZXhpdF9mYWlsZWQnLCB7IHJlc3VsdDogJ3J1bl9mYWlsZWRfd3JpdHRlbicgfSk7XG4gIH1cbn1cbiJdfQ==
|